graphile-build
Version:
Build a GraphQL schema from plugins
160 lines • 6.1 kB
JavaScript
;
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