{"version":3,"file":"session.cjs","names":["MySqlAsyncSession","entityKind","NoopLogger","NoopCache","MySqlAsyncPreparedQuery","MySqlAsyncTransaction","sql"],"sources":["../../src/planetscale-serverless/session.ts"],"sourcesContent":["import type { Client, Connection, ExecutedQuery, Transaction } from '@planetscale/database';\nimport { type Cache, NoopCache } from '~/cache/core/index.ts';\nimport type { WithCacheConfig } from '~/cache/core/types.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { Logger } from '~/logger.ts';\nimport { NoopLogger } from '~/logger.ts';\nimport { MySqlAsyncPreparedQuery, MySqlAsyncSession, MySqlAsyncTransaction } from '~/mysql-core/async/session.ts';\nimport type { MySqlDialect } from '~/mysql-core/dialect.ts';\nimport type { MySqlPreparedQueryConfig, MySqlQueryResultHKT } from '~/mysql-core/session.ts';\nimport type { AnyRelations } from '~/relations.ts';\nimport { type Query, sql } from '~/sql/sql.ts';\n\nexport interface PlanetscaleSessionOptions {\n\tlogger?: Logger;\n\tcache?: Cache;\n}\n\nexport class PlanetscaleSession<TRelations extends AnyRelations> extends MySqlAsyncSession<\n\tMySqlQueryResultHKT,\n\tTRelations\n> {\n\tstatic override readonly [entityKind]: string = 'PlanetscaleSession';\n\n\tprivate logger: Logger;\n\tprivate client: Client | Transaction | Connection;\n\tprivate cache: Cache;\n\n\tconstructor(\n\t\tprivate baseClient: Client | Connection,\n\t\tdialect: MySqlDialect,\n\t\ttx: Transaction | undefined,\n\t\tprivate relations: TRelations,\n\t\tprivate options: PlanetscaleSessionOptions = {},\n\t) {\n\t\tsuper(dialect);\n\t\tthis.client = tx ?? baseClient;\n\t\tthis.logger = options.logger ?? new NoopLogger();\n\t\tthis.cache = options.cache ?? new NoopCache();\n\t}\n\n\tprepareQuery<T extends MySqlPreparedQueryConfig>(\n\t\tquery: Query,\n\t\tmode: 'arrays' | 'objects' | 'raw',\n\t\tmapper?: (response: Record<string, unknown>[] | unknown[][] | { insertId: number; affectedRows: number }) => 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): MySqlAsyncPreparedQuery<T> {\n\t\tconst { client } = this;\n\t\tconst queryConfig = {\n\t\t\tas: mode === 'arrays' ? 'array' : 'object' as any,\n\t\t};\n\n\t\tconst executor = async (params: any[] = []) => {\n\t\t\tconst raw = client.execute(query.sql, params, queryConfig);\n\n\t\t\tif (mode !== 'raw') return raw.then(({ rows }) => rows);\n\t\t\tif (!mapper) return raw;\n\n\t\t\treturn raw.then(({ insertId, rowsAffected }) => ({\n\t\t\t\tinsertId: Number.parseFloat(insertId),\n\t\t\t\taffectedRows: rowsAffected,\n\t\t\t}));\n\t\t};\n\n\t\treturn new MySqlAsyncPreparedQuery(\n\t\t\texecutor,\n\t\t\tundefined,\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 transaction<T>(\n\t\ttransaction: (tx: PlanetScaleTransaction<TRelations>) => Promise<T>,\n\t): Promise<T> {\n\t\treturn this.baseClient.transaction((pstx) => {\n\t\t\tconst session = new PlanetscaleSession(\n\t\t\t\tthis.baseClient,\n\t\t\t\tthis.dialect,\n\t\t\t\tpstx,\n\t\t\t\tthis.relations,\n\t\t\t\tthis.options,\n\t\t\t);\n\t\t\tconst tx = new PlanetScaleTransaction<TRelations>(\n\t\t\t\tthis.dialect,\n\t\t\t\tsession as MySqlAsyncSession<any, any>,\n\t\t\t\tthis.relations,\n\t\t\t);\n\t\t\treturn transaction(tx);\n\t\t});\n\t}\n}\n\nexport class PlanetScaleTransaction<\n\tTRelations extends AnyRelations,\n> extends MySqlAsyncTransaction<\n\tPlanetscaleQueryResultHKT,\n\tTRelations\n> {\n\tstatic override readonly [entityKind]: string = 'PlanetScaleTransaction';\n\n\tconstructor(\n\t\tdialect: MySqlDialect,\n\t\tsession: MySqlAsyncSession,\n\t\trelations: TRelations,\n\t\tnestedIndex = 0,\n\t) {\n\t\tsuper(dialect, session, relations, nestedIndex);\n\t}\n\n\toverride async transaction<T>(\n\t\ttransaction: (tx: PlanetScaleTransaction<TRelations>) => Promise<T>,\n\t): Promise<T> {\n\t\tconst savepointName = `sp${this.nestedIndex + 1}`;\n\t\tconst tx = new PlanetScaleTransaction<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);\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 PlanetscaleQueryResultHKT extends MySqlQueryResultHKT {\n\ttype: ExecutedQuery;\n}\n"],"mappings":";;;;;;;;;AAiBA,IAAa,qBAAb,MAAa,2BAA4DA,gDAGvE;CACD,QAA0BC,0BAAsB;CAEhD,AAAQ;CACR,AAAQ;CACR,AAAQ;CAER,YACC,AAAQ,YACR,SACA,IACA,AAAQ,WACR,AAAQ,UAAqC,EAAE,EAC9C;AACD,QAAM,QAAQ;EANN;EAGA;EACA;AAGR,OAAK,SAAS,MAAM;AACpB,OAAK,SAAS,QAAQ,UAAU,IAAIC,wBAAY;AAChD,OAAK,QAAQ,QAAQ,SAAS,IAAIC,iCAAW;;CAG9C,aACC,OACA,MACA,QACA,eAIA,aAC6B;EAC7B,MAAM,EAAE,WAAW;EACnB,MAAM,cAAc,EACnB,IAAI,SAAS,WAAW,UAAU,UAClC;EAED,MAAM,WAAW,OAAO,SAAgB,EAAE,KAAK;GAC9C,MAAM,MAAM,OAAO,QAAQ,MAAM,KAAK,QAAQ,YAAY;AAE1D,OAAI,SAAS,MAAO,QAAO,IAAI,MAAM,EAAE,WAAW,KAAK;AACvD,OAAI,CAAC,OAAQ,QAAO;AAEpB,UAAO,IAAI,MAAM,EAAE,UAAU,oBAAoB;IAChD,UAAU,OAAO,WAAW,SAAS;IACrC,cAAc;IACd,EAAE;;AAGJ,SAAO,IAAIC,sDACV,UACA,QACA,OACA,QACA,MACA,KAAK,QACL,KAAK,OACL,eACA,YACA;;CAGF,AAAS,YACR,aACa;AACb,SAAO,KAAK,WAAW,aAAa,SAAS;GAC5C,MAAM,UAAU,IAAI,mBACnB,KAAK,YACL,KAAK,SACL,MACA,KAAK,WACL,KAAK,QACL;AAMD,UAAO,YALI,IAAI,uBACd,KAAK,SACL,SACA,KAAK,UACL,CACqB;IACrB;;;AAIJ,IAAa,yBAAb,MAAa,+BAEHC,oDAGR;CACD,QAA0BJ,0BAAsB;CAEhD,YACC,SACA,SACA,WACA,cAAc,GACb;AACD,QAAM,SAAS,SAAS,WAAW,YAAY;;CAGhD,MAAe,YACd,aACa;EACb,MAAM,gBAAgB,KAAK,KAAK,cAAc;EAC9C,MAAM,KAAK,IAAI,uBACd,KAAK,SACL,KAAK,SACL,KAAK,WACL,KAAK,cAAc,EACnB;AACD,QAAM,GAAG,QAAQK,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"}