UNPKG

@cran/lib.gql.core

Version:

GQL Core Functionality

92 lines (91 loc) 3.89 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.createDirective = void 0; const utils_1 = require("@graphql-tools/utils"); const graphql_1 = require("graphql"); const parse_1 = require("./parse"); const Location = { [utils_1.MapperKind.TYPE]: ["SCALAR", "OBJECT", "INTERFACE", "UNION", "ENUM", "INPUT_OBJECT",], [utils_1.MapperKind.SCALAR_TYPE]: ["SCALAR",], [utils_1.MapperKind.ENUM_TYPE]: ["ENUM",], [utils_1.MapperKind.COMPOSITE_TYPE]: ["OBJECT", "INTERFACE", "UNION",], [utils_1.MapperKind.OBJECT_TYPE]: ["OBJECT",], [utils_1.MapperKind.INPUT_OBJECT_TYPE]: ["INPUT_OBJECT",], [utils_1.MapperKind.ABSTRACT_TYPE]: ["INTERFACE", "UNION",], [utils_1.MapperKind.UNION_TYPE]: ["UNION_TYPE",], [utils_1.MapperKind.INTERFACE_TYPE]: ["INTERFACE",], [utils_1.MapperKind.ROOT_OBJECT]: ["SCHEMA",], [utils_1.MapperKind.QUERY]: ["OBJECT",], [utils_1.MapperKind.MUTATION]: ["OBJECT",], [utils_1.MapperKind.SUBSCRIPTION]: ["OBJECT",], [utils_1.MapperKind.ENUM_VALUE]: ["ENUM_VALUE",], [utils_1.MapperKind.FIELD]: ["FIELD_DEFINITION", "INPUT_FIELD_DEFINITION",], [utils_1.MapperKind.OBJECT_FIELD]: ["FIELD_DEFINITION",], [utils_1.MapperKind.ROOT_FIELD]: ["FIELD_DEFINITION",], [utils_1.MapperKind.QUERY_ROOT_FIELD]: ["FIELD_DEFINITION",], [utils_1.MapperKind.MUTATION_ROOT_FIELD]: ["FIELD_DEFINITION",], [utils_1.MapperKind.SUBSCRIPTION_ROOT_FIELD]: ["FIELD_DEFINITION",], [utils_1.MapperKind.INTERFACE_FIELD]: ["FIELD_DEFINITION",], [utils_1.MapperKind.COMPOSITE_FIELD]: ["FIELD_DEFINITION",], [utils_1.MapperKind.ARGUMENT]: ["ARUGMENT_DEFINITION",], [utils_1.MapperKind.INPUT_OBJECT_FIELD]: ["INPUT_FIELD_DEFINITION",], [utils_1.MapperKind.DIRECTIVE]: ["DIRECTIVE",], }; function gatherLocations(keys) { const locations = new Set(); for (const key of keys) { for (const location of Location[key]) { locations.add(location); } } return ([...locations,]).join("|"); } function createDirective(name, args, mapper) { const argList = Object.entries(args) .map(function mapArg([key, value,]) { return `${key}:${value}`; }).join(","); const argStruct = argList ? `(${argList})` : ""; return { typeDefs: `directive @${name}${argStruct} on ${gatherLocations(Object.keys(mapper))}`, transformer(schema) { return (0, utils_1.mapSchema)(schema, wrapSchemaMapper(name, mapper)); }, }; } exports.createDirective = createDirective; function wrapSchemaMapper(name, mapper) { const wrapped = {}; for (const key in mapper) { wrapped[key] = wrapMapper(name, mapper[key]); } return wrapped; } function wrapMapper(name, mapperFunction) { return function mapper(...args) { const [type,] = args; if ((0, graphql_1.isDirective)(type)) { return mapperFunction([], ...args) ?? type; } const directives = (0, utils_1.getDirective)(args.find(graphql_1.isSchema), type, name) ?? getAstDirective(type, name); if (directives?.[0]) { return mapperFunction(directives, ...args) ?? type; } return type; }; } function getAstDirective(type, name) { if (type.astNode && "directives" in type.astNode && type.astNode.directives) { return type.astNode.directives.filter(function filterDir(directive) { return directive.name.value === name; }).map(function mapDir(directive) { return directive.arguments ?.reduce(function reduceArg(acc, arg) { const { name: { value: argName, }, value, } = arg; acc[argName] = (0, parse_1.parseLiteral)("value" in value ? String(value.value) : "null", value); return acc; }, {}) ?? {}; }); } return []; }