UNPKG

drizzle-orm

Version:

Drizzle ORM package for SQL databases

468 lines • 14.4 kB
"use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __export = (target, all) => { for (var name2 in all) __defProp(target, name2, { get: all[name2], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var sql_exports = {}; __export(sql_exports, { FakePrimitiveParam: () => FakePrimitiveParam, Name: () => Name, Param: () => Param, Placeholder: () => Placeholder, SQL: () => SQL, StringChunk: () => StringChunk, View: () => View, fillPlaceholders: () => fillPlaceholders, getViewName: () => getViewName, isDriverValueEncoder: () => isDriverValueEncoder, isSQLWrapper: () => isSQLWrapper, isView: () => isView, name: () => name, noopDecoder: () => noopDecoder, noopEncoder: () => noopEncoder, noopMapper: () => noopMapper, param: () => param, placeholder: () => placeholder, sql: () => sql }); module.exports = __toCommonJS(sql_exports); var import_entity = require("../entity.cjs"); var import_enum = require("../pg-core/columns/enum.cjs"); var import_subquery = require("../subquery.cjs"); var import_tracing = require("../tracing.cjs"); var import_view_common = require("../view-common.cjs"); var import_column = require("../column.cjs"); var import_table = require("../table.cjs"); class FakePrimitiveParam { static [import_entity.entityKind] = "FakePrimitiveParam"; } function isSQLWrapper(value) { return value !== null && value !== void 0 && typeof value.getSQL === "function"; } function mergeQueries(queries) { const result = { sql: "", params: [] }; for (const query of queries) { result.sql += query.sql; result.params.push(...query.params); if (query.typings?.length) { if (!result.typings) { result.typings = []; } result.typings.push(...query.typings); } } return result; } class StringChunk { static [import_entity.entityKind] = "StringChunk"; value; constructor(value) { this.value = Array.isArray(value) ? value : [value]; } getSQL() { return new SQL([this]); } } class SQL { constructor(queryChunks) { this.queryChunks = queryChunks; } static [import_entity.entityKind] = "SQL"; /** @internal */ decoder = noopDecoder; shouldInlineParams = false; append(query) { this.queryChunks.push(...query.queryChunks); return this; } toQuery(config) { return import_tracing.tracer.startActiveSpan("drizzle.buildSQL", (span) => { const query = this.buildQueryFromSourceParams(this.queryChunks, config); span?.setAttributes({ "drizzle.query.text": query.sql, "drizzle.query.params": JSON.stringify(query.params) }); return query; }); } buildQueryFromSourceParams(chunks, _config) { const config = Object.assign({}, _config, { inlineParams: _config.inlineParams || this.shouldInlineParams, paramStartIndex: _config.paramStartIndex || { value: 0 } }); const { casing, escapeName, escapeParam, prepareTyping, inlineParams, paramStartIndex } = config; return mergeQueries(chunks.map((chunk) => { if ((0, import_entity.is)(chunk, StringChunk)) { return { sql: chunk.value.join(""), params: [] }; } if ((0, import_entity.is)(chunk, Name)) { return { sql: escapeName(chunk.value), params: [] }; } if (chunk === void 0) { return { sql: "", params: [] }; } if (Array.isArray(chunk)) { const result = [new StringChunk("(")]; for (const [i, p] of chunk.entries()) { result.push(p); if (i < chunk.length - 1) { result.push(new StringChunk(", ")); } } result.push(new StringChunk(")")); return this.buildQueryFromSourceParams(result, config); } if ((0, import_entity.is)(chunk, SQL)) { return this.buildQueryFromSourceParams(chunk.queryChunks, { ...config, inlineParams: inlineParams || chunk.shouldInlineParams }); } if ((0, import_entity.is)(chunk, import_table.Table)) { const schemaName = chunk[import_table.Table.Symbol.Schema]; const tableName = chunk[import_table.Table.Symbol.Name]; return { sql: schemaName === void 0 || chunk[import_table.IsAlias] ? escapeName(tableName) : escapeName(schemaName) + "." + escapeName(tableName), params: [] }; } if ((0, import_entity.is)(chunk, import_column.Column)) { const columnName = casing.getColumnCasing(chunk); if (_config.invokeSource === "indexes") { return { sql: escapeName(columnName), params: [] }; } const schemaName = chunk.table[import_table.Table.Symbol.Schema]; return { sql: chunk.table[import_table.IsAlias] || schemaName === void 0 ? escapeName(chunk.table[import_table.Table.Symbol.Name]) + "." + escapeName(columnName) : escapeName(schemaName) + "." + escapeName(chunk.table[import_table.Table.Symbol.Name]) + "." + escapeName(columnName), params: [] }; } if ((0, import_entity.is)(chunk, View)) { const schemaName = chunk[import_view_common.ViewBaseConfig].schema; const viewName = chunk[import_view_common.ViewBaseConfig].name; return { sql: schemaName === void 0 || chunk[import_view_common.ViewBaseConfig].isAlias ? escapeName(viewName) : escapeName(schemaName) + "." + escapeName(viewName), params: [] }; } if ((0, import_entity.is)(chunk, Param)) { if ((0, import_entity.is)(chunk.value, Placeholder)) { return { sql: escapeParam(paramStartIndex.value++, chunk), params: [chunk], typings: ["none"] }; } const mappedValue = chunk.value === null ? null : chunk.encoder.mapToDriverValue(chunk.value); if ((0, import_entity.is)(mappedValue, SQL)) { return this.buildQueryFromSourceParams([mappedValue], config); } if (inlineParams) { return { sql: this.mapInlineParam(mappedValue, config), params: [] }; } let typings = ["none"]; if (prepareTyping) { typings = [prepareTyping(chunk.encoder)]; } return { sql: escapeParam(paramStartIndex.value++, mappedValue), params: [mappedValue], typings }; } if ((0, import_entity.is)(chunk, Placeholder)) { return { sql: escapeParam(paramStartIndex.value++, chunk), params: [chunk], typings: ["none"] }; } if ((0, import_entity.is)(chunk, SQL.Aliased) && chunk.fieldAlias !== void 0) { return { sql: escapeName(chunk.fieldAlias), params: [] }; } if ((0, import_entity.is)(chunk, import_subquery.Subquery)) { if (chunk._.isWith) { return { sql: escapeName(chunk._.alias), params: [] }; } return this.buildQueryFromSourceParams([ new StringChunk("("), chunk._.sql, new StringChunk(") "), new Name(chunk._.alias) ], config); } if ((0, import_enum.isPgEnum)(chunk)) { if (chunk.schema) { return { sql: escapeName(chunk.schema) + "." + escapeName(chunk.enumName), params: [] }; } return { sql: escapeName(chunk.enumName), params: [] }; } if (isSQLWrapper(chunk)) { if (chunk.shouldOmitSQLParens?.()) { return this.buildQueryFromSourceParams([chunk.getSQL()], config); } return this.buildQueryFromSourceParams([ new StringChunk("("), chunk.getSQL(), new StringChunk(")") ], config); } if (inlineParams) { return { sql: this.mapInlineParam(chunk, config), params: [] }; } return { sql: escapeParam(paramStartIndex.value++, chunk), params: [chunk], typings: ["none"] }; })); } mapInlineParam(chunk, { escapeString }) { if (chunk === null) { return "null"; } if (typeof chunk === "number" || typeof chunk === "boolean") { return chunk.toString(); } if (typeof chunk === "string") { return escapeString(chunk); } if (typeof chunk === "object") { const mappedValueAsString = chunk.toString(); if (mappedValueAsString === "[object Object]") { return escapeString(JSON.stringify(chunk)); } return escapeString(mappedValueAsString); } throw new Error("Unexpected param value: " + chunk); } getSQL() { return this; } as(alias) { if (alias === void 0) { return this; } return new SQL.Aliased(this, alias); } mapWith(decoder) { this.decoder = typeof decoder === "function" ? { mapFromDriverValue: decoder } : decoder; return this; } inlineParams() { this.shouldInlineParams = true; return this; } /** * This method is used to conditionally include a part of the query. * * @param condition - Condition to check * @returns itself if the condition is `true`, otherwise `undefined` */ if(condition) { return condition ? this : void 0; } } class Name { constructor(value) { this.value = value; } static [import_entity.entityKind] = "Name"; brand; getSQL() { return new SQL([this]); } } function name(value) { return new Name(value); } function isDriverValueEncoder(value) { return typeof value === "object" && value !== null && "mapToDriverValue" in value && typeof value.mapToDriverValue === "function"; } const noopDecoder = { mapFromDriverValue: (value) => value }; const noopEncoder = { mapToDriverValue: (value) => value }; const noopMapper = { ...noopDecoder, ...noopEncoder }; class Param { /** * @param value - Parameter value * @param encoder - Encoder to convert the value to a driver parameter */ constructor(value, encoder = noopEncoder) { this.value = value; this.encoder = encoder; } static [import_entity.entityKind] = "Param"; brand; getSQL() { return new SQL([this]); } } function param(value, encoder) { return new Param(value, encoder); } function sql(strings, ...params) { const queryChunks = []; if (params.length > 0 || strings.length > 0 && strings[0] !== "") { queryChunks.push(new StringChunk(strings[0])); } for (const [paramIndex, param2] of params.entries()) { queryChunks.push(param2, new StringChunk(strings[paramIndex + 1])); } return new SQL(queryChunks); } ((sql2) => { function empty() { return new SQL([]); } sql2.empty = empty; function fromList(list) { return new SQL(list); } sql2.fromList = fromList; function raw(str) { return new SQL([new StringChunk(str)]); } sql2.raw = raw; function join(chunks, separator) { const result = []; for (const [i, chunk] of chunks.entries()) { if (i > 0 && separator !== void 0) { result.push(separator); } result.push(chunk); } return new SQL(result); } sql2.join = join; function identifier(value) { return new Name(value); } sql2.identifier = identifier; function placeholder2(name2) { return new Placeholder(name2); } sql2.placeholder = placeholder2; function param2(value, encoder) { return new Param(value, encoder); } sql2.param = param2; })(sql || (sql = {})); ((SQL2) => { class Aliased { constructor(sql2, fieldAlias) { this.sql = sql2; this.fieldAlias = fieldAlias; } static [import_entity.entityKind] = "SQL.Aliased"; /** @internal */ isSelectionField = false; getSQL() { return this.sql; } /** @internal */ clone() { return new Aliased(this.sql, this.fieldAlias); } } SQL2.Aliased = Aliased; })(SQL || (SQL = {})); class Placeholder { constructor(name2) { this.name = name2; } static [import_entity.entityKind] = "Placeholder"; getSQL() { return new SQL([this]); } } function placeholder(name2) { return new Placeholder(name2); } function fillPlaceholders(params, values) { return params.map((p) => { if ((0, import_entity.is)(p, Placeholder)) { if (!(p.name in values)) { throw new Error(`No value for placeholder "${p.name}" was provided`); } return values[p.name]; } if ((0, import_entity.is)(p, Param) && (0, import_entity.is)(p.value, Placeholder)) { if (!(p.value.name in values)) { throw new Error(`No value for placeholder "${p.value.name}" was provided`); } return p.encoder.mapToDriverValue(values[p.value.name]); } return p; }); } const IsDrizzleView = Symbol.for("drizzle:IsDrizzleView"); class View { static [import_entity.entityKind] = "View"; /** @internal */ [import_view_common.ViewBaseConfig]; /** @internal */ [IsDrizzleView] = true; constructor({ name: name2, schema, selectedFields, query }) { this[import_view_common.ViewBaseConfig] = { name: name2, originalName: name2, schema, selectedFields, query, isExisting: !query, isAlias: false }; } getSQL() { return new SQL([this]); } } function isView(view) { return typeof view === "object" && view !== null && IsDrizzleView in view; } function getViewName(view) { return view[import_view_common.ViewBaseConfig].name; } import_column.Column.prototype.getSQL = function() { return new SQL([this]); }; import_table.Table.prototype.getSQL = function() { return new SQL([this]); }; import_subquery.Subquery.prototype.getSQL = function() { return new SQL([this]); }; // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { FakePrimitiveParam, Name, Param, Placeholder, SQL, StringChunk, View, fillPlaceholders, getViewName, isDriverValueEncoder, isSQLWrapper, isView, name, noopDecoder, noopEncoder, noopMapper, param, placeholder, sql }); //# sourceMappingURL=sql.cjs.map