nano-queries
Version:
Simple and powerful database-agnostic query builder (SQL & NoSQL)
61 lines (59 loc) • 6.99 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.SQLCompiler = void 0;
const PreparedValue_1 = require("../core/PreparedValue");
const Query_1 = require("../core/Query");
class SQLCompiler {
config;
constructor(options) {
this.config = {
...options,
getPlaceholder: options?.getPlaceholder ?? (() => '?'),
};
}
/**
* Compile query to SQL string and bindings
*/
compile(query) {
const sharedState = {
valueIndex: 0,
};
const processQuery = (query) => {
let command = '';
const bindings = [];
for (const segment of query.getSegments()) {
if (segment instanceof Query_1.Query) {
const data = processQuery(segment);
command += data.command;
bindings.push(...data.bindings);
continue;
}
if (segment instanceof PreparedValue_1.PreparedValue) {
const placeholder = this.config.getPlaceholder(sharedState.valueIndex);
sharedState.valueIndex++;
command += placeholder;
bindings.push(segment.getValue());
continue;
}
command += segment.getValue();
}
return { command, bindings };
};
const { command, bindings } = processQuery(query);
return {
command: this.config.onPostProcess
? this.config.onPostProcess(command)
: command,
bindings,
};
}
/**
* Compile query to SQL string and bindings
*/
toSQL = (query) => {
const { command: sql, bindings } = this.compile(query);
return { sql, bindings };
};
}
exports.SQLCompiler = SQLCompiler;
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNvbXBpbGVycy9TUUxDb21waWxlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSx5REFBc0Q7QUFDdEQseUNBQXNDO0FBaUJ0QyxNQUFhLFdBQVc7SUFDTixNQUFNLENBQW9CO0lBQzNDLFlBQVksT0FBb0M7UUFDL0MsSUFBSSxDQUFDLE1BQU0sR0FBRztZQUNiLEdBQUcsT0FBTztZQUNWLGNBQWMsRUFBRSxPQUFPLEVBQUUsY0FBYyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDO1NBQ3RELENBQUM7SUFDSCxDQUFDO0lBQ0Q7O09BRUc7SUFDSSxPQUFPLENBQUMsS0FBWTtRQUMxQixNQUFNLFdBQVcsR0FBRztZQUNuQixVQUFVLEVBQUUsQ0FBQztTQUNiLENBQUM7UUFFRixNQUFNLFlBQVksR0FBRyxDQUFDLEtBQVksRUFBc0MsRUFBRTtZQUN6RSxJQUFJLE9BQU8sR0FBRyxFQUFFLENBQUM7WUFDakIsTUFBTSxRQUFRLEdBQWtDLEVBQUUsQ0FBQztZQUNuRCxLQUFLLE1BQU0sT0FBTyxJQUFJLEtBQUssQ0FBQyxXQUFXLEVBQUUsRUFBRTtnQkFDMUMsSUFBSSxPQUFPLFlBQVksYUFBSyxFQUFFO29CQUM3QixNQUFNLElBQUksR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUM7b0JBQ25DLE9BQU8sSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDO29CQUN4QixRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO29CQUNoQyxTQUFTO2lCQUNUO2dCQUVELElBQUksT0FBTyxZQUFZLDZCQUFhLEVBQUU7b0JBQ3JDLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUM3QyxXQUFXLENBQUMsVUFBVSxDQUN0QixDQUFDO29CQUNGLFdBQVcsQ0FBQyxVQUFVLEVBQUUsQ0FBQztvQkFFekIsT0FBTyxJQUFJLFdBQVcsQ0FBQztvQkFDdkIsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztvQkFDbEMsU0FBUztpQkFDVDtnQkFFRCxPQUFPLElBQUksT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDO2FBQzlCO1lBRUQsT0FBTyxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsQ0FBQztRQUM5QixDQUFDLENBQUM7UUFFRixNQUFNLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxHQUFHLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNsRCxPQUFPO1lBQ04sT0FBTyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYTtnQkFDakMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQztnQkFDcEMsQ0FBQyxDQUFDLE9BQU87WUFDVixRQUFRO1NBQ1IsQ0FBQztJQUNILENBQUM7SUFFRDs7T0FFRztJQUNJLEtBQUssR0FBRyxDQUFDLEtBQVksRUFBOEMsRUFBRTtRQUMzRSxNQUFNLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3ZELE9BQU8sRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLENBQUM7SUFDMUIsQ0FBQyxDQUFDO0NBQ0Y7QUE1REQsa0NBNERDIiwiZmlsZSI6ImNvbXBpbGVycy9TUUxDb21waWxlci5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFByZXBhcmVkVmFsdWUgfSBmcm9tICcuLi9jb3JlL1ByZXBhcmVkVmFsdWUnO1xuaW1wb3J0IHsgUXVlcnkgfSBmcm9tICcuLi9jb3JlL1F1ZXJ5JztcbmltcG9ydCB7IFF1ZXJ5QmluZGluZ3MgfSBmcm9tICcuLi90eXBlcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29tbWFuZFdpdGhCaW5kaW5nczxUPiB7XG5cdGNvbW1hbmQ6IHN0cmluZztcblx0YmluZGluZ3M6IFRbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb21waWxlcjxUPiB7XG5cdGNvbXBpbGU6IChxdWVyeTogUXVlcnkpID0+IFQ7XG59XG5cbmV4cG9ydCB0eXBlIFNRTENvbXBpbGVyQ29uZmlnID0ge1xuXHRnZXRQbGFjZWhvbGRlcjogKHZhbHVlSW5kZXg6IG51bWJlcikgPT4gc3RyaW5nO1xuXHRvblBvc3RQcm9jZXNzPzogKGNvZGU6IHN0cmluZykgPT4gc3RyaW5nO1xufTtcblxuZXhwb3J0IGNsYXNzIFNRTENvbXBpbGVyIGltcGxlbWVudHMgQ29tcGlsZXI8Q29tbWFuZFdpdGhCaW5kaW5nczxRdWVyeUJpbmRpbmdzPj4ge1xuXHRwcml2YXRlIHJlYWRvbmx5IGNvbmZpZzogU1FMQ29tcGlsZXJDb25maWc7XG5cdGNvbnN0cnVjdG9yKG9wdGlvbnM/OiBQYXJ0aWFsPFNRTENvbXBpbGVyQ29uZmlnPikge1xuXHRcdHRoaXMuY29uZmlnID0ge1xuXHRcdFx0Li4ub3B0aW9ucyxcblx0XHRcdGdldFBsYWNlaG9sZGVyOiBvcHRpb25zPy5nZXRQbGFjZWhvbGRlciA/PyAoKCkgPT4gJz8nKSxcblx0XHR9O1xuXHR9XG5cdC8qKlxuXHQgKiBDb21waWxlIHF1ZXJ5IHRvIFNRTCBzdHJpbmcgYW5kIGJpbmRpbmdzXG5cdCAqL1xuXHRwdWJsaWMgY29tcGlsZShxdWVyeTogUXVlcnkpOiBDb21tYW5kV2l0aEJpbmRpbmdzPFF1ZXJ5QmluZGluZ3M+IHtcblx0XHRjb25zdCBzaGFyZWRTdGF0ZSA9IHtcblx0XHRcdHZhbHVlSW5kZXg6IDAsXG5cdFx0fTtcblxuXHRcdGNvbnN0IHByb2Nlc3NRdWVyeSA9IChxdWVyeTogUXVlcnkpOiBDb21tYW5kV2l0aEJpbmRpbmdzPFF1ZXJ5QmluZGluZ3M+ID0+IHtcblx0XHRcdGxldCBjb21tYW5kID0gJyc7XG5cdFx0XHRjb25zdCBiaW5kaW5nczogQXJyYXk8c3RyaW5nIHwgbnVtYmVyIHwgbnVsbD4gPSBbXTtcblx0XHRcdGZvciAoY29uc3Qgc2VnbWVudCBvZiBxdWVyeS5nZXRTZWdtZW50cygpKSB7XG5cdFx0XHRcdGlmIChzZWdtZW50IGluc3RhbmNlb2YgUXVlcnkpIHtcblx0XHRcdFx0XHRjb25zdCBkYXRhID0gcHJvY2Vzc1F1ZXJ5KHNlZ21lbnQpO1xuXHRcdFx0XHRcdGNvbW1hbmQgKz0gZGF0YS5jb21tYW5kO1xuXHRcdFx0XHRcdGJpbmRpbmdzLnB1c2goLi4uZGF0YS5iaW5kaW5ncyk7XG5cdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoc2VnbWVudCBpbnN0YW5jZW9mIFByZXBhcmVkVmFsdWUpIHtcblx0XHRcdFx0XHRjb25zdCBwbGFjZWhvbGRlciA9IHRoaXMuY29uZmlnLmdldFBsYWNlaG9sZGVyKFxuXHRcdFx0XHRcdFx0c2hhcmVkU3RhdGUudmFsdWVJbmRleCxcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdHNoYXJlZFN0YXRlLnZhbHVlSW5kZXgrKztcblxuXHRcdFx0XHRcdGNvbW1hbmQgKz0gcGxhY2Vob2xkZXI7XG5cdFx0XHRcdFx0YmluZGluZ3MucHVzaChzZWdtZW50LmdldFZhbHVlKCkpO1xuXHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Y29tbWFuZCArPSBzZWdtZW50LmdldFZhbHVlKCk7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiB7IGNvbW1hbmQsIGJpbmRpbmdzIH07XG5cdFx0fTtcblxuXHRcdGNvbnN0IHsgY29tbWFuZCwgYmluZGluZ3MgfSA9IHByb2Nlc3NRdWVyeShxdWVyeSk7XG5cdFx0cmV0dXJuIHtcblx0XHRcdGNvbW1hbmQ6IHRoaXMuY29uZmlnLm9uUG9zdFByb2Nlc3Ncblx0XHRcdFx0PyB0aGlzLmNvbmZpZy5vblBvc3RQcm9jZXNzKGNvbW1hbmQpXG5cdFx0XHRcdDogY29tbWFuZCxcblx0XHRcdGJpbmRpbmdzLFxuXHRcdH07XG5cdH1cblxuXHQvKipcblx0ICogQ29tcGlsZSBxdWVyeSB0byBTUUwgc3RyaW5nIGFuZCBiaW5kaW5nc1xuXHQgKi9cblx0cHVibGljIHRvU1FMID0gKHF1ZXJ5OiBRdWVyeSk6IHsgc3FsOiBzdHJpbmc7IGJpbmRpbmdzOiBRdWVyeUJpbmRpbmdzW10gfSA9PiB7XG5cdFx0Y29uc3QgeyBjb21tYW5kOiBzcWwsIGJpbmRpbmdzIH0gPSB0aGlzLmNvbXBpbGUocXVlcnkpO1xuXHRcdHJldHVybiB7IHNxbCwgYmluZGluZ3MgfTtcblx0fTtcbn1cbiJdfQ==