{"version":3,"file":"session.cjs","names":["PgAsyncSession","entityKind","NoopLogger","NoopCache","Pool","PgAsyncTransaction","PgAsyncPreparedQuery"],"sources":["../../src/postgres/session.ts"],"sourcesContent":["import type { Connection, PoolQuery, QueryResult, ShapeSpec } from '@drizzle-team/minipg';\nimport { Pool } from '@drizzle-team/minipg';\nimport type { BatchItem } from '~/batch';\nimport { type Cache, NoopCache } from '~/cache/core/cache.ts';\nimport type { WithCacheConfig } from '~/cache/core/types.ts';\nimport { entityKind } from '~/entity.ts';\nimport { type Logger, NoopLogger } from '~/logger.ts';\nimport { PgAsyncPreparedQuery, PgAsyncSession, PgAsyncTransaction } from '~/pg-core/async/session.ts';\nimport type { PgDialect } from '~/pg-core/dialect.ts';\nimport type { PgQueryResultHKT, PgTransactionConfig, PreparedQueryConfig } from '~/pg-core/session.ts';\nimport { preparedStatementName } from '~/query-name-generator.ts';\nimport type { AnyRelations } from '~/relations.ts';\nimport type { Query } from '~/sql/sql.ts';\nimport type { Simplify } from '~/utils.ts';\nexport type PostgresClient = Pool | Connection;\n\nexport interface PostgresSessionOptions {\n\tlogger?: Logger;\n\tcache?: Cache;\n}\n\nexport class PostgresSession<\n\tTRelations extends AnyRelations,\n> extends PgAsyncSession<PostgresQueryResultHKT, TRelations> {\n\tstatic override readonly [entityKind]: string = 'PostgresSession';\n\n\tprivate logger: Logger;\n\tprivate cache: Cache;\n\n\tconstructor(\n\t\tprivate client: PostgresClient,\n\t\tdialect: PgDialect,\n\t\tprivate relations: TRelations,\n\t\tprivate options: PostgresSessionOptions = {},\n\t) {\n\t\tsuper(dialect);\n\t\tthis.logger = options.logger ?? new NoopLogger();\n\t\tthis.cache = options.cache ?? new NoopCache();\n\t}\n\n\tprepareQuery<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) | undefined,\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\tshape?: ShapeSpec,\n\t) {\n\t\tconst queryName = typeof name === 'string'\n\t\t\t? name\n\t\t\t: name === true\n\t\t\t? preparedStatementName(query.sql, query.params)\n\t\t\t: undefined;\n\n\t\tconst executor = async (params?: unknown[]) => {\n\t\t\tconst q = mode === 'arrays'\n\t\t\t\t? this.client.query(\n\t\t\t\t\tquery.sql,\n\t\t\t\t\tparams ?? [],\n\t\t\t\t\t{ name: queryName, mode: 'array', shape },\n\t\t\t\t)\n\t\t\t\t: this.client.query(\n\t\t\t\t\tquery.sql,\n\t\t\t\t\tparams ?? [],\n\t\t\t\t\t{ name: queryName, mode: 'object', shape },\n\t\t\t\t);\n\n\t\t\tif (mode === 'raw') return q;\n\t\t\treturn q.then((r) => r.rows);\n\t\t};\n\n\t\treturn new PostgresPreparedQuery<T>(\n\t\t\texecutor,\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\tshape,\n\t\t);\n\t}\n\n\tasync batch<U extends BatchItem<'pg'>, T extends Readonly<[U, ...U[]]>>(queries: T) {\n\t\tconst preparedQueries: PostgresPreparedQuery<any>[] = new Array(queries.length);\n\t\tconst builtQueries: PoolQuery[] = new Array(queries.length);\n\n\t\tconst q = this.client;\n\t\tif (!(q instanceof Pool)) throw new Error('`batch` method is only supported on connection pools!'); // oxlint-disable-line no-instanceof-builtins drizzle-internal/no-instanceof\n\t\tfor (let i = 0; i < queries.length; ++i) {\n\t\t\tconst query = queries[i]!;\n\t\t\tconst preparedQuery = query._prepare() as PostgresPreparedQuery<any>;\n\t\t\tconst builtQuery = preparedQuery.getQuery();\n\t\t\tpreparedQueries[i] = preparedQuery;\n\t\t\tbuiltQueries[i] = preparedQuery.mode === 'arrays'\n\t\t\t\t? q.query(builtQuery.sql, builtQuery.params, {\n\t\t\t\t\tmode: 'array',\n\t\t\t\t\tshape: preparedQuery.shape,\n\t\t\t\t})\n\t\t\t\t: q.query(builtQuery.sql, builtQuery.params, {\n\t\t\t\t\tmode: 'object',\n\t\t\t\t\tshape: preparedQuery.shape,\n\t\t\t\t});\n\t\t}\n\n\t\tconst batchResults = await q.batch(builtQueries);\n\t\tconst response = new Array(batchResults.length);\n\t\tfor (let i = 0; i < batchResults.length; ++i) {\n\t\t\tconst { mapper, mode } = preparedQueries[i]!;\n\t\t\tconst result = batchResults[i]!;\n\n\t\t\tresponse[i] = mapper\n\t\t\t\t? mapper(result.rows)\n\t\t\t\t: mode === 'raw'\n\t\t\t\t? result\n\t\t\t\t: result.rows;\n\t\t}\n\n\t\treturn response;\n\t}\n\n\toverride async transaction<T>(\n\t\ttransaction: (tx: PostgresTransaction<TRelations>) => Promise<T>,\n\t\tconfig?: PgTransactionConfig | undefined,\n\t): Promise<T> {\n\t\treturn this.client.transaction({\n\t\t\tdeferrable: config?.deferrable,\n\t\t\tisolation: config?.isolationLevel,\n\t\t\treadOnly: config?.accessMode === 'read only',\n\t\t}, async (clTx) => {\n\t\t\tconst session = new PostgresSession(clTx, this.dialect, this.relations, this.options);\n\t\t\tconst tx = new PostgresTransaction<TRelations>(\n\t\t\t\tthis.dialect,\n\t\t\t\tsession,\n\t\t\t\tthis.relations,\n\t\t\t\tundefined,\n\t\t\t\tfalse,\n\t\t\t);\n\n\t\t\tif (typeof config?.snapshot === 'string') {\n\t\t\t\tawait tx.execute(tx.setTransactionSnapshotSQL(config.snapshot));\n\t\t\t}\n\n\t\t\treturn transaction(tx);\n\t\t});\n\t}\n}\n\nexport class PostgresTransaction<\n\tTRelations extends AnyRelations,\n> extends PgAsyncTransaction<PostgresQueryResultHKT, TRelations> {\n\tstatic override readonly [entityKind]: string = 'PostgresTransaction';\n\n\toverride async transaction<T>(\n\t\ttransaction: (tx: PostgresTransaction<TRelations>) => Promise<T>,\n\t): Promise<T> {\n\t\treturn this.session.transaction(transaction as any);\n\t}\n}\n\nexport type PostgresQueryResult<T> = Omit<QueryResult<T>, 'metrics' | 'debug'>;\n\nexport interface PostgresQueryResultHKT extends PgQueryResultHKT {\n\ttype: Simplify<Omit<QueryResult<this['row']>, 'metrics' | 'debug'>>;\n}\n\nexport class PostgresPreparedQuery<T extends PreparedQueryConfig> extends PgAsyncPreparedQuery<T> {\n\tstatic override readonly [entityKind]: string = 'PostgresPreparedQuery';\n\n\tconstructor(\n\t\texecutor: (params?: unknown[]) => Promise<any>,\n\t\tquery: Query,\n\t\tmapper: ((rows: any[]) => any) | undefined,\n\t\tmode: 'arrays' | 'objects' | 'raw',\n\t\tlogger: Logger,\n\t\t// cache instance\n\t\tcache: Cache | undefined,\n\t\t// per query related metadata\n\t\tqueryMetadata: {\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\tcacheConfig: WithCacheConfig | undefined,\n\t\treadonly shape?: ShapeSpec,\n\t) {\n\t\tsuper(executor, query, mapper, mode, logger, cache, queryMetadata, cacheConfig);\n\t}\n}\n"],"mappings":";;;;;;;;;;AAqBA,IAAa,kBAAb,MAAa,wBAEHA,0CAAmD;CAC5D,QAA0BC,0BAAsB;CAEhD,AAAQ;CACR,AAAQ;CAER,YACC,AAAQ,QACR,SACA,AAAQ,WACR,AAAQ,UAAkC,EAAE,EAC3C;AACD,QAAM,QAAQ;EALN;EAEA;EACA;AAGR,OAAK,SAAS,QAAQ,UAAU,IAAIC,wBAAY;AAChD,OAAK,QAAQ,QAAQ,SAAS,IAAIC,iCAAW;;CAG9C,aACC,OACA,MACA,MACA,QACA,eAIA,aACA,OACC;EACD,MAAM,YAAY,OAAO,SAAS,WAC/B,OACA,SAAS,4DACa,MAAM,KAAK,MAAM,OAAO,GAC9C;EAEH,MAAM,WAAW,OAAO,WAAuB;GAC9C,MAAM,IAAI,SAAS,WAChB,KAAK,OAAO,MACb,MAAM,KACN,UAAU,EAAE,EACZ;IAAE,MAAM;IAAW,MAAM;IAAS;IAAO,CACzC,GACC,KAAK,OAAO,MACb,MAAM,KACN,UAAU,EAAE,EACZ;IAAE,MAAM;IAAW,MAAM;IAAU;IAAO,CAC1C;AAEF,OAAI,SAAS,MAAO,QAAO;AAC3B,UAAO,EAAE,MAAM,MAAM,EAAE,KAAK;;AAG7B,SAAO,IAAI,sBACV,UACA,OACA,QACA,MACA,KAAK,QACL,KAAK,OACL,eACA,aACA,MACA;;CAGF,MAAM,MAAkE,SAAY;EACnF,MAAM,kBAAgD,IAAI,MAAM,QAAQ,OAAO;EAC/E,MAAM,eAA4B,IAAI,MAAM,QAAQ,OAAO;EAE3D,MAAM,IAAI,KAAK;AACf,MAAI,EAAE,aAAaC,2BAAO,OAAM,IAAI,MAAM,wDAAwD;AAClG,OAAK,IAAI,IAAI,GAAG,IAAI,QAAQ,QAAQ,EAAE,GAAG;GAExC,MAAM,gBADQ,QAAQ,GACM,UAAU;GACtC,MAAM,aAAa,cAAc,UAAU;AAC3C,mBAAgB,KAAK;AACrB,gBAAa,KAAK,cAAc,SAAS,WACtC,EAAE,MAAM,WAAW,KAAK,WAAW,QAAQ;IAC5C,MAAM;IACN,OAAO,cAAc;IACrB,CAAC,GACA,EAAE,MAAM,WAAW,KAAK,WAAW,QAAQ;IAC5C,MAAM;IACN,OAAO,cAAc;IACrB,CAAC;;EAGJ,MAAM,eAAe,MAAM,EAAE,MAAM,aAAa;EAChD,MAAM,WAAW,IAAI,MAAM,aAAa,OAAO;AAC/C,OAAK,IAAI,IAAI,GAAG,IAAI,aAAa,QAAQ,EAAE,GAAG;GAC7C,MAAM,EAAE,QAAQ,SAAS,gBAAgB;GACzC,MAAM,SAAS,aAAa;AAE5B,YAAS,KAAK,SACX,OAAO,OAAO,KAAK,GACnB,SAAS,QACT,SACA,OAAO;;AAGX,SAAO;;CAGR,MAAe,YACd,aACA,QACa;AACb,SAAO,KAAK,OAAO,YAAY;GAC9B,YAAY,QAAQ;GACpB,WAAW,QAAQ;GACnB,UAAU,QAAQ,eAAe;GACjC,EAAE,OAAO,SAAS;GAClB,MAAM,UAAU,IAAI,gBAAgB,MAAM,KAAK,SAAS,KAAK,WAAW,KAAK,QAAQ;GACrF,MAAM,KAAK,IAAI,oBACd,KAAK,SACL,SACA,KAAK,WACL,QACA,MACA;AAED,OAAI,OAAO,QAAQ,aAAa,SAC/B,OAAM,GAAG,QAAQ,GAAG,0BAA0B,OAAO,SAAS,CAAC;AAGhE,UAAO,YAAY,GAAG;IACrB;;;AAIJ,IAAa,sBAAb,cAEUC,8CAAuD;CAChE,QAA0BJ,0BAAsB;CAEhD,MAAe,YACd,aACa;AACb,SAAO,KAAK,QAAQ,YAAY,YAAmB;;;AAUrD,IAAa,wBAAb,cAA0EK,gDAAwB;CACjG,QAA0BL,0BAAsB;CAEhD,YACC,UACA,OACA,QACA,MACA,QAEA,OAEA,eAKA,aACA,AAAS,OACR;AACD,QAAM,UAAU,OAAO,QAAQ,MAAM,QAAQ,OAAO,eAAe,YAAY;EAFtE"}