UNPKG

@cran/lib.gql.core

Version:

GQL Core Functionality

54 lines (53 loc) 1.98 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.withMetadata = void 0; const graphql_1 = require("graphql"); const Plugin_1 = require("./Plugin"); const utilities_1 = require("../utilities"); function withMetadata(options) { const plugins = []; for (const key in options.fields) { if ("default" !== key) { const kind = key; plugins.push((0, utilities_1.createDirective)(options.names?.[kind] ?? `${utilities_1.IntrospectionType[kind].name.slice(2)}Metadata`, { ...options.fields.default, ...options.fields[kind], }, { [kind]: directiveMapper, })); } } plugins.push({ transformer: { [Plugin_1.Plugin.Phase.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, utilities_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, graphql_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, utilities_1.patchField)(utilities_1.IntrospectionType[kind], key, { type, resolve(source) { const value = (0, utilities_1.getExtension)(source, "metadata")?.[key]; return value ?? fallback(source, key); }, }); } function alwaysNull() { return null; }