UNPKG

graphile-utils

Version:
89 lines 4.16 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); function makeAddPgTableConditionPlugin(schemaName, tableName, conditionFieldName, conditionFieldSpecGenerator, conditionGenerator) { const displayName = `makeAddPgTableConditionPlugin__${schemaName}__${tableName}__${conditionFieldName}`; const plugin = builder => { const instance = Symbol(displayName); builder.hook("build", function trackSeen(build) { if (!build._pluginMeta) { // eslint-disable-next-line no-param-reassign build._pluginMeta = {}; } // eslint-disable-next-line no-param-reassign build._pluginMeta[instance] = { seen: false, }; return build; }); builder.hook("finalize", function checkSeen(schema, build) { const meta = build._pluginMeta[instance]; if (!meta.seen) { // eslint-disable-next-line no-console console.error(`WARNING: failed to add condition '${conditionFieldName}' to table "${schemaName}"."${tableName}"; did you get the schema/table name right?`); } return schema; }); builder.hook("GraphQLInputObjectType:fields", function addConditionInputField(fields, build, context) { const { scope: { isPgCondition, pgIntrospection: table }, fieldWithHooks, } = context; if (!isPgCondition || !table || table.kind !== "class" || table.namespaceName !== schemaName || table.name !== tableName) { return fields; } const conditionFieldSpec = conditionFieldSpecGenerator(build); const meta = build._pluginMeta[instance]; meta.seen = true; return build.extend(fields, { [conditionFieldName]: fieldWithHooks(conditionFieldName, conditionFieldSpec, { addPgTableCondition: { schemaName, tableName, conditionFieldSpec, conditionFieldName, }, }), }); }); builder.hook("GraphQLObjectType:fields:field:args", function addSqlWhereClause(args, build, context) { const { pgSql: sql } = build; const { scope: { isPgFieldConnection, isPgFieldSimpleCollection, pgFieldIntrospection: procOrTable, pgFieldIntrospectionTable: tableIfProc, }, addArgDataGenerator, } = context; const table = tableIfProc || procOrTable; if ((!isPgFieldConnection && !isPgFieldSimpleCollection) || !table || table.kind !== "class" || table.namespaceName !== schemaName || table.name !== tableName) { return args; } addArgDataGenerator(function conditionSQLBuilder({ condition, }) { if (!condition || !(conditionFieldName in condition)) { return {}; } const { [conditionFieldName]: conditionValue } = condition; return { pgQuery: (queryBuilder) => { const sqlCondition = conditionGenerator(conditionValue, { queryBuilder, sql, sqlTableAlias: queryBuilder.getTableAlias(), }, build); if (sqlCondition) { queryBuilder.where(sqlCondition); } }, }; }); return args; }, [], // Make sure we're loaded before PgConnectionArgOrderBy, otherwise // ordering added by conditions will be overridden by the default // ordering. ["PgConnectionArgOrderBy"], []); }; plugin.displayName = displayName; return plugin; } exports.default = makeAddPgTableConditionPlugin; //# sourceMappingURL=makeAddPgTableConditionPlugin.js.map