UNPKG

nukak

Version:

flexible and efficient ORM, with declarative JSON syntax and smart type-safety

65 lines 6.58 kB
/** * SqlQueryContext is an implementation of the QueryContext interface specifically for SQL-based dialects. * It follows the "Accumulator" or "Builder" pattern to construct SQL queries and their corresponding parameters. * * This pattern solves the problem of building complex SQL strings while safely managing parameterized values, * preventing SQL injection and handling dialect-specific parameter placeholders (e.g., '?' for MySQL, '$n' for PostgreSQL). */ export class SqlQueryContext { dialect; sqlChunks = []; params = []; /** * @param dialect The SQL dialect used to determine how values should be formatted as placeholders. */ constructor(dialect) { this.dialect = dialect; } /** * Appends raw SQL string fragments to the query. * * @param sql The SQL fragment to append. * @returns The current context instance for method chaining. */ append(sql) { if (sql) { this.sqlChunks.push(sql); } return this; } /** * Adds a value to the query parameters and appends its corresponding placeholder to the SQL. * The placeholder format is determined by the dialect (e.g., '?' or '$1'). * * @param value The value to be parameterized. * @returns The current context instance for method chaining. */ addValue(value) { this.sqlChunks.push(this.dialect.addValue(this.params, value)); return this; } /** * Pushes a value to the parameters list without appending a placeholder to the SQL. * This is useful when the placeholder is already present in the SQL string or handled elsewhere. * * @param value The value to be added to the parameters. * @returns The current context instance for method chaining. */ pushValue(value) { this.params.push(value); return this; } /** * Returns the complete SQL query string by joining all accumulated chunks. */ get sql() { return this.sqlChunks.join(''); } /** * Returns the array of collected parameter values in the order they were added. */ get values() { return this.params; } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVlcnlDb250ZXh0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2RpYWxlY3QvcXVlcnlDb250ZXh0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBOzs7Ozs7R0FNRztBQUNILE1BQU0sT0FBTyxlQUFlO0lBT0w7SUFOSixTQUFTLEdBQWEsRUFBRSxDQUFDO0lBQ3pCLE1BQU0sR0FBYyxFQUFFLENBQUM7SUFFeEM7O09BRUc7SUFDSCxZQUFxQixPQUFxQjtRQUFyQixZQUFPLEdBQVAsT0FBTyxDQUFjO0lBQUcsQ0FBQztJQUU5Qzs7Ozs7T0FLRztJQUNILE1BQU0sQ0FBQyxHQUFXO1FBQ2hCLElBQUksR0FBRyxFQUFFLENBQUM7WUFDUixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUMzQixDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsUUFBUSxDQUFDLEtBQWM7UUFDckIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQy9ELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILFNBQVMsQ0FBQyxLQUFjO1FBQ3RCLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3hCLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVEOztPQUVHO0lBQ0gsSUFBSSxHQUFHO1FBQ0wsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNqQyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxJQUFJLE1BQU07UUFDUixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUM7SUFDckIsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBRdWVyeUNvbnRleHQsIFF1ZXJ5RGlhbGVjdCB9IGZyb20gJy4uL3R5cGUvaW5kZXguanMnO1xuXG4vKipcbiAqIFNxbFF1ZXJ5Q29udGV4dCBpcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgUXVlcnlDb250ZXh0IGludGVyZmFjZSBzcGVjaWZpY2FsbHkgZm9yIFNRTC1iYXNlZCBkaWFsZWN0cy5cbiAqIEl0IGZvbGxvd3MgdGhlIFwiQWNjdW11bGF0b3JcIiBvciBcIkJ1aWxkZXJcIiBwYXR0ZXJuIHRvIGNvbnN0cnVjdCBTUUwgcXVlcmllcyBhbmQgdGhlaXIgY29ycmVzcG9uZGluZyBwYXJhbWV0ZXJzLlxuICpcbiAqIFRoaXMgcGF0dGVybiBzb2x2ZXMgdGhlIHByb2JsZW0gb2YgYnVpbGRpbmcgY29tcGxleCBTUUwgc3RyaW5ncyB3aGlsZSBzYWZlbHkgbWFuYWdpbmcgcGFyYW1ldGVyaXplZCB2YWx1ZXMsXG4gKiBwcmV2ZW50aW5nIFNRTCBpbmplY3Rpb24gYW5kIGhhbmRsaW5nIGRpYWxlY3Qtc3BlY2lmaWMgcGFyYW1ldGVyIHBsYWNlaG9sZGVycyAoZS5nLiwgJz8nIGZvciBNeVNRTCwgJyRuJyBmb3IgUG9zdGdyZVNRTCkuXG4gKi9cbmV4cG9ydCBjbGFzcyBTcWxRdWVyeUNvbnRleHQgaW1wbGVtZW50cyBRdWVyeUNvbnRleHQge1xuICBwcml2YXRlIHJlYWRvbmx5IHNxbENodW5rczogc3RyaW5nW10gPSBbXTtcbiAgcHJpdmF0ZSByZWFkb25seSBwYXJhbXM6IHVua25vd25bXSA9IFtdO1xuXG4gIC8qKlxuICAgKiBAcGFyYW0gZGlhbGVjdCBUaGUgU1FMIGRpYWxlY3QgdXNlZCB0byBkZXRlcm1pbmUgaG93IHZhbHVlcyBzaG91bGQgYmUgZm9ybWF0dGVkIGFzIHBsYWNlaG9sZGVycy5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHJlYWRvbmx5IGRpYWxlY3Q6IFF1ZXJ5RGlhbGVjdCkge31cblxuICAvKipcbiAgICogQXBwZW5kcyByYXcgU1FMIHN0cmluZyBmcmFnbWVudHMgdG8gdGhlIHF1ZXJ5LlxuICAgKlxuICAgKiBAcGFyYW0gc3FsIFRoZSBTUUwgZnJhZ21lbnQgdG8gYXBwZW5kLlxuICAgKiBAcmV0dXJucyBUaGUgY3VycmVudCBjb250ZXh0IGluc3RhbmNlIGZvciBtZXRob2QgY2hhaW5pbmcuXG4gICAqL1xuICBhcHBlbmQoc3FsOiBzdHJpbmcpOiB0aGlzIHtcbiAgICBpZiAoc3FsKSB7XG4gICAgICB0aGlzLnNxbENodW5rcy5wdXNoKHNxbCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSB2YWx1ZSB0byB0aGUgcXVlcnkgcGFyYW1ldGVycyBhbmQgYXBwZW5kcyBpdHMgY29ycmVzcG9uZGluZyBwbGFjZWhvbGRlciB0byB0aGUgU1FMLlxuICAgKiBUaGUgcGxhY2Vob2xkZXIgZm9ybWF0IGlzIGRldGVybWluZWQgYnkgdGhlIGRpYWxlY3QgKGUuZy4sICc/JyBvciAnJDEnKS5cbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSB0byBiZSBwYXJhbWV0ZXJpemVkLlxuICAgKiBAcmV0dXJucyBUaGUgY3VycmVudCBjb250ZXh0IGluc3RhbmNlIGZvciBtZXRob2QgY2hhaW5pbmcuXG4gICAqL1xuICBhZGRWYWx1ZSh2YWx1ZTogdW5rbm93bik6IHRoaXMge1xuICAgIHRoaXMuc3FsQ2h1bmtzLnB1c2godGhpcy5kaWFsZWN0LmFkZFZhbHVlKHRoaXMucGFyYW1zLCB2YWx1ZSkpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFB1c2hlcyBhIHZhbHVlIHRvIHRoZSBwYXJhbWV0ZXJzIGxpc3Qgd2l0aG91dCBhcHBlbmRpbmcgYSBwbGFjZWhvbGRlciB0byB0aGUgU1FMLlxuICAgKiBUaGlzIGlzIHVzZWZ1bCB3aGVuIHRoZSBwbGFjZWhvbGRlciBpcyBhbHJlYWR5IHByZXNlbnQgaW4gdGhlIFNRTCBzdHJpbmcgb3IgaGFuZGxlZCBlbHNld2hlcmUuXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdG8gYmUgYWRkZWQgdG8gdGhlIHBhcmFtZXRlcnMuXG4gICAqIEByZXR1cm5zIFRoZSBjdXJyZW50IGNvbnRleHQgaW5zdGFuY2UgZm9yIG1ldGhvZCBjaGFpbmluZy5cbiAgICovXG4gIHB1c2hWYWx1ZSh2YWx1ZTogdW5rbm93bik6IHRoaXMge1xuICAgIHRoaXMucGFyYW1zLnB1c2godmFsdWUpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGNvbXBsZXRlIFNRTCBxdWVyeSBzdHJpbmcgYnkgam9pbmluZyBhbGwgYWNjdW11bGF0ZWQgY2h1bmtzLlxuICAgKi9cbiAgZ2V0IHNxbCgpIHtcbiAgICByZXR1cm4gdGhpcy5zcWxDaHVua3Muam9pbignJyk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgYXJyYXkgb2YgY29sbGVjdGVkIHBhcmFtZXRlciB2YWx1ZXMgaW4gdGhlIG9yZGVyIHRoZXkgd2VyZSBhZGRlZC5cbiAgICovXG4gIGdldCB2YWx1ZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMucGFyYW1zO1xuICB9XG59XG4iXX0=