{"version":3,"file":"session.cjs","names":["QueryPromise","entityKind","SQLitePreparedQuery","NoopCache","DrizzleQueryError","SQLiteSession","SQLiteAsyncDatabase","TransactionRollbackError","sql"],"sources":["../../../src/sqlite-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, is } from '~/entity.ts';\nimport { DrizzleQueryError, TransactionRollbackError } from '~/errors.ts';\nimport type { Logger } from '~/logger.ts';\nimport type { MigrationConfig, MigrationMeta, MigratorInitFailResponse } from '~/migrator.ts';\nimport { getMigrationsToRun } from '~/migrator.utils.ts';\nimport { QueryPromise } from '~/query-promise.ts';\nimport type { AnyRelations, EmptyRelations } from '~/relations.ts';\nimport { fillPlaceholders, type Query, type SQL, sql } from '~/sql/sql.ts';\nimport type { SQLiteDialect } from '~/sqlite-core/dialect.ts';\nimport {\n\ttype PreparedQueryConfig as BasePreparedQueryConfig,\n\ttype SQLiteExecuteMethod,\n\tSQLitePreparedQuery,\n\tSQLiteSession,\n\ttype SQLiteTransactionConfig,\n} from '~/sqlite-core/session.ts';\nimport { upgradeAsyncIfNeeded, upgradeSyncIfNeeded } from '~/up-migrations/sqlite.ts';\nimport { assertUnreachable } from '~/utils.ts';\nimport { SQLiteAsyncDatabase } from './db.ts';\n\nexport interface SQLiteAsyncPreparedQueryConfig extends BasePreparedQueryConfig {\n\ttype: 'sync' | 'async';\n}\n\nexport type ExecuteResult<TType extends 'sync' | 'async', TResult> = TType extends 'async' ? Promise<TResult>\n\t: ExecuteResultSync<TResult>;\n\nexport class ExecuteResultSync<T> extends QueryPromise<T> {\n\tstatic override readonly [entityKind]: string = 'ExecuteResultSync';\n\n\tconstructor(private resultCb: () => T) {\n\t\tsuper();\n\t}\n\n\toverride async execute(): Promise<T> {\n\t\treturn this.resultCb();\n\t}\n\n\tsync(): T {\n\t\treturn this.resultCb();\n\t}\n}\n\nexport type SQLiteQueryExecutors<TType extends 'sync' | 'async'> = Record<\n\tSQLiteExecuteMethod,\n\t(params: unknown[]) => Result<TType, any>\n>;\n\nexport type Result<TKind extends 'sync' | 'async', TResult> = TKind extends 'async' ? Promise<TResult> : TResult;\n\nexport class SQLiteAsyncPreparedQuery<T extends SQLiteAsyncPreparedQueryConfig> extends SQLitePreparedQuery {\n\tstatic override readonly [entityKind]: string = 'SQLiteAsyncPreparedQuery';\n\n\tprivate fastPath: boolean;\n\n\tconstructor(\n\t\tprivate resultKind: 'sync' | 'async',\n\t\texecuteMethod: SQLiteExecuteMethod = 'all',\n\t\tprotected executors: SQLiteQueryExecutors<T['type']>,\n\t\tquery: Query,\n\t\tmapper: ((rows: any[]) => any) | undefined,\n\t\tmode: '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(executeMethod, query, mapper, mode);\n\n\t\t// it means that no $withCache options were passed and it should be just enabled\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 && (cache === undefined || is(cache, NoopCache));\n\t}\n\n\t/** @internal */\n\tprotected async queryWithCache<T>(\n\t\tqueryString: string,\n\t\tparams: any[],\n\t\texecuteMethod: SQLiteExecuteMethod,\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: _key, isTag, autoInvalidate, config } = cacheStrat;\n\t\t\tconst key = `${executeMethod}_${_key}`;\n\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\toverride run(placeholderValues: Record<string, unknown> = {}): Result<T['type'], T['run']> {\n\t\tconst { query, logger, executors, fastPath, resultKind } = this;\n\t\tconst sql = query._sql ? query._sql.join(' ') : query.sql;\n\t\tconst params = query.params.length === 0\n\t\t\t? query.params\n\t\t\t: fillPlaceholders(query.params, placeholderValues);\n\t\tlogger.logQuery(sql, params);\n\n\t\tif (resultKind === 'sync') {\n\t\t\ttry {\n\t\t\t\treturn (<SQLiteQueryExecutors<'sync'>> executors).run(params);\n\t\t\t} catch (e) {\n\t\t\t\tthrow new DrizzleQueryError(sql, params, e as Error);\n\t\t\t}\n\t\t}\n\n\t\treturn fastPath\n\t\t\t? (<SQLiteQueryExecutors<'async'>> executors).run(params).catch((e) => {\n\t\t\t\tthrow new DrizzleQueryError(sql, params, e as Error);\n\t\t\t})\n\t\t\t: this.queryWithCache(sql, params, 'run', () => (<SQLiteQueryExecutors<'async'>> executors).run(params));\n\t}\n\n\toverride all(placeholderValues: Record<string, unknown> = {}): Result<T['type'], T['all']> {\n\t\tconst { query, logger, executors, mapper, fastPath, resultKind } = this;\n\t\tconst sql = query._sql ? query._sql.join(' ') : query.sql;\n\t\tconst params = query.params.length === 0\n\t\t\t? query.params\n\t\t\t: fillPlaceholders(query.params, placeholderValues);\n\t\tlogger.logQuery(sql, params);\n\n\t\tif (resultKind === 'sync') {\n\t\t\tlet res: any;\n\t\t\ttry {\n\t\t\t\tres = (<SQLiteQueryExecutors<'sync'>> executors).all(params);\n\t\t\t} catch (e) {\n\t\t\t\tthrow new DrizzleQueryError(sql, params, e as Error);\n\t\t\t}\n\n\t\t\tif (!mapper) return res;\n\t\t\treturn mapper(res);\n\t\t}\n\n\t\tconst res = fastPath\n\t\t\t? (<SQLiteQueryExecutors<'async'>> executors).all(params).catch((e) => {\n\t\t\t\tthrow new DrizzleQueryError(sql, params, e as Error);\n\t\t\t})\n\t\t\t: this.queryWithCache(sql, params, 'all', () => (<SQLiteQueryExecutors<'async'>> executors).all(params));\n\t\tif (!mapper) return res;\n\n\t\treturn res.then((rows) => mapper(rows)) as Result<T['type'], T['all']>;\n\t}\n\n\toverride get(placeholderValues: Record<string, unknown> = {}): Result<T['type'], T['get']> {\n\t\tconst { query, logger, executors, mapper, fastPath, resultKind } = this;\n\t\tconst sql = query._sql ? query._sql.join(' ') : query.sql;\n\t\tconst params = query.params.length === 0\n\t\t\t? query.params\n\t\t\t: fillPlaceholders(query.params, placeholderValues);\n\t\tlogger.logQuery(sql, params);\n\n\t\tif (resultKind === 'sync') {\n\t\t\tlet res: any;\n\t\t\ttry {\n\t\t\t\tres = (<SQLiteQueryExecutors<'sync'>> executors).get(params);\n\t\t\t} catch (e) {\n\t\t\t\tthrow new DrizzleQueryError(sql, params, e as Error);\n\t\t\t}\n\n\t\t\tif (!res) return undefined as Result<T['type'], T['get']>;\n\t\t\tif (!mapper) return res;\n\n\t\t\treturn mapper([res])[0];\n\t\t}\n\n\t\tconst res = fastPath\n\t\t\t? (<SQLiteQueryExecutors<'async'>> executors).get(params).catch((e) => {\n\t\t\t\tthrow new DrizzleQueryError(sql, params, e as Error);\n\t\t\t})\n\t\t\t: this.queryWithCache(sql, params, 'get', () => (<SQLiteQueryExecutors<'async'>> executors).get(params));\n\n\t\t// Convert potential nulls from drivers to undefined\n\t\tif (!mapper) return res.then((row) => row ? row : undefined);\n\n\t\treturn res.then((row) => row ? mapper([row])[0] : undefined) as Result<T['type'], T['get']>;\n\t}\n\n\toverride values(placeholderValues: Record<string, unknown> = {}): Result<T['type'], T['values']> {\n\t\tconst { query, logger, executors, fastPath, resultKind } = this;\n\t\tconst sql = query._sql ? query._sql.join(' ') : query.sql;\n\t\tconst params = query.params.length === 0\n\t\t\t? query.params\n\t\t\t: fillPlaceholders(query.params, placeholderValues);\n\t\tlogger.logQuery(sql, params);\n\n\t\tif (resultKind === 'sync') {\n\t\t\ttry {\n\t\t\t\treturn (<SQLiteQueryExecutors<'sync'>> executors).values(params);\n\t\t\t} catch (e) {\n\t\t\t\tthrow new DrizzleQueryError(sql, params, e as Error);\n\t\t\t}\n\t\t}\n\n\t\tconst res = fastPath\n\t\t\t? (<SQLiteQueryExecutors<'async'>> executors).values(params).catch((e) => {\n\t\t\t\tthrow new DrizzleQueryError(sql, params, e as Error);\n\t\t\t})\n\t\t\t: this.queryWithCache(sql, params, 'values', () => (<SQLiteQueryExecutors<'async'>> executors).values(params));\n\n\t\treturn res;\n\t}\n\n\toverride execute(placeholderValues?: Record<string, unknown>): ExecuteResult<T['type'], T['execute']> {\n\t\tif (this.resultKind === 'async') {\n\t\t\treturn this[this.executeMethod](placeholderValues) as ExecuteResult<T['type'], T['execute']>;\n\t\t}\n\t\treturn new ExecuteResultSync(() => this[this.executeMethod](placeholderValues)) as ExecuteResult<\n\t\t\tT['type'],\n\t\t\tT['execute']\n\t\t>;\n\t}\n}\n\nexport abstract class SQLiteAsyncSession<\n\tTResultKind extends 'sync' | 'async',\n\tTRunResult,\n\tTRelations extends AnyRelations = EmptyRelations,\n> extends SQLiteSession<TRunResult, TRelations> {\n\tstatic override readonly [entityKind]: string = 'SQLiteAsyncSession';\n\n\tdeclare readonly dialect: SQLiteDialect;\n\n\tconstructor(\n\t\tdialect: SQLiteDialect,\n\t\tprotected resultKind: TResultKind,\n\t) {\n\t\tsuper(dialect);\n\t}\n\n\tabstract override prepareQuery(\n\t\tquery: Query,\n\t\tmode: 'arrays' | 'objects' | 'raw',\n\t\tprepare: boolean,\n\t\texecuteMethod?: SQLiteExecuteMethod,\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): SQLiteAsyncPreparedQuery<SQLiteAsyncPreparedQueryConfig & { type: TResultKind }>;\n\n\tabstract transaction<T>(\n\t\ttransaction: (\n\t\t\ttx: SQLiteAsyncTransaction<TResultKind, TRunResult, TRelations>,\n\t\t) => Result<TResultKind, T>,\n\t\tconfig?: SQLiteTransactionConfig,\n\t): Result<TResultKind, T>;\n\n\trun(query: SQL): Result<TResultKind, TRunResult> {\n\t\treturn this.prepareQuery(this.dialect.sqlToQuery(query), 'raw', false).run() as Result<\n\t\t\tTResultKind,\n\t\t\tTRunResult\n\t\t>;\n\t}\n\n\tobjects<T = unknown>(query: SQL): Result<TResultKind, T[]> {\n\t\treturn this.prepareQuery(this.dialect.sqlToQuery(query), 'objects', false).all() as Result<\n\t\t\tTResultKind,\n\t\t\tT[]\n\t\t>;\n\t}\n\n\tobject<T = unknown>(query: SQL): Result<TResultKind, T> {\n\t\treturn this.prepareQuery(this.dialect.sqlToQuery(query), 'objects', false).get() as Result<\n\t\t\tTResultKind,\n\t\t\tT\n\t\t>;\n\t}\n\n\tarrays<T extends any[] = unknown[]>(\n\t\tquery: SQL,\n\t): Result<TResultKind, T[]> {\n\t\treturn this.prepareQuery(this.dialect.sqlToQuery(query), 'arrays', false).all() as Result<\n\t\t\tTResultKind,\n\t\t\tT[]\n\t\t>;\n\t}\n\n\tarray<T extends any[] = unknown[]>(\n\t\tquery: SQL,\n\t): Result<TResultKind, T> {\n\t\treturn this.prepareQuery(this.dialect.sqlToQuery(query), 'arrays', false).get() as Result<\n\t\t\tTResultKind,\n\t\t\tT\n\t\t>;\n\t}\n}\n\nexport abstract class SQLiteAsyncTransaction<\n\tTResultType extends 'sync' | 'async',\n\tTRunResult,\n\tTRelations extends AnyRelations = EmptyRelations,\n> extends SQLiteAsyncDatabase<TResultType, TRunResult, TRelations> {\n\tstatic override readonly [entityKind]: string = 'SQLiteAsyncTransaction';\n\n\tconstructor(\n\t\tresultType: TResultType,\n\t\tdialect: SQLiteDialect,\n\t\tsession: SQLiteAsyncSession<TResultType, TRunResult, TRelations>,\n\t\trelations: TRelations,\n\t\tprotected readonly nestedIndex = 0,\n\t\tforbidJsonb?: boolean,\n\t) {\n\t\tsuper(resultType, dialect, session, relations, forbidJsonb);\n\t}\n\n\trollback(): never {\n\t\tthrow new TransactionRollbackError();\n\t}\n}\n\nexport function migrateSync(\n\tmigrations: MigrationMeta[],\n\tsession: SQLiteAsyncSession<'sync', unknown, AnyRelations>,\n\tconfig?: string | Omit<MigrationConfig, 'migrationsFolder'>,\n): void | MigratorInitFailResponse {\n\tconst migrationsTable = config === undefined\n\t\t? '__drizzle_migrations'\n\t\t: typeof config === 'string'\n\t\t? '__drizzle_migrations'\n\t\t: (config.migrationsTable ?? '__drizzle_migrations');\n\n\t// Detect DB version and upgrade table schema if needed\n\tconst { newDb } = upgradeSyncIfNeeded(migrationsTable, session, migrations);\n\n\tif (newDb) {\n\t\tconst migrationTableCreate = sql`\n\t\t\tCREATE TABLE IF NOT EXISTS ${sql.identifier(migrationsTable)} (\n\t\t\t\tid INTEGER PRIMARY KEY,\n\t\t\t\thash text NOT NULL,\n\t\t\t\tcreated_at numeric,\n\t\t\t\tname text,\n\t\t\t\tapplied_at TEXT\n\t\t\t)`;\n\t\tsession.run(migrationTableCreate);\n\t}\n\n\tconst dbMigrations = session.objects<{\n\t\tid: number;\n\t\thash: string;\n\t\tcreated_at: string;\n\t\tname: string | null;\n\t}>(\n\t\tsql`SELECT id, hash, created_at, name FROM ${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\tsession.run(\n\t\t\tsql`insert into ${\n\t\t\t\tsql.identifier(migrationsTable)\n\t\t\t} (\"hash\", \"created_at\", \"name\", \"applied_at\") values(${migration.hash}, ${migration.folderMillis}, ${migration.name}, ${\n\t\t\t\tnew Date().toISOString()\n\t\t\t})`,\n\t\t);\n\n\t\treturn;\n\t}\n\n\tconst migrationsToRun = getMigrationsToRun({\n\t\tlocalMigrations: migrations,\n\t\tdbMigrations,\n\t});\n\tsession.run(sql`BEGIN`);\n\n\ttry {\n\t\tfor (const migration of migrationsToRun) {\n\t\t\tfor (const stmt of migration.sql) {\n\t\t\t\tsession.run(sql.raw(stmt));\n\t\t\t}\n\t\t\tsession.run(\n\t\t\t\tsql`INSERT INTO ${\n\t\t\t\t\tsql.identifier(migrationsTable)\n\t\t\t\t} (\"hash\", \"created_at\", \"name\", \"applied_at\") values(${migration.hash}, ${migration.folderMillis}, ${migration.name}, ${\n\t\t\t\t\tnew Date().toISOString()\n\t\t\t\t})`,\n\t\t\t);\n\t\t}\n\n\t\tsession.run(sql`COMMIT`);\n\t} catch (e) {\n\t\tsession.run(sql`ROLLBACK`);\n\t\tthrow e;\n\t}\n}\n\nexport async function migrateAsync(\n\tmigrations: MigrationMeta[],\n\tdb: SQLiteAsyncDatabase<'async', unknown, AnyRelations>,\n\tconfig?: string | Omit<MigrationConfig, 'migrationsFolder'>,\n): Promise<void | MigratorInitFailResponse> {\n\tconst migrationsTable = config === undefined\n\t\t? '__drizzle_migrations'\n\t\t: typeof config === 'string'\n\t\t? '__drizzle_migrations'\n\t\t: (config.migrationsTable ?? '__drizzle_migrations');\n\n\t// Detect DB version and upgrade table schema if needed\n\tconst { newDb } = await upgradeAsyncIfNeeded(\n\t\tmigrationsTable,\n\t\tdb,\n\t\tmigrations,\n\t);\n\n\tif (newDb) {\n\t\tconst migrationTableCreate = sql`\n\t\t\tCREATE TABLE IF NOT EXISTS ${sql.identifier(migrationsTable)} (\n\t\t\t\tid INTEGER PRIMARY KEY,\n\t\t\t\thash text NOT NULL,\n\t\t\t\tcreated_at numeric,\n\t\t\t\tname text,\n\t\t\t\tapplied_at TEXT\n\t\t\t)\n\t\t`;\n\t\tawait db.session.run(migrationTableCreate);\n\t}\n\n\tconst dbMigrations = await db.session.objects<{\n\t\tid: number;\n\t\thash: string;\n\t\tcreated_at: string;\n\t\tname: string | null;\n\t}>(\n\t\tsql`SELECT id, hash, created_at, name FROM ${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.session.run(\n\t\t\tsql`insert into ${\n\t\t\t\tsql.identifier(migrationsTable)\n\t\t\t} (\"hash\", \"created_at\", \"name\", \"applied_at\") values(${migration.hash}, ${migration.folderMillis}, ${migration.name}, ${\n\t\t\t\tnew Date().toISOString()\n\t\t\t})`,\n\t\t);\n\n\t\treturn;\n\t}\n\n\tconst migrationsToRun = getMigrationsToRun({\n\t\tlocalMigrations: migrations,\n\t\tdbMigrations,\n\t});\n\tawait db.session.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.run(sql.raw(stmt));\n\t\t\t}\n\t\t\tawait tx.run(\n\t\t\t\tsql`insert into ${\n\t\t\t\t\tsql.identifier(migrationsTable)\n\t\t\t\t} (\"hash\", \"created_at\", \"name\", \"applied_at\") values(${migration.hash}, ${migration.folderMillis}, ${migration.name}, ${\n\t\t\t\t\tnew Date().toISOString()\n\t\t\t\t})`,\n\t\t\t);\n\t\t}\n\t});\n}\n"],"mappings":"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"}