UNPKG

squid

Version:

Provides SQL tagged template strings and a schema definition function.

90 lines (89 loc) 2.28 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const $sqlBuilderSymbol = Symbol("SqlBuilder"); function mkSqlBuilder(values, buildText) { return { $type: $sqlBuilderSymbol, values, buildText }; } function isSqlBuilder(builder) { return builder && builder.$type === $sqlBuilderSymbol; } /** * Generate the full SQL query. */ function buildSql(builder) { return { text: builder.buildText(1), values: builder.values }; } exports.buildSql = buildSql; /** * Merge the given SqlBuilders, concatenating the text values and parametrized * values. * * @example * const builder = joinSql([rawSqlBuilder("foo = "), paramSqlBuilder("bar")]) * builder.buildFragment(1) ==> { * text: "foo = $1", * values: ["bar"] * } * * @example * const builder = joinSql( * [rawSqlBuilder("foo"), paramSqlBuilder("bar")] * " = " * ) * builder.buildFragment(1) ==> { * text: "foo = $1", * values: ["bar"] * } */ function joinSql(builders, delimiter = "") { return mkSqlBuilder(builders.reduce((acc, { values }) => acc.concat(values), []), nextParamID => { let paramID = nextParamID; const builtText = []; builders.forEach(({ buildText, values }) => { builtText.push(buildText(paramID)); paramID += values.length; }); return builtText.join(delimiter); }); } exports.joinSql = joinSql; /** * Convert the given value to a SqlBuilder if it's not already. */ function toSqlBuilder(value) { return isSqlBuilder(value) ? value : paramSqlBuilder(value); } exports.toSqlBuilder = toSqlBuilder; /** * A SqlBuilder that renders the given value directly. * * @example * rawSqlBuilder("hello").buildFragment(1) ==> { * text: "hello", * values: [] * } */ function rawSqlBuilder(value) { return mkSqlBuilder([], () => value); } exports.rawSqlBuilder = rawSqlBuilder; /** * A SqlBuilder that marks the given value to be parametrized. * * @example * paramSqlBuilder("hello").buildFragment(1) ==> { * text: "$1", * values: ["hello"] * } */ function paramSqlBuilder(value) { return mkSqlBuilder([value], nextParamID => "$" + nextParamID.toString()); } exports.paramSqlBuilder = paramSqlBuilder;