@cran/lib.gql.core
Version:
GQL Core Functionality
54 lines (53 loc) • 1.98 kB
JavaScript
;
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; }