{"version":3,"file":"session.cjs","names":["SQLiteAsyncSession","entityKind","NoopLogger","NoopCache","DrizzleQueryError","sql","SQLiteAsyncTransaction","SQLiteAsyncPreparedQuery"],"sources":["../../src/d1/session.ts"],"sourcesContent":["/// <reference types=\"@cloudflare/workers-types\" />\n\nimport type { BatchItem } from '~/batch.ts';\nimport { type Cache, NoopCache } from '~/cache/core/index.ts';\nimport type { WithCacheConfig } from '~/cache/core/types.ts';\nimport { entityKind } from '~/entity.ts';\nimport { DrizzleQueryError } from '~/errors.ts';\nimport type { Logger } from '~/logger.ts';\nimport { NoopLogger } from '~/logger.ts';\nimport type { AnyRelations } from '~/relations.ts';\nimport { type Query, sql } from '~/sql/sql.ts';\nimport {\n\tSQLiteAsyncPreparedQuery,\n\ttype SQLiteAsyncPreparedQueryConfig as PreparedQueryConfigBase,\n\tSQLiteAsyncSession,\n\tSQLiteAsyncTransaction,\n\ttype SQLiteQueryExecutors,\n} from '~/sqlite-core/async/session.ts';\nimport type { SQLiteDialect } from '~/sqlite-core/dialect.ts';\nimport type { SelectedFieldsOrdered } from '~/sqlite-core/query-builders/select.types.ts';\nimport type { SQLiteExecuteMethod, SQLiteTransactionConfig } from '~/sqlite-core/session.ts';\n\nexport interface SQLiteD1SessionOptions {\n\tlogger?: Logger;\n\tcache?: Cache;\n}\n\nexport type D1RunResult = D1Result;\n\ntype PreparedQueryConfig = Omit<PreparedQueryConfigBase, 'statement' | 'run'>;\n\nexport class SQLiteD1Session<TRelations extends AnyRelations>\n\textends SQLiteAsyncSession<'async', D1RunResult, TRelations>\n{\n\tstatic override readonly [entityKind]: string = 'SQLiteD1Session';\n\n\tprivate logger: Logger;\n\tprivate cache: Cache;\n\n\tconstructor(\n\t\tprivate client: D1Database | D1DatabaseSession,\n\t\tdialect: SQLiteDialect,\n\t\tprivate relations: TRelations,\n\t\tprivate options: SQLiteD1SessionOptions = {},\n\t) {\n\t\tsuper(dialect, 'async');\n\t\tthis.logger = options.logger ?? new NoopLogger();\n\t\tthis.cache = options.cache ?? new NoopCache();\n\t}\n\n\tprepareQuery(\n\t\tquery: Query,\n\t\tmode: 'arrays' | 'objects' | 'raw',\n\t\t_prepare: 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): D1PreparedQuery {\n\t\tlet stmt: D1PreparedStatement;\n\t\ttry {\n\t\t\tstmt = this.client.prepare(query.sql);\n\t\t} catch (e) {\n\t\t\tthrow new DrizzleQueryError(query.sql, query.params, e as Error);\n\t\t}\n\t\tconst executors: SQLiteQueryExecutors<'async'> = {\n\t\t\tall: (params) => {\n\t\t\t\tif (mode === 'arrays') return stmt.bind(...params).raw();\n\t\t\t\treturn stmt.bind(...params).all().then(({ results }) => results);\n\t\t\t},\n\t\t\tget: (params) => {\n\t\t\t\tif (mode === 'arrays') return stmt.bind(...params).raw().then((rows) => rows[0]);\n\t\t\t\treturn stmt.bind(...params).first();\n\t\t\t},\n\t\t\trun: (params) => {\n\t\t\t\treturn stmt.bind(...params).run();\n\t\t\t},\n\t\t\tvalues: (params) => {\n\t\t\t\treturn stmt.bind(...params).raw();\n\t\t\t},\n\t\t};\n\t\treturn new D1PreparedQuery(\n\t\t\tstmt,\n\t\t\t'async',\n\t\t\texecuteMethod,\n\t\t\texecutors,\n\t\t\tquery,\n\t\t\tmapper,\n\t\t\tmode,\n\t\t\tthis.logger,\n\t\t\tthis.cache,\n\t\t\tqueryMetadata,\n\t\t\tcacheConfig,\n\t\t);\n\t}\n\n\tasync batch<T extends BatchItem<'sqlite'>[] | readonly BatchItem<'sqlite'>[]>(queries: T) {\n\t\tconst preparedQueries: SQLiteAsyncPreparedQuery<any>[] = [];\n\t\tconst builtQueries: D1PreparedStatement[] = [];\n\n\t\tfor (const query of queries) {\n\t\t\tconst preparedQuery = query._prepare() as D1PreparedQuery<any>;\n\t\t\tconst builtQuery = preparedQuery.getQuery();\n\t\t\tpreparedQueries.push(preparedQuery);\n\t\t\tif (builtQuery.params.length > 0) {\n\t\t\t\tbuiltQueries.push((preparedQuery as D1PreparedQuery<any>).stmt.bind(...builtQuery.params));\n\t\t\t} else {\n\t\t\t\tconst builtQuery = preparedQuery.getQuery();\n\t\t\t\tbuiltQueries.push(\n\t\t\t\t\tthis.client.prepare(builtQuery.sql).bind(...builtQuery.params),\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\tconst batchResults = await this.client.batch<any>(builtQueries);\n\t\treturn batchResults.map((result, i) => {\n\t\t\tconst { executeMethod, mapper, mode } = preparedQueries[i]!;\n\n\t\t\tif (executeMethod === 'run') return result;\n\n\t\t\tlet values: any = result.results;\n\t\t\tif (executeMethod === 'values') return d1ToRawMapping(values);\n\t\t\tif (executeMethod === 'get') {\n\t\t\t\tif (!values[0]) return;\n\n\t\t\t\tif (!mapper) return mode === 'arrays' ? d1ToRawMapping([values[0]])[0] : values[0];\n\n\t\t\t\treturn mapper(mode === 'arrays' ? d1ToRawMapping([values[0]]) : [values[0]])[0];\n\t\t\t}\n\n\t\t\tvalues = mode === 'arrays' ? d1ToRawMapping(values) : values;\n\t\t\tif (!mapper) return values;\n\n\t\t\treturn mapper(values);\n\t\t});\n\t}\n\n\toverride async transaction<T>(\n\t\ttransaction: (tx: D1Transaction<TRelations>) => T | Promise<T>,\n\t\tconfig?: SQLiteTransactionConfig,\n\t): Promise<T> {\n\t\tif (config?.behavior === 'concurrent') throw new Error('Concurrent transactions are not supported by driver');\n\n\t\tconst tx = new D1Transaction('async', this.dialect, this, this.relations, undefined, true);\n\t\tawait this.run(sql.raw(`begin${config?.behavior ? ' ' + config.behavior : ''}`));\n\t\ttry {\n\t\t\tconst result = await transaction(tx);\n\t\t\tawait this.run(sql`commit`);\n\t\t\treturn result;\n\t\t} catch (err) {\n\t\t\tawait this.run(sql`rollback`);\n\t\t\tthrow err;\n\t\t}\n\t}\n}\n\nexport class D1Transaction<TRelations extends AnyRelations>\n\textends SQLiteAsyncTransaction<'async', D1RunResult, TRelations>\n{\n\tstatic override readonly [entityKind]: string = 'D1Transaction';\n\n\toverride async transaction<T>(\n\t\ttransaction: (tx: D1Transaction<TRelations>) => Promise<T>,\n\t): Promise<T> {\n\t\tconst savepointName = `sp${this.nestedIndex}`;\n\t\tconst tx = new D1Transaction(\n\t\t\t'async',\n\t\t\tthis.dialect,\n\t\t\tthis.session,\n\t\t\tthis._.relations,\n\t\t\tthis.nestedIndex + 1,\n\t\t\tthis.forbidJsonb,\n\t\t);\n\t\tawait this.session.run(sql.raw(`savepoint ${savepointName}`));\n\t\ttry {\n\t\t\tconst result = await transaction(tx);\n\t\t\tawait this.session.run(sql.raw(`release savepoint ${savepointName}`));\n\t\t\treturn result;\n\t\t} catch (err) {\n\t\t\tawait this.session.run(sql.raw(`rollback to savepoint ${savepointName}`));\n\t\t\tthrow err;\n\t\t}\n\t}\n}\n\n/**\n * This function was taken from the D1 implementation: https://github.com/cloudflare/workerd/blob/4aae9f4c7ae30a59a88ca868c4aff88bda85c956/src/cloudflare/internal/d1-api.ts#L287\n * It may cause issues with duplicated column names in join queries, which should be fixed on the D1 side.\n * @param results\n * @returns\n */\nfunction d1ToRawMapping(results: any) {\n\tconst rows: unknown[][] = [];\n\tfor (const row of results) {\n\t\tconst entry = Object.keys(row).map((k) => row[k]);\n\t\trows.push(entry);\n\t}\n\treturn rows;\n}\n\nexport class D1PreparedQuery<T extends PreparedQueryConfig = PreparedQueryConfig> extends SQLiteAsyncPreparedQuery<\n\t{ type: 'async'; run: D1Response; all: T['all']; get: T['get']; values: T['values']; execute: T['execute'] }\n> {\n\tstatic override readonly [entityKind]: string = 'D1PreparedQuery';\n\n\t/** @internal */\n\tfields?: SelectedFieldsOrdered;\n\n\t/** @internal */\n\treadonly stmt: D1PreparedStatement;\n\n\tconstructor(\n\t\tstmt: D1PreparedStatement,\n\t\tresultKind: 'sync' | 'async',\n\t\texecuteMethod: SQLiteExecuteMethod = 'all',\n\t\texecutors: SQLiteQueryExecutors<'async'>,\n\t\tquery: Query,\n\t\tmapper: ((rows: any[]) => any) | undefined,\n\t\tmode: 'arrays' | 'objects' | 'raw',\n\t\tlogger: Logger,\n\t\tcache: Cache | 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) {\n\t\tsuper(\n\t\t\tresultKind,\n\t\t\texecuteMethod,\n\t\t\texecutors,\n\t\t\tquery,\n\t\t\tmapper,\n\t\t\tmode,\n\t\t\tlogger,\n\t\t\tcache,\n\t\t\tqueryMetadata,\n\t\t\tcacheConfig,\n\t\t);\n\n\t\tthis.stmt = stmt;\n\t}\n}\n"],"mappings":";;;;;;;;;;AA+BA,IAAa,kBAAb,cACSA,kDACT;CACC,QAA0BC,0BAAsB;CAEhD,AAAQ;CACR,AAAQ;CAER,YACC,AAAQ,QACR,SACA,AAAQ,WACR,AAAQ,UAAkC,EAAE,EAC3C;AACD,QAAM,SAAS,QAAQ;EALf;EAEA;EACA;AAGR,OAAK,SAAS,QAAQ,UAAU,IAAIC,wBAAY;AAChD,OAAK,QAAQ,QAAQ,SAAS,IAAIC,iCAAW;;CAG9C,aACC,OACA,MACA,UACA,eACA,QACA,eAIA,aACkB;EAClB,IAAI;AACJ,MAAI;AACH,UAAO,KAAK,OAAO,QAAQ,MAAM,IAAI;WAC7B,GAAG;AACX,SAAM,IAAIC,8BAAkB,MAAM,KAAK,MAAM,QAAQ,EAAW;;AAkBjE,SAAO,IAAI,gBACV,MACA,SACA,eAnBgD;GAChD,MAAM,WAAW;AAChB,QAAI,SAAS,SAAU,QAAO,KAAK,KAAK,GAAG,OAAO,CAAC,KAAK;AACxD,WAAO,KAAK,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,cAAc,QAAQ;;GAEjE,MAAM,WAAW;AAChB,QAAI,SAAS,SAAU,QAAO,KAAK,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,MAAM,SAAS,KAAK,GAAG;AAChF,WAAO,KAAK,KAAK,GAAG,OAAO,CAAC,OAAO;;GAEpC,MAAM,WAAW;AAChB,WAAO,KAAK,KAAK,GAAG,OAAO,CAAC,KAAK;;GAElC,SAAS,WAAW;AACnB,WAAO,KAAK,KAAK,GAAG,OAAO,CAAC,KAAK;;GAElC,EAMA,OACA,QACA,MACA,KAAK,QACL,KAAK,OACL,eACA,YACA;;CAGF,MAAM,MAAwE,SAAY;EACzF,MAAM,kBAAmD,EAAE;EAC3D,MAAM,eAAsC,EAAE;AAE9C,OAAK,MAAM,SAAS,SAAS;GAC5B,MAAM,gBAAgB,MAAM,UAAU;GACtC,MAAM,aAAa,cAAc,UAAU;AAC3C,mBAAgB,KAAK,cAAc;AACnC,OAAI,WAAW,OAAO,SAAS,EAC9B,cAAa,KAAM,cAAuC,KAAK,KAAK,GAAG,WAAW,OAAO,CAAC;QACpF;IACN,MAAM,aAAa,cAAc,UAAU;AAC3C,iBAAa,KACZ,KAAK,OAAO,QAAQ,WAAW,IAAI,CAAC,KAAK,GAAG,WAAW,OAAO,CAC9D;;;AAKH,UADqB,MAAM,KAAK,OAAO,MAAW,aAAa,EAC3C,KAAK,QAAQ,MAAM;GACtC,MAAM,EAAE,eAAe,QAAQ,SAAS,gBAAgB;AAExD,OAAI,kBAAkB,MAAO,QAAO;GAEpC,IAAI,SAAc,OAAO;AACzB,OAAI,kBAAkB,SAAU,QAAO,eAAe,OAAO;AAC7D,OAAI,kBAAkB,OAAO;AAC5B,QAAI,CAAC,OAAO,GAAI;AAEhB,QAAI,CAAC,OAAQ,QAAO,SAAS,WAAW,eAAe,CAAC,OAAO,GAAG,CAAC,CAAC,KAAK,OAAO;AAEhF,WAAO,OAAO,SAAS,WAAW,eAAe,CAAC,OAAO,GAAG,CAAC,GAAG,CAAC,OAAO,GAAG,CAAC,CAAC;;AAG9E,YAAS,SAAS,WAAW,eAAe,OAAO,GAAG;AACtD,OAAI,CAAC,OAAQ,QAAO;AAEpB,UAAO,OAAO,OAAO;IACpB;;CAGH,MAAe,YACd,aACA,QACa;AACb,MAAI,QAAQ,aAAa,aAAc,OAAM,IAAI,MAAM,sDAAsD;EAE7G,MAAM,KAAK,IAAI,cAAc,SAAS,KAAK,SAAS,MAAM,KAAK,WAAW,QAAW,KAAK;AAC1F,QAAM,KAAK,IAAIC,iBAAI,IAAI,QAAQ,QAAQ,WAAW,MAAM,OAAO,WAAW,KAAK,CAAC;AAChF,MAAI;GACH,MAAM,SAAS,MAAM,YAAY,GAAG;AACpC,SAAM,KAAK,IAAI,gBAAG,SAAS;AAC3B,UAAO;WACC,KAAK;AACb,SAAM,KAAK,IAAI,gBAAG,WAAW;AAC7B,SAAM;;;;AAKT,IAAa,gBAAb,MAAa,sBACJC,sDACT;CACC,QAA0BL,0BAAsB;CAEhD,MAAe,YACd,aACa;EACb,MAAM,gBAAgB,KAAK,KAAK;EAChC,MAAM,KAAK,IAAI,cACd,SACA,KAAK,SACL,KAAK,SACL,KAAK,EAAE,WACP,KAAK,cAAc,GACnB,KAAK,YACL;AACD,QAAM,KAAK,QAAQ,IAAII,iBAAI,IAAI,aAAa,gBAAgB,CAAC;AAC7D,MAAI;GACH,MAAM,SAAS,MAAM,YAAY,GAAG;AACpC,SAAM,KAAK,QAAQ,IAAIA,iBAAI,IAAI,qBAAqB,gBAAgB,CAAC;AACrE,UAAO;WACC,KAAK;AACb,SAAM,KAAK,QAAQ,IAAIA,iBAAI,IAAI,yBAAyB,gBAAgB,CAAC;AACzE,SAAM;;;;;;;;;;AAWT,SAAS,eAAe,SAAc;CACrC,MAAM,OAAoB,EAAE;AAC5B,MAAK,MAAM,OAAO,SAAS;EAC1B,MAAM,QAAQ,OAAO,KAAK,IAAI,CAAC,KAAK,MAAM,IAAI,GAAG;AACjD,OAAK,KAAK,MAAM;;AAEjB,QAAO;;AAGR,IAAa,kBAAb,cAA0FE,wDAExF;CACD,QAA0BN,0BAAsB;;CAGhD;;CAGA,AAAS;CAET,YACC,MACA,YACA,gBAAqC,OACrC,WACA,OACA,QACA,MACA,QACA,OACA,eAIA,aACC;AACD,QACC,YACA,eACA,WACA,OACA,QACA,MACA,QACA,OACA,eACA,YACA;AAED,OAAK,OAAO"}