drizzle-orm 1.0.0-beta.1-813549e → 1.0.0-beta.1-02522e1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/cockroach-core/query-builders/count.cjs.map +1 -1
- package/cockroach-core/query-builders/count.d.cts +3 -2
- package/cockroach-core/query-builders/count.d.ts +3 -2
- package/cockroach-core/query-builders/count.js.map +1 -1
- package/cockroach-core/schema.cjs +8 -1
- package/cockroach-core/schema.cjs.map +1 -1
- package/cockroach-core/schema.js +9 -2
- package/cockroach-core/schema.js.map +1 -1
- package/cockroach-core/table.cjs +23 -2
- package/cockroach-core/table.cjs.map +1 -1
- package/cockroach-core/table.d.cts +4 -1
- package/cockroach-core/table.d.ts +4 -1
- package/cockroach-core/table.js +23 -2
- package/cockroach-core/table.js.map +1 -1
- package/gel-core/query-builders/count.cjs.map +1 -1
- package/gel-core/query-builders/count.d.cts +3 -2
- package/gel-core/query-builders/count.d.ts +3 -2
- package/gel-core/query-builders/count.js.map +1 -1
- package/package.json +97 -97
- package/pg-core/query-builders/count.cjs.map +1 -1
- package/pg-core/query-builders/count.d.cts +3 -2
- package/pg-core/query-builders/count.d.ts +3 -2
- package/pg-core/query-builders/count.js.map +1 -1
- package/pg-core/schema.cjs +7 -0
- package/pg-core/schema.cjs.map +1 -1
- package/pg-core/schema.js +8 -1
- package/pg-core/schema.js.map +1 -1
- package/pg-core/table.cjs +16 -8
- package/pg-core/table.cjs.map +1 -1
- package/pg-core/table.d.cts +5 -4
- package/pg-core/table.d.ts +5 -4
- package/pg-core/table.js +16 -8
- package/pg-core/table.js.map +1 -1
- package/relations.cjs +2 -0
- package/relations.cjs.map +1 -1
- package/relations.d.cts +3 -3
- package/relations.d.ts +3 -3
- package/relations.js +3 -1
- package/relations.js.map +1 -1
- package/sql/sql.cjs +0 -6
- package/sql/sql.cjs.map +1 -1
- package/sql/sql.d.cts +2 -2
- package/sql/sql.d.ts +2 -2
- package/sql/sql.js +0 -6
- package/sql/sql.js.map +1 -1
- package/table.cjs +0 -1
- package/table.cjs.map +1 -1
- package/table.d.cts +2 -3
- package/table.d.ts +2 -3
- package/table.js +0 -1
- package/table.js.map +1 -1
package/relations.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/relations.ts"],"sourcesContent":["import { IsAlias, OriginalName, Table, TableColumns, TableSchema } from '~/table.ts';\nimport { aliasedTable } from './alias.ts';\nimport type { CasingCache } from './casing.ts';\nimport { type AnyColumn, Column } from './column.ts';\nimport { entityKind, is } from './entity.ts';\nimport { DrizzleError } from './errors.ts';\nimport {\n\tand,\n\tarrayContained,\n\tarrayContains,\n\tarrayOverlaps,\n\tasc,\n\tbetween,\n\tdesc,\n\teq,\n\texists,\n\tgt,\n\tgte,\n\tilike,\n\tinArray,\n\tisNotNull,\n\tisNull,\n\tlike,\n\tlt,\n\tlte,\n\tne,\n\tnot,\n\tnotBetween,\n\tnotExists,\n\tnotIlike,\n\tnotInArray,\n\tnotLike,\n\tor,\n} from './sql/expressions/index.ts';\nimport { Placeholder, SQL, sql, type SQLWrapper, View } from './sql/sql.ts';\nimport type { Assume, DrizzleTypeError, Equal, Simplify, ValueOrArray } from './utils.ts';\n\nexport type FilteredSchemaEntry = Table<any> | View<string, boolean, FieldSelection>;\n\nexport type SchemaEntry = Table<any> | View<string, boolean, any>;\n\nexport type Schema = Record<string, SchemaEntry>;\n\nexport type GetTableViewColumns<T extends SchemaEntry> = T extends View<string, boolean, any> ? T['_']['selectedFields']\n\t: T extends Table<any> ? T['_']['columns']\n\t: never;\n\nexport type GetTableViewFieldSelection<T extends SchemaEntry> = T extends View<string, boolean, FieldSelection>\n\t? T['_']['selectedFields']\n\t: T extends Table<any> ? T['_']['columns']\n\t: never;\n\nexport type FieldValue =\n\t| Column<any>\n\t| SQLWrapper\n\t| SQL.Aliased\n\t| SQL;\n\nexport type FieldSelection = Record<string, FieldValue>;\n\nexport function processRelations(tablesConfig: TablesRelationalConfig, tables: Schema) {\n\tfor (const tableConfig of Object.values(tablesConfig)) {\n\t\tfor (const [relationFieldName, relation] of Object.entries(tableConfig.relations)) {\n\t\t\tif (!is(relation, Relation)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\trelation.sourceTable = tableConfig.table;\n\t\t\trelation.fieldName = relationFieldName;\n\t\t}\n\t}\n\n\tfor (const [sourceTableName, tableConfig] of Object.entries(tablesConfig)) {\n\t\tfor (const [relationFieldName, relation] of Object.entries(tableConfig.relations)) {\n\t\t\tif (!is(relation, Relation)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tlet reverseRelation: Relation | undefined;\n\t\t\tconst {\n\t\t\t\ttargetTableName,\n\t\t\t\talias,\n\t\t\t\tsourceColumns,\n\t\t\t\ttargetColumns,\n\t\t\t\tthroughTable,\n\t\t\t\tsourceTable,\n\t\t\t\tthrough,\n\t\t\t\ttargetTable,\n\t\t\t\twhere,\n\t\t\t\tsourceColumnTableNames,\n\t\t\t\ttargetColumnTableNames,\n\t\t\t} = relation;\n\t\t\tconst relationPrintName = `relations -> ${tableConfig.name}: { ${relationFieldName}: r.${\n\t\t\t\tis(relation, One) ? 'one' : 'many'\n\t\t\t}.${targetTableName}(...) }`;\n\n\t\t\tif (relationFieldName in tableConfig.table[TableColumns]) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`${relationPrintName}: relation name collides with column \"${relationFieldName}\" of table \"${tableConfig.name}\"`,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (typeof alias === 'string' && !alias) {\n\t\t\t\tthrow new Error(`${relationPrintName}: \"alias\" cannot be an empty string - omit it if you don't need it`);\n\t\t\t}\n\n\t\t\tif (sourceColumns?.length === 0) {\n\t\t\t\tthrow new Error(`${relationPrintName}: \"from\" cannot be empty`);\n\t\t\t}\n\n\t\t\tif (targetColumns?.length === 0) {\n\t\t\t\tthrow new Error(`${relationPrintName}: \"to\" cannot be empty`);\n\t\t\t}\n\n\t\t\tif (sourceColumns && targetColumns) {\n\t\t\t\tif (sourceColumns.length !== targetColumns.length && !throughTable) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`${relationPrintName}: \"from\" and \"to\" fields without \"through\" must have the same length`,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tfor (const sName of sourceColumnTableNames) {\n\t\t\t\t\tif (sName !== sourceTableName) {\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t`${relationPrintName}: all \"from\" columns must belong to table \"${sourceTableName}\", found column of table \"${sName}\"`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tfor (const tName of targetColumnTableNames) {\n\t\t\t\t\tif (tName !== targetTableName) {\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t`${relationPrintName}: all \"to\" columns must belong to table \"${targetTable}\", found column of table \"${tName}\"`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (through) {\n\t\t\t\t\tif (\n\t\t\t\t\t\tthrough.source.length !== sourceColumns.length\n\t\t\t\t\t\t|| through.target.length !== targetColumns.length\n\t\t\t\t\t) {\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t`${relationPrintName}: \".through(column)\" must be used either on all columns in \"from\" and \"to\" or not defined on any of them`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\tfor (const column of through.source) {\n\t\t\t\t\t\tif (tables[column._.tableName] !== throughTable) {\n\t\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\t`${relationPrintName}: \".through(column)\" must be used on the same table by all columns of the relation`,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tfor (const column of through.target) {\n\t\t\t\t\t\tif (tables[column._.tableName] !== throughTable) {\n\t\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\t`${relationPrintName}: \".through(column)\" must be used on the same table by all columns of the relation`,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (sourceColumns || targetColumns) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`${relationPrintName}: relation must have either both \"from\" and \"to\" defined, or none of them`,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst reverseTableConfig = tablesConfig[targetTableName];\n\t\t\tif (!reverseTableConfig) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`${relationPrintName}: not enough data provided to build the relation - \"from\"/\"to\" are not defined, and no reverse relations of table \"${targetTableName}\" were found\"`,\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (alias) {\n\t\t\t\tconst reverseRelations = Object.values(reverseTableConfig.relations).filter((it): it is Relation =>\n\t\t\t\t\tis(it, Relation) && it.alias === alias && it !== relation\n\t\t\t\t);\n\t\t\t\tif (reverseRelations.length > 1) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`${relationPrintName}: not enough data provided to build the relation - \"from\"/\"to\" are not defined, and multiple relations with alias \"${alias}\" found in table \"${targetTableName}\": ${\n\t\t\t\t\t\t\treverseRelations.map((it) => `\"${it.fieldName}\"`).join(', ')\n\t\t\t\t\t\t}`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\treverseRelation = reverseRelations[0];\n\t\t\t\tif (!reverseRelation) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`${relationPrintName}: not enough data provided to build the relation - \"from\"/\"to\" are not defined, and there is no reverse relation of table \"${targetTableName}\" with alias \"${alias}\"`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tconst reverseRelations = Object.values(reverseTableConfig.relations).filter((it): it is Relation =>\n\t\t\t\t\tis(it, Relation) && it.targetTable === sourceTable && !it.alias && it !== relation\n\t\t\t\t);\n\t\t\t\tif (reverseRelations.length > 1) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`${relationPrintName}: not enough data provided to build the relation - \"from\"/\"to\" are not defined, and multiple relations between \"${targetTableName}\" and \"${sourceTableName}\" were found.\\nHint: you can specify \"alias\" on both sides of the relation with the same value`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\treverseRelation = reverseRelations[0];\n\t\t\t\tif (!reverseRelation) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`${relationPrintName}: not enough data provided to build the relation - \"from\"/\"to\" are not defined, and no reverse relation of table \"${targetTableName}\" with target table \"${sourceTableName}\" was found`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (!reverseRelation.sourceColumns || !reverseRelation.targetColumns) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`${relationPrintName}: not enough data provided to build the relation - \"from\"/\"to\" are not defined, and reverse relation \"${targetTableName}.${reverseRelation.fieldName}\" does not have \"from\"/\"to\" defined`,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\trelation.sourceColumns = reverseRelation.targetColumns;\n\t\t\trelation.targetColumns = reverseRelation.sourceColumns;\n\t\t\trelation.through = reverseRelation.through\n\t\t\t\t? {\n\t\t\t\t\tsource: reverseRelation.through.target,\n\t\t\t\t\ttarget: reverseRelation.through.source,\n\t\t\t\t}\n\t\t\t\t: undefined;\n\t\t\trelation.throughTable = reverseRelation.throughTable;\n\t\t\trelation.isReversed = !where;\n\t\t\trelation.where = where ?? reverseRelation.where;\n\t\t}\n\t}\n\n\treturn tablesConfig;\n}\n\n/** Builds relational config for every table in schema */\nexport function buildRelations<TTables extends Schema, TConfig extends AnyRelationsBuilderConfig>(\n\ttables: TTables,\n\tconfig: TConfig,\n): ExtractTablesWithRelations<TConfig, TTables> {\n\tconst tablesConfig = {} as TablesRelationalConfig;\n\n\tfor (const [tsName, table] of Object.entries(tables)) {\n\t\ttablesConfig[tsName] = {\n\t\t\ttable,\n\t\t\tname: tsName,\n\t\t\trelations: config[tsName] ?? {},\n\t\t};\n\t}\n\n\treturn processRelations(tablesConfig, tables) as any;\n}\n\n/** Builds relational config only for tables present in relational config */\nexport function buildRelationsParts<TTables extends Schema, TConfig extends AnyRelationsBuilderConfig>(\n\ttables: TTables,\n\tconfig: TConfig,\n): ExtractTablesWithRelationsParts<TConfig, TTables> {\n\tconst tablesConfig = {} as TablesRelationalConfig;\n\n\tfor (const [tsName, relations] of Object.entries(config)) {\n\t\tif (!relations || !tables[tsName]) continue;\n\t\ttablesConfig[tsName] = {\n\t\t\ttable: tables[tsName],\n\t\t\tname: tsName,\n\t\t\trelations,\n\t\t};\n\t}\n\n\treturn processRelations(tablesConfig, tables) as any;\n}\n\nexport type RelationsRecord = Record<string, AnyRelation>;\nexport type EmptyRelations = {};\nexport type AnyRelations = TablesRelationalConfig;\n\nexport abstract class Relation<\n\tTTargetTableName extends string = string,\n> {\n\tstatic readonly [entityKind]: string = 'RelationV2';\n\tdeclare readonly $brand: 'RelationV2';\n\tdeclare public readonly relationType: 'many' | 'one';\n\n\tfieldName!: string;\n\tsourceColumns!: Column<any>[];\n\ttargetColumns!: Column<any>[];\n\talias: string | undefined;\n\twhere: AnyTableFilter | undefined;\n\tsourceTable!: SchemaEntry;\n\ttargetTable: SchemaEntry;\n\tthrough?: {\n\t\tsource: RelationsBuilderColumnBase[];\n\t\ttarget: RelationsBuilderColumnBase[];\n\t};\n\tthroughTable?: SchemaEntry;\n\tisReversed?: boolean;\n\n\t/** @internal */\n\tsourceColumnTableNames: string[] = [];\n\t/** @internal */\n\ttargetColumnTableNames: string[] = [];\n\n\tconstructor(\n\t\ttargetTable: SchemaEntry,\n\t\treadonly targetTableName: TTargetTableName,\n\t) {\n\t\tthis.targetTable = targetTable;\n\t}\n}\n\nexport type AnyRelation = Relation<string>;\n\nexport class One<\n\tTTargetTableName extends string,\n\tTOptional extends boolean = boolean,\n> extends Relation<TTargetTableName> {\n\tstatic override readonly [entityKind]: string = 'OneV2';\n\tdeclare protected $relationBrand: 'OneV2';\n\n\tpublic override readonly relationType = 'one' as const;\n\n\treadonly optional: TOptional;\n\n\tconstructor(\n\t\ttables: Schema,\n\t\ttargetTable: SchemaEntry,\n\t\ttargetTableName: TTargetTableName,\n\t\tconfig: AnyOneConfig | undefined,\n\t) {\n\t\tsuper(targetTable, targetTableName);\n\t\tthis.alias = config?.alias;\n\t\tthis.where = config?.where;\n\t\tif (config?.from) {\n\t\t\tthis.sourceColumns = ((Array.isArray(config.from)\n\t\t\t\t? config.from\n\t\t\t\t: [config.from]) as RelationsBuilderColumnBase[]).map((it: RelationsBuilderColumnBase) => {\n\t\t\t\t\tthis.throughTable ??= it._.through ? tables[it._.through._.tableName]! as SchemaEntry : undefined;\n\t\t\t\t\tthis.sourceColumnTableNames.push(it._.tableName);\n\t\t\t\t\treturn it._.column as Column;\n\t\t\t\t});\n\t\t}\n\t\tif (config?.to) {\n\t\t\tthis.targetColumns = (Array.isArray(config.to)\n\t\t\t\t? config.to\n\t\t\t\t: [config.to]).map((it: RelationsBuilderColumnBase) => {\n\t\t\t\t\tthis.throughTable ??= it._.through ? tables[it._.through._.tableName]! as SchemaEntry : undefined;\n\t\t\t\t\tthis.targetColumnTableNames.push(it._.tableName);\n\t\t\t\t\treturn it._.column as Column;\n\t\t\t\t});\n\t\t}\n\n\t\tif (this.throughTable) {\n\t\t\tthis.through = {\n\t\t\t\tsource: (Array.isArray(config?.from) ? config.from : config?.from ? [config.from] : []).map((\n\t\t\t\t\tc,\n\t\t\t\t) => c._.through!),\n\t\t\t\ttarget: (Array.isArray(config?.to) ? config.to : config?.to ? [config.to] : []).map((c) => c._.through!),\n\t\t\t};\n\t\t}\n\t\tthis.optional = (config?.optional ?? true) as TOptional;\n\t}\n}\n\nexport type AnyOne = One<string, boolean>;\n\nexport class Many<TTargetTableName extends string> extends Relation<TTargetTableName> {\n\tstatic override readonly [entityKind]: string = 'ManyV2';\n\tdeclare protected $relationBrand: 'ManyV2';\n\n\tpublic override readonly relationType = 'many' as const;\n\n\tconstructor(\n\t\ttables: Schema,\n\t\ttargetTable: SchemaEntry,\n\t\ttargetTableName: TTargetTableName,\n\t\treadonly config: AnyManyConfig | undefined,\n\t) {\n\t\tsuper(targetTable, targetTableName);\n\t\tthis.alias = config?.alias;\n\t\tthis.where = config?.where;\n\t\tif (config?.from) {\n\t\t\tthis.sourceColumns = ((Array.isArray(config.from)\n\t\t\t\t? config.from\n\t\t\t\t: [config.from]) as RelationsBuilderColumnBase[]).map((it: RelationsBuilderColumnBase) => {\n\t\t\t\t\tthis.throughTable ??= it._.through ? tables[it._.through._.tableName]! as SchemaEntry : undefined;\n\t\t\t\t\tthis.sourceColumnTableNames.push(it._.tableName);\n\t\t\t\t\treturn it._.column as Column;\n\t\t\t\t});\n\t\t}\n\t\tif (config?.to) {\n\t\t\tthis.targetColumns = (Array.isArray(config.to)\n\t\t\t\t? config.to\n\t\t\t\t: [config.to]).map((it: RelationsBuilderColumnBase) => {\n\t\t\t\t\tthis.throughTable ??= it._.through ? tables[it._.through._.tableName]! as SchemaEntry : undefined;\n\t\t\t\t\tthis.targetColumnTableNames.push(it._.tableName);\n\t\t\t\t\treturn it._.column as Column;\n\t\t\t\t});\n\t\t}\n\t\tif (this.throughTable) {\n\t\t\tthis.through = {\n\t\t\t\tsource: (Array.isArray(config?.from) ? config.from : config?.from ? [config.from] : []).map((\n\t\t\t\t\tc,\n\t\t\t\t) => c._.through!),\n\t\t\t\ttarget: (Array.isArray(config?.to) ? config.to : config?.to ? [config.to] : []).map((c) => c._.through!),\n\t\t\t};\n\t\t}\n\t}\n}\n\nexport type AnyMany = Many<string>;\n\nexport abstract class AggregatedField<T = unknown> implements SQLWrapper<T> {\n\tstatic readonly [entityKind]: string = 'AggregatedField';\n\n\tdeclare readonly $brand: 'AggregatedField';\n\n\tdeclare readonly _: {\n\t\treadonly data: T;\n\t};\n\n\tprotected table: SchemaEntry | undefined;\n\n\tonTable(table: SchemaEntry) {\n\t\tthis.table = table;\n\n\t\treturn this;\n\t}\n\n\tabstract getSQL(): SQL<T>;\n}\n\nexport class Count extends AggregatedField<number> {\n\tstatic override readonly [entityKind]: string = 'AggregatedFieldCount';\n\n\tdeclare protected $aggregatedFieldBrand: 'Count';\n\n\tprivate query: SQL<number> | undefined;\n\n\tgetSQL(): SQL<number> {\n\t\tif (!this.query) {\n\t\t\tif (!this.table) throw new Error('Table must be set before building aggregate field');\n\t\t\tthis.query = sql`select count(*) as ${sql.identifier('r')} from ${getTableAsAliasSQL(this.table)}`\n\t\t\t\t.mapWith(Number);\n\t\t}\n\n\t\treturn this.query;\n\t}\n}\n\nexport type ExtractObjectValues<T> = T[keyof T];\n\nexport const operators = {\n\tand,\n\tbetween,\n\teq,\n\texists,\n\tgt,\n\tgte,\n\tilike,\n\tinArray,\n\tarrayContains,\n\tarrayContained,\n\tarrayOverlaps,\n\tisNull,\n\tisNotNull,\n\tlike,\n\tlt,\n\tlte,\n\tne,\n\tnot,\n\tnotBetween,\n\tnotExists,\n\tnotLike,\n\tnotIlike,\n\tnotInArray,\n\tor,\n\tsql,\n};\n\nexport type Operators = typeof operators;\n\nexport const orderByOperators = {\n\tsql,\n\tasc,\n\tdesc,\n};\n\nexport type OrderByOperators = typeof orderByOperators;\n\nexport function getOrderByOperators(): OrderByOperators {\n\treturn orderByOperators;\n}\n\nexport type FindTargetTableInRelationalConfig<\n\tTConfig extends TablesRelationalConfig,\n\tTRelation extends AnyRelation,\n> = TConfig[TRelation['targetTableName']];\n\nexport interface SQLOperator {\n\tsql: Operators['sql'];\n}\n\nexport type DBQueryConfigColumns<TColumns extends FieldSelection> = {\n\t[K in keyof TColumns]?: boolean | undefined;\n};\n\nexport type DBQueryConfigExtras<TTable extends SchemaEntry> = Record<\n\tstring,\n\t| SQLWrapper\n\t| ((\n\t\ttable: TTable,\n\t\toperators: SQLOperator,\n\t) => SQLWrapper)\n>;\n\nexport type DBQueryConfigOrderByCallback<TTable extends SchemaEntry> = (\n\ttable: TTable,\n\toperators: OrderByOperators,\n) => ValueOrArray<AnyColumn | SQL>;\n\nexport type DBQueryConfigOrderByObject<TColumns extends FieldSelection> = {\n\t[K in keyof TColumns]?: 'asc' | 'desc' | undefined;\n};\n\nexport type DBQueryConfigOrderBy<TTable extends SchemaEntry, TColumns extends FieldSelection> =\n\t| DBQueryConfigOrderByCallback<TTable>\n\t| DBQueryConfigOrderByObject<TColumns>;\n\nexport type DBQueryConfigWith<TSchema extends TablesRelationalConfig, TRelations extends RelationsRecord> = {\n\t[K in keyof TRelations]?:\n\t\t| boolean\n\t\t| (DBQueryConfig<\n\t\t\tTRelations[K]['relationType'],\n\t\t\tTSchema,\n\t\t\tFindTargetTableInRelationalConfig<TSchema, TRelations[K]>\n\t\t>)\n\t\t| undefined;\n};\n\nexport type DBQueryConfig<\n\tTRelationType extends 'one' | 'many' = 'one' | 'many',\n\tTSchema extends TablesRelationalConfig = TablesRelationalConfig,\n\tTTableConfig extends TableRelationalConfig = TableRelationalConfig,\n> =\n\t& (TTableConfig['relations'] extends Record<string, never> ? {}\n\t\t: {\n\t\t\twith?:\n\t\t\t\t| DBQueryConfigWith<TSchema, TTableConfig['relations']>\n\t\t\t\t| undefined;\n\t\t})\n\t& {\n\t\tcolumns?: DBQueryConfigColumns<GetTableViewFieldSelection<TTableConfig['table']>> | undefined;\n\t\twhere?: RelationsFilter<TTableConfig, TSchema> | undefined;\n\t\textras?:\n\t\t\t| DBQueryConfigExtras<TTableConfig['table']>\n\t\t\t| undefined;\n\t\torderBy?:\n\t\t\t| DBQueryConfigOrderBy<TTableConfig['table'], GetTableViewFieldSelection<TTableConfig['table']>>\n\t\t\t| undefined;\n\t\toffset?: number | Placeholder | undefined;\n\t}\n\t& (TRelationType extends 'many' ? {\n\t\t\tlimit?: number | Placeholder | undefined;\n\t\t}\n\t\t: {});\n\nexport type AnyDBQueryConfig = {\n\tcolumns?:\n\t\t| DBQueryConfigColumns<GetTableViewFieldSelection<TableRelationalConfig['table']>>\n\t\t| undefined;\n\twhere?: RelationsFilter<TableRelationalConfig, TablesRelationalConfig> | undefined;\n\textras?:\n\t\t| DBQueryConfigExtras<TableRelationalConfig['table']>\n\t\t| undefined;\n\twith?:\n\t\t| Record<string, AnyDBQueryConfig>\n\t\t| undefined;\n\torderBy?:\n\t\t| DBQueryConfigOrderBy<TableRelationalConfig['table'], GetTableViewFieldSelection<TableRelationalConfig['table']>>\n\t\t| undefined;\n\toffset?: number | Placeholder | undefined;\n\tlimit?: number | Placeholder | undefined;\n};\n\nexport interface TableRelationalConfig {\n\ttable: SchemaEntry;\n\tname: string;\n\trelations: RelationsRecord;\n}\n\nexport type TablesRelationalConfig = Record<string, TableRelationalConfig>;\n\nexport type ExtractTablesWithRelations<\n\tTConfig extends AnyRelationsBuilderConfig,\n\tTTables extends Schema,\n> = {\n\t[K in keyof TTables]: {\n\t\ttable: TTables[K];\n\t\tname: K & string;\n\t\trelations: TConfig extends { [CK in K]: Record<string, any> } ? TConfig[K] : {};\n\t};\n};\n\nexport type ExtractTablesWithRelationsParts<\n\tTConfig extends AnyRelationsBuilderConfig,\n\tTTables extends Schema,\n> = {\n\t[K in NonUndefinedKeysOnly<TConfig> & keyof TTables]: {\n\t\ttable: TTables[K & string];\n\t\tname: K & string;\n\t\trelations: TConfig[K] extends Record<string, any> ? TConfig[K] : {};\n\t};\n};\n\nexport type ReturnTypeOrValue<T> = T extends (...args: any[]) => infer R ? R\n\t: T;\n\nexport type RelationResultKind<TResult, TInclude, TRelation extends AnyRelation> = TRelation extends AnyOne ? (\n\t\t| TResult\n\t\t| (Equal<TRelation['optional'], true> extends true ? null\n\t\t\t: TInclude extends Record<string, unknown> ? TInclude['where'] extends Record<string, any> ? null\n\t\t\t\t: never\n\t\t\t: never)\n\t)\n\t: TResult[];\n\nexport type BuildRelationResult<\n\tTConfig extends TablesRelationalConfig,\n\tTInclude,\n\tTRelations extends RelationsRecord,\n> = {\n\t[\n\t\tK in\n\t\t\t& TruthyKeysOnly<TInclude>\n\t\t\t& keyof TRelations\n\t]: TRelations[K] extends infer TRel extends AnyRelation ? RelationResultKind<\n\t\t\tBuildQueryResult<\n\t\t\t\tTConfig,\n\t\t\t\tFindTargetTableInRelationalConfig<TConfig, TRel>,\n\t\t\t\tAssume<TInclude[K], true | Record<string, unknown>>\n\t\t\t>,\n\t\t\tTInclude[K],\n\t\t\tTRel\n\t\t>\n\t\t: TRelations[K] extends AggregatedField<infer TData> ? TData\n\t\t: never;\n};\n\nexport type NonUndefinedKeysOnly<T> = {\n\t[K in keyof T]: T[K] extends undefined ? never : K;\n}[keyof T];\n\nexport type TruthyKeysOnly<T> = {\n\t[K in keyof T]: T[K] extends undefined | false ? never : K;\n}[keyof T];\n\nexport type InferRelationalQueryTableResult<\n\tTRawSelection extends Record<string, unknown>,\n\tTSelectedFields extends Record<string, unknown> | 'Full' = 'Full',\n> = TSelectedFields extends 'Full' ? TRawSelection : {\n\t[\n\t\tK in Equal<\n\t\t\tExclude<\n\t\t\t\tTSelectedFields[\n\t\t\t\t\t& keyof TSelectedFields\n\t\t\t\t\t& keyof TRawSelection\n\t\t\t\t],\n\t\t\t\tundefined\n\t\t\t>,\n\t\t\tfalse\n\t\t> extends true ? Exclude<\n\t\t\t\tkeyof TRawSelection,\n\t\t\t\tNonUndefinedKeysOnly<TSelectedFields>\n\t\t\t>\n\t\t\t:\n\t\t\t\t& {\n\t\t\t\t\t[K in keyof TSelectedFields]: Equal<\n\t\t\t\t\t\tTSelectedFields[K],\n\t\t\t\t\t\ttrue\n\t\t\t\t\t> extends true ? K\n\t\t\t\t\t\t: never;\n\t\t\t\t}[keyof TSelectedFields]\n\t\t\t\t& keyof TRawSelection\n\t]: TRawSelection[K];\n};\n\nexport type BuildQueryResult<\n\tTSchema extends TablesRelationalConfig,\n\tTTableConfig extends TableRelationalConfig,\n\tTFullSelection extends true | Record<string, unknown>,\n\tTModel extends Record<string, unknown> = Assume<\n\t\tTTableConfig['table'],\n\t\t{ $inferSelect: Record<string, unknown> }\n\t>['$inferSelect'],\n> = Equal<TFullSelection, true> extends true ? Simplify<InferRelationalQueryTableResult<TModel>>\n\t: TFullSelection extends Record<string, unknown> ? Simplify<\n\t\t\t& (InferRelationalQueryTableResult<\n\t\t\t\tTModel,\n\t\t\t\tTFullSelection['columns'] extends Record<string, unknown> ? TFullSelection['columns'] : 'Full'\n\t\t\t>)\n\t\t\t& (TFullSelection['extras'] extends Record<string, SQLWrapper | ((...args: any[]) => SQLWrapper)> ? {\n\t\t\t\t\t[\n\t\t\t\t\t\tK in NonUndefinedKeysOnly<\n\t\t\t\t\t\t\tReturnTypeOrValue<TFullSelection['extras']>\n\t\t\t\t\t\t>\n\t\t\t\t\t]: ReturnType<\n\t\t\t\t\t\tAssume<\n\t\t\t\t\t\t\tReturnTypeOrValue<TFullSelection['extras'][K & string]>,\n\t\t\t\t\t\t\tSQLWrapper\n\t\t\t\t\t\t>['getSQL']\n\t\t\t\t\t>['_']['type'];\n\t\t\t\t}\n\t\t\t\t: {})\n\t\t\t& (TFullSelection['with'] extends Record<string, unknown> ? BuildRelationResult<\n\t\t\t\t\tTSchema,\n\t\t\t\t\tTFullSelection['with'],\n\t\t\t\t\tTTableConfig['relations']\n\t\t\t\t>\n\t\t\t\t: {})\n\t\t>\n\t: never;\n\nexport interface BuildRelationalQueryResult {\n\tselection: {\n\t\tkey: string;\n\t\tfield: Column<any> | Table | SQL | SQL.Aliased | SQLWrapper | AggregatedField;\n\t\tisArray?: boolean;\n\t\tselection?: BuildRelationalQueryResult['selection'];\n\t\tisOptional?: boolean;\n\t}[];\n\tsql: SQL;\n}\n\nexport function mapRelationalRow(\n\trow: Record<string, unknown>,\n\tbuildQueryResultSelection: BuildRelationalQueryResult['selection'],\n\tmapColumnValue: (value: unknown) => unknown = (value) => value,\n\t/** Needed for SQLite as it returns JSON values as strings */\n\tparseJson: boolean = false,\n\t/** Needed for SingleStore as it returns JSON arrays as strings */\n\tparseJsonIfString: boolean = false,\n\tpath?: string,\n): Record<string, unknown> {\n\tfor (\n\t\tconst selectionItem of buildQueryResultSelection\n\t) {\n\t\tif (selectionItem.selection) {\n\t\t\tconst currentPath = `${path ? `${path}.` : ''}${selectionItem.key}`;\n\n\t\t\tif (row[selectionItem.key] === null) continue;\n\n\t\t\tif (parseJson) {\n\t\t\t\trow[selectionItem.key] = JSON.parse(row[selectionItem.key] as string);\n\t\t\t\tif (row[selectionItem.key] === null) continue;\n\t\t\t}\n\t\t\tif (parseJsonIfString && typeof row[selectionItem.key] === 'string') {\n\t\t\t\trow[selectionItem.key] = JSON.parse(row[selectionItem.key] as string);\n\t\t\t}\n\n\t\t\tif (selectionItem.isArray) {\n\t\t\t\tfor (const item of (row[selectionItem.key] as Array<Record<string, unknown>>)) {\n\t\t\t\t\tmapRelationalRow(\n\t\t\t\t\t\titem,\n\t\t\t\t\t\tselectionItem.selection!,\n\t\t\t\t\t\tmapColumnValue,\n\t\t\t\t\t\tfalse,\n\t\t\t\t\t\tparseJsonIfString,\n\t\t\t\t\t\tcurrentPath,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tmapRelationalRow(\n\t\t\t\trow[selectionItem.key] as Record<string, unknown>,\n\t\t\t\tselectionItem.selection!,\n\t\t\t\tmapColumnValue,\n\t\t\t\tfalse,\n\t\t\t\tparseJsonIfString,\n\t\t\t\tcurrentPath,\n\t\t\t);\n\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst field = selectionItem.field!;\n\t\tconst value = mapColumnValue(row[selectionItem.key]);\n\t\tif (value === null) continue;\n\n\t\tlet decoder;\n\t\tif (is(field, Column)) {\n\t\t\tdecoder = field;\n\t\t} else if (is(field, SQL)) {\n\t\t\tdecoder = field.decoder;\n\t\t} else if (is(field, SQL.Aliased)) {\n\t\t\tdecoder = field.sql.decoder;\n\t\t} else {\n\t\t\tdecoder = field.getSQL().decoder;\n\t\t}\n\n\t\trow[selectionItem.key] = 'mapFromJsonValue' in decoder\n\t\t\t? (<(value: unknown) => unknown> decoder.mapFromJsonValue)(value)\n\t\t\t: decoder.mapFromDriverValue(value);\n\t}\n\n\treturn row;\n}\n\nexport class RelationsBuilderTable<TTableName extends string = string> {\n\tstatic readonly [entityKind]: string = 'RelationsBuilderTable';\n\n\tprotected readonly _: {\n\t\treadonly name: TTableName;\n\t\treadonly table: SchemaEntry;\n\t};\n\n\tconstructor(table: SchemaEntry, name: TTableName) {\n\t\tthis._ = {\n\t\t\tname,\n\t\t\ttable,\n\t\t};\n\t}\n}\n\nexport interface RelationsBuilderColumnConfig<\n\tTTableName extends string = string,\n> {\n\treadonly tableName: TTableName;\n\treadonly column: FieldValue;\n\treadonly through?: RelationsBuilderColumnBase;\n\treadonly key: string;\n}\n\nexport interface RelationsBuilderColumnBase<\n\tTTableName extends string = string,\n> {\n\t_: RelationsBuilderColumnConfig<TTableName>;\n}\n\nexport class RelationsBuilderColumn<\n\tTTableName extends string = string,\n> implements RelationsBuilderColumnBase<TTableName> {\n\tstatic readonly [entityKind]: string = 'RelationsBuilderColumn';\n\n\treadonly _: {\n\t\treadonly tableName: TTableName;\n\t\treadonly column: FieldValue;\n\t\treadonly key: string;\n\t};\n\n\tconstructor(\n\t\tcolumn: FieldValue,\n\t\ttableName: TTableName,\n\t\tkey: string,\n\t) {\n\t\tthis._ = {\n\t\t\ttableName: tableName,\n\t\t\tcolumn,\n\t\t\tkey,\n\t\t};\n\t}\n\n\tthrough(column: RelationsBuilderColumn): RelationsBuilderJunctionColumn<TTableName> {\n\t\treturn new RelationsBuilderJunctionColumn(\n\t\t\tthis._.column,\n\t\t\tthis._.tableName,\n\t\t\tthis._.key,\n\t\t\tcolumn,\n\t\t);\n\t}\n}\n\nexport class RelationsBuilderJunctionColumn<\n\tTTableName extends string = string,\n> implements RelationsBuilderColumnBase<TTableName> {\n\tstatic readonly [entityKind]: string = 'RelationsBuilderColumn';\n\n\treadonly _: {\n\t\treadonly tableName: TTableName;\n\t\treadonly column: FieldValue;\n\t\treadonly through: RelationsBuilderColumnBase;\n\t\treadonly key: string;\n\t};\n\n\tconstructor(\n\t\tcolumn: FieldValue,\n\t\ttableName: TTableName,\n\t\tkey: string,\n\t\tthrough: RelationsBuilderColumnBase,\n\t) {\n\t\tthis._ = {\n\t\t\ttableName: tableName,\n\t\t\tcolumn,\n\t\t\tthrough,\n\t\t\tkey,\n\t\t};\n\t}\n}\n\nexport interface RelationFieldsFilterInternals<T> {\n\teq?: T | Placeholder | undefined;\n\tne?: T | Placeholder | undefined;\n\tgt?: T | Placeholder | undefined;\n\tgte?: T | Placeholder | undefined;\n\tlt?: T | Placeholder | undefined;\n\tlte?: T | Placeholder | undefined;\n\tin?: (T | Placeholder)[] | Placeholder | undefined;\n\tnotIn?: (T | Placeholder)[] | Placeholder | undefined;\n\tarrayContains?: (T extends Array<infer E> ? (E | Placeholder)[] : (T | Placeholder)[]) | Placeholder | undefined;\n\tarrayContained?: (T extends Array<infer E> ? (E | Placeholder)[] : (T | Placeholder)[]) | Placeholder | undefined;\n\tarrayOverlaps?: (T extends Array<infer E> ? (E | Placeholder)[] : (T | Placeholder)[]) | Placeholder | undefined;\n\tlike?: string | Placeholder | undefined;\n\tilike?: string | Placeholder | undefined;\n\tnotLike?: string | Placeholder | undefined;\n\tnotIlike?: string | Placeholder | undefined;\n\tisNull?: true | undefined;\n\tisNotNull?: true | undefined;\n\tNOT?: RelationsFieldFilter<T> | undefined;\n\tOR?: RelationsFieldFilter<T>[] | undefined;\n\tAND?: RelationsFieldFilter<T>[] | undefined;\n}\n\nexport type RelationsFieldFilter<T = unknown> =\n\t| RelationFieldsFilterInternals<T>\n\t| (\n\t\tunknown extends T ? never : T extends object ? never : T\n\t)\n\t// Bleeds into filters - discuss removal\n\t| Placeholder;\n\nexport interface RelationsFilterCommons<\n\tTTable extends TableRelationalConfig = TableRelationalConfig,\n\tTSchema extends TablesRelationalConfig = TablesRelationalConfig,\n> {\n\tOR?: RelationsFilter<TTable, TSchema>[] | undefined;\n\tNOT?: RelationsFilter<TTable, TSchema> | undefined;\n\tAND?: RelationsFilter<TTable, TSchema>[] | undefined;\n\tRAW?:\n\t\t| SQLWrapper\n\t\t| ((\n\t\t\ttable: TTable['table'],\n\t\t\toperators: Operators,\n\t\t) => SQL)\n\t\t| undefined;\n}\n\nexport type RelationsFilterColumns<\n\tTColumns extends Record<string, unknown>,\n> = {\n\t[K in keyof TColumns]?:\n\t\t| (TColumns[K] extends { _: { data: infer Data } } ? RelationsFieldFilter<Data>\n\t\t\t: RelationsFieldFilter<unknown>)\n\t\t| undefined;\n};\n\nexport type RelationsFilterRelations<\n\tTTable extends TableRelationalConfig,\n\tTSchema extends TablesRelationalConfig,\n\tTRelations extends RelationsRecord = TTable['relations'],\n> = {\n\t[K in keyof TRelations]?:\n\t\t| boolean\n\t\t| RelationsFilter<FindTargetTableInRelationalConfig<TSchema, TRelations[K]>, TSchema>\n\t\t| undefined;\n};\n\nexport type RelationsFilter<\n\tTTable extends TableRelationalConfig,\n\tTSchema extends TablesRelationalConfig,\n\tTColumns extends FieldSelection = GetTableViewFieldSelection<TTable['table']>,\n> = TTable['relations'] extends Record<string, never> ? TableFilter<TTable['table']>\n\t:\n\t\t& RelationsFilterColumns<TColumns>\n\t\t& RelationsFilterRelations<TTable, TSchema>\n\t\t& RelationsFilterCommons<TTable, TSchema>;\n\nexport interface TableFilterCommons<\n\tTTable extends SchemaEntry = SchemaEntry,\n\tTColumns extends Record<string, unknown> = GetTableViewColumns<TTable>,\n> {\n\tOR?: TableFilter<TTable, TColumns>[] | undefined;\n\tNOT?: TableFilter<TTable, TColumns> | undefined;\n\tAND?: TableFilter<TTable, TColumns>[] | undefined;\n\tRAW?:\n\t\t| SQLWrapper\n\t\t| ((\n\t\t\ttable: TTable,\n\t\t\toperators: Operators,\n\t\t) => SQL)\n\t\t| undefined;\n}\n\nexport type TableFilterColumns<\n\tTColumns extends Record<string, unknown>,\n> = {\n\t[K in keyof TColumns]?:\n\t\t| (TColumns[K] extends { _: { data: infer Data } } ? RelationsFieldFilter<Data>\n\t\t\t: RelationsFieldFilter<unknown>)\n\t\t| undefined;\n};\n\nexport type TableFilter<\n\tTTable extends SchemaEntry = SchemaEntry,\n\tTColumns extends Record<string, unknown> = GetTableViewColumns<TTable>,\n> =\n\t& TableFilterColumns<TColumns>\n\t& TableFilterCommons<TTable, TColumns>;\n\nexport type AnyRelationsFilter = RelationsFilter<\n\tTableRelationalConfig,\n\tTablesRelationalConfig,\n\tFieldSelection\n>;\n\nexport type AnyTableFilter = TableFilter<\n\tSchemaEntry,\n\tFieldSelection\n>;\n\nexport interface OneConfig<TTargetTable extends SchemaEntry, TOptional extends boolean> {\n\tfrom?: RelationsBuilderColumnBase | [RelationsBuilderColumnBase, ...RelationsBuilderColumnBase[]];\n\tto?: RelationsBuilderColumnBase | [RelationsBuilderColumnBase, ...RelationsBuilderColumnBase[]];\n\twhere?: TableFilter<TTargetTable>;\n\toptional?: TOptional;\n\talias?: string;\n}\n\nexport type AnyOneConfig = OneConfig<\n\tSchemaEntry,\n\tboolean\n>;\n\nexport interface ManyConfig<TTargetTable extends SchemaEntry> {\n\tfrom?: RelationsBuilderColumnBase | [RelationsBuilderColumnBase, ...RelationsBuilderColumnBase[]];\n\tto?: RelationsBuilderColumnBase | [RelationsBuilderColumnBase, ...RelationsBuilderColumnBase[]];\n\twhere?: TableFilter<TTargetTable>;\n\talias?: string;\n}\n\nexport type AnyManyConfig = ManyConfig<SchemaEntry>;\n\nexport interface OneFn<TTargetTable extends SchemaEntry, TTargetTableName extends string> {\n\t<TOptional extends boolean = true>(config?: OneConfig<TTargetTable, TOptional>): One<TTargetTableName, TOptional>;\n}\n\nexport interface ManyFn<TTargetTable extends SchemaEntry, TTargetTableName extends string> {\n\t(config?: ManyConfig<TTargetTable>): Many<TTargetTableName>;\n}\n\nexport class RelationsHelperStatic<TTables extends Schema> {\n\tstatic readonly [entityKind]: string = 'RelationsHelperStatic';\n\t// declare readonly $brand: 'RelationsHelperStatic';\n\n\tprivate readonly _: {\n\t\treadonly tables: TTables;\n\t};\n\n\tconstructor(tables: TTables) {\n\t\tthis._ = {\n\t\t\ttables,\n\t\t};\n\n\t\tconst one: Record<string, OneFn<TTables[string], string>> = {};\n\t\tconst many: Record<string, ManyFn<TTables[string], string>> = {};\n\n\t\tfor (const [tableName, table] of Object.entries(tables)) {\n\t\t\tone[tableName] = (config) => {\n\t\t\t\treturn new One(tables, table, tableName, config as unknown as AnyOneConfig);\n\t\t\t};\n\n\t\t\tmany[tableName] = (config) => {\n\t\t\t\treturn new Many(tables, table, tableName, config as AnyManyConfig);\n\t\t\t};\n\t\t}\n\n\t\tthis.one = one as any as this['one'];\n\t\tthis.many = many as any as this['many'];\n\t}\n\n\tone: {\n\t\t[K in keyof TTables]: TTables[K] extends FilteredSchemaEntry ? OneFn<TTables[K], K & string>\n\t\t\t: DrizzleTypeError<'Views with nested selections are not supported by the relational query builder'>;\n\t};\n\n\tmany: {\n\t\t[K in keyof TTables]: TTables[K] extends FilteredSchemaEntry ? ManyFn<TTables[K], K & string>\n\t\t\t: DrizzleTypeError<'Views with nested selections are not supported by the relational query builder'>;\n\t};\n\n\t/** @internal - to be reworked */\n\taggs = {\n\t\tcount(): Count {\n\t\t\treturn new Count();\n\t\t},\n\t};\n}\n\nexport type RelationsBuilderColumns<TTable extends SchemaEntry, TTableName extends string> = {\n\t[\n\t\tTColumnName in keyof GetTableViewColumns<TTable>\n\t]: RelationsBuilderColumn<\n\t\tTTableName\n\t>;\n};\n\nexport type RelationsBuilderTables<TSchema extends Schema> = {\n\t[TTableName in keyof TSchema]: TSchema[TTableName] extends FilteredSchemaEntry ? (\n\t\t\t& RelationsBuilderColumns<TSchema[TTableName], TTableName & string>\n\t\t\t& RelationsBuilderTable<TTableName & string>\n\t\t)\n\t\t: DrizzleTypeError<'Views with nested selections are not supported by the relational query builder'>;\n};\n\nexport type RelationsBuilder<TSchema extends Schema> =\n\t& RelationsBuilderTables<TSchema>\n\t& RelationsHelperStatic<TSchema>;\n\nexport type RelationsBuilderConfigValue =\n\t| RelationsRecord\n\t| undefined;\n\nexport type RelationsBuilderConfig<TTables extends Schema> = {\n\t[TTableName in keyof TTables]?: RelationsBuilderConfigValue;\n};\n\nexport type AnyRelationsBuilderConfig = Record<string, RelationsBuilderConfigValue>;\n\nexport type ExtractTablesFromSchema<TSchema extends Record<string, unknown>> = Assume<\n\t{\n\t\t[K in keyof TSchema as TSchema[K] extends SchemaEntry ? K extends string ? K : never : never]: TSchema[K];\n\t},\n\tSchema\n>;\n\nexport function createRelationsHelper<\n\tTTables extends Schema,\n>(tables: TTables): RelationsBuilder<TTables> {\n\tconst helperStatic = new RelationsHelperStatic(tables);\n\tconst relationsTables = Object.entries(tables).reduce<Record<string, RelationsBuilderTable>>((acc, [tKey, value]) => {\n\t\tconst rTable = new RelationsBuilderTable(value, tKey);\n\t\tconst columns = Object.entries(value[TableColumns]).reduce<\n\t\t\tRecord<string, RelationsBuilderColumnBase>\n\t\t>(\n\t\t\t(acc, [cKey, column]) => {\n\t\t\t\tconst rbColumn = new RelationsBuilderColumn(column as FieldValue, tKey, cKey);\n\t\t\t\tacc[cKey] = rbColumn;\n\t\t\t\treturn acc;\n\t\t\t},\n\t\t\t{},\n\t\t);\n\n\t\tacc[tKey] = Object.assign(rTable, columns);\n\n\t\treturn acc;\n\t}, {});\n\n\treturn Object.assign(helperStatic, relationsTables) as any;\n}\n\nexport function extractTablesFromSchema<TSchema extends Record<string, unknown>>(\n\tschema: TSchema,\n): ExtractTablesFromSchema<TSchema> {\n\treturn Object.fromEntries(\n\t\tObject.entries(schema).filter(([_, e]) => is(e, Table) || is(e, View)),\n\t) as ExtractTablesFromSchema<TSchema>;\n}\n\nexport type IncludeEveryTable<TTables extends Schema> = { [K in keyof TTables]: {} };\n\n/** Builds relational config for every table in schema */\nexport function defineRelations<\n\tTSchema extends Record<string, unknown>,\n\tTTables extends Schema = ExtractTablesFromSchema<TSchema>,\n>(\n\tschema: TSchema,\n): ExtractTablesWithRelations<{}, TTables>;\n/** Builds relational config for every table in schema */\nexport function defineRelations<\n\tTSchema extends Record<string, unknown>,\n\tTConfig extends RelationsBuilderConfig<TTables>,\n\tTTables extends Schema = ExtractTablesFromSchema<TSchema>,\n>(\n\tschema: TSchema,\n\trelations: (helpers: RelationsBuilder<TTables>) => TConfig,\n): ExtractTablesWithRelations<TConfig, TTables>;\nexport function defineRelations(\n\tschema: Record<string, unknown>,\n\trelations?: (helpers: RelationsBuilder<Schema>) => AnyRelationsBuilderConfig,\n): TablesRelationalConfig {\n\tconst tables = extractTablesFromSchema(schema);\n\tconst config = relations\n\t\t? relations(\n\t\t\tcreateRelationsHelper(tables) as RelationsBuilder<Schema>,\n\t\t)\n\t\t: {};\n\n\treturn buildRelations(tables, config);\n}\n\n/** Builds relational config for every table in schema */\nexport function defineRelationsPart<\n\tTSchema extends Record<string, unknown>,\n\tTTables extends Schema = ExtractTablesFromSchema<TSchema>,\n>(\n\tschema: TSchema,\n): ExtractTablesWithRelationsParts<IncludeEveryTable<TTables>, TTables>;\n/** Builds relational config only for tables present in relational config */\nexport function defineRelationsPart<\n\tTSchema extends Record<string, unknown>,\n\tTConfig extends RelationsBuilderConfig<TTables>,\n\tTTables extends Schema = ExtractTablesFromSchema<TSchema>,\n>(\n\tschema: TSchema,\n\trelations: (helpers: RelationsBuilder<TTables>) => TConfig,\n): ExtractTablesWithRelationsParts<TConfig, TTables>;\nexport function defineRelationsPart(\n\tschema: Record<string, unknown>,\n\trelations?: (helpers: RelationsBuilder<Schema>) => AnyRelationsBuilderConfig,\n): TablesRelationalConfig {\n\tconst tables = extractTablesFromSchema(schema);\n\tconst config = relations\n\t\t? relations(\n\t\t\tcreateRelationsHelper(tables) as RelationsBuilder<Schema>,\n\t\t)\n\t\t: Object.fromEntries(Object.keys(tables).map((k) => [k, {}])) as AnyRelationsBuilderConfig;\n\n\treturn buildRelationsParts(tables, config);\n}\n\nexport interface WithContainer {\n\twith?: Record<string, boolean | AnyDBQueryConfig | undefined>;\n}\n\nexport interface ColumnWithTSName {\n\tcolumn: Column<any> | SQL | SQLWrapper | SQL.Aliased;\n\ttsName: string;\n}\n\nexport type RelationsOrder<TColumns extends FieldSelection> = {\n\t[K in keyof TColumns]?: 'asc' | 'desc';\n};\n\nexport type OrderBy = Exclude<AnyDBQueryConfig['orderBy'], undefined>;\n\nexport type Extras = Exclude<AnyDBQueryConfig['extras'], undefined>;\n\n/** @internal */\nexport function fieldSelectionToSQL(table: SchemaEntry, target: string) {\n\tconst field = table[TableColumns][target];\n\n\treturn field\n\t\t? is(field, Column)\n\t\t\t? field\n\t\t\t: is(field, SQL.Aliased)\n\t\t\t? sql`${table}.${sql.identifier(field.fieldAlias)}`\n\t\t\t: sql`${table}.${sql.identifier(target)}`\n\t\t: sql`${table}.${sql.identifier(target)}`;\n}\n\nfunction relationsFieldFilterToSQL(column: SQLWrapper, filter: RelationsFieldFilter<unknown>): SQL | undefined {\n\tif (typeof filter !== 'object' || is(filter, Placeholder)) return eq(column, filter);\n\n\tconst entries = Object.entries(filter as RelationFieldsFilterInternals<unknown>);\n\tif (!entries.length) return undefined;\n\n\tconst parts: (SQL)[] = [];\n\tfor (const [target, value] of entries) {\n\t\tif (value === undefined) continue;\n\n\t\tswitch (target as keyof RelationFieldsFilterInternals<unknown>) {\n\t\t\tcase 'NOT': {\n\t\t\t\tconst res = relationsFieldFilterToSQL(column, value as RelationsFieldFilter<unknown>);\n\t\t\t\tif (!res) continue;\n\n\t\t\t\tparts.push(not(res));\n\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tcase 'OR': {\n\t\t\t\tif (!(value as RelationsFieldFilter<unknown>[]).length) continue;\n\n\t\t\t\tparts.push(\n\t\t\t\t\tor(\n\t\t\t\t\t\t...(value as AnyRelationsFilter[]).map((subFilter) => relationsFieldFilterToSQL(column, subFilter)),\n\t\t\t\t\t)!,\n\t\t\t\t);\n\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tcase 'AND': {\n\t\t\t\tif (!(value as RelationsFieldFilter<unknown>[]).length) continue;\n\n\t\t\t\tparts.push(\n\t\t\t\t\tand(\n\t\t\t\t\t\t...(value as AnyRelationsFilter[]).map((subFilter) => relationsFieldFilterToSQL(column, subFilter)),\n\t\t\t\t\t)!,\n\t\t\t\t);\n\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tcase 'isNotNull':\n\t\t\tcase 'isNull': {\n\t\t\t\tif (!value) continue;\n\n\t\t\t\tparts.push(operators[target as 'isNull' | 'isNotNull'](column));\n\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tcase 'in': {\n\t\t\t\tparts.push(operators.inArray(column, value as any[] | Placeholder));\n\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tcase 'notIn': {\n\t\t\t\tparts.push(operators.notInArray(column, value as any[] | Placeholder));\n\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tdefault: {\n\t\t\t\tparts.push(\n\t\t\t\t\t(operators[target as keyof typeof operators] as ((col: SQLWrapper, data: any) => SQL | undefined))(\n\t\t\t\t\t\tcolumn,\n\t\t\t\t\t\tvalue,\n\t\t\t\t\t)!,\n\t\t\t\t);\n\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t}\n\t}\n\n\tif (!parts.length) return undefined;\n\n\treturn and(...parts);\n}\n\nexport function relationsFilterToSQL(\n\ttable: SchemaEntry,\n\tfilter: AnyRelationsFilter | AnyTableFilter,\n): SQL | undefined;\nexport function relationsFilterToSQL(\n\ttable: SchemaEntry,\n\tfilter: AnyRelationsFilter | AnyTableFilter,\n\ttableRelations: RelationsRecord,\n\ttablesRelations: TablesRelationalConfig,\n\tcasing: CasingCache,\n\tdepth?: number,\n): SQL | undefined;\nexport function relationsFilterToSQL(\n\ttable: SchemaEntry,\n\tfilter: AnyRelationsFilter | AnyTableFilter,\n\ttableRelations: RelationsRecord = {},\n\ttablesRelations: TablesRelationalConfig = {},\n\tcasing?: CasingCache,\n\tdepth: number = 0,\n): SQL | undefined {\n\tconst entries = Object.entries(filter);\n\tif (!entries.length) return undefined;\n\n\tconst parts: SQL[] = [];\n\tfor (const [target, value] of entries) {\n\t\tif (value === undefined) continue;\n\n\t\tswitch (target) {\n\t\t\tcase 'RAW': {\n\t\t\t\tconst processed = typeof value === 'function'\n\t\t\t\t\t? (value as unknown as (table: FieldSelection, operators: Operators) => SQL)(table as any, operators)\n\t\t\t\t\t: (value as SQLWrapper).getSQL();\n\n\t\t\t\tparts.push(processed);\n\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tcase 'OR': {\n\t\t\t\tif (!(value as AnyRelationsFilter[] | undefined)?.length) continue;\n\n\t\t\t\tparts.push(\n\t\t\t\t\tor(\n\t\t\t\t\t\t...(value as AnyRelationsFilter[]).map((subFilter) =>\n\t\t\t\t\t\t\trelationsFilterToSQL(table, subFilter, tableRelations, tablesRelations, casing!, depth)\n\t\t\t\t\t\t),\n\t\t\t\t\t)!,\n\t\t\t\t);\n\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tcase 'AND': {\n\t\t\t\tif (!(value as AnyRelationsFilter[] | undefined)?.length) continue;\n\n\t\t\t\tparts.push(\n\t\t\t\t\tand(\n\t\t\t\t\t\t...(value as AnyRelationsFilter[]).map((subFilter) =>\n\t\t\t\t\t\t\trelationsFilterToSQL(table, subFilter, tableRelations, tablesRelations, casing!, depth)\n\t\t\t\t\t\t),\n\t\t\t\t\t)!,\n\t\t\t\t);\n\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tcase 'NOT': {\n\t\t\t\tif (value === undefined) continue;\n\n\t\t\t\tconst built = relationsFilterToSQL(\n\t\t\t\t\ttable,\n\t\t\t\t\tvalue as AnyRelationsFilter,\n\t\t\t\t\ttableRelations,\n\t\t\t\t\ttablesRelations,\n\t\t\t\t\tcasing!,\n\t\t\t\t\tdepth,\n\t\t\t\t);\n\t\t\t\tif (!built) continue;\n\n\t\t\t\tparts.push(not(built));\n\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tdefault: {\n\t\t\t\tif (table[TableColumns][target]) {\n\t\t\t\t\tconst column = fieldSelectionToSQL(table, target);\n\n\t\t\t\t\tconst colFilter = relationsFieldFilterToSQL(\n\t\t\t\t\t\tcolumn,\n\t\t\t\t\t\tvalue as RelationsFieldFilter,\n\t\t\t\t\t);\n\t\t\t\t\tif (colFilter) parts.push(colFilter);\n\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tconst relation = tableRelations[target];\n\t\t\t\tif (!relation) {\n\t\t\t\t\t// Should never trigger unless the types've been violated\n\t\t\t\t\tthrow new DrizzleError({\n\t\t\t\t\t\tmessage: `Unknown relational filter field: \"${target}\"`,\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tconst targetTable = aliasedTable(relation.targetTable, `f${depth}`);\n\t\t\t\tconst throughTable = relation.throughTable ? aliasedTable(relation.throughTable, `ft${depth}`) : undefined;\n\t\t\t\tconst targetConfig = tablesRelations[relation.targetTableName]!;\n\n\t\t\t\tconst {\n\t\t\t\t\tfilter: relationFilter,\n\t\t\t\t\tjoinCondition,\n\t\t\t\t} = relationToSQL(casing!, relation, table, targetTable, throughTable);\n\t\t\t\tconst subfilter = typeof value === 'boolean' ? undefined : relationsFilterToSQL(\n\t\t\t\t\ttargetTable,\n\t\t\t\t\tvalue as AnyRelationsFilter,\n\t\t\t\t\ttargetConfig.relations,\n\t\t\t\t\ttablesRelations,\n\t\t\t\t\tcasing!,\n\t\t\t\t\tdepth + 1,\n\t\t\t\t);\n\t\t\t\tconst filter = and(\n\t\t\t\t\trelationFilter,\n\t\t\t\t\tsubfilter,\n\t\t\t\t);\n\n\t\t\t\tconst subquery = throughTable\n\t\t\t\t\t? sql`(select * from ${getTableAsAliasSQL(targetTable)} inner join ${\n\t\t\t\t\t\tgetTableAsAliasSQL(throughTable)\n\t\t\t\t\t} on ${joinCondition}${sql` where ${filter}`.if(filter)} limit 1)`\n\t\t\t\t\t: sql`(select * from ${getTableAsAliasSQL(targetTable)}${sql` where ${filter}`.if(filter)} limit 1)`;\n\t\t\t\tif (filter) parts.push((value ? exists : notExists)(subquery));\n\t\t\t}\n\t\t}\n\t}\n\n\treturn and(...parts)!;\n}\n\nexport function relationsOrderToSQL(\n\ttable: SchemaEntry,\n\torders: OrderBy,\n): SQL | undefined {\n\tif (typeof orders === 'function') {\n\t\tconst data = orders(table as any, orderByOperators);\n\n\t\treturn is(data, SQL)\n\t\t\t? data\n\t\t\t: Array.isArray(data)\n\t\t\t? data.length\n\t\t\t\t? sql.join(data.map((o) => is(o, SQL) ? o : asc(o)), sql`, `)\n\t\t\t\t: undefined\n\t\t\t: is(data, Column)\n\t\t\t? asc(data)\n\t\t\t: undefined;\n\t}\n\n\tconst entries = Object.entries(orders).filter(([_, value]) => value);\n\tif (!entries.length) return undefined;\n\n\treturn sql.join(\n\t\tentries.map(([target, value]) => (value === 'asc' ? asc : desc)(fieldSelectionToSQL(table, target))),\n\t\tsql`, `,\n\t);\n}\n\nexport function relationExtrasToSQL(\n\ttable: SchemaEntry,\n\textras: Extras,\n) {\n\tconst subqueries: SQL[] = [];\n\tconst selection: BuildRelationalQueryResult['selection'] = [];\n\n\tfor (\n\t\tconst [key, field] of Object.entries(extras)\n\t) {\n\t\tif (!field) continue;\n\t\tconst extra = typeof field === 'function' ? field(table as any, { sql: operators.sql }) : field;\n\n\t\tconst query = sql`(${extra.getSQL()}) as ${sql.identifier(key)}`;\n\n\t\tquery.decoder = extra.getSQL().decoder;\n\n\t\tsubqueries.push(query);\n\t\tselection.push({\n\t\t\tkey,\n\t\t\tfield: query,\n\t\t});\n\t}\n\n\treturn {\n\t\tsql: subqueries.length ? sql.join(subqueries, sql`, `) : undefined,\n\t\tselection,\n\t};\n}\n\nexport interface BuiltRelationFilters {\n\tfilter?: SQL;\n\tjoinCondition?: SQL;\n}\n\nexport function relationToSQL(\n\tcasing: CasingCache,\n\trelation: Relation,\n\tsourceTable: SchemaEntry,\n\ttargetTable: SchemaEntry,\n\tthroughTable?: SchemaEntry,\n): BuiltRelationFilters {\n\tif (relation.through) {\n\t\tconst outerColumnWhere = relation.sourceColumns.map((s, i) => {\n\t\t\tconst t = relation.through!.source[i]!;\n\n\t\t\treturn eq(\n\t\t\t\tsql`${sourceTable}.${sql.identifier(casing.getColumnCasing(s))}`,\n\t\t\t\tsql`${throughTable!}.${sql.identifier(is(t._.column, Column) ? casing.getColumnCasing(t._.column) : t._.key)}`,\n\t\t\t);\n\t\t});\n\n\t\tconst innerColumnWhere = relation.targetColumns.map((s, i) => {\n\t\t\tconst t = relation.through!.target[i]!;\n\n\t\t\treturn eq(\n\t\t\t\tsql`${throughTable!}.${sql.identifier(is(t._.column, Column) ? casing.getColumnCasing(t._.column) : t._.key)}`,\n\t\t\t\tsql`${targetTable}.${sql.identifier(casing.getColumnCasing(s))}`,\n\t\t\t);\n\t\t});\n\n\t\treturn {\n\t\t\tfilter: and(\n\t\t\t\trelation.where\n\t\t\t\t\t? relationsFilterToSQL(relation.isReversed ? sourceTable : targetTable, relation.where)\n\t\t\t\t\t: undefined,\n\t\t\t\t...outerColumnWhere,\n\t\t\t),\n\t\t\tjoinCondition: and(...innerColumnWhere),\n\t\t};\n\t}\n\n\tconst columnWhere = relation.sourceColumns.map((s, i) => {\n\t\tconst t = relation.targetColumns[i]!;\n\n\t\treturn eq(\n\t\t\tsql`${sourceTable}.${sql.identifier(casing.getColumnCasing(s))}`,\n\t\t\tsql`${targetTable}.${sql.identifier(casing.getColumnCasing(t))}`,\n\t\t);\n\t});\n\n\tconst fullWhere = and(\n\t\t...columnWhere,\n\t\trelation.where\n\t\t\t? relationsFilterToSQL(relation.isReversed ? sourceTable : targetTable, relation.where)\n\t\t\t: undefined,\n\t)!;\n\n\treturn { filter: fullWhere };\n}\n\nexport function getTableAsAliasSQL(table: SchemaEntry) {\n\treturn sql`${\n\t\ttable[IsAlias]\n\t\t\t? sql`${sql`${sql.identifier(table[TableSchema] ?? '')}.`.if(table[TableSchema])}${\n\t\t\t\tsql.identifier(table[OriginalName])\n\t\t\t} as ${table}`\n\t\t\t: table\n\t}`;\n}\n"],"mappings":"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","names":["acc","filter"]}
|
|
1
|
+
{"version":3,"sources":["../src/relations.ts"],"sourcesContent":["import { IsAlias, OriginalName, Table, TableColumns, TableSchema } from '~/table.ts';\nimport { aliasedTable } from './alias.ts';\nimport type { CasingCache } from './casing.ts';\nimport { type AnyColumn, Column } from './column.ts';\nimport { entityKind, is } from './entity.ts';\nimport { DrizzleError } from './errors.ts';\nimport {\n\tand,\n\tarrayContained,\n\tarrayContains,\n\tarrayOverlaps,\n\tasc,\n\tbetween,\n\tdesc,\n\teq,\n\texists,\n\tgt,\n\tgte,\n\tilike,\n\tinArray,\n\tisNotNull,\n\tisNull,\n\tlike,\n\tlt,\n\tlte,\n\tne,\n\tnot,\n\tnotBetween,\n\tnotExists,\n\tnotIlike,\n\tnotInArray,\n\tnotLike,\n\tor,\n} from './sql/expressions/index.ts';\nimport { noopDecoder, Placeholder, SQL, sql, type SQLWrapper, View } from './sql/sql.ts';\nimport type { Assume, DrizzleTypeError, Equal, Simplify, ValueOrArray } from './utils.ts';\n\nexport type FilteredSchemaEntry = Table<any> | View<string, boolean, FieldSelection>;\n\nexport type SchemaEntry = Table<any> | View<string, boolean, any>;\n\nexport type Schema = Record<string, SchemaEntry>;\n\nexport type GetTableViewColumns<T extends SchemaEntry> = T extends View<string, boolean, any> ? T['_']['selectedFields']\n\t: T extends Table<any> ? T['_']['columns']\n\t: never;\n\nexport type GetTableViewFieldSelection<T extends SchemaEntry> = T extends View<string, boolean, FieldSelection>\n\t? T['_']['selectedFields']\n\t: T extends Table<any> ? T['_']['columns']\n\t: never;\n\nexport type FieldValue =\n\t| Column<any>\n\t| SQLWrapper\n\t| SQL.Aliased\n\t| SQL;\n\nexport type FieldSelection = Record<string, FieldValue>;\n\nexport function processRelations(tablesConfig: TablesRelationalConfig, tables: Schema) {\n\tfor (const tableConfig of Object.values(tablesConfig)) {\n\t\tfor (const [relationFieldName, relation] of Object.entries(tableConfig.relations)) {\n\t\t\tif (!is(relation, Relation)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\trelation.sourceTable = tableConfig.table;\n\t\t\trelation.fieldName = relationFieldName;\n\t\t}\n\t}\n\n\tfor (const [sourceTableName, tableConfig] of Object.entries(tablesConfig)) {\n\t\tfor (const [relationFieldName, relation] of Object.entries(tableConfig.relations)) {\n\t\t\tif (!is(relation, Relation)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tlet reverseRelation: Relation | undefined;\n\t\t\tconst {\n\t\t\t\ttargetTableName,\n\t\t\t\talias,\n\t\t\t\tsourceColumns,\n\t\t\t\ttargetColumns,\n\t\t\t\tthroughTable,\n\t\t\t\tsourceTable,\n\t\t\t\tthrough,\n\t\t\t\ttargetTable,\n\t\t\t\twhere,\n\t\t\t\tsourceColumnTableNames,\n\t\t\t\ttargetColumnTableNames,\n\t\t\t} = relation;\n\t\t\tconst relationPrintName = `relations -> ${tableConfig.name}: { ${relationFieldName}: r.${\n\t\t\t\tis(relation, One) ? 'one' : 'many'\n\t\t\t}.${targetTableName}(...) }`;\n\n\t\t\tif (relationFieldName in tableConfig.table[TableColumns]) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`${relationPrintName}: relation name collides with column \"${relationFieldName}\" of table \"${tableConfig.name}\"`,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (typeof alias === 'string' && !alias) {\n\t\t\t\tthrow new Error(`${relationPrintName}: \"alias\" cannot be an empty string - omit it if you don't need it`);\n\t\t\t}\n\n\t\t\tif (sourceColumns?.length === 0) {\n\t\t\t\tthrow new Error(`${relationPrintName}: \"from\" cannot be empty`);\n\t\t\t}\n\n\t\t\tif (targetColumns?.length === 0) {\n\t\t\t\tthrow new Error(`${relationPrintName}: \"to\" cannot be empty`);\n\t\t\t}\n\n\t\t\tif (sourceColumns && targetColumns) {\n\t\t\t\tif (sourceColumns.length !== targetColumns.length && !throughTable) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`${relationPrintName}: \"from\" and \"to\" fields without \"through\" must have the same length`,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tfor (const sName of sourceColumnTableNames) {\n\t\t\t\t\tif (sName !== sourceTableName) {\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t`${relationPrintName}: all \"from\" columns must belong to table \"${sourceTableName}\", found column of table \"${sName}\"`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tfor (const tName of targetColumnTableNames) {\n\t\t\t\t\tif (tName !== targetTableName) {\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t`${relationPrintName}: all \"to\" columns must belong to table \"${targetTable}\", found column of table \"${tName}\"`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (through) {\n\t\t\t\t\tif (\n\t\t\t\t\t\tthrough.source.length !== sourceColumns.length\n\t\t\t\t\t\t|| through.target.length !== targetColumns.length\n\t\t\t\t\t) {\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t`${relationPrintName}: \".through(column)\" must be used either on all columns in \"from\" and \"to\" or not defined on any of them`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\tfor (const column of through.source) {\n\t\t\t\t\t\tif (tables[column._.tableName] !== throughTable) {\n\t\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\t`${relationPrintName}: \".through(column)\" must be used on the same table by all columns of the relation`,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tfor (const column of through.target) {\n\t\t\t\t\t\tif (tables[column._.tableName] !== throughTable) {\n\t\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\t`${relationPrintName}: \".through(column)\" must be used on the same table by all columns of the relation`,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (sourceColumns || targetColumns) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`${relationPrintName}: relation must have either both \"from\" and \"to\" defined, or none of them`,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst reverseTableConfig = tablesConfig[targetTableName];\n\t\t\tif (!reverseTableConfig) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`${relationPrintName}: not enough data provided to build the relation - \"from\"/\"to\" are not defined, and no reverse relations of table \"${targetTableName}\" were found\"`,\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (alias) {\n\t\t\t\tconst reverseRelations = Object.values(reverseTableConfig.relations).filter((it): it is Relation =>\n\t\t\t\t\tis(it, Relation) && it.alias === alias && it !== relation\n\t\t\t\t);\n\t\t\t\tif (reverseRelations.length > 1) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`${relationPrintName}: not enough data provided to build the relation - \"from\"/\"to\" are not defined, and multiple relations with alias \"${alias}\" found in table \"${targetTableName}\": ${\n\t\t\t\t\t\t\treverseRelations.map((it) => `\"${it.fieldName}\"`).join(', ')\n\t\t\t\t\t\t}`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\treverseRelation = reverseRelations[0];\n\t\t\t\tif (!reverseRelation) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`${relationPrintName}: not enough data provided to build the relation - \"from\"/\"to\" are not defined, and there is no reverse relation of table \"${targetTableName}\" with alias \"${alias}\"`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tconst reverseRelations = Object.values(reverseTableConfig.relations).filter((it): it is Relation =>\n\t\t\t\t\tis(it, Relation) && it.targetTable === sourceTable && !it.alias && it !== relation\n\t\t\t\t);\n\t\t\t\tif (reverseRelations.length > 1) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`${relationPrintName}: not enough data provided to build the relation - \"from\"/\"to\" are not defined, and multiple relations between \"${targetTableName}\" and \"${sourceTableName}\" were found.\\nHint: you can specify \"alias\" on both sides of the relation with the same value`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\treverseRelation = reverseRelations[0];\n\t\t\t\tif (!reverseRelation) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`${relationPrintName}: not enough data provided to build the relation - \"from\"/\"to\" are not defined, and no reverse relation of table \"${targetTableName}\" with target table \"${sourceTableName}\" was found`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (!reverseRelation.sourceColumns || !reverseRelation.targetColumns) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`${relationPrintName}: not enough data provided to build the relation - \"from\"/\"to\" are not defined, and reverse relation \"${targetTableName}.${reverseRelation.fieldName}\" does not have \"from\"/\"to\" defined`,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\trelation.sourceColumns = reverseRelation.targetColumns;\n\t\t\trelation.targetColumns = reverseRelation.sourceColumns;\n\t\t\trelation.through = reverseRelation.through\n\t\t\t\t? {\n\t\t\t\t\tsource: reverseRelation.through.target,\n\t\t\t\t\ttarget: reverseRelation.through.source,\n\t\t\t\t}\n\t\t\t\t: undefined;\n\t\t\trelation.throughTable = reverseRelation.throughTable;\n\t\t\trelation.isReversed = !where;\n\t\t\trelation.where = where ?? reverseRelation.where;\n\t\t}\n\t}\n\n\treturn tablesConfig;\n}\n\n/** Builds relational config for every table in schema */\nexport function buildRelations<TTables extends Schema, TConfig extends AnyRelationsBuilderConfig>(\n\ttables: TTables,\n\tconfig: TConfig,\n): ExtractTablesWithRelations<TConfig, TTables> {\n\tconst tablesConfig = {} as TablesRelationalConfig;\n\n\tfor (const [tsName, table] of Object.entries(tables)) {\n\t\ttablesConfig[tsName] = {\n\t\t\ttable,\n\t\t\tname: tsName,\n\t\t\trelations: config[tsName] ?? {},\n\t\t};\n\t}\n\n\treturn processRelations(tablesConfig, tables) as any;\n}\n\n/** Builds relational config only for tables present in relational config */\nexport function buildRelationsParts<TTables extends Schema, TConfig extends AnyRelationsBuilderConfig>(\n\ttables: TTables,\n\tconfig: TConfig,\n): ExtractTablesWithRelationsParts<TConfig, TTables> {\n\tconst tablesConfig = {} as TablesRelationalConfig;\n\n\tfor (const [tsName, relations] of Object.entries(config)) {\n\t\tif (!relations || !tables[tsName]) continue;\n\t\ttablesConfig[tsName] = {\n\t\t\ttable: tables[tsName],\n\t\t\tname: tsName,\n\t\t\trelations,\n\t\t};\n\t}\n\n\treturn processRelations(tablesConfig, tables) as any;\n}\n\nexport type RelationsRecord = Record<string, AnyRelation>;\nexport type EmptyRelations = {};\nexport type AnyRelations = TablesRelationalConfig;\n\nexport abstract class Relation<\n\tTTargetTableName extends string = string,\n> {\n\tstatic readonly [entityKind]: string = 'RelationV2';\n\tdeclare readonly $brand: 'RelationV2';\n\tdeclare public readonly relationType: 'many' | 'one';\n\n\tfieldName!: string;\n\tsourceColumns!: Column<any>[];\n\ttargetColumns!: Column<any>[];\n\talias: string | undefined;\n\twhere: AnyTableFilter | undefined;\n\tsourceTable!: SchemaEntry;\n\ttargetTable: SchemaEntry;\n\tthrough?: {\n\t\tsource: RelationsBuilderColumnBase[];\n\t\ttarget: RelationsBuilderColumnBase[];\n\t};\n\tthroughTable?: SchemaEntry;\n\tisReversed?: boolean;\n\n\t/** @internal */\n\tsourceColumnTableNames: string[] = [];\n\t/** @internal */\n\ttargetColumnTableNames: string[] = [];\n\n\tconstructor(\n\t\ttargetTable: SchemaEntry,\n\t\treadonly targetTableName: TTargetTableName,\n\t) {\n\t\tthis.targetTable = targetTable;\n\t}\n}\n\nexport type AnyRelation = Relation<string>;\n\nexport class One<\n\tTTargetTableName extends string,\n\tTOptional extends boolean = boolean,\n> extends Relation<TTargetTableName> {\n\tstatic override readonly [entityKind]: string = 'OneV2';\n\tdeclare protected $relationBrand: 'OneV2';\n\n\tpublic override readonly relationType = 'one' as const;\n\n\treadonly optional: TOptional;\n\n\tconstructor(\n\t\ttables: Schema,\n\t\ttargetTable: SchemaEntry,\n\t\ttargetTableName: TTargetTableName,\n\t\tconfig: AnyOneConfig | undefined,\n\t) {\n\t\tsuper(targetTable, targetTableName);\n\t\tthis.alias = config?.alias;\n\t\tthis.where = config?.where;\n\t\tif (config?.from) {\n\t\t\tthis.sourceColumns = ((Array.isArray(config.from)\n\t\t\t\t? config.from\n\t\t\t\t: [config.from]) as RelationsBuilderColumnBase[]).map((it: RelationsBuilderColumnBase) => {\n\t\t\t\t\tthis.throughTable ??= it._.through ? tables[it._.through._.tableName]! as SchemaEntry : undefined;\n\t\t\t\t\tthis.sourceColumnTableNames.push(it._.tableName);\n\t\t\t\t\treturn it._.column as Column;\n\t\t\t\t});\n\t\t}\n\t\tif (config?.to) {\n\t\t\tthis.targetColumns = (Array.isArray(config.to)\n\t\t\t\t? config.to\n\t\t\t\t: [config.to]).map((it: RelationsBuilderColumnBase) => {\n\t\t\t\t\tthis.throughTable ??= it._.through ? tables[it._.through._.tableName]! as SchemaEntry : undefined;\n\t\t\t\t\tthis.targetColumnTableNames.push(it._.tableName);\n\t\t\t\t\treturn it._.column as Column;\n\t\t\t\t});\n\t\t}\n\n\t\tif (this.throughTable) {\n\t\t\tthis.through = {\n\t\t\t\tsource: (Array.isArray(config?.from) ? config.from : config?.from ? [config.from] : []).map((\n\t\t\t\t\tc,\n\t\t\t\t) => c._.through!),\n\t\t\t\ttarget: (Array.isArray(config?.to) ? config.to : config?.to ? [config.to] : []).map((c) => c._.through!),\n\t\t\t};\n\t\t}\n\t\tthis.optional = (config?.optional ?? true) as TOptional;\n\t}\n}\n\nexport type AnyOne = One<string, boolean>;\n\nexport class Many<TTargetTableName extends string> extends Relation<TTargetTableName> {\n\tstatic override readonly [entityKind]: string = 'ManyV2';\n\tdeclare protected $relationBrand: 'ManyV2';\n\n\tpublic override readonly relationType = 'many' as const;\n\n\tconstructor(\n\t\ttables: Schema,\n\t\ttargetTable: SchemaEntry,\n\t\ttargetTableName: TTargetTableName,\n\t\treadonly config: AnyManyConfig | undefined,\n\t) {\n\t\tsuper(targetTable, targetTableName);\n\t\tthis.alias = config?.alias;\n\t\tthis.where = config?.where;\n\t\tif (config?.from) {\n\t\t\tthis.sourceColumns = ((Array.isArray(config.from)\n\t\t\t\t? config.from\n\t\t\t\t: [config.from]) as RelationsBuilderColumnBase[]).map((it: RelationsBuilderColumnBase) => {\n\t\t\t\t\tthis.throughTable ??= it._.through ? tables[it._.through._.tableName]! as SchemaEntry : undefined;\n\t\t\t\t\tthis.sourceColumnTableNames.push(it._.tableName);\n\t\t\t\t\treturn it._.column as Column;\n\t\t\t\t});\n\t\t}\n\t\tif (config?.to) {\n\t\t\tthis.targetColumns = (Array.isArray(config.to)\n\t\t\t\t? config.to\n\t\t\t\t: [config.to]).map((it: RelationsBuilderColumnBase) => {\n\t\t\t\t\tthis.throughTable ??= it._.through ? tables[it._.through._.tableName]! as SchemaEntry : undefined;\n\t\t\t\t\tthis.targetColumnTableNames.push(it._.tableName);\n\t\t\t\t\treturn it._.column as Column;\n\t\t\t\t});\n\t\t}\n\t\tif (this.throughTable) {\n\t\t\tthis.through = {\n\t\t\t\tsource: (Array.isArray(config?.from) ? config.from : config?.from ? [config.from] : []).map((\n\t\t\t\t\tc,\n\t\t\t\t) => c._.through!),\n\t\t\t\ttarget: (Array.isArray(config?.to) ? config.to : config?.to ? [config.to] : []).map((c) => c._.through!),\n\t\t\t};\n\t\t}\n\t}\n}\n\nexport type AnyMany = Many<string>;\n\nexport abstract class AggregatedField<T = unknown> implements SQLWrapper<T> {\n\tstatic readonly [entityKind]: string = 'AggregatedField';\n\n\tdeclare readonly $brand: 'AggregatedField';\n\n\tdeclare readonly _: {\n\t\treadonly data: T;\n\t};\n\n\tprotected table: SchemaEntry | undefined;\n\n\tonTable(table: SchemaEntry) {\n\t\tthis.table = table;\n\n\t\treturn this;\n\t}\n\n\tabstract getSQL(): SQL<T>;\n}\n\nexport class Count extends AggregatedField<number> {\n\tstatic override readonly [entityKind]: string = 'AggregatedFieldCount';\n\n\tdeclare protected $aggregatedFieldBrand: 'Count';\n\n\tprivate query: SQL<number> | undefined;\n\n\tgetSQL(): SQL<number> {\n\t\tif (!this.query) {\n\t\t\tif (!this.table) throw new Error('Table must be set before building aggregate field');\n\t\t\tthis.query = sql`select count(*) as ${sql.identifier('r')} from ${getTableAsAliasSQL(this.table)}`\n\t\t\t\t.mapWith(Number);\n\t\t}\n\n\t\treturn this.query;\n\t}\n}\n\nexport type ExtractObjectValues<T> = T[keyof T];\n\nexport const operators = {\n\tand,\n\tbetween,\n\teq,\n\texists,\n\tgt,\n\tgte,\n\tilike,\n\tinArray,\n\tarrayContains,\n\tarrayContained,\n\tarrayOverlaps,\n\tisNull,\n\tisNotNull,\n\tlike,\n\tlt,\n\tlte,\n\tne,\n\tnot,\n\tnotBetween,\n\tnotExists,\n\tnotLike,\n\tnotIlike,\n\tnotInArray,\n\tor,\n\tsql,\n};\n\nexport type Operators = typeof operators;\n\nexport const orderByOperators = {\n\tsql,\n\tasc,\n\tdesc,\n};\n\nexport type OrderByOperators = typeof orderByOperators;\n\nexport function getOrderByOperators(): OrderByOperators {\n\treturn orderByOperators;\n}\n\nexport type FindTargetTableInRelationalConfig<\n\tTConfig extends TablesRelationalConfig,\n\tTRelation extends AnyRelation,\n> = TConfig[TRelation['targetTableName']];\n\nexport interface SQLOperator {\n\tsql: Operators['sql'];\n}\n\nexport type DBQueryConfigColumns<TColumns extends FieldSelection> = {\n\t[K in keyof TColumns]?: boolean | undefined;\n};\n\nexport type DBQueryConfigExtras<TTable extends SchemaEntry> = Record<\n\tstring,\n\t| SQLWrapper\n\t| ((\n\t\ttable: TTable,\n\t\toperators: SQLOperator,\n\t) => SQLWrapper)\n>;\n\nexport type DBQueryConfigOrderByCallback<TTable extends SchemaEntry> = (\n\ttable: TTable,\n\toperators: OrderByOperators,\n) => ValueOrArray<AnyColumn | SQL>;\n\nexport type DBQueryConfigOrderByObject<TColumns extends FieldSelection> = {\n\t[K in keyof TColumns]?: 'asc' | 'desc' | undefined;\n};\n\nexport type DBQueryConfigOrderBy<TTable extends SchemaEntry, TColumns extends FieldSelection> =\n\t| DBQueryConfigOrderByCallback<TTable>\n\t| DBQueryConfigOrderByObject<TColumns>;\n\nexport type DBQueryConfigWith<TSchema extends TablesRelationalConfig, TRelations extends RelationsRecord> = {\n\t[K in keyof TRelations]?:\n\t\t| boolean\n\t\t| (DBQueryConfig<\n\t\t\tTRelations[K]['relationType'],\n\t\t\tTSchema,\n\t\t\tFindTargetTableInRelationalConfig<TSchema, TRelations[K]>\n\t\t>)\n\t\t| undefined;\n};\n\nexport type DBQueryConfig<\n\tTRelationType extends 'one' | 'many' = 'one' | 'many',\n\tTSchema extends TablesRelationalConfig = TablesRelationalConfig,\n\tTTableConfig extends TableRelationalConfig = TableRelationalConfig,\n> =\n\t& (TTableConfig['relations'] extends Record<string, never> ? {}\n\t\t: {\n\t\t\twith?:\n\t\t\t\t| DBQueryConfigWith<TSchema, TTableConfig['relations']>\n\t\t\t\t| undefined;\n\t\t})\n\t& {\n\t\tcolumns?: DBQueryConfigColumns<GetTableViewFieldSelection<TTableConfig['table']>> | undefined;\n\t\twhere?: RelationsFilter<TTableConfig, TSchema> | undefined;\n\t\textras?:\n\t\t\t| DBQueryConfigExtras<TTableConfig['table']>\n\t\t\t| undefined;\n\t\torderBy?:\n\t\t\t| DBQueryConfigOrderBy<TTableConfig['table'], GetTableViewFieldSelection<TTableConfig['table']>>\n\t\t\t| undefined;\n\t\toffset?: number | Placeholder | undefined;\n\t}\n\t& (TRelationType extends 'many' ? {\n\t\t\tlimit?: number | Placeholder | undefined;\n\t\t}\n\t\t: {});\n\nexport type AnyDBQueryConfig = {\n\tcolumns?:\n\t\t| DBQueryConfigColumns<GetTableViewFieldSelection<TableRelationalConfig['table']>>\n\t\t| undefined;\n\twhere?: RelationsFilter<TableRelationalConfig, TablesRelationalConfig> | undefined;\n\textras?:\n\t\t| DBQueryConfigExtras<TableRelationalConfig['table']>\n\t\t| undefined;\n\twith?:\n\t\t| Record<string, AnyDBQueryConfig>\n\t\t| undefined;\n\torderBy?:\n\t\t| DBQueryConfigOrderBy<TableRelationalConfig['table'], GetTableViewFieldSelection<TableRelationalConfig['table']>>\n\t\t| undefined;\n\toffset?: number | Placeholder | undefined;\n\tlimit?: number | Placeholder | undefined;\n};\n\nexport interface TableRelationalConfig {\n\ttable: SchemaEntry;\n\tname: string;\n\trelations: RelationsRecord;\n}\n\nexport type TablesRelationalConfig = Record<string, TableRelationalConfig>;\n\nexport type ExtractTablesWithRelations<\n\tTConfig extends AnyRelationsBuilderConfig,\n\tTTables extends Schema,\n> = {\n\t[K in keyof TTables]: {\n\t\ttable: TTables[K];\n\t\tname: K & string;\n\t\trelations: TConfig extends { [CK in K]: Record<string, any> } ? TConfig[K] : {};\n\t};\n};\n\nexport type ExtractTablesWithRelationsParts<\n\tTConfig extends AnyRelationsBuilderConfig,\n\tTTables extends Schema,\n> = {\n\t[K in NonUndefinedKeysOnly<TConfig> & keyof TTables]: {\n\t\ttable: TTables[K & string];\n\t\tname: K & string;\n\t\trelations: TConfig[K] extends Record<string, any> ? TConfig[K] : {};\n\t};\n};\n\nexport type ReturnTypeOrValue<T> = T extends (...args: any[]) => infer R ? R\n\t: T;\n\nexport type RelationResultKind<TResult, TInclude, TRelation extends AnyRelation> = TRelation extends AnyOne ? (\n\t\t| TResult\n\t\t| (Equal<TRelation['optional'], true> extends true ? null\n\t\t\t: TInclude extends Record<string, unknown> ? TInclude['where'] extends Record<string, any> ? null\n\t\t\t\t: never\n\t\t\t: never)\n\t)\n\t: TResult[];\n\nexport type BuildRelationResult<\n\tTConfig extends TablesRelationalConfig,\n\tTInclude,\n\tTRelations extends RelationsRecord,\n> = {\n\t[\n\t\tK in\n\t\t\t& TruthyKeysOnly<TInclude>\n\t\t\t& keyof TRelations\n\t]: TRelations[K] extends infer TRel extends AnyRelation ? RelationResultKind<\n\t\t\tBuildQueryResult<\n\t\t\t\tTConfig,\n\t\t\t\tFindTargetTableInRelationalConfig<TConfig, TRel>,\n\t\t\t\tAssume<TInclude[K], true | Record<string, unknown>>\n\t\t\t>,\n\t\t\tTInclude[K],\n\t\t\tTRel\n\t\t>\n\t\t: TRelations[K] extends AggregatedField<infer TData> ? TData\n\t\t: never;\n};\n\nexport type NonUndefinedKeysOnly<T> = {\n\t[K in keyof T]: T[K] extends undefined ? never : K;\n}[keyof T];\n\nexport type TruthyKeysOnly<T> = {\n\t[K in keyof T]: T[K] extends undefined | false ? never : K;\n}[keyof T];\n\nexport type InferRelationalQueryTableResult<\n\tTRawSelection extends Record<string, unknown>,\n\tTSelectedFields extends Record<string, unknown> | 'Full' = 'Full',\n> = TSelectedFields extends 'Full' ? TRawSelection : {\n\t[\n\t\tK in Equal<\n\t\t\tExclude<\n\t\t\t\tTSelectedFields[\n\t\t\t\t\t& keyof TSelectedFields\n\t\t\t\t\t& keyof TRawSelection\n\t\t\t\t],\n\t\t\t\tundefined\n\t\t\t>,\n\t\t\tfalse\n\t\t> extends true ? Exclude<\n\t\t\t\tkeyof TRawSelection,\n\t\t\t\tNonUndefinedKeysOnly<TSelectedFields>\n\t\t\t>\n\t\t\t:\n\t\t\t\t& {\n\t\t\t\t\t[K in keyof TSelectedFields]: Equal<\n\t\t\t\t\t\tTSelectedFields[K],\n\t\t\t\t\t\ttrue\n\t\t\t\t\t> extends true ? K\n\t\t\t\t\t\t: never;\n\t\t\t\t}[keyof TSelectedFields]\n\t\t\t\t& keyof TRawSelection\n\t]: TRawSelection[K];\n};\n\nexport type BuildQueryResult<\n\tTSchema extends TablesRelationalConfig,\n\tTTableConfig extends TableRelationalConfig,\n\tTFullSelection extends true | Record<string, unknown>,\n\tTModel extends Record<string, unknown> = Assume<\n\t\tTTableConfig['table'],\n\t\t{ $inferSelect: Record<string, unknown> }\n\t>['$inferSelect'],\n> = Equal<TFullSelection, true> extends true ? Simplify<InferRelationalQueryTableResult<TModel>>\n\t: TFullSelection extends Record<string, unknown> ? Simplify<\n\t\t\t& (InferRelationalQueryTableResult<\n\t\t\t\tTModel,\n\t\t\t\tTFullSelection['columns'] extends Record<string, unknown> ? TFullSelection['columns'] : 'Full'\n\t\t\t>)\n\t\t\t& (TFullSelection['extras'] extends Record<string, SQLWrapper | ((...args: any[]) => SQLWrapper)> ? {\n\t\t\t\t\t[\n\t\t\t\t\t\tK in NonUndefinedKeysOnly<\n\t\t\t\t\t\t\tReturnTypeOrValue<TFullSelection['extras']>\n\t\t\t\t\t\t>\n\t\t\t\t\t]: ReturnType<\n\t\t\t\t\t\tAssume<\n\t\t\t\t\t\t\tReturnTypeOrValue<TFullSelection['extras'][K & string]>,\n\t\t\t\t\t\t\tSQLWrapper\n\t\t\t\t\t\t>['getSQL']\n\t\t\t\t\t>['_']['type'];\n\t\t\t\t}\n\t\t\t\t: {})\n\t\t\t& (TFullSelection['with'] extends Record<string, unknown> ? BuildRelationResult<\n\t\t\t\t\tTSchema,\n\t\t\t\t\tTFullSelection['with'],\n\t\t\t\t\tTTableConfig['relations']\n\t\t\t\t>\n\t\t\t\t: {})\n\t\t>\n\t: never;\n\nexport interface BuildRelationalQueryResult {\n\tselection: {\n\t\tkey: string;\n\t\tfield: Column<any> | Table | View | SQL | SQL.Aliased | SQLWrapper | AggregatedField;\n\t\tisArray?: boolean;\n\t\tselection?: BuildRelationalQueryResult['selection'];\n\t\tisOptional?: boolean;\n\t}[];\n\tsql: SQL;\n}\n\nexport function mapRelationalRow(\n\trow: Record<string, unknown>,\n\tbuildQueryResultSelection: BuildRelationalQueryResult['selection'],\n\tmapColumnValue: (value: unknown) => unknown = (value) => value,\n\t/** Needed for SQLite as it returns JSON values as strings */\n\tparseJson: boolean = false,\n\t/** Needed for SingleStore as it returns JSON arrays as strings */\n\tparseJsonIfString: boolean = false,\n\tpath?: string,\n): Record<string, unknown> {\n\tfor (\n\t\tconst selectionItem of buildQueryResultSelection\n\t) {\n\t\tif (selectionItem.selection) {\n\t\t\tconst currentPath = `${path ? `${path}.` : ''}${selectionItem.key}`;\n\n\t\t\tif (row[selectionItem.key] === null) continue;\n\n\t\t\tif (parseJson) {\n\t\t\t\trow[selectionItem.key] = JSON.parse(row[selectionItem.key] as string);\n\t\t\t\tif (row[selectionItem.key] === null) continue;\n\t\t\t}\n\t\t\tif (parseJsonIfString && typeof row[selectionItem.key] === 'string') {\n\t\t\t\trow[selectionItem.key] = JSON.parse(row[selectionItem.key] as string);\n\t\t\t}\n\n\t\t\tif (selectionItem.isArray) {\n\t\t\t\tfor (const item of (row[selectionItem.key] as Array<Record<string, unknown>>)) {\n\t\t\t\t\tmapRelationalRow(\n\t\t\t\t\t\titem,\n\t\t\t\t\t\tselectionItem.selection!,\n\t\t\t\t\t\tmapColumnValue,\n\t\t\t\t\t\tfalse,\n\t\t\t\t\t\tparseJsonIfString,\n\t\t\t\t\t\tcurrentPath,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tmapRelationalRow(\n\t\t\t\trow[selectionItem.key] as Record<string, unknown>,\n\t\t\t\tselectionItem.selection!,\n\t\t\t\tmapColumnValue,\n\t\t\t\tfalse,\n\t\t\t\tparseJsonIfString,\n\t\t\t\tcurrentPath,\n\t\t\t);\n\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst field = selectionItem.field!;\n\t\tconst value = mapColumnValue(row[selectionItem.key]);\n\t\tif (value === null) continue;\n\n\t\tlet decoder;\n\t\tif (is(field, Column)) {\n\t\t\tdecoder = field;\n\t\t} else if (is(field, SQL)) {\n\t\t\tdecoder = field.decoder;\n\t\t} else if (is(field, SQL.Aliased)) {\n\t\t\tdecoder = field.sql.decoder;\n\t\t} else if (is(field, Table) || is(field, View)) {\n\t\t\tdecoder = noopDecoder;\n\t\t} else {\n\t\t\tdecoder = field.getSQL().decoder;\n\t\t}\n\n\t\trow[selectionItem.key] = 'mapFromJsonValue' in decoder\n\t\t\t? (<(value: unknown) => unknown> decoder.mapFromJsonValue)(value)\n\t\t\t: decoder.mapFromDriverValue(value);\n\t}\n\n\treturn row;\n}\n\nexport class RelationsBuilderTable<TTableName extends string = string> {\n\tstatic readonly [entityKind]: string = 'RelationsBuilderTable';\n\n\tprotected readonly _: {\n\t\treadonly name: TTableName;\n\t\treadonly table: SchemaEntry;\n\t};\n\n\tconstructor(table: SchemaEntry, name: TTableName) {\n\t\tthis._ = {\n\t\t\tname,\n\t\t\ttable,\n\t\t};\n\t}\n}\n\nexport interface RelationsBuilderColumnConfig<\n\tTTableName extends string = string,\n> {\n\treadonly tableName: TTableName;\n\treadonly column: FieldValue;\n\treadonly through?: RelationsBuilderColumnBase;\n\treadonly key: string;\n}\n\nexport interface RelationsBuilderColumnBase<\n\tTTableName extends string = string,\n> {\n\t_: RelationsBuilderColumnConfig<TTableName>;\n}\n\nexport class RelationsBuilderColumn<\n\tTTableName extends string = string,\n> implements RelationsBuilderColumnBase<TTableName> {\n\tstatic readonly [entityKind]: string = 'RelationsBuilderColumn';\n\n\treadonly _: {\n\t\treadonly tableName: TTableName;\n\t\treadonly column: FieldValue;\n\t\treadonly key: string;\n\t};\n\n\tconstructor(\n\t\tcolumn: FieldValue,\n\t\ttableName: TTableName,\n\t\tkey: string,\n\t) {\n\t\tthis._ = {\n\t\t\ttableName: tableName,\n\t\t\tcolumn,\n\t\t\tkey,\n\t\t};\n\t}\n\n\tthrough(column: RelationsBuilderColumn): RelationsBuilderJunctionColumn<TTableName> {\n\t\treturn new RelationsBuilderJunctionColumn(\n\t\t\tthis._.column,\n\t\t\tthis._.tableName,\n\t\t\tthis._.key,\n\t\t\tcolumn,\n\t\t);\n\t}\n}\n\nexport class RelationsBuilderJunctionColumn<\n\tTTableName extends string = string,\n> implements RelationsBuilderColumnBase<TTableName> {\n\tstatic readonly [entityKind]: string = 'RelationsBuilderColumn';\n\n\treadonly _: {\n\t\treadonly tableName: TTableName;\n\t\treadonly column: FieldValue;\n\t\treadonly through: RelationsBuilderColumnBase;\n\t\treadonly key: string;\n\t};\n\n\tconstructor(\n\t\tcolumn: FieldValue,\n\t\ttableName: TTableName,\n\t\tkey: string,\n\t\tthrough: RelationsBuilderColumnBase,\n\t) {\n\t\tthis._ = {\n\t\t\ttableName: tableName,\n\t\t\tcolumn,\n\t\t\tthrough,\n\t\t\tkey,\n\t\t};\n\t}\n}\n\nexport interface RelationFieldsFilterInternals<T> {\n\teq?: T | Placeholder | undefined;\n\tne?: T | Placeholder | undefined;\n\tgt?: T | Placeholder | undefined;\n\tgte?: T | Placeholder | undefined;\n\tlt?: T | Placeholder | undefined;\n\tlte?: T | Placeholder | undefined;\n\tin?: (T | Placeholder)[] | Placeholder | undefined;\n\tnotIn?: (T | Placeholder)[] | Placeholder | undefined;\n\tarrayContains?: (T extends Array<infer E> ? (E | Placeholder)[] : (T | Placeholder)[]) | Placeholder | undefined;\n\tarrayContained?: (T extends Array<infer E> ? (E | Placeholder)[] : (T | Placeholder)[]) | Placeholder | undefined;\n\tarrayOverlaps?: (T extends Array<infer E> ? (E | Placeholder)[] : (T | Placeholder)[]) | Placeholder | undefined;\n\tlike?: string | Placeholder | undefined;\n\tilike?: string | Placeholder | undefined;\n\tnotLike?: string | Placeholder | undefined;\n\tnotIlike?: string | Placeholder | undefined;\n\tisNull?: true | undefined;\n\tisNotNull?: true | undefined;\n\tNOT?: RelationsFieldFilter<T> | undefined;\n\tOR?: RelationsFieldFilter<T>[] | undefined;\n\tAND?: RelationsFieldFilter<T>[] | undefined;\n}\n\nexport type RelationsFieldFilter<T = unknown> =\n\t| RelationFieldsFilterInternals<T>\n\t| (\n\t\tunknown extends T ? never : T extends object ? never : T\n\t)\n\t// Bleeds into filters - discuss removal\n\t| Placeholder;\n\nexport interface RelationsFilterCommons<\n\tTTable extends TableRelationalConfig = TableRelationalConfig,\n\tTSchema extends TablesRelationalConfig = TablesRelationalConfig,\n> {\n\tOR?: RelationsFilter<TTable, TSchema>[] | undefined;\n\tNOT?: RelationsFilter<TTable, TSchema> | undefined;\n\tAND?: RelationsFilter<TTable, TSchema>[] | undefined;\n\tRAW?:\n\t\t| SQLWrapper\n\t\t| ((\n\t\t\ttable: TTable['table'],\n\t\t\toperators: Operators,\n\t\t) => SQL)\n\t\t| undefined;\n}\n\nexport type RelationsFilterColumns<\n\tTColumns extends Record<string, unknown>,\n> = {\n\t[K in keyof TColumns]?:\n\t\t| (TColumns[K] extends { _: { data: infer Data } } ? RelationsFieldFilter<Data>\n\t\t\t: RelationsFieldFilter<unknown>)\n\t\t| undefined;\n};\n\nexport type RelationsFilterRelations<\n\tTTable extends TableRelationalConfig,\n\tTSchema extends TablesRelationalConfig,\n\tTRelations extends RelationsRecord = TTable['relations'],\n> = {\n\t[K in keyof TRelations]?:\n\t\t| boolean\n\t\t| RelationsFilter<FindTargetTableInRelationalConfig<TSchema, TRelations[K]>, TSchema>\n\t\t| undefined;\n};\n\nexport type RelationsFilter<\n\tTTable extends TableRelationalConfig,\n\tTSchema extends TablesRelationalConfig,\n\tTColumns extends FieldSelection = GetTableViewFieldSelection<TTable['table']>,\n> = TTable['relations'] extends Record<string, never> ? TableFilter<TTable['table']>\n\t:\n\t\t& RelationsFilterColumns<TColumns>\n\t\t& RelationsFilterRelations<TTable, TSchema>\n\t\t& RelationsFilterCommons<TTable, TSchema>;\n\nexport interface TableFilterCommons<\n\tTTable extends SchemaEntry = SchemaEntry,\n\tTColumns extends Record<string, unknown> = GetTableViewColumns<TTable>,\n> {\n\tOR?: TableFilter<TTable, TColumns>[] | undefined;\n\tNOT?: TableFilter<TTable, TColumns> | undefined;\n\tAND?: TableFilter<TTable, TColumns>[] | undefined;\n\tRAW?:\n\t\t| SQLWrapper\n\t\t| ((\n\t\t\ttable: TTable,\n\t\t\toperators: Operators,\n\t\t) => SQL)\n\t\t| undefined;\n}\n\nexport type TableFilterColumns<\n\tTColumns extends Record<string, unknown>,\n> = {\n\t[K in keyof TColumns]?:\n\t\t| (TColumns[K] extends { _: { data: infer Data } } ? RelationsFieldFilter<Data>\n\t\t\t: RelationsFieldFilter<unknown>)\n\t\t| undefined;\n};\n\nexport type TableFilter<\n\tTTable extends SchemaEntry = SchemaEntry,\n\tTColumns extends Record<string, unknown> = GetTableViewColumns<TTable>,\n> =\n\t& TableFilterColumns<TColumns>\n\t& TableFilterCommons<TTable, TColumns>;\n\nexport type AnyRelationsFilter = RelationsFilter<\n\tTableRelationalConfig,\n\tTablesRelationalConfig,\n\tFieldSelection\n>;\n\nexport type AnyTableFilter = TableFilter<\n\tSchemaEntry,\n\tFieldSelection\n>;\n\nexport interface OneConfig<TTargetTable extends SchemaEntry, TOptional extends boolean> {\n\tfrom?: RelationsBuilderColumnBase | [RelationsBuilderColumnBase, ...RelationsBuilderColumnBase[]];\n\tto?: RelationsBuilderColumnBase | [RelationsBuilderColumnBase, ...RelationsBuilderColumnBase[]];\n\twhere?: TableFilter<TTargetTable>;\n\toptional?: TOptional;\n\talias?: string;\n}\n\nexport type AnyOneConfig = OneConfig<\n\tSchemaEntry,\n\tboolean\n>;\n\nexport interface ManyConfig<TTargetTable extends SchemaEntry> {\n\tfrom?: RelationsBuilderColumnBase | [RelationsBuilderColumnBase, ...RelationsBuilderColumnBase[]];\n\tto?: RelationsBuilderColumnBase | [RelationsBuilderColumnBase, ...RelationsBuilderColumnBase[]];\n\twhere?: TableFilter<TTargetTable>;\n\talias?: string;\n}\n\nexport type AnyManyConfig = ManyConfig<SchemaEntry>;\n\nexport interface OneFn<TTargetTable extends SchemaEntry, TTargetTableName extends string> {\n\t<TOptional extends boolean = true>(config?: OneConfig<TTargetTable, TOptional>): One<TTargetTableName, TOptional>;\n}\n\nexport interface ManyFn<TTargetTable extends SchemaEntry, TTargetTableName extends string> {\n\t(config?: ManyConfig<TTargetTable>): Many<TTargetTableName>;\n}\n\nexport class RelationsHelperStatic<TTables extends Schema> {\n\tstatic readonly [entityKind]: string = 'RelationsHelperStatic';\n\t// declare readonly $brand: 'RelationsHelperStatic';\n\n\tprivate readonly _: {\n\t\treadonly tables: TTables;\n\t};\n\n\tconstructor(tables: TTables) {\n\t\tthis._ = {\n\t\t\ttables,\n\t\t};\n\n\t\tconst one: Record<string, OneFn<TTables[string], string>> = {};\n\t\tconst many: Record<string, ManyFn<TTables[string], string>> = {};\n\n\t\tfor (const [tableName, table] of Object.entries(tables)) {\n\t\t\tone[tableName] = (config) => {\n\t\t\t\treturn new One(tables, table, tableName, config as unknown as AnyOneConfig);\n\t\t\t};\n\n\t\t\tmany[tableName] = (config) => {\n\t\t\t\treturn new Many(tables, table, tableName, config as AnyManyConfig);\n\t\t\t};\n\t\t}\n\n\t\tthis.one = one as any as this['one'];\n\t\tthis.many = many as any as this['many'];\n\t}\n\n\tone: {\n\t\t[K in keyof TTables]: TTables[K] extends FilteredSchemaEntry ? OneFn<TTables[K], K & string>\n\t\t\t: DrizzleTypeError<'Views with nested selections are not supported by the relational query builder'>;\n\t};\n\n\tmany: {\n\t\t[K in keyof TTables]: TTables[K] extends FilteredSchemaEntry ? ManyFn<TTables[K], K & string>\n\t\t\t: DrizzleTypeError<'Views with nested selections are not supported by the relational query builder'>;\n\t};\n\n\t/** @internal - to be reworked */\n\taggs = {\n\t\tcount(): Count {\n\t\t\treturn new Count();\n\t\t},\n\t};\n}\n\nexport type RelationsBuilderColumns<TTable extends SchemaEntry, TTableName extends string> = {\n\t[\n\t\tTColumnName in keyof GetTableViewColumns<TTable>\n\t]: RelationsBuilderColumn<\n\t\tTTableName\n\t>;\n};\n\nexport type RelationsBuilderTables<TSchema extends Schema> = {\n\t[TTableName in keyof TSchema]: TSchema[TTableName] extends FilteredSchemaEntry ? (\n\t\t\t& RelationsBuilderColumns<TSchema[TTableName], TTableName & string>\n\t\t\t& RelationsBuilderTable<TTableName & string>\n\t\t)\n\t\t: DrizzleTypeError<'Views with nested selections are not supported by the relational query builder'>;\n};\n\nexport type RelationsBuilder<TSchema extends Schema> =\n\t& RelationsBuilderTables<TSchema>\n\t& RelationsHelperStatic<TSchema>;\n\nexport type RelationsBuilderConfigValue =\n\t| RelationsRecord\n\t| undefined;\n\nexport type RelationsBuilderConfig<TTables extends Schema> = {\n\t[TTableName in keyof TTables]?: RelationsBuilderConfigValue;\n};\n\nexport type AnyRelationsBuilderConfig = Record<string, RelationsBuilderConfigValue>;\n\nexport type ExtractTablesFromSchema<TSchema extends Record<string, unknown>> = Assume<\n\t{\n\t\t[K in keyof TSchema as TSchema[K] extends SchemaEntry ? K extends string ? K : never : never]: TSchema[K];\n\t},\n\tSchema\n>;\n\nexport function createRelationsHelper<\n\tTTables extends Schema,\n>(tables: TTables): RelationsBuilder<TTables> {\n\tconst helperStatic = new RelationsHelperStatic(tables);\n\tconst relationsTables = Object.entries(tables).reduce<Record<string, RelationsBuilderTable>>((acc, [tKey, value]) => {\n\t\tconst rTable = new RelationsBuilderTable(value, tKey);\n\t\tconst columns = Object.entries(value[TableColumns]).reduce<\n\t\t\tRecord<string, RelationsBuilderColumnBase>\n\t\t>(\n\t\t\t(acc, [cKey, column]) => {\n\t\t\t\tconst rbColumn = new RelationsBuilderColumn(column as FieldValue, tKey, cKey);\n\t\t\t\tacc[cKey] = rbColumn;\n\t\t\t\treturn acc;\n\t\t\t},\n\t\t\t{},\n\t\t);\n\n\t\tacc[tKey] = Object.assign(rTable, columns);\n\n\t\treturn acc;\n\t}, {});\n\n\treturn Object.assign(helperStatic, relationsTables) as any;\n}\n\nexport function extractTablesFromSchema<TSchema extends Record<string, unknown>>(\n\tschema: TSchema,\n): ExtractTablesFromSchema<TSchema> {\n\treturn Object.fromEntries(\n\t\tObject.entries(schema).filter(([_, e]) => is(e, Table) || is(e, View)),\n\t) as ExtractTablesFromSchema<TSchema>;\n}\n\nexport type IncludeEveryTable<TTables extends Schema> = { [K in keyof TTables]: {} };\n\n/** Builds relational config for every table in schema */\nexport function defineRelations<\n\tTSchema extends Record<string, unknown>,\n\tTTables extends Schema = ExtractTablesFromSchema<TSchema>,\n>(\n\tschema: TSchema,\n): ExtractTablesWithRelations<{}, TTables>;\n/** Builds relational config for every table in schema */\nexport function defineRelations<\n\tTSchema extends Record<string, unknown>,\n\tTConfig extends RelationsBuilderConfig<TTables>,\n\tTTables extends Schema = ExtractTablesFromSchema<TSchema>,\n>(\n\tschema: TSchema,\n\trelations: (helpers: RelationsBuilder<TTables>) => TConfig,\n): ExtractTablesWithRelations<TConfig, TTables>;\nexport function defineRelations(\n\tschema: Record<string, unknown>,\n\trelations?: (helpers: RelationsBuilder<Schema>) => AnyRelationsBuilderConfig,\n): TablesRelationalConfig {\n\tconst tables = extractTablesFromSchema(schema);\n\tconst config = relations\n\t\t? relations(\n\t\t\tcreateRelationsHelper(tables) as RelationsBuilder<Schema>,\n\t\t)\n\t\t: {};\n\n\treturn buildRelations(tables, config);\n}\n\n/** Builds relational config for every table in schema */\nexport function defineRelationsPart<\n\tTSchema extends Record<string, unknown>,\n\tTTables extends Schema = ExtractTablesFromSchema<TSchema>,\n>(\n\tschema: TSchema,\n): ExtractTablesWithRelationsParts<IncludeEveryTable<TTables>, TTables>;\n/** Builds relational config only for tables present in relational config */\nexport function defineRelationsPart<\n\tTSchema extends Record<string, unknown>,\n\tTConfig extends RelationsBuilderConfig<TTables>,\n\tTTables extends Schema = ExtractTablesFromSchema<TSchema>,\n>(\n\tschema: TSchema,\n\trelations: (helpers: RelationsBuilder<TTables>) => TConfig,\n): ExtractTablesWithRelationsParts<TConfig, TTables>;\nexport function defineRelationsPart(\n\tschema: Record<string, unknown>,\n\trelations?: (helpers: RelationsBuilder<Schema>) => AnyRelationsBuilderConfig,\n): TablesRelationalConfig {\n\tconst tables = extractTablesFromSchema(schema);\n\tconst config = relations\n\t\t? relations(\n\t\t\tcreateRelationsHelper(tables) as RelationsBuilder<Schema>,\n\t\t)\n\t\t: Object.fromEntries(Object.keys(tables).map((k) => [k, {}])) as AnyRelationsBuilderConfig;\n\n\treturn buildRelationsParts(tables, config);\n}\n\nexport interface WithContainer {\n\twith?: Record<string, boolean | AnyDBQueryConfig | undefined>;\n}\n\nexport interface ColumnWithTSName {\n\tcolumn: Table | View | Column<any> | SQL | SQLWrapper | SQL.Aliased;\n\ttsName: string;\n}\n\nexport type RelationsOrder<TColumns extends FieldSelection> = {\n\t[K in keyof TColumns]?: 'asc' | 'desc';\n};\n\nexport type OrderBy = Exclude<AnyDBQueryConfig['orderBy'], undefined>;\n\nexport type Extras = Exclude<AnyDBQueryConfig['extras'], undefined>;\n\n/** @internal */\nexport function fieldSelectionToSQL(table: SchemaEntry, target: string) {\n\tconst field = table[TableColumns][target];\n\n\treturn field\n\t\t? is(field, Column)\n\t\t\t? field\n\t\t\t: is(field, SQL.Aliased)\n\t\t\t? sql`${table}.${sql.identifier(field.fieldAlias)}`\n\t\t\t: sql`${table}.${sql.identifier(target)}`\n\t\t: sql`${table}.${sql.identifier(target)}`;\n}\n\nfunction relationsFieldFilterToSQL(column: SQLWrapper, filter: RelationsFieldFilter<unknown>): SQL | undefined {\n\tif (typeof filter !== 'object' || is(filter, Placeholder)) return eq(column, filter);\n\n\tconst entries = Object.entries(filter as RelationFieldsFilterInternals<unknown>);\n\tif (!entries.length) return undefined;\n\n\tconst parts: (SQL)[] = [];\n\tfor (const [target, value] of entries) {\n\t\tif (value === undefined) continue;\n\n\t\tswitch (target as keyof RelationFieldsFilterInternals<unknown>) {\n\t\t\tcase 'NOT': {\n\t\t\t\tconst res = relationsFieldFilterToSQL(column, value as RelationsFieldFilter<unknown>);\n\t\t\t\tif (!res) continue;\n\n\t\t\t\tparts.push(not(res));\n\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tcase 'OR': {\n\t\t\t\tif (!(value as RelationsFieldFilter<unknown>[]).length) continue;\n\n\t\t\t\tparts.push(\n\t\t\t\t\tor(\n\t\t\t\t\t\t...(value as AnyRelationsFilter[]).map((subFilter) => relationsFieldFilterToSQL(column, subFilter)),\n\t\t\t\t\t)!,\n\t\t\t\t);\n\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tcase 'AND': {\n\t\t\t\tif (!(value as RelationsFieldFilter<unknown>[]).length) continue;\n\n\t\t\t\tparts.push(\n\t\t\t\t\tand(\n\t\t\t\t\t\t...(value as AnyRelationsFilter[]).map((subFilter) => relationsFieldFilterToSQL(column, subFilter)),\n\t\t\t\t\t)!,\n\t\t\t\t);\n\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tcase 'isNotNull':\n\t\t\tcase 'isNull': {\n\t\t\t\tif (!value) continue;\n\n\t\t\t\tparts.push(operators[target as 'isNull' | 'isNotNull'](column));\n\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tcase 'in': {\n\t\t\t\tparts.push(operators.inArray(column, value as any[] | Placeholder));\n\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tcase 'notIn': {\n\t\t\t\tparts.push(operators.notInArray(column, value as any[] | Placeholder));\n\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tdefault: {\n\t\t\t\tparts.push(\n\t\t\t\t\t(operators[target as keyof typeof operators] as ((col: SQLWrapper, data: any) => SQL | undefined))(\n\t\t\t\t\t\tcolumn,\n\t\t\t\t\t\tvalue,\n\t\t\t\t\t)!,\n\t\t\t\t);\n\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t}\n\t}\n\n\tif (!parts.length) return undefined;\n\n\treturn and(...parts);\n}\n\nexport function relationsFilterToSQL(\n\ttable: SchemaEntry,\n\tfilter: AnyRelationsFilter | AnyTableFilter,\n): SQL | undefined;\nexport function relationsFilterToSQL(\n\ttable: SchemaEntry,\n\tfilter: AnyRelationsFilter | AnyTableFilter,\n\ttableRelations: RelationsRecord,\n\ttablesRelations: TablesRelationalConfig,\n\tcasing: CasingCache,\n\tdepth?: number,\n): SQL | undefined;\nexport function relationsFilterToSQL(\n\ttable: SchemaEntry,\n\tfilter: AnyRelationsFilter | AnyTableFilter,\n\ttableRelations: RelationsRecord = {},\n\ttablesRelations: TablesRelationalConfig = {},\n\tcasing?: CasingCache,\n\tdepth: number = 0,\n): SQL | undefined {\n\tconst entries = Object.entries(filter);\n\tif (!entries.length) return undefined;\n\n\tconst parts: SQL[] = [];\n\tfor (const [target, value] of entries) {\n\t\tif (value === undefined) continue;\n\n\t\tswitch (target) {\n\t\t\tcase 'RAW': {\n\t\t\t\tconst processed = typeof value === 'function'\n\t\t\t\t\t? (value as unknown as (table: FieldSelection, operators: Operators) => SQL)(table as any, operators)\n\t\t\t\t\t: (value as SQLWrapper).getSQL();\n\n\t\t\t\tparts.push(processed);\n\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tcase 'OR': {\n\t\t\t\tif (!(value as AnyRelationsFilter[] | undefined)?.length) continue;\n\n\t\t\t\tparts.push(\n\t\t\t\t\tor(\n\t\t\t\t\t\t...(value as AnyRelationsFilter[]).map((subFilter) =>\n\t\t\t\t\t\t\trelationsFilterToSQL(table, subFilter, tableRelations, tablesRelations, casing!, depth)\n\t\t\t\t\t\t),\n\t\t\t\t\t)!,\n\t\t\t\t);\n\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tcase 'AND': {\n\t\t\t\tif (!(value as AnyRelationsFilter[] | undefined)?.length) continue;\n\n\t\t\t\tparts.push(\n\t\t\t\t\tand(\n\t\t\t\t\t\t...(value as AnyRelationsFilter[]).map((subFilter) =>\n\t\t\t\t\t\t\trelationsFilterToSQL(table, subFilter, tableRelations, tablesRelations, casing!, depth)\n\t\t\t\t\t\t),\n\t\t\t\t\t)!,\n\t\t\t\t);\n\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tcase 'NOT': {\n\t\t\t\tif (value === undefined) continue;\n\n\t\t\t\tconst built = relationsFilterToSQL(\n\t\t\t\t\ttable,\n\t\t\t\t\tvalue as AnyRelationsFilter,\n\t\t\t\t\ttableRelations,\n\t\t\t\t\ttablesRelations,\n\t\t\t\t\tcasing!,\n\t\t\t\t\tdepth,\n\t\t\t\t);\n\t\t\t\tif (!built) continue;\n\n\t\t\t\tparts.push(not(built));\n\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tdefault: {\n\t\t\t\tif (table[TableColumns][target]) {\n\t\t\t\t\tconst column = fieldSelectionToSQL(table, target);\n\n\t\t\t\t\tconst colFilter = relationsFieldFilterToSQL(\n\t\t\t\t\t\tcolumn,\n\t\t\t\t\t\tvalue as RelationsFieldFilter,\n\t\t\t\t\t);\n\t\t\t\t\tif (colFilter) parts.push(colFilter);\n\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tconst relation = tableRelations[target];\n\t\t\t\tif (!relation) {\n\t\t\t\t\t// Should never trigger unless the types've been violated\n\t\t\t\t\tthrow new DrizzleError({\n\t\t\t\t\t\tmessage: `Unknown relational filter field: \"${target}\"`,\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tconst targetTable = aliasedTable(relation.targetTable, `f${depth}`);\n\t\t\t\tconst throughTable = relation.throughTable ? aliasedTable(relation.throughTable, `ft${depth}`) : undefined;\n\t\t\t\tconst targetConfig = tablesRelations[relation.targetTableName]!;\n\n\t\t\t\tconst {\n\t\t\t\t\tfilter: relationFilter,\n\t\t\t\t\tjoinCondition,\n\t\t\t\t} = relationToSQL(casing!, relation, table, targetTable, throughTable);\n\t\t\t\tconst subfilter = typeof value === 'boolean' ? undefined : relationsFilterToSQL(\n\t\t\t\t\ttargetTable,\n\t\t\t\t\tvalue as AnyRelationsFilter,\n\t\t\t\t\ttargetConfig.relations,\n\t\t\t\t\ttablesRelations,\n\t\t\t\t\tcasing!,\n\t\t\t\t\tdepth + 1,\n\t\t\t\t);\n\t\t\t\tconst filter = and(\n\t\t\t\t\trelationFilter,\n\t\t\t\t\tsubfilter,\n\t\t\t\t);\n\n\t\t\t\tconst subquery = throughTable\n\t\t\t\t\t? sql`(select * from ${getTableAsAliasSQL(targetTable)} inner join ${\n\t\t\t\t\t\tgetTableAsAliasSQL(throughTable)\n\t\t\t\t\t} on ${joinCondition}${sql` where ${filter}`.if(filter)} limit 1)`\n\t\t\t\t\t: sql`(select * from ${getTableAsAliasSQL(targetTable)}${sql` where ${filter}`.if(filter)} limit 1)`;\n\t\t\t\tif (filter) parts.push((value ? exists : notExists)(subquery));\n\t\t\t}\n\t\t}\n\t}\n\n\treturn and(...parts)!;\n}\n\nexport function relationsOrderToSQL(\n\ttable: SchemaEntry,\n\torders: OrderBy,\n): SQL | undefined {\n\tif (typeof orders === 'function') {\n\t\tconst data = orders(table as any, orderByOperators);\n\n\t\treturn is(data, SQL)\n\t\t\t? data\n\t\t\t: Array.isArray(data)\n\t\t\t? data.length\n\t\t\t\t? sql.join(data.map((o) => is(o, SQL) ? o : asc(o)), sql`, `)\n\t\t\t\t: undefined\n\t\t\t: is(data, Column)\n\t\t\t? asc(data)\n\t\t\t: undefined;\n\t}\n\n\tconst entries = Object.entries(orders).filter(([_, value]) => value);\n\tif (!entries.length) return undefined;\n\n\treturn sql.join(\n\t\tentries.map(([target, value]) => (value === 'asc' ? asc : desc)(fieldSelectionToSQL(table, target))),\n\t\tsql`, `,\n\t);\n}\n\nexport function relationExtrasToSQL(\n\ttable: SchemaEntry,\n\textras: Extras,\n) {\n\tconst subqueries: SQL[] = [];\n\tconst selection: BuildRelationalQueryResult['selection'] = [];\n\n\tfor (\n\t\tconst [key, field] of Object.entries(extras)\n\t) {\n\t\tif (!field) continue;\n\t\tconst extra = typeof field === 'function' ? field(table as any, { sql: operators.sql }) : field;\n\n\t\tconst query = sql`(${extra.getSQL()}) as ${sql.identifier(key)}`;\n\n\t\tquery.decoder = extra.getSQL().decoder;\n\n\t\tsubqueries.push(query);\n\t\tselection.push({\n\t\t\tkey,\n\t\t\tfield: query,\n\t\t});\n\t}\n\n\treturn {\n\t\tsql: subqueries.length ? sql.join(subqueries, sql`, `) : undefined,\n\t\tselection,\n\t};\n}\n\nexport interface BuiltRelationFilters {\n\tfilter?: SQL;\n\tjoinCondition?: SQL;\n}\n\nexport function relationToSQL(\n\tcasing: CasingCache,\n\trelation: Relation,\n\tsourceTable: SchemaEntry,\n\ttargetTable: SchemaEntry,\n\tthroughTable?: SchemaEntry,\n): BuiltRelationFilters {\n\tif (relation.through) {\n\t\tconst outerColumnWhere = relation.sourceColumns.map((s, i) => {\n\t\t\tconst t = relation.through!.source[i]!;\n\n\t\t\treturn eq(\n\t\t\t\tsql`${sourceTable}.${sql.identifier(casing.getColumnCasing(s))}`,\n\t\t\t\tsql`${throughTable!}.${sql.identifier(is(t._.column, Column) ? casing.getColumnCasing(t._.column) : t._.key)}`,\n\t\t\t);\n\t\t});\n\n\t\tconst innerColumnWhere = relation.targetColumns.map((s, i) => {\n\t\t\tconst t = relation.through!.target[i]!;\n\n\t\t\treturn eq(\n\t\t\t\tsql`${throughTable!}.${sql.identifier(is(t._.column, Column) ? casing.getColumnCasing(t._.column) : t._.key)}`,\n\t\t\t\tsql`${targetTable}.${sql.identifier(casing.getColumnCasing(s))}`,\n\t\t\t);\n\t\t});\n\n\t\treturn {\n\t\t\tfilter: and(\n\t\t\t\trelation.where\n\t\t\t\t\t? relationsFilterToSQL(relation.isReversed ? sourceTable : targetTable, relation.where)\n\t\t\t\t\t: undefined,\n\t\t\t\t...outerColumnWhere,\n\t\t\t),\n\t\t\tjoinCondition: and(...innerColumnWhere),\n\t\t};\n\t}\n\n\tconst columnWhere = relation.sourceColumns.map((s, i) => {\n\t\tconst t = relation.targetColumns[i]!;\n\n\t\treturn eq(\n\t\t\tsql`${sourceTable}.${sql.identifier(casing.getColumnCasing(s))}`,\n\t\t\tsql`${targetTable}.${sql.identifier(casing.getColumnCasing(t))}`,\n\t\t);\n\t});\n\n\tconst fullWhere = and(\n\t\t...columnWhere,\n\t\trelation.where\n\t\t\t? relationsFilterToSQL(relation.isReversed ? sourceTable : targetTable, relation.where)\n\t\t\t: undefined,\n\t)!;\n\n\treturn { filter: fullWhere };\n}\n\nexport function getTableAsAliasSQL(table: SchemaEntry) {\n\treturn sql`${\n\t\ttable[IsAlias]\n\t\t\t? sql`${sql`${sql.identifier(table[TableSchema] ?? '')}.`.if(table[TableSchema])}${\n\t\t\t\tsql.identifier(table[OriginalName])\n\t\t\t} as ${table}`\n\t\t\t: table\n\t}`;\n}\n"],"mappings":"AAAA,SAAS,SAAS,cAAc,OAAO,cAAc,mBAAmB;AACxE,SAAS,oBAAoB;AAE7B,SAAyB,cAAc;AACvC,SAAS,YAAY,UAAU;AAC/B,SAAS,oBAAoB;AAC7B;AAAA,EACC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACM;AACP,SAAS,aAAa,aAAa,KAAK,KAAsB,YAAY;AA0BnE,SAAS,iBAAiB,cAAsC,QAAgB;AACtF,aAAW,eAAe,OAAO,OAAO,YAAY,GAAG;AACtD,eAAW,CAAC,mBAAmB,QAAQ,KAAK,OAAO,QAAQ,YAAY,SAAS,GAAG;AAClF,UAAI,CAAC,GAAG,UAAU,QAAQ,GAAG;AAC5B;AAAA,MACD;AAEA,eAAS,cAAc,YAAY;AACnC,eAAS,YAAY;AAAA,IACtB;AAAA,EACD;AAEA,aAAW,CAAC,iBAAiB,WAAW,KAAK,OAAO,QAAQ,YAAY,GAAG;AAC1E,eAAW,CAAC,mBAAmB,QAAQ,KAAK,OAAO,QAAQ,YAAY,SAAS,GAAG;AAClF,UAAI,CAAC,GAAG,UAAU,QAAQ,GAAG;AAC5B;AAAA,MACD;AAEA,UAAI;AACJ,YAAM;AAAA,QACL;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACD,IAAI;AACJ,YAAM,oBAAoB,gBAAgB,YAAY,IAAI,OAAO,iBAAiB,OACjF,GAAG,UAAU,GAAG,IAAI,QAAQ,MAC7B,IAAI,eAAe;AAEnB,UAAI,qBAAqB,YAAY,MAAM,YAAY,GAAG;AACzD,cAAM,IAAI;AAAA,UACT,GAAG,iBAAiB,yCAAyC,iBAAiB,eAAe,YAAY,IAAI;AAAA,QAC9G;AAAA,MACD;AAEA,UAAI,OAAO,UAAU,YAAY,CAAC,OAAO;AACxC,cAAM,IAAI,MAAM,GAAG,iBAAiB,oEAAoE;AAAA,MACzG;AAEA,UAAI,eAAe,WAAW,GAAG;AAChC,cAAM,IAAI,MAAM,GAAG,iBAAiB,0BAA0B;AAAA,MAC/D;AAEA,UAAI,eAAe,WAAW,GAAG;AAChC,cAAM,IAAI,MAAM,GAAG,iBAAiB,wBAAwB;AAAA,MAC7D;AAEA,UAAI,iBAAiB,eAAe;AACnC,YAAI,cAAc,WAAW,cAAc,UAAU,CAAC,cAAc;AACnE,gBAAM,IAAI;AAAA,YACT,GAAG,iBAAiB;AAAA,UACrB;AAAA,QACD;AAEA,mBAAW,SAAS,wBAAwB;AAC3C,cAAI,UAAU,iBAAiB;AAC9B,kBAAM,IAAI;AAAA,cACT,GAAG,iBAAiB,8CAA8C,eAAe,6BAA6B,KAAK;AAAA,YACpH;AAAA,UACD;AAAA,QACD;AACA,mBAAW,SAAS,wBAAwB;AAC3C,cAAI,UAAU,iBAAiB;AAC9B,kBAAM,IAAI;AAAA,cACT,GAAG,iBAAiB,4CAA4C,WAAW,6BAA6B,KAAK;AAAA,YAC9G;AAAA,UACD;AAAA,QACD;AAEA,YAAI,SAAS;AACZ,cACC,QAAQ,OAAO,WAAW,cAAc,UACrC,QAAQ,OAAO,WAAW,cAAc,QAC1C;AACD,kBAAM,IAAI;AAAA,cACT,GAAG,iBAAiB;AAAA,YACrB;AAAA,UACD;AAEA,qBAAW,UAAU,QAAQ,QAAQ;AACpC,gBAAI,OAAO,OAAO,EAAE,SAAS,MAAM,cAAc;AAChD,oBAAM,IAAI;AAAA,gBACT,GAAG,iBAAiB;AAAA,cACrB;AAAA,YACD;AAAA,UACD;AAEA,qBAAW,UAAU,QAAQ,QAAQ;AACpC,gBAAI,OAAO,OAAO,EAAE,SAAS,MAAM,cAAc;AAChD,oBAAM,IAAI;AAAA,gBACT,GAAG,iBAAiB;AAAA,cACrB;AAAA,YACD;AAAA,UACD;AAAA,QACD;AAEA;AAAA,MACD;AAEA,UAAI,iBAAiB,eAAe;AACnC,cAAM,IAAI;AAAA,UACT,GAAG,iBAAiB;AAAA,QACrB;AAAA,MACD;AAEA,YAAM,qBAAqB,aAAa,eAAe;AACvD,UAAI,CAAC,oBAAoB;AACxB,cAAM,IAAI;AAAA,UACT,GAAG,iBAAiB,sHAAsH,eAAe;AAAA,QAC1J;AAAA,MACD;AACA,UAAI,OAAO;AACV,cAAM,mBAAmB,OAAO,OAAO,mBAAmB,SAAS,EAAE;AAAA,UAAO,CAAC,OAC5E,GAAG,IAAI,QAAQ,KAAK,GAAG,UAAU,SAAS,OAAO;AAAA,QAClD;AACA,YAAI,iBAAiB,SAAS,GAAG;AAChC,gBAAM,IAAI;AAAA,YACT,GAAG,iBAAiB,sHAAsH,KAAK,qBAAqB,eAAe,MAClL,iBAAiB,IAAI,CAAC,OAAO,IAAI,GAAG,SAAS,GAAG,EAAE,KAAK,IAAI,CAC5D;AAAA,UACD;AAAA,QACD;AACA,0BAAkB,iBAAiB,CAAC;AACpC,YAAI,CAAC,iBAAiB;AACrB,gBAAM,IAAI;AAAA,YACT,GAAG,iBAAiB,8HAA8H,eAAe,iBAAiB,KAAK;AAAA,UACxL;AAAA,QACD;AAAA,MACD,OAAO;AACN,cAAM,mBAAmB,OAAO,OAAO,mBAAmB,SAAS,EAAE;AAAA,UAAO,CAAC,OAC5E,GAAG,IAAI,QAAQ,KAAK,GAAG,gBAAgB,eAAe,CAAC,GAAG,SAAS,OAAO;AAAA,QAC3E;AACA,YAAI,iBAAiB,SAAS,GAAG;AAChC,gBAAM,IAAI;AAAA,YACT,GAAG,iBAAiB,mHAAmH,eAAe,UAAU,eAAe;AAAA;AAAA,UAChL;AAAA,QACD;AACA,0BAAkB,iBAAiB,CAAC;AACpC,YAAI,CAAC,iBAAiB;AACrB,gBAAM,IAAI;AAAA,YACT,GAAG,iBAAiB,qHAAqH,eAAe,wBAAwB,eAAe;AAAA,UAChM;AAAA,QACD;AAAA,MACD;AACA,UAAI,CAAC,gBAAgB,iBAAiB,CAAC,gBAAgB,eAAe;AACrE,cAAM,IAAI;AAAA,UACT,GAAG,iBAAiB,yGAAyG,eAAe,IAAI,gBAAgB,SAAS;AAAA,QAC1K;AAAA,MACD;AAEA,eAAS,gBAAgB,gBAAgB;AACzC,eAAS,gBAAgB,gBAAgB;AACzC,eAAS,UAAU,gBAAgB,UAChC;AAAA,QACD,QAAQ,gBAAgB,QAAQ;AAAA,QAChC,QAAQ,gBAAgB,QAAQ;AAAA,MACjC,IACE;AACH,eAAS,eAAe,gBAAgB;AACxC,eAAS,aAAa,CAAC;AACvB,eAAS,QAAQ,SAAS,gBAAgB;AAAA,IAC3C;AAAA,EACD;AAEA,SAAO;AACR;AAGO,SAAS,eACf,QACA,QAC+C;AAC/C,QAAM,eAAe,CAAC;AAEtB,aAAW,CAAC,QAAQ,KAAK,KAAK,OAAO,QAAQ,MAAM,GAAG;AACrD,iBAAa,MAAM,IAAI;AAAA,MACtB;AAAA,MACA,MAAM;AAAA,MACN,WAAW,OAAO,MAAM,KAAK,CAAC;AAAA,IAC/B;AAAA,EACD;AAEA,SAAO,iBAAiB,cAAc,MAAM;AAC7C;AAGO,SAAS,oBACf,QACA,QACoD;AACpD,QAAM,eAAe,CAAC;AAEtB,aAAW,CAAC,QAAQ,SAAS,KAAK,OAAO,QAAQ,MAAM,GAAG;AACzD,QAAI,CAAC,aAAa,CAAC,OAAO,MAAM,EAAG;AACnC,iBAAa,MAAM,IAAI;AAAA,MACtB,OAAO,OAAO,MAAM;AAAA,MACpB,MAAM;AAAA,MACN;AAAA,IACD;AAAA,EACD;AAEA,SAAO,iBAAiB,cAAc,MAAM;AAC7C;AAMO,MAAe,SAEpB;AAAA,EAwBD,YACC,aACS,iBACR;AADQ;AAET,SAAK,cAAc;AAAA,EACpB;AAAA,EA5BA,QAAiB,UAAU,IAAY;AAAA,EAIvC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAIA;AAAA,EACA;AAAA;AAAA,EAGA,yBAAmC,CAAC;AAAA;AAAA,EAEpC,yBAAmC,CAAC;AAQrC;AAIO,MAAM,YAGH,SAA2B;AAAA,EACpC,QAA0B,UAAU,IAAY;AAAA,EAGvB,eAAe;AAAA,EAE/B;AAAA,EAET,YACC,QACA,aACA,iBACA,QACC;AACD,UAAM,aAAa,eAAe;AAClC,SAAK,QAAQ,QAAQ;AACrB,SAAK,QAAQ,QAAQ;AACrB,QAAI,QAAQ,MAAM;AACjB,WAAK,iBAAkB,MAAM,QAAQ,OAAO,IAAI,IAC7C,OAAO,OACP,CAAC,OAAO,IAAI,GAAoC,IAAI,CAAC,OAAmC;AACzF,aAAK,iBAAiB,GAAG,EAAE,UAAU,OAAO,GAAG,EAAE,QAAQ,EAAE,SAAS,IAAoB;AACxF,aAAK,uBAAuB,KAAK,GAAG,EAAE,SAAS;AAC/C,eAAO,GAAG,EAAE;AAAA,MACb,CAAC;AAAA,IACH;AACA,QAAI,QAAQ,IAAI;AACf,WAAK,iBAAiB,MAAM,QAAQ,OAAO,EAAE,IAC1C,OAAO,KACP,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,OAAmC;AACtD,aAAK,iBAAiB,GAAG,EAAE,UAAU,OAAO,GAAG,EAAE,QAAQ,EAAE,SAAS,IAAoB;AACxF,aAAK,uBAAuB,KAAK,GAAG,EAAE,SAAS;AAC/C,eAAO,GAAG,EAAE;AAAA,MACb,CAAC;AAAA,IACH;AAEA,QAAI,KAAK,cAAc;AACtB,WAAK,UAAU;AAAA,QACd,SAAS,MAAM,QAAQ,QAAQ,IAAI,IAAI,OAAO,OAAO,QAAQ,OAAO,CAAC,OAAO,IAAI,IAAI,CAAC,GAAG,IAAI,CAC3F,MACI,EAAE,EAAE,OAAQ;AAAA,QACjB,SAAS,MAAM,QAAQ,QAAQ,EAAE,IAAI,OAAO,KAAK,QAAQ,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE,OAAQ;AAAA,MACxG;AAAA,IACD;AACA,SAAK,WAAY,QAAQ,YAAY;AAAA,EACtC;AACD;AAIO,MAAM,aAA8C,SAA2B;AAAA,EAMrF,YACC,QACA,aACA,iBACS,QACR;AACD,UAAM,aAAa,eAAe;AAFzB;AAGT,SAAK,QAAQ,QAAQ;AACrB,SAAK,QAAQ,QAAQ;AACrB,QAAI,QAAQ,MAAM;AACjB,WAAK,iBAAkB,MAAM,QAAQ,OAAO,IAAI,IAC7C,OAAO,OACP,CAAC,OAAO,IAAI,GAAoC,IAAI,CAAC,OAAmC;AACzF,aAAK,iBAAiB,GAAG,EAAE,UAAU,OAAO,GAAG,EAAE,QAAQ,EAAE,SAAS,IAAoB;AACxF,aAAK,uBAAuB,KAAK,GAAG,EAAE,SAAS;AAC/C,eAAO,GAAG,EAAE;AAAA,MACb,CAAC;AAAA,IACH;AACA,QAAI,QAAQ,IAAI;AACf,WAAK,iBAAiB,MAAM,QAAQ,OAAO,EAAE,IAC1C,OAAO,KACP,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,OAAmC;AACtD,aAAK,iBAAiB,GAAG,EAAE,UAAU,OAAO,GAAG,EAAE,QAAQ,EAAE,SAAS,IAAoB;AACxF,aAAK,uBAAuB,KAAK,GAAG,EAAE,SAAS;AAC/C,eAAO,GAAG,EAAE;AAAA,MACb,CAAC;AAAA,IACH;AACA,QAAI,KAAK,cAAc;AACtB,WAAK,UAAU;AAAA,QACd,SAAS,MAAM,QAAQ,QAAQ,IAAI,IAAI,OAAO,OAAO,QAAQ,OAAO,CAAC,OAAO,IAAI,IAAI,CAAC,GAAG,IAAI,CAC3F,MACI,EAAE,EAAE,OAAQ;AAAA,QACjB,SAAS,MAAM,QAAQ,QAAQ,EAAE,IAAI,OAAO,KAAK,QAAQ,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE,OAAQ;AAAA,MACxG;AAAA,IACD;AAAA,EACD;AAAA,EAxCA,QAA0B,UAAU,IAAY;AAAA,EAGvB,eAAe;AAsCzC;AAIO,MAAe,gBAAsD;AAAA,EAC3E,QAAiB,UAAU,IAAY;AAAA,EAQ7B;AAAA,EAEV,QAAQ,OAAoB;AAC3B,SAAK,QAAQ;AAEb,WAAO;AAAA,EACR;AAGD;AAEO,MAAM,cAAc,gBAAwB;AAAA,EAClD,QAA0B,UAAU,IAAY;AAAA,EAIxC;AAAA,EAER,SAAsB;AACrB,QAAI,CAAC,KAAK,OAAO;AAChB,UAAI,CAAC,KAAK,MAAO,OAAM,IAAI,MAAM,mDAAmD;AACpF,WAAK,QAAQ,yBAAyB,IAAI,WAAW,GAAG,CAAC,SAAS,mBAAmB,KAAK,KAAK,CAAC,GAC9F,QAAQ,MAAM;AAAA,IACjB;AAEA,WAAO,KAAK;AAAA,EACb;AACD;AAIO,MAAM,YAAY;AAAA,EACxB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACD;AAIO,MAAM,mBAAmB;AAAA,EAC/B;AAAA,EACA;AAAA,EACA;AACD;AAIO,SAAS,sBAAwC;AACvD,SAAO;AACR;AAkPO,SAAS,iBACf,KACA,2BACA,iBAA8C,CAAC,UAAU,OAEzD,YAAqB,OAErB,oBAA6B,OAC7B,MAC0B;AAC1B,aACO,iBAAiB,2BACtB;AACD,QAAI,cAAc,WAAW;AAC5B,YAAM,cAAc,GAAG,OAAO,GAAG,IAAI,MAAM,EAAE,GAAG,cAAc,GAAG;AAEjE,UAAI,IAAI,cAAc,GAAG,MAAM,KAAM;AAErC,UAAI,WAAW;AACd,YAAI,cAAc,GAAG,IAAI,KAAK,MAAM,IAAI,cAAc,GAAG,CAAW;AACpE,YAAI,IAAI,cAAc,GAAG,MAAM,KAAM;AAAA,MACtC;AACA,UAAI,qBAAqB,OAAO,IAAI,cAAc,GAAG,MAAM,UAAU;AACpE,YAAI,cAAc,GAAG,IAAI,KAAK,MAAM,IAAI,cAAc,GAAG,CAAW;AAAA,MACrE;AAEA,UAAI,cAAc,SAAS;AAC1B,mBAAW,QAAS,IAAI,cAAc,GAAG,GAAsC;AAC9E;AAAA,YACC;AAAA,YACA,cAAc;AAAA,YACd;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACD;AAAA,QACD;AAEA;AAAA,MACD;AAEA;AAAA,QACC,IAAI,cAAc,GAAG;AAAA,QACrB,cAAc;AAAA,QACd;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACD;AAEA;AAAA,IACD;AAEA,UAAM,QAAQ,cAAc;AAC5B,UAAM,QAAQ,eAAe,IAAI,cAAc,GAAG,CAAC;AACnD,QAAI,UAAU,KAAM;AAEpB,QAAI;AACJ,QAAI,GAAG,OAAO,MAAM,GAAG;AACtB,gBAAU;AAAA,IACX,WAAW,GAAG,OAAO,GAAG,GAAG;AAC1B,gBAAU,MAAM;AAAA,IACjB,WAAW,GAAG,OAAO,IAAI,OAAO,GAAG;AAClC,gBAAU,MAAM,IAAI;AAAA,IACrB,WAAW,GAAG,OAAO,KAAK,KAAK,GAAG,OAAO,IAAI,GAAG;AAC/C,gBAAU;AAAA,IACX,OAAO;AACN,gBAAU,MAAM,OAAO,EAAE;AAAA,IAC1B;AAEA,QAAI,cAAc,GAAG,IAAI,sBAAsB,UACb,QAAQ,iBAAkB,KAAK,IAC9D,QAAQ,mBAAmB,KAAK;AAAA,EACpC;AAEA,SAAO;AACR;AAEO,MAAM,sBAA0D;AAAA,EACtE,QAAiB,UAAU,IAAY;AAAA,EAEpB;AAAA,EAKnB,YAAY,OAAoB,MAAkB;AACjD,SAAK,IAAI;AAAA,MACR;AAAA,MACA;AAAA,IACD;AAAA,EACD;AACD;AAiBO,MAAM,uBAEuC;AAAA,EACnD,QAAiB,UAAU,IAAY;AAAA,EAE9B;AAAA,EAMT,YACC,QACA,WACA,KACC;AACD,SAAK,IAAI;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,IACD;AAAA,EACD;AAAA,EAEA,QAAQ,QAA4E;AACnF,WAAO,IAAI;AAAA,MACV,KAAK,EAAE;AAAA,MACP,KAAK,EAAE;AAAA,MACP,KAAK,EAAE;AAAA,MACP;AAAA,IACD;AAAA,EACD;AACD;AAEO,MAAM,+BAEuC;AAAA,EACnD,QAAiB,UAAU,IAAY;AAAA,EAE9B;AAAA,EAOT,YACC,QACA,WACA,KACA,SACC;AACD,SAAK,IAAI;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACD;AAAA,EACD;AACD;AAwJO,MAAM,sBAA8C;AAAA,EAC1D,QAAiB,UAAU,IAAY;AAAA;AAAA,EAGtB;AAAA,EAIjB,YAAY,QAAiB;AAC5B,SAAK,IAAI;AAAA,MACR;AAAA,IACD;AAEA,UAAM,MAAsD,CAAC;AAC7D,UAAM,OAAwD,CAAC;AAE/D,eAAW,CAAC,WAAW,KAAK,KAAK,OAAO,QAAQ,MAAM,GAAG;AACxD,UAAI,SAAS,IAAI,CAAC,WAAW;AAC5B,eAAO,IAAI,IAAI,QAAQ,OAAO,WAAW,MAAiC;AAAA,MAC3E;AAEA,WAAK,SAAS,IAAI,CAAC,WAAW;AAC7B,eAAO,IAAI,KAAK,QAAQ,OAAO,WAAW,MAAuB;AAAA,MAClE;AAAA,IACD;AAEA,SAAK,MAAM;AACX,SAAK,OAAO;AAAA,EACb;AAAA,EAEA;AAAA,EAKA;AAAA;AAAA,EAMA,OAAO;AAAA,IACN,QAAe;AACd,aAAO,IAAI,MAAM;AAAA,IAClB;AAAA,EACD;AACD;AAuCO,SAAS,sBAEd,QAA4C;AAC7C,QAAM,eAAe,IAAI,sBAAsB,MAAM;AACrD,QAAM,kBAAkB,OAAO,QAAQ,MAAM,EAAE,OAA8C,CAAC,KAAK,CAAC,MAAM,KAAK,MAAM;AACpH,UAAM,SAAS,IAAI,sBAAsB,OAAO,IAAI;AACpD,UAAM,UAAU,OAAO,QAAQ,MAAM,YAAY,CAAC,EAAE;AAAA,MAGnD,CAACA,MAAK,CAAC,MAAM,MAAM,MAAM;AACxB,cAAM,WAAW,IAAI,uBAAuB,QAAsB,MAAM,IAAI;AAC5E,QAAAA,KAAI,IAAI,IAAI;AACZ,eAAOA;AAAA,MACR;AAAA,MACA,CAAC;AAAA,IACF;AAEA,QAAI,IAAI,IAAI,OAAO,OAAO,QAAQ,OAAO;AAEzC,WAAO;AAAA,EACR,GAAG,CAAC,CAAC;AAEL,SAAO,OAAO,OAAO,cAAc,eAAe;AACnD;AAEO,SAAS,wBACf,QACmC;AACnC,SAAO,OAAO;AAAA,IACb,OAAO,QAAQ,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,CAAC,MAAM,GAAG,GAAG,KAAK,KAAK,GAAG,GAAG,IAAI,CAAC;AAAA,EACtE;AACD;AAoBO,SAAS,gBACf,QACA,WACyB;AACzB,QAAM,SAAS,wBAAwB,MAAM;AAC7C,QAAM,SAAS,YACZ;AAAA,IACD,sBAAsB,MAAM;AAAA,EAC7B,IACE,CAAC;AAEJ,SAAO,eAAe,QAAQ,MAAM;AACrC;AAkBO,SAAS,oBACf,QACA,WACyB;AACzB,QAAM,SAAS,wBAAwB,MAAM;AAC7C,QAAM,SAAS,YACZ;AAAA,IACD,sBAAsB,MAAM;AAAA,EAC7B,IACE,OAAO,YAAY,OAAO,KAAK,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AAE7D,SAAO,oBAAoB,QAAQ,MAAM;AAC1C;AAoBO,SAAS,oBAAoB,OAAoB,QAAgB;AACvE,QAAM,QAAQ,MAAM,YAAY,EAAE,MAAM;AAExC,SAAO,QACJ,GAAG,OAAO,MAAM,IACf,QACA,GAAG,OAAO,IAAI,OAAO,IACrB,MAAM,KAAK,IAAI,IAAI,WAAW,MAAM,UAAU,CAAC,KAC/C,MAAM,KAAK,IAAI,IAAI,WAAW,MAAM,CAAC,KACtC,MAAM,KAAK,IAAI,IAAI,WAAW,MAAM,CAAC;AACzC;AAEA,SAAS,0BAA0B,QAAoB,QAAwD;AAC9G,MAAI,OAAO,WAAW,YAAY,GAAG,QAAQ,WAAW,EAAG,QAAO,GAAG,QAAQ,MAAM;AAEnF,QAAM,UAAU,OAAO,QAAQ,MAAgD;AAC/E,MAAI,CAAC,QAAQ,OAAQ,QAAO;AAE5B,QAAM,QAAiB,CAAC;AACxB,aAAW,CAAC,QAAQ,KAAK,KAAK,SAAS;AACtC,QAAI,UAAU,OAAW;AAEzB,YAAQ,QAAwD;AAAA,MAC/D,KAAK,OAAO;AACX,cAAM,MAAM,0BAA0B,QAAQ,KAAsC;AACpF,YAAI,CAAC,IAAK;AAEV,cAAM,KAAK,IAAI,GAAG,CAAC;AAEnB;AAAA,MACD;AAAA,MAEA,KAAK,MAAM;AACV,YAAI,CAAE,MAA0C,OAAQ;AAExD,cAAM;AAAA,UACL;AAAA,YACC,GAAI,MAA+B,IAAI,CAAC,cAAc,0BAA0B,QAAQ,SAAS,CAAC;AAAA,UACnG;AAAA,QACD;AAEA;AAAA,MACD;AAAA,MAEA,KAAK,OAAO;AACX,YAAI,CAAE,MAA0C,OAAQ;AAExD,cAAM;AAAA,UACL;AAAA,YACC,GAAI,MAA+B,IAAI,CAAC,cAAc,0BAA0B,QAAQ,SAAS,CAAC;AAAA,UACnG;AAAA,QACD;AAEA;AAAA,MACD;AAAA,MAEA,KAAK;AAAA,MACL,KAAK,UAAU;AACd,YAAI,CAAC,MAAO;AAEZ,cAAM,KAAK,UAAU,MAAgC,EAAE,MAAM,CAAC;AAE9D;AAAA,MACD;AAAA,MAEA,KAAK,MAAM;AACV,cAAM,KAAK,UAAU,QAAQ,QAAQ,KAA4B,CAAC;AAElE;AAAA,MACD;AAAA,MAEA,KAAK,SAAS;AACb,cAAM,KAAK,UAAU,WAAW,QAAQ,KAA4B,CAAC;AAErE;AAAA,MACD;AAAA,MAEA,SAAS;AACR,cAAM;AAAA,UACJ,UAAU,MAAgC;AAAA,YAC1C;AAAA,YACA;AAAA,UACD;AAAA,QACD;AAEA;AAAA,MACD;AAAA,IACD;AAAA,EACD;AAEA,MAAI,CAAC,MAAM,OAAQ,QAAO;AAE1B,SAAO,IAAI,GAAG,KAAK;AACpB;AAcO,SAAS,qBACf,OACA,QACA,iBAAkC,CAAC,GACnC,kBAA0C,CAAC,GAC3C,QACA,QAAgB,GACE;AAClB,QAAM,UAAU,OAAO,QAAQ,MAAM;AACrC,MAAI,CAAC,QAAQ,OAAQ,QAAO;AAE5B,QAAM,QAAe,CAAC;AACtB,aAAW,CAAC,QAAQ,KAAK,KAAK,SAAS;AACtC,QAAI,UAAU,OAAW;AAEzB,YAAQ,QAAQ;AAAA,MACf,KAAK,OAAO;AACX,cAAM,YAAY,OAAO,UAAU,aAC/B,MAA0E,OAAc,SAAS,IACjG,MAAqB,OAAO;AAEhC,cAAM,KAAK,SAAS;AAEpB;AAAA,MACD;AAAA,MACA,KAAK,MAAM;AACV,YAAI,CAAE,OAA4C,OAAQ;AAE1D,cAAM;AAAA,UACL;AAAA,YACC,GAAI,MAA+B;AAAA,cAAI,CAAC,cACvC,qBAAqB,OAAO,WAAW,gBAAgB,iBAAiB,QAAS,KAAK;AAAA,YACvF;AAAA,UACD;AAAA,QACD;AAEA;AAAA,MACD;AAAA,MACA,KAAK,OAAO;AACX,YAAI,CAAE,OAA4C,OAAQ;AAE1D,cAAM;AAAA,UACL;AAAA,YACC,GAAI,MAA+B;AAAA,cAAI,CAAC,cACvC,qBAAqB,OAAO,WAAW,gBAAgB,iBAAiB,QAAS,KAAK;AAAA,YACvF;AAAA,UACD;AAAA,QACD;AAEA;AAAA,MACD;AAAA,MACA,KAAK,OAAO;AACX,YAAI,UAAU,OAAW;AAEzB,cAAM,QAAQ;AAAA,UACb;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACD;AACA,YAAI,CAAC,MAAO;AAEZ,cAAM,KAAK,IAAI,KAAK,CAAC;AAErB;AAAA,MACD;AAAA,MACA,SAAS;AACR,YAAI,MAAM,YAAY,EAAE,MAAM,GAAG;AAChC,gBAAM,SAAS,oBAAoB,OAAO,MAAM;AAEhD,gBAAM,YAAY;AAAA,YACjB;AAAA,YACA;AAAA,UACD;AACA,cAAI,UAAW,OAAM,KAAK,SAAS;AAEnC;AAAA,QACD;AAEA,cAAM,WAAW,eAAe,MAAM;AACtC,YAAI,CAAC,UAAU;AAEd,gBAAM,IAAI,aAAa;AAAA,YACtB,SAAS,qCAAqC,MAAM;AAAA,UACrD,CAAC;AAAA,QACF;AAEA,cAAM,cAAc,aAAa,SAAS,aAAa,IAAI,KAAK,EAAE;AAClE,cAAM,eAAe,SAAS,eAAe,aAAa,SAAS,cAAc,KAAK,KAAK,EAAE,IAAI;AACjG,cAAM,eAAe,gBAAgB,SAAS,eAAe;AAE7D,cAAM;AAAA,UACL,QAAQ;AAAA,UACR;AAAA,QACD,IAAI,cAAc,QAAS,UAAU,OAAO,aAAa,YAAY;AACrE,cAAM,YAAY,OAAO,UAAU,YAAY,SAAY;AAAA,UAC1D;AAAA,UACA;AAAA,UACA,aAAa;AAAA,UACb;AAAA,UACA;AAAA,UACA,QAAQ;AAAA,QACT;AACA,cAAMC,UAAS;AAAA,UACd;AAAA,UACA;AAAA,QACD;AAEA,cAAM,WAAW,eACd,qBAAqB,mBAAmB,WAAW,CAAC,eACrD,mBAAmB,YAAY,CAChC,OAAO,aAAa,GAAG,aAAaA,OAAM,GAAG,GAAGA,OAAM,CAAC,cACrD,qBAAqB,mBAAmB,WAAW,CAAC,GAAG,aAAaA,OAAM,GAAG,GAAGA,OAAM,CAAC;AAC1F,YAAIA,QAAQ,OAAM,MAAM,QAAQ,SAAS,WAAW,QAAQ,CAAC;AAAA,MAC9D;AAAA,IACD;AAAA,EACD;AAEA,SAAO,IAAI,GAAG,KAAK;AACpB;AAEO,SAAS,oBACf,OACA,QACkB;AAClB,MAAI,OAAO,WAAW,YAAY;AACjC,UAAM,OAAO,OAAO,OAAc,gBAAgB;AAElD,WAAO,GAAG,MAAM,GAAG,IAChB,OACA,MAAM,QAAQ,IAAI,IAClB,KAAK,SACJ,IAAI,KAAK,KAAK,IAAI,CAAC,MAAM,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,CAAC,CAAC,GAAG,OAAO,IAC1D,SACD,GAAG,MAAM,MAAM,IACf,IAAI,IAAI,IACR;AAAA,EACJ;AAEA,QAAM,UAAU,OAAO,QAAQ,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,KAAK,MAAM,KAAK;AACnE,MAAI,CAAC,QAAQ,OAAQ,QAAO;AAE5B,SAAO,IAAI;AAAA,IACV,QAAQ,IAAI,CAAC,CAAC,QAAQ,KAAK,OAAO,UAAU,QAAQ,MAAM,MAAM,oBAAoB,OAAO,MAAM,CAAC,CAAC;AAAA,IACnG;AAAA,EACD;AACD;AAEO,SAAS,oBACf,OACA,QACC;AACD,QAAM,aAAoB,CAAC;AAC3B,QAAM,YAAqD,CAAC;AAE5D,aACO,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,MAAM,GAC1C;AACD,QAAI,CAAC,MAAO;AACZ,UAAM,QAAQ,OAAO,UAAU,aAAa,MAAM,OAAc,EAAE,KAAK,UAAU,IAAI,CAAC,IAAI;AAE1F,UAAM,QAAQ,OAAO,MAAM,OAAO,CAAC,QAAQ,IAAI,WAAW,GAAG,CAAC;AAE9D,UAAM,UAAU,MAAM,OAAO,EAAE;AAE/B,eAAW,KAAK,KAAK;AACrB,cAAU,KAAK;AAAA,MACd;AAAA,MACA,OAAO;AAAA,IACR,CAAC;AAAA,EACF;AAEA,SAAO;AAAA,IACN,KAAK,WAAW,SAAS,IAAI,KAAK,YAAY,OAAO,IAAI;AAAA,IACzD;AAAA,EACD;AACD;AAOO,SAAS,cACf,QACA,UACA,aACA,aACA,cACuB;AACvB,MAAI,SAAS,SAAS;AACrB,UAAM,mBAAmB,SAAS,cAAc,IAAI,CAAC,GAAG,MAAM;AAC7D,YAAM,IAAI,SAAS,QAAS,OAAO,CAAC;AAEpC,aAAO;AAAA,QACN,MAAM,WAAW,IAAI,IAAI,WAAW,OAAO,gBAAgB,CAAC,CAAC,CAAC;AAAA,QAC9D,MAAM,YAAa,IAAI,IAAI,WAAW,GAAG,EAAE,EAAE,QAAQ,MAAM,IAAI,OAAO,gBAAgB,EAAE,EAAE,MAAM,IAAI,EAAE,EAAE,GAAG,CAAC;AAAA,MAC7G;AAAA,IACD,CAAC;AAED,UAAM,mBAAmB,SAAS,cAAc,IAAI,CAAC,GAAG,MAAM;AAC7D,YAAM,IAAI,SAAS,QAAS,OAAO,CAAC;AAEpC,aAAO;AAAA,QACN,MAAM,YAAa,IAAI,IAAI,WAAW,GAAG,EAAE,EAAE,QAAQ,MAAM,IAAI,OAAO,gBAAgB,EAAE,EAAE,MAAM,IAAI,EAAE,EAAE,GAAG,CAAC;AAAA,QAC5G,MAAM,WAAW,IAAI,IAAI,WAAW,OAAO,gBAAgB,CAAC,CAAC,CAAC;AAAA,MAC/D;AAAA,IACD,CAAC;AAED,WAAO;AAAA,MACN,QAAQ;AAAA,QACP,SAAS,QACN,qBAAqB,SAAS,aAAa,cAAc,aAAa,SAAS,KAAK,IACpF;AAAA,QACH,GAAG;AAAA,MACJ;AAAA,MACA,eAAe,IAAI,GAAG,gBAAgB;AAAA,IACvC;AAAA,EACD;AAEA,QAAM,cAAc,SAAS,cAAc,IAAI,CAAC,GAAG,MAAM;AACxD,UAAM,IAAI,SAAS,cAAc,CAAC;AAElC,WAAO;AAAA,MACN,MAAM,WAAW,IAAI,IAAI,WAAW,OAAO,gBAAgB,CAAC,CAAC,CAAC;AAAA,MAC9D,MAAM,WAAW,IAAI,IAAI,WAAW,OAAO,gBAAgB,CAAC,CAAC,CAAC;AAAA,IAC/D;AAAA,EACD,CAAC;AAED,QAAM,YAAY;AAAA,IACjB,GAAG;AAAA,IACH,SAAS,QACN,qBAAqB,SAAS,aAAa,cAAc,aAAa,SAAS,KAAK,IACpF;AAAA,EACJ;AAEA,SAAO,EAAE,QAAQ,UAAU;AAC5B;AAEO,SAAS,mBAAmB,OAAoB;AACtD,SAAO,MACN,MAAM,OAAO,IACV,MAAM,MAAM,IAAI,WAAW,MAAM,WAAW,KAAK,EAAE,CAAC,IAAI,GAAG,MAAM,WAAW,CAAC,CAAC,GAC/E,IAAI,WAAW,MAAM,YAAY,CAAC,CACnC,OAAO,KAAK,KACV,KACJ;AACD;","names":["acc","filter"]}
|
package/sql/sql.cjs
CHANGED
|
@@ -462,9 +462,6 @@ class View {
|
|
|
462
462
|
isAlias: false
|
|
463
463
|
};
|
|
464
464
|
}
|
|
465
|
-
getSQL() {
|
|
466
|
-
return new SQL([this]);
|
|
467
|
-
}
|
|
468
465
|
}
|
|
469
466
|
function isView(view) {
|
|
470
467
|
return typeof view === "object" && view !== null && IsDrizzleView in view;
|
|
@@ -475,9 +472,6 @@ function getViewName(view) {
|
|
|
475
472
|
import_column.Column.prototype.getSQL = function() {
|
|
476
473
|
return new SQL([this]);
|
|
477
474
|
};
|
|
478
|
-
import_table.Table.prototype.getSQL = function() {
|
|
479
|
-
return new SQL([this]);
|
|
480
|
-
};
|
|
481
475
|
import_subquery.Subquery.prototype.getSQL = function() {
|
|
482
476
|
return new SQL([this]);
|
|
483
477
|
};
|
package/sql/sql.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/sql/sql.ts"],"sourcesContent":["import type { CasingCache } from '~/casing.ts';\nimport { entityKind, is } from '~/entity.ts';\nimport { isPgEnum } from '~/pg-core/columns/enum.ts';\nimport type { SelectResult } from '~/query-builders/select.types.ts';\nimport { Subquery } from '~/subquery.ts';\nimport { TableName } from '~/table.utils.ts';\nimport { 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\tcasing: CasingCache;\n\tescapeName(name: string): string;\n\tescapeParam(num: number, value: unknown): string;\n\tescapeString(str: string): string;\n\tprepareTyping?: (encoder: DriverValueEncoder<unknown, unknown>) => QueryTypingsValue;\n\tparamStartIndex?: { value: number };\n\tinlineParams?: boolean;\n\tinvokeSource?: 'indexes' | 'mssql-check' | 'mssql-view-with-schemabinding' | undefined;\n}\n\nexport type QueryTypingsValue = 'json' | 'decimal' | 'time' | 'timestamp' | 'uuid' | 'date' | 'none';\n\nexport interface Query {\n\tsql: string;\n\tparams: unknown[];\n}\n\nexport interface QueryWithTypings extends Query {\n\ttypings?: QueryTypingsValue[];\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\nfunction mergeQueries(queries: QueryWithTypings[]): QueryWithTypings {\n\tconst result: QueryWithTypings = { sql: '', params: [] };\n\tfor (const query of queries) {\n\t\tresult.sql += query.sql;\n\t\tresult.params.push(...query.params);\n\t\tif (query.typings?.length) {\n\t\t\tif (!result.typings) {\n\t\t\t\tresult.typings = [];\n\t\t\t}\n\t\t\tresult.typings.push(...query.typings);\n\t\t}\n\t}\n\treturn result;\n}\n\nexport class StringChunk implements SQLWrapper {\n\tstatic readonly [entityKind]: string = 'StringChunk';\n\n\treadonly value: string[];\n\n\tconstructor(value: string | string[]) {\n\t\tthis.value = Array.isArray(value) ? value : [value];\n\t}\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\tprivate shouldInlineParams = false;\n\n\t/** @internal */\n\tusedTables: string[] = [];\n\n\tconstructor(readonly queryChunks: SQLChunk[]) {\n\t\tfor (const chunk of queryChunks) {\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}\n\n\tappend(query: SQL): this {\n\t\tthis.queryChunks.push(...query.queryChunks);\n\t\treturn this;\n\t}\n\n\ttoQuery(config: BuildQueryConfig): QueryWithTypings {\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 config = Object.assign({}, _config, {\n\t\t\tinlineParams: _config.inlineParams || this.shouldInlineParams,\n\t\t\tparamStartIndex: _config.paramStartIndex || { value: 0 },\n\t\t});\n\n\t\tconst {\n\t\t\tcasing,\n\t\t\tescapeName,\n\t\t\tescapeParam,\n\t\t\tprepareTyping,\n\t\t\tinlineParams,\n\t\t\tparamStartIndex,\n\t\t\tinvokeSource,\n\t\t} = config;\n\n\t\treturn mergeQueries(chunks.map((chunk): QueryWithTypings => {\n\t\t\tif (is(chunk, StringChunk)) {\n\t\t\t\treturn { sql: chunk.value.join(''), params: [] };\n\t\t\t}\n\n\t\t\tif (is(chunk, Name)) {\n\t\t\t\treturn { sql: escapeName(chunk.value), params: [] };\n\t\t\t}\n\n\t\t\tif (chunk === undefined) {\n\t\t\t\treturn { sql: '', params: [] };\n\t\t\t}\n\n\t\t\tif (Array.isArray(chunk)) {\n\t\t\t\tconst result: SQLChunk[] = [new StringChunk('(')];\n\t\t\t\tfor (const [i, p] of chunk.entries()) {\n\t\t\t\t\tresult.push(p);\n\t\t\t\t\tif (i < chunk.length - 1) {\n\t\t\t\t\t\tresult.push(new StringChunk(', '));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tresult.push(new StringChunk(')'));\n\t\t\t\treturn this.buildQueryFromSourceParams(result, config);\n\t\t\t}\n\n\t\t\tif (is(chunk, SQL)) {\n\t\t\t\treturn this.buildQueryFromSourceParams(chunk.queryChunks, {\n\t\t\t\t\t...config,\n\t\t\t\t\tinlineParams: inlineParams || chunk.shouldInlineParams,\n\t\t\t\t});\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\treturn {\n\t\t\t\t\t\tsql: (schemaName === undefined ? escapeName('dbo') : escapeName(schemaName)) + '.'\n\t\t\t\t\t\t\t+ escapeName(tableName),\n\t\t\t\t\t\tparams: [],\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\treturn {\n\t\t\t\t\tsql: schemaName === 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\tparams: [],\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tif (is(chunk, Column)) {\n\t\t\t\tconst columnName = casing.getColumnCasing(chunk);\n\t\t\t\tif (_config.invokeSource === 'indexes') {\n\t\t\t\t\treturn { sql: escapeName(columnName), params: [] };\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\treturn {\n\t\t\t\t\tsql: 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\tparams: [],\n\t\t\t\t};\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\treturn {\n\t\t\t\t\tsql: schemaName === 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\tparams: [],\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tif (is(chunk, Param)) {\n\t\t\t\tif (is(chunk.value, Placeholder)) {\n\t\t\t\t\treturn { sql: escapeParam(paramStartIndex.value++, chunk), params: [chunk], typings: ['none'] };\n\t\t\t\t}\n\n\t\t\t\tconst mappedValue = chunk.value === null ? null : chunk.encoder.mapToDriverValue(chunk.value);\n\n\t\t\t\tif (is(mappedValue, SQL)) {\n\t\t\t\t\treturn this.buildQueryFromSourceParams([mappedValue], config);\n\t\t\t\t}\n\n\t\t\t\tif (inlineParams) {\n\t\t\t\t\treturn { sql: this.mapInlineParam(mappedValue, config), params: [] };\n\t\t\t\t}\n\n\t\t\t\tlet typings: QueryTypingsValue[] = ['none'];\n\t\t\t\tif (prepareTyping) {\n\t\t\t\t\ttypings = [prepareTyping(chunk.encoder)];\n\t\t\t\t}\n\n\t\t\t\treturn { sql: escapeParam(paramStartIndex.value++, mappedValue), params: [mappedValue], typings };\n\t\t\t}\n\n\t\t\tif (is(chunk, Placeholder)) {\n\t\t\t\treturn { sql: escapeParam(paramStartIndex.value++, chunk), params: [chunk], typings: ['none'] };\n\t\t\t}\n\n\t\t\tif (is(chunk, SQL.Aliased) && chunk.fieldAlias !== undefined) {\n\t\t\t\treturn { sql: escapeName(chunk.fieldAlias), params: [] };\n\t\t\t}\n\n\t\t\tif (is(chunk, Subquery)) {\n\t\t\t\tif (chunk._.isWith) {\n\t\t\t\t\treturn { sql: escapeName(chunk._.alias), params: [] };\n\t\t\t\t}\n\t\t\t\treturn this.buildQueryFromSourceParams([\n\t\t\t\t\tnew StringChunk('('),\n\t\t\t\t\tchunk._.sql,\n\t\t\t\t\tnew StringChunk(') '),\n\t\t\t\t\tnew Name(chunk._.alias),\n\t\t\t\t], config);\n\t\t\t}\n\n\t\t\tif (isPgEnum(chunk)) {\n\t\t\t\tif (chunk.schema) {\n\t\t\t\t\treturn { sql: escapeName(chunk.schema) + '.' + escapeName(chunk.enumName), params: [] };\n\t\t\t\t}\n\t\t\t\treturn { sql: escapeName(chunk.enumName), params: [] };\n\t\t\t}\n\n\t\t\tif (isSQLWrapper(chunk)) {\n\t\t\t\tif (chunk.shouldOmitSQLParens?.()) {\n\t\t\t\t\treturn this.buildQueryFromSourceParams([chunk.getSQL()], config);\n\t\t\t\t}\n\t\t\t\treturn this.buildQueryFromSourceParams([\n\t\t\t\t\tnew StringChunk('('),\n\t\t\t\t\tchunk.getSQL(),\n\t\t\t\t\tnew StringChunk(')'),\n\t\t\t\t], config);\n\t\t\t}\n\n\t\t\tif (inlineParams) {\n\t\t\t\treturn { sql: this.mapInlineParam(chunk, config), params: [] };\n\t\t\t}\n\n\t\t\treturn { sql: escapeParam(paramStartIndex.value++, chunk), params: [chunk], typings: ['none'] };\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, any>\n\t\t\t| DriverValueDecoder<any, any>['mapFromDriverValue'],\n\t>(decoder: TDecoder): SQL<GetDecoderResult<TDecoder>> {\n\t\tthis.decoder = typeof decoder === 'function' ? { mapFromDriverValue: decoder } : decoder;\n\t\treturn this as SQL<GetDecoderResult<TDecoder>>;\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 DriverValueDecoder<TData, TDriverParam> {\n\tmapFromDriverValue(value: TDriverParam): TData;\n}\n\nexport interface DriverValueEncoder<TData, TDriverParam> {\n\tmapToDriverValue(value: TData): TDriverParam | SQL;\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\nexport const noopEncoder: DriverValueEncoder<any, any> = {\n\tmapToDriverValue: (value) => value,\n};\n\nexport interface DriverValueMapper<TData, TDriverParam>\n\textends DriverValueDecoder<TData, TDriverParam>, DriverValueEncoder<TData, TDriverParam>\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 = unknown, 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,\n\t\treadonly encoder: DriverValueEncoder<TDataType, TDriverParamType> = noopEncoder,\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 queryChunks: SQLChunk[] = [];\n\tif (params.length > 0 || (strings.length > 0 && strings[0] !== '')) {\n\t\tqueryChunks.push(new StringChunk(strings[0]!));\n\t}\n\tfor (const [paramIndex, param] of params.entries()) {\n\t\tqueryChunks.push(param, new StringChunk(strings[paramIndex + 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 result: SQLChunk[] = [];\n\t\tfor (const [i, chunk] of chunks.entries()) {\n\t\t\tif (i > 0 && separator !== undefined) {\n\t\t\t\tresult.push(separator);\n\t\t\t}\n\t\t\tresult.push(chunk);\n\t\t}\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,\n\t\tencoder?: DriverValueEncoder<TData, TDriver>,\n\t): Param<TData, TDriver> {\n\t\treturn new Param(value, encoder);\n\t}\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\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\treturn p.encoder.mapToDriverValue(values[p.value.name]);\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> implements SQLWrapper {\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\tgetSQL(): SQL<unknown> {\n\t\treturn new SQL([this]);\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\n// Defined separately from the Table class to resolve circular dependency\nTable.prototype.getSQL = function() {\n\treturn new SQL([this]);\n};\n\n// Defined separately from the Column class to resolve circular dependency\nSubquery.prototype.getSQL = function() {\n\treturn new SQL([this]);\n};\n"],"mappings":"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","names":["param","sql","placeholder","name","SQL"]}
|
|
1
|
+
{"version":3,"sources":["../../src/sql/sql.ts"],"sourcesContent":["import type { CasingCache } from '~/casing.ts';\nimport { entityKind, is } from '~/entity.ts';\nimport { isPgEnum } from '~/pg-core/columns/enum.ts';\nimport type { SelectResult } from '~/query-builders/select.types.ts';\nimport { Subquery } from '~/subquery.ts';\nimport { TableName } from '~/table.utils.ts';\nimport { 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\tcasing: CasingCache;\n\tescapeName(name: string): string;\n\tescapeParam(num: number, value: unknown): string;\n\tescapeString(str: string): string;\n\tprepareTyping?: (encoder: DriverValueEncoder<unknown, unknown>) => QueryTypingsValue;\n\tparamStartIndex?: { value: number };\n\tinlineParams?: boolean;\n\tinvokeSource?: 'indexes' | 'mssql-check' | 'mssql-view-with-schemabinding' | undefined;\n}\n\nexport type QueryTypingsValue = 'json' | 'decimal' | 'time' | 'timestamp' | 'uuid' | 'date' | 'none';\n\nexport interface Query {\n\tsql: string;\n\tparams: unknown[];\n}\n\nexport interface QueryWithTypings extends Query {\n\ttypings?: QueryTypingsValue[];\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\nfunction mergeQueries(queries: QueryWithTypings[]): QueryWithTypings {\n\tconst result: QueryWithTypings = { sql: '', params: [] };\n\tfor (const query of queries) {\n\t\tresult.sql += query.sql;\n\t\tresult.params.push(...query.params);\n\t\tif (query.typings?.length) {\n\t\t\tif (!result.typings) {\n\t\t\t\tresult.typings = [];\n\t\t\t}\n\t\t\tresult.typings.push(...query.typings);\n\t\t}\n\t}\n\treturn result;\n}\n\nexport class StringChunk implements SQLWrapper {\n\tstatic readonly [entityKind]: string = 'StringChunk';\n\n\treadonly value: string[];\n\n\tconstructor(value: string | string[]) {\n\t\tthis.value = Array.isArray(value) ? value : [value];\n\t}\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\tprivate shouldInlineParams = false;\n\n\t/** @internal */\n\tusedTables: string[] = [];\n\n\tconstructor(readonly queryChunks: SQLChunk[]) {\n\t\tfor (const chunk of queryChunks) {\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}\n\n\tappend(query: SQL): this {\n\t\tthis.queryChunks.push(...query.queryChunks);\n\t\treturn this;\n\t}\n\n\ttoQuery(config: BuildQueryConfig): QueryWithTypings {\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 config = Object.assign({}, _config, {\n\t\t\tinlineParams: _config.inlineParams || this.shouldInlineParams,\n\t\t\tparamStartIndex: _config.paramStartIndex || { value: 0 },\n\t\t});\n\n\t\tconst {\n\t\t\tcasing,\n\t\t\tescapeName,\n\t\t\tescapeParam,\n\t\t\tprepareTyping,\n\t\t\tinlineParams,\n\t\t\tparamStartIndex,\n\t\t\tinvokeSource,\n\t\t} = config;\n\n\t\treturn mergeQueries(chunks.map((chunk): QueryWithTypings => {\n\t\t\tif (is(chunk, StringChunk)) {\n\t\t\t\treturn { sql: chunk.value.join(''), params: [] };\n\t\t\t}\n\n\t\t\tif (is(chunk, Name)) {\n\t\t\t\treturn { sql: escapeName(chunk.value), params: [] };\n\t\t\t}\n\n\t\t\tif (chunk === undefined) {\n\t\t\t\treturn { sql: '', params: [] };\n\t\t\t}\n\n\t\t\tif (Array.isArray(chunk)) {\n\t\t\t\tconst result: SQLChunk[] = [new StringChunk('(')];\n\t\t\t\tfor (const [i, p] of chunk.entries()) {\n\t\t\t\t\tresult.push(p);\n\t\t\t\t\tif (i < chunk.length - 1) {\n\t\t\t\t\t\tresult.push(new StringChunk(', '));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tresult.push(new StringChunk(')'));\n\t\t\t\treturn this.buildQueryFromSourceParams(result, config);\n\t\t\t}\n\n\t\t\tif (is(chunk, SQL)) {\n\t\t\t\treturn this.buildQueryFromSourceParams(chunk.queryChunks, {\n\t\t\t\t\t...config,\n\t\t\t\t\tinlineParams: inlineParams || chunk.shouldInlineParams,\n\t\t\t\t});\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\treturn {\n\t\t\t\t\t\tsql: (schemaName === undefined ? escapeName('dbo') : escapeName(schemaName)) + '.'\n\t\t\t\t\t\t\t+ escapeName(tableName),\n\t\t\t\t\t\tparams: [],\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\treturn {\n\t\t\t\t\tsql: schemaName === 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\tparams: [],\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tif (is(chunk, Column)) {\n\t\t\t\tconst columnName = casing.getColumnCasing(chunk);\n\t\t\t\tif (_config.invokeSource === 'indexes') {\n\t\t\t\t\treturn { sql: escapeName(columnName), params: [] };\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\treturn {\n\t\t\t\t\tsql: 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\tparams: [],\n\t\t\t\t};\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\treturn {\n\t\t\t\t\tsql: schemaName === 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\tparams: [],\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tif (is(chunk, Param)) {\n\t\t\t\tif (is(chunk.value, Placeholder)) {\n\t\t\t\t\treturn { sql: escapeParam(paramStartIndex.value++, chunk), params: [chunk], typings: ['none'] };\n\t\t\t\t}\n\n\t\t\t\tconst mappedValue = chunk.value === null ? null : chunk.encoder.mapToDriverValue(chunk.value);\n\n\t\t\t\tif (is(mappedValue, SQL)) {\n\t\t\t\t\treturn this.buildQueryFromSourceParams([mappedValue], config);\n\t\t\t\t}\n\n\t\t\t\tif (inlineParams) {\n\t\t\t\t\treturn { sql: this.mapInlineParam(mappedValue, config), params: [] };\n\t\t\t\t}\n\n\t\t\t\tlet typings: QueryTypingsValue[] = ['none'];\n\t\t\t\tif (prepareTyping) {\n\t\t\t\t\ttypings = [prepareTyping(chunk.encoder)];\n\t\t\t\t}\n\n\t\t\t\treturn { sql: escapeParam(paramStartIndex.value++, mappedValue), params: [mappedValue], typings };\n\t\t\t}\n\n\t\t\tif (is(chunk, Placeholder)) {\n\t\t\t\treturn { sql: escapeParam(paramStartIndex.value++, chunk), params: [chunk], typings: ['none'] };\n\t\t\t}\n\n\t\t\tif (is(chunk, SQL.Aliased) && chunk.fieldAlias !== undefined) {\n\t\t\t\treturn { sql: escapeName(chunk.fieldAlias), params: [] };\n\t\t\t}\n\n\t\t\tif (is(chunk, Subquery)) {\n\t\t\t\tif (chunk._.isWith) {\n\t\t\t\t\treturn { sql: escapeName(chunk._.alias), params: [] };\n\t\t\t\t}\n\t\t\t\treturn this.buildQueryFromSourceParams([\n\t\t\t\t\tnew StringChunk('('),\n\t\t\t\t\tchunk._.sql,\n\t\t\t\t\tnew StringChunk(') '),\n\t\t\t\t\tnew Name(chunk._.alias),\n\t\t\t\t], config);\n\t\t\t}\n\n\t\t\tif (isPgEnum(chunk)) {\n\t\t\t\tif (chunk.schema) {\n\t\t\t\t\treturn { sql: escapeName(chunk.schema) + '.' + escapeName(chunk.enumName), params: [] };\n\t\t\t\t}\n\t\t\t\treturn { sql: escapeName(chunk.enumName), params: [] };\n\t\t\t}\n\n\t\t\tif (isSQLWrapper(chunk)) {\n\t\t\t\tif (chunk.shouldOmitSQLParens?.()) {\n\t\t\t\t\treturn this.buildQueryFromSourceParams([chunk.getSQL()], config);\n\t\t\t\t}\n\t\t\t\treturn this.buildQueryFromSourceParams([\n\t\t\t\t\tnew StringChunk('('),\n\t\t\t\t\tchunk.getSQL(),\n\t\t\t\t\tnew StringChunk(')'),\n\t\t\t\t], config);\n\t\t\t}\n\n\t\t\tif (inlineParams) {\n\t\t\t\treturn { sql: this.mapInlineParam(chunk, config), params: [] };\n\t\t\t}\n\n\t\t\treturn { sql: escapeParam(paramStartIndex.value++, chunk), params: [chunk], typings: ['none'] };\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, any>\n\t\t\t| DriverValueDecoder<any, any>['mapFromDriverValue'],\n\t>(decoder: TDecoder): SQL<GetDecoderResult<TDecoder>> {\n\t\tthis.decoder = typeof decoder === 'function' ? { mapFromDriverValue: decoder } : decoder;\n\t\treturn this as SQL<GetDecoderResult<TDecoder>>;\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 DriverValueDecoder<TData, TDriverParam> {\n\tmapFromDriverValue(value: TDriverParam): TData;\n}\n\nexport interface DriverValueEncoder<TData, TDriverParam> {\n\tmapToDriverValue(value: TData): TDriverParam | SQL;\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\nexport const noopEncoder: DriverValueEncoder<any, any> = {\n\tmapToDriverValue: (value) => value,\n};\n\nexport interface DriverValueMapper<TData, TDriverParam>\n\textends DriverValueDecoder<TData, TDriverParam>, DriverValueEncoder<TData, TDriverParam>\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 = unknown, 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,\n\t\treadonly encoder: DriverValueEncoder<TDataType, TDriverParamType> = noopEncoder,\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 queryChunks: SQLChunk[] = [];\n\tif (params.length > 0 || (strings.length > 0 && strings[0] !== '')) {\n\t\tqueryChunks.push(new StringChunk(strings[0]!));\n\t}\n\tfor (const [paramIndex, param] of params.entries()) {\n\t\tqueryChunks.push(param, new StringChunk(strings[paramIndex + 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 result: SQLChunk[] = [];\n\t\tfor (const [i, chunk] of chunks.entries()) {\n\t\t\tif (i > 0 && separator !== undefined) {\n\t\t\t\tresult.push(separator);\n\t\t\t}\n\t\t\tresult.push(chunk);\n\t\t}\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,\n\t\tencoder?: DriverValueEncoder<TData, TDriver>,\n\t): Param<TData, TDriver> {\n\t\treturn new Param(value, encoder);\n\t}\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\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\treturn p.encoder.mapToDriverValue(values[p.value.name]);\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 Column 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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","names":["param","sql","placeholder","name","SQL"]}
|
package/sql/sql.d.cts
CHANGED
|
@@ -204,7 +204,7 @@ export declare class Placeholder<TName extends string = string, TValue = any> im
|
|
|
204
204
|
export declare function placeholder<TName extends string>(name: TName): Placeholder<TName>;
|
|
205
205
|
export declare function fillPlaceholders(params: unknown[], values: Record<string, unknown>): unknown[];
|
|
206
206
|
export type ColumnsSelection = Record<string, unknown>;
|
|
207
|
-
export declare abstract class View<TName extends string = string, TExisting extends boolean = boolean, TSelection extends ColumnsSelection = ColumnsSelection>
|
|
207
|
+
export declare abstract class View<TName extends string = string, TExisting extends boolean = boolean, TSelection extends ColumnsSelection = ColumnsSelection> {
|
|
208
208
|
static readonly [entityKind]: string;
|
|
209
209
|
_: {
|
|
210
210
|
brand: 'View';
|
|
@@ -220,7 +220,6 @@ export declare abstract class View<TName extends string = string, TExisting exte
|
|
|
220
220
|
selectedFields: ColumnsSelection;
|
|
221
221
|
query: SQL | undefined;
|
|
222
222
|
});
|
|
223
|
-
getSQL(): SQL<unknown>;
|
|
224
223
|
}
|
|
225
224
|
export declare function isView(view: unknown): view is View;
|
|
226
225
|
export declare function getViewName<T extends View>(view: T): T['_']['name'];
|
|
@@ -229,3 +228,4 @@ export type InferSelectViewModel<TView extends View> = Equal<TView['_']['selecte
|
|
|
229
228
|
}> extends true ? {
|
|
230
229
|
[x: string]: unknown;
|
|
231
230
|
} : SelectResult<TView['_']['selectedFields'], 'single', Record<TView['_']['name'], 'not-null'>>;
|
|
231
|
+
export type SQLEntity = SQL | SQLWrapper | SQL.Aliased | Table | View;
|
package/sql/sql.d.ts
CHANGED
|
@@ -204,7 +204,7 @@ export declare class Placeholder<TName extends string = string, TValue = any> im
|
|
|
204
204
|
export declare function placeholder<TName extends string>(name: TName): Placeholder<TName>;
|
|
205
205
|
export declare function fillPlaceholders(params: unknown[], values: Record<string, unknown>): unknown[];
|
|
206
206
|
export type ColumnsSelection = Record<string, unknown>;
|
|
207
|
-
export declare abstract class View<TName extends string = string, TExisting extends boolean = boolean, TSelection extends ColumnsSelection = ColumnsSelection>
|
|
207
|
+
export declare abstract class View<TName extends string = string, TExisting extends boolean = boolean, TSelection extends ColumnsSelection = ColumnsSelection> {
|
|
208
208
|
static readonly [entityKind]: string;
|
|
209
209
|
_: {
|
|
210
210
|
brand: 'View';
|
|
@@ -220,7 +220,6 @@ export declare abstract class View<TName extends string = string, TExisting exte
|
|
|
220
220
|
selectedFields: ColumnsSelection;
|
|
221
221
|
query: SQL | undefined;
|
|
222
222
|
});
|
|
223
|
-
getSQL(): SQL<unknown>;
|
|
224
223
|
}
|
|
225
224
|
export declare function isView(view: unknown): view is View;
|
|
226
225
|
export declare function getViewName<T extends View>(view: T): T['_']['name'];
|
|
@@ -229,3 +228,4 @@ export type InferSelectViewModel<TView extends View> = Equal<TView['_']['selecte
|
|
|
229
228
|
}> extends true ? {
|
|
230
229
|
[x: string]: unknown;
|
|
231
230
|
} : SelectResult<TView['_']['selectedFields'], 'single', Record<TView['_']['name'], 'not-null'>>;
|
|
231
|
+
export type SQLEntity = SQL | SQLWrapper | SQL.Aliased | Table | View;
|
package/sql/sql.js
CHANGED
|
@@ -421,9 +421,6 @@ class View {
|
|
|
421
421
|
isAlias: false
|
|
422
422
|
};
|
|
423
423
|
}
|
|
424
|
-
getSQL() {
|
|
425
|
-
return new SQL([this]);
|
|
426
|
-
}
|
|
427
424
|
}
|
|
428
425
|
function isView(view) {
|
|
429
426
|
return typeof view === "object" && view !== null && IsDrizzleView in view;
|
|
@@ -434,9 +431,6 @@ function getViewName(view) {
|
|
|
434
431
|
Column.prototype.getSQL = function() {
|
|
435
432
|
return new SQL([this]);
|
|
436
433
|
};
|
|
437
|
-
Table.prototype.getSQL = function() {
|
|
438
|
-
return new SQL([this]);
|
|
439
|
-
};
|
|
440
434
|
Subquery.prototype.getSQL = function() {
|
|
441
435
|
return new SQL([this]);
|
|
442
436
|
};
|