@cran/lib.gql.core
Version:
GQL Core Functionality
65 lines (64 loc) • 2.5 kB
JavaScript
;
/* eslint-disable @typescript-eslint/no-explicit-any */
Object.defineProperty(exports, "__esModule", { value: true });
exports.Plugin = void 0;
const schema_1 = require("@graphql-tools/schema");
var Plugin;
(function (Plugin) {
let Phase;
(function (Phase) {
Phase[Phase["PREPARE"] = 0] = "PREPARE";
Phase[Phase["DEFAULT"] = 1] = "DEFAULT";
Phase[Phase["FINALIZE"] = 2] = "FINALIZE";
})(Phase = Plugin.Phase || (Plugin.Phase = {}));
function apply(plugin) {
let schema = (0, schema_1.makeExecutableSchema)({
typeDefs: plugin.typeDefs ?? [],
resolvers: plugin.resolvers ?? {},
});
for (const phase of [Phase.PREPARE, Phase.DEFAULT, Phase.FINALIZE,]) {
schema = getTransformerByPhase(plugin, phase)?.(schema) ?? schema;
}
return schema;
}
Plugin.apply = apply;
function compose(plugins) {
return {
typeDefs: plugins.map(function mapTypeDefs(plugin) {
return plugin.typeDefs;
}),
resolvers: plugins.reduce(function reduceResolvers(acc, plugin) {
return Object.assign(acc, plugin.resolvers);
}, {}),
transformer: {
[Phase.PREPARE]: composeTransformerByPhase(plugins, Phase.PREPARE),
[Phase.DEFAULT]: composeTransformerByPhase(plugins, Phase.DEFAULT),
[Phase.FINALIZE]: composeTransformerByPhase(plugins, Phase.FINALIZE),
},
};
}
Plugin.compose = compose;
function composeTransformerByPhase(plugins, phase) {
return function wrappedTransformerPhase(schema) {
let current = schema;
for (const plugin of plugins) {
const transformer = getTransformerByPhase(plugin, phase);
if (transformer) {
current = transformer(current);
}
}
return current;
};
}
Plugin.composeTransformerByPhase = composeTransformerByPhase;
function getTransformerByPhase(plugin, phase) {
if ("object" === typeof plugin.transformer) {
return plugin.transformer[phase];
}
if (phase === Phase.DEFAULT && "function" === typeof plugin.transformer) {
return plugin.transformer;
}
return undefined;
}
Plugin.getTransformerByPhase = getTransformerByPhase;
})(Plugin || (exports.Plugin = Plugin = {}));