{"version":3,"file":"sql.cjs","names":["entityKind","Table","hasTelemetry","tracer","Column","IsAlias","ViewBaseConfig","Subquery","TableName","TableSchema","OriginalName","TableColumns"],"sources":["../../src/sql/sql.ts"],"sourcesContent":["import type { CodecsCollection } from '~/codecs.ts';\nimport { entityKind, is } from '~/entity.ts';\nimport type { SelectResult } from '~/query-builders/select.types.ts';\nimport { Subquery } from '~/subquery.ts';\nimport { TableName } from '~/table.utils.ts';\nimport { hasTelemetry, tracer } from '~/tracing.ts';\nimport type { Assume, Equal } from '~/utils.ts';\nimport { ViewBaseConfig } from '~/view-common.ts';\nimport type { AnyColumn } from '../column.ts';\nimport { Column } from '../column.ts';\nimport { IsAlias, OriginalName, Table, TableColumns, TableSchema } from '../table.ts';\n\n/**\n * This class is used to indicate a primitive param value that is used in `sql` tag.\n * It is only used on type level and is never instantiated at runtime.\n * If you see a value of this type in the code, its runtime value is actually the primitive param value.\n */\nexport class FakePrimitiveParam {\n\tstatic readonly [entityKind]: string = 'FakePrimitiveParam';\n}\n\nexport type Chunk =\n\t| string\n\t| Table\n\t| View\n\t| AnyColumn\n\t| Name\n\t| Param\n\t| Placeholder\n\t| SQL;\n\nexport interface BuildQueryConfig {\n\tescapeName(name: string): string;\n\tescapeParam(num: number, value: unknown): string;\n\tescapeString(str: string): string;\n\tcodecs?: CodecsCollection;\n\tparamStartIndex?: { value: number };\n\tinlineParams?: boolean;\n\tinvokeSource?: 'indexes' | 'mssql-check' | 'mssql-view-with-schemabinding' | undefined;\n\ttagged?: true;\n}\n\nexport interface Query {\n\tsql: string;\n\tparams: unknown[];\n\t_sql?: TemplateStringsArray;\n\t// ^ TODO: revisit\n\t// for Bun.SQL cache performance\n}\n\n/**\n * Any value that implements the `getSQL` method. The implementations include:\n * - `Table`\n * - `Column`\n * - `View`\n * - `Subquery`\n * - `SQL`\n * - `SQL.Aliased`\n * - `Placeholder`\n * - `Param`\n */\nexport interface SQLWrapper<T = unknown> {\n\tgetSQL(): SQL<T>;\n\tshouldOmitSQLParens?(): boolean;\n}\n\nexport function isSQLWrapper(value: unknown): value is SQLWrapper {\n\treturn value !== null && value !== undefined && typeof (value as any).getSQL === 'function';\n}\n\nexport class StringChunk implements SQLWrapper {\n\tstatic readonly [entityKind]: string = 'StringChunk';\n\n\tconstructor(readonly value: string) {}\n\n\tgetSQL(): SQL<unknown> {\n\t\treturn new SQL([this]);\n\t}\n}\n\nexport class SQL<T = unknown> implements SQLWrapper<T> {\n\tstatic readonly [entityKind]: string = 'SQL';\n\n\tdeclare _: {\n\t\tbrand: 'SQL';\n\t\ttype: T;\n\t};\n\n\t/** @internal */\n\tdecoder: DriverValueDecoder<T, any> = noopDecoder;\n\t/** @internal */\n\tpublic shouldInlineParams = false;\n\n\t/** @internal */\n\tprivate _usedTables: string[] | undefined;\n\t/** @internal */\n\tget usedTables(): string[] {\n\t\tif (this._usedTables) return this._usedTables;\n\t\tthis._usedTables = [];\n\n\t\tfor (let i = 0; i < this.queryChunks.length; ++i) {\n\t\t\tconst chunk = this.queryChunks[i]!;\n\t\t\tif (is(chunk, Table)) {\n\t\t\t\tconst schemaName = chunk[Table.Symbol.Schema];\n\n\t\t\t\tthis._usedTables.push(\n\t\t\t\t\tschemaName === undefined\n\t\t\t\t\t\t? chunk[Table.Symbol.Name]\n\t\t\t\t\t\t: schemaName + '.' + chunk[Table.Symbol.Name],\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t\treturn this._usedTables;\n\t}\n\n\tconstructor(readonly queryChunks: SQLChunk[]) {}\n\n\tappend(query: SQL): this {\n\t\tthis.queryChunks.push(...query.queryChunks);\n\t\treturn this;\n\t}\n\n\ttoQuery(config: BuildQueryConfig): Query {\n\t\tif (!hasTelemetry) return this.buildQueryFromSourceParams(this.queryChunks, config);\n\n\t\treturn tracer.startActiveSpan('drizzle.buildSQL', (span) => {\n\t\t\tconst query = this.buildQueryFromSourceParams(this.queryChunks, config);\n\t\t\tspan?.setAttributes({\n\t\t\t\t'drizzle.query.text': query.sql,\n\t\t\t\t'drizzle.query.params': JSON.stringify(query.params),\n\t\t\t});\n\t\t\treturn query;\n\t\t});\n\t}\n\n\tbuildQueryFromSourceParams(chunks: SQLChunk[], _config: BuildQueryConfig): Query {\n\t\tconst strings: string[] = [];\n\t\tconst params: unknown[] = [];\n\t\tconst bounds: number[] | undefined = _config.tagged ? [] : undefined;\n\n\t\tthis.collectSQL(\n\t\t\tchunks,\n\t\t\t_config,\n\t\t\t_config.paramStartIndex || { value: 0 },\n\t\t\t_config.inlineParams || this.shouldInlineParams,\n\t\t\tstrings,\n\t\t\tparams,\n\t\t\tbounds,\n\t\t);\n\n\t\tif (bounds === undefined) {\n\t\t\treturn {\n\t\t\t\tsql: strings.join(''),\n\t\t\t\tparams,\n\t\t\t} as Query;\n\t\t}\n\n\t\tconst segments: string[] = new Array(bounds.length);\n\t\tfor (let i = 0; i < bounds.length; ++i) {\n\t\t\tconst end = i + 1 < bounds.length ? bounds[i + 1]! : strings.length;\n\t\t\tlet segment = '';\n\t\t\tfor (let j = bounds[i]!; j < end; ++j) segment += strings[j];\n\t\t\tsegments[i] = segment;\n\t\t}\n\n\t\treturn {\n\t\t\tsql: strings.join(''),\n\t\t\tparams,\n\t\t\t_sql: Object.assign(segments, { raw: segments }),\n\t\t} as Query;\n\t}\n\n\tprivate collectSQL(\n\t\tchunks: SQLChunk[],\n\t\tconfig: BuildQueryConfig,\n\t\tparamStartIndex: { value: number },\n\t\tinlineParams: boolean,\n\t\tstrings: string[],\n\t\tparams: unknown[],\n\t\tbounds: number[] | undefined,\n\t): void {\n\t\tconst {\n\t\t\tescapeName,\n\t\t\tescapeParam,\n\t\t\tcodecs,\n\t\t\tinvokeSource,\n\t\t} = config;\n\n\t\tfor (let i = 0; i < chunks.length; ++i) {\n\t\t\tif (bounds !== undefined) bounds.push(strings.length);\n\n\t\t\tconst chunk = chunks[i]!;\n\n\t\t\tif (is(chunk, StringChunk)) {\n\t\t\t\tstrings.push(chunk.value);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (is(chunk, SQL)) {\n\t\t\t\tthis.collectSQL(\n\t\t\t\t\tchunk.queryChunks,\n\t\t\t\t\tconfig,\n\t\t\t\t\tparamStartIndex,\n\t\t\t\t\tinlineParams || chunk.shouldInlineParams,\n\t\t\t\t\tstrings,\n\t\t\t\t\tparams,\n\t\t\t\t\tundefined,\n\t\t\t\t);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (is(chunk, Name)) {\n\t\t\t\tstrings.push(escapeName(chunk.value));\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (chunk === undefined) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (is(chunk, Column)) {\n\t\t\t\tconst columnName = chunk.name;\n\t\t\t\tif (invokeSource === 'indexes') {\n\t\t\t\t\tstrings.push(escapeName(columnName));\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tconst schemaName = invokeSource === 'mssql-check' ? undefined : chunk.table[Table.Symbol.Schema];\n\t\t\t\tstrings.push(\n\t\t\t\t\tchunk.isAlias ? escapeName(chunk.name) : chunk.table[IsAlias] || schemaName === undefined\n\t\t\t\t\t\t? escapeName(chunk.table[Table.Symbol.Name]) + '.' + escapeName(columnName)\n\t\t\t\t\t\t: escapeName(schemaName) + '.' + escapeName(chunk.table[Table.Symbol.Name]) + '.'\n\t\t\t\t\t\t\t+ escapeName(columnName),\n\t\t\t\t);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (is(chunk, Param)) {\n\t\t\t\tif (is(chunk.value, SQL)) {\n\t\t\t\t\tconst nested = chunk.value;\n\t\t\t\t\tthis.collectSQL(\n\t\t\t\t\t\tnested.queryChunks,\n\t\t\t\t\t\tconfig,\n\t\t\t\t\t\tparamStartIndex,\n\t\t\t\t\t\tinlineParams || nested.shouldInlineParams,\n\t\t\t\t\t\tstrings,\n\t\t\t\t\t\tparams,\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tconst useCodecs = codecs && is(chunk.encoder, Column);\n\n\t\t\t\tif (is(chunk.value, Placeholder)) {\n\t\t\t\t\tconst escaped = escapeParam(paramStartIndex.value++, chunk);\n\t\t\t\t\tchunk.codec = useCodecs\n\t\t\t\t\t\t? (value) => codecs.apply(chunk.encoder as Column, 'normalizeParam', value)\n\t\t\t\t\t\t: undefined;\n\t\t\t\t\tstrings.push(\n\t\t\t\t\t\tuseCodecs\n\t\t\t\t\t\t\t? codecs.apply(chunk.encoder, 'castParam', escaped)\n\t\t\t\t\t\t\t: escaped,\n\t\t\t\t\t);\n\t\t\t\t\tparams.push(chunk);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tlet mappedValue: any;\n\t\t\t\tif (chunk.value === null) {\n\t\t\t\t\tmappedValue = chunk.value;\n\t\t\t\t} else {\n\t\t\t\t\tmappedValue = chunk.encoder.mapToDriverValue.isNoop\n\t\t\t\t\t\t? chunk.value\n\t\t\t\t\t\t: chunk.encoder.mapToDriverValue(chunk.value);\n\n\t\t\t\t\tif (is(mappedValue, SQL)) {\n\t\t\t\t\t\tconst nested: SQL = mappedValue;\n\t\t\t\t\t\tthis.collectSQL(\n\t\t\t\t\t\t\tnested.queryChunks,\n\t\t\t\t\t\t\tconfig,\n\t\t\t\t\t\t\tparamStartIndex,\n\t\t\t\t\t\t\tinlineParams || nested.shouldInlineParams,\n\t\t\t\t\t\t\tstrings,\n\t\t\t\t\t\t\tparams,\n\t\t\t\t\t\t\tundefined,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (useCodecs) {\n\t\t\t\t\t\tmappedValue = codecs.apply(\n\t\t\t\t\t\t\tchunk.encoder,\n\t\t\t\t\t\t\t'normalizeParam',\n\t\t\t\t\t\t\tmappedValue,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (inlineParams) {\n\t\t\t\t\tstrings.push(this.mapInlineParam(mappedValue, config));\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tconst escaped = escapeParam(paramStartIndex.value++, mappedValue);\n\t\t\t\tstrings.push(\n\t\t\t\t\tuseCodecs\n\t\t\t\t\t\t? codecs.apply(chunk.encoder, 'castParam', escaped)\n\t\t\t\t\t\t: escaped,\n\t\t\t\t);\n\t\t\t\tparams.push(mappedValue);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (is(chunk, Placeholder)) {\n\t\t\t\tstrings.push(escapeParam(paramStartIndex.value++, chunk));\n\t\t\t\tparams.push(chunk);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (is(chunk, Table)) {\n\t\t\t\tconst schemaName = chunk[Table.Symbol.Schema];\n\t\t\t\tconst tableName = chunk[Table.Symbol.Name];\n\n\t\t\t\tif (invokeSource === 'mssql-view-with-schemabinding') {\n\t\t\t\t\tstrings.push(\n\t\t\t\t\t\t(schemaName === undefined ? escapeName('dbo') : escapeName(schemaName)) + '.'\n\t\t\t\t\t\t\t+ escapeName(tableName),\n\t\t\t\t\t);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tstrings.push(\n\t\t\t\t\tschemaName === undefined || chunk[IsAlias]\n\t\t\t\t\t\t? escapeName(tableName)\n\t\t\t\t\t\t: escapeName(schemaName) + '.' + escapeName(tableName),\n\t\t\t\t);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (is(chunk, View)) {\n\t\t\t\tconst schemaName = chunk[ViewBaseConfig].schema;\n\t\t\t\tconst viewName = chunk[ViewBaseConfig].name;\n\t\t\t\tstrings.push(\n\t\t\t\t\tschemaName === undefined || chunk[ViewBaseConfig].isAlias\n\t\t\t\t\t\t? escapeName(viewName)\n\t\t\t\t\t\t: escapeName(schemaName) + '.' + escapeName(viewName),\n\t\t\t\t);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (is(chunk, SQL.Aliased) && chunk.fieldAlias !== undefined) {\n\t\t\t\tstrings.push(\n\t\t\t\t\t(chunk.origin !== undefined ? escapeName(chunk.origin) + '.' : '') + escapeName(chunk.fieldAlias),\n\t\t\t\t);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (is(chunk, Subquery)) {\n\t\t\t\tif (chunk._.isWith) {\n\t\t\t\t\tstrings.push(escapeName(chunk._.alias));\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tconst nested = chunk._.sql;\n\t\t\t\tstrings.push('(');\n\t\t\t\tthis.collectSQL(\n\t\t\t\t\tnested.queryChunks,\n\t\t\t\t\tconfig,\n\t\t\t\t\tparamStartIndex,\n\t\t\t\t\tinlineParams || nested.shouldInlineParams,\n\t\t\t\t\tstrings,\n\t\t\t\t\tparams,\n\t\t\t\t\tundefined,\n\t\t\t\t);\n\t\t\t\tstrings.push(') ' + escapeName(chunk._.alias));\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (typeof chunk === 'function' && 'enumName' in chunk) {\n\t\t\t\tif ('schema' in chunk && chunk.schema) {\n\t\t\t\t\tstrings.push(escapeName(chunk.schema as string) + '.' + escapeName(chunk.enumName as string));\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tstrings.push(escapeName(chunk.enumName as string));\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (isSQLWrapper(chunk)) {\n\t\t\t\tconst nested = chunk.getSQL();\n\t\t\t\tconst nestedInlineParams = inlineParams || nested.shouldInlineParams;\n\n\t\t\t\tif (chunk.shouldOmitSQLParens?.()) {\n\t\t\t\t\tthis.collectSQL(\n\t\t\t\t\t\tnested.queryChunks,\n\t\t\t\t\t\tconfig,\n\t\t\t\t\t\tparamStartIndex,\n\t\t\t\t\t\tnestedInlineParams,\n\t\t\t\t\t\tstrings,\n\t\t\t\t\t\tparams,\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tstrings.push('(');\n\t\t\t\tthis.collectSQL(\n\t\t\t\t\tnested.queryChunks,\n\t\t\t\t\tconfig,\n\t\t\t\t\tparamStartIndex,\n\t\t\t\t\tnestedInlineParams,\n\t\t\t\t\tstrings,\n\t\t\t\t\tparams,\n\t\t\t\t\tundefined,\n\t\t\t\t);\n\t\t\t\tstrings.push(')');\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (Array.isArray(chunk)) {\n\t\t\t\tstrings.push('(');\n\t\t\t\tconst element: SQLChunk[] = [undefined];\n\t\t\t\tfor (let j = 0; j < chunk.length; ++j) {\n\t\t\t\t\tif (j > 0) strings.push(', ');\n\t\t\t\t\telement[0] = chunk[j];\n\t\t\t\t\tthis.collectSQL(element, config, paramStartIndex, inlineParams, strings, params, undefined);\n\t\t\t\t}\n\t\t\t\tstrings.push(')');\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (inlineParams) {\n\t\t\t\tstrings.push(this.mapInlineParam(chunk, config));\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tstrings.push(escapeParam(paramStartIndex.value++, chunk));\n\t\t\tparams.push(chunk);\n\t\t}\n\t}\n\n\tprivate mapInlineParam(\n\t\tchunk: unknown,\n\t\t{ escapeString }: BuildQueryConfig,\n\t): string {\n\t\tif (chunk === null) {\n\t\t\treturn 'null';\n\t\t}\n\t\tif (typeof chunk === 'number' || typeof chunk === 'boolean' || typeof chunk === 'bigint') {\n\t\t\treturn chunk.toString();\n\t\t}\n\t\tif (typeof chunk === 'string') {\n\t\t\treturn escapeString(chunk);\n\t\t}\n\t\tif (typeof chunk === 'object') {\n\t\t\tconst mappedValueAsString = chunk.toString();\n\t\t\tif (mappedValueAsString === '[object Object]') {\n\t\t\t\treturn escapeString(JSON.stringify(chunk));\n\t\t\t}\n\t\t\treturn escapeString(mappedValueAsString);\n\t\t}\n\t\tthrow new Error('Unexpected param value: ' + chunk);\n\t}\n\n\tgetSQL(): SQL<T> {\n\t\treturn this;\n\t}\n\n\tas(alias: string): SQL.Aliased<T>;\n\t/**\n\t * @deprecated\n\t * Use ``sql<DataType>`query`.as(alias)`` instead.\n\t */\n\tas<TData>(): SQL<TData>;\n\t/**\n\t * @deprecated\n\t * Use ``sql<DataType>`query`.as(alias)`` instead.\n\t */\n\tas<TData>(alias: string): SQL.Aliased<TData>;\n\tas(alias?: string): SQL<T> | SQL.Aliased<T> {\n\t\t// TODO: remove with deprecated overloads\n\t\tif (alias === undefined) {\n\t\t\treturn this;\n\t\t}\n\n\t\treturn new SQL.Aliased(this, alias);\n\t}\n\n\tmapWith<\n\t\tTDecoder extends\n\t\t\t| DriverValueDecoder<any, Exclude<T, null>>\n\t\t\t| DriverValueDecoder<any, Exclude<T, null>>['mapFromDriverValue'],\n\t>(\n\t\tdecoder: TDecoder,\n\t): Equal<T, unknown> extends true ? SQL<GetDecoderResult<TDecoder>>\n\t\t: Equal<T, any> extends true ? SQL<GetDecoderResult<TDecoder>>\n\t\t: SQL<GetDecoderResult<TDecoder> | (null extends T ? null : never)>\n\t{\n\t\tthis.decoder = typeof decoder === 'function' ? { mapFromDriverValue: decoder } : decoder;\n\t\treturn this as SQL<any>;\n\t}\n\n\tnullable(): SQL<T | null> {\n\t\treturn this;\n\t}\n\n\tinlineParams(): this {\n\t\tthis.shouldInlineParams = true;\n\t\treturn this;\n\t}\n\n\t/**\n\t * This method is used to conditionally include a part of the query.\n\t *\n\t * @param condition - Condition to check\n\t * @returns itself if the condition is `true`, otherwise `undefined`\n\t */\n\tif(condition: any | undefined): this | undefined {\n\t\treturn condition ? this : undefined;\n\t}\n}\n\nexport type GetDecoderResult<T> = T extends Column ? T['_']['data'] : T extends\n\t| DriverValueDecoder<infer TData, any>\n\t| DriverValueDecoder<infer TData, any>['mapFromDriverValue'] ? TData\n: never;\n\n/**\n * Any DB name (table, column, index etc.)\n */\nexport class Name implements SQLWrapper {\n\tstatic readonly [entityKind]: string = 'Name';\n\n\tprotected brand!: 'Name';\n\n\tconstructor(readonly value: string) {}\n\n\tgetSQL(): SQL<unknown> {\n\t\treturn new SQL([this]);\n\t}\n}\n\n/**\n * Any DB name (table, column, index etc.)\n * @deprecated Use `sql.identifier` instead.\n */\nexport function name(value: string): Name {\n\treturn new Name(value);\n}\n\nexport interface DriverValueDecoderFn<TData, TDriverParam> {\n\t(value: TDriverParam): TData;\n\t/** @internal */\n\tisNoop?: true | undefined;\n}\n\nexport interface DriverValueDecoder<TData, TDriverParam> {\n\tmapFromDriverValue: DriverValueDecoderFn<TData, TDriverParam>;\n}\n\nexport interface DriverValueEncoderFn<TData, TDriverParam> {\n\t(value: TData): TDriverParam;\n\t/** @internal */\n\tisNoop?: true | undefined;\n}\n\nexport interface DriverValueEncoder<TData, TDriverParam> {\n\tmapToDriverValue: DriverValueEncoderFn<TData, TDriverParam>;\n}\n\nexport function isDriverValueEncoder(value: unknown): value is DriverValueEncoder<any, any> {\n\treturn typeof value === 'object' && value !== null && 'mapToDriverValue' in value\n\t\t&& typeof (value as any).mapToDriverValue === 'function';\n}\n\nexport const noopDecoder: DriverValueDecoder<any, any> = {\n\tmapFromDriverValue: (value) => value,\n};\n\nnoopDecoder.mapFromDriverValue.isNoop = true;\n\nexport const noopEncoder: DriverValueEncoder<any, any> = {\n\tmapToDriverValue: (value) => value,\n};\n\nnoopEncoder.mapToDriverValue.isNoop = true;\n\nexport interface DriverValueMapper<TData, TDriverParam>\n\textends DriverValueDecoder<TData, TDriverParam>, DriverValueEncoder<TData, TDriverParam>\n{}\n\nexport function isNoop(mapper: DriverValueEncoderFn<any, any> | DriverValueDecoderFn<any, any>) {\n\treturn mapper.isNoop;\n}\n\nexport const noopMapper: DriverValueMapper<any, any> = {\n\t...noopDecoder,\n\t...noopEncoder,\n};\n\n/** Parameter value that is optionally bound to an encoder (for example, a column). */\nexport class Param<TDataType = any, TDriverParamType = TDataType> implements SQLWrapper {\n\tstatic readonly [entityKind]: string = 'Param';\n\n\tprotected brand!: 'BoundParamValue';\n\n\t/**\n\t * @param value - Parameter value\n\t * @param encoder - Encoder to convert the value to a driver parameter\n\t */\n\tconstructor(\n\t\treadonly value: TDataType | Placeholder<string, TDataType>,\n\t\treadonly encoder: DriverValueEncoder<TDataType, TDriverParamType> = noopEncoder,\n\t\tpublic codec?: (value: any) => any,\n\t) {}\n\n\tgetSQL(): SQL<unknown> {\n\t\treturn new SQL([this]);\n\t}\n}\n\n/** @deprecated Use `sql.param` instead. */\nexport function param<TData, TDriver>(\n\tvalue: TData,\n\tencoder?: DriverValueEncoder<TData, TDriver>,\n): Param<TData, TDriver> {\n\treturn new Param(value, encoder);\n}\n\n/**\n * Anything that can be passed to the `` sql`...` `` tagged function.\n */\nexport type SQLChunk =\n\t| StringChunk\n\t| SQLChunk[]\n\t| SQLWrapper\n\t| SQL\n\t| Table\n\t| View\n\t| Subquery\n\t| AnyColumn\n\t| Param\n\t| Name\n\t| undefined\n\t| FakePrimitiveParam\n\t| Placeholder;\n\nexport type SQLGenerator<T = unknown> = typeof sql<T>;\n\nexport function sql<T>(strings: TemplateStringsArray, ...params: any[]): SQL<T>;\n/*\n\tThe type of `params` is specified as `SQLChunk[]`, but that's slightly incorrect -\n\tin runtime, users won't pass `FakePrimitiveParam` instances as `params` - they will pass primitive values\n\twhich will be wrapped in `Param`. That's why the overload specifies `params` as `any[]` and not as `SQLSourceParam[]`.\n\tThis type is used to make our lives easier and the type checker happy.\n*/\nexport function sql(strings: TemplateStringsArray, ...params: SQLChunk[]): SQL {\n\tconst startWithString = params.length > 0 || (strings.length > 0 && strings[0] !== '');\n\tconst chunkCount = startWithString ? strings.length + params.length : strings.length - 1;\n\tconst queryChunks: SQLChunk[] = new Array(chunkCount < 0 ? 0 : chunkCount);\n\n\tlet writeIdx = 0;\n\tif (startWithString) {\n\t\tqueryChunks[writeIdx++] = new StringChunk(strings[0]!);\n\t}\n\tfor (let paramIdx = 0; paramIdx < params.length; ++paramIdx) {\n\t\tconst param = params[paramIdx]!;\n\t\tqueryChunks[writeIdx++] = param;\n\t\tqueryChunks[writeIdx++] = new StringChunk(strings[paramIdx + 1]!);\n\t}\n\n\treturn new SQL(queryChunks);\n}\n\nexport namespace sql {\n\texport function empty(): SQL {\n\t\treturn new SQL([]);\n\t}\n\n\t/** @deprecated - use `sql.join()` */\n\texport function fromList(list: SQLChunk[]): SQL {\n\t\treturn new SQL(list);\n\t}\n\n\t/**\n\t * Convenience function to create an SQL query from a raw string.\n\t * @param str The raw SQL query string.\n\t */\n\texport function raw(str: string): SQL {\n\t\treturn new SQL([new StringChunk(str)]);\n\t}\n\n\t/**\n\t * Join a list of SQL chunks with a separator.\n\t * @example\n\t * ```ts\n\t * const query = sql.join([sql`a`, sql`b`, sql`c`]);\n\t * // sql`abc`\n\t * ```\n\t * @example\n\t * ```ts\n\t * const query = sql.join([sql`a`, sql`b`, sql`c`], sql`, `);\n\t * // sql`a, b, c`\n\t * ```\n\t */\n\texport function join(chunks: SQLChunk[], separator?: SQLChunk): SQL {\n\t\tconst { length } = chunks;\n\t\tif (separator === undefined || length === 0) return new SQL(chunks.slice());\n\n\t\tconst result: SQLChunk[] = new Array(length * 2 - 1);\n\t\tfor (let i = 0, writeIdx = 0; i < length; ++i) {\n\t\t\tresult[writeIdx++] = chunks[i];\n\n\t\t\tif (i < length - 1) {\n\t\t\t\tresult[writeIdx++] = separator;\n\t\t\t}\n\t\t}\n\n\t\treturn new SQL(result);\n\t}\n\n\t/**\n\t * Create a SQL chunk that represents a DB identifier (table, column, index etc.).\n\t * When used in a query, the identifier will be escaped based on the DB engine.\n\t * For example, in PostgreSQL, identifiers are escaped with double quotes.\n\t *\n\t * **WARNING: This function does not offer any protection against SQL injections, so you must validate any user input beforehand.**\n\t *\n\t * @example ```ts\n\t * const query = sql`SELECT * FROM ${sql.identifier('my-table')}`;\n\t * // 'SELECT * FROM \"my-table\"'\n\t * ```\n\t */\n\texport function identifier(value: string): Name {\n\t\treturn new Name(value);\n\t}\n\n\texport function placeholder<TName extends string>(name: TName): Placeholder<TName> {\n\t\treturn new Placeholder(name);\n\t}\n\n\texport function param<TData, TDriver>(\n\t\tvalue: TData | Placeholder<string, TData>,\n\t\tencoder?: DriverValueEncoder<TData, TDriver>,\n\t): Param<TData, TDriver> {\n\t\treturn new Param(value, encoder);\n\t}\n\n\t/**\n\t * Attach [sqlcommenter](https://google.github.io/sqlcommenter) comment to a query\n\t */\n\texport function comment(input: CommentInput): SQL | undefined {\n\t\tconst encoded = sqlCommenter(input);\n\t\tif (!encoded.length) return undefined;\n\n\t\treturn sql.raw(encoded);\n\t}\n}\n\nexport function sqlCommenter(input: CommentInput): string {\n\tconst encoded = sqlCommenter.encodeInput(input);\n\tif (!encoded.length) return '';\n\n\treturn `/*${encoded}*/`;\n}\n\nexport namespace sqlCommenter {\n\texport function merge(input1: CommentInput | undefined, input2: CommentInput | undefined) {\n\t\tlet encoded: CommentInput;\n\t\tif (typeof input1 === 'object' && typeof input2 === 'object') {\n\t\t\tencoded = encodeInput({ ...input1, ...input2 });\n\t\t} else if (input1 && input2) {\n\t\t\tencoded = [encodeInput(input1), encodeInput(input2)].filter((i) => i.length).join(',');\n\t\t} else if (input2) {\n\t\t\tencoded = encodeInput(input2);\n\t\t} else if (input1) {\n\t\t\tencoded = encodeInput(input1);\n\t\t} else {\n\t\t\treturn '';\n\t\t}\n\n\t\tif (!encoded.length) return '';\n\n\t\treturn `/*${encoded}*/`;\n\t}\n\n\texport function encodeInput(input: CommentInput): string {\n\t\tif (typeof input === 'string') {\n\t\t\tif (!input.length) return input;\n\n\t\t\treturn sanitizeStringInput(input);\n\t\t}\n\n\t\tconst parts: string[] = [];\n\n\t\tfor (const [key, value] of Object.entries(input)) {\n\t\t\tif (value === null || value === undefined || value === '') continue;\n\n\t\t\tconst encodedKey = sanitizeObjectElement(key);\n\t\t\tconst encodedValue = sanitizeObjectElement(String(value));\n\n\t\t\tparts.push(`${encodedKey}='${encodedValue}'`);\n\t\t}\n\n\t\tif (!parts.length) return '';\n\n\t\treturn parts.sort().join(',');\n\t}\n\n\texport function sanitizeObjectElement(key: string): string {\n\t\tconst urlEncoded = encodeURIComponent(key);\n\t\treturn urlEncoded.replace(/'/g, `\\\\'`);\n\t}\n\n\texport function sanitizeStringInput(input: string): string {\n\t\treturn input.replace(/\\/\\*/g, '/ *').replace(/\\*\\//g, '* /');\n\t}\n}\n\nexport type CommentInput = string | SqlCommenterInput;\n\nexport type SqlCommenterInput = Record<\n\tstring,\n\tstring | number | bigint | boolean | null | undefined\n>;\n\nexport namespace SQL {\n\texport class Aliased<T = unknown> implements SQLWrapper<T> {\n\t\tstatic readonly [entityKind]: string = 'SQL.Aliased';\n\n\t\tdeclare _: {\n\t\t\tbrand: 'SQL.Aliased';\n\t\t\ttype: T;\n\t\t};\n\n\t\t/** @internal */\n\t\tisSelectionField = false;\n\t\t/** @internal */\n\t\torigin?: string;\n\n\t\tconstructor(\n\t\t\treadonly sql: SQL<T>,\n\t\t\treadonly fieldAlias: string,\n\t\t) {}\n\n\t\tgetSQL(): SQL<T> {\n\t\t\treturn this.sql as SQL<T>;\n\t\t}\n\n\t\t/** @internal */\n\t\tclone() {\n\t\t\treturn new Aliased<T>(this.sql, this.fieldAlias);\n\t\t}\n\t}\n}\n\nexport class Placeholder<TName extends string = string, TValue = any> implements SQLWrapper {\n\tstatic readonly [entityKind]: string = 'Placeholder';\n\n\tdeclare protected: TValue;\n\n\tconstructor(readonly name: TName) {}\n\n\tgetSQL(): SQL {\n\t\treturn new SQL([this]);\n\t}\n}\n\n/** @deprecated Use `sql.placeholder` instead. */\nexport function placeholder<TName extends string>(name: TName): Placeholder<TName> {\n\treturn new Placeholder(name);\n}\n\nexport function fillPlaceholders(params: unknown[], values: Record<string, unknown>): unknown[] {\n\treturn params.map((p) => {\n\t\tif (is(p, Placeholder)) {\n\t\t\tif (!(p.name in values)) {\n\t\t\t\tthrow new Error(`No value for placeholder \"${p.name}\" was provided`);\n\t\t\t}\n\n\t\t\treturn values[p.name];\n\t\t}\n\n\t\tif (is(p, Param) && is(p.value, Placeholder)) {\n\t\t\tif (!(p.value.name in values)) {\n\t\t\t\tthrow new Error(`No value for placeholder \"${p.value.name}\" was provided`);\n\t\t\t}\n\n\t\t\tconst value = values[p.value.name];\n\t\t\tif (value === null) return value;\n\n\t\t\tconst mapped = p.encoder.mapToDriverValue.isNoop\n\t\t\t\t? value\n\t\t\t\t: p.encoder.mapToDriverValue(value);\n\n\t\t\treturn p.codec ? p.codec(mapped) : mapped;\n\t\t}\n\n\t\treturn p;\n\t});\n}\n\nexport type ColumnsSelection = Record<string, unknown>;\n\nconst IsDrizzleView = Symbol.for('drizzle:IsDrizzleView');\n\nexport abstract class View<\n\tTName extends string = string,\n\tTExisting extends boolean = boolean,\n\tTSelection extends ColumnsSelection = ColumnsSelection,\n> {\n\tstatic readonly [entityKind]: string = 'View';\n\n\tdeclare _: {\n\t\tbrand: 'View';\n\t\tviewBrand: string;\n\t\tname: TName;\n\t\texisting: TExisting;\n\t\tselectedFields: TSelection;\n\t};\n\n\t/** @internal */\n\t[ViewBaseConfig]: {\n\t\tname: TName;\n\t\toriginalName: TName;\n\t\tschema: string | undefined;\n\t\tselectedFields: ColumnsSelection;\n\t\tisExisting: TExisting;\n\t\tquery: TExisting extends true ? undefined : SQL;\n\t\tisAlias: boolean;\n\t};\n\n\t/** @internal */\n\t[IsDrizzleView] = true;\n\n\t/** @internal */\n\tpublic get [TableName]() {\n\t\treturn this[ViewBaseConfig].name;\n\t}\n\n\t/** @internal */\n\tpublic get [TableSchema]() {\n\t\treturn this[ViewBaseConfig].schema;\n\t}\n\n\t/** @internal */\n\tpublic get [IsAlias]() {\n\t\treturn this[ViewBaseConfig].isAlias;\n\t}\n\n\t/** @internal */\n\tpublic get [OriginalName]() {\n\t\treturn this[ViewBaseConfig].originalName;\n\t}\n\n\t/** @internal */\n\tpublic get [TableColumns]() {\n\t\treturn (this[ViewBaseConfig].selectedFields) as any as Record<string, unknown>;\n\t}\n\n\tdeclare readonly $inferSelect: InferSelectViewModel<View<Assume<TName, string>, TExisting, TSelection>>;\n\n\tconstructor(\n\t\t{ name, schema, selectedFields, query }: {\n\t\t\tname: TName;\n\t\t\tschema: string | undefined;\n\t\t\tselectedFields: ColumnsSelection;\n\t\t\tquery: SQL | undefined;\n\t\t},\n\t) {\n\t\tthis[ViewBaseConfig] = {\n\t\t\tname,\n\t\t\toriginalName: name,\n\t\t\tschema,\n\t\t\tselectedFields,\n\t\t\tquery: query as (TExisting extends true ? undefined : SQL),\n\t\t\tisExisting: !query as TExisting,\n\t\t\tisAlias: false,\n\t\t};\n\t}\n}\n\nexport function isView(view: unknown): view is View {\n\treturn typeof view === 'object' && view !== null && IsDrizzleView in view;\n}\n\nexport function getViewName<T extends View>(view: T): T['_']['name'] {\n\treturn view[ViewBaseConfig].name;\n}\n\nexport type InferSelectViewModel<TView extends View> =\n\tEqual<TView['_']['selectedFields'], { [x: string]: unknown }> extends true ? { [x: string]: unknown }\n\t\t: SelectResult<\n\t\t\tTView['_']['selectedFields'],\n\t\t\t'single',\n\t\t\tRecord<TView['_']['name'], 'not-null'>\n\t\t>;\n\n// Defined separately from the Column class to resolve circular dependency\nColumn.prototype.getSQL = function() {\n\treturn new SQL([this]);\n};\n// Defined separately from the Subquery class to resolve circular dependency\nSubquery.prototype.getSQL = function() {\n\treturn new SQL([this]);\n};\n\nexport type SQLEntity = SQL | SQLWrapper | SQL.Aliased | Table | View;\n"],"mappings":"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"}