UNPKG

@cran/gql.core

Version:

Cran/GraphQL Core Utilities

65 lines (64 loc) 2.6 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.withMetadata = exports.IntrospectionType = void 0; const Plugin_1 = require("./Plugin"); const utils_1 = require("@graphql-tools/utils"); const createDirective_1 = require("../utilities/createDirective"); const definition_1 = require("graphql/type/definition"); const patchField_1 = require("../utilities/patchField"); const graphql_1 = require("graphql"); const extensions_1 = require("../utilities/extensions"); exports.IntrospectionType = { [utils_1.MapperKind.ROOT_OBJECT]: graphql_1.__Schema, [utils_1.MapperKind.TYPE]: graphql_1.__Type, [utils_1.MapperKind.OBJECT_FIELD]: graphql_1.__Field, [utils_1.MapperKind.INPUT_OBJECT_FIELD]: graphql_1.__InputValue, [utils_1.MapperKind.ENUM_VALUE]: graphql_1.__EnumValue, }; function withMetadata(options) { const plugins = []; for (const key in options.fields) { if ("default" !== key) { const kind = key; plugins.push((0, createDirective_1.createDirective)(options.names?.[kind] || `${exports.IntrospectionType[kind].name.slice(2)}Metadata`, { ...options.fields.default, ...options.fields[kind], }, { [kind]: directiveMapper, })); } } plugins.push({ transformer: { [Plugin_1.PluginPhase.FINALIZE](schema) { for (const name in options.fields) { if ("default" !== name) { addFields(schema, name, options); } } return schema; }, }, }); return plugins; } exports.withMetadata = withMetadata; function directiveMapper([directive,], type) { (0, extensions_1.setExtension)(type, "metadata", directive); } function addFields(schema, kind, options) { const field = options.fields[kind]; for (const key in field) { const type = schema.getType(field[key]); if (!type || !(0, definition_1.isOutputType)(type)) { throw new TypeError(`MetadataPlugin expects "GraphQLOutputType" received "${type?.name}"`); } addField(kind, key, type, options); } } function addField(kind, key, type, options) { const fallback = options.fallbacks?.[kind] || alwaysNull; (0, patchField_1.patchField)(exports.IntrospectionType[kind], key, { type, resolve(source) { const value = (0, extensions_1.getExtension)(source, "metadata")?.[key]; return value !== undefined ? value : fallback(source, key); }, }); } function alwaysNull() { return null; }