drizzle-orm 0.32.0-e7cf338 → 0.32.1-3d4e79a
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/aws-data-api/pg/driver.cjs +3 -4
- package/aws-data-api/pg/driver.cjs.map +1 -1
- package/aws-data-api/pg/driver.js +3 -4
- package/aws-data-api/pg/driver.js.map +1 -1
- package/aws-data-api/pg/session.cjs.map +1 -1
- package/aws-data-api/pg/session.d.cts +2 -2
- package/aws-data-api/pg/session.d.ts +2 -2
- package/aws-data-api/pg/session.js.map +1 -1
- package/column-builder.cjs.map +1 -1
- package/column-builder.d.cts +27 -3
- package/column-builder.d.ts +27 -3
- package/column-builder.js.map +1 -1
- package/column.cjs.map +1 -1
- package/column.d.cts +6 -0
- package/column.d.ts +6 -0
- package/column.js.map +1 -1
- package/d1/session.cjs.map +1 -1
- package/d1/session.d.cts +2 -2
- package/d1/session.d.ts +2 -2
- package/d1/session.js.map +1 -1
- package/libsql/session.d.cts +1 -1
- package/libsql/session.d.ts +1 -1
- package/mysql-core/columns/common.cjs.map +1 -1
- package/mysql-core/columns/common.d.cts +2 -2
- package/mysql-core/columns/common.d.ts +2 -2
- package/mysql-core/columns/common.js.map +1 -1
- package/mysql-core/columns/serial.cjs.map +1 -1
- package/mysql-core/columns/serial.d.cts +3 -3
- package/mysql-core/columns/serial.d.ts +3 -3
- package/mysql-core/columns/serial.js.map +1 -1
- package/mysql-core/db.cjs.map +1 -1
- package/mysql-core/db.d.cts +6 -6
- package/mysql-core/db.d.ts +6 -6
- package/mysql-core/db.js.map +1 -1
- package/mysql-core/dialect.cjs +15 -5
- package/mysql-core/dialect.cjs.map +1 -1
- package/mysql-core/dialect.d.cts +4 -1
- package/mysql-core/dialect.d.ts +4 -1
- package/mysql-core/dialect.js +16 -6
- package/mysql-core/dialect.js.map +1 -1
- package/mysql-core/query-builders/delete.cjs.map +1 -1
- package/mysql-core/query-builders/delete.d.cts +6 -6
- package/mysql-core/query-builders/delete.d.ts +6 -6
- package/mysql-core/query-builders/delete.js.map +1 -1
- package/mysql-core/query-builders/insert.cjs +17 -3
- package/mysql-core/query-builders/insert.cjs.map +1 -1
- package/mysql-core/query-builders/insert.d.cts +27 -11
- package/mysql-core/query-builders/insert.d.ts +27 -11
- package/mysql-core/query-builders/insert.js +18 -4
- package/mysql-core/query-builders/insert.js.map +1 -1
- package/mysql-core/query-builders/query-builder.d.cts +2 -2
- package/mysql-core/query-builders/query-builder.d.ts +2 -2
- package/mysql-core/query-builders/query.cjs.map +1 -1
- package/mysql-core/query-builders/query.d.cts +3 -3
- package/mysql-core/query-builders/query.d.ts +3 -3
- package/mysql-core/query-builders/query.js.map +1 -1
- package/mysql-core/query-builders/select.cjs.map +1 -1
- package/mysql-core/query-builders/select.js.map +1 -1
- package/mysql-core/query-builders/select.types.cjs.map +1 -1
- package/mysql-core/query-builders/select.types.d.cts +2 -2
- package/mysql-core/query-builders/select.types.d.ts +2 -2
- package/mysql-core/query-builders/update.cjs.map +1 -1
- package/mysql-core/query-builders/update.d.cts +7 -7
- package/mysql-core/query-builders/update.d.ts +7 -7
- package/mysql-core/query-builders/update.js.map +1 -1
- package/mysql-core/session.cjs +5 -5
- package/mysql-core/session.cjs.map +1 -1
- package/mysql-core/session.d.cts +14 -14
- package/mysql-core/session.d.ts +14 -14
- package/mysql-core/session.js +3 -3
- package/mysql-core/session.js.map +1 -1
- package/mysql-proxy/driver.cjs.map +1 -1
- package/mysql-proxy/driver.d.cts +2 -0
- package/mysql-proxy/driver.d.ts +2 -0
- package/mysql-proxy/driver.js.map +1 -1
- package/mysql-proxy/session.cjs +33 -7
- package/mysql-proxy/session.cjs.map +1 -1
- package/mysql-proxy/session.d.cts +10 -8
- package/mysql-proxy/session.d.ts +10 -8
- package/mysql-proxy/session.js +34 -8
- package/mysql-proxy/session.js.map +1 -1
- package/mysql2/session.cjs +33 -6
- package/mysql2/session.cjs.map +1 -1
- package/mysql2/session.d.cts +11 -9
- package/mysql2/session.d.ts +11 -9
- package/mysql2/session.js +36 -9
- package/mysql2/session.js.map +1 -1
- package/neon-http/driver.cjs +1 -0
- package/neon-http/driver.cjs.map +1 -1
- package/neon-http/driver.js +1 -0
- package/neon-http/driver.js.map +1 -1
- package/neon-http/session.cjs.map +1 -1
- package/neon-http/session.d.cts +2 -2
- package/neon-http/session.d.ts +2 -2
- package/neon-http/session.js.map +1 -1
- package/neon-serverless/session.cjs.map +1 -1
- package/neon-serverless/session.d.cts +2 -2
- package/neon-serverless/session.d.ts +2 -2
- package/neon-serverless/session.js.map +1 -1
- package/node-postgres/session.cjs.map +1 -1
- package/node-postgres/session.d.cts +2 -2
- package/node-postgres/session.d.ts +2 -2
- package/node-postgres/session.js.map +1 -1
- package/package.json +146 -29
- package/pg-core/db.cjs.map +1 -1
- package/pg-core/db.d.cts +6 -6
- package/pg-core/db.d.ts +6 -6
- package/pg-core/db.js.map +1 -1
- package/pg-core/dialect.cjs +3 -3
- package/pg-core/dialect.cjs.map +1 -1
- package/pg-core/dialect.js +4 -4
- package/pg-core/dialect.js.map +1 -1
- package/pg-core/indexes.cjs.map +1 -1
- package/pg-core/indexes.d.cts +3 -3
- package/pg-core/indexes.d.ts +3 -3
- package/pg-core/indexes.js.map +1 -1
- package/pg-core/query-builders/delete.cjs.map +1 -1
- package/pg-core/query-builders/delete.d.cts +6 -6
- package/pg-core/query-builders/delete.d.ts +6 -6
- package/pg-core/query-builders/delete.js.map +1 -1
- package/pg-core/query-builders/insert.cjs.map +1 -1
- package/pg-core/query-builders/insert.d.cts +7 -7
- package/pg-core/query-builders/insert.d.ts +7 -7
- package/pg-core/query-builders/insert.js.map +1 -1
- package/pg-core/query-builders/query-builder.d.cts +2 -2
- package/pg-core/query-builders/query-builder.d.ts +2 -2
- package/pg-core/query-builders/refresh-materialized-view.cjs.map +1 -1
- package/pg-core/query-builders/refresh-materialized-view.d.cts +5 -5
- package/pg-core/query-builders/refresh-materialized-view.d.ts +5 -5
- package/pg-core/query-builders/refresh-materialized-view.js.map +1 -1
- package/pg-core/query-builders/update.cjs.map +1 -1
- package/pg-core/query-builders/update.d.cts +7 -7
- package/pg-core/query-builders/update.d.ts +7 -7
- package/pg-core/query-builders/update.js.map +1 -1
- package/pg-core/schema.cjs +7 -0
- package/pg-core/schema.cjs.map +1 -1
- package/pg-core/schema.d.cts +4 -1
- package/pg-core/schema.d.ts +4 -1
- package/pg-core/schema.js +7 -0
- package/pg-core/schema.js.map +1 -1
- package/pg-core/sequence.cjs.map +1 -1
- package/pg-core/sequence.d.cts +1 -1
- package/pg-core/sequence.d.ts +1 -1
- package/pg-core/sequence.js.map +1 -1
- package/pg-core/session.cjs.map +1 -1
- package/pg-core/session.d.cts +5 -5
- package/pg-core/session.d.ts +5 -5
- package/pg-core/session.js.map +1 -1
- package/pg-proxy/session.cjs.map +1 -1
- package/pg-proxy/session.d.cts +2 -2
- package/pg-proxy/session.d.ts +2 -2
- package/pg-proxy/session.js.map +1 -1
- package/pglite/session.cjs.map +1 -1
- package/pglite/session.d.cts +2 -2
- package/pglite/session.d.ts +2 -2
- package/pglite/session.js.map +1 -1
- package/planetscale-serverless/session.cjs +50 -6
- package/planetscale-serverless/session.cjs.map +1 -1
- package/planetscale-serverless/session.d.cts +10 -8
- package/planetscale-serverless/session.d.ts +10 -8
- package/planetscale-serverless/session.js +53 -9
- package/planetscale-serverless/session.js.map +1 -1
- package/postgres-js/session.cjs.map +1 -1
- package/postgres-js/session.d.cts +2 -2
- package/postgres-js/session.d.ts +2 -2
- package/postgres-js/session.js.map +1 -1
- package/prisma/mysql/driver.cjs +58 -0
- package/prisma/mysql/driver.cjs.map +1 -0
- package/prisma/mysql/driver.d.cts +23 -0
- package/prisma/mysql/driver.d.ts +23 -0
- package/prisma/mysql/driver.js +33 -0
- package/prisma/mysql/driver.js.map +1 -0
- package/prisma/mysql/index.cjs +25 -0
- package/prisma/mysql/index.cjs.map +1 -0
- package/prisma/mysql/index.d.cts +2 -0
- package/prisma/mysql/index.d.ts +2 -0
- package/prisma/mysql/index.js +3 -0
- package/prisma/mysql/index.js.map +1 -0
- package/prisma/mysql/session.cjs +73 -0
- package/prisma/mysql/session.cjs.map +1 -0
- package/prisma/mysql/session.d.cts +38 -0
- package/prisma/mysql/session.d.ts +38 -0
- package/prisma/mysql/session.js +48 -0
- package/prisma/mysql/session.js.map +1 -0
- package/prisma/pg/driver.cjs +58 -0
- package/prisma/pg/driver.cjs.map +1 -0
- package/prisma/pg/driver.d.cts +23 -0
- package/prisma/pg/driver.d.ts +23 -0
- package/prisma/pg/driver.js +33 -0
- package/prisma/pg/driver.js.map +1 -0
- package/prisma/pg/index.cjs +25 -0
- package/prisma/pg/index.cjs.map +1 -0
- package/prisma/pg/index.d.cts +2 -0
- package/prisma/pg/index.d.ts +2 -0
- package/prisma/pg/index.js +3 -0
- package/prisma/pg/index.js.map +1 -0
- package/prisma/pg/session.cjs +72 -0
- package/prisma/pg/session.cjs.map +1 -0
- package/prisma/pg/session.d.cts +33 -0
- package/prisma/pg/session.d.ts +33 -0
- package/prisma/pg/session.js +47 -0
- package/prisma/pg/session.js.map +1 -0
- package/prisma/sqlite/driver.cjs +50 -0
- package/prisma/sqlite/driver.cjs.map +1 -0
- package/prisma/sqlite/driver.d.cts +16 -0
- package/prisma/sqlite/driver.d.ts +16 -0
- package/prisma/sqlite/driver.js +26 -0
- package/prisma/sqlite/driver.js.map +1 -0
- package/prisma/sqlite/index.cjs +25 -0
- package/prisma/sqlite/index.cjs.map +1 -0
- package/prisma/sqlite/index.d.cts +2 -0
- package/prisma/sqlite/index.d.ts +2 -0
- package/prisma/sqlite/index.js +3 -0
- package/prisma/sqlite/index.js.map +1 -0
- package/prisma/sqlite/session.cjs +76 -0
- package/prisma/sqlite/session.cjs.map +1 -0
- package/prisma/sqlite/session.d.cts +37 -0
- package/prisma/sqlite/session.d.ts +37 -0
- package/prisma/sqlite/session.js +51 -0
- package/prisma/sqlite/session.js.map +1 -0
- package/query-builders/select.types.cjs.map +1 -1
- package/relations.cjs +5 -5
- package/relations.cjs.map +1 -1
- package/relations.d.cts +2 -2
- package/relations.d.ts +2 -2
- package/relations.js +6 -6
- package/relations.js.map +1 -1
- package/sql/expressions/conditions.cjs +2 -2
- package/sql/expressions/conditions.cjs.map +1 -1
- package/sql/expressions/conditions.d.cts +1 -1
- package/sql/expressions/conditions.d.ts +1 -1
- package/sql/expressions/conditions.js +2 -2
- package/sql/expressions/conditions.js.map +1 -1
- package/sql/sql.cjs +5 -2
- package/sql/sql.cjs.map +1 -1
- package/sql/sql.d.cts +1 -0
- package/sql/sql.d.ts +1 -0
- package/sql/sql.js +5 -2
- package/sql/sql.js.map +1 -1
- package/sql-js/session.d.cts +1 -1
- package/sql-js/session.d.ts +1 -1
- package/sqlite-core/columns/integer.cjs.map +1 -1
- package/sqlite-core/columns/integer.d.cts +2 -2
- package/sqlite-core/columns/integer.d.ts +2 -2
- package/sqlite-core/columns/integer.js.map +1 -1
- package/sqlite-core/db.d.cts +2 -2
- package/sqlite-core/db.d.ts +2 -2
- package/sqlite-core/dialect.cjs +3 -3
- package/sqlite-core/dialect.cjs.map +1 -1
- package/sqlite-core/dialect.d.cts +1 -1
- package/sqlite-core/dialect.d.ts +1 -1
- package/sqlite-core/dialect.js +4 -4
- package/sqlite-core/dialect.js.map +1 -1
- package/sqlite-core/query-builders/query-builder.d.cts +2 -2
- package/sqlite-core/query-builders/query-builder.d.ts +2 -2
- package/sqlite-proxy/session.d.cts +1 -1
- package/sqlite-proxy/session.d.ts +1 -1
- package/table.cjs +5 -1
- package/table.cjs.map +1 -1
- package/table.d.cts +1 -3
- package/table.d.ts +1 -3
- package/table.js +4 -1
- package/table.js.map +1 -1
- package/tidb-serverless/session.cjs +33 -6
- package/tidb-serverless/session.cjs.map +1 -1
- package/tidb-serverless/session.d.cts +9 -7
- package/tidb-serverless/session.d.ts +9 -7
- package/tidb-serverless/session.js +36 -9
- package/tidb-serverless/session.js.map +1 -1
- package/utils.cjs.map +1 -1
- package/utils.d.cts +2 -2
- package/utils.d.ts +2 -2
- package/utils.js.map +1 -1
- package/vercel-postgres/session.cjs.map +1 -1
- package/vercel-postgres/session.d.cts +2 -2
- package/vercel-postgres/session.d.ts +2 -2
- package/vercel-postgres/session.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/xata-http/session.cjs.map +1 -1
- package/xata-http/session.d.cts +2 -2
- package/xata-http/session.d.ts +2 -2
- package/xata-http/session.js.map +1 -1
|
@@ -9,12 +9,12 @@ export declare class QueryBuilder {
|
|
|
9
9
|
static readonly [entityKind]: string;
|
|
10
10
|
private dialect;
|
|
11
11
|
$with<TAlias extends string>(alias: TAlias): {
|
|
12
|
-
as<TSelection extends ColumnsSelection>(qb: TypedQueryBuilder<TSelection
|
|
12
|
+
as<TSelection extends ColumnsSelection>(qb: TypedQueryBuilder<TSelection> | ((qb: QueryBuilder) => TypedQueryBuilder<TSelection>)): WithSubqueryWithSelection<TSelection, TAlias>;
|
|
13
13
|
};
|
|
14
14
|
with(...queries: WithSubquery[]): {
|
|
15
15
|
select: {
|
|
16
16
|
(): SQLiteSelectBuilder<undefined, 'sync', void, 'qb'>;
|
|
17
|
-
<TSelection extends SelectedFields>(fields: TSelection): SQLiteSelectBuilder<TSelection,
|
|
17
|
+
<TSelection extends SelectedFields>(fields: TSelection): SQLiteSelectBuilder<TSelection, 'sync', void, 'qb'>;
|
|
18
18
|
};
|
|
19
19
|
selectDistinct: {
|
|
20
20
|
(): SQLiteSelectBuilder<undefined, 'sync', void, 'qb'>;
|
|
@@ -9,12 +9,12 @@ export declare class QueryBuilder {
|
|
|
9
9
|
static readonly [entityKind]: string;
|
|
10
10
|
private dialect;
|
|
11
11
|
$with<TAlias extends string>(alias: TAlias): {
|
|
12
|
-
as<TSelection extends ColumnsSelection>(qb: TypedQueryBuilder<TSelection
|
|
12
|
+
as<TSelection extends ColumnsSelection>(qb: TypedQueryBuilder<TSelection> | ((qb: QueryBuilder) => TypedQueryBuilder<TSelection>)): WithSubqueryWithSelection<TSelection, TAlias>;
|
|
13
13
|
};
|
|
14
14
|
with(...queries: WithSubquery[]): {
|
|
15
15
|
select: {
|
|
16
16
|
(): SQLiteSelectBuilder<undefined, 'sync', void, 'qb'>;
|
|
17
|
-
<TSelection extends SelectedFields>(fields: TSelection): SQLiteSelectBuilder<TSelection,
|
|
17
|
+
<TSelection extends SelectedFields>(fields: TSelection): SQLiteSelectBuilder<TSelection, 'sync', void, 'qb'>;
|
|
18
18
|
};
|
|
19
19
|
selectDistinct: {
|
|
20
20
|
(): SQLiteSelectBuilder<undefined, 'sync', void, 'qb'>;
|
|
@@ -46,7 +46,7 @@ export declare class RemotePreparedQuery<T extends PreparedQueryConfig = Prepare
|
|
|
46
46
|
static readonly [entityKind]: string;
|
|
47
47
|
private method;
|
|
48
48
|
constructor(client: RemoteCallback, query: Query, logger: Logger, fields: SelectedFieldsOrdered | undefined, executeMethod: SQLiteExecuteMethod, _isResponseInArrayMode: boolean,
|
|
49
|
-
/** @internal */ customResultMapper?: ((rows: unknown[][], mapColumnValue?: (
|
|
49
|
+
/** @internal */ customResultMapper?: ((rows: unknown[][], mapColumnValue?: (value: unknown) => unknown) => unknown) | undefined);
|
|
50
50
|
getQuery(): Query & {
|
|
51
51
|
method: SQLiteExecuteMethod;
|
|
52
52
|
};
|
|
@@ -46,7 +46,7 @@ export declare class RemotePreparedQuery<T extends PreparedQueryConfig = Prepare
|
|
|
46
46
|
static readonly [entityKind]: string;
|
|
47
47
|
private method;
|
|
48
48
|
constructor(client: RemoteCallback, query: Query, logger: Logger, fields: SelectedFieldsOrdered | undefined, executeMethod: SQLiteExecuteMethod, _isResponseInArrayMode: boolean,
|
|
49
|
-
/** @internal */ customResultMapper?: ((rows: unknown[][], mapColumnValue?: (
|
|
49
|
+
/** @internal */ customResultMapper?: ((rows: unknown[][], mapColumnValue?: (value: unknown) => unknown) => unknown) | undefined);
|
|
50
50
|
getQuery(): Query & {
|
|
51
51
|
method: SQLiteExecuteMethod;
|
|
52
52
|
};
|
package/table.cjs
CHANGED
|
@@ -28,6 +28,7 @@ __export(table_exports, {
|
|
|
28
28
|
Table: () => Table,
|
|
29
29
|
TableName: () => TableName,
|
|
30
30
|
getTableName: () => getTableName,
|
|
31
|
+
getTableUniqueName: () => getTableUniqueName,
|
|
31
32
|
isTable: () => isTable
|
|
32
33
|
});
|
|
33
34
|
module.exports = __toCommonJS(table_exports);
|
|
@@ -79,7 +80,6 @@ class Table {
|
|
|
79
80
|
[IsAlias] = false;
|
|
80
81
|
/** @internal */
|
|
81
82
|
[ExtraConfigBuilder] = void 0;
|
|
82
|
-
[IsDrizzleTable] = true;
|
|
83
83
|
constructor(name, schema, baseName) {
|
|
84
84
|
this[TableName] = this[OriginalName] = name;
|
|
85
85
|
this[Schema] = schema;
|
|
@@ -92,6 +92,9 @@ function isTable(table) {
|
|
|
92
92
|
function getTableName(table) {
|
|
93
93
|
return table[TableName];
|
|
94
94
|
}
|
|
95
|
+
function getTableUniqueName(table) {
|
|
96
|
+
return `${table[Schema] ?? "public"}.${table[TableName]}`;
|
|
97
|
+
}
|
|
95
98
|
// Annotate the CommonJS export names for ESM import in node:
|
|
96
99
|
0 && (module.exports = {
|
|
97
100
|
BaseName,
|
|
@@ -104,6 +107,7 @@ function getTableName(table) {
|
|
|
104
107
|
Table,
|
|
105
108
|
TableName,
|
|
106
109
|
getTableName,
|
|
110
|
+
getTableUniqueName,
|
|
107
111
|
isTable
|
|
108
112
|
});
|
|
109
113
|
//# sourceMappingURL=table.cjs.map
|
package/table.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/table.ts"],"sourcesContent":["import type { Column, GetColumnData } from './column.ts';\nimport { entityKind } from './entity.ts';\nimport type { OptionalKeyOnly, RequiredKeyOnly } from './operations.ts';\nimport type { ExtraConfigColumn } from './pg-core/index.ts';\nimport type { SQLWrapper } from './sql/sql.ts';\nimport type { Simplify, Update } from './utils.ts';\n\nexport interface TableConfig<TColumn extends Column = Column<any>> {\n\tname: string;\n\tschema: string | undefined;\n\tcolumns: Record<string, TColumn>;\n\tdialect: string;\n}\n\nexport type UpdateTableConfig<T extends TableConfig, TUpdate extends Partial<TableConfig>> = Required<\n\tUpdate<T, TUpdate>\n>;\n\n/** @internal */\nexport const TableName = Symbol.for('drizzle:Name');\n\n/** @internal */\nexport const Schema = Symbol.for('drizzle:Schema');\n\n/** @internal */\nexport const Columns = Symbol.for('drizzle:Columns');\n\n/** @internal */\nexport const ExtraConfigColumns = Symbol.for('drizzle:ExtraConfigColumns');\n\n/** @internal */\nexport const OriginalName = Symbol.for('drizzle:OriginalName');\n\n/** @internal */\nexport const BaseName = Symbol.for('drizzle:BaseName');\n\n/** @internal */\nexport const IsAlias = Symbol.for('drizzle:IsAlias');\n\n/** @internal */\nexport const ExtraConfigBuilder = Symbol.for('drizzle:ExtraConfigBuilder');\n\nconst IsDrizzleTable = Symbol.for('drizzle:IsDrizzleTable');\n\nexport interface Table<\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tT extends TableConfig = TableConfig,\n> extends SQLWrapper {\n\t// SQLWrapper runtime implementation is defined in 'sql/sql.ts'\n}\n\nexport class Table<T extends TableConfig = TableConfig> implements SQLWrapper {\n\tstatic readonly [entityKind]: string = 'Table';\n\n\tdeclare readonly _: {\n\t\treadonly brand: 'Table';\n\t\treadonly config: T;\n\t\treadonly name: T['name'];\n\t\treadonly schema: T['schema'];\n\t\treadonly columns: T['columns'];\n\t\treadonly inferSelect: InferSelectModel<Table<T>>;\n\t\treadonly inferInsert: InferInsertModel<Table<T>>;\n\t};\n\n\tdeclare readonly $inferSelect: InferSelectModel<Table<T>>;\n\tdeclare readonly $inferInsert: InferInsertModel<Table<T>>;\n\n\t/** @internal */\n\tstatic readonly Symbol = {\n\t\tName: TableName as typeof TableName,\n\t\tSchema: Schema as typeof Schema,\n\t\tOriginalName: OriginalName as typeof OriginalName,\n\t\tColumns: Columns as typeof Columns,\n\t\tExtraConfigColumns: ExtraConfigColumns as typeof ExtraConfigColumns,\n\t\tBaseName: BaseName as typeof BaseName,\n\t\tIsAlias: IsAlias as typeof IsAlias,\n\t\tExtraConfigBuilder: ExtraConfigBuilder as typeof ExtraConfigBuilder,\n\t};\n\n\t/**\n\t * @internal\n\t * Can be changed if the table is aliased.\n\t */\n\t[TableName]: string;\n\n\t/**\n\t * @internal\n\t * Used to store the original name of the table, before any aliasing.\n\t */\n\t[OriginalName]: string;\n\n\t/** @internal */\n\t[Schema]: string | undefined;\n\n\t/** @internal */\n\t[Columns]!: T['columns'];\n\n\t/** @internal */\n\t[ExtraConfigColumns]!: Record<string, ExtraConfigColumn>;\n\n\t/**\n\t * @internal\n\t * Used to store the table name before the transformation via the `tableCreator` functions.\n\t */\n\t[BaseName]: string;\n\n\t/** @internal */\n\t[IsAlias] = false;\n\n\t/** @internal */\n\t[ExtraConfigBuilder]: ((self: any) => Record<string, unknown>) | undefined = undefined;\n\n\
|
|
1
|
+
{"version":3,"sources":["../src/table.ts"],"sourcesContent":["import type { Column, GetColumnData } from './column.ts';\nimport { entityKind } from './entity.ts';\nimport type { OptionalKeyOnly, RequiredKeyOnly } from './operations.ts';\nimport type { ExtraConfigColumn } from './pg-core/index.ts';\nimport type { SQLWrapper } from './sql/sql.ts';\nimport type { Simplify, Update } from './utils.ts';\n\nexport interface TableConfig<TColumn extends Column = Column<any>> {\n\tname: string;\n\tschema: string | undefined;\n\tcolumns: Record<string, TColumn>;\n\tdialect: string;\n}\n\nexport type UpdateTableConfig<T extends TableConfig, TUpdate extends Partial<TableConfig>> = Required<\n\tUpdate<T, TUpdate>\n>;\n\n/** @internal */\nexport const TableName = Symbol.for('drizzle:Name');\n\n/** @internal */\nexport const Schema = Symbol.for('drizzle:Schema');\n\n/** @internal */\nexport const Columns = Symbol.for('drizzle:Columns');\n\n/** @internal */\nexport const ExtraConfigColumns = Symbol.for('drizzle:ExtraConfigColumns');\n\n/** @internal */\nexport const OriginalName = Symbol.for('drizzle:OriginalName');\n\n/** @internal */\nexport const BaseName = Symbol.for('drizzle:BaseName');\n\n/** @internal */\nexport const IsAlias = Symbol.for('drizzle:IsAlias');\n\n/** @internal */\nexport const ExtraConfigBuilder = Symbol.for('drizzle:ExtraConfigBuilder');\n\nconst IsDrizzleTable = Symbol.for('drizzle:IsDrizzleTable');\n\nexport interface Table<\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tT extends TableConfig = TableConfig,\n> extends SQLWrapper {\n\t// SQLWrapper runtime implementation is defined in 'sql/sql.ts'\n}\n\nexport class Table<T extends TableConfig = TableConfig> implements SQLWrapper {\n\tstatic readonly [entityKind]: string = 'Table';\n\n\tdeclare readonly _: {\n\t\treadonly brand: 'Table';\n\t\treadonly config: T;\n\t\treadonly name: T['name'];\n\t\treadonly schema: T['schema'];\n\t\treadonly columns: T['columns'];\n\t\treadonly inferSelect: InferSelectModel<Table<T>>;\n\t\treadonly inferInsert: InferInsertModel<Table<T>>;\n\t};\n\n\tdeclare readonly $inferSelect: InferSelectModel<Table<T>>;\n\tdeclare readonly $inferInsert: InferInsertModel<Table<T>>;\n\n\t/** @internal */\n\tstatic readonly Symbol = {\n\t\tName: TableName as typeof TableName,\n\t\tSchema: Schema as typeof Schema,\n\t\tOriginalName: OriginalName as typeof OriginalName,\n\t\tColumns: Columns as typeof Columns,\n\t\tExtraConfigColumns: ExtraConfigColumns as typeof ExtraConfigColumns,\n\t\tBaseName: BaseName as typeof BaseName,\n\t\tIsAlias: IsAlias as typeof IsAlias,\n\t\tExtraConfigBuilder: ExtraConfigBuilder as typeof ExtraConfigBuilder,\n\t};\n\n\t/**\n\t * @internal\n\t * Can be changed if the table is aliased.\n\t */\n\t[TableName]: string;\n\n\t/**\n\t * @internal\n\t * Used to store the original name of the table, before any aliasing.\n\t */\n\t[OriginalName]: string;\n\n\t/** @internal */\n\t[Schema]: string | undefined;\n\n\t/** @internal */\n\t[Columns]!: T['columns'];\n\n\t/** @internal */\n\t[ExtraConfigColumns]!: Record<string, ExtraConfigColumn>;\n\n\t/**\n\t * @internal\n\t * Used to store the table name before the transformation via the `tableCreator` functions.\n\t */\n\t[BaseName]: string;\n\n\t/** @internal */\n\t[IsAlias] = false;\n\n\t/** @internal */\n\t[ExtraConfigBuilder]: ((self: any) => Record<string, unknown>) | undefined = undefined;\n\n\tconstructor(name: string, schema: string | undefined, baseName: string) {\n\t\tthis[TableName] = this[OriginalName] = name;\n\t\tthis[Schema] = schema;\n\t\tthis[BaseName] = baseName;\n\t}\n}\n\nexport function isTable(table: unknown): table is Table {\n\treturn typeof table === 'object' && table !== null && IsDrizzleTable in table;\n}\n\n/**\n * Any table with a specified boundary.\n *\n * @example\n\t```ts\n\t// Any table with a specific name\n\ttype AnyUsersTable = AnyTable<{ name: 'users' }>;\n\t```\n *\n * To describe any table with any config, simply use `Table` without any type arguments, like this:\n *\n\t```ts\n\tfunction needsTable(table: Table) {\n\t\t...\n\t}\n\t```\n */\nexport type AnyTable<TPartial extends Partial<TableConfig>> = Table<UpdateTableConfig<TableConfig, TPartial>>;\n\nexport function getTableName<T extends Table>(table: T): T['_']['name'] {\n\treturn table[TableName];\n}\n\nexport function getTableUniqueName<T extends Table>(table: T): `${T['_']['schema']}.${T['_']['name']}` {\n\treturn `${table[Schema] ?? 'public'}.${table[TableName]}`;\n}\n\nexport type MapColumnName<TName extends string, TColumn extends Column, TDBColumNames extends boolean> =\n\tTDBColumNames extends true ? TColumn['_']['name']\n\t\t: TName;\n\nexport type InferModelFromColumns<\n\tTColumns extends Record<string, Column>,\n\tTInferMode extends 'select' | 'insert' = 'select',\n\tTConfig extends { dbColumnNames: boolean } = { dbColumnNames: false },\n> = Simplify<\n\tTInferMode extends 'insert' ?\n\t\t\t& {\n\t\t\t\t[\n\t\t\t\t\tKey in keyof TColumns & string as RequiredKeyOnly<\n\t\t\t\t\t\tMapColumnName<Key, TColumns[Key], TConfig['dbColumnNames']>,\n\t\t\t\t\t\tTColumns[Key]\n\t\t\t\t\t>\n\t\t\t\t]: GetColumnData<TColumns[Key], 'query'>;\n\t\t\t}\n\t\t\t& {\n\t\t\t\t[\n\t\t\t\t\tKey in keyof TColumns & string as OptionalKeyOnly<\n\t\t\t\t\t\tMapColumnName<Key, TColumns[Key], TConfig['dbColumnNames']>,\n\t\t\t\t\t\tTColumns[Key]\n\t\t\t\t\t>\n\t\t\t\t]?: GetColumnData<TColumns[Key], 'query'>;\n\t\t\t}\n\t\t: {\n\t\t\t[\n\t\t\t\tKey in keyof TColumns & string as MapColumnName<\n\t\t\t\t\tKey,\n\t\t\t\t\tTColumns[Key],\n\t\t\t\t\tTConfig['dbColumnNames']\n\t\t\t\t>\n\t\t\t]: GetColumnData<TColumns[Key], 'query'>;\n\t\t}\n>;\n\n/** @deprecated Use one of the alternatives: {@link InferSelectModel} / {@link InferInsertModel}, or `table.$inferSelect` / `table.$inferInsert`\n */\nexport type InferModel<\n\tTTable extends Table,\n\tTInferMode extends 'select' | 'insert' = 'select',\n\tTConfig extends { dbColumnNames: boolean } = { dbColumnNames: false },\n> = InferModelFromColumns<TTable['_']['columns'], TInferMode, TConfig>;\n\nexport type InferSelectModel<\n\tTTable extends Table,\n\tTConfig extends { dbColumnNames: boolean } = { dbColumnNames: false },\n> = InferModelFromColumns<TTable['_']['columns'], 'select', TConfig>;\n\nexport type InferInsertModel<\n\tTTable extends Table,\n\tTConfig extends { dbColumnNames: boolean } = { dbColumnNames: false },\n> = InferModelFromColumns<TTable['_']['columns'], 'insert', TConfig>;\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,oBAA2B;AAkBpB,MAAM,YAAY,OAAO,IAAI,cAAc;AAG3C,MAAM,SAAS,OAAO,IAAI,gBAAgB;AAG1C,MAAM,UAAU,OAAO,IAAI,iBAAiB;AAG5C,MAAM,qBAAqB,OAAO,IAAI,4BAA4B;AAGlE,MAAM,eAAe,OAAO,IAAI,sBAAsB;AAGtD,MAAM,WAAW,OAAO,IAAI,kBAAkB;AAG9C,MAAM,UAAU,OAAO,IAAI,iBAAiB;AAG5C,MAAM,qBAAqB,OAAO,IAAI,4BAA4B;AAEzE,MAAM,iBAAiB,OAAO,IAAI,wBAAwB;AASnD,MAAM,MAAiE;AAAA,EAC7E,QAAiB,wBAAU,IAAY;AAAA;AAAA,EAgBvC,OAAgB,SAAS;AAAA,IACxB,MAAM;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,CAAC,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA,EAMV,CAAC,YAAY;AAAA;AAAA,EAGb,CAAC,MAAM;AAAA;AAAA,EAGP,CAAC,OAAO;AAAA;AAAA,EAGR,CAAC,kBAAkB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMnB,CAAC,QAAQ;AAAA;AAAA,EAGT,CAAC,OAAO,IAAI;AAAA;AAAA,EAGZ,CAAC,kBAAkB,IAA0D;AAAA,EAE7E,YAAY,MAAc,QAA4B,UAAkB;AACvE,SAAK,SAAS,IAAI,KAAK,YAAY,IAAI;AACvC,SAAK,MAAM,IAAI;AACf,SAAK,QAAQ,IAAI;AAAA,EAClB;AACD;AAEO,SAAS,QAAQ,OAAgC;AACvD,SAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,kBAAkB;AACzE;AAqBO,SAAS,aAA8B,OAA0B;AACvE,SAAO,MAAM,SAAS;AACvB;AAEO,SAAS,mBAAoC,OAAmD;AACtG,SAAO,GAAG,MAAM,MAAM,KAAK,QAAQ,IAAI,MAAM,SAAS,CAAC;AACxD;","names":[]}
|
package/table.d.cts
CHANGED
|
@@ -10,7 +10,6 @@ export interface TableConfig<TColumn extends Column = Column<any>> {
|
|
|
10
10
|
dialect: string;
|
|
11
11
|
}
|
|
12
12
|
export type UpdateTableConfig<T extends TableConfig, TUpdate extends Partial<TableConfig>> = Required<Update<T, TUpdate>>;
|
|
13
|
-
declare const IsDrizzleTable: unique symbol;
|
|
14
13
|
export interface Table<T extends TableConfig = TableConfig> extends SQLWrapper {
|
|
15
14
|
}
|
|
16
15
|
export declare class Table<T extends TableConfig = TableConfig> implements SQLWrapper {
|
|
@@ -26,7 +25,6 @@ export declare class Table<T extends TableConfig = TableConfig> implements SQLWr
|
|
|
26
25
|
};
|
|
27
26
|
readonly $inferSelect: InferSelectModel<Table<T>>;
|
|
28
27
|
readonly $inferInsert: InferInsertModel<Table<T>>;
|
|
29
|
-
[IsDrizzleTable]: boolean;
|
|
30
28
|
constructor(name: string, schema: string | undefined, baseName: string);
|
|
31
29
|
}
|
|
32
30
|
export declare function isTable(table: unknown): table is Table;
|
|
@@ -49,6 +47,7 @@ export declare function isTable(table: unknown): table is Table;
|
|
|
49
47
|
*/
|
|
50
48
|
export type AnyTable<TPartial extends Partial<TableConfig>> = Table<UpdateTableConfig<TableConfig, TPartial>>;
|
|
51
49
|
export declare function getTableName<T extends Table>(table: T): T['_']['name'];
|
|
50
|
+
export declare function getTableUniqueName<T extends Table>(table: T): `${T['_']['schema']}.${T['_']['name']}`;
|
|
52
51
|
export type MapColumnName<TName extends string, TColumn extends Column, TDBColumNames extends boolean> = TDBColumNames extends true ? TColumn['_']['name'] : TName;
|
|
53
52
|
export type InferModelFromColumns<TColumns extends Record<string, Column>, TInferMode extends 'select' | 'insert' = 'select', TConfig extends {
|
|
54
53
|
dbColumnNames: boolean;
|
|
@@ -78,4 +77,3 @@ export type InferInsertModel<TTable extends Table, TConfig extends {
|
|
|
78
77
|
} = {
|
|
79
78
|
dbColumnNames: false;
|
|
80
79
|
}> = InferModelFromColumns<TTable['_']['columns'], 'insert', TConfig>;
|
|
81
|
-
export {};
|
package/table.d.ts
CHANGED
|
@@ -10,7 +10,6 @@ export interface TableConfig<TColumn extends Column = Column<any>> {
|
|
|
10
10
|
dialect: string;
|
|
11
11
|
}
|
|
12
12
|
export type UpdateTableConfig<T extends TableConfig, TUpdate extends Partial<TableConfig>> = Required<Update<T, TUpdate>>;
|
|
13
|
-
declare const IsDrizzleTable: unique symbol;
|
|
14
13
|
export interface Table<T extends TableConfig = TableConfig> extends SQLWrapper {
|
|
15
14
|
}
|
|
16
15
|
export declare class Table<T extends TableConfig = TableConfig> implements SQLWrapper {
|
|
@@ -26,7 +25,6 @@ export declare class Table<T extends TableConfig = TableConfig> implements SQLWr
|
|
|
26
25
|
};
|
|
27
26
|
readonly $inferSelect: InferSelectModel<Table<T>>;
|
|
28
27
|
readonly $inferInsert: InferInsertModel<Table<T>>;
|
|
29
|
-
[IsDrizzleTable]: boolean;
|
|
30
28
|
constructor(name: string, schema: string | undefined, baseName: string);
|
|
31
29
|
}
|
|
32
30
|
export declare function isTable(table: unknown): table is Table;
|
|
@@ -49,6 +47,7 @@ export declare function isTable(table: unknown): table is Table;
|
|
|
49
47
|
*/
|
|
50
48
|
export type AnyTable<TPartial extends Partial<TableConfig>> = Table<UpdateTableConfig<TableConfig, TPartial>>;
|
|
51
49
|
export declare function getTableName<T extends Table>(table: T): T['_']['name'];
|
|
50
|
+
export declare function getTableUniqueName<T extends Table>(table: T): `${T['_']['schema']}.${T['_']['name']}`;
|
|
52
51
|
export type MapColumnName<TName extends string, TColumn extends Column, TDBColumNames extends boolean> = TDBColumNames extends true ? TColumn['_']['name'] : TName;
|
|
53
52
|
export type InferModelFromColumns<TColumns extends Record<string, Column>, TInferMode extends 'select' | 'insert' = 'select', TConfig extends {
|
|
54
53
|
dbColumnNames: boolean;
|
|
@@ -78,4 +77,3 @@ export type InferInsertModel<TTable extends Table, TConfig extends {
|
|
|
78
77
|
} = {
|
|
79
78
|
dbColumnNames: false;
|
|
80
79
|
}> = InferModelFromColumns<TTable['_']['columns'], 'insert', TConfig>;
|
|
81
|
-
export {};
|
package/table.js
CHANGED
|
@@ -46,7 +46,6 @@ class Table {
|
|
|
46
46
|
[IsAlias] = false;
|
|
47
47
|
/** @internal */
|
|
48
48
|
[ExtraConfigBuilder] = void 0;
|
|
49
|
-
[IsDrizzleTable] = true;
|
|
50
49
|
constructor(name, schema, baseName) {
|
|
51
50
|
this[TableName] = this[OriginalName] = name;
|
|
52
51
|
this[Schema] = schema;
|
|
@@ -59,6 +58,9 @@ function isTable(table) {
|
|
|
59
58
|
function getTableName(table) {
|
|
60
59
|
return table[TableName];
|
|
61
60
|
}
|
|
61
|
+
function getTableUniqueName(table) {
|
|
62
|
+
return `${table[Schema] ?? "public"}.${table[TableName]}`;
|
|
63
|
+
}
|
|
62
64
|
export {
|
|
63
65
|
BaseName,
|
|
64
66
|
Columns,
|
|
@@ -70,6 +72,7 @@ export {
|
|
|
70
72
|
Table,
|
|
71
73
|
TableName,
|
|
72
74
|
getTableName,
|
|
75
|
+
getTableUniqueName,
|
|
73
76
|
isTable
|
|
74
77
|
};
|
|
75
78
|
//# sourceMappingURL=table.js.map
|
package/table.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/table.ts"],"sourcesContent":["import type { Column, GetColumnData } from './column.ts';\nimport { entityKind } from './entity.ts';\nimport type { OptionalKeyOnly, RequiredKeyOnly } from './operations.ts';\nimport type { ExtraConfigColumn } from './pg-core/index.ts';\nimport type { SQLWrapper } from './sql/sql.ts';\nimport type { Simplify, Update } from './utils.ts';\n\nexport interface TableConfig<TColumn extends Column = Column<any>> {\n\tname: string;\n\tschema: string | undefined;\n\tcolumns: Record<string, TColumn>;\n\tdialect: string;\n}\n\nexport type UpdateTableConfig<T extends TableConfig, TUpdate extends Partial<TableConfig>> = Required<\n\tUpdate<T, TUpdate>\n>;\n\n/** @internal */\nexport const TableName = Symbol.for('drizzle:Name');\n\n/** @internal */\nexport const Schema = Symbol.for('drizzle:Schema');\n\n/** @internal */\nexport const Columns = Symbol.for('drizzle:Columns');\n\n/** @internal */\nexport const ExtraConfigColumns = Symbol.for('drizzle:ExtraConfigColumns');\n\n/** @internal */\nexport const OriginalName = Symbol.for('drizzle:OriginalName');\n\n/** @internal */\nexport const BaseName = Symbol.for('drizzle:BaseName');\n\n/** @internal */\nexport const IsAlias = Symbol.for('drizzle:IsAlias');\n\n/** @internal */\nexport const ExtraConfigBuilder = Symbol.for('drizzle:ExtraConfigBuilder');\n\nconst IsDrizzleTable = Symbol.for('drizzle:IsDrizzleTable');\n\nexport interface Table<\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tT extends TableConfig = TableConfig,\n> extends SQLWrapper {\n\t// SQLWrapper runtime implementation is defined in 'sql/sql.ts'\n}\n\nexport class Table<T extends TableConfig = TableConfig> implements SQLWrapper {\n\tstatic readonly [entityKind]: string = 'Table';\n\n\tdeclare readonly _: {\n\t\treadonly brand: 'Table';\n\t\treadonly config: T;\n\t\treadonly name: T['name'];\n\t\treadonly schema: T['schema'];\n\t\treadonly columns: T['columns'];\n\t\treadonly inferSelect: InferSelectModel<Table<T>>;\n\t\treadonly inferInsert: InferInsertModel<Table<T>>;\n\t};\n\n\tdeclare readonly $inferSelect: InferSelectModel<Table<T>>;\n\tdeclare readonly $inferInsert: InferInsertModel<Table<T>>;\n\n\t/** @internal */\n\tstatic readonly Symbol = {\n\t\tName: TableName as typeof TableName,\n\t\tSchema: Schema as typeof Schema,\n\t\tOriginalName: OriginalName as typeof OriginalName,\n\t\tColumns: Columns as typeof Columns,\n\t\tExtraConfigColumns: ExtraConfigColumns as typeof ExtraConfigColumns,\n\t\tBaseName: BaseName as typeof BaseName,\n\t\tIsAlias: IsAlias as typeof IsAlias,\n\t\tExtraConfigBuilder: ExtraConfigBuilder as typeof ExtraConfigBuilder,\n\t};\n\n\t/**\n\t * @internal\n\t * Can be changed if the table is aliased.\n\t */\n\t[TableName]: string;\n\n\t/**\n\t * @internal\n\t * Used to store the original name of the table, before any aliasing.\n\t */\n\t[OriginalName]: string;\n\n\t/** @internal */\n\t[Schema]: string | undefined;\n\n\t/** @internal */\n\t[Columns]!: T['columns'];\n\n\t/** @internal */\n\t[ExtraConfigColumns]!: Record<string, ExtraConfigColumn>;\n\n\t/**\n\t * @internal\n\t * Used to store the table name before the transformation via the `tableCreator` functions.\n\t */\n\t[BaseName]: string;\n\n\t/** @internal */\n\t[IsAlias] = false;\n\n\t/** @internal */\n\t[ExtraConfigBuilder]: ((self: any) => Record<string, unknown>) | undefined = undefined;\n\n\
|
|
1
|
+
{"version":3,"sources":["../src/table.ts"],"sourcesContent":["import type { Column, GetColumnData } from './column.ts';\nimport { entityKind } from './entity.ts';\nimport type { OptionalKeyOnly, RequiredKeyOnly } from './operations.ts';\nimport type { ExtraConfigColumn } from './pg-core/index.ts';\nimport type { SQLWrapper } from './sql/sql.ts';\nimport type { Simplify, Update } from './utils.ts';\n\nexport interface TableConfig<TColumn extends Column = Column<any>> {\n\tname: string;\n\tschema: string | undefined;\n\tcolumns: Record<string, TColumn>;\n\tdialect: string;\n}\n\nexport type UpdateTableConfig<T extends TableConfig, TUpdate extends Partial<TableConfig>> = Required<\n\tUpdate<T, TUpdate>\n>;\n\n/** @internal */\nexport const TableName = Symbol.for('drizzle:Name');\n\n/** @internal */\nexport const Schema = Symbol.for('drizzle:Schema');\n\n/** @internal */\nexport const Columns = Symbol.for('drizzle:Columns');\n\n/** @internal */\nexport const ExtraConfigColumns = Symbol.for('drizzle:ExtraConfigColumns');\n\n/** @internal */\nexport const OriginalName = Symbol.for('drizzle:OriginalName');\n\n/** @internal */\nexport const BaseName = Symbol.for('drizzle:BaseName');\n\n/** @internal */\nexport const IsAlias = Symbol.for('drizzle:IsAlias');\n\n/** @internal */\nexport const ExtraConfigBuilder = Symbol.for('drizzle:ExtraConfigBuilder');\n\nconst IsDrizzleTable = Symbol.for('drizzle:IsDrizzleTable');\n\nexport interface Table<\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tT extends TableConfig = TableConfig,\n> extends SQLWrapper {\n\t// SQLWrapper runtime implementation is defined in 'sql/sql.ts'\n}\n\nexport class Table<T extends TableConfig = TableConfig> implements SQLWrapper {\n\tstatic readonly [entityKind]: string = 'Table';\n\n\tdeclare readonly _: {\n\t\treadonly brand: 'Table';\n\t\treadonly config: T;\n\t\treadonly name: T['name'];\n\t\treadonly schema: T['schema'];\n\t\treadonly columns: T['columns'];\n\t\treadonly inferSelect: InferSelectModel<Table<T>>;\n\t\treadonly inferInsert: InferInsertModel<Table<T>>;\n\t};\n\n\tdeclare readonly $inferSelect: InferSelectModel<Table<T>>;\n\tdeclare readonly $inferInsert: InferInsertModel<Table<T>>;\n\n\t/** @internal */\n\tstatic readonly Symbol = {\n\t\tName: TableName as typeof TableName,\n\t\tSchema: Schema as typeof Schema,\n\t\tOriginalName: OriginalName as typeof OriginalName,\n\t\tColumns: Columns as typeof Columns,\n\t\tExtraConfigColumns: ExtraConfigColumns as typeof ExtraConfigColumns,\n\t\tBaseName: BaseName as typeof BaseName,\n\t\tIsAlias: IsAlias as typeof IsAlias,\n\t\tExtraConfigBuilder: ExtraConfigBuilder as typeof ExtraConfigBuilder,\n\t};\n\n\t/**\n\t * @internal\n\t * Can be changed if the table is aliased.\n\t */\n\t[TableName]: string;\n\n\t/**\n\t * @internal\n\t * Used to store the original name of the table, before any aliasing.\n\t */\n\t[OriginalName]: string;\n\n\t/** @internal */\n\t[Schema]: string | undefined;\n\n\t/** @internal */\n\t[Columns]!: T['columns'];\n\n\t/** @internal */\n\t[ExtraConfigColumns]!: Record<string, ExtraConfigColumn>;\n\n\t/**\n\t * @internal\n\t * Used to store the table name before the transformation via the `tableCreator` functions.\n\t */\n\t[BaseName]: string;\n\n\t/** @internal */\n\t[IsAlias] = false;\n\n\t/** @internal */\n\t[ExtraConfigBuilder]: ((self: any) => Record<string, unknown>) | undefined = undefined;\n\n\tconstructor(name: string, schema: string | undefined, baseName: string) {\n\t\tthis[TableName] = this[OriginalName] = name;\n\t\tthis[Schema] = schema;\n\t\tthis[BaseName] = baseName;\n\t}\n}\n\nexport function isTable(table: unknown): table is Table {\n\treturn typeof table === 'object' && table !== null && IsDrizzleTable in table;\n}\n\n/**\n * Any table with a specified boundary.\n *\n * @example\n\t```ts\n\t// Any table with a specific name\n\ttype AnyUsersTable = AnyTable<{ name: 'users' }>;\n\t```\n *\n * To describe any table with any config, simply use `Table` without any type arguments, like this:\n *\n\t```ts\n\tfunction needsTable(table: Table) {\n\t\t...\n\t}\n\t```\n */\nexport type AnyTable<TPartial extends Partial<TableConfig>> = Table<UpdateTableConfig<TableConfig, TPartial>>;\n\nexport function getTableName<T extends Table>(table: T): T['_']['name'] {\n\treturn table[TableName];\n}\n\nexport function getTableUniqueName<T extends Table>(table: T): `${T['_']['schema']}.${T['_']['name']}` {\n\treturn `${table[Schema] ?? 'public'}.${table[TableName]}`;\n}\n\nexport type MapColumnName<TName extends string, TColumn extends Column, TDBColumNames extends boolean> =\n\tTDBColumNames extends true ? TColumn['_']['name']\n\t\t: TName;\n\nexport type InferModelFromColumns<\n\tTColumns extends Record<string, Column>,\n\tTInferMode extends 'select' | 'insert' = 'select',\n\tTConfig extends { dbColumnNames: boolean } = { dbColumnNames: false },\n> = Simplify<\n\tTInferMode extends 'insert' ?\n\t\t\t& {\n\t\t\t\t[\n\t\t\t\t\tKey in keyof TColumns & string as RequiredKeyOnly<\n\t\t\t\t\t\tMapColumnName<Key, TColumns[Key], TConfig['dbColumnNames']>,\n\t\t\t\t\t\tTColumns[Key]\n\t\t\t\t\t>\n\t\t\t\t]: GetColumnData<TColumns[Key], 'query'>;\n\t\t\t}\n\t\t\t& {\n\t\t\t\t[\n\t\t\t\t\tKey in keyof TColumns & string as OptionalKeyOnly<\n\t\t\t\t\t\tMapColumnName<Key, TColumns[Key], TConfig['dbColumnNames']>,\n\t\t\t\t\t\tTColumns[Key]\n\t\t\t\t\t>\n\t\t\t\t]?: GetColumnData<TColumns[Key], 'query'>;\n\t\t\t}\n\t\t: {\n\t\t\t[\n\t\t\t\tKey in keyof TColumns & string as MapColumnName<\n\t\t\t\t\tKey,\n\t\t\t\t\tTColumns[Key],\n\t\t\t\t\tTConfig['dbColumnNames']\n\t\t\t\t>\n\t\t\t]: GetColumnData<TColumns[Key], 'query'>;\n\t\t}\n>;\n\n/** @deprecated Use one of the alternatives: {@link InferSelectModel} / {@link InferInsertModel}, or `table.$inferSelect` / `table.$inferInsert`\n */\nexport type InferModel<\n\tTTable extends Table,\n\tTInferMode extends 'select' | 'insert' = 'select',\n\tTConfig extends { dbColumnNames: boolean } = { dbColumnNames: false },\n> = InferModelFromColumns<TTable['_']['columns'], TInferMode, TConfig>;\n\nexport type InferSelectModel<\n\tTTable extends Table,\n\tTConfig extends { dbColumnNames: boolean } = { dbColumnNames: false },\n> = InferModelFromColumns<TTable['_']['columns'], 'select', TConfig>;\n\nexport type InferInsertModel<\n\tTTable extends Table,\n\tTConfig extends { dbColumnNames: boolean } = { dbColumnNames: false },\n> = InferModelFromColumns<TTable['_']['columns'], 'insert', TConfig>;\n"],"mappings":"AACA,SAAS,kBAAkB;AAkBpB,MAAM,YAAY,OAAO,IAAI,cAAc;AAG3C,MAAM,SAAS,OAAO,IAAI,gBAAgB;AAG1C,MAAM,UAAU,OAAO,IAAI,iBAAiB;AAG5C,MAAM,qBAAqB,OAAO,IAAI,4BAA4B;AAGlE,MAAM,eAAe,OAAO,IAAI,sBAAsB;AAGtD,MAAM,WAAW,OAAO,IAAI,kBAAkB;AAG9C,MAAM,UAAU,OAAO,IAAI,iBAAiB;AAG5C,MAAM,qBAAqB,OAAO,IAAI,4BAA4B;AAEzE,MAAM,iBAAiB,OAAO,IAAI,wBAAwB;AASnD,MAAM,MAAiE;AAAA,EAC7E,QAAiB,UAAU,IAAY;AAAA;AAAA,EAgBvC,OAAgB,SAAS;AAAA,IACxB,MAAM;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,CAAC,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA,EAMV,CAAC,YAAY;AAAA;AAAA,EAGb,CAAC,MAAM;AAAA;AAAA,EAGP,CAAC,OAAO;AAAA;AAAA,EAGR,CAAC,kBAAkB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMnB,CAAC,QAAQ;AAAA;AAAA,EAGT,CAAC,OAAO,IAAI;AAAA;AAAA,EAGZ,CAAC,kBAAkB,IAA0D;AAAA,EAE7E,YAAY,MAAc,QAA4B,UAAkB;AACvE,SAAK,SAAS,IAAI,KAAK,YAAY,IAAI;AACvC,SAAK,MAAM,IAAI;AACf,SAAK,QAAQ,IAAI;AAAA,EAClB;AACD;AAEO,SAAS,QAAQ,OAAgC;AACvD,SAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,kBAAkB;AACzE;AAqBO,SAAS,aAA8B,OAA0B;AACvE,SAAO,MAAM,SAAS;AACvB;AAEO,SAAS,mBAAoC,OAAmD;AACtG,SAAO,GAAG,MAAM,MAAM,KAAK,QAAQ,IAAI,MAAM,SAAS,CAAC;AACxD;","names":[]}
|
|
@@ -23,6 +23,7 @@ __export(session_exports, {
|
|
|
23
23
|
TiDBServerlessTransaction: () => TiDBServerlessTransaction
|
|
24
24
|
});
|
|
25
25
|
module.exports = __toCommonJS(session_exports);
|
|
26
|
+
var import_column = require("../column.cjs");
|
|
26
27
|
var import_entity = require("../entity.cjs");
|
|
27
28
|
var import_logger = require("../logger.cjs");
|
|
28
29
|
var import_session = require("../mysql-core/session.cjs");
|
|
@@ -30,8 +31,8 @@ var import_sql = require("../sql/sql.cjs");
|
|
|
30
31
|
var import_utils = require("../utils.cjs");
|
|
31
32
|
const executeRawConfig = { fullResult: true };
|
|
32
33
|
const queryConfig = { arrayMode: true };
|
|
33
|
-
class TiDBServerlessPreparedQuery extends import_session.
|
|
34
|
-
constructor(client, queryString, params, logger, fields, customResultMapper) {
|
|
34
|
+
class TiDBServerlessPreparedQuery extends import_session.MySqlPreparedQuery {
|
|
35
|
+
constructor(client, queryString, params, logger, fields, customResultMapper, generatedIds, returningIds) {
|
|
35
36
|
super();
|
|
36
37
|
this.client = client;
|
|
37
38
|
this.queryString = queryString;
|
|
@@ -39,14 +40,38 @@ class TiDBServerlessPreparedQuery extends import_session.PreparedQuery {
|
|
|
39
40
|
this.logger = logger;
|
|
40
41
|
this.fields = fields;
|
|
41
42
|
this.customResultMapper = customResultMapper;
|
|
43
|
+
this.generatedIds = generatedIds;
|
|
44
|
+
this.returningIds = returningIds;
|
|
42
45
|
}
|
|
43
46
|
static [import_entity.entityKind] = "TiDBPreparedQuery";
|
|
44
47
|
async execute(placeholderValues = {}) {
|
|
45
48
|
const params = (0, import_sql.fillPlaceholders)(this.params, placeholderValues);
|
|
46
49
|
this.logger.logQuery(this.queryString, params);
|
|
47
|
-
const { fields, client, queryString, joinsNotNullableMap, customResultMapper } = this;
|
|
50
|
+
const { fields, client, queryString, joinsNotNullableMap, customResultMapper, returningIds, generatedIds } = this;
|
|
48
51
|
if (!fields && !customResultMapper) {
|
|
49
|
-
|
|
52
|
+
const res = await client.execute(queryString, params, executeRawConfig);
|
|
53
|
+
const insertId = res.lastInsertId ?? 0;
|
|
54
|
+
const affectedRows = res.rowsAffected ?? 0;
|
|
55
|
+
if (returningIds) {
|
|
56
|
+
const returningResponse = [];
|
|
57
|
+
let j = 0;
|
|
58
|
+
for (let i = insertId; i < insertId + affectedRows; i++) {
|
|
59
|
+
for (const column of returningIds) {
|
|
60
|
+
const key = returningIds[0].path[0];
|
|
61
|
+
if ((0, import_entity.is)(column.field, import_column.Column)) {
|
|
62
|
+
if (column.field.primary && column.field.autoIncrement) {
|
|
63
|
+
returningResponse.push({ [key]: i });
|
|
64
|
+
}
|
|
65
|
+
if (column.field.defaultFn && generatedIds) {
|
|
66
|
+
returningResponse.push({ [key]: generatedIds[j][key] });
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
j++;
|
|
71
|
+
}
|
|
72
|
+
return returningResponse;
|
|
73
|
+
}
|
|
74
|
+
return res;
|
|
50
75
|
}
|
|
51
76
|
const rows = await client.execute(queryString, params, queryConfig);
|
|
52
77
|
if (customResultMapper) {
|
|
@@ -70,14 +95,16 @@ class TiDBServerlessSession extends import_session.MySqlSession {
|
|
|
70
95
|
static [import_entity.entityKind] = "TiDBServerlessSession";
|
|
71
96
|
logger;
|
|
72
97
|
client;
|
|
73
|
-
prepareQuery(query, fields, customResultMapper) {
|
|
98
|
+
prepareQuery(query, fields, customResultMapper, generatedIds, returningIds) {
|
|
74
99
|
return new TiDBServerlessPreparedQuery(
|
|
75
100
|
this.client,
|
|
76
101
|
query.sql,
|
|
77
102
|
query.params,
|
|
78
103
|
this.logger,
|
|
79
104
|
fields,
|
|
80
|
-
customResultMapper
|
|
105
|
+
customResultMapper,
|
|
106
|
+
generatedIds,
|
|
107
|
+
returningIds
|
|
81
108
|
);
|
|
82
109
|
}
|
|
83
110
|
all(query) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/tidb-serverless/session.ts"],"sourcesContent":["import type { Connection, ExecuteOptions, FullResult, Tx } from '@tidbcloud/serverless';\n\nimport { entityKind } from '~/entity.ts';\nimport type { Logger } from '~/logger.ts';\nimport { NoopLogger } from '~/logger.ts';\nimport type { MySqlDialect } from '~/mysql-core/dialect.ts';\nimport type { SelectedFieldsOrdered } from '~/mysql-core/query-builders/select.types.ts';\nimport {\n\tMySqlSession,\n\tMySqlTransaction,\n\tPreparedQuery,\n\ttype PreparedQueryConfig,\n\ttype PreparedQueryHKT,\n\ttype QueryResultHKT,\n} from '~/mysql-core/session.ts';\nimport type { RelationalSchemaConfig, TablesRelationalConfig } from '~/relations.ts';\nimport { fillPlaceholders, type Query, type SQL, sql } from '~/sql/sql.ts';\nimport { type Assume, mapResultRow } from '~/utils.ts';\n\nconst executeRawConfig = { fullResult: true } satisfies ExecuteOptions;\nconst queryConfig = { arrayMode: true } satisfies ExecuteOptions;\n\nexport class TiDBServerlessPreparedQuery<T extends PreparedQueryConfig> extends PreparedQuery<T> {\n\tstatic readonly [entityKind]: string = 'TiDBPreparedQuery';\n\n\tconstructor(\n\t\tprivate client: Tx | Connection,\n\t\tprivate queryString: string,\n\t\tprivate params: unknown[],\n\t\tprivate logger: Logger,\n\t\tprivate fields: SelectedFieldsOrdered | undefined,\n\t\tprivate customResultMapper?: (rows: unknown[][]) => T['execute'],\n\t) {\n\t\tsuper();\n\t}\n\n\tasync execute(placeholderValues: Record<string, unknown> | undefined = {}): Promise<T['execute']> {\n\t\tconst params = fillPlaceholders(this.params, placeholderValues);\n\n\t\tthis.logger.logQuery(this.queryString, params);\n\n\t\tconst { fields, client, queryString, joinsNotNullableMap, customResultMapper } = this;\n\t\tif (!fields && !customResultMapper) {\n\t\t\treturn client.execute(queryString, params, executeRawConfig);\n\t\t}\n\n\t\tconst rows = await client.execute(queryString, params, queryConfig) as unknown[][];\n\n\t\tif (customResultMapper) {\n\t\t\treturn customResultMapper(rows);\n\t\t}\n\n\t\treturn rows.map((row) => mapResultRow<T['execute']>(fields!, row, joinsNotNullableMap));\n\t}\n\n\toverride iterator(_placeholderValues?: Record<string, unknown>): AsyncGenerator<T['iterator']> {\n\t\tthrow new Error('Streaming is not supported by the TiDB Cloud Serverless driver');\n\t}\n}\n\nexport interface TiDBServerlessSessionOptions {\n\tlogger?: Logger;\n}\n\nexport class TiDBServerlessSession<\n\tTFullSchema extends Record<string, unknown>,\n\tTSchema extends TablesRelationalConfig,\n> extends MySqlSession<TiDBServerlessQueryResultHKT, TiDBServerlessPreparedQueryHKT, TFullSchema, TSchema> {\n\tstatic readonly [entityKind]: string = 'TiDBServerlessSession';\n\n\tprivate logger: Logger;\n\tprivate client: Tx | Connection;\n\n\tconstructor(\n\t\tprivate baseClient: Connection,\n\t\tdialect: MySqlDialect,\n\t\ttx: Tx | undefined,\n\t\tprivate schema: RelationalSchemaConfig<TSchema> | undefined,\n\t\tprivate options: TiDBServerlessSessionOptions = {},\n\t) {\n\t\tsuper(dialect);\n\t\tthis.client = tx ?? baseClient;\n\t\tthis.logger = options.logger ?? new NoopLogger();\n\t}\n\n\tprepareQuery<T extends PreparedQueryConfig = PreparedQueryConfig>(\n\t\tquery: Query,\n\t\tfields: SelectedFieldsOrdered | undefined,\n\t\tcustomResultMapper?: (rows: unknown[][]) => T['execute'],\n\t): PreparedQuery<T> {\n\t\treturn new TiDBServerlessPreparedQuery(\n\t\t\tthis.client,\n\t\t\tquery.sql,\n\t\t\tquery.params,\n\t\t\tthis.logger,\n\t\t\tfields,\n\t\t\tcustomResultMapper,\n\t\t);\n\t}\n\n\toverride all<T = unknown>(query: SQL): Promise<T[]> {\n\t\tconst querySql = this.dialect.sqlToQuery(query);\n\t\tthis.logger.logQuery(querySql.sql, querySql.params);\n\t\treturn this.client.execute(querySql.sql, querySql.params) as Promise<T[]>;\n\t}\n\n\toverride async transaction<T>(\n\t\ttransaction: (tx: TiDBServerlessTransaction<TFullSchema, TSchema>) => Promise<T>,\n\t): Promise<T> {\n\t\tconst nativeTx = await this.baseClient.begin();\n\t\ttry {\n\t\t\tconst session = new TiDBServerlessSession(this.baseClient, this.dialect, nativeTx, this.schema, this.options);\n\t\t\tconst tx = new TiDBServerlessTransaction<TFullSchema, TSchema>(\n\t\t\t\tthis.dialect,\n\t\t\t\tsession as MySqlSession<any, any, any, any>,\n\t\t\t\tthis.schema,\n\t\t\t);\n\t\t\tconst result = await transaction(tx);\n\t\t\tawait nativeTx.commit();\n\t\t\treturn result;\n\t\t} catch (err) {\n\t\t\tawait nativeTx.rollback();\n\t\t\tthrow err;\n\t\t}\n\t}\n}\n\nexport class TiDBServerlessTransaction<\n\tTFullSchema extends Record<string, unknown>,\n\tTSchema extends TablesRelationalConfig,\n> extends MySqlTransaction<TiDBServerlessQueryResultHKT, TiDBServerlessPreparedQueryHKT, TFullSchema, TSchema> {\n\tstatic readonly [entityKind]: string = 'TiDBServerlessTransaction';\n\n\tconstructor(\n\t\tdialect: MySqlDialect,\n\t\tsession: MySqlSession,\n\t\tschema: RelationalSchemaConfig<TSchema> | undefined,\n\t\tnestedIndex = 0,\n\t) {\n\t\tsuper(dialect, session, schema, nestedIndex, 'default');\n\t}\n\n\toverride async transaction<T>(\n\t\ttransaction: (tx: TiDBServerlessTransaction<TFullSchema, TSchema>) => Promise<T>,\n\t): Promise<T> {\n\t\tconst savepointName = `sp${this.nestedIndex + 1}`;\n\t\tconst tx = new TiDBServerlessTransaction<TFullSchema, TSchema>(\n\t\t\tthis.dialect,\n\t\t\tthis.session,\n\t\t\tthis.schema,\n\t\t\tthis.nestedIndex + 1,\n\t\t);\n\t\tawait tx.execute(sql.raw(`savepoint ${savepointName}`));\n\t\ttry {\n\t\t\tconst result = await transaction(tx);\n\t\t\tawait tx.execute(sql.raw(`release savepoint ${savepointName}`));\n\t\t\treturn result;\n\t\t} catch (err) {\n\t\t\tawait tx.execute(sql.raw(`rollback to savepoint ${savepointName}`));\n\t\t\tthrow err;\n\t\t}\n\t}\n}\n\nexport interface TiDBServerlessQueryResultHKT extends QueryResultHKT {\n\ttype: FullResult;\n}\n\nexport interface TiDBServerlessPreparedQueryHKT extends PreparedQueryHKT {\n\ttype: TiDBServerlessPreparedQuery<Assume<this['config'], PreparedQueryConfig>>;\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../src/tidb-serverless/session.ts"],"sourcesContent":["import type { Connection, ExecuteOptions, FullResult, Tx } from '@tidbcloud/serverless';\nimport { Column } from '~/column.ts';\n\nimport { entityKind, is } from '~/entity.ts';\nimport type { Logger } from '~/logger.ts';\nimport { NoopLogger } from '~/logger.ts';\nimport type { MySqlDialect } from '~/mysql-core/dialect.ts';\nimport type { SelectedFieldsOrdered } from '~/mysql-core/query-builders/select.types.ts';\nimport {\n\tMySqlPreparedQuery,\n\ttype MySqlPreparedQueryConfig,\n\ttype MySqlPreparedQueryHKT,\n\ttype MySqlQueryResultHKT,\n\tMySqlSession,\n\tMySqlTransaction,\n} from '~/mysql-core/session.ts';\nimport type { RelationalSchemaConfig, TablesRelationalConfig } from '~/relations.ts';\nimport { fillPlaceholders, type Query, type SQL, sql } from '~/sql/sql.ts';\nimport { type Assume, mapResultRow } from '~/utils.ts';\n\nconst executeRawConfig = { fullResult: true } satisfies ExecuteOptions;\nconst queryConfig = { arrayMode: true } satisfies ExecuteOptions;\n\nexport class TiDBServerlessPreparedQuery<T extends MySqlPreparedQueryConfig> extends MySqlPreparedQuery<T> {\n\tstatic readonly [entityKind]: string = 'TiDBPreparedQuery';\n\n\tconstructor(\n\t\tprivate client: Tx | Connection,\n\t\tprivate queryString: string,\n\t\tprivate params: unknown[],\n\t\tprivate logger: Logger,\n\t\tprivate fields: SelectedFieldsOrdered | undefined,\n\t\tprivate customResultMapper?: (rows: unknown[][]) => T['execute'],\n\t\t// Keys that were used in $default and the value that was generated for them\n\t\tprivate generatedIds?: Record<string, unknown>[],\n\t\t// Keys that should be returned, it has the column with all properries + key from object\n\t\tprivate returningIds?: SelectedFieldsOrdered,\n\t) {\n\t\tsuper();\n\t}\n\n\tasync execute(placeholderValues: Record<string, unknown> | undefined = {}): Promise<T['execute']> {\n\t\tconst params = fillPlaceholders(this.params, placeholderValues);\n\n\t\tthis.logger.logQuery(this.queryString, params);\n\n\t\tconst { fields, client, queryString, joinsNotNullableMap, customResultMapper, returningIds, generatedIds } = this;\n\t\tif (!fields && !customResultMapper) {\n\t\t\tconst res = await client.execute(queryString, params, executeRawConfig) as FullResult;\n\t\t\tconst insertId = res.lastInsertId ?? 0;\n\t\t\tconst affectedRows = res.rowsAffected ?? 0;\n\t\t\t// for each row, I need to check keys from\n\t\t\tif (returningIds) {\n\t\t\t\tconst returningResponse = [];\n\t\t\t\tlet j = 0;\n\t\t\t\tfor (let i = insertId; i < insertId + affectedRows; i++) {\n\t\t\t\t\tfor (const column of returningIds) {\n\t\t\t\t\t\tconst key = returningIds[0]!.path[0]!;\n\t\t\t\t\t\tif (is(column.field, Column)) {\n\t\t\t\t\t\t\t// @ts-ignore\n\t\t\t\t\t\t\tif (column.field.primary && column.field.autoIncrement) {\n\t\t\t\t\t\t\t\treturningResponse.push({ [key]: i });\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (column.field.defaultFn && generatedIds) {\n\t\t\t\t\t\t\t\t// generatedIds[rowIdx][key]\n\t\t\t\t\t\t\t\treturningResponse.push({ [key]: generatedIds[j]![key] });\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\tj++;\n\t\t\t\t}\n\n\t\t\t\treturn returningResponse;\n\t\t\t}\n\t\t\treturn res;\n\t\t}\n\n\t\tconst rows = await client.execute(queryString, params, queryConfig) as unknown[][];\n\n\t\tif (customResultMapper) {\n\t\t\treturn customResultMapper(rows);\n\t\t}\n\n\t\treturn rows.map((row) => mapResultRow<T['execute']>(fields!, row, joinsNotNullableMap));\n\t}\n\n\toverride iterator(_placeholderValues?: Record<string, unknown>): AsyncGenerator<T['iterator']> {\n\t\tthrow new Error('Streaming is not supported by the TiDB Cloud Serverless driver');\n\t}\n}\n\nexport interface TiDBServerlessSessionOptions {\n\tlogger?: Logger;\n}\n\nexport class TiDBServerlessSession<\n\tTFullSchema extends Record<string, unknown>,\n\tTSchema extends TablesRelationalConfig,\n> extends MySqlSession<TiDBServerlessQueryResultHKT, TiDBServerlessPreparedQueryHKT, TFullSchema, TSchema> {\n\tstatic readonly [entityKind]: string = 'TiDBServerlessSession';\n\n\tprivate logger: Logger;\n\tprivate client: Tx | Connection;\n\n\tconstructor(\n\t\tprivate baseClient: Connection,\n\t\tdialect: MySqlDialect,\n\t\ttx: Tx | undefined,\n\t\tprivate schema: RelationalSchemaConfig<TSchema> | undefined,\n\t\tprivate options: TiDBServerlessSessionOptions = {},\n\t) {\n\t\tsuper(dialect);\n\t\tthis.client = tx ?? baseClient;\n\t\tthis.logger = options.logger ?? new NoopLogger();\n\t}\n\n\tprepareQuery<T extends MySqlPreparedQueryConfig = MySqlPreparedQueryConfig>(\n\t\tquery: Query,\n\t\tfields: SelectedFieldsOrdered | undefined,\n\t\tcustomResultMapper?: (rows: unknown[][]) => T['execute'],\n\t\tgeneratedIds?: Record<string, unknown>[],\n\t\treturningIds?: SelectedFieldsOrdered,\n\t): MySqlPreparedQuery<T> {\n\t\treturn new TiDBServerlessPreparedQuery(\n\t\t\tthis.client,\n\t\t\tquery.sql,\n\t\t\tquery.params,\n\t\t\tthis.logger,\n\t\t\tfields,\n\t\t\tcustomResultMapper,\n\t\t\tgeneratedIds,\n\t\t\treturningIds,\n\t\t);\n\t}\n\n\toverride all<T = unknown>(query: SQL): Promise<T[]> {\n\t\tconst querySql = this.dialect.sqlToQuery(query);\n\t\tthis.logger.logQuery(querySql.sql, querySql.params);\n\t\treturn this.client.execute(querySql.sql, querySql.params) as Promise<T[]>;\n\t}\n\n\toverride async transaction<T>(\n\t\ttransaction: (tx: TiDBServerlessTransaction<TFullSchema, TSchema>) => Promise<T>,\n\t): Promise<T> {\n\t\tconst nativeTx = await this.baseClient.begin();\n\t\ttry {\n\t\t\tconst session = new TiDBServerlessSession(this.baseClient, this.dialect, nativeTx, this.schema, this.options);\n\t\t\tconst tx = new TiDBServerlessTransaction<TFullSchema, TSchema>(\n\t\t\t\tthis.dialect,\n\t\t\t\tsession as MySqlSession<any, any, any, any>,\n\t\t\t\tthis.schema,\n\t\t\t);\n\t\t\tconst result = await transaction(tx);\n\t\t\tawait nativeTx.commit();\n\t\t\treturn result;\n\t\t} catch (err) {\n\t\t\tawait nativeTx.rollback();\n\t\t\tthrow err;\n\t\t}\n\t}\n}\n\nexport class TiDBServerlessTransaction<\n\tTFullSchema extends Record<string, unknown>,\n\tTSchema extends TablesRelationalConfig,\n> extends MySqlTransaction<TiDBServerlessQueryResultHKT, TiDBServerlessPreparedQueryHKT, TFullSchema, TSchema> {\n\tstatic readonly [entityKind]: string = 'TiDBServerlessTransaction';\n\n\tconstructor(\n\t\tdialect: MySqlDialect,\n\t\tsession: MySqlSession,\n\t\tschema: RelationalSchemaConfig<TSchema> | undefined,\n\t\tnestedIndex = 0,\n\t) {\n\t\tsuper(dialect, session, schema, nestedIndex, 'default');\n\t}\n\n\toverride async transaction<T>(\n\t\ttransaction: (tx: TiDBServerlessTransaction<TFullSchema, TSchema>) => Promise<T>,\n\t): Promise<T> {\n\t\tconst savepointName = `sp${this.nestedIndex + 1}`;\n\t\tconst tx = new TiDBServerlessTransaction<TFullSchema, TSchema>(\n\t\t\tthis.dialect,\n\t\t\tthis.session,\n\t\t\tthis.schema,\n\t\t\tthis.nestedIndex + 1,\n\t\t);\n\t\tawait tx.execute(sql.raw(`savepoint ${savepointName}`));\n\t\ttry {\n\t\t\tconst result = await transaction(tx);\n\t\t\tawait tx.execute(sql.raw(`release savepoint ${savepointName}`));\n\t\t\treturn result;\n\t\t} catch (err) {\n\t\t\tawait tx.execute(sql.raw(`rollback to savepoint ${savepointName}`));\n\t\t\tthrow err;\n\t\t}\n\t}\n}\n\nexport interface TiDBServerlessQueryResultHKT extends MySqlQueryResultHKT {\n\ttype: FullResult;\n}\n\nexport interface TiDBServerlessPreparedQueryHKT extends MySqlPreparedQueryHKT {\n\ttype: TiDBServerlessPreparedQuery<Assume<this['config'], MySqlPreparedQueryConfig>>;\n}\n"],"mappings":"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","names":[]}
|
|
@@ -3,19 +3,21 @@ import { entityKind } from "../entity.cjs";
|
|
|
3
3
|
import type { Logger } from "../logger.cjs";
|
|
4
4
|
import type { MySqlDialect } from "../mysql-core/dialect.cjs";
|
|
5
5
|
import type { SelectedFieldsOrdered } from "../mysql-core/query-builders/select.types.cjs";
|
|
6
|
-
import {
|
|
6
|
+
import { MySqlPreparedQuery, type MySqlPreparedQueryConfig, type MySqlPreparedQueryHKT, type MySqlQueryResultHKT, MySqlSession, MySqlTransaction } from "../mysql-core/session.cjs";
|
|
7
7
|
import type { RelationalSchemaConfig, TablesRelationalConfig } from "../relations.cjs";
|
|
8
8
|
import { type Query, type SQL } from "../sql/sql.cjs";
|
|
9
9
|
import { type Assume } from "../utils.cjs";
|
|
10
|
-
export declare class TiDBServerlessPreparedQuery<T extends
|
|
10
|
+
export declare class TiDBServerlessPreparedQuery<T extends MySqlPreparedQueryConfig> extends MySqlPreparedQuery<T> {
|
|
11
11
|
private client;
|
|
12
12
|
private queryString;
|
|
13
13
|
private params;
|
|
14
14
|
private logger;
|
|
15
15
|
private fields;
|
|
16
16
|
private customResultMapper?;
|
|
17
|
+
private generatedIds?;
|
|
18
|
+
private returningIds?;
|
|
17
19
|
static readonly [entityKind]: string;
|
|
18
|
-
constructor(client: Tx | Connection, queryString: string, params: unknown[], logger: Logger, fields: SelectedFieldsOrdered | undefined, customResultMapper?: ((rows: unknown[][]) => T['execute']) | undefined);
|
|
20
|
+
constructor(client: Tx | Connection, queryString: string, params: unknown[], logger: Logger, fields: SelectedFieldsOrdered | undefined, customResultMapper?: ((rows: unknown[][]) => T['execute']) | undefined, generatedIds?: Record<string, unknown>[] | undefined, returningIds?: SelectedFieldsOrdered | undefined);
|
|
19
21
|
execute(placeholderValues?: Record<string, unknown> | undefined): Promise<T['execute']>;
|
|
20
22
|
iterator(_placeholderValues?: Record<string, unknown>): AsyncGenerator<T['iterator']>;
|
|
21
23
|
}
|
|
@@ -30,7 +32,7 @@ export declare class TiDBServerlessSession<TFullSchema extends Record<string, un
|
|
|
30
32
|
private logger;
|
|
31
33
|
private client;
|
|
32
34
|
constructor(baseClient: Connection, dialect: MySqlDialect, tx: Tx | undefined, schema: RelationalSchemaConfig<TSchema> | undefined, options?: TiDBServerlessSessionOptions);
|
|
33
|
-
prepareQuery<T extends
|
|
35
|
+
prepareQuery<T extends MySqlPreparedQueryConfig = MySqlPreparedQueryConfig>(query: Query, fields: SelectedFieldsOrdered | undefined, customResultMapper?: (rows: unknown[][]) => T['execute'], generatedIds?: Record<string, unknown>[], returningIds?: SelectedFieldsOrdered): MySqlPreparedQuery<T>;
|
|
34
36
|
all<T = unknown>(query: SQL): Promise<T[]>;
|
|
35
37
|
transaction<T>(transaction: (tx: TiDBServerlessTransaction<TFullSchema, TSchema>) => Promise<T>): Promise<T>;
|
|
36
38
|
}
|
|
@@ -39,9 +41,9 @@ export declare class TiDBServerlessTransaction<TFullSchema extends Record<string
|
|
|
39
41
|
constructor(dialect: MySqlDialect, session: MySqlSession, schema: RelationalSchemaConfig<TSchema> | undefined, nestedIndex?: number);
|
|
40
42
|
transaction<T>(transaction: (tx: TiDBServerlessTransaction<TFullSchema, TSchema>) => Promise<T>): Promise<T>;
|
|
41
43
|
}
|
|
42
|
-
export interface TiDBServerlessQueryResultHKT extends
|
|
44
|
+
export interface TiDBServerlessQueryResultHKT extends MySqlQueryResultHKT {
|
|
43
45
|
type: FullResult;
|
|
44
46
|
}
|
|
45
|
-
export interface TiDBServerlessPreparedQueryHKT extends
|
|
46
|
-
type: TiDBServerlessPreparedQuery<Assume<this['config'],
|
|
47
|
+
export interface TiDBServerlessPreparedQueryHKT extends MySqlPreparedQueryHKT {
|
|
48
|
+
type: TiDBServerlessPreparedQuery<Assume<this['config'], MySqlPreparedQueryConfig>>;
|
|
47
49
|
}
|
|
@@ -3,19 +3,21 @@ import { entityKind } from "../entity.js";
|
|
|
3
3
|
import type { Logger } from "../logger.js";
|
|
4
4
|
import type { MySqlDialect } from "../mysql-core/dialect.js";
|
|
5
5
|
import type { SelectedFieldsOrdered } from "../mysql-core/query-builders/select.types.js";
|
|
6
|
-
import {
|
|
6
|
+
import { MySqlPreparedQuery, type MySqlPreparedQueryConfig, type MySqlPreparedQueryHKT, type MySqlQueryResultHKT, MySqlSession, MySqlTransaction } from "../mysql-core/session.js";
|
|
7
7
|
import type { RelationalSchemaConfig, TablesRelationalConfig } from "../relations.js";
|
|
8
8
|
import { type Query, type SQL } from "../sql/sql.js";
|
|
9
9
|
import { type Assume } from "../utils.js";
|
|
10
|
-
export declare class TiDBServerlessPreparedQuery<T extends
|
|
10
|
+
export declare class TiDBServerlessPreparedQuery<T extends MySqlPreparedQueryConfig> extends MySqlPreparedQuery<T> {
|
|
11
11
|
private client;
|
|
12
12
|
private queryString;
|
|
13
13
|
private params;
|
|
14
14
|
private logger;
|
|
15
15
|
private fields;
|
|
16
16
|
private customResultMapper?;
|
|
17
|
+
private generatedIds?;
|
|
18
|
+
private returningIds?;
|
|
17
19
|
static readonly [entityKind]: string;
|
|
18
|
-
constructor(client: Tx | Connection, queryString: string, params: unknown[], logger: Logger, fields: SelectedFieldsOrdered | undefined, customResultMapper?: ((rows: unknown[][]) => T['execute']) | undefined);
|
|
20
|
+
constructor(client: Tx | Connection, queryString: string, params: unknown[], logger: Logger, fields: SelectedFieldsOrdered | undefined, customResultMapper?: ((rows: unknown[][]) => T['execute']) | undefined, generatedIds?: Record<string, unknown>[] | undefined, returningIds?: SelectedFieldsOrdered | undefined);
|
|
19
21
|
execute(placeholderValues?: Record<string, unknown> | undefined): Promise<T['execute']>;
|
|
20
22
|
iterator(_placeholderValues?: Record<string, unknown>): AsyncGenerator<T['iterator']>;
|
|
21
23
|
}
|
|
@@ -30,7 +32,7 @@ export declare class TiDBServerlessSession<TFullSchema extends Record<string, un
|
|
|
30
32
|
private logger;
|
|
31
33
|
private client;
|
|
32
34
|
constructor(baseClient: Connection, dialect: MySqlDialect, tx: Tx | undefined, schema: RelationalSchemaConfig<TSchema> | undefined, options?: TiDBServerlessSessionOptions);
|
|
33
|
-
prepareQuery<T extends
|
|
35
|
+
prepareQuery<T extends MySqlPreparedQueryConfig = MySqlPreparedQueryConfig>(query: Query, fields: SelectedFieldsOrdered | undefined, customResultMapper?: (rows: unknown[][]) => T['execute'], generatedIds?: Record<string, unknown>[], returningIds?: SelectedFieldsOrdered): MySqlPreparedQuery<T>;
|
|
34
36
|
all<T = unknown>(query: SQL): Promise<T[]>;
|
|
35
37
|
transaction<T>(transaction: (tx: TiDBServerlessTransaction<TFullSchema, TSchema>) => Promise<T>): Promise<T>;
|
|
36
38
|
}
|
|
@@ -39,9 +41,9 @@ export declare class TiDBServerlessTransaction<TFullSchema extends Record<string
|
|
|
39
41
|
constructor(dialect: MySqlDialect, session: MySqlSession, schema: RelationalSchemaConfig<TSchema> | undefined, nestedIndex?: number);
|
|
40
42
|
transaction<T>(transaction: (tx: TiDBServerlessTransaction<TFullSchema, TSchema>) => Promise<T>): Promise<T>;
|
|
41
43
|
}
|
|
42
|
-
export interface TiDBServerlessQueryResultHKT extends
|
|
44
|
+
export interface TiDBServerlessQueryResultHKT extends MySqlQueryResultHKT {
|
|
43
45
|
type: FullResult;
|
|
44
46
|
}
|
|
45
|
-
export interface TiDBServerlessPreparedQueryHKT extends
|
|
46
|
-
type: TiDBServerlessPreparedQuery<Assume<this['config'],
|
|
47
|
+
export interface TiDBServerlessPreparedQueryHKT extends MySqlPreparedQueryHKT {
|
|
48
|
+
type: TiDBServerlessPreparedQuery<Assume<this['config'], MySqlPreparedQueryConfig>>;
|
|
47
49
|
}
|
|
@@ -1,16 +1,17 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { Column } from "../column.js";
|
|
2
|
+
import { entityKind, is } from "../entity.js";
|
|
2
3
|
import { NoopLogger } from "../logger.js";
|
|
3
4
|
import {
|
|
5
|
+
MySqlPreparedQuery,
|
|
4
6
|
MySqlSession,
|
|
5
|
-
MySqlTransaction
|
|
6
|
-
PreparedQuery
|
|
7
|
+
MySqlTransaction
|
|
7
8
|
} from "../mysql-core/session.js";
|
|
8
9
|
import { fillPlaceholders, sql } from "../sql/sql.js";
|
|
9
10
|
import { mapResultRow } from "../utils.js";
|
|
10
11
|
const executeRawConfig = { fullResult: true };
|
|
11
12
|
const queryConfig = { arrayMode: true };
|
|
12
|
-
class TiDBServerlessPreparedQuery extends
|
|
13
|
-
constructor(client, queryString, params, logger, fields, customResultMapper) {
|
|
13
|
+
class TiDBServerlessPreparedQuery extends MySqlPreparedQuery {
|
|
14
|
+
constructor(client, queryString, params, logger, fields, customResultMapper, generatedIds, returningIds) {
|
|
14
15
|
super();
|
|
15
16
|
this.client = client;
|
|
16
17
|
this.queryString = queryString;
|
|
@@ -18,14 +19,38 @@ class TiDBServerlessPreparedQuery extends PreparedQuery {
|
|
|
18
19
|
this.logger = logger;
|
|
19
20
|
this.fields = fields;
|
|
20
21
|
this.customResultMapper = customResultMapper;
|
|
22
|
+
this.generatedIds = generatedIds;
|
|
23
|
+
this.returningIds = returningIds;
|
|
21
24
|
}
|
|
22
25
|
static [entityKind] = "TiDBPreparedQuery";
|
|
23
26
|
async execute(placeholderValues = {}) {
|
|
24
27
|
const params = fillPlaceholders(this.params, placeholderValues);
|
|
25
28
|
this.logger.logQuery(this.queryString, params);
|
|
26
|
-
const { fields, client, queryString, joinsNotNullableMap, customResultMapper } = this;
|
|
29
|
+
const { fields, client, queryString, joinsNotNullableMap, customResultMapper, returningIds, generatedIds } = this;
|
|
27
30
|
if (!fields && !customResultMapper) {
|
|
28
|
-
|
|
31
|
+
const res = await client.execute(queryString, params, executeRawConfig);
|
|
32
|
+
const insertId = res.lastInsertId ?? 0;
|
|
33
|
+
const affectedRows = res.rowsAffected ?? 0;
|
|
34
|
+
if (returningIds) {
|
|
35
|
+
const returningResponse = [];
|
|
36
|
+
let j = 0;
|
|
37
|
+
for (let i = insertId; i < insertId + affectedRows; i++) {
|
|
38
|
+
for (const column of returningIds) {
|
|
39
|
+
const key = returningIds[0].path[0];
|
|
40
|
+
if (is(column.field, Column)) {
|
|
41
|
+
if (column.field.primary && column.field.autoIncrement) {
|
|
42
|
+
returningResponse.push({ [key]: i });
|
|
43
|
+
}
|
|
44
|
+
if (column.field.defaultFn && generatedIds) {
|
|
45
|
+
returningResponse.push({ [key]: generatedIds[j][key] });
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
j++;
|
|
50
|
+
}
|
|
51
|
+
return returningResponse;
|
|
52
|
+
}
|
|
53
|
+
return res;
|
|
29
54
|
}
|
|
30
55
|
const rows = await client.execute(queryString, params, queryConfig);
|
|
31
56
|
if (customResultMapper) {
|
|
@@ -49,14 +74,16 @@ class TiDBServerlessSession extends MySqlSession {
|
|
|
49
74
|
static [entityKind] = "TiDBServerlessSession";
|
|
50
75
|
logger;
|
|
51
76
|
client;
|
|
52
|
-
prepareQuery(query, fields, customResultMapper) {
|
|
77
|
+
prepareQuery(query, fields, customResultMapper, generatedIds, returningIds) {
|
|
53
78
|
return new TiDBServerlessPreparedQuery(
|
|
54
79
|
this.client,
|
|
55
80
|
query.sql,
|
|
56
81
|
query.params,
|
|
57
82
|
this.logger,
|
|
58
83
|
fields,
|
|
59
|
-
customResultMapper
|
|
84
|
+
customResultMapper,
|
|
85
|
+
generatedIds,
|
|
86
|
+
returningIds
|
|
60
87
|
);
|
|
61
88
|
}
|
|
62
89
|
all(query) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/tidb-serverless/session.ts"],"sourcesContent":["import type { Connection, ExecuteOptions, FullResult, Tx } from '@tidbcloud/serverless';\n\nimport { entityKind } from '~/entity.ts';\nimport type { Logger } from '~/logger.ts';\nimport { NoopLogger } from '~/logger.ts';\nimport type { MySqlDialect } from '~/mysql-core/dialect.ts';\nimport type { SelectedFieldsOrdered } from '~/mysql-core/query-builders/select.types.ts';\nimport {\n\tMySqlSession,\n\tMySqlTransaction,\n\tPreparedQuery,\n\ttype PreparedQueryConfig,\n\ttype PreparedQueryHKT,\n\ttype QueryResultHKT,\n} from '~/mysql-core/session.ts';\nimport type { RelationalSchemaConfig, TablesRelationalConfig } from '~/relations.ts';\nimport { fillPlaceholders, type Query, type SQL, sql } from '~/sql/sql.ts';\nimport { type Assume, mapResultRow } from '~/utils.ts';\n\nconst executeRawConfig = { fullResult: true } satisfies ExecuteOptions;\nconst queryConfig = { arrayMode: true } satisfies ExecuteOptions;\n\nexport class TiDBServerlessPreparedQuery<T extends PreparedQueryConfig> extends PreparedQuery<T> {\n\tstatic readonly [entityKind]: string = 'TiDBPreparedQuery';\n\n\tconstructor(\n\t\tprivate client: Tx | Connection,\n\t\tprivate queryString: string,\n\t\tprivate params: unknown[],\n\t\tprivate logger: Logger,\n\t\tprivate fields: SelectedFieldsOrdered | undefined,\n\t\tprivate customResultMapper?: (rows: unknown[][]) => T['execute'],\n\t) {\n\t\tsuper();\n\t}\n\n\tasync execute(placeholderValues: Record<string, unknown> | undefined = {}): Promise<T['execute']> {\n\t\tconst params = fillPlaceholders(this.params, placeholderValues);\n\n\t\tthis.logger.logQuery(this.queryString, params);\n\n\t\tconst { fields, client, queryString, joinsNotNullableMap, customResultMapper } = this;\n\t\tif (!fields && !customResultMapper) {\n\t\t\treturn client.execute(queryString, params, executeRawConfig);\n\t\t}\n\n\t\tconst rows = await client.execute(queryString, params, queryConfig) as unknown[][];\n\n\t\tif (customResultMapper) {\n\t\t\treturn customResultMapper(rows);\n\t\t}\n\n\t\treturn rows.map((row) => mapResultRow<T['execute']>(fields!, row, joinsNotNullableMap));\n\t}\n\n\toverride iterator(_placeholderValues?: Record<string, unknown>): AsyncGenerator<T['iterator']> {\n\t\tthrow new Error('Streaming is not supported by the TiDB Cloud Serverless driver');\n\t}\n}\n\nexport interface TiDBServerlessSessionOptions {\n\tlogger?: Logger;\n}\n\nexport class TiDBServerlessSession<\n\tTFullSchema extends Record<string, unknown>,\n\tTSchema extends TablesRelationalConfig,\n> extends MySqlSession<TiDBServerlessQueryResultHKT, TiDBServerlessPreparedQueryHKT, TFullSchema, TSchema> {\n\tstatic readonly [entityKind]: string = 'TiDBServerlessSession';\n\n\tprivate logger: Logger;\n\tprivate client: Tx | Connection;\n\n\tconstructor(\n\t\tprivate baseClient: Connection,\n\t\tdialect: MySqlDialect,\n\t\ttx: Tx | undefined,\n\t\tprivate schema: RelationalSchemaConfig<TSchema> | undefined,\n\t\tprivate options: TiDBServerlessSessionOptions = {},\n\t) {\n\t\tsuper(dialect);\n\t\tthis.client = tx ?? baseClient;\n\t\tthis.logger = options.logger ?? new NoopLogger();\n\t}\n\n\tprepareQuery<T extends PreparedQueryConfig = PreparedQueryConfig>(\n\t\tquery: Query,\n\t\tfields: SelectedFieldsOrdered | undefined,\n\t\tcustomResultMapper?: (rows: unknown[][]) => T['execute'],\n\t): PreparedQuery<T> {\n\t\treturn new TiDBServerlessPreparedQuery(\n\t\t\tthis.client,\n\t\t\tquery.sql,\n\t\t\tquery.params,\n\t\t\tthis.logger,\n\t\t\tfields,\n\t\t\tcustomResultMapper,\n\t\t);\n\t}\n\n\toverride all<T = unknown>(query: SQL): Promise<T[]> {\n\t\tconst querySql = this.dialect.sqlToQuery(query);\n\t\tthis.logger.logQuery(querySql.sql, querySql.params);\n\t\treturn this.client.execute(querySql.sql, querySql.params) as Promise<T[]>;\n\t}\n\n\toverride async transaction<T>(\n\t\ttransaction: (tx: TiDBServerlessTransaction<TFullSchema, TSchema>) => Promise<T>,\n\t): Promise<T> {\n\t\tconst nativeTx = await this.baseClient.begin();\n\t\ttry {\n\t\t\tconst session = new TiDBServerlessSession(this.baseClient, this.dialect, nativeTx, this.schema, this.options);\n\t\t\tconst tx = new TiDBServerlessTransaction<TFullSchema, TSchema>(\n\t\t\t\tthis.dialect,\n\t\t\t\tsession as MySqlSession<any, any, any, any>,\n\t\t\t\tthis.schema,\n\t\t\t);\n\t\t\tconst result = await transaction(tx);\n\t\t\tawait nativeTx.commit();\n\t\t\treturn result;\n\t\t} catch (err) {\n\t\t\tawait nativeTx.rollback();\n\t\t\tthrow err;\n\t\t}\n\t}\n}\n\nexport class TiDBServerlessTransaction<\n\tTFullSchema extends Record<string, unknown>,\n\tTSchema extends TablesRelationalConfig,\n> extends MySqlTransaction<TiDBServerlessQueryResultHKT, TiDBServerlessPreparedQueryHKT, TFullSchema, TSchema> {\n\tstatic readonly [entityKind]: string = 'TiDBServerlessTransaction';\n\n\tconstructor(\n\t\tdialect: MySqlDialect,\n\t\tsession: MySqlSession,\n\t\tschema: RelationalSchemaConfig<TSchema> | undefined,\n\t\tnestedIndex = 0,\n\t) {\n\t\tsuper(dialect, session, schema, nestedIndex, 'default');\n\t}\n\n\toverride async transaction<T>(\n\t\ttransaction: (tx: TiDBServerlessTransaction<TFullSchema, TSchema>) => Promise<T>,\n\t): Promise<T> {\n\t\tconst savepointName = `sp${this.nestedIndex + 1}`;\n\t\tconst tx = new TiDBServerlessTransaction<TFullSchema, TSchema>(\n\t\t\tthis.dialect,\n\t\t\tthis.session,\n\t\t\tthis.schema,\n\t\t\tthis.nestedIndex + 1,\n\t\t);\n\t\tawait tx.execute(sql.raw(`savepoint ${savepointName}`));\n\t\ttry {\n\t\t\tconst result = await transaction(tx);\n\t\t\tawait tx.execute(sql.raw(`release savepoint ${savepointName}`));\n\t\t\treturn result;\n\t\t} catch (err) {\n\t\t\tawait tx.execute(sql.raw(`rollback to savepoint ${savepointName}`));\n\t\t\tthrow err;\n\t\t}\n\t}\n}\n\nexport interface TiDBServerlessQueryResultHKT extends QueryResultHKT {\n\ttype: FullResult;\n}\n\nexport interface TiDBServerlessPreparedQueryHKT extends PreparedQueryHKT {\n\ttype: TiDBServerlessPreparedQuery<Assume<this['config'], PreparedQueryConfig>>;\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../src/tidb-serverless/session.ts"],"sourcesContent":["import type { Connection, ExecuteOptions, FullResult, Tx } from '@tidbcloud/serverless';\nimport { Column } from '~/column.ts';\n\nimport { entityKind, is } from '~/entity.ts';\nimport type { Logger } from '~/logger.ts';\nimport { NoopLogger } from '~/logger.ts';\nimport type { MySqlDialect } from '~/mysql-core/dialect.ts';\nimport type { SelectedFieldsOrdered } from '~/mysql-core/query-builders/select.types.ts';\nimport {\n\tMySqlPreparedQuery,\n\ttype MySqlPreparedQueryConfig,\n\ttype MySqlPreparedQueryHKT,\n\ttype MySqlQueryResultHKT,\n\tMySqlSession,\n\tMySqlTransaction,\n} from '~/mysql-core/session.ts';\nimport type { RelationalSchemaConfig, TablesRelationalConfig } from '~/relations.ts';\nimport { fillPlaceholders, type Query, type SQL, sql } from '~/sql/sql.ts';\nimport { type Assume, mapResultRow } from '~/utils.ts';\n\nconst executeRawConfig = { fullResult: true } satisfies ExecuteOptions;\nconst queryConfig = { arrayMode: true } satisfies ExecuteOptions;\n\nexport class TiDBServerlessPreparedQuery<T extends MySqlPreparedQueryConfig> extends MySqlPreparedQuery<T> {\n\tstatic readonly [entityKind]: string = 'TiDBPreparedQuery';\n\n\tconstructor(\n\t\tprivate client: Tx | Connection,\n\t\tprivate queryString: string,\n\t\tprivate params: unknown[],\n\t\tprivate logger: Logger,\n\t\tprivate fields: SelectedFieldsOrdered | undefined,\n\t\tprivate customResultMapper?: (rows: unknown[][]) => T['execute'],\n\t\t// Keys that were used in $default and the value that was generated for them\n\t\tprivate generatedIds?: Record<string, unknown>[],\n\t\t// Keys that should be returned, it has the column with all properries + key from object\n\t\tprivate returningIds?: SelectedFieldsOrdered,\n\t) {\n\t\tsuper();\n\t}\n\n\tasync execute(placeholderValues: Record<string, unknown> | undefined = {}): Promise<T['execute']> {\n\t\tconst params = fillPlaceholders(this.params, placeholderValues);\n\n\t\tthis.logger.logQuery(this.queryString, params);\n\n\t\tconst { fields, client, queryString, joinsNotNullableMap, customResultMapper, returningIds, generatedIds } = this;\n\t\tif (!fields && !customResultMapper) {\n\t\t\tconst res = await client.execute(queryString, params, executeRawConfig) as FullResult;\n\t\t\tconst insertId = res.lastInsertId ?? 0;\n\t\t\tconst affectedRows = res.rowsAffected ?? 0;\n\t\t\t// for each row, I need to check keys from\n\t\t\tif (returningIds) {\n\t\t\t\tconst returningResponse = [];\n\t\t\t\tlet j = 0;\n\t\t\t\tfor (let i = insertId; i < insertId + affectedRows; i++) {\n\t\t\t\t\tfor (const column of returningIds) {\n\t\t\t\t\t\tconst key = returningIds[0]!.path[0]!;\n\t\t\t\t\t\tif (is(column.field, Column)) {\n\t\t\t\t\t\t\t// @ts-ignore\n\t\t\t\t\t\t\tif (column.field.primary && column.field.autoIncrement) {\n\t\t\t\t\t\t\t\treturningResponse.push({ [key]: i });\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (column.field.defaultFn && generatedIds) {\n\t\t\t\t\t\t\t\t// generatedIds[rowIdx][key]\n\t\t\t\t\t\t\t\treturningResponse.push({ [key]: generatedIds[j]![key] });\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\tj++;\n\t\t\t\t}\n\n\t\t\t\treturn returningResponse;\n\t\t\t}\n\t\t\treturn res;\n\t\t}\n\n\t\tconst rows = await client.execute(queryString, params, queryConfig) as unknown[][];\n\n\t\tif (customResultMapper) {\n\t\t\treturn customResultMapper(rows);\n\t\t}\n\n\t\treturn rows.map((row) => mapResultRow<T['execute']>(fields!, row, joinsNotNullableMap));\n\t}\n\n\toverride iterator(_placeholderValues?: Record<string, unknown>): AsyncGenerator<T['iterator']> {\n\t\tthrow new Error('Streaming is not supported by the TiDB Cloud Serverless driver');\n\t}\n}\n\nexport interface TiDBServerlessSessionOptions {\n\tlogger?: Logger;\n}\n\nexport class TiDBServerlessSession<\n\tTFullSchema extends Record<string, unknown>,\n\tTSchema extends TablesRelationalConfig,\n> extends MySqlSession<TiDBServerlessQueryResultHKT, TiDBServerlessPreparedQueryHKT, TFullSchema, TSchema> {\n\tstatic readonly [entityKind]: string = 'TiDBServerlessSession';\n\n\tprivate logger: Logger;\n\tprivate client: Tx | Connection;\n\n\tconstructor(\n\t\tprivate baseClient: Connection,\n\t\tdialect: MySqlDialect,\n\t\ttx: Tx | undefined,\n\t\tprivate schema: RelationalSchemaConfig<TSchema> | undefined,\n\t\tprivate options: TiDBServerlessSessionOptions = {},\n\t) {\n\t\tsuper(dialect);\n\t\tthis.client = tx ?? baseClient;\n\t\tthis.logger = options.logger ?? new NoopLogger();\n\t}\n\n\tprepareQuery<T extends MySqlPreparedQueryConfig = MySqlPreparedQueryConfig>(\n\t\tquery: Query,\n\t\tfields: SelectedFieldsOrdered | undefined,\n\t\tcustomResultMapper?: (rows: unknown[][]) => T['execute'],\n\t\tgeneratedIds?: Record<string, unknown>[],\n\t\treturningIds?: SelectedFieldsOrdered,\n\t): MySqlPreparedQuery<T> {\n\t\treturn new TiDBServerlessPreparedQuery(\n\t\t\tthis.client,\n\t\t\tquery.sql,\n\t\t\tquery.params,\n\t\t\tthis.logger,\n\t\t\tfields,\n\t\t\tcustomResultMapper,\n\t\t\tgeneratedIds,\n\t\t\treturningIds,\n\t\t);\n\t}\n\n\toverride all<T = unknown>(query: SQL): Promise<T[]> {\n\t\tconst querySql = this.dialect.sqlToQuery(query);\n\t\tthis.logger.logQuery(querySql.sql, querySql.params);\n\t\treturn this.client.execute(querySql.sql, querySql.params) as Promise<T[]>;\n\t}\n\n\toverride async transaction<T>(\n\t\ttransaction: (tx: TiDBServerlessTransaction<TFullSchema, TSchema>) => Promise<T>,\n\t): Promise<T> {\n\t\tconst nativeTx = await this.baseClient.begin();\n\t\ttry {\n\t\t\tconst session = new TiDBServerlessSession(this.baseClient, this.dialect, nativeTx, this.schema, this.options);\n\t\t\tconst tx = new TiDBServerlessTransaction<TFullSchema, TSchema>(\n\t\t\t\tthis.dialect,\n\t\t\t\tsession as MySqlSession<any, any, any, any>,\n\t\t\t\tthis.schema,\n\t\t\t);\n\t\t\tconst result = await transaction(tx);\n\t\t\tawait nativeTx.commit();\n\t\t\treturn result;\n\t\t} catch (err) {\n\t\t\tawait nativeTx.rollback();\n\t\t\tthrow err;\n\t\t}\n\t}\n}\n\nexport class TiDBServerlessTransaction<\n\tTFullSchema extends Record<string, unknown>,\n\tTSchema extends TablesRelationalConfig,\n> extends MySqlTransaction<TiDBServerlessQueryResultHKT, TiDBServerlessPreparedQueryHKT, TFullSchema, TSchema> {\n\tstatic readonly [entityKind]: string = 'TiDBServerlessTransaction';\n\n\tconstructor(\n\t\tdialect: MySqlDialect,\n\t\tsession: MySqlSession,\n\t\tschema: RelationalSchemaConfig<TSchema> | undefined,\n\t\tnestedIndex = 0,\n\t) {\n\t\tsuper(dialect, session, schema, nestedIndex, 'default');\n\t}\n\n\toverride async transaction<T>(\n\t\ttransaction: (tx: TiDBServerlessTransaction<TFullSchema, TSchema>) => Promise<T>,\n\t): Promise<T> {\n\t\tconst savepointName = `sp${this.nestedIndex + 1}`;\n\t\tconst tx = new TiDBServerlessTransaction<TFullSchema, TSchema>(\n\t\t\tthis.dialect,\n\t\t\tthis.session,\n\t\t\tthis.schema,\n\t\t\tthis.nestedIndex + 1,\n\t\t);\n\t\tawait tx.execute(sql.raw(`savepoint ${savepointName}`));\n\t\ttry {\n\t\t\tconst result = await transaction(tx);\n\t\t\tawait tx.execute(sql.raw(`release savepoint ${savepointName}`));\n\t\t\treturn result;\n\t\t} catch (err) {\n\t\t\tawait tx.execute(sql.raw(`rollback to savepoint ${savepointName}`));\n\t\t\tthrow err;\n\t\t}\n\t}\n}\n\nexport interface TiDBServerlessQueryResultHKT extends MySqlQueryResultHKT {\n\ttype: FullResult;\n}\n\nexport interface TiDBServerlessPreparedQueryHKT extends MySqlPreparedQueryHKT {\n\ttype: TiDBServerlessPreparedQuery<Assume<this['config'], MySqlPreparedQueryConfig>>;\n}\n"],"mappings":"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","names":[]}
|