UNPKG

@cran/gql.jm

Version:

Cran/GraphQL Join Monster Utilities

57 lines (56 loc) 1.96 kB
"use strict"; 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)}`); }; }