drizzle-orm 1.0.0-beta.22-c07a16e → 1.0.0-beta.22-eaa25cd

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.
@@ -8,7 +8,7 @@ import * as Schema$1 from "effect/Schema";
8
8
  //#region src/cache/core/cache-effect.d.ts
9
9
  declare const EffectCache_base: Effect.Service.Class<EffectCache, "drizzle-orm/EffectCache", {
10
10
  readonly sync: () => {
11
- strategy: () => "all" | "explicit";
11
+ strategy: () => "explicit" | "all";
12
12
  get: (key: string, tables: string[], isTag: boolean, isAutoInvalidate?: boolean | undefined) => Effect.Effect<any[] | undefined, EffectCacheError, never>;
13
13
  put: (hashedQuery: string, response: any, tables: string[], isTag: boolean, config?: CacheConfig | undefined) => Effect.Effect<void, EffectCacheError, never>;
14
14
  onMutate: (params: MutationOption) => Effect.Effect<void, EffectCacheError, never>;
@@ -8,7 +8,7 @@ import * as Schema$1 from "effect/Schema";
8
8
  //#region src/cache/core/cache-effect.d.ts
9
9
  declare const EffectCache_base: Effect.Service.Class<EffectCache, "drizzle-orm/EffectCache", {
10
10
  readonly sync: () => {
11
- strategy: () => "all" | "explicit";
11
+ strategy: () => "explicit" | "all";
12
12
  get: (key: string, tables: string[], isTag: boolean, isAutoInvalidate?: boolean | undefined) => Effect.Effect<any[] | undefined, EffectCacheError, never>;
13
13
  put: (hashedQuery: string, response: any, tables: string[], isTag: boolean, config?: CacheConfig | undefined) => Effect.Effect<void, EffectCacheError, never>;
14
14
  onMutate: (params: MutationOption) => Effect.Effect<void, EffectCacheError, never>;
@@ -44,7 +44,7 @@ declare class UpstashCache extends Cache {
44
44
  private luaScripts;
45
45
  private internalConfig;
46
46
  constructor(redis: Redis, config?: CacheConfig, useGlobally?: boolean | undefined);
47
- strategy(): "all" | "explicit";
47
+ strategy(): "explicit" | "all";
48
48
  private toInternalConfig;
49
49
  get(key: string, tables: string[], isTag?: boolean, isAutoInvalidate?: boolean): Promise<any[] | undefined>;
50
50
  put(key: string, response: any, tables: string[], isTag?: boolean, config?: CacheConfig): Promise<void>;
@@ -44,7 +44,7 @@ declare class UpstashCache extends Cache {
44
44
  private luaScripts;
45
45
  private internalConfig;
46
46
  constructor(redis: Redis, config?: CacheConfig, useGlobally?: boolean | undefined);
47
- strategy(): "all" | "explicit";
47
+ strategy(): "explicit" | "all";
48
48
  private toInternalConfig;
49
49
  get(key: string, tables: string[], isTag?: boolean, isAutoInvalidate?: boolean): Promise<any[] | undefined>;
50
50
  put(key: string, response: any, tables: string[], isTag?: boolean, config?: CacheConfig): Promise<void>;
@@ -17,7 +17,7 @@ declare class EffectPgDatabase<TRelations extends AnyRelations = EmptyRelations>
17
17
  static readonly [entityKind]: string;
18
18
  }
19
19
  type EffectDrizzlePgConfig<TRelations extends AnyRelations = EmptyRelations> = Omit<DrizzlePgConfig<TRelations>, 'cache' | 'logger'>;
20
- declare const DefaultServices: Layer.Layer<EffectCache | EffectLogger, never, never>;
20
+ declare const DefaultServices: Layer.Layer<EffectLogger | EffectCache, never, never>;
21
21
  declare const effectPgCodecs: PartialWithUndefined<Record<__pg_core_codecs_ts0.PostgresType, Codec>>;
22
22
  /**
23
23
  * Creates an EffectPgDatabase instance.
@@ -47,7 +47,7 @@ declare const effectPgCodecs: PartialWithUndefined<Record<__pg_core_codecs_ts0.P
47
47
  */
48
48
  declare const make: <TRelations extends AnyRelations = EmptyRelations>(config?: EffectDrizzlePgConfig<TRelations> | undefined) => Effect.Effect<EffectPgDatabase<TRelations> & {
49
49
  $client: PgClient;
50
- }, never, EffectCache | EffectLogger | PgClient>;
50
+ }, never, EffectLogger | EffectCache | PgClient>;
51
51
  /**
52
52
  * Convenience function that creates an EffectPgDatabase with `DefaultServices` already provided.
53
53
  */
@@ -17,7 +17,7 @@ declare class EffectPgDatabase<TRelations extends AnyRelations = EmptyRelations>
17
17
  static readonly [entityKind]: string;
18
18
  }
19
19
  type EffectDrizzlePgConfig<TRelations extends AnyRelations = EmptyRelations> = Omit<DrizzlePgConfig<TRelations>, 'cache' | 'logger'>;
20
- declare const DefaultServices: Layer.Layer<EffectCache | EffectLogger, never, never>;
20
+ declare const DefaultServices: Layer.Layer<EffectLogger | EffectCache, never, never>;
21
21
  declare const effectPgCodecs: PartialWithUndefined<Record<__pg_core_codecs_ts0.PostgresType, Codec>>;
22
22
  /**
23
23
  * Creates an EffectPgDatabase instance.
@@ -47,7 +47,7 @@ declare const effectPgCodecs: PartialWithUndefined<Record<__pg_core_codecs_ts0.P
47
47
  */
48
48
  declare const make: <TRelations extends AnyRelations = EmptyRelations>(config?: EffectDrizzlePgConfig<TRelations> | undefined) => Effect.Effect<EffectPgDatabase<TRelations> & {
49
49
  $client: PgClient;
50
- }, never, EffectCache | EffectLogger | PgClient>;
50
+ }, never, EffectLogger | EffectCache | PgClient>;
51
51
  /**
52
52
  * Convenience function that creates an EffectPgDatabase with `DefaultServices` already provided.
53
53
  */
@@ -6,7 +6,7 @@ import * as effect_Effect0 from "effect/Effect";
6
6
  import * as _effect_sql_SqlError0 from "@effect/sql/SqlError";
7
7
 
8
8
  //#region src/effect-postgres/migrator.d.ts
9
- declare function migrate<TRelations extends AnyRelations>(db: EffectPgDatabase<TRelations>, config: MigrationConfig): effect_Effect0.Effect<undefined, EffectDrizzleQueryError | _effect_sql_SqlError0.SqlError | MigratorInitError, never>;
9
+ declare function migrate<TRelations extends AnyRelations>(db: EffectPgDatabase<TRelations>, config: MigrationConfig): effect_Effect0.Effect<undefined, MigratorInitError | EffectDrizzleQueryError | _effect_sql_SqlError0.SqlError, never>;
10
10
  //#endregion
11
11
  export { migrate };
12
12
  //# sourceMappingURL=migrator.d.cts.map
@@ -6,7 +6,7 @@ import { AnyRelations } from "../relations.js";
6
6
  import * as _effect_sql_SqlError0 from "@effect/sql/SqlError";
7
7
 
8
8
  //#region src/effect-postgres/migrator.d.ts
9
- declare function migrate<TRelations extends AnyRelations>(db: EffectPgDatabase<TRelations>, config: MigrationConfig): effect_Effect0.Effect<undefined, EffectDrizzleQueryError | _effect_sql_SqlError0.SqlError | MigratorInitError, never>;
9
+ declare function migrate<TRelations extends AnyRelations>(db: EffectPgDatabase<TRelations>, config: MigrationConfig): effect_Effect0.Effect<undefined, MigratorInitError | EffectDrizzleQueryError | _effect_sql_SqlError0.SqlError, never>;
10
10
  //#endregion
11
11
  export { migrate };
12
12
  //# sourceMappingURL=migrator.d.ts.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "drizzle-orm",
3
- "version": "1.0.0-beta.22-c07a16e",
3
+ "version": "1.0.0-beta.22-eaa25cd",
4
4
  "description": "Drizzle ORM package for SQL databases",
5
5
  "type": "module",
6
6
  "scripts": {
@@ -16,6 +16,7 @@ var PgAsyncPreparedQuery = class extends require_pg_core_session.PgBasePreparedQ
16
16
  static [__entity_ts.entityKind] = "PgAsyncPreparedQuery";
17
17
  /** @internal */
18
18
  mapper;
19
+ fastPath;
19
20
  constructor(executor, query, mapper, mode, logger, cache, queryMetadata, cacheConfig) {
20
21
  super(query);
21
22
  this.executor = executor;
@@ -30,12 +31,15 @@ var PgAsyncPreparedQuery = class extends require_pg_core_session.PgBasePreparedQ
30
31
  autoInvalidate: true
31
32
  };
32
33
  if (!this.cacheConfig?.enabled) this.cacheConfig = void 0;
34
+ this.fastPath = cacheConfig === void 0 && (cache === void 0 || (0, __entity_ts.is)(cache, __cache_core_cache_ts.NoopCache)) && !__tracing_ts.hasTelemetry;
33
35
  }
34
- execute(placeholderValues = {}) {
35
- if (this.cacheConfig === void 0 && (this.cache === void 0 || (0, __entity_ts.is)(this.cache, __cache_core_cache_ts.NoopCache)) && !__tracing_ts.hasTelemetry) {
36
- const params = this.query.params.length === 0 ? this.query.params : (0, __sql_sql_ts.fillPlaceholders)(this.query.params, placeholderValues);
37
- const p = this.executor(params);
38
- return this.mapper ? p.then(this.mapper) : p;
36
+ async execute(placeholderValues = {}) {
37
+ const { query, logger, executor, mapper, fastPath } = this;
38
+ if (fastPath) {
39
+ const params = query.params.length === 0 ? query.params : (0, __sql_sql_ts.fillPlaceholders)(query.params, placeholderValues);
40
+ logger.logQuery(query._sql ? query._sql.join(" ") : query.sql, params);
41
+ const res = await executor(params);
42
+ return mapper ? mapper(res) : res;
39
43
  }
40
44
  return __tracing_ts.tracer.startActiveSpan("drizzle.execute", async (span) => {
41
45
  const params = (0, __sql_sql_ts.fillPlaceholders)(this.query.params, placeholderValues);
@@ -1 +1 @@
1
- {"version":3,"file":"session.cjs","names":["PgBasePreparedQuery","entityKind","NoopCache","hasTelemetry","tracer","DrizzleQueryError","PgSession","PgAsyncDatabase","TransactionRollbackError","sql"],"sources":["../../../src/pg-core/async/session.ts"],"sourcesContent":["import { 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 { Logger } from '~/logger.ts';\nimport type { MigrationConfig, MigrationMeta, MigratorInitFailResponse } from '~/migrator.ts';\nimport { getMigrationsToRun } from '~/migrator.utils.ts';\nimport type { AnyRelations, EmptyRelations } from '~/relations.ts';\nimport { fillPlaceholders, type Query, type SQL, sql } from '~/sql/sql.ts';\nimport { hasTelemetry, tracer } from '~/tracing.ts';\nimport { upgradeIfNeeded } from '~/up-migrations/pg.ts';\nimport { assertUnreachable } from '~/utils.ts';\nimport type { PgDialect } from '../dialect.ts';\nimport type { PgQueryResultHKT, PgTransactionConfig, PreparedQueryConfig } from '../session.ts';\nimport { PgBasePreparedQuery, PgSession } from '../session.ts';\nimport { PgAsyncDatabase } from './db.ts';\n\nexport class PgAsyncPreparedQuery<T extends PreparedQueryConfig> extends PgBasePreparedQuery {\n\tstatic override readonly [entityKind]: string = 'PgAsyncPreparedQuery';\n\n\t/** @internal */\n\treadonly mapper: {\n\t\t(rows: any[]): any;\n\t\tbody?: string;\n\t} | undefined;\n\n\tconstructor(\n\t\tprotected executor: (params?: unknown[]) => Promise<any>,\n\t\tquery: Query,\n\t\tmapper: ((rows: any[]) => any) | undefined,\n\t\treadonly mode: 'arrays' | 'objects' | 'raw',\n\t\tprotected logger: Logger,\n\t\t// cache instance\n\t\tprotected cache: Cache | undefined,\n\t\t// per query related metadata\n\t\tprotected 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\tprotected cacheConfig: WithCacheConfig | undefined,\n\t) {\n\t\tsuper(query);\n\t\tthis.mapper = mapper;\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\toverride execute(placeholderValues: Record<string, unknown> = {}): Promise<T['execute']> {\n\t\tconst fast = this.cacheConfig === undefined\n\t\t\t&& (this.cache === undefined || is(this.cache, NoopCache))\n\t\t\t&& !hasTelemetry;\n\n\t\tif (fast) {\n\t\t\tconst params = this.query.params.length === 0\n\t\t\t\t? this.query.params\n\t\t\t\t: fillPlaceholders(this.query.params, placeholderValues);\n\t\t\tconst p = this.executor(params);\n\t\t\treturn this.mapper ? p.then(this.mapper) : p;\n\t\t}\n\n\t\treturn tracer.startActiveSpan('drizzle.execute', async (span) => {\n\t\t\tconst params = fillPlaceholders(this.query.params, placeholderValues);\n\t\t\tconst { query: { sql }, mapper } = this;\n\n\t\t\tspan?.setAttributes({\n\t\t\t\t'drizzle.query.text': sql,\n\t\t\t\t'drizzle.query.params': JSON.stringify(params),\n\t\t\t});\n\n\t\t\tthis.logger.logQuery(sql, params);\n\n\t\t\tconst query = tracer.startActiveSpan('drizzle.driver.execute', async (span) => {\n\t\t\t\tspan?.setAttributes({\n\t\t\t\t\t'drizzle.query.text': sql,\n\t\t\t\t\t'drizzle.query.params': JSON.stringify(params),\n\t\t\t\t});\n\n\t\t\t\t// return await so tracer captures time accurately\n\t\t\t\treturn await this.queryWithCache(sql, params, () => this.executor(params));\n\t\t\t});\n\n\t\t\tif (!mapper) return query;\n\n\t\t\treturn query.then((rows) => tracer.startActiveSpan('drizzle.mapResponse', () => mapper(rows as unknown[])));\n\t\t});\n\t}\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\tTRelations extends AnyRelations = EmptyRelations,\n> extends PgSession {\n\tstatic override readonly [entityKind]: string = 'PgAsyncSession';\n\n\tabstract override prepareQuery<T extends PreparedQueryConfig = PreparedQueryConfig>(\n\t\tquery: Query,\n\t\tmode: 'arrays' | 'objects' | 'raw',\n\t\tname: string | boolean,\n\t\tmapper?: (rows: any[]) => any,\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\toverride execute<T>(query: SQL): 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\t'raw',\n\t\t\t\t\tfalse,\n\t\t\t\t);\n\t\t\t});\n\n\t\t\treturn prepared.execute();\n\t\t});\n\t}\n\n\toverride arrays<T>(query: SQL): 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\t'arrays',\n\t\t\t\t\tfalse,\n\t\t\t\t);\n\t\t\t});\n\n\t\t\treturn prepared.execute();\n\t\t});\n\t}\n\n\toverride objects<T>(query: SQL): 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\t'objects',\n\t\t\t\t\tfalse,\n\t\t\t\t);\n\t\t\t});\n\n\t\t\treturn prepared.execute();\n\t\t});\n\t}\n\n\tabstract transaction<T>(\n\t\ttransaction: (tx: PgAsyncTransaction<TQueryResult, TRelations>) => Promise<T>,\n\t\tconfig?: PgTransactionConfig,\n\t): Promise<T>;\n}\n\nexport abstract class PgAsyncTransaction<\n\tTQueryResult extends PgQueryResultHKT,\n\tTRelations extends AnyRelations = EmptyRelations,\n> extends PgAsyncDatabase<TQueryResult, TRelations> {\n\tstatic override readonly [entityKind]: string = 'PgAsyncTransaction';\n\n\tconstructor(\n\t\tdialect: PgDialect,\n\t\tsession: PgAsyncSession<any, any>,\n\t\trelations: TRelations,\n\t\tprotected readonly nestedIndex = 0,\n\t\tparseRqbJson: boolean | undefined,\n\t) {\n\t\tsuper(dialect, session, relations, 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<unknown> {\n\t\treturn this.session.execute<void>(sql`set transaction ${this.getTransactionConfigSQL(config)}`);\n\t}\n\n\tabstract override transaction: <T>(\n\t\ttransaction: (tx: PgAsyncTransaction<TQueryResult, TRelations>) => Promise<T>,\n\t) => Promise<T>;\n}\n\nexport async function migrate(\n\tmigrations: MigrationMeta[],\n\tdb: PgAsyncDatabase<PgQueryResultHKT, any>,\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\n\tawait db.execute(sql`CREATE SCHEMA IF NOT EXISTS ${sql.identifier(migrationsSchema)}`);\n\n\t// Detect DB version and upgrade table schema if needed\n\tconst { newDb } = await upgradeIfNeeded(migrationsSchema, migrationsTable, db, migrations);\n\n\t// Create table with latest schema (version 1) if this is a new database\n\tif (newDb) {\n\t\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\tname text,\n\t\t\t\tapplied_at timestamp with time zone DEFAULT now()\n\t\t\t)\n\t\t`;\n\t\tawait db.execute(migrationTableCreate);\n\t}\n\n\tconst dbMigrations = await db.session.objects<{ id: number; hash: string; created_at: string; name: string }>(\n\t\tsql`select id, hash, created_at, name from ${sql.identifier(migrationsSchema)}.${sql.identifier(migrationsTable)}`,\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 db.execute(\n\t\t\tsql`insert into ${sql.identifier(migrationsSchema)}.${\n\t\t\t\tsql.identifier(migrationsTable)\n\t\t\t} (\"hash\", \"created_at\", \"name\") values(${migration.hash}, ${migration.folderMillis}, ${migration.name ?? null})`,\n\t\t);\n\n\t\treturn;\n\t}\n\n\tconst migrationsToRun = getMigrationsToRun({ localMigrations: migrations, dbMigrations });\n\tawait db.transaction(async (tx) => {\n\t\tfor (const migration of migrationsToRun) {\n\t\t\tfor (const stmt of migration.sql) {\n\t\t\t\tawait tx.execute(sql.raw(stmt));\n\t\t\t}\n\t\t\tawait tx.execute(\n\t\t\t\tsql`insert into ${sql.identifier(migrationsSchema)}.${\n\t\t\t\t\tsql.identifier(migrationsTable)\n\t\t\t\t} (\"hash\", \"created_at\", \"name\") values(${migration.hash}, ${migration.folderMillis}, ${\n\t\t\t\t\tmigration.name ?? null\n\t\t\t\t})`,\n\t\t\t);\n\t\t}\n\t});\n}\n"],"mappings":";;;;;;;;;;;;;;AAmBA,IAAa,uBAAb,cAAyEA,4CAAoB;CAC5F,QAA0BC,0BAAsB;;CAGhD,AAAS;CAKT,YACC,AAAU,UACV,OACA,QACA,AAAS,MACT,AAAU,QAEV,AAAU,OAEV,AAAU,eAKV,AAAU,aACT;AACD,QAAM,MAAM;EAfF;EAGD;EACC;EAEA;EAEA;EAKA;AAGV,OAAK,SAAS;AACd,MAAI,SAAS,MAAM,UAAU,KAAK,SAAS,gBAAgB,OAC1D,MAAK,cAAc;GAAE,SAAS;GAAM,gBAAgB;GAAM;AAE3D,MAAI,CAAC,KAAK,aAAa,QACtB,MAAK,cAAc;;CAIrB,AAAS,QAAQ,oBAA6C,EAAE,EAAyB;AAKxF,MAJa,KAAK,gBAAgB,WAC7B,KAAK,UAAU,8BAAgB,KAAK,OAAOC,gCAAU,KACtD,CAACC,2BAEK;GACT,MAAM,SAAS,KAAK,MAAM,OAAO,WAAW,IACzC,KAAK,MAAM,4CACM,KAAK,MAAM,QAAQ,kBAAkB;GACzD,MAAM,IAAI,KAAK,SAAS,OAAO;AAC/B,UAAO,KAAK,SAAS,EAAE,KAAK,KAAK,OAAO,GAAG;;AAG5C,SAAOC,oBAAO,gBAAgB,mBAAmB,OAAO,SAAS;GAChE,MAAM,4CAA0B,KAAK,MAAM,QAAQ,kBAAkB;GACrE,MAAM,EAAE,OAAO,EAAE,OAAO,WAAW;AAEnC,SAAM,cAAc;IACnB,sBAAsB;IACtB,wBAAwB,KAAK,UAAU,OAAO;IAC9C,CAAC;AAEF,QAAK,OAAO,SAAS,KAAK,OAAO;GAEjC,MAAM,QAAQA,oBAAO,gBAAgB,0BAA0B,OAAO,SAAS;AAC9E,UAAM,cAAc;KACnB,sBAAsB;KACtB,wBAAwB,KAAK,UAAU,OAAO;KAC9C,CAAC;AAGF,WAAO,MAAM,KAAK,eAAe,KAAK,cAAc,KAAK,SAAS,OAAO,CAAC;KACzE;AAEF,OAAI,CAAC,OAAQ,QAAO;AAEpB,UAAO,MAAM,MAAM,SAASA,oBAAO,gBAAgB,6BAA6B,OAAO,KAAkB,CAAC,CAAC;IAC1G;;;CAIH,MAAgB,eACf,aACA,QACA,OACa;EACb,MAAM,aAAa,KAAK,UAAU,UAAa,qBAAI,KAAK,OAAOF,gCAAU,GACtE,6CAAkB,aAAa,QAAQ,KAAK,eAAe,KAAK,YAAY,GAC5E,EAAE,MAAM,QAAiB;AAE5B,MAAI,WAAW,SAAS,OACvB,QAAO,OAAO,CAAC,OAAO,MAAM;AAC3B,SAAM,IAAIG,8BAAkB,aAAa,QAAQ,EAAW;IAC3D;EAGH,MAAM,QAAQ,KAAK;AAGnB,MAAI,WAAW,SAAS,aACvB,QAAO,QAAQ,IAAI,CAClB,OAAO,EACP,MAAM,SAAS,EAAE,QAAQ,WAAW,QAAQ,CAAC,CAC7C,CAAC,CAAC,MAAM,QAAQ,IAAI,GAAG,CAAC,OAAO,MAAM;AACrC,SAAM,IAAIA,8BAAkB,aAAa,QAAQ,EAAW;IAC3D;AAGH,MAAI,WAAW,SAAS,OAAO;GAC9B,MAAM,EAAE,QAAQ,KAAK,OAAO,gBAAgB,WAAW;GACvD,MAAM,YAAY,MAAM,MAAM,IAC7B,KACA,QACA,OACA,eACA;AAED,OAAI,cAAc,QAAW;IAC5B,MAAM,SAAS,MAAM,OAAO,CAAC,OAAO,MAAM;AACzC,WAAM,IAAIA,8BAAkB,aAAa,QAAQ,EAAW;MAC3D;AAEF,UAAM,MAAM,IACX,KACA,QAEA,iBAAiB,SAAS,EAAE,EAC5B,OACA,OACA;AAED,WAAO;;AAGR,UAAO;;AAGR,oCAAkB,WAAW;;;AAI/B,IAAsB,iBAAtB,cAGUC,kCAAU;CACnB,QAA0BL,0BAAsB;CAchD,AAAS,QAAW,OAA0B;AAC7C,SAAOG,oBAAO,gBAAgB,2BAA2B;AASxD,UARiBA,oBAAO,gBAAgB,8BAA8B;AACrE,WAAO,KAAK,aACX,KAAK,QAAQ,WAAW,MAAM,EAC9B,OACA,MACA;KACA,CAEc,SAAS;IACxB;;CAGH,AAAS,OAAU,OAA0B;AAC5C,SAAOA,oBAAO,gBAAgB,2BAA2B;AASxD,UARiBA,oBAAO,gBAAgB,8BAA8B;AACrE,WAAO,KAAK,aACX,KAAK,QAAQ,WAAW,MAAM,EAC9B,UACA,MACA;KACA,CAEc,SAAS;IACxB;;CAGH,AAAS,QAAW,OAA0B;AAC7C,SAAOA,oBAAO,gBAAgB,2BAA2B;AASxD,UARiBA,oBAAO,gBAAgB,8BAA8B;AACrE,WAAO,KAAK,aACX,KAAK,QAAQ,WAAW,MAAM,EAC9B,WACA,MACA;KACA,CAEc,SAAS;IACxB;;;AASJ,IAAsB,qBAAtB,cAGUG,yCAA0C;CACnD,QAA0BN,0BAAsB;CAEhD,YACC,SACA,SACA,WACA,AAAmB,cAAc,GACjC,cACC;AACD,QAAM,SAAS,SAAS,WAAW,aAAa;EAH7B;;CAMpB,WAAkB;AACjB,QAAM,IAAIO,sCAA0B;;;CAIrC,wBAAwB,QAAkC;EACzD,MAAM,SAAmB,EAAE;AAC3B,MAAI,OAAO,eACV,QAAO,KAAK,mBAAmB,OAAO,iBAAiB;AAExD,MAAI,OAAO,WACV,QAAO,KAAK,OAAO,WAAW;AAE/B,MAAI,OAAO,OAAO,eAAe,UAChC,QAAO,KAAK,OAAO,aAAa,eAAe,iBAAiB;AAEjE,SAAOC,iBAAI,IAAI,OAAO,KAAK,IAAI,CAAC;;CAGjC,eAAe,QAA+C;AAC7D,SAAO,KAAK,QAAQ,QAAc,gBAAG,mBAAmB,KAAK,wBAAwB,OAAO,GAAG;;;AAQjG,eAAsB,QACrB,YACA,IACA,QAC2C;CAC3C,MAAM,kBAAkB,OAAO,WAAW,WACvC,yBACA,OAAO,mBAAmB;CAC7B,MAAM,mBAAmB,OAAO,WAAW,WAAW,YAAY,OAAO,oBAAoB;AAE7F,OAAM,GAAG,QAAQ,gBAAG,+BAA+BA,iBAAI,WAAW,iBAAiB,GAAG;CAGtF,MAAM,EAAE,UAAU,iDAAsB,kBAAkB,iBAAiB,IAAI,WAAW;AAG1F,KAAI,OAAO;EACV,MAAM,uBAAuB,gBAAG;gCACFA,iBAAI,WAAW,iBAAiB,CAAC,GAAGA,iBAAI,WAAW,gBAAgB,CAAC;;;;;;;;AAQlG,QAAM,GAAG,QAAQ,qBAAqB;;CAGvC,MAAM,eAAe,MAAM,GAAG,QAAQ,QACrC,gBAAG,0CAA0CA,iBAAI,WAAW,iBAAiB,CAAC,GAAGA,iBAAI,WAAW,gBAAgB,GAChH;AAED,KAAI,OAAO,WAAW,YAAY,OAAO,MAAM;AAC9C,MAAI,aAAa,OAChB,QAAO,EAAE,UAAU,sBAA+B;AAGnD,MAAI,WAAW,SAAS,EACvB,QAAO,EAAE,UAAU,mBAA4B;EAGhD,MAAM,CAAC,aAAa;AAEpB,MAAI,CAAC,UAAW;AAEhB,QAAM,GAAG,QACR,gBAAG,eAAeA,iBAAI,WAAW,iBAAiB,CAAC,GAClDA,iBAAI,WAAW,gBAAgB,CAC/B,yCAAyC,UAAU,KAAK,IAAI,UAAU,aAAa,IAAI,UAAU,QAAQ,KAAK,GAC/G;AAED;;CAGD,MAAM,8DAAqC;EAAE,iBAAiB;EAAY;EAAc,CAAC;AACzF,OAAM,GAAG,YAAY,OAAO,OAAO;AAClC,OAAK,MAAM,aAAa,iBAAiB;AACxC,QAAK,MAAM,QAAQ,UAAU,IAC5B,OAAM,GAAG,QAAQA,iBAAI,IAAI,KAAK,CAAC;AAEhC,SAAM,GAAG,QACR,gBAAG,eAAeA,iBAAI,WAAW,iBAAiB,CAAC,GAClDA,iBAAI,WAAW,gBAAgB,CAC/B,yCAAyC,UAAU,KAAK,IAAI,UAAU,aAAa,IACnF,UAAU,QAAQ,KAClB,GACD;;GAED"}
1
+ {"version":3,"file":"session.cjs","names":["PgBasePreparedQuery","entityKind","NoopCache","hasTelemetry","tracer","DrizzleQueryError","PgSession","PgAsyncDatabase","TransactionRollbackError","sql"],"sources":["../../../src/pg-core/async/session.ts"],"sourcesContent":["import { 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 { Logger } from '~/logger.ts';\nimport type { MigrationConfig, MigrationMeta, MigratorInitFailResponse } from '~/migrator.ts';\nimport { getMigrationsToRun } from '~/migrator.utils.ts';\nimport type { AnyRelations, EmptyRelations } from '~/relations.ts';\nimport { fillPlaceholders, type Query, type SQL, sql } from '~/sql/sql.ts';\nimport { hasTelemetry, tracer } from '~/tracing.ts';\nimport { upgradeIfNeeded } from '~/up-migrations/pg.ts';\nimport { assertUnreachable } from '~/utils.ts';\nimport type { PgDialect } from '../dialect.ts';\nimport type { PgQueryResultHKT, PgTransactionConfig, PreparedQueryConfig } from '../session.ts';\nimport { PgBasePreparedQuery, PgSession } from '../session.ts';\nimport { PgAsyncDatabase } from './db.ts';\n\nexport class PgAsyncPreparedQuery<T extends PreparedQueryConfig> extends PgBasePreparedQuery {\n\tstatic override readonly [entityKind]: string = 'PgAsyncPreparedQuery';\n\n\t/** @internal */\n\treadonly mapper: {\n\t\t(rows: any[]): any;\n\t\tbody?: string;\n\t} | undefined;\n\n\tprivate fastPath: boolean;\n\n\tconstructor(\n\t\tprotected executor: (params?: unknown[]) => Promise<any>,\n\t\tquery: Query,\n\t\tmapper: ((rows: any[]) => any) | undefined,\n\t\treadonly mode: 'arrays' | 'objects' | 'raw',\n\t\tprotected logger: Logger,\n\t\t// cache instance\n\t\tprotected cache: Cache | undefined,\n\t\t// per query related metadata\n\t\tprotected 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\tprotected cacheConfig: WithCacheConfig | undefined,\n\t) {\n\t\tsuper(query);\n\t\tthis.mapper = mapper;\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\n\t\tthis.fastPath = cacheConfig === undefined\n\t\t\t&& (cache === undefined || is(cache, NoopCache))\n\t\t\t&& !hasTelemetry;\n\t}\n\n\toverride async execute(placeholderValues: Record<string, unknown> = {}): Promise<T['execute']> {\n\t\tconst { query, logger, executor, mapper, fastPath } = this;\n\n\t\tif (fastPath) {\n\t\t\tconst params = query.params.length === 0\n\t\t\t\t? query.params\n\t\t\t\t: fillPlaceholders(query.params, placeholderValues);\n\t\t\tlogger.logQuery(query._sql ? query._sql.join(' ') : query.sql, params);\n\t\t\tconst res = await executor(params);\n\t\t\treturn mapper ? mapper(res) : res;\n\t\t}\n\n\t\treturn tracer.startActiveSpan('drizzle.execute', async (span) => {\n\t\t\tconst params = fillPlaceholders(this.query.params, placeholderValues);\n\t\t\tconst { query: { sql }, mapper } = this;\n\n\t\t\tspan?.setAttributes({\n\t\t\t\t'drizzle.query.text': sql,\n\t\t\t\t'drizzle.query.params': JSON.stringify(params),\n\t\t\t});\n\n\t\t\tthis.logger.logQuery(sql, params);\n\n\t\t\tconst query = tracer.startActiveSpan('drizzle.driver.execute', async (span) => {\n\t\t\t\tspan?.setAttributes({\n\t\t\t\t\t'drizzle.query.text': sql,\n\t\t\t\t\t'drizzle.query.params': JSON.stringify(params),\n\t\t\t\t});\n\n\t\t\t\t// return await so tracer captures time accurately\n\t\t\t\treturn await this.queryWithCache(sql, params, () => this.executor(params));\n\t\t\t});\n\n\t\t\tif (!mapper) return query;\n\n\t\t\treturn query.then((rows) => tracer.startActiveSpan('drizzle.mapResponse', () => mapper(rows as unknown[])));\n\t\t});\n\t}\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\tTRelations extends AnyRelations = EmptyRelations,\n> extends PgSession {\n\tstatic override readonly [entityKind]: string = 'PgAsyncSession';\n\n\tabstract override prepareQuery<T extends PreparedQueryConfig = PreparedQueryConfig>(\n\t\tquery: Query,\n\t\tmode: 'arrays' | 'objects' | 'raw',\n\t\tname: string | boolean,\n\t\tmapper?: (rows: any[]) => any,\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\toverride execute<T>(query: SQL): 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\t'raw',\n\t\t\t\t\tfalse,\n\t\t\t\t);\n\t\t\t});\n\n\t\t\treturn prepared.execute();\n\t\t});\n\t}\n\n\toverride arrays<T>(query: SQL): 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\t'arrays',\n\t\t\t\t\tfalse,\n\t\t\t\t);\n\t\t\t});\n\n\t\t\treturn prepared.execute();\n\t\t});\n\t}\n\n\toverride objects<T>(query: SQL): 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\t'objects',\n\t\t\t\t\tfalse,\n\t\t\t\t);\n\t\t\t});\n\n\t\t\treturn prepared.execute();\n\t\t});\n\t}\n\n\tabstract transaction<T>(\n\t\ttransaction: (tx: PgAsyncTransaction<TQueryResult, TRelations>) => Promise<T>,\n\t\tconfig?: PgTransactionConfig,\n\t): Promise<T>;\n}\n\nexport abstract class PgAsyncTransaction<\n\tTQueryResult extends PgQueryResultHKT,\n\tTRelations extends AnyRelations = EmptyRelations,\n> extends PgAsyncDatabase<TQueryResult, TRelations> {\n\tstatic override readonly [entityKind]: string = 'PgAsyncTransaction';\n\n\tconstructor(\n\t\tdialect: PgDialect,\n\t\tsession: PgAsyncSession<any, any>,\n\t\trelations: TRelations,\n\t\tprotected readonly nestedIndex = 0,\n\t\tparseRqbJson: boolean | undefined,\n\t) {\n\t\tsuper(dialect, session, relations, 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<unknown> {\n\t\treturn this.session.execute<void>(sql`set transaction ${this.getTransactionConfigSQL(config)}`);\n\t}\n\n\tabstract override transaction: <T>(\n\t\ttransaction: (tx: PgAsyncTransaction<TQueryResult, TRelations>) => Promise<T>,\n\t) => Promise<T>;\n}\n\nexport async function migrate(\n\tmigrations: MigrationMeta[],\n\tdb: PgAsyncDatabase<PgQueryResultHKT, any>,\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\n\tawait db.execute(sql`CREATE SCHEMA IF NOT EXISTS ${sql.identifier(migrationsSchema)}`);\n\n\t// Detect DB version and upgrade table schema if needed\n\tconst { newDb } = await upgradeIfNeeded(migrationsSchema, migrationsTable, db, migrations);\n\n\t// Create table with latest schema (version 1) if this is a new database\n\tif (newDb) {\n\t\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\tname text,\n\t\t\t\tapplied_at timestamp with time zone DEFAULT now()\n\t\t\t)\n\t\t`;\n\t\tawait db.execute(migrationTableCreate);\n\t}\n\n\tconst dbMigrations = await db.session.objects<{ id: number; hash: string; created_at: string; name: string }>(\n\t\tsql`select id, hash, created_at, name from ${sql.identifier(migrationsSchema)}.${sql.identifier(migrationsTable)}`,\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 db.execute(\n\t\t\tsql`insert into ${sql.identifier(migrationsSchema)}.${\n\t\t\t\tsql.identifier(migrationsTable)\n\t\t\t} (\"hash\", \"created_at\", \"name\") values(${migration.hash}, ${migration.folderMillis}, ${migration.name ?? null})`,\n\t\t);\n\n\t\treturn;\n\t}\n\n\tconst migrationsToRun = getMigrationsToRun({ localMigrations: migrations, dbMigrations });\n\tawait db.transaction(async (tx) => {\n\t\tfor (const migration of migrationsToRun) {\n\t\t\tfor (const stmt of migration.sql) {\n\t\t\t\tawait tx.execute(sql.raw(stmt));\n\t\t\t}\n\t\t\tawait tx.execute(\n\t\t\t\tsql`insert into ${sql.identifier(migrationsSchema)}.${\n\t\t\t\t\tsql.identifier(migrationsTable)\n\t\t\t\t} (\"hash\", \"created_at\", \"name\") values(${migration.hash}, ${migration.folderMillis}, ${\n\t\t\t\t\tmigration.name ?? null\n\t\t\t\t})`,\n\t\t\t);\n\t\t}\n\t});\n}\n"],"mappings":"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"}
@@ -21,6 +21,7 @@ declare class PgAsyncPreparedQuery<T extends PreparedQueryConfig> extends PgBase
21
21
  } | undefined;
22
22
  protected cacheConfig: WithCacheConfig | undefined;
23
23
  static readonly [entityKind]: string;
24
+ private fastPath;
24
25
  constructor(executor: (params?: unknown[]) => Promise<any>, query: Query, mapper: ((rows: any[]) => any) | undefined, mode: 'arrays' | 'objects' | 'raw', logger: Logger, cache: Cache | undefined, queryMetadata: {
25
26
  type: 'select' | 'update' | 'delete' | 'insert';
26
27
  tables: string[];
@@ -21,6 +21,7 @@ declare class PgAsyncPreparedQuery<T extends PreparedQueryConfig> extends PgBase
21
21
  } | undefined;
22
22
  protected cacheConfig: WithCacheConfig | undefined;
23
23
  static readonly [entityKind]: string;
24
+ private fastPath;
24
25
  constructor(executor: (params?: unknown[]) => Promise<any>, query: Query, mapper: ((rows: any[]) => any) | undefined, mode: 'arrays' | 'objects' | 'raw', logger: Logger, cache: Cache | undefined, queryMetadata: {
25
26
  type: 'select' | 'update' | 'delete' | 'insert';
26
27
  tables: string[];
@@ -14,6 +14,7 @@ var PgAsyncPreparedQuery = class extends PgBasePreparedQuery {
14
14
  static [entityKind] = "PgAsyncPreparedQuery";
15
15
  /** @internal */
16
16
  mapper;
17
+ fastPath;
17
18
  constructor(executor, query, mapper, mode, logger, cache, queryMetadata, cacheConfig) {
18
19
  super(query);
19
20
  this.executor = executor;
@@ -28,12 +29,15 @@ var PgAsyncPreparedQuery = class extends PgBasePreparedQuery {
28
29
  autoInvalidate: true
29
30
  };
30
31
  if (!this.cacheConfig?.enabled) this.cacheConfig = void 0;
32
+ this.fastPath = cacheConfig === void 0 && (cache === void 0 || is(cache, NoopCache)) && !hasTelemetry;
31
33
  }
32
- execute(placeholderValues = {}) {
33
- if (this.cacheConfig === void 0 && (this.cache === void 0 || is(this.cache, NoopCache)) && !hasTelemetry) {
34
- const params = this.query.params.length === 0 ? this.query.params : fillPlaceholders(this.query.params, placeholderValues);
35
- const p = this.executor(params);
36
- return this.mapper ? p.then(this.mapper) : p;
34
+ async execute(placeholderValues = {}) {
35
+ const { query, logger, executor, mapper, fastPath } = this;
36
+ if (fastPath) {
37
+ const params = query.params.length === 0 ? query.params : fillPlaceholders(query.params, placeholderValues);
38
+ logger.logQuery(query._sql ? query._sql.join(" ") : query.sql, params);
39
+ const res = await executor(params);
40
+ return mapper ? mapper(res) : res;
37
41
  }
38
42
  return tracer.startActiveSpan("drizzle.execute", async (span) => {
39
43
  const params = fillPlaceholders(this.query.params, placeholderValues);
@@ -1 +1 @@
1
- {"version":3,"file":"session.js","names":[],"sources":["../../../src/pg-core/async/session.ts"],"sourcesContent":["import { 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 { Logger } from '~/logger.ts';\nimport type { MigrationConfig, MigrationMeta, MigratorInitFailResponse } from '~/migrator.ts';\nimport { getMigrationsToRun } from '~/migrator.utils.ts';\nimport type { AnyRelations, EmptyRelations } from '~/relations.ts';\nimport { fillPlaceholders, type Query, type SQL, sql } from '~/sql/sql.ts';\nimport { hasTelemetry, tracer } from '~/tracing.ts';\nimport { upgradeIfNeeded } from '~/up-migrations/pg.ts';\nimport { assertUnreachable } from '~/utils.ts';\nimport type { PgDialect } from '../dialect.ts';\nimport type { PgQueryResultHKT, PgTransactionConfig, PreparedQueryConfig } from '../session.ts';\nimport { PgBasePreparedQuery, PgSession } from '../session.ts';\nimport { PgAsyncDatabase } from './db.ts';\n\nexport class PgAsyncPreparedQuery<T extends PreparedQueryConfig> extends PgBasePreparedQuery {\n\tstatic override readonly [entityKind]: string = 'PgAsyncPreparedQuery';\n\n\t/** @internal */\n\treadonly mapper: {\n\t\t(rows: any[]): any;\n\t\tbody?: string;\n\t} | undefined;\n\n\tconstructor(\n\t\tprotected executor: (params?: unknown[]) => Promise<any>,\n\t\tquery: Query,\n\t\tmapper: ((rows: any[]) => any) | undefined,\n\t\treadonly mode: 'arrays' | 'objects' | 'raw',\n\t\tprotected logger: Logger,\n\t\t// cache instance\n\t\tprotected cache: Cache | undefined,\n\t\t// per query related metadata\n\t\tprotected 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\tprotected cacheConfig: WithCacheConfig | undefined,\n\t) {\n\t\tsuper(query);\n\t\tthis.mapper = mapper;\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\toverride execute(placeholderValues: Record<string, unknown> = {}): Promise<T['execute']> {\n\t\tconst fast = this.cacheConfig === undefined\n\t\t\t&& (this.cache === undefined || is(this.cache, NoopCache))\n\t\t\t&& !hasTelemetry;\n\n\t\tif (fast) {\n\t\t\tconst params = this.query.params.length === 0\n\t\t\t\t? this.query.params\n\t\t\t\t: fillPlaceholders(this.query.params, placeholderValues);\n\t\t\tconst p = this.executor(params);\n\t\t\treturn this.mapper ? p.then(this.mapper) : p;\n\t\t}\n\n\t\treturn tracer.startActiveSpan('drizzle.execute', async (span) => {\n\t\t\tconst params = fillPlaceholders(this.query.params, placeholderValues);\n\t\t\tconst { query: { sql }, mapper } = this;\n\n\t\t\tspan?.setAttributes({\n\t\t\t\t'drizzle.query.text': sql,\n\t\t\t\t'drizzle.query.params': JSON.stringify(params),\n\t\t\t});\n\n\t\t\tthis.logger.logQuery(sql, params);\n\n\t\t\tconst query = tracer.startActiveSpan('drizzle.driver.execute', async (span) => {\n\t\t\t\tspan?.setAttributes({\n\t\t\t\t\t'drizzle.query.text': sql,\n\t\t\t\t\t'drizzle.query.params': JSON.stringify(params),\n\t\t\t\t});\n\n\t\t\t\t// return await so tracer captures time accurately\n\t\t\t\treturn await this.queryWithCache(sql, params, () => this.executor(params));\n\t\t\t});\n\n\t\t\tif (!mapper) return query;\n\n\t\t\treturn query.then((rows) => tracer.startActiveSpan('drizzle.mapResponse', () => mapper(rows as unknown[])));\n\t\t});\n\t}\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\tTRelations extends AnyRelations = EmptyRelations,\n> extends PgSession {\n\tstatic override readonly [entityKind]: string = 'PgAsyncSession';\n\n\tabstract override prepareQuery<T extends PreparedQueryConfig = PreparedQueryConfig>(\n\t\tquery: Query,\n\t\tmode: 'arrays' | 'objects' | 'raw',\n\t\tname: string | boolean,\n\t\tmapper?: (rows: any[]) => any,\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\toverride execute<T>(query: SQL): 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\t'raw',\n\t\t\t\t\tfalse,\n\t\t\t\t);\n\t\t\t});\n\n\t\t\treturn prepared.execute();\n\t\t});\n\t}\n\n\toverride arrays<T>(query: SQL): 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\t'arrays',\n\t\t\t\t\tfalse,\n\t\t\t\t);\n\t\t\t});\n\n\t\t\treturn prepared.execute();\n\t\t});\n\t}\n\n\toverride objects<T>(query: SQL): 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\t'objects',\n\t\t\t\t\tfalse,\n\t\t\t\t);\n\t\t\t});\n\n\t\t\treturn prepared.execute();\n\t\t});\n\t}\n\n\tabstract transaction<T>(\n\t\ttransaction: (tx: PgAsyncTransaction<TQueryResult, TRelations>) => Promise<T>,\n\t\tconfig?: PgTransactionConfig,\n\t): Promise<T>;\n}\n\nexport abstract class PgAsyncTransaction<\n\tTQueryResult extends PgQueryResultHKT,\n\tTRelations extends AnyRelations = EmptyRelations,\n> extends PgAsyncDatabase<TQueryResult, TRelations> {\n\tstatic override readonly [entityKind]: string = 'PgAsyncTransaction';\n\n\tconstructor(\n\t\tdialect: PgDialect,\n\t\tsession: PgAsyncSession<any, any>,\n\t\trelations: TRelations,\n\t\tprotected readonly nestedIndex = 0,\n\t\tparseRqbJson: boolean | undefined,\n\t) {\n\t\tsuper(dialect, session, relations, 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<unknown> {\n\t\treturn this.session.execute<void>(sql`set transaction ${this.getTransactionConfigSQL(config)}`);\n\t}\n\n\tabstract override transaction: <T>(\n\t\ttransaction: (tx: PgAsyncTransaction<TQueryResult, TRelations>) => Promise<T>,\n\t) => Promise<T>;\n}\n\nexport async function migrate(\n\tmigrations: MigrationMeta[],\n\tdb: PgAsyncDatabase<PgQueryResultHKT, any>,\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\n\tawait db.execute(sql`CREATE SCHEMA IF NOT EXISTS ${sql.identifier(migrationsSchema)}`);\n\n\t// Detect DB version and upgrade table schema if needed\n\tconst { newDb } = await upgradeIfNeeded(migrationsSchema, migrationsTable, db, migrations);\n\n\t// Create table with latest schema (version 1) if this is a new database\n\tif (newDb) {\n\t\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\tname text,\n\t\t\t\tapplied_at timestamp with time zone DEFAULT now()\n\t\t\t)\n\t\t`;\n\t\tawait db.execute(migrationTableCreate);\n\t}\n\n\tconst dbMigrations = await db.session.objects<{ id: number; hash: string; created_at: string; name: string }>(\n\t\tsql`select id, hash, created_at, name from ${sql.identifier(migrationsSchema)}.${sql.identifier(migrationsTable)}`,\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 db.execute(\n\t\t\tsql`insert into ${sql.identifier(migrationsSchema)}.${\n\t\t\t\tsql.identifier(migrationsTable)\n\t\t\t} (\"hash\", \"created_at\", \"name\") values(${migration.hash}, ${migration.folderMillis}, ${migration.name ?? null})`,\n\t\t);\n\n\t\treturn;\n\t}\n\n\tconst migrationsToRun = getMigrationsToRun({ localMigrations: migrations, dbMigrations });\n\tawait db.transaction(async (tx) => {\n\t\tfor (const migration of migrationsToRun) {\n\t\t\tfor (const stmt of migration.sql) {\n\t\t\t\tawait tx.execute(sql.raw(stmt));\n\t\t\t}\n\t\t\tawait tx.execute(\n\t\t\t\tsql`insert into ${sql.identifier(migrationsSchema)}.${\n\t\t\t\t\tsql.identifier(migrationsTable)\n\t\t\t\t} (\"hash\", \"created_at\", \"name\") values(${migration.hash}, ${migration.folderMillis}, ${\n\t\t\t\t\tmigration.name ?? null\n\t\t\t\t})`,\n\t\t\t);\n\t\t}\n\t});\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"session.js","names":[],"sources":["../../../src/pg-core/async/session.ts"],"sourcesContent":["import { 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 { Logger } from '~/logger.ts';\nimport type { MigrationConfig, MigrationMeta, MigratorInitFailResponse } from '~/migrator.ts';\nimport { getMigrationsToRun } from '~/migrator.utils.ts';\nimport type { AnyRelations, EmptyRelations } from '~/relations.ts';\nimport { fillPlaceholders, type Query, type SQL, sql } from '~/sql/sql.ts';\nimport { hasTelemetry, tracer } from '~/tracing.ts';\nimport { upgradeIfNeeded } from '~/up-migrations/pg.ts';\nimport { assertUnreachable } from '~/utils.ts';\nimport type { PgDialect } from '../dialect.ts';\nimport type { PgQueryResultHKT, PgTransactionConfig, PreparedQueryConfig } from '../session.ts';\nimport { PgBasePreparedQuery, PgSession } from '../session.ts';\nimport { PgAsyncDatabase } from './db.ts';\n\nexport class PgAsyncPreparedQuery<T extends PreparedQueryConfig> extends PgBasePreparedQuery {\n\tstatic override readonly [entityKind]: string = 'PgAsyncPreparedQuery';\n\n\t/** @internal */\n\treadonly mapper: {\n\t\t(rows: any[]): any;\n\t\tbody?: string;\n\t} | undefined;\n\n\tprivate fastPath: boolean;\n\n\tconstructor(\n\t\tprotected executor: (params?: unknown[]) => Promise<any>,\n\t\tquery: Query,\n\t\tmapper: ((rows: any[]) => any) | undefined,\n\t\treadonly mode: 'arrays' | 'objects' | 'raw',\n\t\tprotected logger: Logger,\n\t\t// cache instance\n\t\tprotected cache: Cache | undefined,\n\t\t// per query related metadata\n\t\tprotected 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\tprotected cacheConfig: WithCacheConfig | undefined,\n\t) {\n\t\tsuper(query);\n\t\tthis.mapper = mapper;\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\n\t\tthis.fastPath = cacheConfig === undefined\n\t\t\t&& (cache === undefined || is(cache, NoopCache))\n\t\t\t&& !hasTelemetry;\n\t}\n\n\toverride async execute(placeholderValues: Record<string, unknown> = {}): Promise<T['execute']> {\n\t\tconst { query, logger, executor, mapper, fastPath } = this;\n\n\t\tif (fastPath) {\n\t\t\tconst params = query.params.length === 0\n\t\t\t\t? query.params\n\t\t\t\t: fillPlaceholders(query.params, placeholderValues);\n\t\t\tlogger.logQuery(query._sql ? query._sql.join(' ') : query.sql, params);\n\t\t\tconst res = await executor(params);\n\t\t\treturn mapper ? mapper(res) : res;\n\t\t}\n\n\t\treturn tracer.startActiveSpan('drizzle.execute', async (span) => {\n\t\t\tconst params = fillPlaceholders(this.query.params, placeholderValues);\n\t\t\tconst { query: { sql }, mapper } = this;\n\n\t\t\tspan?.setAttributes({\n\t\t\t\t'drizzle.query.text': sql,\n\t\t\t\t'drizzle.query.params': JSON.stringify(params),\n\t\t\t});\n\n\t\t\tthis.logger.logQuery(sql, params);\n\n\t\t\tconst query = tracer.startActiveSpan('drizzle.driver.execute', async (span) => {\n\t\t\t\tspan?.setAttributes({\n\t\t\t\t\t'drizzle.query.text': sql,\n\t\t\t\t\t'drizzle.query.params': JSON.stringify(params),\n\t\t\t\t});\n\n\t\t\t\t// return await so tracer captures time accurately\n\t\t\t\treturn await this.queryWithCache(sql, params, () => this.executor(params));\n\t\t\t});\n\n\t\t\tif (!mapper) return query;\n\n\t\t\treturn query.then((rows) => tracer.startActiveSpan('drizzle.mapResponse', () => mapper(rows as unknown[])));\n\t\t});\n\t}\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\tTRelations extends AnyRelations = EmptyRelations,\n> extends PgSession {\n\tstatic override readonly [entityKind]: string = 'PgAsyncSession';\n\n\tabstract override prepareQuery<T extends PreparedQueryConfig = PreparedQueryConfig>(\n\t\tquery: Query,\n\t\tmode: 'arrays' | 'objects' | 'raw',\n\t\tname: string | boolean,\n\t\tmapper?: (rows: any[]) => any,\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\toverride execute<T>(query: SQL): 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\t'raw',\n\t\t\t\t\tfalse,\n\t\t\t\t);\n\t\t\t});\n\n\t\t\treturn prepared.execute();\n\t\t});\n\t}\n\n\toverride arrays<T>(query: SQL): 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\t'arrays',\n\t\t\t\t\tfalse,\n\t\t\t\t);\n\t\t\t});\n\n\t\t\treturn prepared.execute();\n\t\t});\n\t}\n\n\toverride objects<T>(query: SQL): 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\t'objects',\n\t\t\t\t\tfalse,\n\t\t\t\t);\n\t\t\t});\n\n\t\t\treturn prepared.execute();\n\t\t});\n\t}\n\n\tabstract transaction<T>(\n\t\ttransaction: (tx: PgAsyncTransaction<TQueryResult, TRelations>) => Promise<T>,\n\t\tconfig?: PgTransactionConfig,\n\t): Promise<T>;\n}\n\nexport abstract class PgAsyncTransaction<\n\tTQueryResult extends PgQueryResultHKT,\n\tTRelations extends AnyRelations = EmptyRelations,\n> extends PgAsyncDatabase<TQueryResult, TRelations> {\n\tstatic override readonly [entityKind]: string = 'PgAsyncTransaction';\n\n\tconstructor(\n\t\tdialect: PgDialect,\n\t\tsession: PgAsyncSession<any, any>,\n\t\trelations: TRelations,\n\t\tprotected readonly nestedIndex = 0,\n\t\tparseRqbJson: boolean | undefined,\n\t) {\n\t\tsuper(dialect, session, relations, 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<unknown> {\n\t\treturn this.session.execute<void>(sql`set transaction ${this.getTransactionConfigSQL(config)}`);\n\t}\n\n\tabstract override transaction: <T>(\n\t\ttransaction: (tx: PgAsyncTransaction<TQueryResult, TRelations>) => Promise<T>,\n\t) => Promise<T>;\n}\n\nexport async function migrate(\n\tmigrations: MigrationMeta[],\n\tdb: PgAsyncDatabase<PgQueryResultHKT, any>,\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\n\tawait db.execute(sql`CREATE SCHEMA IF NOT EXISTS ${sql.identifier(migrationsSchema)}`);\n\n\t// Detect DB version and upgrade table schema if needed\n\tconst { newDb } = await upgradeIfNeeded(migrationsSchema, migrationsTable, db, migrations);\n\n\t// Create table with latest schema (version 1) if this is a new database\n\tif (newDb) {\n\t\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\tname text,\n\t\t\t\tapplied_at timestamp with time zone DEFAULT now()\n\t\t\t)\n\t\t`;\n\t\tawait db.execute(migrationTableCreate);\n\t}\n\n\tconst dbMigrations = await db.session.objects<{ id: number; hash: string; created_at: string; name: string }>(\n\t\tsql`select id, hash, created_at, name from ${sql.identifier(migrationsSchema)}.${sql.identifier(migrationsTable)}`,\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 db.execute(\n\t\t\tsql`insert into ${sql.identifier(migrationsSchema)}.${\n\t\t\t\tsql.identifier(migrationsTable)\n\t\t\t} (\"hash\", \"created_at\", \"name\") values(${migration.hash}, ${migration.folderMillis}, ${migration.name ?? null})`,\n\t\t);\n\n\t\treturn;\n\t}\n\n\tconst migrationsToRun = getMigrationsToRun({ localMigrations: migrations, dbMigrations });\n\tawait db.transaction(async (tx) => {\n\t\tfor (const migration of migrationsToRun) {\n\t\t\tfor (const stmt of migration.sql) {\n\t\t\t\tawait tx.execute(sql.raw(stmt));\n\t\t\t}\n\t\t\tawait tx.execute(\n\t\t\t\tsql`insert into ${sql.identifier(migrationsSchema)}.${\n\t\t\t\t\tsql.identifier(migrationsTable)\n\t\t\t\t} (\"hash\", \"created_at\", \"name\") values(${migration.hash}, ${migration.folderMillis}, ${\n\t\t\t\t\tmigration.name ?? null\n\t\t\t\t})`,\n\t\t\t);\n\t\t}\n\t});\n}\n"],"mappings":"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"}
@@ -52,7 +52,7 @@ declare abstract class PgEffectTransaction<TEffectHKT extends QueryEffectHKTBase
52
52
  rollback(): EffectTransactionRollbackError;
53
53
  setTransaction(config: PgTransactionConfig): QueryEffectKind<TEffectHKT, void[]>;
54
54
  }
55
- declare const migrate: <TEffectHKT extends QueryEffectHKTBase>(migrations: MigrationMeta[], session: PgEffectSession<TEffectHKT, PgQueryResultHKT, EmptyRelations>, config: string | MigrationConfig) => Effect.Effect<undefined, SqlError | MigratorInitError | TEffectHKT["error"], TEffectHKT["context"]>;
55
+ declare const migrate: <TEffectHKT extends QueryEffectHKTBase>(migrations: MigrationMeta[], session: PgEffectSession<TEffectHKT, PgQueryResultHKT, EmptyRelations>, config: string | MigrationConfig) => Effect.Effect<undefined, MigratorInitError | TEffectHKT["error"] | SqlError, TEffectHKT["context"]>;
56
56
  //#endregion
57
57
  export { PgEffectPreparedQuery, PgEffectSession, PgEffectTransaction, migrate };
58
58
  //# sourceMappingURL=session.d.cts.map
@@ -52,7 +52,7 @@ declare abstract class PgEffectTransaction<TEffectHKT extends QueryEffectHKTBase
52
52
  rollback(): EffectTransactionRollbackError;
53
53
  setTransaction(config: PgTransactionConfig): QueryEffectKind<TEffectHKT, void[]>;
54
54
  }
55
- declare const migrate: <TEffectHKT extends QueryEffectHKTBase>(migrations: MigrationMeta[], session: PgEffectSession<TEffectHKT, PgQueryResultHKT, EmptyRelations>, config: string | MigrationConfig) => Effect.Effect<undefined, SqlError | MigratorInitError | TEffectHKT["error"], TEffectHKT["context"]>;
55
+ declare const migrate: <TEffectHKT extends QueryEffectHKTBase>(migrations: MigrationMeta[], session: PgEffectSession<TEffectHKT, PgQueryResultHKT, EmptyRelations>, config: string | MigrationConfig) => Effect.Effect<undefined, MigratorInitError | TEffectHKT["error"] | SqlError, TEffectHKT["context"]>;
56
56
  //#endregion
57
57
  export { PgEffectPreparedQuery, PgEffectSession, PgEffectTransaction, migrate };
58
58
  //# sourceMappingURL=session.d.ts.map
package/relations.cjs CHANGED
@@ -417,7 +417,8 @@ function makeJitRqbMapper({ selection, isFirst, parseJson, parseJsonIfString, ro
417
417
  const preFn = [];
418
418
  const inner = makeJitRqbMapperInner(selection, "row", "selection", mapColumnValue, parseJson, parseJsonIfString, arrayModeRoot ? false : rootJsonMappers, preFn, { n: 0 }, !!arrayModeRoot);
419
419
  const lines = [];
420
- lines.push(`\tconst { selection${mapColumnValue ? `, mapColumnValue` : ""} } = this;`);
420
+ lines.push(`\t"use strict";
421
+ const { selection${mapColumnValue ? `, mapColumnValue` : ""} } = this;`);
421
422
  for (const p of preFn) lines.push(`\t${p}`);
422
423
  if (arrayModeRoot) if (isFirst) {
423
424
  lines.push(`\tconst row = rows[0];`);