{"version":3,"file":"session.cjs","names":["types","PgAsyncSession","entityKind","NoopLogger","NoopCache","PgAsyncPreparedQuery","VercelPool","PgAsyncTransaction","sql"],"sources":["../../src/vercel-postgres/session.ts"],"sourcesContent":["import {\n\ttype QueryResult,\n\ttype QueryResultRow,\n\ttypes,\n\ttype VercelClient,\n\tVercelPool,\n\ttype VercelPoolClient,\n} from '@vercel/postgres';\nimport type { CustomTypesConfig } from 'pg';\nimport type { Cache } from '~/cache/core/cache.ts';\nimport { 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/index.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, sql } from '~/sql/sql.ts';\nimport type { Assume } from '~/utils.ts';\n\nexport type VercelPgClient = VercelPool | VercelClient | VercelPoolClient;\n\nexport interface VercelPgSessionOptions {\n\tlogger?: Logger;\n\tcache?: Cache;\n}\n\nconst noop = (val: any) => val;\nconst typeConfig: CustomTypesConfig = {\n\tgetTypeParser: <CustomTypesConfig['getTypeParser']> ((typeId, format) => {\n\t\tswitch (typeId as number) {\n\t\t\tcase types.builtins.TIMESTAMPTZ:\n\t\t\tcase types.builtins.TIMESTAMP:\n\t\t\tcase types.builtins.DATE:\n\t\t\tcase types.builtins.INTERVAL:\n\t\t\tcase 1231: // numeric[]\n\t\t\tcase 1115: // timestamp[]\n\t\t\tcase 1185: // timestamp with timezone[]\n\t\t\tcase 1187: // interval[]\n\t\t\tcase 1182: // date[]\n\t\t\t\treturn noop;\n\t\t\tdefault:\n\t\t\t\treturn types.getTypeParser(typeId, format);\n\t\t}\n\t}),\n};\n\nexport class VercelPgSession<\n\tTRelations extends AnyRelations,\n> extends PgAsyncSession<VercelPgQueryResultHKT, TRelations> {\n\tstatic override readonly [entityKind]: string = 'VercelPgSession';\n\n\tprivate logger: Logger;\n\tprivate cache: Cache;\n\n\tconstructor(\n\t\tprivate client: VercelPgClient,\n\t\tdialect: PgDialect,\n\t\tprivate relations: TRelations,\n\t\tprivate options: VercelPgSessionOptions = {},\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) {\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\treturn this.client.query({\n\t\t\t\tname: queryName,\n\t\t\t\trowMode: mode === 'arrays' ? 'array' : undefined as any,\n\t\t\t\ttext: query.sql,\n\t\t\t\ttypes: typeConfig,\n\t\t\t}, params).then((r) => mode === 'raw' ? r : r.rows);\n\t\t};\n\n\t\treturn new PgAsyncPreparedQuery<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);\n\t}\n\n\toverride async transaction<T>(\n\t\ttransaction: (tx: VercelPgTransaction<TRelations>) => Promise<T>,\n\t\tconfig?: PgTransactionConfig | undefined,\n\t): Promise<T> {\n\t\tconst session = typeof this.client === 'function' || this.client instanceof VercelPool // oxlint-disable-line drizzle-internal/no-instanceof\n\t\t\t? new VercelPgSession(await this.client.connect(), this.dialect, this.relations, this.options)\n\t\t\t: this;\n\t\tconst tx = new VercelPgTransaction<TRelations>(\n\t\t\tthis.dialect,\n\t\t\tsession,\n\t\t\tthis.relations,\n\t\t\tundefined,\n\t\t\tfalse,\n\t\t);\n\t\ttry {\n\t\t\tawait tx.execute(sql`begin${config ? sql` ${tx.getTransactionConfigSQL(config)}` : undefined}`);\n\t\t\tif (typeof config?.snapshot === 'string') {\n\t\t\t\tawait tx.execute(tx.setTransactionSnapshotSQL(config.snapshot));\n\t\t\t}\n\t\t\tconst result = await transaction(tx);\n\t\t\tawait tx.execute(sql`commit`);\n\t\t\treturn result;\n\t\t} catch (error) {\n\t\t\tawait tx.execute(sql`rollback`);\n\t\t\tthrow error;\n\t\t} finally {\n\t\t\tif (typeof this.client === 'function' || this.client instanceof VercelPool) { // oxlint-disable-line drizzle-internal/no-instanceof\n\t\t\t\t(session.client as VercelPoolClient).release();\n\t\t\t}\n\t\t}\n\t}\n}\n\nexport class VercelPgTransaction<\n\tTRelations extends AnyRelations,\n> extends PgAsyncTransaction<VercelPgQueryResultHKT, TRelations> {\n\tstatic override readonly [entityKind]: string = 'VercelPgTransaction';\n\n\toverride async transaction<T>(\n\t\ttransaction: (tx: VercelPgTransaction<TRelations>) => Promise<T>,\n\t): Promise<T> {\n\t\tconst savepointName = `sp${this.nestedIndex + 1}`;\n\t\tconst tx = new VercelPgTransaction<TRelations>(\n\t\t\tthis.dialect,\n\t\t\tthis.session,\n\t\t\tthis._.relations,\n\t\t\tthis.nestedIndex + 1,\n\t\t\tfalse,\n\t\t);\n\t\tawait tx.execute(sql.raw(`savepoint ${savepointName}`));\n\t\ttry {\n\t\t\tconst result = await transaction(tx);\n\t\t\tawait tx.execute(sql.raw(`release savepoint ${savepointName}`));\n\t\t\treturn result;\n\t\t} catch (err) {\n\t\t\tawait tx.execute(sql.raw(`rollback to savepoint ${savepointName}`));\n\t\t\tthrow err;\n\t\t}\n\t}\n}\n\nexport interface VercelPgQueryResultHKT extends PgQueryResultHKT {\n\ttype: QueryResult<Assume<this['row'], QueryResultRow>>;\n}\n"],"mappings":";;;;;;;;;;;AA6BA,MAAM,QAAQ,QAAa;AAC3B,MAAM,aAAgC,EACrC,iBAAsD,QAAQ,WAAW;AACxE,SAAQ,QAAR;EACC,KAAKA,uBAAM,SAAS;EACpB,KAAKA,uBAAM,SAAS;EACpB,KAAKA,uBAAM,SAAS;EACpB,KAAKA,uBAAM,SAAS;EACpB,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK,KACJ,QAAO;EACR,QACC,QAAOA,uBAAM,cAAc,QAAQ,OAAO;;IAG7C;AAED,IAAa,kBAAb,MAAa,wBAEHC,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,aACC;EACD,MAAM,YAAY,OAAO,SAAS,WAC/B,OACA,SAAS,4DACa,MAAM,KAAK,MAAM,OAAO,GAC9C;EAEH,MAAM,WAAW,OAAO,WAAuB;AAC9C,UAAO,KAAK,OAAO,MAAM;IACxB,MAAM;IACN,SAAS,SAAS,WAAW,UAAU;IACvC,MAAM,MAAM;IACZ,OAAO;IACP,EAAE,OAAO,CAAC,MAAM,MAAM,SAAS,QAAQ,IAAI,EAAE,KAAK;;AAGpD,SAAO,IAAIC,gDACV,UACA,OACA,QACA,MACA,KAAK,QACL,KAAK,OACL,eACA,YACA;;CAGF,MAAe,YACd,aACA,QACa;EACb,MAAM,UAAU,OAAO,KAAK,WAAW,cAAc,KAAK,kBAAkBC,8BACzE,IAAI,gBAAgB,MAAM,KAAK,OAAO,SAAS,EAAE,KAAK,SAAS,KAAK,WAAW,KAAK,QAAQ,GAC5F;EACH,MAAM,KAAK,IAAI,oBACd,KAAK,SACL,SACA,KAAK,WACL,QACA,MACA;AACD,MAAI;AACH,SAAM,GAAG,QAAQ,gBAAG,QAAQ,SAAS,gBAAG,IAAI,GAAG,wBAAwB,OAAO,KAAK,SAAY;AAC/F,OAAI,OAAO,QAAQ,aAAa,SAC/B,OAAM,GAAG,QAAQ,GAAG,0BAA0B,OAAO,SAAS,CAAC;GAEhE,MAAM,SAAS,MAAM,YAAY,GAAG;AACpC,SAAM,GAAG,QAAQ,gBAAG,SAAS;AAC7B,UAAO;WACC,OAAO;AACf,SAAM,GAAG,QAAQ,gBAAG,WAAW;AAC/B,SAAM;YACG;AACT,OAAI,OAAO,KAAK,WAAW,cAAc,KAAK,kBAAkBA,4BAC/D,CAAC,QAAQ,OAA4B,SAAS;;;;AAMlD,IAAa,sBAAb,MAAa,4BAEHC,8CAAuD;CAChE,QAA0BL,0BAAsB;CAEhD,MAAe,YACd,aACa;EACb,MAAM,gBAAgB,KAAK,KAAK,cAAc;EAC9C,MAAM,KAAK,IAAI,oBACd,KAAK,SACL,KAAK,SACL,KAAK,EAAE,WACP,KAAK,cAAc,GACnB,MACA;AACD,QAAM,GAAG,QAAQM,iBAAI,IAAI,aAAa,gBAAgB,CAAC;AACvD,MAAI;GACH,MAAM,SAAS,MAAM,YAAY,GAAG;AACpC,SAAM,GAAG,QAAQA,iBAAI,IAAI,qBAAqB,gBAAgB,CAAC;AAC/D,UAAO;WACC,KAAK;AACb,SAAM,GAAG,QAAQA,iBAAI,IAAI,yBAAyB,gBAAgB,CAAC;AACnE,SAAM"}