drizzle-orm 0.36.4-3c69a1f → 0.36.4-661b6f2
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/package.json +49 -49
- package/relations.cjs +5 -2
- package/relations.cjs.map +1 -1
- package/relations.d.cts +15 -19
- package/relations.d.ts +15 -19
- package/relations.js +5 -2
- package/relations.js.map +1 -1
- package/sql/sql.cjs.map +1 -1
- package/sql/sql.d.cts +4 -4
- package/sql/sql.d.ts +4 -4
- package/sql/sql.js.map +1 -1
- package/sqlite-core/db.cjs +1 -0
- package/sqlite-core/db.cjs.map +1 -1
- package/sqlite-core/db.js +1 -0
- package/sqlite-core/db.js.map +1 -1
- package/sqlite-core/query-builders/query.cjs +24 -3
- package/sqlite-core/query-builders/query.cjs.map +1 -1
- package/sqlite-core/query-builders/query.d.cts +4 -3
- package/sqlite-core/query-builders/query.d.ts +4 -3
- package/sqlite-core/query-builders/query.js +24 -3
- package/sqlite-core/query-builders/query.js.map +1 -1
- package/version.cjs +1 -1
- package/version.d.cts +1 -1
- package/version.d.ts +1 -1
- package/version.js +1 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "drizzle-orm",
|
|
3
|
-
"version": "0.36.4-
|
|
3
|
+
"version": "0.36.4-661b6f2",
|
|
4
4
|
"description": "Drizzle ORM package for SQL databases",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"scripts": {
|
|
@@ -528,54 +528,6 @@
|
|
|
528
528
|
"types": "./view-common.d.ts",
|
|
529
529
|
"default": "./view-common.js"
|
|
530
530
|
},
|
|
531
|
-
"./better-sqlite3/driver": {
|
|
532
|
-
"import": {
|
|
533
|
-
"types": "./better-sqlite3/driver.d.ts",
|
|
534
|
-
"default": "./better-sqlite3/driver.js"
|
|
535
|
-
},
|
|
536
|
-
"require": {
|
|
537
|
-
"types": "./better-sqlite3/driver.d.cts",
|
|
538
|
-
"default": "./better-sqlite3/driver.cjs"
|
|
539
|
-
},
|
|
540
|
-
"types": "./better-sqlite3/driver.d.ts",
|
|
541
|
-
"default": "./better-sqlite3/driver.js"
|
|
542
|
-
},
|
|
543
|
-
"./better-sqlite3": {
|
|
544
|
-
"import": {
|
|
545
|
-
"types": "./better-sqlite3/index.d.ts",
|
|
546
|
-
"default": "./better-sqlite3/index.js"
|
|
547
|
-
},
|
|
548
|
-
"require": {
|
|
549
|
-
"types": "./better-sqlite3/index.d.cts",
|
|
550
|
-
"default": "./better-sqlite3/index.cjs"
|
|
551
|
-
},
|
|
552
|
-
"types": "./better-sqlite3/index.d.ts",
|
|
553
|
-
"default": "./better-sqlite3/index.js"
|
|
554
|
-
},
|
|
555
|
-
"./better-sqlite3/migrator": {
|
|
556
|
-
"import": {
|
|
557
|
-
"types": "./better-sqlite3/migrator.d.ts",
|
|
558
|
-
"default": "./better-sqlite3/migrator.js"
|
|
559
|
-
},
|
|
560
|
-
"require": {
|
|
561
|
-
"types": "./better-sqlite3/migrator.d.cts",
|
|
562
|
-
"default": "./better-sqlite3/migrator.cjs"
|
|
563
|
-
},
|
|
564
|
-
"types": "./better-sqlite3/migrator.d.ts",
|
|
565
|
-
"default": "./better-sqlite3/migrator.js"
|
|
566
|
-
},
|
|
567
|
-
"./better-sqlite3/session": {
|
|
568
|
-
"import": {
|
|
569
|
-
"types": "./better-sqlite3/session.d.ts",
|
|
570
|
-
"default": "./better-sqlite3/session.js"
|
|
571
|
-
},
|
|
572
|
-
"require": {
|
|
573
|
-
"types": "./better-sqlite3/session.d.cts",
|
|
574
|
-
"default": "./better-sqlite3/session.cjs"
|
|
575
|
-
},
|
|
576
|
-
"types": "./better-sqlite3/session.d.ts",
|
|
577
|
-
"default": "./better-sqlite3/session.js"
|
|
578
|
-
},
|
|
579
531
|
"./bun-sqlite/driver": {
|
|
580
532
|
"import": {
|
|
581
533
|
"types": "./bun-sqlite/driver.d.ts",
|
|
@@ -624,6 +576,54 @@
|
|
|
624
576
|
"types": "./bun-sqlite/session.d.ts",
|
|
625
577
|
"default": "./bun-sqlite/session.js"
|
|
626
578
|
},
|
|
579
|
+
"./better-sqlite3/driver": {
|
|
580
|
+
"import": {
|
|
581
|
+
"types": "./better-sqlite3/driver.d.ts",
|
|
582
|
+
"default": "./better-sqlite3/driver.js"
|
|
583
|
+
},
|
|
584
|
+
"require": {
|
|
585
|
+
"types": "./better-sqlite3/driver.d.cts",
|
|
586
|
+
"default": "./better-sqlite3/driver.cjs"
|
|
587
|
+
},
|
|
588
|
+
"types": "./better-sqlite3/driver.d.ts",
|
|
589
|
+
"default": "./better-sqlite3/driver.js"
|
|
590
|
+
},
|
|
591
|
+
"./better-sqlite3": {
|
|
592
|
+
"import": {
|
|
593
|
+
"types": "./better-sqlite3/index.d.ts",
|
|
594
|
+
"default": "./better-sqlite3/index.js"
|
|
595
|
+
},
|
|
596
|
+
"require": {
|
|
597
|
+
"types": "./better-sqlite3/index.d.cts",
|
|
598
|
+
"default": "./better-sqlite3/index.cjs"
|
|
599
|
+
},
|
|
600
|
+
"types": "./better-sqlite3/index.d.ts",
|
|
601
|
+
"default": "./better-sqlite3/index.js"
|
|
602
|
+
},
|
|
603
|
+
"./better-sqlite3/migrator": {
|
|
604
|
+
"import": {
|
|
605
|
+
"types": "./better-sqlite3/migrator.d.ts",
|
|
606
|
+
"default": "./better-sqlite3/migrator.js"
|
|
607
|
+
},
|
|
608
|
+
"require": {
|
|
609
|
+
"types": "./better-sqlite3/migrator.d.cts",
|
|
610
|
+
"default": "./better-sqlite3/migrator.cjs"
|
|
611
|
+
},
|
|
612
|
+
"types": "./better-sqlite3/migrator.d.ts",
|
|
613
|
+
"default": "./better-sqlite3/migrator.js"
|
|
614
|
+
},
|
|
615
|
+
"./better-sqlite3/session": {
|
|
616
|
+
"import": {
|
|
617
|
+
"types": "./better-sqlite3/session.d.ts",
|
|
618
|
+
"default": "./better-sqlite3/session.js"
|
|
619
|
+
},
|
|
620
|
+
"require": {
|
|
621
|
+
"types": "./better-sqlite3/session.d.cts",
|
|
622
|
+
"default": "./better-sqlite3/session.cjs"
|
|
623
|
+
},
|
|
624
|
+
"types": "./better-sqlite3/session.d.ts",
|
|
625
|
+
"default": "./better-sqlite3/session.js"
|
|
626
|
+
},
|
|
627
627
|
"./d1/driver": {
|
|
628
628
|
"import": {
|
|
629
629
|
"types": "./d1/driver.d.ts",
|
package/relations.cjs
CHANGED
|
@@ -449,8 +449,11 @@ function relationFilterToSQL(table, filter) {
|
|
|
449
449
|
continue;
|
|
450
450
|
switch (target) {
|
|
451
451
|
case "$raw": {
|
|
452
|
-
if (value)
|
|
453
|
-
parts.push(
|
|
452
|
+
if (value) {
|
|
453
|
+
parts.push(
|
|
454
|
+
value(table[import_table2.Columns], operators)
|
|
455
|
+
);
|
|
456
|
+
}
|
|
454
457
|
continue;
|
|
455
458
|
}
|
|
456
459
|
case "$or": {
|
package/relations.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/relations.ts"],"sourcesContent":["import { type AnyTable, getTableUniqueName, type InferModelFromColumns, Table } from '~/table.ts';\nimport { Columns, getTableName } from '~/table.ts';\nimport { type AnyColumn, Column } from './column.ts';\nimport { entityKind, is } from './entity.ts';\nimport { PrimaryKeyBuilder } from './pg-core/primary-keys.ts';\nimport {\n\tand,\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 { type Placeholder, SQL, sql, type SQLWrapper } from './sql/sql.ts';\nimport { type Assume, type Equal, getTableColumns, type Simplify, type ValueOrArray, type Writable } from './utils.ts';\n\nexport class Relations<\n\tTSchema extends Record<string, unknown> = Record<string, unknown>,\n\tTTables extends Record<string, Table> = Record<string, Table>,\n\tTConfig extends RelationsBuilderConfig<TTables> = RelationsBuilderConfig<TTables>,\n> {\n\tstatic readonly [entityKind]: string = 'RelationsV2';\n\tdeclare readonly $brand: 'Relations';\n\t/** table DB name -> schema table key */\n\treadonly tableNamesMap: Record<string, string> = {};\n\treadonly tablesConfig: TablesRelationalConfig = {};\n\n\tconstructor(\n\t\treadonly schema: TSchema,\n\t\treadonly tables: TTables,\n\t\treadonly config: TConfig,\n\t) {\n\t\tfor (const [tsName, table] of Object.entries(tables)) {\n\t\t\tthis.tableNamesMap[getTableUniqueName(table)] = tsName as any;\n\n\t\t\tconst tableConfig: TableRelationalConfig = this.tablesConfig[tsName] = {\n\t\t\t\ttable,\n\t\t\t\ttsName,\n\t\t\t\tdbName: table[Table.Symbol.Name],\n\t\t\t\tschema: table[Table.Symbol.Schema],\n\t\t\t\tcolumns: table[Table.Symbol.Columns],\n\t\t\t\trelations: config[tsName] || {},\n\t\t\t\tprimaryKey: [],\n\t\t\t};\n\n\t\t\tfor (const column of Object.values(table[Table.Symbol.Columns])) {\n\t\t\t\tif (column.primary) {\n\t\t\t\t\ttableConfig.primaryKey.push(column);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst extraConfig = table[Table.Symbol.ExtraConfigBuilder]?.(table);\n\t\t\tif (extraConfig) {\n\t\t\t\tfor (const configEntry of Object.values(extraConfig)) {\n\t\t\t\t\tif (is(configEntry, PrimaryKeyBuilder)) {\n\t\t\t\t\t\ttableConfig.primaryKey.push(...configEntry.columns);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfor (const tableConfig of Object.values(this.tablesConfig)) {\n\t\t\tfor (const [relationFieldName, relation] of Object.entries(tableConfig.relations)) {\n\t\t\t\tif (!is(relation, Relation)) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\trelation.sourceTable = tableConfig.table;\n\t\t\t\trelation.fieldName = relationFieldName;\n\t\t\t}\n\t\t}\n\n\t\tfor (const tableConfig of Object.values(this.tablesConfig)) {\n\t\t\tfor (const [relationFieldName, relation] of Object.entries(tableConfig.relations)) {\n\t\t\t\tconst relationPrintName = `relations -> ${tableConfig.tsName}.${relationFieldName}`;\n\t\t\t\tif (!is(relation, Relation)) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tif (typeof relation.alias === 'string' && !relation.alias) {\n\t\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\t}\n\n\t\t\t\tif (relation.sourceColumns?.length === 0) {\n\t\t\t\t\tthrow new Error(`${relationPrintName}: \"from\" cannot be an empty array`);\n\t\t\t\t}\n\n\t\t\t\tif (relation.targetColumns?.length === 0) {\n\t\t\t\t\tthrow new Error(`${relationPrintName}: \"to\" cannot be an empty array`);\n\t\t\t\t}\n\n\t\t\t\tif (relation.sourceColumns && relation.targetColumns) {\n\t\t\t\t\tif (relation.sourceColumns.length !== relation.targetColumns.length) {\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t`${relationPrintName}: \"from\" and \"to\" arrays must have the same length`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tif (relation.sourceColumns || relation.targetColumns) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`${relationPrintName}: relation must have either both \"from\" and \"to\" defined, or none of them`,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\t// if (Object.keys(relation).some((it) => it !== 'alias')) {\n\t\t\t\t// \tthrow new Error(\n\t\t\t\t// \t\t`${relationPrintName}: without \"from\" and \"to\", the only field that can be used is \"alias\"`,\n\t\t\t\t// \t);\n\t\t\t\t// }\n\n\t\t\t\tlet reverseRelation: Relation | undefined;\n\t\t\t\tconst targetTableTsName = this.tableNamesMap[getTableUniqueName(relation.targetTable)];\n\t\t\t\tif (!targetTableTsName) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`Table \"${getTableUniqueName(relation.targetTable)}\" not found in provided TS schema`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tconst reverseTableConfig = this.tablesConfig[targetTableTsName];\n\t\t\t\tif (!reverseTableConfig) {\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 relations of table \"${targetTableTsName}\" were found\"`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tif (relation.alias) {\n\t\t\t\t\tconst reverseRelations = Object.values(reverseTableConfig.relations).filter((it): it is Relation =>\n\t\t\t\t\t\tis(it, Relation) && it.alias === relation.alias\n\t\t\t\t\t);\n\t\t\t\t\tif (reverseRelations.length > 1) {\n\t\t\t\t\t\tthrow new Error(\n\t\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 \"${relation.alias}\" found in table \"${targetTableTsName}\": ${\n\t\t\t\t\t\t\t\treverseRelations.map((it) => `\"${it.fieldName}\"`).join(', ')\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\treverseRelation = reverseRelations[0];\n\t\t\t\t\tif (!reverseRelation) {\n\t\t\t\t\t\tthrow new Error(\n\t\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 \"${targetTableTsName}\" with alias \"${relation.alias}\"`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tconst reverseRelations = Object.values(reverseTableConfig.relations).filter((it): it is Relation =>\n\t\t\t\t\t\tis(it, Relation) && it.targetTable === relation.sourceTable && !it.alias\n\t\t\t\t\t);\n\t\t\t\t\tif (reverseRelations.length > 1) {\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t`${relationPrintName}: not enough data provided to build the relation - \"from\"/\"to\" are not defined, and multiple relations between \"${targetTableTsName}\" and \"${\n\t\t\t\t\t\t\t\tgetTableUniqueName(relation.sourceTable)\n\t\t\t\t\t\t\t}\" were found.\\nHint: you can specify \"alias\" on both sides of the relation with the same value`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\treverseRelation = reverseRelations[0];\n\t\t\t\t\tif (!reverseRelation) {\n\t\t\t\t\t\tthrow new Error(\n\t\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 \"${targetTableTsName}\" with target table \"${\n\t\t\t\t\t\t\t\tgetTableUniqueName(relation.sourceTable)\n\t\t\t\t\t\t\t}\" was found`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (!reverseRelation.sourceColumns || !reverseRelation.targetColumns) {\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 reverse relation \"${targetTableTsName}.${reverseRelation.fieldName}\" does not have \"from\"/\"to\" defined`,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\trelation.sourceColumns = reverseRelation.targetColumns;\n\t\t\t\trelation.targetColumns = reverseRelation.sourceColumns;\n\t\t\t\trelation.where = reverseRelation.where;\n\t\t\t}\n\t\t}\n\t}\n}\n\nexport type EmptyRelations = Relations<Record<string, never>, Record<string, never>, Record<string, never>>;\nexport type AnyRelations = Relations<Record<string, any>, Record<string, any>, Record<string, any>>;\n\nexport abstract class Relation<\n\tTSourceTableName extends string = string,\n\tTTargetTableName extends string = string,\n> {\n\tstatic readonly [entityKind]: string = 'Relation';\n\tdeclare readonly $brand: 'Relation';\n\n\tfieldName!: string;\n\tsourceColumns!: AnyColumn<{ tableName: TSourceTableName }>[];\n\ttargetColumns!: AnyColumn<{ tableName: TTargetTableName }>[];\n\talias: string | undefined;\n\twhere: RelationsFilter<Record<string, Column>> | undefined;\n\tsourceTable!: AnyTable<{ name: TSourceTableName }>;\n\n\tconstructor(\n\t\treadonly targetTable: AnyTable<{ name: TTargetTableName }>,\n\t) {\n\t}\n}\n\nexport class One<\n\tTSourceTableName extends string,\n\tTTargetTableName extends string,\n\tTOptional extends boolean = boolean,\n> extends Relation<TSourceTableName, TTargetTableName> {\n\tstatic override readonly [entityKind]: string = 'One';\n\tdeclare protected $relationBrand: 'One';\n\n\treadonly optional: TOptional;\n\n\tconstructor(\n\t\ttargetTable: AnyTable<{ name: TTargetTableName }>,\n\t\tconfig: AnyOneConfig | undefined,\n\t) {\n\t\tsuper(targetTable);\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.map((it) => it._.column as AnyColumn<{ tableName: TSourceTableName }>)\n\t\t\t\t: [(config.from as RelationsBuilderColumnBase)._.column as AnyColumn<{ tableName: TSourceTableName }>];\n\t\t}\n\t\tif (config?.to) {\n\t\t\tthis.targetColumns = Array.isArray(config.to)\n\t\t\t\t? config.to.map((it) => it._.column as AnyColumn<{ tableName: TTargetTableName }>)\n\t\t\t\t: [(config.to as RelationsBuilderColumnBase)._.column as AnyColumn<{ tableName: TTargetTableName }>];\n\t\t}\n\t\tthis.optional = (config?.optional ?? false) as TOptional;\n\t}\n}\n\nexport class Many<\n\tTSourceTableName extends string,\n\tTTargetTableName extends string,\n> extends Relation<TSourceTableName, TTargetTableName> {\n\tstatic override readonly [entityKind]: string = 'Many';\n\tdeclare protected $relationBrand: 'Many';\n\n\tconstructor(\n\t\ttargetTable: AnyTable<{ name: TTargetTableName }>,\n\t\treadonly config: AnyManyConfig | undefined,\n\t) {\n\t\tsuper(targetTable);\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.map((it) => it._.column as AnyColumn<{ tableName: TSourceTableName }>)\n\t\t\t\t: [(config.from as RelationsBuilderColumnBase)._.column as AnyColumn<{ tableName: TSourceTableName }>];\n\t\t}\n\t\tif (config?.to) {\n\t\t\tthis.targetColumns = Array.isArray(config.to)\n\t\t\t\t? config.to.map((it) => it._.column as AnyColumn<{ tableName: TTargetTableName }>)\n\t\t\t\t: [(config.to as RelationsBuilderColumnBase)._.column as AnyColumn<{ tableName: TTargetTableName }>];\n\t\t}\n\t}\n}\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: Table | undefined;\n\n\tonTable(table: Table) {\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\n\t\t\tthis.query = sql`select count(*) as ${sql.identifier('r')} from ${this.table}`.mapWith(Number);\n\t\t}\n\n\t\treturn this.query;\n\t}\n}\n\nexport type ExtractObjectValues<T> = T[keyof T];\n\nexport type ExtractRelationsFromTableExtraConfigSchema<\n\tTConfig extends unknown[],\n> = ExtractObjectValues<\n\t{\n\t\t[\n\t\t\tK in keyof TConfig as TConfig[K] extends Relations<any> ? K\n\t\t\t\t: never\n\t\t]: TConfig[K] extends Relations<infer TRelationConfig> ? TRelationConfig\n\t\t\t: never;\n\t}\n>;\n\nexport const operators = {\n\tand,\n\tbetween,\n\teq,\n\texists,\n\tgt,\n\tgte,\n\tilike,\n\tinArray,\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 function getOrderByOperators() {\n\treturn orderByOperators;\n}\n\nexport type OrderByOperators = ReturnType<typeof getOrderByOperators>;\n\nexport type FindTableByDBNameRelationalConfig<\n\tTSchema extends TablesRelationalConfig,\n\tTTableName extends string,\n> = ExtractObjectValues<\n\t{\n\t\t[\n\t\t\tK in keyof TSchema as TSchema[K]['table']['_']['name'] extends TTableName ? K\n\t\t\t\t: never\n\t\t]: TSchema[K];\n\t}\n>;\n\nexport type FindTableByDBNameTablesRecord<\n\tTSchema extends Record<string, Table>,\n\tTTableName extends string,\n> = ExtractObjectValues<\n\t{\n\t\t[\n\t\t\tK in keyof TSchema as TSchema[K]['_']['name'] extends TTableName ? K\n\t\t\t\t: never\n\t\t]: TSchema[K];\n\t}\n>;\n\nexport type FindTableInRelationsConfig<\n\tTSchema extends TablesRelationalConfig,\n\tTTargetTable extends Table,\n\tTTableName extends string = TTargetTable['_']['name'],\n\tTSchemaName extends string | undefined = TTargetTable['_']['schema'] extends undefined ? undefined\n\t\t: TTargetTable['_']['schema'],\n> = ExtractObjectValues<\n\t{\n\t\t[\n\t\t\tK in keyof TSchema as TSchema[K]['dbName'] extends TTableName\n\t\t\t\t? TSchema[K]['schema'] extends undefined ? TSchemaName extends undefined ? K\n\t\t\t\t\t: never\n\t\t\t\t: TSchemaName extends TSchema[K]['schema'] ? K\n\t\t\t\t: never\n\t\t\t\t: never\n\t\t]: TSchema[K];\n\t}\n>;\n\nexport type SQLOperator = {\n\tsql: Operators['sql'];\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& {\n\t\tconfig?: TTableConfig['relations'];\n\t\tcolumns?:\n\t\t\t| {\n\t\t\t\t[K in keyof TTableConfig['columns']]?: true;\n\t\t\t}\n\t\t\t| {\n\t\t\t\t[K in keyof TTableConfig['columns']]?: false;\n\t\t\t};\n\t\twith?: {\n\t\t\t[K in keyof TTableConfig['relations']]?:\n\t\t\t\t| true\n\t\t\t\t| (TTableConfig['relations'][K] extends Relation ? DBQueryConfig<\n\t\t\t\t\t\tTTableConfig['relations'][K] extends One<string, string> ? 'one' : 'many',\n\t\t\t\t\t\tTSchema,\n\t\t\t\t\t\tFindTableInRelationsConfig<\n\t\t\t\t\t\t\tTSchema,\n\t\t\t\t\t\t\tTTableConfig['relations'][K]['targetTable']\n\t\t\t\t\t\t>\n\t\t\t\t\t>\n\t\t\t\t\t: never);\n\t\t};\n\t\textras?:\n\t\t\t| Record<string, SQLWrapper>\n\t\t\t| ((\n\t\t\t\tfields: Simplify<\n\t\t\t\t\t[TTableConfig['columns']] extends [never] ? {}\n\t\t\t\t\t\t: TTableConfig['columns']\n\t\t\t\t>,\n\t\t\t\toperators: SQLOperator,\n\t\t\t) => Record<string, SQLWrapper>);\n\t\toffset?: number | Placeholder;\n\t\twhere?: RelationsFilter<TTableConfig['columns']>;\n\t\torderBy?:\n\t\t\t| ValueOrArray<AnyColumn | SQL>\n\t\t\t| ((\n\t\t\t\tfields: Simplify<\n\t\t\t\t\t[TTableConfig['columns']] extends [never] ? {}\n\t\t\t\t\t\t: TTableConfig['columns']\n\t\t\t\t>,\n\t\t\t\toperators: OrderByOperators,\n\t\t\t) => ValueOrArray<AnyColumn | SQL>);\n\t}\n\t& (TRelationType extends 'many' ? {\n\t\t\tlimit?: number | Placeholder;\n\t\t}\n\t\t: {});\n\nexport interface TableRelationalConfig {\n\ttable: Table;\n\ttsName: string;\n\tdbName: string;\n\tcolumns: Record<string, Column>;\n\trelations: Record<string, RelationsBuilderEntry>;\n\tprimaryKey: AnyColumn[];\n\tschema?: string;\n}\n\nexport type TablesRelationalConfig = Record<string, TableRelationalConfig>;\n\nexport interface RelationalSchemaConfig<\n\tTTablesConfig extends TablesRelationalConfig,\n> {\n\ttables: Record<string, Table>;\n\ttablesConfig: TTablesConfig;\n\ttableNamesMap: Record<string, string>;\n}\n\ntype NonUndefinedRecord<TRecord extends Record<string, any>> = {\n\t[K in keyof TRecord as K extends undefined ? never : K]: TRecord[K];\n};\n\nexport type ExtractTablesWithRelations<\n\tTRelations extends Relations,\n\tTTables extends Record<string, Table> = TRelations['tables'],\n> = {\n\t[K in keyof TTables]: {\n\t\ttable: TTables[K];\n\t\ttsName: K & string;\n\t\tdbName: TTables[K]['_']['name'];\n\t\tcolumns: TTables[K]['_']['columns'];\n\t\trelations: K extends keyof TRelations['config']\n\t\t\t? TRelations['config'][K] extends Record<string, any> ? NonUndefinedRecord<TRelations['config'][K]>\n\t\t\t: Record<string, never>\n\t\t\t: Record<string, never>;\n\t\tprimaryKey: AnyColumn[];\n\t\tschema: TTables[K]['_']['schema'];\n\t};\n};\n\nexport type ReturnTypeOrValue<T> = T extends (...args: any[]) => infer R ? R\n\t: T;\n\nexport type BuildRelationResult<\n\tTConfig extends TablesRelationalConfig,\n\tTInclude,\n\tTRelations extends Record<string, RelationsBuilderEntry>,\n> = {\n\t[\n\t\tK in\n\t\t\t& NonUndefinedKeysOnly<TInclude>\n\t\t\t& keyof TRelations\n\t]: TRelations[K] extends infer TRel extends Relation ? BuildQueryResult<\n\t\t\tTConfig,\n\t\t\tFindTableInRelationsConfig<TConfig, TRel['targetTable']>,\n\t\t\tAssume<TInclude[K], true | Record<string, unknown>>\n\t\t> extends infer TResult ? TRel extends One<string, string> ?\n\t\t\t\t\t| TResult\n\t\t\t\t\t| (Equal<TRel['optional'], true> extends true ? null : never)\n\t\t\t: TResult[]\n\t\t: never\n\t\t: TRelations[K] extends AggregatedField<infer TData> ? TData\n\t\t: never;\n};\n\nexport type NonUndefinedKeysOnly<T> =\n\t& ExtractObjectValues<\n\t\t{\n\t\t\t[K in keyof T as T[K] extends undefined ? never : K]: K;\n\t\t}\n\t>\n\t& keyof T;\n\nexport type BuildQueryResult<\n\tTSchema extends TablesRelationalConfig,\n\tTTableConfig extends TableRelationalConfig,\n\tTFullSelection extends true | Record<string, unknown>,\n> = Equal<TFullSelection, true> extends true ? InferModelFromColumns<TTableConfig['columns']>\n\t: TFullSelection extends Record<string, unknown> ? Simplify<\n\t\t\t& (TFullSelection['columns'] extends Record<string, unknown> ? InferModelFromColumns<\n\t\t\t\t\t{\n\t\t\t\t\t\t[\n\t\t\t\t\t\t\tK in Equal<\n\t\t\t\t\t\t\t\tExclude<\n\t\t\t\t\t\t\t\t\tTFullSelection['columns'][\n\t\t\t\t\t\t\t\t\t\t& keyof TFullSelection['columns']\n\t\t\t\t\t\t\t\t\t\t& keyof TTableConfig['columns']\n\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\tundefined\n\t\t\t\t\t\t\t\t>,\n\t\t\t\t\t\t\t\tfalse\n\t\t\t\t\t\t\t> extends true ? Exclude<\n\t\t\t\t\t\t\t\t\tkeyof TTableConfig['columns'],\n\t\t\t\t\t\t\t\t\tNonUndefinedKeysOnly<TFullSelection['columns']>\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t:\n\t\t\t\t\t\t\t\t\t& {\n\t\t\t\t\t\t\t\t\t\t[K in keyof TFullSelection['columns']]: Equal<\n\t\t\t\t\t\t\t\t\t\t\tTFullSelection['columns'][K],\n\t\t\t\t\t\t\t\t\t\t\ttrue\n\t\t\t\t\t\t\t\t\t\t> extends true ? K\n\t\t\t\t\t\t\t\t\t\t\t: never;\n\t\t\t\t\t\t\t\t\t}[keyof TFullSelection['columns']]\n\t\t\t\t\t\t\t\t\t& keyof TTableConfig['columns']\n\t\t\t\t\t\t]: TTableConfig['columns'][K];\n\t\t\t\t\t}\n\t\t\t\t>\n\t\t\t\t: InferModelFromColumns<TTableConfig['columns']>)\n\t\t\t& (TFullSelection['extras'] extends\n\t\t\t\t| Record<string, unknown>\n\t\t\t\t| ((...args: any[]) => Record<string, unknown>) ? {\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]: Assume<\n\t\t\t\t\t\tReturnTypeOrValue<TFullSelection['extras']>[K],\n\t\t\t\t\t\tSQL\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 NormalizedRelation {\n\tfields: AnyColumn[];\n\treferences: AnyColumn[];\n}\n\nexport interface BuildRelationalQueryResult {\n\tselection: {\n\t\tkey: string;\n\t\tfield: Column | Table | SQL | SQL.Aliased | SQLWrapper | AggregatedField;\n\t\tisArray?: boolean;\n\t\tselection?: BuildRelationalQueryResult['selection'];\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): Record<string, unknown> {\n\tfor (\n\t\tconst selectionItem of buildQueryResultSelection\n\t) {\n\t\tconst field = selectionItem.field!;\n\t\tif (is(field, Table)) {\n\t\t\tif (row[selectionItem.key] === null) continue;\n\t\t\tif (parseJson) row[selectionItem.key] = JSON.parse(row[selectionItem.key] as string);\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(item, selectionItem.selection!, mapColumnValue);\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);\n\n\t\t\tcontinue;\n\t\t}\n\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\t\trow[selectionItem.key] = decoder.mapFromDriverValue(value);\n\t}\n\n\treturn row;\n}\n\nexport class RelationsBuilderTable<TTableName extends string = string> implements SQLWrapper {\n\tstatic readonly [entityKind]: string = 'RelationsBuilderTable';\n\n\treadonly _: {\n\t\treadonly name: TTableName;\n\t\treadonly table: AnyTable<{ name: TTableName }>;\n\t};\n\n\tconstructor(table: AnyTable<{ name: TTableName }>) {\n\t\tthis._ = {\n\t\t\tname: getTableName(table),\n\t\t\ttable,\n\t\t};\n\t}\n\n\tgetSQL(): SQL {\n\t\treturn this._.table.getSQL();\n\t}\n}\n\nexport type RelationsBuilderColumnConfig<TTableName extends string = string, TData = unknown> = {\n\treadonly tableName: TTableName;\n\treadonly data: TData;\n\treadonly column: AnyColumn<{ tableName: TTableName }>;\n\tthrough?: RelationsBuilderColumnBase;\n};\n\nexport type RelationsBuilderColumnBase<TTableName extends string = string, TData = unknown> = {\n\t_: RelationsBuilderColumnConfig<TTableName, TData>;\n} & SQLWrapper;\n\nexport class RelationsBuilderColumn<\n\tTTableName extends string = string,\n\tTData = unknown,\n> implements SQLWrapper, RelationsBuilderColumnBase<TTableName, TData> {\n\tstatic readonly [entityKind]: string = 'RelationsBuilderColumn';\n\n\treadonly _: {\n\t\treadonly tableName: TTableName;\n\t\treadonly data: TData;\n\t\treadonly column: AnyColumn<{ tableName: TTableName }>;\n\t\tthrough?: RelationsBuilderColumnBase;\n\t};\n\n\tconstructor(column: AnyColumn<{ tableName: TTableName }>) {\n\t\tthis._ = {\n\t\t\ttableName: getTableName(column.table) as TTableName,\n\t\t\tdata: undefined as TData,\n\t\t\tcolumn,\n\t\t};\n\t}\n\n\tthrough(column: RelationsBuilderColumnBase<string, TData>): Omit<this, 'through'> {\n\t\tthis._.through = column;\n\n\t\treturn this;\n\t}\n\n\tgetSQL(): SQL {\n\t\treturn this._.column.getSQL();\n\t}\n}\n\nexport type RelationFieldsFilterInternals<T> = {\n\teq?: T;\n\tne?: T;\n\tgt?: T;\n\tgte?: T;\n\tlt?: T;\n\tlte?: T;\n\tin?: T[];\n\tnotIn?: T[];\n\tlike?: string;\n\tilike?: string;\n\tnotLike?: string;\n\tnotIlike?: string;\n\tisNull?: true;\n\tisNotNull?: true;\n\t$not?: RelationsFieldFilter<T>;\n\t$or?: RelationsFieldFilter<T>[];\n};\n\nexport type RelationsFieldFilter<T> = T | RelationFieldsFilterInternals<T>;\n\nexport type RelationsFilter<TColumns extends Record<string, Column>> =\n\t& {\n\t\t[K in keyof TColumns]?: RelationsFieldFilter<TColumns[K]['_']['data']>;\n\t}\n\t& {\n\t\t$or?: RelationsFilter<TColumns>[];\n\t\t$not?: RelationsFilter<TColumns>[];\n\t\t$raw?: (operators: Operators) => SQL;\n\t};\n\nexport interface OneConfig<\n\tTSchema extends Record<string, Table>,\n\tTSourceColumns extends\n\t\t| Readonly<[RelationsBuilderColumnBase, ...RelationsBuilderColumnBase[]]>\n\t\t| Readonly<RelationsBuilderColumnBase>,\n\tTTargetTableName extends string,\n\tTOptional extends boolean,\n> {\n\tfrom?: TSourceColumns | Writable<TSourceColumns>;\n\tto?: TSourceColumns extends [RelationsBuilderColumnBase, ...RelationsBuilderColumnBase[]]\n\t\t? { [K in keyof TSourceColumns]: RelationsBuilderColumnBase<TTargetTableName> }\n\t\t: RelationsBuilderColumnBase<TTargetTableName>;\n\twhere?: TSourceColumns extends [RelationsBuilderColumnBase, ...RelationsBuilderColumnBase[]]\n\t\t? RelationsFilter<FindTableByDBNameTablesRecord<TSchema, TSourceColumns[number]['_']['tableName']>['_']['columns']>\n\t\t: RelationsFilter<\n\t\t\tFindTableByDBNameTablesRecord<\n\t\t\t\tTSchema,\n\t\t\t\tAssume<TSourceColumns, RelationsBuilderColumnBase>['_']['tableName']\n\t\t\t>['_']['columns']\n\t\t>;\n\toptional?: TOptional;\n\talias?: string;\n}\n\nexport type AnyOneConfig = OneConfig<\n\tRecord<string, Table>,\n\tReadonly<[RelationsBuilderColumnBase, ...RelationsBuilderColumnBase[]] | RelationsBuilderColumnBase<string, unknown>>,\n\tstring,\n\tboolean\n>;\n\nexport interface ManyConfig<\n\tTSchema extends Record<string, Table>,\n\tTSourceColumns extends\n\t\t| Readonly<[RelationsBuilderColumnBase, ...RelationsBuilderColumnBase[]]>\n\t\t| Readonly<RelationsBuilderColumnBase>,\n\tTTargetTableName extends string,\n> {\n\tfrom?: TSourceColumns;\n\tto?: TSourceColumns extends [RelationsBuilderColumnBase, ...RelationsBuilderColumnBase[]]\n\t\t? { [K in keyof TSourceColumns]: RelationsBuilderColumnBase<TTargetTableName> }\n\t\t: RelationsBuilderColumnBase<TTargetTableName>;\n\twhere?: TSourceColumns extends [RelationsBuilderColumnBase, ...RelationsBuilderColumnBase[]]\n\t\t? RelationsFilter<FindTableByDBNameTablesRecord<TSchema, TSourceColumns[number]['_']['tableName']>['_']['columns']>\n\t\t: RelationsFilter<\n\t\t\tFindTableByDBNameTablesRecord<\n\t\t\t\tTSchema,\n\t\t\t\tAssume<TSourceColumns, RelationsBuilderColumnBase>['_']['tableName']\n\t\t\t>['_']['columns']\n\t\t>;\n\talias?: string;\n}\n\nexport type AnyManyConfig = ManyConfig<\n\tRecord<string, Table>,\n\tReadonly<[RelationsBuilderColumnBase, ...RelationsBuilderColumnBase[]]> | Readonly<RelationsBuilderColumnBase>,\n\tstring\n>;\n\nexport interface OneFn<\n\tTTables extends Record<string, Table>,\n\tTTargetTableName extends string,\n> {\n\t<\n\t\t// \"any\" default value is required for cases where config is not provided, to satisfy the source table name constraint\n\t\tTSourceColumns extends\n\t\t\t| Readonly<[RelationsBuilderColumnBase, ...RelationsBuilderColumnBase[]]>\n\t\t\t| RelationsBuilderColumnBase = any,\n\t\tTOptional extends boolean = false,\n\t>(\n\t\tconfig?: OneConfig<TTables, TSourceColumns, TTargetTableName, TOptional>,\n\t): One<\n\t\tTSourceColumns extends [RelationsBuilderColumnBase, ...RelationsBuilderColumnBase[]]\n\t\t\t? TSourceColumns[number]['_']['tableName']\n\t\t\t: Assume<TSourceColumns, RelationsBuilderColumnBase>['_']['tableName'],\n\t\tTTargetTableName,\n\t\tTOptional\n\t>;\n}\n\nexport interface ManyFn<\n\tTTables extends Record<string, Table>,\n\tTTargetTableName extends string,\n> {\n\t<\n\t\t// \"any\" default value is required for cases where config is not provided, to satisfy the source table name constraint\n\t\tTSourceColumns extends\n\t\t\t| Readonly<[RelationsBuilderColumnBase, ...RelationsBuilderColumnBase[]]>\n\t\t\t| RelationsBuilderColumnBase = any,\n\t>(\n\t\tconfig?: ManyConfig<TTables, TSourceColumns, TTargetTableName>,\n\t): Many<\n\t\tTSourceColumns extends [RelationsBuilderColumnBase, ...RelationsBuilderColumnBase[]]\n\t\t\t? TSourceColumns[number]['_']['tableName']\n\t\t\t: Assume<TSourceColumns, RelationsBuilderColumnBase>['_']['tableName'],\n\t\tTTargetTableName\n\t>;\n}\n\nexport class RelationsHelperStatic<TTables extends Record<string, Table>> {\n\tstatic readonly [entityKind]: string = 'RelationsHelperStatic';\n\tdeclare readonly $brand: 'RelationsHelperStatic';\n\n\treadonly _: {\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>> = {};\n\t\tconst many: Record<string, ManyFn<TTables, 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(table, config);\n\t\t\t};\n\n\t\t\tmany[tableName] = (config) => {\n\t\t\t\treturn new Many(table, config);\n\t\t\t};\n\t\t}\n\n\t\tthis.one = one as this['one'];\n\t\tthis.many = many as this['many'];\n\t}\n\n\tone: {\n\t\t[K in keyof TTables]: OneFn<TTables, TTables[K]['_']['name']>;\n\t};\n\n\tmany: {\n\t\t[K in keyof TTables]: ManyFn<TTables, TTables[K]['_']['name']>;\n\t};\n\n\taggs = {\n\t\tcount(): Count {\n\t\t\treturn new Count();\n\t\t},\n\t};\n}\n\nexport type RelationsBuilder<TSchema extends Record<string, Table>> =\n\t& {\n\t\t[TTableName in keyof TSchema & string]:\n\t\t\t& {\n\t\t\t\t[TColumnName in keyof TSchema[TTableName]['_']['columns']]: RelationsBuilderColumn<\n\t\t\t\t\tTSchema[TTableName]['_']['name'],\n\t\t\t\t\tTSchema[TTableName]['_']['columns'][TColumnName]['_']['data']\n\t\t\t\t>;\n\t\t\t}\n\t\t\t& RelationsBuilderTable<TTableName>;\n\t}\n\t& RelationsHelperStatic<TSchema>;\n\nexport type RelationsBuilderConfig<TTables extends Record<string, Table>> = {\n\t[TTableName in keyof TTables & string]?: Record<string, RelationsBuilderEntry<TTables, TTableName>>;\n};\n\nexport type RelationsBuilderEntry<\n\tTTables extends Record<string, Table> = Record<string, Table>,\n\tTSourceTableName extends string = string,\n> =\n\t| Relation<TTables[TSourceTableName]['_']['name'], TTables[keyof TTables & string]['_']['name']>\n\t| AggregatedField<any>;\n\nexport type ExtractTablesFromSchema<TSchema extends Record<string, unknown>> = {\n\t[K in keyof TSchema as TSchema[K] extends Table ? K : never]: TSchema[K] extends Table ? TSchema[K] : never;\n};\n\nexport function createRelationsHelper<\n\tTSchema extends Record<string, unknown>,\n\tTTables extends Record<string, Table>,\n>(schema: TSchema): RelationsBuilder<TTables> {\n\tconst schemaTables = Object.fromEntries(\n\t\tObject.entries(schema).filter((e): e is [typeof e[0], Table] => is(e[1], Table)),\n\t);\n\tconst helperStatic = new RelationsHelperStatic(schemaTables);\n\tconst tables = Object.entries(schema).reduce<Record<string, RelationsBuilderTable>>((acc, [key, value]) => {\n\t\tif (is(value, Table)) {\n\t\t\tconst rTable = new RelationsBuilderTable(value);\n\t\t\tconst columns = Object.entries(getTableColumns(value)).reduce<Record<string, RelationsBuilderColumnBase>>(\n\t\t\t\t(acc, [key, column]) => {\n\t\t\t\t\tconst rbColumn = new RelationsBuilderColumn(column);\n\t\t\t\t\tacc[key] = rbColumn;\n\t\t\t\t\treturn acc;\n\t\t\t\t},\n\t\t\t\t{},\n\t\t\t);\n\t\t\tacc[key] = Object.assign(rTable, columns);\n\t\t}\n\t\treturn acc;\n\t}, {});\n\n\treturn Object.assign(helperStatic, tables) as RelationsBuilder<TTables>;\n}\n\nexport function defineRelations<\n\tTSchema extends Record<string, unknown>,\n\tTConfig extends RelationsBuilderConfig<TTables>,\n\tTTables extends Record<string, Table> = ExtractTablesFromSchema<TSchema>,\n>(\n\tschema: TSchema,\n\trelations: (helpers: RelationsBuilder<TTables>) => TConfig,\n): Relations<TSchema, TTables, TConfig> {\n\treturn new Relations(\n\t\tschema,\n\t\tschema as unknown as TTables,\n\t\trelations(createRelationsHelper(schema as unknown as TTables)),\n\t);\n}\n\nexport type WithContainer<TRelatedTables extends Record<string, Table>> = {\n\twith?: {\n\t\t[K in keyof TRelatedTables]?: boolean | DBQueryConfig;\n\t};\n};\n\nexport type ColumnWithTSName = {\n\tcolumn: Column;\n\ttsName: string;\n};\n\nexport type RelationsOrder<TColumns extends Record<string, Column>> = {\n\t[K in keyof TColumns]?: 'asc' | 'desc';\n};\n\nexport type OrderBy =\n\t| ValueOrArray<AnyColumn | SQL>\n\t| ((\n\t\tfields: Record<string, Column>,\n\t\toperators: OrderByOperators,\n\t) => ValueOrArray<AnyColumn | SQL>);\n\nexport type Extras =\n\t| Record<string, SQL>\n\t| ((\n\t\tfields: Record<string, Column>,\n\t\toperators: SQLOperator,\n\t) => Record<string, SQL>);\n\nfunction relationsFieldFilterToSQL(column: Column, filter: RelationsFieldFilter<unknown>): SQL | undefined {\n\tif (typeof filter !== 'object') 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) {\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\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 RelationsFilter<any>[]).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\tdefault: {\n\t\t\t\tparts.push(\n\t\t\t\t\t(operators[target as keyof typeof operators] as ((col: Column, 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 relationFilterToSQL(\n\ttable: Table,\n\tfilter: RelationsFilter<Record<string, Column>>,\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\tif (value) parts.push((value as (operators: Operators) => SQL)(operators));\n\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tcase '$or': {\n\t\t\t\tif (!(value as RelationsFilter<Record<string, Column>>[] | 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 RelationsFilter<Record<string, Column>>[]).map((subFilter) =>\n\t\t\t\t\t\t\trelationFilterToSQL(table, subFilter)\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 as RelationsFilter<Record<string, Column>>[] | undefined)?.length) continue;\n\n\t\t\t\tparts.push(\n\t\t\t\t\tnot(\n\t\t\t\t\t\tand(\n\t\t\t\t\t\t\t...(value as RelationsFilter<Record<string, Column>>[]).map((subFilter) =>\n\t\t\t\t\t\t\t\trelationFilterToSQL(table, subFilter)\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\t\t\tdefault: {\n\t\t\t\tconst colFilter = relationsFieldFilterToSQL(\n\t\t\t\t\ttable[target as keyof Table] as Column,\n\t\t\t\t\tvalue as RelationsFieldFilter<unknown>,\n\t\t\t\t);\n\t\t\t\tif (colFilter) parts.push(colFilter);\n\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn and(...parts)!;\n}\n\nexport function relationsOrderToSQL(\n\ttable: Table,\n\torders:\n\t\t| ValueOrArray<AnyColumn | SQL>\n\t\t| ((\n\t\t\tfields: Record<string, Column>,\n\t\t\toperators: OrderByOperators,\n\t\t) => ValueOrArray<AnyColumn | SQL>),\n): SQL | undefined {\n\tconst data = typeof orders === 'function'\n\t\t? orders(table[Columns], orderByOperators)\n\t\t: orders;\n\n\treturn is(data, SQL)\n\t\t? data\n\t\t: Array.isArray(data)\n\t\t? data.length\n\t\t\t? sql.join(data.map((o) => is(o, SQL) ? o : asc(o)), sql`, `)\n\t\t\t: undefined\n\t\t: asc(data);\n}\n\nexport function relationExtrasToSQL(\n\ttable: Table,\n\textras:\n\t\t| Record<string, SQLWrapper>\n\t\t| ((columns: Record<string, Column>, operators: SQLOperator) => Record<string, SQLWrapper>),\n) {\n\tconst subqueries: SQL[] = [];\n\tconst selection: BuildRelationalQueryResult['selection'] = [];\n\n\tfor (\n\t\tconst [key, extra] of Object.entries(\n\t\t\ttypeof extras === 'function' ? extras(table[Columns], { sql: operators.sql }) : extras,\n\t\t)\n\t) {\n\t\tif (!extra) continue;\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 function relationToSQL(relation: Relation): SQL | undefined {\n\tconst table = relation.sourceTable;\n\n\tconst columnWhere = relation.sourceColumns.map((s, i) => {\n\t\tconst t = relation.targetColumns[i]!;\n\n\t\treturn eq(s, t);\n\t});\n\n\tconst targetWhere = relation.where\n\t\t? and(...columnWhere, relationFilterToSQL(table, relation.where))\n\t\t: and(...columnWhere);\n\n\treturn targetWhere;\n}\n"],"mappings":"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","names":["import_table","acc","key"]}
|
|
1
|
+
{"version":3,"sources":["../src/relations.ts"],"sourcesContent":["import { type AnyTable, getTableUniqueName, type InferModelFromColumns, Table } from '~/table.ts';\nimport { Columns, getTableName } from '~/table.ts';\nimport { type AnyColumn, Column } from './column.ts';\nimport { entityKind, is } from './entity.ts';\nimport { PrimaryKeyBuilder } from './pg-core/primary-keys.ts';\nimport {\n\tand,\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 { type Placeholder, SQL, sql, type SQLWrapper } from './sql/sql.ts';\nimport { type Assume, type Equal, getTableColumns, type Simplify, type ValueOrArray, type Writable } from './utils.ts';\n\nexport class Relations<\n\tTSchema extends Record<string, unknown> = Record<string, unknown>,\n\tTTables extends Record<string, Table> = Record<string, Table>,\n\tTConfig extends RelationsBuilderConfig<TTables> = RelationsBuilderConfig<TTables>,\n> {\n\tstatic readonly [entityKind]: string = 'RelationsV2';\n\tdeclare readonly $brand: 'Relations';\n\t/** table DB name -> schema table key */\n\treadonly tableNamesMap: Record<string, string> = {};\n\treadonly tablesConfig: TablesRelationalConfig = {};\n\n\tconstructor(\n\t\treadonly schema: TSchema,\n\t\treadonly tables: TTables,\n\t\treadonly config: TConfig,\n\t) {\n\t\tfor (const [tsName, table] of Object.entries(tables)) {\n\t\t\tthis.tableNamesMap[getTableUniqueName(table)] = tsName as any;\n\n\t\t\tconst tableConfig: TableRelationalConfig = this.tablesConfig[tsName] = {\n\t\t\t\ttable,\n\t\t\t\ttsName,\n\t\t\t\tdbName: table[Table.Symbol.Name],\n\t\t\t\tschema: table[Table.Symbol.Schema],\n\t\t\t\tcolumns: table[Table.Symbol.Columns],\n\t\t\t\trelations: config[tsName] || {},\n\t\t\t\tprimaryKey: [],\n\t\t\t};\n\n\t\t\tfor (const column of Object.values(table[Table.Symbol.Columns])) {\n\t\t\t\tif (column.primary) {\n\t\t\t\t\ttableConfig.primaryKey.push(column);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst extraConfig = table[Table.Symbol.ExtraConfigBuilder]?.(table);\n\t\t\tif (extraConfig) {\n\t\t\t\tfor (const configEntry of Object.values(extraConfig)) {\n\t\t\t\t\tif (is(configEntry, PrimaryKeyBuilder)) {\n\t\t\t\t\t\ttableConfig.primaryKey.push(...configEntry.columns);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfor (const tableConfig of Object.values(this.tablesConfig)) {\n\t\t\tfor (const [relationFieldName, relation] of Object.entries(tableConfig.relations)) {\n\t\t\t\tif (!is(relation, Relation)) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\trelation.sourceTable = tableConfig.table;\n\t\t\t\trelation.fieldName = relationFieldName;\n\t\t\t}\n\t\t}\n\n\t\tfor (const tableConfig of Object.values(this.tablesConfig)) {\n\t\t\tfor (const [relationFieldName, relation] of Object.entries(tableConfig.relations)) {\n\t\t\t\tconst relationPrintName = `relations -> ${tableConfig.tsName}.${relationFieldName}`;\n\t\t\t\tif (!is(relation, Relation)) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tif (typeof relation.alias === 'string' && !relation.alias) {\n\t\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\t}\n\n\t\t\t\tif (relation.sourceColumns?.length === 0) {\n\t\t\t\t\tthrow new Error(`${relationPrintName}: \"from\" cannot be an empty array`);\n\t\t\t\t}\n\n\t\t\t\tif (relation.targetColumns?.length === 0) {\n\t\t\t\t\tthrow new Error(`${relationPrintName}: \"to\" cannot be an empty array`);\n\t\t\t\t}\n\n\t\t\t\tif (relation.sourceColumns && relation.targetColumns) {\n\t\t\t\t\tif (relation.sourceColumns.length !== relation.targetColumns.length) {\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t`${relationPrintName}: \"from\" and \"to\" arrays must have the same length`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tif (relation.sourceColumns || relation.targetColumns) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`${relationPrintName}: relation must have either both \"from\" and \"to\" defined, or none of them`,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\t// if (Object.keys(relation).some((it) => it !== 'alias')) {\n\t\t\t\t// \tthrow new Error(\n\t\t\t\t// \t\t`${relationPrintName}: without \"from\" and \"to\", the only field that can be used is \"alias\"`,\n\t\t\t\t// \t);\n\t\t\t\t// }\n\n\t\t\t\tlet reverseRelation: Relation | undefined;\n\t\t\t\tconst targetTableTsName = this.tableNamesMap[getTableUniqueName(relation.targetTable)];\n\t\t\t\tif (!targetTableTsName) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`Table \"${getTableUniqueName(relation.targetTable)}\" not found in provided TS schema`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tconst reverseTableConfig = this.tablesConfig[targetTableTsName];\n\t\t\t\tif (!reverseTableConfig) {\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 relations of table \"${targetTableTsName}\" were found\"`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tif (relation.alias) {\n\t\t\t\t\tconst reverseRelations = Object.values(reverseTableConfig.relations).filter((it): it is Relation =>\n\t\t\t\t\t\tis(it, Relation) && it.alias === relation.alias\n\t\t\t\t\t);\n\t\t\t\t\tif (reverseRelations.length > 1) {\n\t\t\t\t\t\tthrow new Error(\n\t\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 \"${relation.alias}\" found in table \"${targetTableTsName}\": ${\n\t\t\t\t\t\t\t\treverseRelations.map((it) => `\"${it.fieldName}\"`).join(', ')\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\treverseRelation = reverseRelations[0];\n\t\t\t\t\tif (!reverseRelation) {\n\t\t\t\t\t\tthrow new Error(\n\t\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 \"${targetTableTsName}\" with alias \"${relation.alias}\"`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tconst reverseRelations = Object.values(reverseTableConfig.relations).filter((it): it is Relation =>\n\t\t\t\t\t\tis(it, Relation) && it.targetTable === relation.sourceTable && !it.alias\n\t\t\t\t\t);\n\t\t\t\t\tif (reverseRelations.length > 1) {\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t`${relationPrintName}: not enough data provided to build the relation - \"from\"/\"to\" are not defined, and multiple relations between \"${targetTableTsName}\" and \"${\n\t\t\t\t\t\t\t\tgetTableUniqueName(relation.sourceTable)\n\t\t\t\t\t\t\t}\" were found.\\nHint: you can specify \"alias\" on both sides of the relation with the same value`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\treverseRelation = reverseRelations[0];\n\t\t\t\t\tif (!reverseRelation) {\n\t\t\t\t\t\tthrow new Error(\n\t\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 \"${targetTableTsName}\" with target table \"${\n\t\t\t\t\t\t\t\tgetTableUniqueName(relation.sourceTable)\n\t\t\t\t\t\t\t}\" was found`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (!reverseRelation.sourceColumns || !reverseRelation.targetColumns) {\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 reverse relation \"${targetTableTsName}.${reverseRelation.fieldName}\" does not have \"from\"/\"to\" defined`,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\trelation.sourceColumns = reverseRelation.targetColumns;\n\t\t\t\trelation.targetColumns = reverseRelation.sourceColumns;\n\t\t\t\trelation.where = reverseRelation.where;\n\t\t\t}\n\t\t}\n\t}\n}\n\nexport type EmptyRelations = Relations<Record<string, never>, Record<string, never>, Record<string, never>>;\nexport type AnyRelations = Relations<Record<string, any>, Record<string, any>, Record<string, any>>;\n\nexport abstract class Relation<\n\tTSourceTableName extends string = string,\n\tTTargetTableName extends string = string,\n> {\n\tstatic readonly [entityKind]: string = 'Relation';\n\tdeclare readonly $brand: 'Relation';\n\n\tfieldName!: string;\n\tsourceColumns!: AnyColumn<{ tableName: TSourceTableName }>[];\n\ttargetColumns!: AnyColumn<{ tableName: TTargetTableName }>[];\n\talias: string | undefined;\n\twhere: RelationsFilter<Record<string, Column>> | undefined;\n\tsourceTable!: AnyTable<{ name: TSourceTableName }>;\n\n\tconstructor(\n\t\treadonly targetTable: AnyTable<{ name: TTargetTableName }>,\n\t) {\n\t}\n}\n\nexport class One<\n\tTSourceTableName extends string,\n\tTTargetTableName extends string,\n\tTOptional extends boolean = boolean,\n> extends Relation<TSourceTableName, TTargetTableName> {\n\tstatic override readonly [entityKind]: string = 'One';\n\tdeclare protected $relationBrand: 'One';\n\n\treadonly optional: TOptional;\n\n\tconstructor(\n\t\ttargetTable: AnyTable<{ name: TTargetTableName }>,\n\t\tconfig: AnyOneConfig | undefined,\n\t) {\n\t\tsuper(targetTable);\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.map((it) => it._.column as AnyColumn<{ tableName: TSourceTableName }>)\n\t\t\t\t: [(config.from as RelationsBuilderColumnBase)._.column as AnyColumn<{ tableName: TSourceTableName }>];\n\t\t}\n\t\tif (config?.to) {\n\t\t\tthis.targetColumns = Array.isArray(config.to)\n\t\t\t\t? config.to.map((it) => it._.column as AnyColumn<{ tableName: TTargetTableName }>)\n\t\t\t\t: [(config.to as RelationsBuilderColumnBase)._.column as AnyColumn<{ tableName: TTargetTableName }>];\n\t\t}\n\t\tthis.optional = (config?.optional ?? false) as TOptional;\n\t}\n}\n\nexport class Many<\n\tTSourceTableName extends string,\n\tTTargetTableName extends string,\n> extends Relation<TSourceTableName, TTargetTableName> {\n\tstatic override readonly [entityKind]: string = 'Many';\n\tdeclare protected $relationBrand: 'Many';\n\n\tconstructor(\n\t\ttargetTable: AnyTable<{ name: TTargetTableName }>,\n\t\treadonly config: AnyManyConfig | undefined,\n\t) {\n\t\tsuper(targetTable);\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.map((it) => it._.column as AnyColumn<{ tableName: TSourceTableName }>)\n\t\t\t\t: [(config.from as RelationsBuilderColumnBase)._.column as AnyColumn<{ tableName: TSourceTableName }>];\n\t\t}\n\t\tif (config?.to) {\n\t\t\tthis.targetColumns = Array.isArray(config.to)\n\t\t\t\t? config.to.map((it) => it._.column as AnyColumn<{ tableName: TTargetTableName }>)\n\t\t\t\t: [(config.to as RelationsBuilderColumnBase)._.column as AnyColumn<{ tableName: TTargetTableName }>];\n\t\t}\n\t}\n}\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: Table | undefined;\n\n\tonTable(table: Table) {\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\n\t\t\tthis.query = sql`select count(*) as ${sql.identifier('r')} from ${this.table}`.mapWith(Number);\n\t\t}\n\n\t\treturn this.query;\n\t}\n}\n\nexport type ExtractObjectValues<T> = T[keyof T];\n\nexport type ExtractRelationsFromTableExtraConfigSchema<\n\tTConfig extends unknown[],\n> = ExtractObjectValues<\n\t{\n\t\t[\n\t\t\tK in keyof TConfig as TConfig[K] extends Relations<any> ? K\n\t\t\t\t: never\n\t\t]: TConfig[K] extends Relations<infer TRelationConfig> ? TRelationConfig\n\t\t\t: never;\n\t}\n>;\n\nexport const operators = {\n\tand,\n\tbetween,\n\teq,\n\texists,\n\tgt,\n\tgte,\n\tilike,\n\tinArray,\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 function getOrderByOperators() {\n\treturn orderByOperators;\n}\n\nexport type OrderByOperators = ReturnType<typeof getOrderByOperators>;\n\nexport type FindTableInRelationalConfig<\n\tTSchema extends TablesRelationalConfig,\n\tTTargetTable extends Table,\n\tTTableName extends string = TTargetTable['_']['name'],\n> = ExtractObjectValues<\n\t{\n\t\t[\n\t\t\tK in keyof TSchema as TSchema[K]['tsName'] extends TTableName ? K : never\n\t\t]: TSchema[K];\n\t}\n>;\n\nexport type SQLOperator = {\n\tsql: Operators['sql'];\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& {\n\t\tconfig?: TTableConfig['relations'];\n\t\tcolumns?:\n\t\t\t| {\n\t\t\t\t[K in keyof TTableConfig['columns']]?: true;\n\t\t\t}\n\t\t\t| {\n\t\t\t\t[K in keyof TTableConfig['columns']]?: false;\n\t\t\t};\n\t\twith?: {\n\t\t\t[K in keyof TTableConfig['relations']]?:\n\t\t\t\t| true\n\t\t\t\t| (TTableConfig['relations'][K] extends Relation ? DBQueryConfig<\n\t\t\t\t\t\tTTableConfig['relations'][K] extends One<string, string> ? 'one' : 'many',\n\t\t\t\t\t\tTSchema,\n\t\t\t\t\t\tFindTableInRelationalConfig<\n\t\t\t\t\t\t\tTSchema,\n\t\t\t\t\t\t\tTTableConfig['relations'][K]['targetTable']\n\t\t\t\t\t\t>\n\t\t\t\t\t>\n\t\t\t\t\t: never);\n\t\t};\n\t\textras?:\n\t\t\t| Record<string, SQLWrapper>\n\t\t\t| ((\n\t\t\t\tfields: Simplify<\n\t\t\t\t\t[TTableConfig['columns']] extends [never] ? {}\n\t\t\t\t\t\t: TTableConfig['columns']\n\t\t\t\t>,\n\t\t\t\toperators: SQLOperator,\n\t\t\t) => Record<string, SQLWrapper>);\n\t\toffset?: number | Placeholder;\n\t\twhere?: RelationsFilter<TTableConfig['columns']>;\n\t\torderBy?:\n\t\t\t| ValueOrArray<AnyColumn | SQL>\n\t\t\t| ((\n\t\t\t\tfields: Simplify<\n\t\t\t\t\t[TTableConfig['columns']] extends [never] ? {}\n\t\t\t\t\t\t: TTableConfig['columns']\n\t\t\t\t>,\n\t\t\t\toperators: OrderByOperators,\n\t\t\t) => ValueOrArray<AnyColumn | SQL>);\n\t}\n\t& (TRelationType extends 'many' ? {\n\t\t\tlimit?: number | Placeholder;\n\t\t}\n\t\t: {});\n\nexport interface TableRelationalConfig {\n\ttable: Table;\n\ttsName: string;\n\tdbName: string;\n\tcolumns: Record<string, Column>;\n\trelations: Record<string, RelationsBuilderEntry>;\n\tprimaryKey: AnyColumn[];\n\tschema: string | undefined;\n}\n\nexport type TablesRelationalConfig = Record<string, TableRelationalConfig>;\n\nexport interface RelationalSchemaConfig<\n\tTTablesConfig extends TablesRelationalConfig,\n> {\n\ttables: Record<string, Table>;\n\ttablesConfig: TTablesConfig;\n\ttableNamesMap: Record<string, string>;\n}\n\ntype NonUndefinedRecord<TRecord extends Record<string, any>> = {\n\t[K in keyof TRecord as K extends undefined ? never : K]: TRecord[K];\n};\n\nexport type ExtractTablesWithRelations<\n\tTRelations extends Relations,\n\tTTables extends Record<string, Table> = TRelations['tables'],\n> = {\n\t[K in keyof TTables]: {\n\t\ttable: TTables[K];\n\t\ttsName: K & string;\n\t\tdbName: TTables[K]['_']['name'];\n\t\tcolumns: TTables[K]['_']['columns'];\n\t\trelations: K extends keyof TRelations['config']\n\t\t\t? TRelations['config'][K] extends Record<string, any> ? NonUndefinedRecord<TRelations['config'][K]>\n\t\t\t: Record<string, never>\n\t\t\t: Record<string, never>;\n\t\tprimaryKey: AnyColumn[];\n\t\tschema: TTables[K]['_']['schema'];\n\t};\n};\n\nexport type ReturnTypeOrValue<T> = T extends (...args: any[]) => infer R ? R\n\t: T;\n\nexport type BuildRelationResult<\n\tTConfig extends TablesRelationalConfig,\n\tTInclude,\n\tTRelations extends Record<string, RelationsBuilderEntry>,\n> = {\n\t[\n\t\tK in\n\t\t\t& NonUndefinedKeysOnly<TInclude>\n\t\t\t& keyof TRelations\n\t]: TRelations[K] extends infer TRel extends Relation ? BuildQueryResult<\n\t\t\tTConfig,\n\t\t\tFindTableInRelationalConfig<TConfig, TRel['targetTable']>,\n\t\t\tAssume<TInclude[K], true | Record<string, unknown>>\n\t\t> extends infer TResult ? TRel extends One<string, string> ?\n\t\t\t\t\t| TResult\n\t\t\t\t\t| (Equal<TRel['optional'], true> extends true ? null : never)\n\t\t\t: TResult[]\n\t\t: never\n\t\t: TRelations[K] extends AggregatedField<infer TData> ? TData\n\t\t: never;\n};\n\nexport type NonUndefinedKeysOnly<T> =\n\t& ExtractObjectValues<\n\t\t{\n\t\t\t[K in keyof T as T[K] extends undefined ? never : K]: K;\n\t\t}\n\t>\n\t& keyof T;\n\nexport type BuildQueryResult<\n\tTSchema extends TablesRelationalConfig,\n\tTTableConfig extends TableRelationalConfig,\n\tTFullSelection extends true | Record<string, unknown>,\n> = Equal<TFullSelection, true> extends true ? InferModelFromColumns<TTableConfig['columns']>\n\t: TFullSelection extends Record<string, unknown> ? Simplify<\n\t\t\t& (TFullSelection['columns'] extends Record<string, unknown> ? InferModelFromColumns<\n\t\t\t\t\t{\n\t\t\t\t\t\t[\n\t\t\t\t\t\t\tK in Equal<\n\t\t\t\t\t\t\t\tExclude<\n\t\t\t\t\t\t\t\t\tTFullSelection['columns'][\n\t\t\t\t\t\t\t\t\t\t& keyof TFullSelection['columns']\n\t\t\t\t\t\t\t\t\t\t& keyof TTableConfig['columns']\n\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\tundefined\n\t\t\t\t\t\t\t\t>,\n\t\t\t\t\t\t\t\tfalse\n\t\t\t\t\t\t\t> extends true ? Exclude<\n\t\t\t\t\t\t\t\t\tkeyof TTableConfig['columns'],\n\t\t\t\t\t\t\t\t\tNonUndefinedKeysOnly<TFullSelection['columns']>\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t:\n\t\t\t\t\t\t\t\t\t& {\n\t\t\t\t\t\t\t\t\t\t[K in keyof TFullSelection['columns']]: Equal<\n\t\t\t\t\t\t\t\t\t\t\tTFullSelection['columns'][K],\n\t\t\t\t\t\t\t\t\t\t\ttrue\n\t\t\t\t\t\t\t\t\t\t> extends true ? K\n\t\t\t\t\t\t\t\t\t\t\t: never;\n\t\t\t\t\t\t\t\t\t}[keyof TFullSelection['columns']]\n\t\t\t\t\t\t\t\t\t& keyof TTableConfig['columns']\n\t\t\t\t\t\t]: TTableConfig['columns'][K];\n\t\t\t\t\t}\n\t\t\t\t>\n\t\t\t\t: InferModelFromColumns<TTableConfig['columns']>)\n\t\t\t& (TFullSelection['extras'] extends\n\t\t\t\t| Record<string, unknown>\n\t\t\t\t| ((...args: any[]) => Record<string, unknown>) ? {\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],\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 NormalizedRelation {\n\tfields: AnyColumn[];\n\treferences: AnyColumn[];\n}\n\nexport interface BuildRelationalQueryResult {\n\tselection: {\n\t\tkey: string;\n\t\tfield: Column | Table | SQL | SQL.Aliased | SQLWrapper | AggregatedField;\n\t\tisArray?: boolean;\n\t\tselection?: BuildRelationalQueryResult['selection'];\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): Record<string, unknown> {\n\tfor (\n\t\tconst selectionItem of buildQueryResultSelection\n\t) {\n\t\tconst field = selectionItem.field!;\n\t\tif (is(field, Table)) {\n\t\t\tif (row[selectionItem.key] === null) continue;\n\t\t\tif (parseJson) row[selectionItem.key] = JSON.parse(row[selectionItem.key] as string);\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(item, selectionItem.selection!, mapColumnValue);\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);\n\n\t\t\tcontinue;\n\t\t}\n\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\t\trow[selectionItem.key] = decoder.mapFromDriverValue(value);\n\t}\n\n\treturn row;\n}\n\nexport class RelationsBuilderTable<TTableName extends string = string> implements SQLWrapper {\n\tstatic readonly [entityKind]: string = 'RelationsBuilderTable';\n\n\treadonly _: {\n\t\treadonly name: TTableName;\n\t\treadonly table: AnyTable<{ name: TTableName }>;\n\t};\n\n\tconstructor(table: AnyTable<{ name: TTableName }>) {\n\t\tthis._ = {\n\t\t\tname: getTableName(table),\n\t\t\ttable,\n\t\t};\n\t}\n\n\tgetSQL(): SQL {\n\t\treturn this._.table.getSQL();\n\t}\n}\n\nexport type RelationsBuilderColumnConfig<TTableName extends string = string, TData = unknown> = {\n\treadonly tableName: TTableName;\n\treadonly data: TData;\n\treadonly column: AnyColumn<{ tableName: TTableName }>;\n\tthrough?: RelationsBuilderColumnBase;\n};\n\nexport type RelationsBuilderColumnBase<TTableName extends string = string, TData = unknown> = {\n\t_: RelationsBuilderColumnConfig<TTableName, TData>;\n} & SQLWrapper;\n\nexport class RelationsBuilderColumn<\n\tTTableName extends string = string,\n\tTData = unknown,\n> implements SQLWrapper, RelationsBuilderColumnBase<TTableName, TData> {\n\tstatic readonly [entityKind]: string = 'RelationsBuilderColumn';\n\n\treadonly _: {\n\t\treadonly tableName: TTableName;\n\t\treadonly data: TData;\n\t\treadonly column: AnyColumn<{ tableName: TTableName }>;\n\t\tthrough?: RelationsBuilderColumnBase;\n\t};\n\n\tconstructor(column: AnyColumn<{ tableName: TTableName }>) {\n\t\tthis._ = {\n\t\t\ttableName: getTableName(column.table) as TTableName,\n\t\t\tdata: undefined as TData,\n\t\t\tcolumn,\n\t\t};\n\t}\n\n\tthrough(column: RelationsBuilderColumnBase<string, TData>): Omit<this, 'through'> {\n\t\tthis._.through = column;\n\n\t\treturn this;\n\t}\n\n\tgetSQL(): SQL {\n\t\treturn this._.column.getSQL();\n\t}\n}\n\nexport type RelationFieldsFilterInternals<T> = {\n\teq?: T;\n\tne?: T;\n\tgt?: T;\n\tgte?: T;\n\tlt?: T;\n\tlte?: T;\n\tin?: T[];\n\tnotIn?: T[];\n\tlike?: string;\n\tilike?: string;\n\tnotLike?: string;\n\tnotIlike?: string;\n\tisNull?: true;\n\tisNotNull?: true;\n\t$not?: RelationsFieldFilter<T>;\n\t$or?: RelationsFieldFilter<T>[];\n};\n\nexport type RelationsFieldFilter<T> = T | RelationFieldsFilterInternals<T>;\n\nexport type RelationsFilter<TColumns extends Record<string, Column>> =\n\t& {\n\t\t[K in keyof TColumns]?: RelationsFieldFilter<TColumns[K]['_']['data']>;\n\t}\n\t& {\n\t\t$or?: RelationsFilter<TColumns>[];\n\t\t$not?: RelationsFilter<TColumns>[];\n\t\t$raw?: (\n\t\t\tcolumns: {\n\t\t\t\t[K in keyof TColumns]: TColumns[K];\n\t\t\t},\n\t\t\toperators: Operators,\n\t\t) => SQL;\n\t};\n\nexport interface OneConfig<\n\tTSchema extends Record<string, Table>,\n\tTSourceColumns extends\n\t\t| Readonly<[RelationsBuilderColumnBase, ...RelationsBuilderColumnBase[]]>\n\t\t| Readonly<RelationsBuilderColumnBase>,\n\tTTargetTableName extends string,\n\tTOptional extends boolean,\n> {\n\tfrom?: TSourceColumns | Writable<TSourceColumns>;\n\tto?: TSourceColumns extends [RelationsBuilderColumnBase, ...RelationsBuilderColumnBase[]]\n\t\t? { [K in keyof TSourceColumns]: RelationsBuilderColumnBase<TTargetTableName> }\n\t\t: RelationsBuilderColumnBase<TTargetTableName>;\n\twhere?: TSourceColumns extends [RelationsBuilderColumnBase, ...RelationsBuilderColumnBase[]]\n\t\t? RelationsFilter<TSchema[TSourceColumns[number]['_']['tableName']]['_']['columns']>\n\t\t: RelationsFilter<TSchema[Assume<TSourceColumns, RelationsBuilderColumnBase>['_']['tableName']]['_']['columns']>;\n\toptional?: TOptional;\n\talias?: string;\n}\n\nexport type AnyOneConfig = OneConfig<\n\tRecord<string, Table>,\n\tReadonly<[RelationsBuilderColumnBase, ...RelationsBuilderColumnBase[]] | RelationsBuilderColumnBase<string, unknown>>,\n\tstring,\n\tboolean\n>;\n\nexport interface ManyConfig<\n\tTSchema extends Record<string, Table>,\n\tTSourceColumns extends\n\t\t| Readonly<[RelationsBuilderColumnBase, ...RelationsBuilderColumnBase[]]>\n\t\t| Readonly<RelationsBuilderColumnBase>,\n\tTTargetTableName extends string,\n> {\n\tfrom?: TSourceColumns;\n\tto?: TSourceColumns extends [RelationsBuilderColumnBase, ...RelationsBuilderColumnBase[]]\n\t\t? { [K in keyof TSourceColumns]: RelationsBuilderColumnBase<TTargetTableName> }\n\t\t: RelationsBuilderColumnBase<TTargetTableName>;\n\twhere?: TSourceColumns extends [RelationsBuilderColumnBase, ...RelationsBuilderColumnBase[]]\n\t\t? RelationsFilter<TSchema[TSourceColumns[number]['_']['tableName']]['_']['columns']>\n\t\t: RelationsFilter<TSchema[Assume<TSourceColumns, RelationsBuilderColumnBase>['_']['tableName']]['_']['columns']>;\n\talias?: string;\n}\n\nexport type AnyManyConfig = ManyConfig<\n\tRecord<string, Table>,\n\tReadonly<[RelationsBuilderColumnBase, ...RelationsBuilderColumnBase[]]> | Readonly<RelationsBuilderColumnBase>,\n\tstring\n>;\n\nexport interface OneFn<\n\tTTables extends Record<string, Table>,\n\tTTargetTableName extends string,\n> {\n\t<\n\t\t// \"any\" default value is required for cases where config is not provided, to satisfy the source table name constraint\n\t\tTSourceColumns extends\n\t\t\t| Readonly<[RelationsBuilderColumnBase, ...RelationsBuilderColumnBase[]]>\n\t\t\t| RelationsBuilderColumnBase = any,\n\t\tTOptional extends boolean = false,\n\t>(\n\t\tconfig?: OneConfig<TTables, TSourceColumns, TTargetTableName, TOptional>,\n\t): One<\n\t\tTSourceColumns extends [RelationsBuilderColumnBase, ...RelationsBuilderColumnBase[]]\n\t\t\t? TSourceColumns[number]['_']['tableName']\n\t\t\t: Assume<TSourceColumns, RelationsBuilderColumnBase>['_']['tableName'],\n\t\tTTargetTableName,\n\t\tTOptional\n\t>;\n}\n\nexport interface ManyFn<\n\tTTables extends Record<string, Table>,\n\tTTargetTableName extends string,\n> {\n\t<\n\t\t// \"any\" default value is required for cases where config is not provided, to satisfy the source table name constraint\n\t\tTSourceColumns extends\n\t\t\t| Readonly<[RelationsBuilderColumnBase, ...RelationsBuilderColumnBase[]]>\n\t\t\t| RelationsBuilderColumnBase = any,\n\t>(\n\t\tconfig?: ManyConfig<TTables, TSourceColumns, TTargetTableName>,\n\t): Many<\n\t\tTSourceColumns extends [RelationsBuilderColumnBase, ...RelationsBuilderColumnBase[]]\n\t\t\t? TSourceColumns[number]['_']['tableName']\n\t\t\t: Assume<TSourceColumns, RelationsBuilderColumnBase>['_']['tableName'],\n\t\tTTargetTableName\n\t>;\n}\n\nexport class RelationsHelperStatic<TTables extends Record<string, Table>> {\n\tstatic readonly [entityKind]: string = 'RelationsHelperStatic';\n\tdeclare readonly $brand: 'RelationsHelperStatic';\n\n\treadonly _: {\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>> = {};\n\t\tconst many: Record<string, ManyFn<TTables, 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(table, config as DBQueryConfig<'one'>);\n\t\t\t};\n\n\t\t\tmany[tableName] = (config) => {\n\t\t\t\treturn new Many(table, config as DBQueryConfig<'many'>);\n\t\t\t};\n\t\t}\n\n\t\tthis.one = one as this['one'];\n\t\tthis.many = many as this['many'];\n\t}\n\n\tone: {\n\t\t[K in keyof TTables]: OneFn<TTables, K & string>;\n\t};\n\n\tmany: {\n\t\t[K in keyof TTables]: ManyFn<TTables, K & string>;\n\t};\n\n\taggs = {\n\t\tcount(): Count {\n\t\t\treturn new Count();\n\t\t},\n\t};\n}\n\nexport type RelationsBuilder<TSchema extends Record<string, Table>> =\n\t& {\n\t\t[TTableName in keyof TSchema & string]:\n\t\t\t& {\n\t\t\t\t[TColumnName in keyof TSchema[TTableName]['_']['columns']]: RelationsBuilderColumn<\n\t\t\t\t\tTTableName,\n\t\t\t\t\tTSchema[TTableName]['_']['columns'][TColumnName]['_']['data']\n\t\t\t\t>;\n\t\t\t}\n\t\t\t& RelationsBuilderTable<TTableName>;\n\t}\n\t& RelationsHelperStatic<TSchema>;\n\nexport type RelationsBuilderConfig<TTables extends Record<string, Table>> = {\n\t[TTableName in keyof TTables & string]?: Record<string, RelationsBuilderEntry<TTables, TTableName>>;\n};\n\nexport type RelationsBuilderEntry<\n\tTTables extends Record<string, Table> = Record<string, Table>,\n\tTSourceTableName extends string = string,\n> =\n\t| Relation<TSourceTableName, keyof TTables & string>\n\t| AggregatedField<any>;\n\nexport type ExtractTablesFromSchema<TSchema extends Record<string, unknown>> = {\n\t[K in keyof TSchema as TSchema[K] extends Table ? K : never]: TSchema[K] extends Table ? TSchema[K] : never;\n};\n\nexport function createRelationsHelper<\n\tTSchema extends Record<string, unknown>,\n\tTTables extends Record<string, Table>,\n>(schema: TSchema): RelationsBuilder<TTables> {\n\tconst schemaTables = Object.fromEntries(\n\t\tObject.entries(schema).filter((e): e is [typeof e[0], Table] => is(e[1], Table)),\n\t);\n\tconst helperStatic = new RelationsHelperStatic(schemaTables);\n\tconst tables = Object.entries(schema).reduce<Record<string, RelationsBuilderTable>>((acc, [key, value]) => {\n\t\tif (is(value, Table)) {\n\t\t\tconst rTable = new RelationsBuilderTable(value);\n\t\t\tconst columns = Object.entries(getTableColumns(value)).reduce<Record<string, RelationsBuilderColumnBase>>(\n\t\t\t\t(acc, [key, column]) => {\n\t\t\t\t\tconst rbColumn = new RelationsBuilderColumn(column);\n\t\t\t\t\tacc[key] = rbColumn;\n\t\t\t\t\treturn acc;\n\t\t\t\t},\n\t\t\t\t{},\n\t\t\t);\n\t\t\tacc[key] = Object.assign(rTable, columns);\n\t\t}\n\t\treturn acc;\n\t}, {});\n\n\treturn Object.assign(helperStatic, tables) as RelationsBuilder<TTables>;\n}\n\nexport function defineRelations<\n\tTSchema extends Record<string, unknown>,\n\tTConfig extends RelationsBuilderConfig<TTables>,\n\tTTables extends Record<string, Table> = ExtractTablesFromSchema<TSchema>,\n>(\n\tschema: TSchema,\n\trelations: (helpers: RelationsBuilder<TTables>) => TConfig,\n): Relations<TSchema, TTables, TConfig> {\n\treturn new Relations(\n\t\tschema,\n\t\tschema as unknown as TTables,\n\t\trelations(createRelationsHelper(schema as unknown as TTables)),\n\t);\n}\n\nexport type WithContainer<TRelatedTables extends Record<string, Table>> = {\n\twith?: {\n\t\t[K in keyof TRelatedTables]?: boolean | DBQueryConfig;\n\t};\n};\n\nexport type ColumnWithTSName = {\n\tcolumn: Column;\n\ttsName: string;\n};\n\nexport type RelationsOrder<TColumns extends Record<string, Column>> = {\n\t[K in keyof TColumns]?: 'asc' | 'desc';\n};\n\nexport type OrderBy =\n\t| ValueOrArray<AnyColumn | SQL>\n\t| ((\n\t\tfields: Record<string, Column>,\n\t\toperators: OrderByOperators,\n\t) => ValueOrArray<AnyColumn | SQL>);\n\nexport type Extras =\n\t| Record<string, SQL>\n\t| ((\n\t\tfields: Record<string, Column>,\n\t\toperators: SQLOperator,\n\t) => Record<string, SQL>);\n\nfunction relationsFieldFilterToSQL(column: Column, filter: RelationsFieldFilter<unknown>): SQL | undefined {\n\tif (typeof filter !== 'object') 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) {\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\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 RelationsFilter<any>[]).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\tdefault: {\n\t\t\t\tparts.push(\n\t\t\t\t\t(operators[target as keyof typeof operators] as ((col: Column, 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 relationFilterToSQL(\n\ttable: Table,\n\tfilter: RelationsFilter<Record<string, Column>>,\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\tif (value) {\n\t\t\t\t\tparts.push(\n\t\t\t\t\t\t(value as (table: Record<string, Column>, operators: Operators) => SQL)(table[Columns], operators),\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 '$or': {\n\t\t\t\tif (!(value as RelationsFilter<Record<string, Column>>[] | 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 RelationsFilter<Record<string, Column>>[]).map((subFilter) =>\n\t\t\t\t\t\t\trelationFilterToSQL(table, subFilter)\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 as RelationsFilter<Record<string, Column>>[] | undefined)?.length) continue;\n\n\t\t\t\tparts.push(\n\t\t\t\t\tnot(\n\t\t\t\t\t\tand(\n\t\t\t\t\t\t\t...(value as RelationsFilter<Record<string, Column>>[]).map((subFilter) =>\n\t\t\t\t\t\t\t\trelationFilterToSQL(table, subFilter)\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\t\t\tdefault: {\n\t\t\t\tconst colFilter = relationsFieldFilterToSQL(\n\t\t\t\t\ttable[target as keyof Table] as Column,\n\t\t\t\t\tvalue as RelationsFieldFilter<unknown>,\n\t\t\t\t);\n\t\t\t\tif (colFilter) parts.push(colFilter);\n\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn and(...parts)!;\n}\n\nexport function relationsOrderToSQL(\n\ttable: Table,\n\torders:\n\t\t| ValueOrArray<AnyColumn | SQL>\n\t\t| ((\n\t\t\tfields: Record<string, Column>,\n\t\t\toperators: OrderByOperators,\n\t\t) => ValueOrArray<AnyColumn | SQL>),\n): SQL | undefined {\n\tconst data = typeof orders === 'function'\n\t\t? orders(table[Columns], orderByOperators)\n\t\t: orders;\n\n\treturn is(data, SQL)\n\t\t? data\n\t\t: Array.isArray(data)\n\t\t? data.length\n\t\t\t? sql.join(data.map((o) => is(o, SQL) ? o : asc(o)), sql`, `)\n\t\t\t: undefined\n\t\t: asc(data);\n}\n\nexport function relationExtrasToSQL(\n\ttable: Table,\n\textras:\n\t\t| Record<string, SQLWrapper>\n\t\t| ((columns: Record<string, Column>, operators: SQLOperator) => Record<string, SQLWrapper>),\n) {\n\tconst subqueries: SQL[] = [];\n\tconst selection: BuildRelationalQueryResult['selection'] = [];\n\n\tfor (\n\t\tconst [key, extra] of Object.entries(\n\t\t\ttypeof extras === 'function' ? extras(table[Columns], { sql: operators.sql }) : extras,\n\t\t)\n\t) {\n\t\tif (!extra) continue;\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 function relationToSQL(relation: Relation): SQL | undefined {\n\tconst table = relation.sourceTable;\n\n\tconst columnWhere = relation.sourceColumns.map((s, i) => {\n\t\tconst t = relation.targetColumns[i]!;\n\n\t\treturn eq(s, t);\n\t});\n\n\tconst targetWhere = relation.where\n\t\t? and(...columnWhere, relationFilterToSQL(table, relation.where))\n\t\t: and(...columnWhere);\n\n\treturn targetWhere;\n}\n"],"mappings":"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","names":["import_table","acc","key"]}
|
package/relations.d.cts
CHANGED
|
@@ -111,14 +111,8 @@ export declare function getOrderByOperators(): {
|
|
|
111
111
|
desc: typeof desc;
|
|
112
112
|
};
|
|
113
113
|
export type OrderByOperators = ReturnType<typeof getOrderByOperators>;
|
|
114
|
-
export type
|
|
115
|
-
[K in keyof TSchema as TSchema[K]['
|
|
116
|
-
}>;
|
|
117
|
-
export type FindTableByDBNameTablesRecord<TSchema extends Record<string, Table>, TTableName extends string> = ExtractObjectValues<{
|
|
118
|
-
[K in keyof TSchema as TSchema[K]['_']['name'] extends TTableName ? K : never]: TSchema[K];
|
|
119
|
-
}>;
|
|
120
|
-
export type FindTableInRelationsConfig<TSchema extends TablesRelationalConfig, TTargetTable extends Table, TTableName extends string = TTargetTable['_']['name'], TSchemaName extends string | undefined = TTargetTable['_']['schema'] extends undefined ? undefined : TTargetTable['_']['schema']> = ExtractObjectValues<{
|
|
121
|
-
[K in keyof TSchema as TSchema[K]['dbName'] extends TTableName ? TSchema[K]['schema'] extends undefined ? TSchemaName extends undefined ? K : never : TSchemaName extends TSchema[K]['schema'] ? K : never : never]: TSchema[K];
|
|
114
|
+
export type FindTableInRelationalConfig<TSchema extends TablesRelationalConfig, TTargetTable extends Table, TTableName extends string = TTargetTable['_']['name']> = ExtractObjectValues<{
|
|
115
|
+
[K in keyof TSchema as TSchema[K]['tsName'] extends TTableName ? K : never]: TSchema[K];
|
|
122
116
|
}>;
|
|
123
117
|
export type SQLOperator = {
|
|
124
118
|
sql: Operators['sql'];
|
|
@@ -131,7 +125,7 @@ export type DBQueryConfig<TRelationType extends 'one' | 'many' = 'one' | 'many',
|
|
|
131
125
|
[K in keyof TTableConfig['columns']]?: false;
|
|
132
126
|
};
|
|
133
127
|
with?: {
|
|
134
|
-
[K in keyof TTableConfig['relations']]?: true | (TTableConfig['relations'][K] extends Relation ? DBQueryConfig<TTableConfig['relations'][K] extends One<string, string> ? 'one' : 'many', TSchema,
|
|
128
|
+
[K in keyof TTableConfig['relations']]?: true | (TTableConfig['relations'][K] extends Relation ? DBQueryConfig<TTableConfig['relations'][K] extends One<string, string> ? 'one' : 'many', TSchema, FindTableInRelationalConfig<TSchema, TTableConfig['relations'][K]['targetTable']>> : never);
|
|
135
129
|
};
|
|
136
130
|
extras?: Record<string, SQLWrapper> | ((fields: Simplify<[
|
|
137
131
|
TTableConfig['columns']
|
|
@@ -151,7 +145,7 @@ export interface TableRelationalConfig {
|
|
|
151
145
|
columns: Record<string, Column>;
|
|
152
146
|
relations: Record<string, RelationsBuilderEntry>;
|
|
153
147
|
primaryKey: AnyColumn[];
|
|
154
|
-
schema
|
|
148
|
+
schema: string | undefined;
|
|
155
149
|
}
|
|
156
150
|
export type TablesRelationalConfig = Record<string, TableRelationalConfig>;
|
|
157
151
|
export interface RelationalSchemaConfig<TTablesConfig extends TablesRelationalConfig> {
|
|
@@ -175,7 +169,7 @@ export type ExtractTablesWithRelations<TRelations extends Relations, TTables ext
|
|
|
175
169
|
};
|
|
176
170
|
export type ReturnTypeOrValue<T> = T extends (...args: any[]) => infer R ? R : T;
|
|
177
171
|
export type BuildRelationResult<TConfig extends TablesRelationalConfig, TInclude, TRelations extends Record<string, RelationsBuilderEntry>> = {
|
|
178
|
-
[K in NonUndefinedKeysOnly<TInclude> & keyof TRelations]: TRelations[K] extends infer TRel extends Relation ? BuildQueryResult<TConfig,
|
|
172
|
+
[K in NonUndefinedKeysOnly<TInclude> & keyof TRelations]: TRelations[K] extends infer TRel extends Relation ? BuildQueryResult<TConfig, FindTableInRelationalConfig<TConfig, TRel['targetTable']>, Assume<TInclude[K], true | Record<string, unknown>>> extends infer TResult ? TRel extends One<string, string> ? TResult | (Equal<TRel['optional'], true> extends true ? null : never) : TResult[] : never : TRelations[K] extends AggregatedField<infer TData> ? TData : never;
|
|
179
173
|
};
|
|
180
174
|
export type NonUndefinedKeysOnly<T> = ExtractObjectValues<{
|
|
181
175
|
[K in keyof T as T[K] extends undefined ? never : K]: K;
|
|
@@ -185,7 +179,7 @@ export type BuildQueryResult<TSchema extends TablesRelationalConfig, TTableConfi
|
|
|
185
179
|
[K in keyof TFullSelection['columns']]: Equal<TFullSelection['columns'][K], true> extends true ? K : never;
|
|
186
180
|
}[keyof TFullSelection['columns']] & keyof TTableConfig['columns']]: TTableConfig['columns'][K];
|
|
187
181
|
}> : InferModelFromColumns<TTableConfig['columns']>) & (TFullSelection['extras'] extends Record<string, unknown> | ((...args: any[]) => Record<string, unknown>) ? {
|
|
188
|
-
[K in NonUndefinedKeysOnly<ReturnTypeOrValue<TFullSelection['extras']>>]: Assume<ReturnTypeOrValue<TFullSelection['extras']>[K],
|
|
182
|
+
[K in NonUndefinedKeysOnly<ReturnTypeOrValue<TFullSelection['extras']>>]: ReturnType<Assume<ReturnTypeOrValue<TFullSelection['extras']>[K], SQLWrapper>['getSQL']>['_']['type'];
|
|
189
183
|
} : {}) & (TFullSelection['with'] extends Record<string, unknown> ? BuildRelationResult<TSchema, TFullSelection['with'], TTableConfig['relations']> : {})> : never;
|
|
190
184
|
export interface NormalizedRelation {
|
|
191
185
|
fields: AnyColumn[];
|
|
@@ -267,14 +261,16 @@ export type RelationsFilter<TColumns extends Record<string, Column>> = {
|
|
|
267
261
|
} & {
|
|
268
262
|
$or?: RelationsFilter<TColumns>[];
|
|
269
263
|
$not?: RelationsFilter<TColumns>[];
|
|
270
|
-
$raw?: (
|
|
264
|
+
$raw?: (columns: {
|
|
265
|
+
[K in keyof TColumns]: TColumns[K];
|
|
266
|
+
}, operators: Operators) => SQL;
|
|
271
267
|
};
|
|
272
268
|
export interface OneConfig<TSchema extends Record<string, Table>, TSourceColumns extends Readonly<[RelationsBuilderColumnBase, ...RelationsBuilderColumnBase[]]> | Readonly<RelationsBuilderColumnBase>, TTargetTableName extends string, TOptional extends boolean> {
|
|
273
269
|
from?: TSourceColumns | Writable<TSourceColumns>;
|
|
274
270
|
to?: TSourceColumns extends [RelationsBuilderColumnBase, ...RelationsBuilderColumnBase[]] ? {
|
|
275
271
|
[K in keyof TSourceColumns]: RelationsBuilderColumnBase<TTargetTableName>;
|
|
276
272
|
} : RelationsBuilderColumnBase<TTargetTableName>;
|
|
277
|
-
where?: TSourceColumns extends [RelationsBuilderColumnBase, ...RelationsBuilderColumnBase[]] ? RelationsFilter<
|
|
273
|
+
where?: TSourceColumns extends [RelationsBuilderColumnBase, ...RelationsBuilderColumnBase[]] ? RelationsFilter<TSchema[TSourceColumns[number]['_']['tableName']]['_']['columns']> : RelationsFilter<TSchema[Assume<TSourceColumns, RelationsBuilderColumnBase>['_']['tableName']]['_']['columns']>;
|
|
278
274
|
optional?: TOptional;
|
|
279
275
|
alias?: string;
|
|
280
276
|
}
|
|
@@ -284,7 +280,7 @@ export interface ManyConfig<TSchema extends Record<string, Table>, TSourceColumn
|
|
|
284
280
|
to?: TSourceColumns extends [RelationsBuilderColumnBase, ...RelationsBuilderColumnBase[]] ? {
|
|
285
281
|
[K in keyof TSourceColumns]: RelationsBuilderColumnBase<TTargetTableName>;
|
|
286
282
|
} : RelationsBuilderColumnBase<TTargetTableName>;
|
|
287
|
-
where?: TSourceColumns extends [RelationsBuilderColumnBase, ...RelationsBuilderColumnBase[]] ? RelationsFilter<
|
|
283
|
+
where?: TSourceColumns extends [RelationsBuilderColumnBase, ...RelationsBuilderColumnBase[]] ? RelationsFilter<TSchema[TSourceColumns[number]['_']['tableName']]['_']['columns']> : RelationsFilter<TSchema[Assume<TSourceColumns, RelationsBuilderColumnBase>['_']['tableName']]['_']['columns']>;
|
|
288
284
|
alias?: string;
|
|
289
285
|
}
|
|
290
286
|
export type AnyManyConfig = ManyConfig<Record<string, Table>, Readonly<[RelationsBuilderColumnBase, ...RelationsBuilderColumnBase[]]> | Readonly<RelationsBuilderColumnBase>, string>;
|
|
@@ -302,10 +298,10 @@ export declare class RelationsHelperStatic<TTables extends Record<string, Table>
|
|
|
302
298
|
};
|
|
303
299
|
constructor(tables: TTables);
|
|
304
300
|
one: {
|
|
305
|
-
[K in keyof TTables]: OneFn<TTables,
|
|
301
|
+
[K in keyof TTables]: OneFn<TTables, K & string>;
|
|
306
302
|
};
|
|
307
303
|
many: {
|
|
308
|
-
[K in keyof TTables]: ManyFn<TTables,
|
|
304
|
+
[K in keyof TTables]: ManyFn<TTables, K & string>;
|
|
309
305
|
};
|
|
310
306
|
aggs: {
|
|
311
307
|
count(): Count;
|
|
@@ -313,13 +309,13 @@ export declare class RelationsHelperStatic<TTables extends Record<string, Table>
|
|
|
313
309
|
}
|
|
314
310
|
export type RelationsBuilder<TSchema extends Record<string, Table>> = {
|
|
315
311
|
[TTableName in keyof TSchema & string]: {
|
|
316
|
-
[TColumnName in keyof TSchema[TTableName]['_']['columns']]: RelationsBuilderColumn<
|
|
312
|
+
[TColumnName in keyof TSchema[TTableName]['_']['columns']]: RelationsBuilderColumn<TTableName, TSchema[TTableName]['_']['columns'][TColumnName]['_']['data']>;
|
|
317
313
|
} & RelationsBuilderTable<TTableName>;
|
|
318
314
|
} & RelationsHelperStatic<TSchema>;
|
|
319
315
|
export type RelationsBuilderConfig<TTables extends Record<string, Table>> = {
|
|
320
316
|
[TTableName in keyof TTables & string]?: Record<string, RelationsBuilderEntry<TTables, TTableName>>;
|
|
321
317
|
};
|
|
322
|
-
export type RelationsBuilderEntry<TTables extends Record<string, Table> = Record<string, Table>, TSourceTableName extends string = string> = Relation<
|
|
318
|
+
export type RelationsBuilderEntry<TTables extends Record<string, Table> = Record<string, Table>, TSourceTableName extends string = string> = Relation<TSourceTableName, keyof TTables & string> | AggregatedField<any>;
|
|
323
319
|
export type ExtractTablesFromSchema<TSchema extends Record<string, unknown>> = {
|
|
324
320
|
[K in keyof TSchema as TSchema[K] extends Table ? K : never]: TSchema[K] extends Table ? TSchema[K] : never;
|
|
325
321
|
};
|
package/relations.d.ts
CHANGED
|
@@ -111,14 +111,8 @@ export declare function getOrderByOperators(): {
|
|
|
111
111
|
desc: typeof desc;
|
|
112
112
|
};
|
|
113
113
|
export type OrderByOperators = ReturnType<typeof getOrderByOperators>;
|
|
114
|
-
export type
|
|
115
|
-
[K in keyof TSchema as TSchema[K]['
|
|
116
|
-
}>;
|
|
117
|
-
export type FindTableByDBNameTablesRecord<TSchema extends Record<string, Table>, TTableName extends string> = ExtractObjectValues<{
|
|
118
|
-
[K in keyof TSchema as TSchema[K]['_']['name'] extends TTableName ? K : never]: TSchema[K];
|
|
119
|
-
}>;
|
|
120
|
-
export type FindTableInRelationsConfig<TSchema extends TablesRelationalConfig, TTargetTable extends Table, TTableName extends string = TTargetTable['_']['name'], TSchemaName extends string | undefined = TTargetTable['_']['schema'] extends undefined ? undefined : TTargetTable['_']['schema']> = ExtractObjectValues<{
|
|
121
|
-
[K in keyof TSchema as TSchema[K]['dbName'] extends TTableName ? TSchema[K]['schema'] extends undefined ? TSchemaName extends undefined ? K : never : TSchemaName extends TSchema[K]['schema'] ? K : never : never]: TSchema[K];
|
|
114
|
+
export type FindTableInRelationalConfig<TSchema extends TablesRelationalConfig, TTargetTable extends Table, TTableName extends string = TTargetTable['_']['name']> = ExtractObjectValues<{
|
|
115
|
+
[K in keyof TSchema as TSchema[K]['tsName'] extends TTableName ? K : never]: TSchema[K];
|
|
122
116
|
}>;
|
|
123
117
|
export type SQLOperator = {
|
|
124
118
|
sql: Operators['sql'];
|
|
@@ -131,7 +125,7 @@ export type DBQueryConfig<TRelationType extends 'one' | 'many' = 'one' | 'many',
|
|
|
131
125
|
[K in keyof TTableConfig['columns']]?: false;
|
|
132
126
|
};
|
|
133
127
|
with?: {
|
|
134
|
-
[K in keyof TTableConfig['relations']]?: true | (TTableConfig['relations'][K] extends Relation ? DBQueryConfig<TTableConfig['relations'][K] extends One<string, string> ? 'one' : 'many', TSchema,
|
|
128
|
+
[K in keyof TTableConfig['relations']]?: true | (TTableConfig['relations'][K] extends Relation ? DBQueryConfig<TTableConfig['relations'][K] extends One<string, string> ? 'one' : 'many', TSchema, FindTableInRelationalConfig<TSchema, TTableConfig['relations'][K]['targetTable']>> : never);
|
|
135
129
|
};
|
|
136
130
|
extras?: Record<string, SQLWrapper> | ((fields: Simplify<[
|
|
137
131
|
TTableConfig['columns']
|
|
@@ -151,7 +145,7 @@ export interface TableRelationalConfig {
|
|
|
151
145
|
columns: Record<string, Column>;
|
|
152
146
|
relations: Record<string, RelationsBuilderEntry>;
|
|
153
147
|
primaryKey: AnyColumn[];
|
|
154
|
-
schema
|
|
148
|
+
schema: string | undefined;
|
|
155
149
|
}
|
|
156
150
|
export type TablesRelationalConfig = Record<string, TableRelationalConfig>;
|
|
157
151
|
export interface RelationalSchemaConfig<TTablesConfig extends TablesRelationalConfig> {
|
|
@@ -175,7 +169,7 @@ export type ExtractTablesWithRelations<TRelations extends Relations, TTables ext
|
|
|
175
169
|
};
|
|
176
170
|
export type ReturnTypeOrValue<T> = T extends (...args: any[]) => infer R ? R : T;
|
|
177
171
|
export type BuildRelationResult<TConfig extends TablesRelationalConfig, TInclude, TRelations extends Record<string, RelationsBuilderEntry>> = {
|
|
178
|
-
[K in NonUndefinedKeysOnly<TInclude> & keyof TRelations]: TRelations[K] extends infer TRel extends Relation ? BuildQueryResult<TConfig,
|
|
172
|
+
[K in NonUndefinedKeysOnly<TInclude> & keyof TRelations]: TRelations[K] extends infer TRel extends Relation ? BuildQueryResult<TConfig, FindTableInRelationalConfig<TConfig, TRel['targetTable']>, Assume<TInclude[K], true | Record<string, unknown>>> extends infer TResult ? TRel extends One<string, string> ? TResult | (Equal<TRel['optional'], true> extends true ? null : never) : TResult[] : never : TRelations[K] extends AggregatedField<infer TData> ? TData : never;
|
|
179
173
|
};
|
|
180
174
|
export type NonUndefinedKeysOnly<T> = ExtractObjectValues<{
|
|
181
175
|
[K in keyof T as T[K] extends undefined ? never : K]: K;
|
|
@@ -185,7 +179,7 @@ export type BuildQueryResult<TSchema extends TablesRelationalConfig, TTableConfi
|
|
|
185
179
|
[K in keyof TFullSelection['columns']]: Equal<TFullSelection['columns'][K], true> extends true ? K : never;
|
|
186
180
|
}[keyof TFullSelection['columns']] & keyof TTableConfig['columns']]: TTableConfig['columns'][K];
|
|
187
181
|
}> : InferModelFromColumns<TTableConfig['columns']>) & (TFullSelection['extras'] extends Record<string, unknown> | ((...args: any[]) => Record<string, unknown>) ? {
|
|
188
|
-
[K in NonUndefinedKeysOnly<ReturnTypeOrValue<TFullSelection['extras']>>]: Assume<ReturnTypeOrValue<TFullSelection['extras']>[K],
|
|
182
|
+
[K in NonUndefinedKeysOnly<ReturnTypeOrValue<TFullSelection['extras']>>]: ReturnType<Assume<ReturnTypeOrValue<TFullSelection['extras']>[K], SQLWrapper>['getSQL']>['_']['type'];
|
|
189
183
|
} : {}) & (TFullSelection['with'] extends Record<string, unknown> ? BuildRelationResult<TSchema, TFullSelection['with'], TTableConfig['relations']> : {})> : never;
|
|
190
184
|
export interface NormalizedRelation {
|
|
191
185
|
fields: AnyColumn[];
|
|
@@ -267,14 +261,16 @@ export type RelationsFilter<TColumns extends Record<string, Column>> = {
|
|
|
267
261
|
} & {
|
|
268
262
|
$or?: RelationsFilter<TColumns>[];
|
|
269
263
|
$not?: RelationsFilter<TColumns>[];
|
|
270
|
-
$raw?: (
|
|
264
|
+
$raw?: (columns: {
|
|
265
|
+
[K in keyof TColumns]: TColumns[K];
|
|
266
|
+
}, operators: Operators) => SQL;
|
|
271
267
|
};
|
|
272
268
|
export interface OneConfig<TSchema extends Record<string, Table>, TSourceColumns extends Readonly<[RelationsBuilderColumnBase, ...RelationsBuilderColumnBase[]]> | Readonly<RelationsBuilderColumnBase>, TTargetTableName extends string, TOptional extends boolean> {
|
|
273
269
|
from?: TSourceColumns | Writable<TSourceColumns>;
|
|
274
270
|
to?: TSourceColumns extends [RelationsBuilderColumnBase, ...RelationsBuilderColumnBase[]] ? {
|
|
275
271
|
[K in keyof TSourceColumns]: RelationsBuilderColumnBase<TTargetTableName>;
|
|
276
272
|
} : RelationsBuilderColumnBase<TTargetTableName>;
|
|
277
|
-
where?: TSourceColumns extends [RelationsBuilderColumnBase, ...RelationsBuilderColumnBase[]] ? RelationsFilter<
|
|
273
|
+
where?: TSourceColumns extends [RelationsBuilderColumnBase, ...RelationsBuilderColumnBase[]] ? RelationsFilter<TSchema[TSourceColumns[number]['_']['tableName']]['_']['columns']> : RelationsFilter<TSchema[Assume<TSourceColumns, RelationsBuilderColumnBase>['_']['tableName']]['_']['columns']>;
|
|
278
274
|
optional?: TOptional;
|
|
279
275
|
alias?: string;
|
|
280
276
|
}
|
|
@@ -284,7 +280,7 @@ export interface ManyConfig<TSchema extends Record<string, Table>, TSourceColumn
|
|
|
284
280
|
to?: TSourceColumns extends [RelationsBuilderColumnBase, ...RelationsBuilderColumnBase[]] ? {
|
|
285
281
|
[K in keyof TSourceColumns]: RelationsBuilderColumnBase<TTargetTableName>;
|
|
286
282
|
} : RelationsBuilderColumnBase<TTargetTableName>;
|
|
287
|
-
where?: TSourceColumns extends [RelationsBuilderColumnBase, ...RelationsBuilderColumnBase[]] ? RelationsFilter<
|
|
283
|
+
where?: TSourceColumns extends [RelationsBuilderColumnBase, ...RelationsBuilderColumnBase[]] ? RelationsFilter<TSchema[TSourceColumns[number]['_']['tableName']]['_']['columns']> : RelationsFilter<TSchema[Assume<TSourceColumns, RelationsBuilderColumnBase>['_']['tableName']]['_']['columns']>;
|
|
288
284
|
alias?: string;
|
|
289
285
|
}
|
|
290
286
|
export type AnyManyConfig = ManyConfig<Record<string, Table>, Readonly<[RelationsBuilderColumnBase, ...RelationsBuilderColumnBase[]]> | Readonly<RelationsBuilderColumnBase>, string>;
|
|
@@ -302,10 +298,10 @@ export declare class RelationsHelperStatic<TTables extends Record<string, Table>
|
|
|
302
298
|
};
|
|
303
299
|
constructor(tables: TTables);
|
|
304
300
|
one: {
|
|
305
|
-
[K in keyof TTables]: OneFn<TTables,
|
|
301
|
+
[K in keyof TTables]: OneFn<TTables, K & string>;
|
|
306
302
|
};
|
|
307
303
|
many: {
|
|
308
|
-
[K in keyof TTables]: ManyFn<TTables,
|
|
304
|
+
[K in keyof TTables]: ManyFn<TTables, K & string>;
|
|
309
305
|
};
|
|
310
306
|
aggs: {
|
|
311
307
|
count(): Count;
|
|
@@ -313,13 +309,13 @@ export declare class RelationsHelperStatic<TTables extends Record<string, Table>
|
|
|
313
309
|
}
|
|
314
310
|
export type RelationsBuilder<TSchema extends Record<string, Table>> = {
|
|
315
311
|
[TTableName in keyof TSchema & string]: {
|
|
316
|
-
[TColumnName in keyof TSchema[TTableName]['_']['columns']]: RelationsBuilderColumn<
|
|
312
|
+
[TColumnName in keyof TSchema[TTableName]['_']['columns']]: RelationsBuilderColumn<TTableName, TSchema[TTableName]['_']['columns'][TColumnName]['_']['data']>;
|
|
317
313
|
} & RelationsBuilderTable<TTableName>;
|
|
318
314
|
} & RelationsHelperStatic<TSchema>;
|
|
319
315
|
export type RelationsBuilderConfig<TTables extends Record<string, Table>> = {
|
|
320
316
|
[TTableName in keyof TTables & string]?: Record<string, RelationsBuilderEntry<TTables, TTableName>>;
|
|
321
317
|
};
|
|
322
|
-
export type RelationsBuilderEntry<TTables extends Record<string, Table> = Record<string, Table>, TSourceTableName extends string = string> = Relation<
|
|
318
|
+
export type RelationsBuilderEntry<TTables extends Record<string, Table> = Record<string, Table>, TSourceTableName extends string = string> = Relation<TSourceTableName, keyof TTables & string> | AggregatedField<any>;
|
|
323
319
|
export type ExtractTablesFromSchema<TSchema extends Record<string, unknown>> = {
|
|
324
320
|
[K in keyof TSchema as TSchema[K] extends Table ? K : never]: TSchema[K] extends Table ? TSchema[K] : never;
|
|
325
321
|
};
|
package/relations.js
CHANGED
|
@@ -432,8 +432,11 @@ function relationFilterToSQL(table, filter) {
|
|
|
432
432
|
continue;
|
|
433
433
|
switch (target) {
|
|
434
434
|
case "$raw": {
|
|
435
|
-
if (value)
|
|
436
|
-
parts.push(
|
|
435
|
+
if (value) {
|
|
436
|
+
parts.push(
|
|
437
|
+
value(table[Columns], operators)
|
|
438
|
+
);
|
|
439
|
+
}
|
|
437
440
|
continue;
|
|
438
441
|
}
|
|
439
442
|
case "$or": {
|