@cran/gql.core
Version:
Cran/GraphQL Core Utilities
65 lines (64 loc) • 2.6 kB
JavaScript
;
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; }