UNPKG

graphile-build

Version:

Build a GraphQL schema from plugins

160 lines 6.1 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.MinifySchemaPlugin = void 0; function transformSchema(schema, options) { const { graphql, trimDeprecated = false, trimDescriptions = false } = options; const schemaConfig = schema.toConfig(); const typeMap = new Map(); function maybeTrimDescription(obj) { if (!trimDescriptions) return obj; const { description, ...rest } = obj; return rest; } const remapType = (t) => { if (graphql.isNonNullType(t)) { return new graphql.GraphQLNonNull(remapType(t.ofType)); } else if (graphql.isListType(t)) { return new graphql.GraphQLList(remapType(t.ofType)); } else { return typeMap.get(t.name) ?? t; } }; function remapNamedType(t) { return t ? (typeMap.get(t.name) ?? t) : undefined; } function remapArgs(args) { return args ? Object.fromEntries(Object.entries(args) .filter(([_argName, arg]) => !trimDeprecated || !arg.deprecationReason) .map(([argName, arg]) => [ argName, maybeTrimDescription(replaceType(arg)), ])) : undefined; } function replaceType(config) { const { type, ...rest } = config; return { ...rest, type: remapType(type) }; } function replaceArgs(f) { const { args, ...rest } = f; return { ...rest, args: remapArgs(args) }; } function remapFields(oldFields) { const fields = Object.create(null); for (const [fname, f] of Object.entries(oldFields)) { if (trimDeprecated && f.deprecationReason != null) continue; fields[fname] = maybeTrimDescription(replaceType(replaceArgs(f))); } return fields; } function replaceFields(obj) { const { fields, ...rest } = obj; return { ...rest, fields: () => remapFields(fields) }; } function remapInputFields(oldFields) { const fields = Object.create(null); for (const [fname, f] of Object.entries(oldFields)) { if (trimDeprecated && f.deprecationReason != null) continue; fields[fname] = maybeTrimDescription(replaceType(f)); } return fields; } function replaceInputFields(obj) { const { fields, ...rest } = obj; return { ...rest, fields: () => remapInputFields(fields) }; } function replaceInterfaces(obj) { const { interfaces, ...rest } = obj; return { ...rest, interfaces: () => interfaces.map((iface) => remapNamedType(iface)), }; } function transformType(type) { switch (true) { case graphql.isScalarType(type): { return new graphql.GraphQLScalarType(maybeTrimDescription(type.toConfig())); } case graphql.isEnumType(type): { const config = type.toConfig(); const values = Object.fromEntries(Object.entries(config.values) .filter(([, v]) => !trimDeprecated || !v.deprecationReason) .map(([k, v]) => [k, maybeTrimDescription(v)])); return new graphql.GraphQLEnumType(maybeTrimDescription({ ...config, values, })); } case graphql.isUnionType(type): { const config = type.toConfig(); return new graphql.GraphQLUnionType(maybeTrimDescription(maybeTrimDescription({ ...config, types: () => config.types.map((t) => remapNamedType(t)), }))); } case graphql.isInterfaceType(type): { const config = type.toConfig(); return new graphql.GraphQLInterfaceType(maybeTrimDescription(replaceFields(replaceInterfaces(config)))); } case graphql.isInputObjectType(type): { const config = type.toConfig(); return new graphql.GraphQLInputObjectType(maybeTrimDescription(replaceInputFields(config))); } case graphql.isObjectType(type): { const config = type.toConfig(); return new graphql.GraphQLObjectType(maybeTrimDescription(replaceFields(replaceInterfaces(config)))); } default: { return type; } } } for (const t of schemaConfig.types) { if (typeMap.has(t.name)) continue; if (graphql.isIntrospectionType(t)) continue; if (graphql.isSpecifiedScalarType(t)) { typeMap.set(t.name, t); } else { const type = transformType(t); typeMap.set(t.name, type); } } const directives = schemaConfig.directives.map((d) => graphql.isSpecifiedDirective(d) ? d : new graphql.GraphQLDirective(maybeTrimDescription(replaceArgs(d.toConfig())))); return new graphql.GraphQLSchema(maybeTrimDescription({ ...schemaConfig, types: Array.from(typeMap.values()), directives, query: remapNamedType(schemaConfig.query), mutation: remapNamedType(schemaConfig.mutation), subscription: remapNamedType(schemaConfig.subscription), })); } const version_ts_1 = require("../version.js"); exports.MinifySchemaPlugin = { name: "MinifySchemaPlugin", description: "[EXPERIMENTAL] Removes all descriptions and deprecation reasons from the schema, resulting in smaller exports (but no docs!)", version: version_ts_1.version, schema: { hooks: { finalize(schema, build) { return transformSchema(schema, { graphql: build.graphql, trimDeprecated: true, trimDescriptions: true, }); }, }, }, }; //# sourceMappingURL=MinifySchemaPlugin.js.map