import { mapSchema } from './mapSchema.js'; import { MapperKind } from './Interfaces.js'; export function extractExtensionsFromSchema(schema) { const result = { schemaExtensions: schema.extensions || {}, types: {}, }; mapSchema(schema, { [MapperKind.OBJECT_TYPE]: type => { result.types[type.name] = { fields: {}, type: 'object', extensions: type.extensions || {} }; return type; }, [MapperKind.INTERFACE_TYPE]: type => { result.types[type.name] = { fields: {}, type: 'interface', extensions: type.extensions || {} }; return type; }, [MapperKind.FIELD]: (field, fieldName, typeName) => { result.types[typeName].fields[fieldName] = { arguments: {}, extensions: field.extensions || {}, }; const args = field.args; if (args != null) { for (const argName in args) { result.types[typeName].fields[fieldName].arguments[argName] = args[argName].extensions || {}; } } return field; }, [MapperKind.ENUM_TYPE]: type => { result.types[type.name] = { values: {}, type: 'enum', extensions: type.extensions || {} }; return type; }, [MapperKind.ENUM_VALUE]: (value, typeName, _schema, valueName) => { result.types[typeName].values[valueName] = value.extensions || {}; return value; }, [MapperKind.SCALAR_TYPE]: type => { result.types[type.name] = { type: 'scalar', extensions: type.extensions || {} }; return type; }, [MapperKind.UNION_TYPE]: type => { result.types[type.name] = { type: 'union', extensions: type.extensions || {} }; return type; }, [MapperKind.INPUT_OBJECT_TYPE]: type => { result.types[type.name] = { fields: {}, type: 'input', extensions: type.extensions || {} }; return type; }, [MapperKind.INPUT_OBJECT_FIELD]: (field, fieldName, typeName) => { result.types[typeName].fields[fieldName] = { extensions: field.extensions || {}, }; return field; }, }); return result; }