@cran/gql.core
Version:
Cran/GraphQL Core Utilities
87 lines (86 loc) • 3.78 kB
JavaScript
;
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 [];
}