drizzle-orm 1.0.0-beta.8-dbc3565 → 1.0.0-beta.8-e601f80
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/effect-postgres/migrator.cjs +34 -0
- package/effect-postgres/migrator.cjs.map +1 -0
- package/effect-postgres/migrator.d.cts +4 -0
- package/effect-postgres/migrator.d.ts +4 -0
- package/effect-postgres/migrator.js +10 -0
- package/effect-postgres/migrator.js.map +1 -0
- package/effect-postgres/session.cjs +27 -3
- package/effect-postgres/session.cjs.map +1 -1
- package/effect-postgres/session.d.cts +17 -4
- package/effect-postgres/session.d.ts +17 -4
- package/effect-postgres/session.js +26 -3
- package/effect-postgres/session.js.map +1 -1
- package/package.json +13 -1
- package/pg-core/async/session.cjs +2 -2
- package/pg-core/async/session.cjs.map +1 -1
- package/pg-core/async/session.js +2 -2
- package/pg-core/async/session.js.map +1 -1
- package/pg-core/effect/db.cjs +5 -0
- package/pg-core/effect/db.cjs.map +1 -1
- package/pg-core/effect/db.d.cts +6 -3
- package/pg-core/effect/db.d.ts +6 -3
- package/pg-core/effect/db.js +5 -0
- package/pg-core/effect/db.js.map +1 -1
- package/pg-core/effect/session.cjs +93 -2
- package/pg-core/effect/session.cjs.map +1 -1
- package/pg-core/effect/session.d.cts +28 -4
- package/pg-core/effect/session.d.ts +28 -4
- package/pg-core/effect/session.js +95 -3
- package/pg-core/effect/session.js.map +1 -1
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
var migrator_exports = {};
|
|
20
|
+
__export(migrator_exports, {
|
|
21
|
+
migrate: () => migrate
|
|
22
|
+
});
|
|
23
|
+
module.exports = __toCommonJS(migrator_exports);
|
|
24
|
+
var import_migrator = require("../migrator.cjs");
|
|
25
|
+
var import_session = require("../pg-core/effect/session.cjs");
|
|
26
|
+
function migrate(db, config) {
|
|
27
|
+
const migrations = (0, import_migrator.readMigrationFiles)(config);
|
|
28
|
+
return (0, import_session.migrate)(migrations, db.session, config);
|
|
29
|
+
}
|
|
30
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
31
|
+
0 && (module.exports = {
|
|
32
|
+
migrate
|
|
33
|
+
});
|
|
34
|
+
//# sourceMappingURL=migrator.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/effect-postgres/migrator.ts"],"sourcesContent":["import type { MigrationConfig } from '~/migrator.ts';\nimport { readMigrationFiles } from '~/migrator.ts';\nimport { migrate as coreMigrate } from '~/pg-core/effect/session.ts';\nimport type { AnyRelations } from '~/relations.ts';\nimport type { EffectPgDatabase } from './driver.ts';\n\nexport function migrate<TSchema extends Record<string, unknown>, TRelations extends AnyRelations>(\n\tdb: EffectPgDatabase<TSchema, TRelations>,\n\tconfig: MigrationConfig,\n) {\n\tconst migrations = readMigrationFiles(config);\n\treturn coreMigrate(migrations, db.session, config);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,sBAAmC;AACnC,qBAAuC;AAIhC,SAAS,QACf,IACA,QACC;AACD,QAAM,iBAAa,oCAAmB,MAAM;AAC5C,aAAO,eAAAA,SAAY,YAAY,GAAG,SAAS,MAAM;AAClD;","names":["coreMigrate"]}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { MigrationConfig } from "../migrator.cjs";
|
|
2
|
+
import type { AnyRelations } from "../relations.cjs";
|
|
3
|
+
import type { EffectPgDatabase } from "./driver.cjs";
|
|
4
|
+
export declare function migrate<TSchema extends Record<string, unknown>, TRelations extends AnyRelations>(db: EffectPgDatabase<TSchema, TRelations>, config: MigrationConfig): import("effect/Effect").Effect<void | import("../migrator.ts").MigratorInitFailResponse, import("../errors.ts").DrizzleQueryError, never>;
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { MigrationConfig } from "../migrator.js";
|
|
2
|
+
import type { AnyRelations } from "../relations.js";
|
|
3
|
+
import type { EffectPgDatabase } from "./driver.js";
|
|
4
|
+
export declare function migrate<TSchema extends Record<string, unknown>, TRelations extends AnyRelations>(db: EffectPgDatabase<TSchema, TRelations>, config: MigrationConfig): import("effect/Effect").Effect<void | import("../migrator.js").MigratorInitFailResponse, import("../errors.js").DrizzleQueryError, never>;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { readMigrationFiles } from "../migrator.js";
|
|
2
|
+
import { migrate as coreMigrate } from "../pg-core/effect/session.js";
|
|
3
|
+
function migrate(db, config) {
|
|
4
|
+
const migrations = readMigrationFiles(config);
|
|
5
|
+
return coreMigrate(migrations, db.session, config);
|
|
6
|
+
}
|
|
7
|
+
export {
|
|
8
|
+
migrate
|
|
9
|
+
};
|
|
10
|
+
//# sourceMappingURL=migrator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/effect-postgres/migrator.ts"],"sourcesContent":["import type { MigrationConfig } from '~/migrator.ts';\nimport { readMigrationFiles } from '~/migrator.ts';\nimport { migrate as coreMigrate } from '~/pg-core/effect/session.ts';\nimport type { AnyRelations } from '~/relations.ts';\nimport type { EffectPgDatabase } from './driver.ts';\n\nexport function migrate<TSchema extends Record<string, unknown>, TRelations extends AnyRelations>(\n\tdb: EffectPgDatabase<TSchema, TRelations>,\n\tconfig: MigrationConfig,\n) {\n\tconst migrations = readMigrationFiles(config);\n\treturn coreMigrate(migrations, db.session, config);\n}\n"],"mappings":"AACA,SAAS,0BAA0B;AACnC,SAAS,WAAW,mBAAmB;AAIhC,SAAS,QACf,IACA,QACC;AACD,QAAM,aAAa,mBAAmB,MAAM;AAC5C,SAAO,YAAY,YAAY,GAAG,SAAS,MAAM;AAClD;","names":[]}
|
|
@@ -19,7 +19,8 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
|
|
|
19
19
|
var session_exports = {};
|
|
20
20
|
__export(session_exports, {
|
|
21
21
|
EffectPgPreparedQuery: () => EffectPgPreparedQuery,
|
|
22
|
-
EffectPgSession: () => EffectPgSession
|
|
22
|
+
EffectPgSession: () => EffectPgSession,
|
|
23
|
+
EffectPgTransaction: () => EffectPgTransaction
|
|
23
24
|
});
|
|
24
25
|
module.exports = __toCommonJS(session_exports);
|
|
25
26
|
var import_effect = require("effect");
|
|
@@ -102,6 +103,8 @@ class EffectPgSession extends import_session.PgEffectSession {
|
|
|
102
103
|
constructor(client, dialect, relations, schema, options = {}) {
|
|
103
104
|
super(dialect);
|
|
104
105
|
this.client = client;
|
|
106
|
+
this.relations = relations;
|
|
107
|
+
this.schema = schema;
|
|
105
108
|
this.logger = options.logger ?? new import_logger.NoopLogger();
|
|
106
109
|
this.cache = options.cache;
|
|
107
110
|
}
|
|
@@ -120,7 +123,8 @@ class EffectPgSession extends import_session.PgEffectSession {
|
|
|
120
123
|
fields,
|
|
121
124
|
name,
|
|
122
125
|
isResponseInArrayMode,
|
|
123
|
-
customResultMapper
|
|
126
|
+
customResultMapper,
|
|
127
|
+
false
|
|
124
128
|
);
|
|
125
129
|
}
|
|
126
130
|
prepareRelationalQuery(query, fields, name, customResultMapper) {
|
|
@@ -155,10 +159,30 @@ class EffectPgSession extends import_session.PgEffectSession {
|
|
|
155
159
|
false
|
|
156
160
|
).all();
|
|
157
161
|
}
|
|
162
|
+
transaction(transaction) {
|
|
163
|
+
const { dialect, relations, schema } = this;
|
|
164
|
+
const session = this;
|
|
165
|
+
return this.client.withTransaction(import_effect.Effect.gen(function* () {
|
|
166
|
+
const tx = new EffectPgTransaction(
|
|
167
|
+
dialect,
|
|
168
|
+
session,
|
|
169
|
+
relations,
|
|
170
|
+
schema
|
|
171
|
+
);
|
|
172
|
+
return yield* transaction(tx);
|
|
173
|
+
}));
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
class EffectPgTransaction extends import_session.PgEffectTransaction {
|
|
177
|
+
static [import_entity.entityKind] = "EffectPgTransaction";
|
|
178
|
+
transaction(transaction) {
|
|
179
|
+
return this.session.transaction(transaction);
|
|
180
|
+
}
|
|
158
181
|
}
|
|
159
182
|
// Annotate the CommonJS export names for ESM import in node:
|
|
160
183
|
0 && (module.exports = {
|
|
161
184
|
EffectPgPreparedQuery,
|
|
162
|
-
EffectPgSession
|
|
185
|
+
EffectPgSession,
|
|
186
|
+
EffectPgTransaction
|
|
163
187
|
});
|
|
164
188
|
//# sourceMappingURL=session.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/effect-postgres/session.ts"],"sourcesContent":["import type { PgClient } from '@effect/sql-pg/PgClient';\nimport { Effect } from 'effect';\nimport type * as V1 from '~/_relations.ts';\nimport type { EffectCache } from '~/cache/core/cache-effect.ts';\nimport type { WithCacheConfig } from '~/cache/core/types.ts';\nimport { entityKind } from '~/entity.ts';\nimport { DrizzleQueryError } from '~/errors.ts';\nimport { type Logger, NoopLogger } from '~/logger.ts';\nimport type { PgDialect } from '~/pg-core/dialect.ts';\nimport { PgEffectPreparedQuery, PgEffectSession } from '~/pg-core/effect/session.ts';\nimport type { SelectedFieldsOrdered } from '~/pg-core/query-builders/select.types.ts';\nimport type { PgQueryResultHKT, PreparedQueryConfig } from '~/pg-core/session.ts';\nimport type { AnyRelations } from '~/relations.ts';\nimport type { Query, SQL } from '~/sql/sql.ts';\nimport { fillPlaceholders } from '~/sql/sql.ts';\nimport { mapResultRow } from '~/utils.ts';\n\nexport interface EffectPgQueryResultHKT extends PgQueryResultHKT {\n\ttype: readonly object[];\n}\n\nexport class EffectPgPreparedQuery<T extends PreparedQueryConfig, TIsRqbV2 extends boolean = false>\n\textends PgEffectPreparedQuery<T>\n{\n\tstatic override readonly [entityKind]: string = 'EffectPgPreparedQuery';\n\n\tconstructor(\n\t\tprivate client: PgClient,\n\t\tprivate queryString: string,\n\t\tprivate params: unknown[],\n\t\tprivate logger: Logger,\n\t\tcache: EffectCache | undefined,\n\t\tqueryMetadata: {\n\t\t\ttype: 'select' | 'update' | 'delete' | 'insert';\n\t\t\ttables: string[];\n\t\t} | undefined,\n\t\tcacheConfig: WithCacheConfig | undefined,\n\t\tprivate fields: SelectedFieldsOrdered | undefined,\n\t\tname: string | undefined,\n\t\tprivate _isResponseInArrayMode: boolean,\n\t\tprivate customResultMapper?: (\n\t\t\trows: TIsRqbV2 extends true ? Record<string, unknown>[] : unknown[][],\n\t\t) => T['execute'],\n\t\tprivate isRqbV2Query?: TIsRqbV2,\n\t) {\n\t\tsuper({ sql: queryString, params }, cache, queryMetadata, cacheConfig);\n\t}\n\n\texecute(placeholderValues?: Record<string, unknown>): Effect.Effect<T['execute'], DrizzleQueryError> {\n\t\tif (this.isRqbV2Query) return this.executeRqbV2(placeholderValues);\n\n\t\tconst { query, logger, customResultMapper, fields, joinsNotNullableMap, client } = this;\n\t\tconst params = fillPlaceholders(query.params, placeholderValues ?? {});\n\t\tlogger.logQuery(query.sql, params);\n\n\t\tif (!fields && !customResultMapper) {\n\t\t\treturn this.queryWithCache(\n\t\t\t\tquery.sql,\n\t\t\t\tparams,\n\t\t\t\tthis.client.unsafe(query.sql, params as any).withoutTransform,\n\t\t\t);\n\t\t}\n\n\t\treturn this.queryWithCache(\n\t\t\tquery.sql,\n\t\t\tparams,\n\t\t\tclient.unsafe(query.sql, params as any).values.pipe(Effect.andThen(\n\t\t\t\t(rows) => {\n\t\t\t\t\tif (customResultMapper) return (customResultMapper as (rows: unknown[][]) => unknown)(rows as unknown[][]);\n\n\t\t\t\t\treturn rows.map((row) =>\n\t\t\t\t\t\tmapResultRow(\n\t\t\t\t\t\t\tfields!,\n\t\t\t\t\t\t\trow as unknown[],\n\t\t\t\t\t\t\tjoinsNotNullableMap,\n\t\t\t\t\t\t)\n\t\t\t\t\t);\n\t\t\t\t},\n\t\t\t)),\n\t\t);\n\t}\n\n\tprivate executeRqbV2(\n\t\tplaceholderValues?: Record<string, unknown>,\n\t): Effect.Effect<T['execute'], DrizzleQueryError> {\n\t\tconst { query, logger, customResultMapper, client } = this;\n\t\tconst params = fillPlaceholders(query.params, placeholderValues ?? {});\n\n\t\tlogger.logQuery(query.sql, params);\n\t\treturn client.unsafe(query.sql, params as any).withoutTransform.pipe(\n\t\t\tEffect.andThen((v) =>\n\t\t\t\t(customResultMapper as (\n\t\t\t\t\trows: Record<string, unknown>[],\n\t\t\t\t\tmapColumnValue?: (value: unknown) => unknown,\n\t\t\t\t) => unknown)(v as Record<string, unknown>[])\n\t\t\t),\n\t\t).pipe(Effect.catchAll((e) => {\n\t\t\t// eslint-disable-next-line @drizzle-internal/no-instanceof\n\t\t\treturn Effect.fail(new DrizzleQueryError(query.sql, params, e instanceof Error ? e : undefined));\n\t\t}));\n\t}\n\n\toverride all(placeholderValues?: Record<string, unknown>): Effect.Effect<T['all'], DrizzleQueryError, never> {\n\t\tconst { query, logger, client } = this;\n\t\tconst params = fillPlaceholders(query.params, placeholderValues ?? {});\n\n\t\tlogger.logQuery(query.sql, params);\n\n\t\treturn this.queryWithCache(\n\t\t\tquery.sql,\n\t\t\tparams,\n\t\t\tclient.unsafe(query.sql, params as any).withoutTransform,\n\t\t);\n\t}\n\n\t/** @internal */\n\tisResponseInArrayMode(): boolean {\n\t\treturn this._isResponseInArrayMode;\n\t}\n}\n\nexport class EffectPgSession<\n\t_TFullSchema extends Record<string, unknown>,\n\tTRelations extends AnyRelations,\n\tTSchema extends V1.TablesRelationalConfig,\n> extends PgEffectSession {\n\tstatic override readonly [entityKind]: string = 'EffectPgSession';\n\n\tprivate logger: Logger;\n\tprivate cache: EffectCache | undefined;\n\n\tconstructor(\n\t\tprivate client: PgClient,\n\t\tdialect: PgDialect,\n\t\trelations: TRelations,\n\t\tschema: V1.RelationalSchemaConfig<TSchema> | undefined,\n\t\toptions: { logger?: Logger; cache?: EffectCache } = {},\n\t) {\n\t\tsuper(dialect);\n\t\tthis.logger = options.logger ?? new NoopLogger();\n\t\tthis.cache = options.cache;\n\t}\n\n\tprepareQuery<T extends PreparedQueryConfig = PreparedQueryConfig>(\n\t\tquery: Query,\n\t\tfields: SelectedFieldsOrdered | undefined,\n\t\tname: string | undefined,\n\t\tisResponseInArrayMode: boolean,\n\t\tcustomResultMapper?: (rows: unknown[][]) => T['execute'],\n\t\tqueryMetadata?: {\n\t\t\ttype: 'select' | 'update' | 'delete' | 'insert';\n\t\t\ttables: string[];\n\t\t},\n\t\tcacheConfig?: WithCacheConfig,\n\t) {\n\t\treturn new EffectPgPreparedQuery(\n\t\t\tthis.client,\n\t\t\tquery.sql,\n\t\t\tquery.params,\n\t\t\tthis.logger,\n\t\t\tthis.cache,\n\t\t\tqueryMetadata,\n\t\t\tcacheConfig,\n\t\t\tfields,\n\t\t\tname,\n\t\t\tisResponseInArrayMode,\n\t\t\tcustomResultMapper,\n\t\t);\n\t}\n\n\tprepareRelationalQuery<T extends PreparedQueryConfig = PreparedQueryConfig>(\n\t\tquery: Query,\n\t\tfields: SelectedFieldsOrdered | undefined,\n\t\tname: string | undefined,\n\t\tcustomResultMapper?: (rows: Record<string, unknown>[]) => T['execute'],\n\t): EffectPgPreparedQuery<T, true> {\n\t\treturn new EffectPgPreparedQuery<T, true>(\n\t\t\tthis.client,\n\t\t\tquery.sql,\n\t\t\tquery.params,\n\t\t\tthis.logger,\n\t\t\tthis.cache,\n\t\t\tundefined,\n\t\t\tundefined,\n\t\t\tfields,\n\t\t\tname,\n\t\t\tfalse,\n\t\t\tcustomResultMapper,\n\t\t\ttrue,\n\t\t);\n\t}\n\n\toverride execute<T>(query: SQL): Effect.Effect<T, DrizzleQueryError> {\n\t\treturn this.prepareQuery<PreparedQueryConfig & { execute: T }>(\n\t\t\tthis.dialect.sqlToQuery(query),\n\t\t\tundefined,\n\t\t\tundefined,\n\t\t\tfalse,\n\t\t).execute();\n\t}\n\n\toverride all<T>(query: SQL): Effect.Effect<T, DrizzleQueryError> {\n\t\treturn this.prepareQuery<PreparedQueryConfig & { all: T }>(\n\t\t\tthis.dialect.sqlToQuery(query),\n\t\t\tundefined,\n\t\t\tundefined,\n\t\t\tfalse,\n\t\t).all();\n\t}\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../src/effect-postgres/session.ts"],"sourcesContent":["import type { PgClient } from '@effect/sql-pg/PgClient';\nimport { Effect } from 'effect';\nimport type * as V1 from '~/_relations.ts';\nimport type { EffectCache } from '~/cache/core/cache-effect.ts';\nimport type { WithCacheConfig } from '~/cache/core/types.ts';\nimport { entityKind } from '~/entity.ts';\nimport { DrizzleQueryError, type TransactionRollbackError } from '~/errors.ts';\nimport { type Logger, NoopLogger } from '~/logger.ts';\nimport type { PgDialect } from '~/pg-core/dialect.ts';\nimport { PgEffectPreparedQuery, PgEffectSession, PgEffectTransaction } from '~/pg-core/effect/session.ts';\nimport type { SelectedFieldsOrdered } from '~/pg-core/query-builders/select.types.ts';\nimport type { PgQueryResultHKT, PreparedQueryConfig } from '~/pg-core/session.ts';\nimport type { AnyRelations } from '~/relations.ts';\nimport type { Query, SQL } from '~/sql/sql.ts';\nimport { fillPlaceholders } from '~/sql/sql.ts';\nimport { type Assume, mapResultRow } from '~/utils.ts';\n\nexport interface EffectPgQueryResultHKT extends PgQueryResultHKT {\n\ttype: readonly Assume<this['row'], object>[];\n}\n\nexport class EffectPgPreparedQuery<T extends PreparedQueryConfig, TIsRqbV2 extends boolean = false>\n\textends PgEffectPreparedQuery<T>\n{\n\tstatic override readonly [entityKind]: string = 'EffectPgPreparedQuery';\n\n\tconstructor(\n\t\tprivate client: PgClient,\n\t\tprivate queryString: string,\n\t\tprivate params: unknown[],\n\t\tprivate logger: Logger,\n\t\tcache: EffectCache | undefined,\n\t\tqueryMetadata: {\n\t\t\ttype: 'select' | 'update' | 'delete' | 'insert';\n\t\t\ttables: string[];\n\t\t} | undefined,\n\t\tcacheConfig: WithCacheConfig | undefined,\n\t\tprivate fields: SelectedFieldsOrdered | undefined,\n\t\tname: string | undefined,\n\t\tprivate _isResponseInArrayMode: boolean,\n\t\tprivate customResultMapper?: (\n\t\t\trows: TIsRqbV2 extends true ? Record<string, unknown>[] : unknown[][],\n\t\t) => T['execute'],\n\t\tprivate isRqbV2Query?: TIsRqbV2,\n\t) {\n\t\tsuper({ sql: queryString, params }, cache, queryMetadata, cacheConfig);\n\t}\n\n\texecute(placeholderValues?: Record<string, unknown>): Effect.Effect<T['execute'], DrizzleQueryError> {\n\t\tif (this.isRqbV2Query) return this.executeRqbV2(placeholderValues);\n\n\t\tconst { query, logger, customResultMapper, fields, joinsNotNullableMap, client } = this;\n\t\tconst params = fillPlaceholders(query.params, placeholderValues ?? {});\n\t\tlogger.logQuery(query.sql, params);\n\n\t\tif (!fields && !customResultMapper) {\n\t\t\treturn this.queryWithCache(\n\t\t\t\tquery.sql,\n\t\t\t\tparams,\n\t\t\t\tthis.client.unsafe(query.sql, params as any).withoutTransform,\n\t\t\t);\n\t\t}\n\n\t\treturn this.queryWithCache(\n\t\t\tquery.sql,\n\t\t\tparams,\n\t\t\tclient.unsafe(query.sql, params as any).values.pipe(Effect.andThen(\n\t\t\t\t(rows) => {\n\t\t\t\t\tif (customResultMapper) return (customResultMapper as (rows: unknown[][]) => unknown)(rows as unknown[][]);\n\n\t\t\t\t\treturn rows.map((row) =>\n\t\t\t\t\t\tmapResultRow(\n\t\t\t\t\t\t\tfields!,\n\t\t\t\t\t\t\trow as unknown[],\n\t\t\t\t\t\t\tjoinsNotNullableMap,\n\t\t\t\t\t\t)\n\t\t\t\t\t);\n\t\t\t\t},\n\t\t\t)),\n\t\t);\n\t}\n\n\tprivate executeRqbV2(\n\t\tplaceholderValues?: Record<string, unknown>,\n\t): Effect.Effect<T['execute'], DrizzleQueryError> {\n\t\tconst { query, logger, customResultMapper, client } = this;\n\t\tconst params = fillPlaceholders(query.params, placeholderValues ?? {});\n\n\t\tlogger.logQuery(query.sql, params);\n\t\treturn (\n\t\t\tclient.unsafe(query.sql, params as any).withoutTransform.pipe(\n\t\t\t\tEffect.andThen((v) =>\n\t\t\t\t\t(customResultMapper as (\n\t\t\t\t\t\trows: Record<string, unknown>[],\n\t\t\t\t\t\tmapColumnValue?: (value: unknown) => unknown,\n\t\t\t\t\t) => unknown)(v as Record<string, unknown>[])\n\t\t\t\t),\n\t\t\t).pipe(Effect.catchAll((e) => {\n\t\t\t\t// eslint-disable-next-line @drizzle-internal/no-instanceof\n\t\t\t\treturn Effect.fail(new DrizzleQueryError(query.sql, params, e instanceof Error ? e : undefined));\n\t\t\t}))\n\t\t);\n\t}\n\n\toverride all(placeholderValues?: Record<string, unknown>): Effect.Effect<T['all'], DrizzleQueryError, never> {\n\t\tconst { query, logger, client } = this;\n\t\tconst params = fillPlaceholders(query.params, placeholderValues ?? {});\n\n\t\tlogger.logQuery(query.sql, params);\n\n\t\treturn this.queryWithCache(\n\t\t\tquery.sql,\n\t\t\tparams,\n\t\t\tclient.unsafe(query.sql, params as any).withoutTransform,\n\t\t);\n\t}\n\n\t/** @internal */\n\tisResponseInArrayMode(): boolean {\n\t\treturn this._isResponseInArrayMode;\n\t}\n}\n\nexport class EffectPgSession<\n\tTQueryResult extends PgQueryResultHKT,\n\tTFullSchema extends Record<string, unknown>,\n\tTRelations extends AnyRelations,\n\tTSchema extends V1.TablesRelationalConfig,\n> extends PgEffectSession<TQueryResult, TFullSchema, TRelations, TSchema> {\n\tstatic override readonly [entityKind]: string = 'EffectPgSession';\n\n\tprivate logger: Logger;\n\tprivate cache: EffectCache | undefined;\n\n\tconstructor(\n\t\tprivate client: PgClient,\n\t\tdialect: PgDialect,\n\t\tprotected relations: TRelations,\n\t\tprotected schema: V1.RelationalSchemaConfig<TSchema> | undefined,\n\t\toptions: { logger?: Logger; cache?: EffectCache } = {},\n\t) {\n\t\tsuper(dialect);\n\t\tthis.logger = options.logger ?? new NoopLogger();\n\t\tthis.cache = options.cache;\n\t}\n\n\tprepareQuery<T extends PreparedQueryConfig = PreparedQueryConfig>(\n\t\tquery: Query,\n\t\tfields: SelectedFieldsOrdered | undefined,\n\t\tname: string | undefined,\n\t\tisResponseInArrayMode: boolean,\n\t\tcustomResultMapper?: (rows: unknown[][]) => T['execute'],\n\t\tqueryMetadata?: {\n\t\t\ttype: 'select' | 'update' | 'delete' | 'insert';\n\t\t\ttables: string[];\n\t\t},\n\t\tcacheConfig?: WithCacheConfig,\n\t) {\n\t\treturn new EffectPgPreparedQuery(\n\t\t\tthis.client,\n\t\t\tquery.sql,\n\t\t\tquery.params,\n\t\t\tthis.logger,\n\t\t\tthis.cache,\n\t\t\tqueryMetadata,\n\t\t\tcacheConfig,\n\t\t\tfields,\n\t\t\tname,\n\t\t\tisResponseInArrayMode,\n\t\t\tcustomResultMapper,\n\t\t\tfalse,\n\t\t);\n\t}\n\n\tprepareRelationalQuery<T extends PreparedQueryConfig = PreparedQueryConfig>(\n\t\tquery: Query,\n\t\tfields: SelectedFieldsOrdered | undefined,\n\t\tname: string | undefined,\n\t\tcustomResultMapper?: (rows: Record<string, unknown>[]) => T['execute'],\n\t): EffectPgPreparedQuery<T, true> {\n\t\treturn new EffectPgPreparedQuery<T, true>(\n\t\t\tthis.client,\n\t\t\tquery.sql,\n\t\t\tquery.params,\n\t\t\tthis.logger,\n\t\t\tthis.cache,\n\t\t\tundefined,\n\t\t\tundefined,\n\t\t\tfields,\n\t\t\tname,\n\t\t\tfalse,\n\t\t\tcustomResultMapper,\n\t\t\ttrue,\n\t\t);\n\t}\n\n\toverride execute<T>(query: SQL): Effect.Effect<T, DrizzleQueryError> {\n\t\treturn this.prepareQuery<PreparedQueryConfig & { execute: T }>(\n\t\t\tthis.dialect.sqlToQuery(query),\n\t\t\tundefined,\n\t\t\tundefined,\n\t\t\tfalse,\n\t\t).execute();\n\t}\n\n\toverride all<T>(query: SQL): Effect.Effect<T, DrizzleQueryError> {\n\t\treturn this.prepareQuery<PreparedQueryConfig & { all: T }>(\n\t\t\tthis.dialect.sqlToQuery(query),\n\t\t\tundefined,\n\t\t\tundefined,\n\t\t\tfalse,\n\t\t).all();\n\t}\n\n\toverride transaction<T>(\n\t\ttransaction: (\n\t\t\t/** Every query within transaction Effect is completed in transaction, regardless of database instance used\n\t\t\t *\n\t\t\t * `tx` argument is only required for `tx.rollback()`\n\t\t\t */\n\t\t\ttx: EffectPgTransaction<\n\t\t\t\tTQueryResult,\n\t\t\t\tTFullSchema,\n\t\t\t\tTRelations,\n\t\t\t\tTSchema\n\t\t\t>,\n\t\t) => Effect.Effect<T, DrizzleQueryError | TransactionRollbackError, never>,\n\t): Effect.Effect<T, DrizzleQueryError | TransactionRollbackError, never> {\n\t\tconst { dialect, relations, schema } = this;\n\t\tconst session = this;\n\n\t\treturn this.client.withTransaction(Effect.gen(function*() {\n\t\t\tconst tx = new EffectPgTransaction<TQueryResult, TFullSchema, TRelations, TSchema>(\n\t\t\t\tdialect,\n\t\t\t\tsession,\n\t\t\t\trelations,\n\t\t\t\tschema,\n\t\t\t);\n\n\t\t\treturn yield* transaction(tx);\n\t\t}));\n\t}\n}\n\nexport class EffectPgTransaction<\n\tTQueryResult extends PgQueryResultHKT,\n\tTFullSchema extends Record<string, unknown>,\n\tTRelations extends AnyRelations,\n\tTSchema extends V1.TablesRelationalConfig,\n> extends PgEffectTransaction<TQueryResult, TFullSchema, TRelations, TSchema> {\n\tstatic override readonly [entityKind]: string = 'EffectPgTransaction';\n\n\toverride transaction<T>(\n\t\ttransaction: (\n\t\t\ttx: PgEffectTransaction<TQueryResult, TFullSchema, TRelations, TSchema>,\n\t\t) => Effect.Effect<T, DrizzleQueryError | TransactionRollbackError, never>,\n\t): Effect.Effect<T, DrizzleQueryError | TransactionRollbackError, never> {\n\t\treturn this.session.transaction(transaction);\n\t}\n}\n"],"mappings":"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","names":[]}
|
|
@@ -4,16 +4,17 @@ import type * as V1 from "../_relations.cjs";
|
|
|
4
4
|
import type { EffectCache } from "../cache/core/cache-effect.cjs";
|
|
5
5
|
import type { WithCacheConfig } from "../cache/core/types.cjs";
|
|
6
6
|
import { entityKind } from "../entity.cjs";
|
|
7
|
-
import { DrizzleQueryError } from "../errors.cjs";
|
|
7
|
+
import { DrizzleQueryError, type TransactionRollbackError } from "../errors.cjs";
|
|
8
8
|
import { type Logger } from "../logger.cjs";
|
|
9
9
|
import type { PgDialect } from "../pg-core/dialect.cjs";
|
|
10
|
-
import { PgEffectPreparedQuery, PgEffectSession } from "../pg-core/effect/session.cjs";
|
|
10
|
+
import { PgEffectPreparedQuery, PgEffectSession, PgEffectTransaction } from "../pg-core/effect/session.cjs";
|
|
11
11
|
import type { SelectedFieldsOrdered } from "../pg-core/query-builders/select.types.cjs";
|
|
12
12
|
import type { PgQueryResultHKT, PreparedQueryConfig } from "../pg-core/session.cjs";
|
|
13
13
|
import type { AnyRelations } from "../relations.cjs";
|
|
14
14
|
import type { Query, SQL } from "../sql/sql.cjs";
|
|
15
|
+
import { type Assume } from "../utils.cjs";
|
|
15
16
|
export interface EffectPgQueryResultHKT extends PgQueryResultHKT {
|
|
16
|
-
type: readonly object[];
|
|
17
|
+
type: readonly Assume<this['row'], object>[];
|
|
17
18
|
}
|
|
18
19
|
export declare class EffectPgPreparedQuery<T extends PreparedQueryConfig, TIsRqbV2 extends boolean = false> extends PgEffectPreparedQuery<T> {
|
|
19
20
|
private client;
|
|
@@ -33,8 +34,10 @@ export declare class EffectPgPreparedQuery<T extends PreparedQueryConfig, TIsRqb
|
|
|
33
34
|
private executeRqbV2;
|
|
34
35
|
all(placeholderValues?: Record<string, unknown>): Effect.Effect<T['all'], DrizzleQueryError, never>;
|
|
35
36
|
}
|
|
36
|
-
export declare class EffectPgSession<
|
|
37
|
+
export declare class EffectPgSession<TQueryResult extends PgQueryResultHKT, TFullSchema extends Record<string, unknown>, TRelations extends AnyRelations, TSchema extends V1.TablesRelationalConfig> extends PgEffectSession<TQueryResult, TFullSchema, TRelations, TSchema> {
|
|
37
38
|
private client;
|
|
39
|
+
protected relations: TRelations;
|
|
40
|
+
protected schema: V1.RelationalSchemaConfig<TSchema> | undefined;
|
|
38
41
|
static readonly [entityKind]: string;
|
|
39
42
|
private logger;
|
|
40
43
|
private cache;
|
|
@@ -49,4 +52,14 @@ export declare class EffectPgSession<_TFullSchema extends Record<string, unknown
|
|
|
49
52
|
prepareRelationalQuery<T extends PreparedQueryConfig = PreparedQueryConfig>(query: Query, fields: SelectedFieldsOrdered | undefined, name: string | undefined, customResultMapper?: (rows: Record<string, unknown>[]) => T['execute']): EffectPgPreparedQuery<T, true>;
|
|
50
53
|
execute<T>(query: SQL): Effect.Effect<T, DrizzleQueryError>;
|
|
51
54
|
all<T>(query: SQL): Effect.Effect<T, DrizzleQueryError>;
|
|
55
|
+
transaction<T>(transaction: (
|
|
56
|
+
/** Every query within transaction Effect is completed in transaction, regardless of database instance used
|
|
57
|
+
*
|
|
58
|
+
* `tx` argument is only required for `tx.rollback()`
|
|
59
|
+
*/
|
|
60
|
+
tx: EffectPgTransaction<TQueryResult, TFullSchema, TRelations, TSchema>) => Effect.Effect<T, DrizzleQueryError | TransactionRollbackError, never>): Effect.Effect<T, DrizzleQueryError | TransactionRollbackError, never>;
|
|
61
|
+
}
|
|
62
|
+
export declare class EffectPgTransaction<TQueryResult extends PgQueryResultHKT, TFullSchema extends Record<string, unknown>, TRelations extends AnyRelations, TSchema extends V1.TablesRelationalConfig> extends PgEffectTransaction<TQueryResult, TFullSchema, TRelations, TSchema> {
|
|
63
|
+
static readonly [entityKind]: string;
|
|
64
|
+
transaction<T>(transaction: (tx: PgEffectTransaction<TQueryResult, TFullSchema, TRelations, TSchema>) => Effect.Effect<T, DrizzleQueryError | TransactionRollbackError, never>): Effect.Effect<T, DrizzleQueryError | TransactionRollbackError, never>;
|
|
52
65
|
}
|
|
@@ -4,16 +4,17 @@ import type * as V1 from "../_relations.js";
|
|
|
4
4
|
import type { EffectCache } from "../cache/core/cache-effect.js";
|
|
5
5
|
import type { WithCacheConfig } from "../cache/core/types.js";
|
|
6
6
|
import { entityKind } from "../entity.js";
|
|
7
|
-
import { DrizzleQueryError } from "../errors.js";
|
|
7
|
+
import { DrizzleQueryError, type TransactionRollbackError } from "../errors.js";
|
|
8
8
|
import { type Logger } from "../logger.js";
|
|
9
9
|
import type { PgDialect } from "../pg-core/dialect.js";
|
|
10
|
-
import { PgEffectPreparedQuery, PgEffectSession } from "../pg-core/effect/session.js";
|
|
10
|
+
import { PgEffectPreparedQuery, PgEffectSession, PgEffectTransaction } from "../pg-core/effect/session.js";
|
|
11
11
|
import type { SelectedFieldsOrdered } from "../pg-core/query-builders/select.types.js";
|
|
12
12
|
import type { PgQueryResultHKT, PreparedQueryConfig } from "../pg-core/session.js";
|
|
13
13
|
import type { AnyRelations } from "../relations.js";
|
|
14
14
|
import type { Query, SQL } from "../sql/sql.js";
|
|
15
|
+
import { type Assume } from "../utils.js";
|
|
15
16
|
export interface EffectPgQueryResultHKT extends PgQueryResultHKT {
|
|
16
|
-
type: readonly object[];
|
|
17
|
+
type: readonly Assume<this['row'], object>[];
|
|
17
18
|
}
|
|
18
19
|
export declare class EffectPgPreparedQuery<T extends PreparedQueryConfig, TIsRqbV2 extends boolean = false> extends PgEffectPreparedQuery<T> {
|
|
19
20
|
private client;
|
|
@@ -33,8 +34,10 @@ export declare class EffectPgPreparedQuery<T extends PreparedQueryConfig, TIsRqb
|
|
|
33
34
|
private executeRqbV2;
|
|
34
35
|
all(placeholderValues?: Record<string, unknown>): Effect.Effect<T['all'], DrizzleQueryError, never>;
|
|
35
36
|
}
|
|
36
|
-
export declare class EffectPgSession<
|
|
37
|
+
export declare class EffectPgSession<TQueryResult extends PgQueryResultHKT, TFullSchema extends Record<string, unknown>, TRelations extends AnyRelations, TSchema extends V1.TablesRelationalConfig> extends PgEffectSession<TQueryResult, TFullSchema, TRelations, TSchema> {
|
|
37
38
|
private client;
|
|
39
|
+
protected relations: TRelations;
|
|
40
|
+
protected schema: V1.RelationalSchemaConfig<TSchema> | undefined;
|
|
38
41
|
static readonly [entityKind]: string;
|
|
39
42
|
private logger;
|
|
40
43
|
private cache;
|
|
@@ -49,4 +52,14 @@ export declare class EffectPgSession<_TFullSchema extends Record<string, unknown
|
|
|
49
52
|
prepareRelationalQuery<T extends PreparedQueryConfig = PreparedQueryConfig>(query: Query, fields: SelectedFieldsOrdered | undefined, name: string | undefined, customResultMapper?: (rows: Record<string, unknown>[]) => T['execute']): EffectPgPreparedQuery<T, true>;
|
|
50
53
|
execute<T>(query: SQL): Effect.Effect<T, DrizzleQueryError>;
|
|
51
54
|
all<T>(query: SQL): Effect.Effect<T, DrizzleQueryError>;
|
|
55
|
+
transaction<T>(transaction: (
|
|
56
|
+
/** Every query within transaction Effect is completed in transaction, regardless of database instance used
|
|
57
|
+
*
|
|
58
|
+
* `tx` argument is only required for `tx.rollback()`
|
|
59
|
+
*/
|
|
60
|
+
tx: EffectPgTransaction<TQueryResult, TFullSchema, TRelations, TSchema>) => Effect.Effect<T, DrizzleQueryError | TransactionRollbackError, never>): Effect.Effect<T, DrizzleQueryError | TransactionRollbackError, never>;
|
|
61
|
+
}
|
|
62
|
+
export declare class EffectPgTransaction<TQueryResult extends PgQueryResultHKT, TFullSchema extends Record<string, unknown>, TRelations extends AnyRelations, TSchema extends V1.TablesRelationalConfig> extends PgEffectTransaction<TQueryResult, TFullSchema, TRelations, TSchema> {
|
|
63
|
+
static readonly [entityKind]: string;
|
|
64
|
+
transaction<T>(transaction: (tx: PgEffectTransaction<TQueryResult, TFullSchema, TRelations, TSchema>) => Effect.Effect<T, DrizzleQueryError | TransactionRollbackError, never>): Effect.Effect<T, DrizzleQueryError | TransactionRollbackError, never>;
|
|
52
65
|
}
|
|
@@ -2,7 +2,7 @@ import { Effect } from "effect";
|
|
|
2
2
|
import { entityKind } from "../entity.js";
|
|
3
3
|
import { DrizzleQueryError } from "../errors.js";
|
|
4
4
|
import { NoopLogger } from "../logger.js";
|
|
5
|
-
import { PgEffectPreparedQuery, PgEffectSession } from "../pg-core/effect/session.js";
|
|
5
|
+
import { PgEffectPreparedQuery, PgEffectSession, PgEffectTransaction } from "../pg-core/effect/session.js";
|
|
6
6
|
import { fillPlaceholders } from "../sql/sql.js";
|
|
7
7
|
import { mapResultRow } from "../utils.js";
|
|
8
8
|
class EffectPgPreparedQuery extends PgEffectPreparedQuery {
|
|
@@ -78,6 +78,8 @@ class EffectPgSession extends PgEffectSession {
|
|
|
78
78
|
constructor(client, dialect, relations, schema, options = {}) {
|
|
79
79
|
super(dialect);
|
|
80
80
|
this.client = client;
|
|
81
|
+
this.relations = relations;
|
|
82
|
+
this.schema = schema;
|
|
81
83
|
this.logger = options.logger ?? new NoopLogger();
|
|
82
84
|
this.cache = options.cache;
|
|
83
85
|
}
|
|
@@ -96,7 +98,8 @@ class EffectPgSession extends PgEffectSession {
|
|
|
96
98
|
fields,
|
|
97
99
|
name,
|
|
98
100
|
isResponseInArrayMode,
|
|
99
|
-
customResultMapper
|
|
101
|
+
customResultMapper,
|
|
102
|
+
false
|
|
100
103
|
);
|
|
101
104
|
}
|
|
102
105
|
prepareRelationalQuery(query, fields, name, customResultMapper) {
|
|
@@ -131,9 +134,29 @@ class EffectPgSession extends PgEffectSession {
|
|
|
131
134
|
false
|
|
132
135
|
).all();
|
|
133
136
|
}
|
|
137
|
+
transaction(transaction) {
|
|
138
|
+
const { dialect, relations, schema } = this;
|
|
139
|
+
const session = this;
|
|
140
|
+
return this.client.withTransaction(Effect.gen(function* () {
|
|
141
|
+
const tx = new EffectPgTransaction(
|
|
142
|
+
dialect,
|
|
143
|
+
session,
|
|
144
|
+
relations,
|
|
145
|
+
schema
|
|
146
|
+
);
|
|
147
|
+
return yield* transaction(tx);
|
|
148
|
+
}));
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
class EffectPgTransaction extends PgEffectTransaction {
|
|
152
|
+
static [entityKind] = "EffectPgTransaction";
|
|
153
|
+
transaction(transaction) {
|
|
154
|
+
return this.session.transaction(transaction);
|
|
155
|
+
}
|
|
134
156
|
}
|
|
135
157
|
export {
|
|
136
158
|
EffectPgPreparedQuery,
|
|
137
|
-
EffectPgSession
|
|
159
|
+
EffectPgSession,
|
|
160
|
+
EffectPgTransaction
|
|
138
161
|
};
|
|
139
162
|
//# sourceMappingURL=session.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/effect-postgres/session.ts"],"sourcesContent":["import type { PgClient } from '@effect/sql-pg/PgClient';\nimport { Effect } from 'effect';\nimport type * as V1 from '~/_relations.ts';\nimport type { EffectCache } from '~/cache/core/cache-effect.ts';\nimport type { WithCacheConfig } from '~/cache/core/types.ts';\nimport { entityKind } from '~/entity.ts';\nimport { DrizzleQueryError } from '~/errors.ts';\nimport { type Logger, NoopLogger } from '~/logger.ts';\nimport type { PgDialect } from '~/pg-core/dialect.ts';\nimport { PgEffectPreparedQuery, PgEffectSession } from '~/pg-core/effect/session.ts';\nimport type { SelectedFieldsOrdered } from '~/pg-core/query-builders/select.types.ts';\nimport type { PgQueryResultHKT, PreparedQueryConfig } from '~/pg-core/session.ts';\nimport type { AnyRelations } from '~/relations.ts';\nimport type { Query, SQL } from '~/sql/sql.ts';\nimport { fillPlaceholders } from '~/sql/sql.ts';\nimport { mapResultRow } from '~/utils.ts';\n\nexport interface EffectPgQueryResultHKT extends PgQueryResultHKT {\n\ttype: readonly object[];\n}\n\nexport class EffectPgPreparedQuery<T extends PreparedQueryConfig, TIsRqbV2 extends boolean = false>\n\textends PgEffectPreparedQuery<T>\n{\n\tstatic override readonly [entityKind]: string = 'EffectPgPreparedQuery';\n\n\tconstructor(\n\t\tprivate client: PgClient,\n\t\tprivate queryString: string,\n\t\tprivate params: unknown[],\n\t\tprivate logger: Logger,\n\t\tcache: EffectCache | undefined,\n\t\tqueryMetadata: {\n\t\t\ttype: 'select' | 'update' | 'delete' | 'insert';\n\t\t\ttables: string[];\n\t\t} | undefined,\n\t\tcacheConfig: WithCacheConfig | undefined,\n\t\tprivate fields: SelectedFieldsOrdered | undefined,\n\t\tname: string | undefined,\n\t\tprivate _isResponseInArrayMode: boolean,\n\t\tprivate customResultMapper?: (\n\t\t\trows: TIsRqbV2 extends true ? Record<string, unknown>[] : unknown[][],\n\t\t) => T['execute'],\n\t\tprivate isRqbV2Query?: TIsRqbV2,\n\t) {\n\t\tsuper({ sql: queryString, params }, cache, queryMetadata, cacheConfig);\n\t}\n\n\texecute(placeholderValues?: Record<string, unknown>): Effect.Effect<T['execute'], DrizzleQueryError> {\n\t\tif (this.isRqbV2Query) return this.executeRqbV2(placeholderValues);\n\n\t\tconst { query, logger, customResultMapper, fields, joinsNotNullableMap, client } = this;\n\t\tconst params = fillPlaceholders(query.params, placeholderValues ?? {});\n\t\tlogger.logQuery(query.sql, params);\n\n\t\tif (!fields && !customResultMapper) {\n\t\t\treturn this.queryWithCache(\n\t\t\t\tquery.sql,\n\t\t\t\tparams,\n\t\t\t\tthis.client.unsafe(query.sql, params as any).withoutTransform,\n\t\t\t);\n\t\t}\n\n\t\treturn this.queryWithCache(\n\t\t\tquery.sql,\n\t\t\tparams,\n\t\t\tclient.unsafe(query.sql, params as any).values.pipe(Effect.andThen(\n\t\t\t\t(rows) => {\n\t\t\t\t\tif (customResultMapper) return (customResultMapper as (rows: unknown[][]) => unknown)(rows as unknown[][]);\n\n\t\t\t\t\treturn rows.map((row) =>\n\t\t\t\t\t\tmapResultRow(\n\t\t\t\t\t\t\tfields!,\n\t\t\t\t\t\t\trow as unknown[],\n\t\t\t\t\t\t\tjoinsNotNullableMap,\n\t\t\t\t\t\t)\n\t\t\t\t\t);\n\t\t\t\t},\n\t\t\t)),\n\t\t);\n\t}\n\n\tprivate executeRqbV2(\n\t\tplaceholderValues?: Record<string, unknown>,\n\t): Effect.Effect<T['execute'], DrizzleQueryError> {\n\t\tconst { query, logger, customResultMapper, client } = this;\n\t\tconst params = fillPlaceholders(query.params, placeholderValues ?? {});\n\n\t\tlogger.logQuery(query.sql, params);\n\t\treturn client.unsafe(query.sql, params as any).withoutTransform.pipe(\n\t\t\tEffect.andThen((v) =>\n\t\t\t\t(customResultMapper as (\n\t\t\t\t\trows: Record<string, unknown>[],\n\t\t\t\t\tmapColumnValue?: (value: unknown) => unknown,\n\t\t\t\t) => unknown)(v as Record<string, unknown>[])\n\t\t\t),\n\t\t).pipe(Effect.catchAll((e) => {\n\t\t\t// eslint-disable-next-line @drizzle-internal/no-instanceof\n\t\t\treturn Effect.fail(new DrizzleQueryError(query.sql, params, e instanceof Error ? e : undefined));\n\t\t}));\n\t}\n\n\toverride all(placeholderValues?: Record<string, unknown>): Effect.Effect<T['all'], DrizzleQueryError, never> {\n\t\tconst { query, logger, client } = this;\n\t\tconst params = fillPlaceholders(query.params, placeholderValues ?? {});\n\n\t\tlogger.logQuery(query.sql, params);\n\n\t\treturn this.queryWithCache(\n\t\t\tquery.sql,\n\t\t\tparams,\n\t\t\tclient.unsafe(query.sql, params as any).withoutTransform,\n\t\t);\n\t}\n\n\t/** @internal */\n\tisResponseInArrayMode(): boolean {\n\t\treturn this._isResponseInArrayMode;\n\t}\n}\n\nexport class EffectPgSession<\n\t_TFullSchema extends Record<string, unknown>,\n\tTRelations extends AnyRelations,\n\tTSchema extends V1.TablesRelationalConfig,\n> extends PgEffectSession {\n\tstatic override readonly [entityKind]: string = 'EffectPgSession';\n\n\tprivate logger: Logger;\n\tprivate cache: EffectCache | undefined;\n\n\tconstructor(\n\t\tprivate client: PgClient,\n\t\tdialect: PgDialect,\n\t\trelations: TRelations,\n\t\tschema: V1.RelationalSchemaConfig<TSchema> | undefined,\n\t\toptions: { logger?: Logger; cache?: EffectCache } = {},\n\t) {\n\t\tsuper(dialect);\n\t\tthis.logger = options.logger ?? new NoopLogger();\n\t\tthis.cache = options.cache;\n\t}\n\n\tprepareQuery<T extends PreparedQueryConfig = PreparedQueryConfig>(\n\t\tquery: Query,\n\t\tfields: SelectedFieldsOrdered | undefined,\n\t\tname: string | undefined,\n\t\tisResponseInArrayMode: boolean,\n\t\tcustomResultMapper?: (rows: unknown[][]) => T['execute'],\n\t\tqueryMetadata?: {\n\t\t\ttype: 'select' | 'update' | 'delete' | 'insert';\n\t\t\ttables: string[];\n\t\t},\n\t\tcacheConfig?: WithCacheConfig,\n\t) {\n\t\treturn new EffectPgPreparedQuery(\n\t\t\tthis.client,\n\t\t\tquery.sql,\n\t\t\tquery.params,\n\t\t\tthis.logger,\n\t\t\tthis.cache,\n\t\t\tqueryMetadata,\n\t\t\tcacheConfig,\n\t\t\tfields,\n\t\t\tname,\n\t\t\tisResponseInArrayMode,\n\t\t\tcustomResultMapper,\n\t\t);\n\t}\n\n\tprepareRelationalQuery<T extends PreparedQueryConfig = PreparedQueryConfig>(\n\t\tquery: Query,\n\t\tfields: SelectedFieldsOrdered | undefined,\n\t\tname: string | undefined,\n\t\tcustomResultMapper?: (rows: Record<string, unknown>[]) => T['execute'],\n\t): EffectPgPreparedQuery<T, true> {\n\t\treturn new EffectPgPreparedQuery<T, true>(\n\t\t\tthis.client,\n\t\t\tquery.sql,\n\t\t\tquery.params,\n\t\t\tthis.logger,\n\t\t\tthis.cache,\n\t\t\tundefined,\n\t\t\tundefined,\n\t\t\tfields,\n\t\t\tname,\n\t\t\tfalse,\n\t\t\tcustomResultMapper,\n\t\t\ttrue,\n\t\t);\n\t}\n\n\toverride execute<T>(query: SQL): Effect.Effect<T, DrizzleQueryError> {\n\t\treturn this.prepareQuery<PreparedQueryConfig & { execute: T }>(\n\t\t\tthis.dialect.sqlToQuery(query),\n\t\t\tundefined,\n\t\t\tundefined,\n\t\t\tfalse,\n\t\t).execute();\n\t}\n\n\toverride all<T>(query: SQL): Effect.Effect<T, DrizzleQueryError> {\n\t\treturn this.prepareQuery<PreparedQueryConfig & { all: T }>(\n\t\t\tthis.dialect.sqlToQuery(query),\n\t\t\tundefined,\n\t\t\tundefined,\n\t\t\tfalse,\n\t\t).all();\n\t}\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../src/effect-postgres/session.ts"],"sourcesContent":["import type { PgClient } from '@effect/sql-pg/PgClient';\nimport { Effect } from 'effect';\nimport type * as V1 from '~/_relations.ts';\nimport type { EffectCache } from '~/cache/core/cache-effect.ts';\nimport type { WithCacheConfig } from '~/cache/core/types.ts';\nimport { entityKind } from '~/entity.ts';\nimport { DrizzleQueryError, type TransactionRollbackError } from '~/errors.ts';\nimport { type Logger, NoopLogger } from '~/logger.ts';\nimport type { PgDialect } from '~/pg-core/dialect.ts';\nimport { PgEffectPreparedQuery, PgEffectSession, PgEffectTransaction } from '~/pg-core/effect/session.ts';\nimport type { SelectedFieldsOrdered } from '~/pg-core/query-builders/select.types.ts';\nimport type { PgQueryResultHKT, PreparedQueryConfig } from '~/pg-core/session.ts';\nimport type { AnyRelations } from '~/relations.ts';\nimport type { Query, SQL } from '~/sql/sql.ts';\nimport { fillPlaceholders } from '~/sql/sql.ts';\nimport { type Assume, mapResultRow } from '~/utils.ts';\n\nexport interface EffectPgQueryResultHKT extends PgQueryResultHKT {\n\ttype: readonly Assume<this['row'], object>[];\n}\n\nexport class EffectPgPreparedQuery<T extends PreparedQueryConfig, TIsRqbV2 extends boolean = false>\n\textends PgEffectPreparedQuery<T>\n{\n\tstatic override readonly [entityKind]: string = 'EffectPgPreparedQuery';\n\n\tconstructor(\n\t\tprivate client: PgClient,\n\t\tprivate queryString: string,\n\t\tprivate params: unknown[],\n\t\tprivate logger: Logger,\n\t\tcache: EffectCache | undefined,\n\t\tqueryMetadata: {\n\t\t\ttype: 'select' | 'update' | 'delete' | 'insert';\n\t\t\ttables: string[];\n\t\t} | undefined,\n\t\tcacheConfig: WithCacheConfig | undefined,\n\t\tprivate fields: SelectedFieldsOrdered | undefined,\n\t\tname: string | undefined,\n\t\tprivate _isResponseInArrayMode: boolean,\n\t\tprivate customResultMapper?: (\n\t\t\trows: TIsRqbV2 extends true ? Record<string, unknown>[] : unknown[][],\n\t\t) => T['execute'],\n\t\tprivate isRqbV2Query?: TIsRqbV2,\n\t) {\n\t\tsuper({ sql: queryString, params }, cache, queryMetadata, cacheConfig);\n\t}\n\n\texecute(placeholderValues?: Record<string, unknown>): Effect.Effect<T['execute'], DrizzleQueryError> {\n\t\tif (this.isRqbV2Query) return this.executeRqbV2(placeholderValues);\n\n\t\tconst { query, logger, customResultMapper, fields, joinsNotNullableMap, client } = this;\n\t\tconst params = fillPlaceholders(query.params, placeholderValues ?? {});\n\t\tlogger.logQuery(query.sql, params);\n\n\t\tif (!fields && !customResultMapper) {\n\t\t\treturn this.queryWithCache(\n\t\t\t\tquery.sql,\n\t\t\t\tparams,\n\t\t\t\tthis.client.unsafe(query.sql, params as any).withoutTransform,\n\t\t\t);\n\t\t}\n\n\t\treturn this.queryWithCache(\n\t\t\tquery.sql,\n\t\t\tparams,\n\t\t\tclient.unsafe(query.sql, params as any).values.pipe(Effect.andThen(\n\t\t\t\t(rows) => {\n\t\t\t\t\tif (customResultMapper) return (customResultMapper as (rows: unknown[][]) => unknown)(rows as unknown[][]);\n\n\t\t\t\t\treturn rows.map((row) =>\n\t\t\t\t\t\tmapResultRow(\n\t\t\t\t\t\t\tfields!,\n\t\t\t\t\t\t\trow as unknown[],\n\t\t\t\t\t\t\tjoinsNotNullableMap,\n\t\t\t\t\t\t)\n\t\t\t\t\t);\n\t\t\t\t},\n\t\t\t)),\n\t\t);\n\t}\n\n\tprivate executeRqbV2(\n\t\tplaceholderValues?: Record<string, unknown>,\n\t): Effect.Effect<T['execute'], DrizzleQueryError> {\n\t\tconst { query, logger, customResultMapper, client } = this;\n\t\tconst params = fillPlaceholders(query.params, placeholderValues ?? {});\n\n\t\tlogger.logQuery(query.sql, params);\n\t\treturn (\n\t\t\tclient.unsafe(query.sql, params as any).withoutTransform.pipe(\n\t\t\t\tEffect.andThen((v) =>\n\t\t\t\t\t(customResultMapper as (\n\t\t\t\t\t\trows: Record<string, unknown>[],\n\t\t\t\t\t\tmapColumnValue?: (value: unknown) => unknown,\n\t\t\t\t\t) => unknown)(v as Record<string, unknown>[])\n\t\t\t\t),\n\t\t\t).pipe(Effect.catchAll((e) => {\n\t\t\t\t// eslint-disable-next-line @drizzle-internal/no-instanceof\n\t\t\t\treturn Effect.fail(new DrizzleQueryError(query.sql, params, e instanceof Error ? e : undefined));\n\t\t\t}))\n\t\t);\n\t}\n\n\toverride all(placeholderValues?: Record<string, unknown>): Effect.Effect<T['all'], DrizzleQueryError, never> {\n\t\tconst { query, logger, client } = this;\n\t\tconst params = fillPlaceholders(query.params, placeholderValues ?? {});\n\n\t\tlogger.logQuery(query.sql, params);\n\n\t\treturn this.queryWithCache(\n\t\t\tquery.sql,\n\t\t\tparams,\n\t\t\tclient.unsafe(query.sql, params as any).withoutTransform,\n\t\t);\n\t}\n\n\t/** @internal */\n\tisResponseInArrayMode(): boolean {\n\t\treturn this._isResponseInArrayMode;\n\t}\n}\n\nexport class EffectPgSession<\n\tTQueryResult extends PgQueryResultHKT,\n\tTFullSchema extends Record<string, unknown>,\n\tTRelations extends AnyRelations,\n\tTSchema extends V1.TablesRelationalConfig,\n> extends PgEffectSession<TQueryResult, TFullSchema, TRelations, TSchema> {\n\tstatic override readonly [entityKind]: string = 'EffectPgSession';\n\n\tprivate logger: Logger;\n\tprivate cache: EffectCache | undefined;\n\n\tconstructor(\n\t\tprivate client: PgClient,\n\t\tdialect: PgDialect,\n\t\tprotected relations: TRelations,\n\t\tprotected schema: V1.RelationalSchemaConfig<TSchema> | undefined,\n\t\toptions: { logger?: Logger; cache?: EffectCache } = {},\n\t) {\n\t\tsuper(dialect);\n\t\tthis.logger = options.logger ?? new NoopLogger();\n\t\tthis.cache = options.cache;\n\t}\n\n\tprepareQuery<T extends PreparedQueryConfig = PreparedQueryConfig>(\n\t\tquery: Query,\n\t\tfields: SelectedFieldsOrdered | undefined,\n\t\tname: string | undefined,\n\t\tisResponseInArrayMode: boolean,\n\t\tcustomResultMapper?: (rows: unknown[][]) => T['execute'],\n\t\tqueryMetadata?: {\n\t\t\ttype: 'select' | 'update' | 'delete' | 'insert';\n\t\t\ttables: string[];\n\t\t},\n\t\tcacheConfig?: WithCacheConfig,\n\t) {\n\t\treturn new EffectPgPreparedQuery(\n\t\t\tthis.client,\n\t\t\tquery.sql,\n\t\t\tquery.params,\n\t\t\tthis.logger,\n\t\t\tthis.cache,\n\t\t\tqueryMetadata,\n\t\t\tcacheConfig,\n\t\t\tfields,\n\t\t\tname,\n\t\t\tisResponseInArrayMode,\n\t\t\tcustomResultMapper,\n\t\t\tfalse,\n\t\t);\n\t}\n\n\tprepareRelationalQuery<T extends PreparedQueryConfig = PreparedQueryConfig>(\n\t\tquery: Query,\n\t\tfields: SelectedFieldsOrdered | undefined,\n\t\tname: string | undefined,\n\t\tcustomResultMapper?: (rows: Record<string, unknown>[]) => T['execute'],\n\t): EffectPgPreparedQuery<T, true> {\n\t\treturn new EffectPgPreparedQuery<T, true>(\n\t\t\tthis.client,\n\t\t\tquery.sql,\n\t\t\tquery.params,\n\t\t\tthis.logger,\n\t\t\tthis.cache,\n\t\t\tundefined,\n\t\t\tundefined,\n\t\t\tfields,\n\t\t\tname,\n\t\t\tfalse,\n\t\t\tcustomResultMapper,\n\t\t\ttrue,\n\t\t);\n\t}\n\n\toverride execute<T>(query: SQL): Effect.Effect<T, DrizzleQueryError> {\n\t\treturn this.prepareQuery<PreparedQueryConfig & { execute: T }>(\n\t\t\tthis.dialect.sqlToQuery(query),\n\t\t\tundefined,\n\t\t\tundefined,\n\t\t\tfalse,\n\t\t).execute();\n\t}\n\n\toverride all<T>(query: SQL): Effect.Effect<T, DrizzleQueryError> {\n\t\treturn this.prepareQuery<PreparedQueryConfig & { all: T }>(\n\t\t\tthis.dialect.sqlToQuery(query),\n\t\t\tundefined,\n\t\t\tundefined,\n\t\t\tfalse,\n\t\t).all();\n\t}\n\n\toverride transaction<T>(\n\t\ttransaction: (\n\t\t\t/** Every query within transaction Effect is completed in transaction, regardless of database instance used\n\t\t\t *\n\t\t\t * `tx` argument is only required for `tx.rollback()`\n\t\t\t */\n\t\t\ttx: EffectPgTransaction<\n\t\t\t\tTQueryResult,\n\t\t\t\tTFullSchema,\n\t\t\t\tTRelations,\n\t\t\t\tTSchema\n\t\t\t>,\n\t\t) => Effect.Effect<T, DrizzleQueryError | TransactionRollbackError, never>,\n\t): Effect.Effect<T, DrizzleQueryError | TransactionRollbackError, never> {\n\t\tconst { dialect, relations, schema } = this;\n\t\tconst session = this;\n\n\t\treturn this.client.withTransaction(Effect.gen(function*() {\n\t\t\tconst tx = new EffectPgTransaction<TQueryResult, TFullSchema, TRelations, TSchema>(\n\t\t\t\tdialect,\n\t\t\t\tsession,\n\t\t\t\trelations,\n\t\t\t\tschema,\n\t\t\t);\n\n\t\t\treturn yield* transaction(tx);\n\t\t}));\n\t}\n}\n\nexport class EffectPgTransaction<\n\tTQueryResult extends PgQueryResultHKT,\n\tTFullSchema extends Record<string, unknown>,\n\tTRelations extends AnyRelations,\n\tTSchema extends V1.TablesRelationalConfig,\n> extends PgEffectTransaction<TQueryResult, TFullSchema, TRelations, TSchema> {\n\tstatic override readonly [entityKind]: string = 'EffectPgTransaction';\n\n\toverride transaction<T>(\n\t\ttransaction: (\n\t\t\ttx: PgEffectTransaction<TQueryResult, TFullSchema, TRelations, TSchema>,\n\t\t) => Effect.Effect<T, DrizzleQueryError | TransactionRollbackError, never>,\n\t): Effect.Effect<T, DrizzleQueryError | TransactionRollbackError, never> {\n\t\treturn this.session.transaction(transaction);\n\t}\n}\n"],"mappings":"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","names":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "drizzle-orm",
|
|
3
|
-
"version": "1.0.0-beta.8-
|
|
3
|
+
"version": "1.0.0-beta.8-e601f80",
|
|
4
4
|
"description": "Drizzle ORM package for SQL databases",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"scripts": {
|
|
@@ -1122,6 +1122,18 @@
|
|
|
1122
1122
|
"types": "./effect-postgres/index.d.ts",
|
|
1123
1123
|
"default": "./effect-postgres/index.js"
|
|
1124
1124
|
},
|
|
1125
|
+
"./effect-postgres/migrator": {
|
|
1126
|
+
"import": {
|
|
1127
|
+
"types": "./effect-postgres/migrator.d.ts",
|
|
1128
|
+
"default": "./effect-postgres/migrator.js"
|
|
1129
|
+
},
|
|
1130
|
+
"require": {
|
|
1131
|
+
"types": "./effect-postgres/migrator.d.cts",
|
|
1132
|
+
"default": "./effect-postgres/migrator.cjs"
|
|
1133
|
+
},
|
|
1134
|
+
"types": "./effect-postgres/migrator.d.ts",
|
|
1135
|
+
"default": "./effect-postgres/migrator.js"
|
|
1136
|
+
},
|
|
1125
1137
|
"./effect-postgres/session": {
|
|
1126
1138
|
"import": {
|
|
1127
1139
|
"types": "./effect-postgres/session.d.ts",
|
|
@@ -134,7 +134,7 @@ class PgAsyncTransaction extends import_db.PgAsyncDatabase {
|
|
|
134
134
|
this.schema = schema;
|
|
135
135
|
this.nestedIndex = nestedIndex;
|
|
136
136
|
}
|
|
137
|
-
static [import_entity.entityKind] = "
|
|
137
|
+
static [import_entity.entityKind] = "PgAsyncTransaction";
|
|
138
138
|
rollback() {
|
|
139
139
|
throw new import_errors.TransactionRollbackError();
|
|
140
140
|
}
|
|
@@ -187,7 +187,7 @@ async function migrate(migrations, session, config) {
|
|
|
187
187
|
}
|
|
188
188
|
const lastDbMigration = dbMigrations[0];
|
|
189
189
|
await session.transaction(async (tx) => {
|
|
190
|
-
for
|
|
190
|
+
for (const migration of migrations) {
|
|
191
191
|
if (!lastDbMigration || Number(lastDbMigration.created_at) < migration.folderMillis) {
|
|
192
192
|
for (const stmt of migration.sql) {
|
|
193
193
|
await tx.execute(import_sql.sql.raw(stmt));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/pg-core/async/session.ts"],"sourcesContent":["import type * as V1 from '~/_relations.ts';\nimport { type Cache, NoopCache, strategyFor } from '~/cache/core/cache.ts';\nimport type { WithCacheConfig } from '~/cache/core/types.ts';\nimport { entityKind } from '~/entity.ts';\nimport { is } from '~/entity.ts';\nimport { TransactionRollbackError } from '~/errors.ts';\nimport { DrizzleQueryError } from '~/errors.ts';\nimport type { MigrationConfig, MigrationMeta, MigratorInitFailResponse } from '~/migrator.ts';\nimport type { AnyRelations, EmptyRelations } from '~/relations.ts';\nimport { type Query, type SQL, sql } from '~/sql/sql.ts';\nimport { tracer } from '~/tracing.ts';\nimport type { NeonAuthToken } from '~/utils.ts';\nimport { assertUnreachable } from '~/utils.ts';\nimport type { PgDialect } from '../dialect.ts';\nimport type { SelectedFieldsOrdered } from '../query-builders/select.types.ts';\nimport type { PgQueryResultHKT, PgTransactionConfig, PreparedQueryConfig } from '../session.ts';\nimport { PgBasePreparedQuery, PgSession } from '../session.ts';\nimport { PgAsyncDatabase } from './db.ts';\n\nexport abstract class PgAsyncPreparedQuery<T extends PreparedQueryConfig> extends PgBasePreparedQuery {\n\tstatic override readonly [entityKind]: string = 'PgAsyncPreparedQuery';\n\n\tconstructor(\n\t\tquery: Query,\n\t\t// cache instance\n\t\tprivate cache: Cache | undefined,\n\t\t// per query related metadata\n\t\tprivate queryMetadata: {\n\t\t\ttype: 'select' | 'update' | 'delete' | 'insert';\n\t\t\ttables: string[];\n\t\t} | undefined,\n\t\t// config that was passed through $withCache\n\t\tprivate cacheConfig?: WithCacheConfig,\n\t) {\n\t\tsuper(query);\n\t\tif (cache && cache.strategy() === 'all' && cacheConfig === undefined) {\n\t\t\tthis.cacheConfig = { enabled: true, autoInvalidate: true };\n\t\t}\n\t\tif (!this.cacheConfig?.enabled) {\n\t\t\tthis.cacheConfig = undefined;\n\t\t}\n\t}\n\n\t/** @internal */\n\tprotected authToken?: NeonAuthToken;\n\t/** @internal */\n\tsetToken(token?: NeonAuthToken) {\n\t\tthis.authToken = token;\n\t\treturn this;\n\t}\n\n\tabstract override execute(placeholderValues?: Record<string, unknown>): Promise<T['execute']>;\n\n\t/** @internal */\n\tabstract override all(placeholderValues?: Record<string, unknown>): Promise<T['all']>;\n\n\t/** @internal */\n\tprotected async queryWithCache<T>(\n\t\tqueryString: string,\n\t\tparams: any[],\n\t\tquery: () => Promise<T>,\n\t): Promise<T> {\n\t\tconst cacheStrat = this.cache !== undefined || is(this.cache, NoopCache)\n\t\t\t? await strategyFor(queryString, params, this.queryMetadata, this.cacheConfig)\n\t\t\t: { type: 'skip' as const };\n\n\t\tif (cacheStrat.type === 'skip') {\n\t\t\treturn query().catch((e) => {\n\t\t\t\tthrow new DrizzleQueryError(queryString, params, e as Error);\n\t\t\t});\n\t\t}\n\n\t\tconst cache = this.cache!;\n\n\t\t// For mutate queries, we should query the database, wait for a response, and then perform invalidation\n\t\tif (cacheStrat.type === 'invalidate') {\n\t\t\treturn Promise.all([\n\t\t\t\tquery(),\n\t\t\t\tcache.onMutate({ tables: cacheStrat.tables }),\n\t\t\t]).then((res) => res[0]).catch((e) => {\n\t\t\t\tthrow new DrizzleQueryError(queryString, params, e as Error);\n\t\t\t});\n\t\t}\n\n\t\tif (cacheStrat.type === 'try') {\n\t\t\tconst { tables, key, isTag, autoInvalidate, config } = cacheStrat;\n\t\t\tconst fromCache = await cache.get(\n\t\t\t\tkey,\n\t\t\t\ttables,\n\t\t\t\tisTag,\n\t\t\t\tautoInvalidate,\n\t\t\t);\n\n\t\t\tif (fromCache === undefined) {\n\t\t\t\tconst result = await query().catch((e) => {\n\t\t\t\t\tthrow new DrizzleQueryError(queryString, params, e as Error);\n\t\t\t\t});\n\t\t\t\t// put actual key\n\t\t\t\tawait cache.put(\n\t\t\t\t\tkey,\n\t\t\t\t\tresult,\n\t\t\t\t\t// make sure we send tables that were used in a query only if user wants to invalidate it on each write\n\t\t\t\t\tautoInvalidate ? tables : [],\n\t\t\t\t\tisTag,\n\t\t\t\t\tconfig,\n\t\t\t\t);\n\t\t\t\t// put flag if we should invalidate or not\n\t\t\t\treturn result;\n\t\t\t}\n\n\t\t\treturn fromCache as unknown as T;\n\t\t}\n\n\t\tassertUnreachable(cacheStrat);\n\t}\n}\n\nexport abstract class PgAsyncSession<\n\tTQueryResult extends PgQueryResultHKT = PgQueryResultHKT,\n\tTFullSchema extends Record<string, unknown> = Record<string, never>,\n\tTRelations extends AnyRelations = EmptyRelations,\n\tTSchema extends V1.TablesRelationalConfig = V1.ExtractTablesWithRelations<TFullSchema>,\n> extends PgSession {\n\tstatic override readonly [entityKind]: string = 'PgAsyncSession';\n\n\tconstructor(dialect: PgDialect) {\n\t\tsuper(dialect);\n\t}\n\n\tabstract override prepareQuery<T extends PreparedQueryConfig = PreparedQueryConfig>(\n\t\tquery: Query,\n\t\tfields: SelectedFieldsOrdered | undefined,\n\t\tname: string | undefined,\n\t\tisResponseInArrayMode: boolean,\n\t\tcustomResultMapper?: (rows: unknown[][], mapColumnValue?: (value: unknown) => unknown) => T['execute'],\n\t\tqueryMetadata?: {\n\t\t\ttype: 'select' | 'update' | 'delete' | 'insert';\n\t\t\ttables: string[];\n\t\t},\n\t\tcacheConfig?: WithCacheConfig,\n\t): PgAsyncPreparedQuery<T>;\n\n\tabstract override prepareRelationalQuery<T extends PreparedQueryConfig = PreparedQueryConfig>(\n\t\tquery: Query,\n\t\tfields: SelectedFieldsOrdered | undefined,\n\t\tname: string | undefined,\n\t\tcustomResultMapper: (\n\t\t\trows: Record<string, unknown>[],\n\t\t\tmapColumnValue?: (value: unknown) => unknown,\n\t\t) => T['execute'],\n\t): PgAsyncPreparedQuery<T>;\n\n\toverride execute<T>(query: SQL): Promise<T>;\n\t/** @internal */\n\toverride execute<T>(query: SQL, token?: NeonAuthToken): Promise<T>;\n\t/** @internal */\n\toverride execute<T>(query: SQL, token?: NeonAuthToken): Promise<T> {\n\t\treturn tracer.startActiveSpan('drizzle.operation', () => {\n\t\t\tconst prepared = tracer.startActiveSpan('drizzle.prepareQuery', () => {\n\t\t\t\treturn this.prepareQuery<PreparedQueryConfig & { execute: T }>(\n\t\t\t\t\tthis.dialect.sqlToQuery(query),\n\t\t\t\t\tundefined,\n\t\t\t\t\tundefined,\n\t\t\t\t\tfalse,\n\t\t\t\t);\n\t\t\t});\n\n\t\t\treturn prepared.setToken(token).execute();\n\t\t});\n\t}\n\n\toverride all<T = unknown>(query: SQL): Promise<T[]> {\n\t\treturn this.prepareQuery<PreparedQueryConfig & { all: T[] }>(\n\t\t\tthis.dialect.sqlToQuery(query),\n\t\t\tundefined,\n\t\t\tundefined,\n\t\t\tfalse,\n\t\t).all();\n\t}\n\n\tabstract transaction<T>(\n\t\ttransaction: (tx: PgAsyncTransaction<TQueryResult, TFullSchema, TRelations, TSchema>) => Promise<T>,\n\t\tconfig?: PgTransactionConfig,\n\t): Promise<T>;\n}\n\nexport abstract class PgAsyncTransaction<\n\tTQueryResult extends PgQueryResultHKT,\n\tTFullSchema extends Record<string, unknown> = Record<string, never>,\n\tTRelations extends AnyRelations = EmptyRelations,\n\tTSchema extends V1.TablesRelationalConfig = V1.ExtractTablesWithRelations<TFullSchema>,\n> extends PgAsyncDatabase<TQueryResult, TFullSchema, TRelations, TSchema> {\n\tstatic override readonly [entityKind]: string = 'PgTransaction';\n\n\tconstructor(\n\t\tdialect: PgDialect,\n\t\tsession: PgAsyncSession<any, any, any, any>,\n\t\tprotected relations: TRelations,\n\t\tprotected schema: {\n\t\t\tfullSchema: Record<string, unknown>;\n\t\t\tschema: TSchema;\n\t\t\ttableNamesMap: Record<string, string>;\n\t\t} | undefined,\n\t\tprotected readonly nestedIndex = 0,\n\t\tparseRqbJson?: boolean,\n\t) {\n\t\tsuper(dialect, session, relations, schema, parseRqbJson);\n\t}\n\n\trollback(): never {\n\t\tthrow new TransactionRollbackError();\n\t}\n\n\t/** @internal */\n\tgetTransactionConfigSQL(config: PgTransactionConfig): SQL {\n\t\tconst chunks: string[] = [];\n\t\tif (config.isolationLevel) {\n\t\t\tchunks.push(`isolation level ${config.isolationLevel}`);\n\t\t}\n\t\tif (config.accessMode) {\n\t\t\tchunks.push(config.accessMode);\n\t\t}\n\t\tif (typeof config.deferrable === 'boolean') {\n\t\t\tchunks.push(config.deferrable ? 'deferrable' : 'not deferrable');\n\t\t}\n\t\treturn sql.raw(chunks.join(' '));\n\t}\n\n\tsetTransaction(config: PgTransactionConfig): Promise<void> {\n\t\treturn this.session.execute(sql`set transaction ${this.getTransactionConfigSQL(config)}`);\n\t}\n\n\tabstract override transaction<T>(\n\t\ttransaction: (tx: PgAsyncTransaction<TQueryResult, TFullSchema, TRelations, TSchema>) => Promise<T>,\n\t): Promise<T>;\n}\n\nexport async function migrate(\n\tmigrations: MigrationMeta[],\n\tsession: PgAsyncSession,\n\tconfig: string | MigrationConfig,\n): Promise<void | MigratorInitFailResponse> {\n\tconst migrationsTable = typeof config === 'string'\n\t\t? '__drizzle_migrations'\n\t\t: config.migrationsTable ?? '__drizzle_migrations';\n\tconst migrationsSchema = typeof config === 'string' ? 'drizzle' : config.migrationsSchema ?? 'drizzle';\n\tconst migrationTableCreate = sql`\n\t\t\tCREATE TABLE IF NOT EXISTS ${sql.identifier(migrationsSchema)}.${sql.identifier(migrationsTable)} (\n\t\t\t\tid SERIAL PRIMARY KEY,\n\t\t\t\thash text NOT NULL,\n\t\t\t\tcreated_at bigint\n\t\t\t)\n\t\t`;\n\tawait session.execute(sql`CREATE SCHEMA IF NOT EXISTS ${sql.identifier(migrationsSchema)}`);\n\tawait session.execute(migrationTableCreate);\n\n\tconst dbMigrations = await session.all<{ id: number; hash: string; created_at: string }>(\n\t\tsql`select id, hash, created_at from ${sql.identifier(migrationsSchema)}.${\n\t\t\tsql.identifier(migrationsTable)\n\t\t} order by created_at desc limit 1`,\n\t);\n\n\tif (typeof config === 'object' && config.init) {\n\t\tif (dbMigrations.length) {\n\t\t\treturn { exitCode: 'databaseMigrations' as const };\n\t\t}\n\n\t\tif (migrations.length > 1) {\n\t\t\treturn { exitCode: 'localMigrations' as const };\n\t\t}\n\n\t\tconst [migration] = migrations;\n\n\t\tif (!migration) return;\n\n\t\tawait session.execute(\n\t\t\tsql`insert into ${sql.identifier(migrationsSchema)}.${\n\t\t\t\tsql.identifier(migrationsTable)\n\t\t\t} (\"hash\", \"created_at\") values(${migration.hash}, ${migration.folderMillis})`,\n\t\t);\n\n\t\treturn;\n\t}\n\n\tconst lastDbMigration = dbMigrations[0];\n\tawait session.transaction(async (tx) => {\n\t\tfor await (const migration of migrations) {\n\t\t\tif (\n\t\t\t\t!lastDbMigration\n\t\t\t\t|| Number(lastDbMigration.created_at) < migration.folderMillis\n\t\t\t) {\n\t\t\t\tfor (const stmt of migration.sql) {\n\t\t\t\t\tawait tx.execute(sql.raw(stmt));\n\t\t\t\t}\n\t\t\t\tawait tx.execute(\n\t\t\t\t\tsql`insert into ${sql.identifier(migrationsSchema)}.${\n\t\t\t\t\t\tsql.identifier(migrationsTable)\n\t\t\t\t\t} (\"hash\", \"created_at\") values(${migration.hash}, ${migration.folderMillis})`,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t});\n}\n"],"mappings":"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","names":["import_entity","import_errors"]}
|
|
1
|
+
{"version":3,"sources":["../../../src/pg-core/async/session.ts"],"sourcesContent":["import type * as V1 from '~/_relations.ts';\nimport { type Cache, NoopCache, strategyFor } from '~/cache/core/cache.ts';\nimport type { WithCacheConfig } from '~/cache/core/types.ts';\nimport { entityKind } from '~/entity.ts';\nimport { is } from '~/entity.ts';\nimport { TransactionRollbackError } from '~/errors.ts';\nimport { DrizzleQueryError } from '~/errors.ts';\nimport type { MigrationConfig, MigrationMeta, MigratorInitFailResponse } from '~/migrator.ts';\nimport type { AnyRelations, EmptyRelations } from '~/relations.ts';\nimport { type Query, type SQL, sql } from '~/sql/sql.ts';\nimport { tracer } from '~/tracing.ts';\nimport type { NeonAuthToken } from '~/utils.ts';\nimport { assertUnreachable } from '~/utils.ts';\nimport type { PgDialect } from '../dialect.ts';\nimport type { SelectedFieldsOrdered } from '../query-builders/select.types.ts';\nimport type { PgQueryResultHKT, PgTransactionConfig, PreparedQueryConfig } from '../session.ts';\nimport { PgBasePreparedQuery, PgSession } from '../session.ts';\nimport { PgAsyncDatabase } from './db.ts';\n\nexport abstract class PgAsyncPreparedQuery<T extends PreparedQueryConfig> extends PgBasePreparedQuery {\n\tstatic override readonly [entityKind]: string = 'PgAsyncPreparedQuery';\n\n\tconstructor(\n\t\tquery: Query,\n\t\t// cache instance\n\t\tprivate cache: Cache | undefined,\n\t\t// per query related metadata\n\t\tprivate queryMetadata: {\n\t\t\ttype: 'select' | 'update' | 'delete' | 'insert';\n\t\t\ttables: string[];\n\t\t} | undefined,\n\t\t// config that was passed through $withCache\n\t\tprivate cacheConfig?: WithCacheConfig,\n\t) {\n\t\tsuper(query);\n\t\tif (cache && cache.strategy() === 'all' && cacheConfig === undefined) {\n\t\t\tthis.cacheConfig = { enabled: true, autoInvalidate: true };\n\t\t}\n\t\tif (!this.cacheConfig?.enabled) {\n\t\t\tthis.cacheConfig = undefined;\n\t\t}\n\t}\n\n\t/** @internal */\n\tprotected authToken?: NeonAuthToken;\n\t/** @internal */\n\tsetToken(token?: NeonAuthToken) {\n\t\tthis.authToken = token;\n\t\treturn this;\n\t}\n\n\tabstract override execute(placeholderValues?: Record<string, unknown>): Promise<T['execute']>;\n\n\t/** @internal */\n\tabstract override all(placeholderValues?: Record<string, unknown>): Promise<T['all']>;\n\n\t/** @internal */\n\tprotected async queryWithCache<T>(\n\t\tqueryString: string,\n\t\tparams: any[],\n\t\tquery: () => Promise<T>,\n\t): Promise<T> {\n\t\tconst cacheStrat = this.cache !== undefined || is(this.cache, NoopCache)\n\t\t\t? await strategyFor(queryString, params, this.queryMetadata, this.cacheConfig)\n\t\t\t: { type: 'skip' as const };\n\n\t\tif (cacheStrat.type === 'skip') {\n\t\t\treturn query().catch((e) => {\n\t\t\t\tthrow new DrizzleQueryError(queryString, params, e as Error);\n\t\t\t});\n\t\t}\n\n\t\tconst cache = this.cache!;\n\n\t\t// For mutate queries, we should query the database, wait for a response, and then perform invalidation\n\t\tif (cacheStrat.type === 'invalidate') {\n\t\t\treturn Promise.all([\n\t\t\t\tquery(),\n\t\t\t\tcache.onMutate({ tables: cacheStrat.tables }),\n\t\t\t]).then((res) => res[0]).catch((e) => {\n\t\t\t\tthrow new DrizzleQueryError(queryString, params, e as Error);\n\t\t\t});\n\t\t}\n\n\t\tif (cacheStrat.type === 'try') {\n\t\t\tconst { tables, key, isTag, autoInvalidate, config } = cacheStrat;\n\t\t\tconst fromCache = await cache.get(\n\t\t\t\tkey,\n\t\t\t\ttables,\n\t\t\t\tisTag,\n\t\t\t\tautoInvalidate,\n\t\t\t);\n\n\t\t\tif (fromCache === undefined) {\n\t\t\t\tconst result = await query().catch((e) => {\n\t\t\t\t\tthrow new DrizzleQueryError(queryString, params, e as Error);\n\t\t\t\t});\n\t\t\t\t// put actual key\n\t\t\t\tawait cache.put(\n\t\t\t\t\tkey,\n\t\t\t\t\tresult,\n\t\t\t\t\t// make sure we send tables that were used in a query only if user wants to invalidate it on each write\n\t\t\t\t\tautoInvalidate ? tables : [],\n\t\t\t\t\tisTag,\n\t\t\t\t\tconfig,\n\t\t\t\t);\n\t\t\t\t// put flag if we should invalidate or not\n\t\t\t\treturn result;\n\t\t\t}\n\n\t\t\treturn fromCache as unknown as T;\n\t\t}\n\n\t\tassertUnreachable(cacheStrat);\n\t}\n}\n\nexport abstract class PgAsyncSession<\n\tTQueryResult extends PgQueryResultHKT = PgQueryResultHKT,\n\tTFullSchema extends Record<string, unknown> = Record<string, never>,\n\tTRelations extends AnyRelations = EmptyRelations,\n\tTSchema extends V1.TablesRelationalConfig = V1.ExtractTablesWithRelations<TFullSchema>,\n> extends PgSession {\n\tstatic override readonly [entityKind]: string = 'PgAsyncSession';\n\n\tconstructor(dialect: PgDialect) {\n\t\tsuper(dialect);\n\t}\n\n\tabstract override prepareQuery<T extends PreparedQueryConfig = PreparedQueryConfig>(\n\t\tquery: Query,\n\t\tfields: SelectedFieldsOrdered | undefined,\n\t\tname: string | undefined,\n\t\tisResponseInArrayMode: boolean,\n\t\tcustomResultMapper?: (rows: unknown[][], mapColumnValue?: (value: unknown) => unknown) => T['execute'],\n\t\tqueryMetadata?: {\n\t\t\ttype: 'select' | 'update' | 'delete' | 'insert';\n\t\t\ttables: string[];\n\t\t},\n\t\tcacheConfig?: WithCacheConfig,\n\t): PgAsyncPreparedQuery<T>;\n\n\tabstract override prepareRelationalQuery<T extends PreparedQueryConfig = PreparedQueryConfig>(\n\t\tquery: Query,\n\t\tfields: SelectedFieldsOrdered | undefined,\n\t\tname: string | undefined,\n\t\tcustomResultMapper: (\n\t\t\trows: Record<string, unknown>[],\n\t\t\tmapColumnValue?: (value: unknown) => unknown,\n\t\t) => T['execute'],\n\t): PgAsyncPreparedQuery<T>;\n\n\toverride execute<T>(query: SQL): Promise<T>;\n\t/** @internal */\n\toverride execute<T>(query: SQL, token?: NeonAuthToken): Promise<T>;\n\t/** @internal */\n\toverride execute<T>(query: SQL, token?: NeonAuthToken): Promise<T> {\n\t\treturn tracer.startActiveSpan('drizzle.operation', () => {\n\t\t\tconst prepared = tracer.startActiveSpan('drizzle.prepareQuery', () => {\n\t\t\t\treturn this.prepareQuery<PreparedQueryConfig & { execute: T }>(\n\t\t\t\t\tthis.dialect.sqlToQuery(query),\n\t\t\t\t\tundefined,\n\t\t\t\t\tundefined,\n\t\t\t\t\tfalse,\n\t\t\t\t);\n\t\t\t});\n\n\t\t\treturn prepared.setToken(token).execute();\n\t\t});\n\t}\n\n\toverride all<T = unknown>(query: SQL): Promise<T[]> {\n\t\treturn this.prepareQuery<PreparedQueryConfig & { all: T[] }>(\n\t\t\tthis.dialect.sqlToQuery(query),\n\t\t\tundefined,\n\t\t\tundefined,\n\t\t\tfalse,\n\t\t).all();\n\t}\n\n\tabstract transaction<T>(\n\t\ttransaction: (tx: PgAsyncTransaction<TQueryResult, TFullSchema, TRelations, TSchema>) => Promise<T>,\n\t\tconfig?: PgTransactionConfig,\n\t): Promise<T>;\n}\n\nexport abstract class PgAsyncTransaction<\n\tTQueryResult extends PgQueryResultHKT,\n\tTFullSchema extends Record<string, unknown> = Record<string, never>,\n\tTRelations extends AnyRelations = EmptyRelations,\n\tTSchema extends V1.TablesRelationalConfig = V1.ExtractTablesWithRelations<TFullSchema>,\n> extends PgAsyncDatabase<TQueryResult, TFullSchema, TRelations, TSchema> {\n\tstatic override readonly [entityKind]: string = 'PgAsyncTransaction';\n\n\tconstructor(\n\t\tdialect: PgDialect,\n\t\tsession: PgAsyncSession<any, any, any, any>,\n\t\tprotected relations: TRelations,\n\t\tprotected schema: {\n\t\t\tfullSchema: Record<string, unknown>;\n\t\t\tschema: TSchema;\n\t\t\ttableNamesMap: Record<string, string>;\n\t\t} | undefined,\n\t\tprotected readonly nestedIndex = 0,\n\t\tparseRqbJson?: boolean,\n\t) {\n\t\tsuper(dialect, session, relations, schema, parseRqbJson);\n\t}\n\n\trollback(): never {\n\t\tthrow new TransactionRollbackError();\n\t}\n\n\t/** @internal */\n\tgetTransactionConfigSQL(config: PgTransactionConfig): SQL {\n\t\tconst chunks: string[] = [];\n\t\tif (config.isolationLevel) {\n\t\t\tchunks.push(`isolation level ${config.isolationLevel}`);\n\t\t}\n\t\tif (config.accessMode) {\n\t\t\tchunks.push(config.accessMode);\n\t\t}\n\t\tif (typeof config.deferrable === 'boolean') {\n\t\t\tchunks.push(config.deferrable ? 'deferrable' : 'not deferrable');\n\t\t}\n\t\treturn sql.raw(chunks.join(' '));\n\t}\n\n\tsetTransaction(config: PgTransactionConfig): Promise<void> {\n\t\treturn this.session.execute(sql`set transaction ${this.getTransactionConfigSQL(config)}`);\n\t}\n\n\tabstract override transaction<T>(\n\t\ttransaction: (tx: PgAsyncTransaction<TQueryResult, TFullSchema, TRelations, TSchema>) => Promise<T>,\n\t): Promise<T>;\n}\n\nexport async function migrate(\n\tmigrations: MigrationMeta[],\n\tsession: PgAsyncSession,\n\tconfig: string | MigrationConfig,\n): Promise<void | MigratorInitFailResponse> {\n\tconst migrationsTable = typeof config === 'string'\n\t\t? '__drizzle_migrations'\n\t\t: config.migrationsTable ?? '__drizzle_migrations';\n\tconst migrationsSchema = typeof config === 'string' ? 'drizzle' : config.migrationsSchema ?? 'drizzle';\n\tconst migrationTableCreate = sql`\n\t\t\tCREATE TABLE IF NOT EXISTS ${sql.identifier(migrationsSchema)}.${sql.identifier(migrationsTable)} (\n\t\t\t\tid SERIAL PRIMARY KEY,\n\t\t\t\thash text NOT NULL,\n\t\t\t\tcreated_at bigint\n\t\t\t)\n\t\t`;\n\tawait session.execute(sql`CREATE SCHEMA IF NOT EXISTS ${sql.identifier(migrationsSchema)}`);\n\tawait session.execute(migrationTableCreate);\n\n\tconst dbMigrations = await session.all<{ id: number; hash: string; created_at: string }>(\n\t\tsql`select id, hash, created_at from ${sql.identifier(migrationsSchema)}.${\n\t\t\tsql.identifier(migrationsTable)\n\t\t} order by created_at desc limit 1`,\n\t);\n\n\tif (typeof config === 'object' && config.init) {\n\t\tif (dbMigrations.length) {\n\t\t\treturn { exitCode: 'databaseMigrations' as const };\n\t\t}\n\n\t\tif (migrations.length > 1) {\n\t\t\treturn { exitCode: 'localMigrations' as const };\n\t\t}\n\n\t\tconst [migration] = migrations;\n\n\t\tif (!migration) return;\n\n\t\tawait session.execute(\n\t\t\tsql`insert into ${sql.identifier(migrationsSchema)}.${\n\t\t\t\tsql.identifier(migrationsTable)\n\t\t\t} (\"hash\", \"created_at\") values(${migration.hash}, ${migration.folderMillis})`,\n\t\t);\n\n\t\treturn;\n\t}\n\n\tconst lastDbMigration = dbMigrations[0];\n\tawait session.transaction(async (tx) => {\n\t\tfor (const migration of migrations) {\n\t\t\tif (\n\t\t\t\t!lastDbMigration\n\t\t\t\t|| Number(lastDbMigration.created_at) < migration.folderMillis\n\t\t\t) {\n\t\t\t\tfor (const stmt of migration.sql) {\n\t\t\t\t\tawait tx.execute(sql.raw(stmt));\n\t\t\t\t}\n\t\t\t\tawait tx.execute(\n\t\t\t\t\tsql`insert into ${sql.identifier(migrationsSchema)}.${\n\t\t\t\t\t\tsql.identifier(migrationsTable)\n\t\t\t\t\t} (\"hash\", \"created_at\") values(${migration.hash}, ${migration.folderMillis})`,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t});\n}\n"],"mappings":"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","names":["import_entity","import_errors"]}
|
package/pg-core/async/session.js
CHANGED
|
@@ -108,7 +108,7 @@ class PgAsyncTransaction extends PgAsyncDatabase {
|
|
|
108
108
|
this.schema = schema;
|
|
109
109
|
this.nestedIndex = nestedIndex;
|
|
110
110
|
}
|
|
111
|
-
static [entityKind] = "
|
|
111
|
+
static [entityKind] = "PgAsyncTransaction";
|
|
112
112
|
rollback() {
|
|
113
113
|
throw new TransactionRollbackError();
|
|
114
114
|
}
|
|
@@ -161,7 +161,7 @@ async function migrate(migrations, session, config) {
|
|
|
161
161
|
}
|
|
162
162
|
const lastDbMigration = dbMigrations[0];
|
|
163
163
|
await session.transaction(async (tx) => {
|
|
164
|
-
for
|
|
164
|
+
for (const migration of migrations) {
|
|
165
165
|
if (!lastDbMigration || Number(lastDbMigration.created_at) < migration.folderMillis) {
|
|
166
166
|
for (const stmt of migration.sql) {
|
|
167
167
|
await tx.execute(sql.raw(stmt));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/pg-core/async/session.ts"],"sourcesContent":["import type * as V1 from '~/_relations.ts';\nimport { type Cache, NoopCache, strategyFor } from '~/cache/core/cache.ts';\nimport type { WithCacheConfig } from '~/cache/core/types.ts';\nimport { entityKind } from '~/entity.ts';\nimport { is } from '~/entity.ts';\nimport { TransactionRollbackError } from '~/errors.ts';\nimport { DrizzleQueryError } from '~/errors.ts';\nimport type { MigrationConfig, MigrationMeta, MigratorInitFailResponse } from '~/migrator.ts';\nimport type { AnyRelations, EmptyRelations } from '~/relations.ts';\nimport { type Query, type SQL, sql } from '~/sql/sql.ts';\nimport { tracer } from '~/tracing.ts';\nimport type { NeonAuthToken } from '~/utils.ts';\nimport { assertUnreachable } from '~/utils.ts';\nimport type { PgDialect } from '../dialect.ts';\nimport type { SelectedFieldsOrdered } from '../query-builders/select.types.ts';\nimport type { PgQueryResultHKT, PgTransactionConfig, PreparedQueryConfig } from '../session.ts';\nimport { PgBasePreparedQuery, PgSession } from '../session.ts';\nimport { PgAsyncDatabase } from './db.ts';\n\nexport abstract class PgAsyncPreparedQuery<T extends PreparedQueryConfig> extends PgBasePreparedQuery {\n\tstatic override readonly [entityKind]: string = 'PgAsyncPreparedQuery';\n\n\tconstructor(\n\t\tquery: Query,\n\t\t// cache instance\n\t\tprivate cache: Cache | undefined,\n\t\t// per query related metadata\n\t\tprivate queryMetadata: {\n\t\t\ttype: 'select' | 'update' | 'delete' | 'insert';\n\t\t\ttables: string[];\n\t\t} | undefined,\n\t\t// config that was passed through $withCache\n\t\tprivate cacheConfig?: WithCacheConfig,\n\t) {\n\t\tsuper(query);\n\t\tif (cache && cache.strategy() === 'all' && cacheConfig === undefined) {\n\t\t\tthis.cacheConfig = { enabled: true, autoInvalidate: true };\n\t\t}\n\t\tif (!this.cacheConfig?.enabled) {\n\t\t\tthis.cacheConfig = undefined;\n\t\t}\n\t}\n\n\t/** @internal */\n\tprotected authToken?: NeonAuthToken;\n\t/** @internal */\n\tsetToken(token?: NeonAuthToken) {\n\t\tthis.authToken = token;\n\t\treturn this;\n\t}\n\n\tabstract override execute(placeholderValues?: Record<string, unknown>): Promise<T['execute']>;\n\n\t/** @internal */\n\tabstract override all(placeholderValues?: Record<string, unknown>): Promise<T['all']>;\n\n\t/** @internal */\n\tprotected async queryWithCache<T>(\n\t\tqueryString: string,\n\t\tparams: any[],\n\t\tquery: () => Promise<T>,\n\t): Promise<T> {\n\t\tconst cacheStrat = this.cache !== undefined || is(this.cache, NoopCache)\n\t\t\t? await strategyFor(queryString, params, this.queryMetadata, this.cacheConfig)\n\t\t\t: { type: 'skip' as const };\n\n\t\tif (cacheStrat.type === 'skip') {\n\t\t\treturn query().catch((e) => {\n\t\t\t\tthrow new DrizzleQueryError(queryString, params, e as Error);\n\t\t\t});\n\t\t}\n\n\t\tconst cache = this.cache!;\n\n\t\t// For mutate queries, we should query the database, wait for a response, and then perform invalidation\n\t\tif (cacheStrat.type === 'invalidate') {\n\t\t\treturn Promise.all([\n\t\t\t\tquery(),\n\t\t\t\tcache.onMutate({ tables: cacheStrat.tables }),\n\t\t\t]).then((res) => res[0]).catch((e) => {\n\t\t\t\tthrow new DrizzleQueryError(queryString, params, e as Error);\n\t\t\t});\n\t\t}\n\n\t\tif (cacheStrat.type === 'try') {\n\t\t\tconst { tables, key, isTag, autoInvalidate, config } = cacheStrat;\n\t\t\tconst fromCache = await cache.get(\n\t\t\t\tkey,\n\t\t\t\ttables,\n\t\t\t\tisTag,\n\t\t\t\tautoInvalidate,\n\t\t\t);\n\n\t\t\tif (fromCache === undefined) {\n\t\t\t\tconst result = await query().catch((e) => {\n\t\t\t\t\tthrow new DrizzleQueryError(queryString, params, e as Error);\n\t\t\t\t});\n\t\t\t\t// put actual key\n\t\t\t\tawait cache.put(\n\t\t\t\t\tkey,\n\t\t\t\t\tresult,\n\t\t\t\t\t// make sure we send tables that were used in a query only if user wants to invalidate it on each write\n\t\t\t\t\tautoInvalidate ? tables : [],\n\t\t\t\t\tisTag,\n\t\t\t\t\tconfig,\n\t\t\t\t);\n\t\t\t\t// put flag if we should invalidate or not\n\t\t\t\treturn result;\n\t\t\t}\n\n\t\t\treturn fromCache as unknown as T;\n\t\t}\n\n\t\tassertUnreachable(cacheStrat);\n\t}\n}\n\nexport abstract class PgAsyncSession<\n\tTQueryResult extends PgQueryResultHKT = PgQueryResultHKT,\n\tTFullSchema extends Record<string, unknown> = Record<string, never>,\n\tTRelations extends AnyRelations = EmptyRelations,\n\tTSchema extends V1.TablesRelationalConfig = V1.ExtractTablesWithRelations<TFullSchema>,\n> extends PgSession {\n\tstatic override readonly [entityKind]: string = 'PgAsyncSession';\n\n\tconstructor(dialect: PgDialect) {\n\t\tsuper(dialect);\n\t}\n\n\tabstract override prepareQuery<T extends PreparedQueryConfig = PreparedQueryConfig>(\n\t\tquery: Query,\n\t\tfields: SelectedFieldsOrdered | undefined,\n\t\tname: string | undefined,\n\t\tisResponseInArrayMode: boolean,\n\t\tcustomResultMapper?: (rows: unknown[][], mapColumnValue?: (value: unknown) => unknown) => T['execute'],\n\t\tqueryMetadata?: {\n\t\t\ttype: 'select' | 'update' | 'delete' | 'insert';\n\t\t\ttables: string[];\n\t\t},\n\t\tcacheConfig?: WithCacheConfig,\n\t): PgAsyncPreparedQuery<T>;\n\n\tabstract override prepareRelationalQuery<T extends PreparedQueryConfig = PreparedQueryConfig>(\n\t\tquery: Query,\n\t\tfields: SelectedFieldsOrdered | undefined,\n\t\tname: string | undefined,\n\t\tcustomResultMapper: (\n\t\t\trows: Record<string, unknown>[],\n\t\t\tmapColumnValue?: (value: unknown) => unknown,\n\t\t) => T['execute'],\n\t): PgAsyncPreparedQuery<T>;\n\n\toverride execute<T>(query: SQL): Promise<T>;\n\t/** @internal */\n\toverride execute<T>(query: SQL, token?: NeonAuthToken): Promise<T>;\n\t/** @internal */\n\toverride execute<T>(query: SQL, token?: NeonAuthToken): Promise<T> {\n\t\treturn tracer.startActiveSpan('drizzle.operation', () => {\n\t\t\tconst prepared = tracer.startActiveSpan('drizzle.prepareQuery', () => {\n\t\t\t\treturn this.prepareQuery<PreparedQueryConfig & { execute: T }>(\n\t\t\t\t\tthis.dialect.sqlToQuery(query),\n\t\t\t\t\tundefined,\n\t\t\t\t\tundefined,\n\t\t\t\t\tfalse,\n\t\t\t\t);\n\t\t\t});\n\n\t\t\treturn prepared.setToken(token).execute();\n\t\t});\n\t}\n\n\toverride all<T = unknown>(query: SQL): Promise<T[]> {\n\t\treturn this.prepareQuery<PreparedQueryConfig & { all: T[] }>(\n\t\t\tthis.dialect.sqlToQuery(query),\n\t\t\tundefined,\n\t\t\tundefined,\n\t\t\tfalse,\n\t\t).all();\n\t}\n\n\tabstract transaction<T>(\n\t\ttransaction: (tx: PgAsyncTransaction<TQueryResult, TFullSchema, TRelations, TSchema>) => Promise<T>,\n\t\tconfig?: PgTransactionConfig,\n\t): Promise<T>;\n}\n\nexport abstract class PgAsyncTransaction<\n\tTQueryResult extends PgQueryResultHKT,\n\tTFullSchema extends Record<string, unknown> = Record<string, never>,\n\tTRelations extends AnyRelations = EmptyRelations,\n\tTSchema extends V1.TablesRelationalConfig = V1.ExtractTablesWithRelations<TFullSchema>,\n> extends PgAsyncDatabase<TQueryResult, TFullSchema, TRelations, TSchema> {\n\tstatic override readonly [entityKind]: string = 'PgTransaction';\n\n\tconstructor(\n\t\tdialect: PgDialect,\n\t\tsession: PgAsyncSession<any, any, any, any>,\n\t\tprotected relations: TRelations,\n\t\tprotected schema: {\n\t\t\tfullSchema: Record<string, unknown>;\n\t\t\tschema: TSchema;\n\t\t\ttableNamesMap: Record<string, string>;\n\t\t} | undefined,\n\t\tprotected readonly nestedIndex = 0,\n\t\tparseRqbJson?: boolean,\n\t) {\n\t\tsuper(dialect, session, relations, schema, parseRqbJson);\n\t}\n\n\trollback(): never {\n\t\tthrow new TransactionRollbackError();\n\t}\n\n\t/** @internal */\n\tgetTransactionConfigSQL(config: PgTransactionConfig): SQL {\n\t\tconst chunks: string[] = [];\n\t\tif (config.isolationLevel) {\n\t\t\tchunks.push(`isolation level ${config.isolationLevel}`);\n\t\t}\n\t\tif (config.accessMode) {\n\t\t\tchunks.push(config.accessMode);\n\t\t}\n\t\tif (typeof config.deferrable === 'boolean') {\n\t\t\tchunks.push(config.deferrable ? 'deferrable' : 'not deferrable');\n\t\t}\n\t\treturn sql.raw(chunks.join(' '));\n\t}\n\n\tsetTransaction(config: PgTransactionConfig): Promise<void> {\n\t\treturn this.session.execute(sql`set transaction ${this.getTransactionConfigSQL(config)}`);\n\t}\n\n\tabstract override transaction<T>(\n\t\ttransaction: (tx: PgAsyncTransaction<TQueryResult, TFullSchema, TRelations, TSchema>) => Promise<T>,\n\t): Promise<T>;\n}\n\nexport async function migrate(\n\tmigrations: MigrationMeta[],\n\tsession: PgAsyncSession,\n\tconfig: string | MigrationConfig,\n): Promise<void | MigratorInitFailResponse> {\n\tconst migrationsTable = typeof config === 'string'\n\t\t? '__drizzle_migrations'\n\t\t: config.migrationsTable ?? '__drizzle_migrations';\n\tconst migrationsSchema = typeof config === 'string' ? 'drizzle' : config.migrationsSchema ?? 'drizzle';\n\tconst migrationTableCreate = sql`\n\t\t\tCREATE TABLE IF NOT EXISTS ${sql.identifier(migrationsSchema)}.${sql.identifier(migrationsTable)} (\n\t\t\t\tid SERIAL PRIMARY KEY,\n\t\t\t\thash text NOT NULL,\n\t\t\t\tcreated_at bigint\n\t\t\t)\n\t\t`;\n\tawait session.execute(sql`CREATE SCHEMA IF NOT EXISTS ${sql.identifier(migrationsSchema)}`);\n\tawait session.execute(migrationTableCreate);\n\n\tconst dbMigrations = await session.all<{ id: number; hash: string; created_at: string }>(\n\t\tsql`select id, hash, created_at from ${sql.identifier(migrationsSchema)}.${\n\t\t\tsql.identifier(migrationsTable)\n\t\t} order by created_at desc limit 1`,\n\t);\n\n\tif (typeof config === 'object' && config.init) {\n\t\tif (dbMigrations.length) {\n\t\t\treturn { exitCode: 'databaseMigrations' as const };\n\t\t}\n\n\t\tif (migrations.length > 1) {\n\t\t\treturn { exitCode: 'localMigrations' as const };\n\t\t}\n\n\t\tconst [migration] = migrations;\n\n\t\tif (!migration) return;\n\n\t\tawait session.execute(\n\t\t\tsql`insert into ${sql.identifier(migrationsSchema)}.${\n\t\t\t\tsql.identifier(migrationsTable)\n\t\t\t} (\"hash\", \"created_at\") values(${migration.hash}, ${migration.folderMillis})`,\n\t\t);\n\n\t\treturn;\n\t}\n\n\tconst lastDbMigration = dbMigrations[0];\n\tawait session.transaction(async (tx) => {\n\t\tfor await (const migration of migrations) {\n\t\t\tif (\n\t\t\t\t!lastDbMigration\n\t\t\t\t|| Number(lastDbMigration.created_at) < migration.folderMillis\n\t\t\t) {\n\t\t\t\tfor (const stmt of migration.sql) {\n\t\t\t\t\tawait tx.execute(sql.raw(stmt));\n\t\t\t\t}\n\t\t\t\tawait tx.execute(\n\t\t\t\t\tsql`insert into ${sql.identifier(migrationsSchema)}.${\n\t\t\t\t\t\tsql.identifier(migrationsTable)\n\t\t\t\t\t} (\"hash\", \"created_at\") values(${migration.hash}, ${migration.folderMillis})`,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t});\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../../src/pg-core/async/session.ts"],"sourcesContent":["import type * as V1 from '~/_relations.ts';\nimport { type Cache, NoopCache, strategyFor } from '~/cache/core/cache.ts';\nimport type { WithCacheConfig } from '~/cache/core/types.ts';\nimport { entityKind } from '~/entity.ts';\nimport { is } from '~/entity.ts';\nimport { TransactionRollbackError } from '~/errors.ts';\nimport { DrizzleQueryError } from '~/errors.ts';\nimport type { MigrationConfig, MigrationMeta, MigratorInitFailResponse } from '~/migrator.ts';\nimport type { AnyRelations, EmptyRelations } from '~/relations.ts';\nimport { type Query, type SQL, sql } from '~/sql/sql.ts';\nimport { tracer } from '~/tracing.ts';\nimport type { NeonAuthToken } from '~/utils.ts';\nimport { assertUnreachable } from '~/utils.ts';\nimport type { PgDialect } from '../dialect.ts';\nimport type { SelectedFieldsOrdered } from '../query-builders/select.types.ts';\nimport type { PgQueryResultHKT, PgTransactionConfig, PreparedQueryConfig } from '../session.ts';\nimport { PgBasePreparedQuery, PgSession } from '../session.ts';\nimport { PgAsyncDatabase } from './db.ts';\n\nexport abstract class PgAsyncPreparedQuery<T extends PreparedQueryConfig> extends PgBasePreparedQuery {\n\tstatic override readonly [entityKind]: string = 'PgAsyncPreparedQuery';\n\n\tconstructor(\n\t\tquery: Query,\n\t\t// cache instance\n\t\tprivate cache: Cache | undefined,\n\t\t// per query related metadata\n\t\tprivate queryMetadata: {\n\t\t\ttype: 'select' | 'update' | 'delete' | 'insert';\n\t\t\ttables: string[];\n\t\t} | undefined,\n\t\t// config that was passed through $withCache\n\t\tprivate cacheConfig?: WithCacheConfig,\n\t) {\n\t\tsuper(query);\n\t\tif (cache && cache.strategy() === 'all' && cacheConfig === undefined) {\n\t\t\tthis.cacheConfig = { enabled: true, autoInvalidate: true };\n\t\t}\n\t\tif (!this.cacheConfig?.enabled) {\n\t\t\tthis.cacheConfig = undefined;\n\t\t}\n\t}\n\n\t/** @internal */\n\tprotected authToken?: NeonAuthToken;\n\t/** @internal */\n\tsetToken(token?: NeonAuthToken) {\n\t\tthis.authToken = token;\n\t\treturn this;\n\t}\n\n\tabstract override execute(placeholderValues?: Record<string, unknown>): Promise<T['execute']>;\n\n\t/** @internal */\n\tabstract override all(placeholderValues?: Record<string, unknown>): Promise<T['all']>;\n\n\t/** @internal */\n\tprotected async queryWithCache<T>(\n\t\tqueryString: string,\n\t\tparams: any[],\n\t\tquery: () => Promise<T>,\n\t): Promise<T> {\n\t\tconst cacheStrat = this.cache !== undefined || is(this.cache, NoopCache)\n\t\t\t? await strategyFor(queryString, params, this.queryMetadata, this.cacheConfig)\n\t\t\t: { type: 'skip' as const };\n\n\t\tif (cacheStrat.type === 'skip') {\n\t\t\treturn query().catch((e) => {\n\t\t\t\tthrow new DrizzleQueryError(queryString, params, e as Error);\n\t\t\t});\n\t\t}\n\n\t\tconst cache = this.cache!;\n\n\t\t// For mutate queries, we should query the database, wait for a response, and then perform invalidation\n\t\tif (cacheStrat.type === 'invalidate') {\n\t\t\treturn Promise.all([\n\t\t\t\tquery(),\n\t\t\t\tcache.onMutate({ tables: cacheStrat.tables }),\n\t\t\t]).then((res) => res[0]).catch((e) => {\n\t\t\t\tthrow new DrizzleQueryError(queryString, params, e as Error);\n\t\t\t});\n\t\t}\n\n\t\tif (cacheStrat.type === 'try') {\n\t\t\tconst { tables, key, isTag, autoInvalidate, config } = cacheStrat;\n\t\t\tconst fromCache = await cache.get(\n\t\t\t\tkey,\n\t\t\t\ttables,\n\t\t\t\tisTag,\n\t\t\t\tautoInvalidate,\n\t\t\t);\n\n\t\t\tif (fromCache === undefined) {\n\t\t\t\tconst result = await query().catch((e) => {\n\t\t\t\t\tthrow new DrizzleQueryError(queryString, params, e as Error);\n\t\t\t\t});\n\t\t\t\t// put actual key\n\t\t\t\tawait cache.put(\n\t\t\t\t\tkey,\n\t\t\t\t\tresult,\n\t\t\t\t\t// make sure we send tables that were used in a query only if user wants to invalidate it on each write\n\t\t\t\t\tautoInvalidate ? tables : [],\n\t\t\t\t\tisTag,\n\t\t\t\t\tconfig,\n\t\t\t\t);\n\t\t\t\t// put flag if we should invalidate or not\n\t\t\t\treturn result;\n\t\t\t}\n\n\t\t\treturn fromCache as unknown as T;\n\t\t}\n\n\t\tassertUnreachable(cacheStrat);\n\t}\n}\n\nexport abstract class PgAsyncSession<\n\tTQueryResult extends PgQueryResultHKT = PgQueryResultHKT,\n\tTFullSchema extends Record<string, unknown> = Record<string, never>,\n\tTRelations extends AnyRelations = EmptyRelations,\n\tTSchema extends V1.TablesRelationalConfig = V1.ExtractTablesWithRelations<TFullSchema>,\n> extends PgSession {\n\tstatic override readonly [entityKind]: string = 'PgAsyncSession';\n\n\tconstructor(dialect: PgDialect) {\n\t\tsuper(dialect);\n\t}\n\n\tabstract override prepareQuery<T extends PreparedQueryConfig = PreparedQueryConfig>(\n\t\tquery: Query,\n\t\tfields: SelectedFieldsOrdered | undefined,\n\t\tname: string | undefined,\n\t\tisResponseInArrayMode: boolean,\n\t\tcustomResultMapper?: (rows: unknown[][], mapColumnValue?: (value: unknown) => unknown) => T['execute'],\n\t\tqueryMetadata?: {\n\t\t\ttype: 'select' | 'update' | 'delete' | 'insert';\n\t\t\ttables: string[];\n\t\t},\n\t\tcacheConfig?: WithCacheConfig,\n\t): PgAsyncPreparedQuery<T>;\n\n\tabstract override prepareRelationalQuery<T extends PreparedQueryConfig = PreparedQueryConfig>(\n\t\tquery: Query,\n\t\tfields: SelectedFieldsOrdered | undefined,\n\t\tname: string | undefined,\n\t\tcustomResultMapper: (\n\t\t\trows: Record<string, unknown>[],\n\t\t\tmapColumnValue?: (value: unknown) => unknown,\n\t\t) => T['execute'],\n\t): PgAsyncPreparedQuery<T>;\n\n\toverride execute<T>(query: SQL): Promise<T>;\n\t/** @internal */\n\toverride execute<T>(query: SQL, token?: NeonAuthToken): Promise<T>;\n\t/** @internal */\n\toverride execute<T>(query: SQL, token?: NeonAuthToken): Promise<T> {\n\t\treturn tracer.startActiveSpan('drizzle.operation', () => {\n\t\t\tconst prepared = tracer.startActiveSpan('drizzle.prepareQuery', () => {\n\t\t\t\treturn this.prepareQuery<PreparedQueryConfig & { execute: T }>(\n\t\t\t\t\tthis.dialect.sqlToQuery(query),\n\t\t\t\t\tundefined,\n\t\t\t\t\tundefined,\n\t\t\t\t\tfalse,\n\t\t\t\t);\n\t\t\t});\n\n\t\t\treturn prepared.setToken(token).execute();\n\t\t});\n\t}\n\n\toverride all<T = unknown>(query: SQL): Promise<T[]> {\n\t\treturn this.prepareQuery<PreparedQueryConfig & { all: T[] }>(\n\t\t\tthis.dialect.sqlToQuery(query),\n\t\t\tundefined,\n\t\t\tundefined,\n\t\t\tfalse,\n\t\t).all();\n\t}\n\n\tabstract transaction<T>(\n\t\ttransaction: (tx: PgAsyncTransaction<TQueryResult, TFullSchema, TRelations, TSchema>) => Promise<T>,\n\t\tconfig?: PgTransactionConfig,\n\t): Promise<T>;\n}\n\nexport abstract class PgAsyncTransaction<\n\tTQueryResult extends PgQueryResultHKT,\n\tTFullSchema extends Record<string, unknown> = Record<string, never>,\n\tTRelations extends AnyRelations = EmptyRelations,\n\tTSchema extends V1.TablesRelationalConfig = V1.ExtractTablesWithRelations<TFullSchema>,\n> extends PgAsyncDatabase<TQueryResult, TFullSchema, TRelations, TSchema> {\n\tstatic override readonly [entityKind]: string = 'PgAsyncTransaction';\n\n\tconstructor(\n\t\tdialect: PgDialect,\n\t\tsession: PgAsyncSession<any, any, any, any>,\n\t\tprotected relations: TRelations,\n\t\tprotected schema: {\n\t\t\tfullSchema: Record<string, unknown>;\n\t\t\tschema: TSchema;\n\t\t\ttableNamesMap: Record<string, string>;\n\t\t} | undefined,\n\t\tprotected readonly nestedIndex = 0,\n\t\tparseRqbJson?: boolean,\n\t) {\n\t\tsuper(dialect, session, relations, schema, parseRqbJson);\n\t}\n\n\trollback(): never {\n\t\tthrow new TransactionRollbackError();\n\t}\n\n\t/** @internal */\n\tgetTransactionConfigSQL(config: PgTransactionConfig): SQL {\n\t\tconst chunks: string[] = [];\n\t\tif (config.isolationLevel) {\n\t\t\tchunks.push(`isolation level ${config.isolationLevel}`);\n\t\t}\n\t\tif (config.accessMode) {\n\t\t\tchunks.push(config.accessMode);\n\t\t}\n\t\tif (typeof config.deferrable === 'boolean') {\n\t\t\tchunks.push(config.deferrable ? 'deferrable' : 'not deferrable');\n\t\t}\n\t\treturn sql.raw(chunks.join(' '));\n\t}\n\n\tsetTransaction(config: PgTransactionConfig): Promise<void> {\n\t\treturn this.session.execute(sql`set transaction ${this.getTransactionConfigSQL(config)}`);\n\t}\n\n\tabstract override transaction<T>(\n\t\ttransaction: (tx: PgAsyncTransaction<TQueryResult, TFullSchema, TRelations, TSchema>) => Promise<T>,\n\t): Promise<T>;\n}\n\nexport async function migrate(\n\tmigrations: MigrationMeta[],\n\tsession: PgAsyncSession,\n\tconfig: string | MigrationConfig,\n): Promise<void | MigratorInitFailResponse> {\n\tconst migrationsTable = typeof config === 'string'\n\t\t? '__drizzle_migrations'\n\t\t: config.migrationsTable ?? '__drizzle_migrations';\n\tconst migrationsSchema = typeof config === 'string' ? 'drizzle' : config.migrationsSchema ?? 'drizzle';\n\tconst migrationTableCreate = sql`\n\t\t\tCREATE TABLE IF NOT EXISTS ${sql.identifier(migrationsSchema)}.${sql.identifier(migrationsTable)} (\n\t\t\t\tid SERIAL PRIMARY KEY,\n\t\t\t\thash text NOT NULL,\n\t\t\t\tcreated_at bigint\n\t\t\t)\n\t\t`;\n\tawait session.execute(sql`CREATE SCHEMA IF NOT EXISTS ${sql.identifier(migrationsSchema)}`);\n\tawait session.execute(migrationTableCreate);\n\n\tconst dbMigrations = await session.all<{ id: number; hash: string; created_at: string }>(\n\t\tsql`select id, hash, created_at from ${sql.identifier(migrationsSchema)}.${\n\t\t\tsql.identifier(migrationsTable)\n\t\t} order by created_at desc limit 1`,\n\t);\n\n\tif (typeof config === 'object' && config.init) {\n\t\tif (dbMigrations.length) {\n\t\t\treturn { exitCode: 'databaseMigrations' as const };\n\t\t}\n\n\t\tif (migrations.length > 1) {\n\t\t\treturn { exitCode: 'localMigrations' as const };\n\t\t}\n\n\t\tconst [migration] = migrations;\n\n\t\tif (!migration) return;\n\n\t\tawait session.execute(\n\t\t\tsql`insert into ${sql.identifier(migrationsSchema)}.${\n\t\t\t\tsql.identifier(migrationsTable)\n\t\t\t} (\"hash\", \"created_at\") values(${migration.hash}, ${migration.folderMillis})`,\n\t\t);\n\n\t\treturn;\n\t}\n\n\tconst lastDbMigration = dbMigrations[0];\n\tawait session.transaction(async (tx) => {\n\t\tfor (const migration of migrations) {\n\t\t\tif (\n\t\t\t\t!lastDbMigration\n\t\t\t\t|| Number(lastDbMigration.created_at) < migration.folderMillis\n\t\t\t) {\n\t\t\t\tfor (const stmt of migration.sql) {\n\t\t\t\t\tawait tx.execute(sql.raw(stmt));\n\t\t\t\t}\n\t\t\t\tawait tx.execute(\n\t\t\t\t\tsql`insert into ${sql.identifier(migrationsSchema)}.${\n\t\t\t\t\t\tsql.identifier(migrationsTable)\n\t\t\t\t\t} (\"hash\", \"created_at\") values(${migration.hash}, ${migration.folderMillis})`,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t});\n}\n"],"mappings":"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","names":[]}
|