@pyramation/postgraphile
Version:
A GraphQL schema created by reflection over a PostgreSQL schema 🐘 (previously known as PostGraphQL)
99 lines • 6.92 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.pluginHookFromOptions = exports.makePluginHook = void 0;
const package_json_1 = require("../../package.json");
const graphql = require("graphql");
const identityHook = (input) => input;
const identityPluginHook = (_hookName, input, _options) => input;
function contextIsSame(context1, context2) {
// Shortcut if obvious
if (context1 === context2) {
return true;
}
// Blacklist approach from now on
const keys1 = Object.keys(context1);
const keys2 = Object.keys(context2);
if (keys1.length !== keys2.length) {
return false;
}
// tslint:disable-next-line one-variable-per-declaration
for (let i = 0, l = keys1.length; i < l; i++) {
const key = keys1[i];
if (context1[key] !== context2[key]) {
return false;
}
if (!keys2.includes(key)) {
return false;
}
}
return true;
}
// Caches the last value of the hook, in case it's called with exactly the same
// arguments again.
function memoizeHook(hook) {
let lastCall = null;
return (argument, context) => {
if (lastCall && lastCall.argument === argument && contextIsSame(lastCall.context, context)) {
return lastCall.result;
}
else {
const result = hook(argument, context);
lastCall = {
argument,
context,
result,
};
return result;
}
};
}
function shouldMemoizeHook(hookName) {
return hookName === 'withPostGraphileContext';
}
function makeHook(plugins, hookName) {
const combinedHook = plugins.reduce((previousHook, plugin) => {
if (typeof plugin[hookName] === 'function') {
return (argument, context) => {
return plugin[hookName](previousHook(argument, context), context);
};
}
else {
return previousHook;
}
}, identityHook);
if (combinedHook === identityHook) {
return identityHook;
}
else if (shouldMemoizeHook(hookName)) {
return memoizeHook(combinedHook);
}
else {
return combinedHook;
}
}
function makePluginHook(plugins) {
const hooks = {};
const emptyObject = {}; // caching this makes memoization faster when no context is needed
function rawPluginHook(hookName, argument, context = emptyObject) {
if (!hooks[hookName]) {
hooks[hookName] = makeHook(plugins, hookName);
}
return hooks[hookName](argument, context);
}
const pluginHook = rawPluginHook('pluginHook', rawPluginHook, {});
// Use this hook to check your hook is compatible with this version of
// PostGraphile, also to get a reference to shared graphql instance.
pluginHook('init', null, { version: package_json_1.version, graphql });
return pluginHook;
}
exports.makePluginHook = makePluginHook;
function pluginHookFromOptions(options) {
if (typeof options.pluginHook === 'function') {
return options.pluginHook;
}
else {
return identityPluginHook;
}
}
exports.pluginHookFromOptions = pluginHookFromOptions;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luSG9vay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wb3N0Z3JhcGhpbGUvcGx1Z2luSG9vay50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFJQSxxREFBNkM7QUFDN0MsbUNBQW1DO0FBeURuQyxNQUFNLFlBQVksR0FBRyxDQUFJLEtBQVEsRUFBSyxFQUFFLENBQUMsS0FBSyxDQUFDO0FBQy9DLE1BQU0sa0JBQWtCLEdBQWlCLENBQUMsU0FBUyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQztBQUUvRSxTQUFTLGFBQWEsQ0FBQyxRQUE2QixFQUFFLFFBQTZCO0lBQ2pGLHNCQUFzQjtJQUN0QixJQUFJLFFBQVEsS0FBSyxRQUFRLEVBQUU7UUFDekIsT0FBTyxJQUFJLENBQUM7S0FDYjtJQUNELGlDQUFpQztJQUNqQyxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3BDLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDcEMsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLEtBQUssQ0FBQyxNQUFNLEVBQUU7UUFDakMsT0FBTyxLQUFLLENBQUM7S0FDZDtJQUNELHdEQUF3RDtJQUN4RCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO1FBQzVDLE1BQU0sR0FBRyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNyQixJQUFJLFFBQVEsQ0FBQyxHQUFHLENBQUMsS0FBSyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDbkMsT0FBTyxLQUFLLENBQUM7U0FDZDtRQUNELElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQ3hCLE9BQU8sS0FBSyxDQUFDO1NBQ2Q7S0FDRjtJQUVELE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQztBQUVELCtFQUErRTtBQUMvRSxtQkFBbUI7QUFDbkIsU0FBUyxXQUFXLENBQUksSUFBZTtJQUNyQyxJQUFJLFFBQVEsR0FJRCxJQUFJLENBQUM7SUFDaEIsT0FBTyxDQUFDLFFBQVcsRUFBRSxPQUE0QixFQUFLLEVBQUU7UUFDdEQsSUFBSSxRQUFRLElBQUksUUFBUSxDQUFDLFFBQVEsS0FBSyxRQUFRLElBQUksYUFBYSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLEVBQUU7WUFDMUYsT0FBTyxRQUFRLENBQUMsTUFBTSxDQUFDO1NBQ3hCO2FBQU07WUFDTCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQ3ZDLFFBQVEsR0FBRztnQkFDVCxRQUFRO2dCQUNSLE9BQU87Z0JBQ1AsTUFBTTthQUNQLENBQUM7WUFDRixPQUFPLE1BQU0sQ0FBQztTQUNmO0lBQ0gsQ0FBQyxDQUFDO0FBQ0osQ0FBQztBQUVELFNBQVMsaUJBQWlCLENBQUMsUUFBa0I7SUFDM0MsT0FBTyxRQUFRLEtBQUsseUJBQXlCLENBQUM7QUFDaEQsQ0FBQztBQUVELFNBQVMsUUFBUSxDQUFJLE9BQWtDLEVBQUUsUUFBa0I7SUFDekUsTUFBTSxZQUFZLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLFlBQXVCLEVBQUUsTUFBMkIsRUFBRSxFQUFFO1FBQzNGLElBQUksT0FBTyxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQUssVUFBVSxFQUFFO1lBQzFDLE9BQU8sQ0FBQyxRQUFXLEVBQUUsT0FBNEIsRUFBRSxFQUFFO2dCQUNuRCxPQUFPLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxZQUFZLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQ3BFLENBQUMsQ0FBQztTQUNIO2FBQU07WUFDTCxPQUFPLFlBQVksQ0FBQztTQUNyQjtJQUNILENBQUMsRUFBRSxZQUFZLENBQUMsQ0FBQztJQUNqQixJQUFJLFlBQVksS0FBSyxZQUFZLEVBQUU7UUFDakMsT0FBTyxZQUFZLENBQUM7S0FDckI7U0FBTSxJQUFJLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxFQUFFO1FBQ3RDLE9BQU8sV0FBVyxDQUFJLFlBQVksQ0FBQyxDQUFDO0tBQ3JDO1NBQU07UUFDTCxPQUFPLFlBQVksQ0FBQztLQUNyQjtBQUNILENBQUM7QUFFRCxTQUFnQixjQUFjLENBQUMsT0FBa0M7SUFDL0QsTUFBTSxLQUFLLEdBQUcsRUFBRSxDQUFDO0lBQ2pCLE1BQU0sV0FBVyxHQUFHLEVBQUUsQ0FBQyxDQUFDLGtFQUFrRTtJQUMxRixTQUFTLGFBQWEsQ0FDcEIsUUFBa0IsRUFDbEIsUUFBVyxFQUNYLFVBQStCLFdBQVc7UUFFMUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsRUFBRTtZQUNwQixLQUFLLENBQUMsUUFBUSxDQUFDLEdBQUcsUUFBUSxDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUMsQ0FBQztTQUMvQztRQUNELE9BQU8sS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUM1QyxDQUFDO0lBRUQsTUFBTSxVQUFVLEdBQWlCLGFBQWEsQ0FBQyxZQUFZLEVBQUUsYUFBYSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ2hGLHNFQUFzRTtJQUN0RSxvRUFBb0U7SUFDcEUsVUFBVSxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsRUFBRSxPQUFPLEVBQVAsc0JBQU8sRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO0lBQy9DLE9BQU8sVUFBVSxDQUFDO0FBQ3BCLENBQUM7QUFuQkQsd0NBbUJDO0FBRUQsU0FBZ0IscUJBQXFCLENBQUMsT0FBNEI7SUFDaEUsSUFBSSxPQUFPLE9BQU8sQ0FBQyxVQUFVLEtBQUssVUFBVSxFQUFFO1FBQzVDLE9BQU8sT0FBTyxDQUFDLFVBQVUsQ0FBQztLQUMzQjtTQUFNO1FBQ0wsT0FBTyxrQkFBa0IsQ0FBQztLQUMzQjtBQUNILENBQUM7QUFORCxzREFNQyJ9