@cran/gql.core
Version:
Cran/GraphQL Core Utilities
51 lines (50 loc) • 2.07 kB
JavaScript
/* eslint-disable @typescript-eslint/no-explicit-any */
export var PluginPhase;
(function (PluginPhase) {
PluginPhase[PluginPhase["PREPARE"] = 0] = "PREPARE";
PluginPhase[PluginPhase["DEFAULT"] = 1] = "DEFAULT";
PluginPhase[PluginPhase["FINALIZE"] = 2] = "FINALIZE";
})(PluginPhase || (PluginPhase = {}));
// eslint-disable-next-line max-lines-per-function
export function composePlugins(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: {
[PluginPhase.PREPARE](schema) {
for (const plugin of plugins) {
if ("object" === typeof plugin.transformer &&
PluginPhase.PREPARE in plugin.transformer) {
schema = plugin.transformer[PluginPhase.PREPARE](schema);
}
}
return schema;
},
[PluginPhase.DEFAULT](schema) {
for (const plugin of plugins) {
if ("function" === typeof plugin.transformer) {
schema = plugin.transformer(schema);
}
else if ("object" === typeof plugin.transformer &&
PluginPhase.DEFAULT in plugin.transformer) {
schema = plugin.transformer[PluginPhase.DEFAULT](schema);
}
}
return schema;
},
[PluginPhase.FINALIZE](schema) {
for (const plugin of plugins) {
if ("object" === typeof plugin.transformer &&
PluginPhase.FINALIZE in plugin.transformer) {
schema = plugin.transformer[PluginPhase.FINALIZE](schema);
}
}
return schema;
},
},
};
}