squid
Version:
Provides SQL tagged template strings and a schema definition function.
90 lines (89 loc) • 2.28 kB
JavaScript
;
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;