@cran/gql.jm
Version:
Cran/GraphQL Join Monster Utilities
57 lines (56 loc) • 1.96 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.withSqlJoin = void 0;
const gql_core_1 = require("@cran/gql.core");
function withSqlJoin(name = "sqlJoin") {
return (0, gql_core_1.createDirective)(name, {
column: "text!",
identity: "bool",
references: "text",
in: "text",
contains: "text",
}, {
[gql_core_1.MapperKind.COMPOSITE_FIELD]([directive,], field) {
Object.assign((0, gql_core_1.getExtension)(field, "joinMonster", {}), { sqlJoin: makeResolver(directive), });
},
});
}
exports.withSqlJoin = withSqlJoin;
function makeResolver(directive) {
switch (false) {
case !directive.identity:
return makeIdentity(directive.column);
case !directive.references:
return makeReferences(directive.column, directive.references);
case !directive.in:
return makeIn(directive.column, directive.in);
case !directive.contains:
return makeContains(directive.column, directive.contains);
default: return makeError(directive);
}
}
function makeIdentity(column) {
return function sqlReferences(table, foreign) {
return `${table}."${column}" = ${foreign}."${column}"`;
};
}
function makeReferences(column, references) {
return function sqlReferences(table, foreign) {
return `${table}."${column}" = ${foreign}."${references}"`;
};
}
function makeIn(column, references) {
return function sqlIn(table, foreign) {
return `${table}."${column}" = any(${foreign}."${references}")`;
};
}
function makeContains(column, references) {
return function sqlIn(table, foreign) {
return `${foreign}."${references}" = any(${table}."${column}")`;
};
}
function makeError(directive) {
return function sqlError() {
throw new Error(`SqlJoin: no join operation selected on ${JSON.stringify(directive)}`);
};
}