graphile-utils
Version:
Utilities to help with building graphile-build plugins
89 lines • 4.16 kB
JavaScript
;
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