UNPKG

@cran/gql.core

Version:

Cran/GraphQL Core Utilities

87 lines (86 loc) 3.78 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.createDirective = void 0; const parse_1 = require("./parse"); const utils_1 = require("@graphql-tools/utils"); const graphql_1 = require("graphql"); 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 location(keys) { const locations = []; for (const key of keys) { locations.push(...Location[key]); } return ([...new Set(locations),]).join("|"); } function createDirective(name, args, mapper) { const argList = Object.keys(args).length ? `(${Object.entries(args).map(function mapArg([key, value,]) { return `${key}:${value}`; }).join(",")})` : ""; return { typeDefs: `directive @${name}${argList} on ${location(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 []; }