@fragno-dev/db 0.1.12 → 0.1.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. package/.turbo/turbo-build.log +27 -27
  2. package/CHANGELOG.md +6 -0
  3. package/dist/adapters/drizzle/drizzle-adapter.d.ts.map +1 -1
  4. package/dist/adapters/drizzle/drizzle-adapter.js +1 -1
  5. package/dist/adapters/drizzle/drizzle-query.d.ts.map +1 -1
  6. package/dist/adapters/drizzle/drizzle-query.js +4 -0
  7. package/dist/adapters/drizzle/drizzle-query.js.map +1 -1
  8. package/dist/adapters/drizzle/drizzle-uow-compiler.js +2 -1
  9. package/dist/adapters/drizzle/drizzle-uow-compiler.js.map +1 -1
  10. package/dist/adapters/drizzle/drizzle-uow-decoder.js +25 -1
  11. package/dist/adapters/drizzle/drizzle-uow-decoder.js.map +1 -1
  12. package/dist/adapters/drizzle/generate.js +1 -1
  13. package/dist/adapters/kysely/kysely-adapter.d.ts +1 -1
  14. package/dist/adapters/kysely/kysely-query.d.ts.map +1 -1
  15. package/dist/adapters/kysely/kysely-query.js +29 -1
  16. package/dist/adapters/kysely/kysely-query.js.map +1 -1
  17. package/dist/adapters/kysely/kysely-uow-compiler.js +2 -1
  18. package/dist/adapters/kysely/kysely-uow-compiler.js.map +1 -1
  19. package/dist/adapters/kysely/migration/execute-base.js +1 -1
  20. package/dist/mod.d.ts +2 -1
  21. package/dist/mod.d.ts.map +1 -1
  22. package/dist/mod.js +2 -1
  23. package/dist/mod.js.map +1 -1
  24. package/dist/query/cursor.d.ts +67 -32
  25. package/dist/query/cursor.d.ts.map +1 -1
  26. package/dist/query/cursor.js +84 -31
  27. package/dist/query/cursor.js.map +1 -1
  28. package/dist/query/query.d.ts +5 -0
  29. package/dist/query/query.d.ts.map +1 -1
  30. package/dist/query/unit-of-work.d.ts +14 -4
  31. package/dist/query/unit-of-work.d.ts.map +1 -1
  32. package/dist/query/unit-of-work.js +52 -9
  33. package/dist/query/unit-of-work.js.map +1 -1
  34. package/package.json +3 -3
  35. package/src/adapters/drizzle/drizzle-adapter-pglite.test.ts +72 -5
  36. package/src/adapters/drizzle/drizzle-adapter-sqlite.test.ts +6 -4
  37. package/src/adapters/drizzle/drizzle-query.ts +9 -0
  38. package/src/adapters/drizzle/drizzle-uow-compiler.test.ts +19 -3
  39. package/src/adapters/drizzle/drizzle-uow-compiler.ts +3 -2
  40. package/src/adapters/drizzle/drizzle-uow-decoder.ts +40 -1
  41. package/src/adapters/kysely/kysely-adapter-pglite.test.ts +102 -4
  42. package/src/adapters/kysely/kysely-query.ts +50 -1
  43. package/src/adapters/kysely/kysely-uow-compiler.test.ts +19 -3
  44. package/src/adapters/kysely/kysely-uow-compiler.ts +3 -2
  45. package/src/mod.ts +6 -1
  46. package/src/query/cursor.test.ts +113 -68
  47. package/src/query/cursor.ts +127 -36
  48. package/src/query/query.ts +19 -0
  49. package/src/query/unit-of-work.ts +133 -15
@@ -1 +1 @@
1
- {"version":3,"file":"cursor.js","names":["json: string","indexValues: Record<string, unknown>","serialized: Record<string, unknown>"],"sources":["../../src/query/cursor.ts"],"sourcesContent":["import type { AnyColumn } from \"../schema/create\";\nimport { serialize } from \"../schema/serialize\";\nimport type { SQLProvider } from \"../shared/providers\";\n\n/**\n * Cursor data structure containing index values and pagination direction\n */\nexport interface CursorData {\n /**\n * Values for each column in the index, keyed by column ORM name\n */\n indexValues: Record<string, unknown>;\n /**\n * Direction of pagination\n */\n direction: \"forward\" | \"backward\";\n}\n\n/**\n * Encode cursor data to a base64 string\n *\n * @param data - The cursor data to encode\n * @returns Base64-encoded cursor string\n *\n * @example\n * ```ts\n * const cursor = encodeCursor({\n * indexValues: { id: \"abc123\", createdAt: 1234567890 },\n * direction: \"forward\"\n * });\n * ```\n */\nexport function encodeCursor(data: CursorData): string {\n const json = JSON.stringify(data);\n // Use Buffer in Node.js or btoa in browsers\n if (typeof Buffer !== \"undefined\") {\n return Buffer.from(json, \"utf-8\").toString(\"base64\");\n }\n return btoa(json);\n}\n\n/**\n * Decode a base64 cursor string back to cursor data\n *\n * @param cursor - The base64-encoded cursor string\n * @returns Decoded cursor data\n * @throws Error if cursor is invalid or malformed\n *\n * @example\n * ```ts\n * const data = decodeCursor(\"eyJpbmRleFZhbHVlcyI6e30sImRpcmVjdGlvbiI6ImZvcndhcmQifQ==\");\n * ```\n */\nexport function decodeCursor(cursor: string): CursorData {\n try {\n let json: string;\n if (typeof Buffer !== \"undefined\") {\n json = Buffer.from(cursor, \"base64\").toString(\"utf-8\");\n } else {\n json = atob(cursor);\n }\n const data = JSON.parse(json);\n\n // Validate structure\n if (\n !data ||\n typeof data !== \"object\" ||\n !data.indexValues ||\n typeof data.indexValues !== \"object\" ||\n (data.direction !== \"forward\" && data.direction !== \"backward\")\n ) {\n throw new Error(\"Invalid cursor structure\");\n }\n\n return data as CursorData;\n } catch (error) {\n throw new Error(`Invalid cursor: ${error instanceof Error ? error.message : \"malformed data\"}`);\n }\n}\n\n/**\n * Create a cursor from a record and index columns\n *\n * @param record - The database record\n * @param indexColumns - The columns that make up the index\n * @param direction - The pagination direction\n * @returns Encoded cursor string\n *\n * @example\n * ```ts\n * const cursor = createCursorFromRecord(\n * { id: \"abc\", name: \"Alice\", createdAt: 123 },\n * [table.columns.createdAt, table.columns.id],\n * \"forward\"\n * );\n * ```\n */\nexport function createCursorFromRecord(\n record: Record<string, unknown>,\n indexColumns: AnyColumn[],\n direction: \"forward\" | \"backward\",\n): string {\n const indexValues: Record<string, unknown> = {};\n\n for (const col of indexColumns) {\n indexValues[col.ormName] = record[col.ormName];\n }\n\n return encodeCursor({ indexValues, direction });\n}\n\n/**\n * Serialize cursor values for database queries\n *\n * Converts cursor values (which are in application format) to database format\n * using the column serialization rules.\n *\n * @param cursorData - The decoded cursor data\n * @param indexColumns - The columns that make up the index\n * @param provider - The SQL provider\n * @returns Serialized values ready for database queries\n *\n * @example\n * ```ts\n * const serialized = serializeCursorValues(\n * cursorData,\n * [table.columns.createdAt],\n * \"postgresql\"\n * );\n * ```\n */\nexport function serializeCursorValues(\n cursorData: CursorData,\n indexColumns: AnyColumn[],\n provider: SQLProvider,\n): Record<string, unknown> {\n const serialized: Record<string, unknown> = {};\n\n for (const col of indexColumns) {\n const value = cursorData.indexValues[col.ormName];\n if (value !== undefined) {\n serialized[col.ormName] = serialize(value, col, provider);\n }\n }\n\n return serialized;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;AAgCA,SAAgB,aAAa,MAA0B;CACrD,MAAM,OAAO,KAAK,UAAU,KAAK;AAEjC,KAAI,OAAO,WAAW,YACpB,QAAO,OAAO,KAAK,MAAM,QAAQ,CAAC,SAAS,SAAS;AAEtD,QAAO,KAAK,KAAK;;;;;;;;;;;;;;AAenB,SAAgB,aAAa,QAA4B;AACvD,KAAI;EACF,IAAIA;AACJ,MAAI,OAAO,WAAW,YACpB,QAAO,OAAO,KAAK,QAAQ,SAAS,CAAC,SAAS,QAAQ;MAEtD,QAAO,KAAK,OAAO;EAErB,MAAM,OAAO,KAAK,MAAM,KAAK;AAG7B,MACE,CAAC,QACD,OAAO,SAAS,YAChB,CAAC,KAAK,eACN,OAAO,KAAK,gBAAgB,YAC3B,KAAK,cAAc,aAAa,KAAK,cAAc,WAEpD,OAAM,IAAI,MAAM,2BAA2B;AAG7C,SAAO;UACA,OAAO;AACd,QAAM,IAAI,MAAM,mBAAmB,iBAAiB,QAAQ,MAAM,UAAU,mBAAmB;;;;;;;;;;;;;;;;;;;;AAqBnG,SAAgB,uBACd,QACA,cACA,WACQ;CACR,MAAMC,cAAuC,EAAE;AAE/C,MAAK,MAAM,OAAO,aAChB,aAAY,IAAI,WAAW,OAAO,IAAI;AAGxC,QAAO,aAAa;EAAE;EAAa;EAAW,CAAC;;;;;;;;;;;;;;;;;;;;;;AAuBjD,SAAgB,sBACd,YACA,cACA,UACyB;CACzB,MAAMC,aAAsC,EAAE;AAE9C,MAAK,MAAM,OAAO,cAAc;EAC9B,MAAM,QAAQ,WAAW,YAAY,IAAI;AACzC,MAAI,UAAU,OACZ,YAAW,IAAI,WAAW,UAAU,OAAO,KAAK,SAAS;;AAI7D,QAAO"}
1
+ {"version":3,"file":"cursor.js","names":["#indexName","#orderDirection","#pageSize","#indexValues","json: string","indexValues: Record<string, unknown>","serialized: Record<string, unknown>"],"sources":["../../src/query/cursor.ts"],"sourcesContent":["import type { AnyColumn } from \"../schema/create\";\nimport { serialize } from \"../schema/serialize\";\nimport type { SQLProvider } from \"../shared/providers\";\n\n/**\n * Cursor object containing all information needed for pagination\n */\nexport class Cursor {\n readonly #indexName: string;\n readonly #orderDirection: \"asc\" | \"desc\";\n readonly #pageSize: number;\n readonly #indexValues: Record<string, unknown>;\n\n constructor(data: {\n indexName: string;\n orderDirection: \"asc\" | \"desc\";\n pageSize: number;\n indexValues: Record<string, unknown>;\n }) {\n this.#indexName = data.indexName;\n this.#orderDirection = data.orderDirection;\n this.#pageSize = data.pageSize;\n this.#indexValues = data.indexValues;\n }\n\n /**\n * Get the index name being used for pagination\n */\n get indexName(): string {\n return this.#indexName;\n }\n\n /**\n * Get the ordering direction\n */\n get orderDirection(): \"asc\" | \"desc\" {\n return this.#orderDirection;\n }\n\n /**\n * Get the page size\n */\n get pageSize(): number {\n return this.#pageSize;\n }\n\n /**\n * Get the cursor position values\n */\n get indexValues(): Record<string, unknown> {\n return this.#indexValues;\n }\n\n /**\n * Encode cursor to an opaque base64 string (safe to send to client)\n */\n encode(): string {\n const data: CursorData = {\n v: 1,\n indexName: this.#indexName,\n orderDirection: this.#orderDirection,\n pageSize: this.#pageSize,\n indexValues: this.#indexValues,\n };\n return encodeCursorData(data);\n }\n}\n\n/**\n * Result of a cursor-based query containing items and pagination cursor\n */\nexport interface CursorResult<T> {\n /**\n * The query results\n */\n items: T[];\n /**\n * Cursor to fetch the next page (undefined if no more results)\n */\n cursor?: Cursor;\n}\n\n/**\n * Cursor data structure for serialization\n */\nexport interface CursorData {\n v: number; // version\n indexName: string;\n orderDirection: \"asc\" | \"desc\";\n pageSize: number;\n indexValues: Record<string, unknown>;\n}\n\n/**\n * Encode cursor data to a base64 string (internal)\n */\nfunction encodeCursorData(data: CursorData): string {\n const json = JSON.stringify(data);\n // Use Buffer in Node.js or btoa in browsers\n if (typeof Buffer !== \"undefined\") {\n return Buffer.from(json, \"utf-8\").toString(\"base64\");\n }\n return btoa(json);\n}\n\n/**\n * Decode a base64 cursor string back to a Cursor object\n *\n * @param cursor - The base64-encoded cursor string\n * @returns Decoded Cursor object\n * @throws Error if cursor is invalid or malformed\n *\n * @example\n * ```ts\n * const cursor = decodeCursor(\"eyJpbmRleFZhbHVlcyI6e30sImRpcmVjdGlvbiI6ImZvcndhcmQifQ==\");\n * ```\n */\nexport function decodeCursor(cursor: string): Cursor {\n try {\n let json: string;\n if (typeof Buffer !== \"undefined\") {\n json = Buffer.from(cursor, \"base64\").toString(\"utf-8\");\n } else {\n json = atob(cursor);\n }\n const data = JSON.parse(json);\n\n // Validate structure\n if (\n !data ||\n typeof data !== \"object\" ||\n !data.indexValues ||\n typeof data.indexValues !== \"object\" ||\n typeof data.pageSize !== \"number\" ||\n !data.indexName ||\n !data.orderDirection ||\n (data.orderDirection !== \"asc\" && data.orderDirection !== \"desc\")\n ) {\n throw new Error(\"Invalid cursor structure\");\n }\n\n // Only support v1\n const version = typeof data.v === \"number\" ? data.v : 0;\n if (version !== 1) {\n throw new Error(`Unsupported cursor version: ${version}. Only v1 is supported.`);\n }\n\n return new Cursor({\n indexName: data.indexName,\n orderDirection: data.orderDirection,\n pageSize: data.pageSize,\n indexValues: data.indexValues,\n });\n } catch (error) {\n throw new Error(`Invalid cursor: ${error instanceof Error ? error.message : \"malformed data\"}`);\n }\n}\n\n/**\n * Create a cursor from a record and pagination metadata\n *\n * @param record - The database record\n * @param indexColumns - The columns that make up the index\n * @param metadata - Pagination metadata (index name, order direction, page size)\n * @returns Cursor object\n *\n * @example\n * ```ts\n * const cursor = createCursorFromRecord(\n * { id: \"abc\", name: \"Alice\", createdAt: 123 },\n * [table.columns.createdAt, table.columns.id],\n * {\n * indexName: \"idx_created\",\n * orderDirection: \"asc\",\n * pageSize: 10\n * }\n * );\n * ```\n */\nexport function createCursorFromRecord(\n record: Record<string, unknown>,\n indexColumns: AnyColumn[],\n metadata: {\n indexName: string;\n orderDirection: \"asc\" | \"desc\";\n pageSize: number;\n },\n): Cursor {\n const indexValues: Record<string, unknown> = {};\n\n for (const col of indexColumns) {\n indexValues[col.ormName] = record[col.ormName];\n }\n\n return new Cursor({\n indexName: metadata.indexName,\n orderDirection: metadata.orderDirection,\n pageSize: metadata.pageSize,\n indexValues,\n });\n}\n\n/**\n * Serialize cursor values for database queries\n *\n * Converts cursor values (which are in application format) to database format\n * using the column serialization rules.\n *\n * @param cursor - The cursor object\n * @param indexColumns - The columns that make up the index\n * @param provider - The SQL provider\n * @returns Serialized values ready for database queries\n *\n * @example\n * ```ts\n * const serialized = serializeCursorValues(\n * cursor,\n * [table.columns.createdAt],\n * \"postgresql\"\n * );\n * ```\n */\nexport function serializeCursorValues(\n cursor: Cursor,\n indexColumns: AnyColumn[],\n provider: SQLProvider,\n): Record<string, unknown> {\n const serialized: Record<string, unknown> = {};\n\n for (const col of indexColumns) {\n const value = cursor.indexValues[col.ormName];\n if (value !== undefined) {\n serialized[col.ormName] = serialize(value, col, provider);\n }\n }\n\n return serialized;\n}\n"],"mappings":";;;;;;AAOA,IAAa,SAAb,MAAoB;CAClB,CAASA;CACT,CAASC;CACT,CAASC;CACT,CAASC;CAET,YAAY,MAKT;AACD,QAAKH,YAAa,KAAK;AACvB,QAAKC,iBAAkB,KAAK;AAC5B,QAAKC,WAAY,KAAK;AACtB,QAAKC,cAAe,KAAK;;;;;CAM3B,IAAI,YAAoB;AACtB,SAAO,MAAKH;;;;;CAMd,IAAI,iBAAiC;AACnC,SAAO,MAAKC;;;;;CAMd,IAAI,WAAmB;AACrB,SAAO,MAAKC;;;;;CAMd,IAAI,cAAuC;AACzC,SAAO,MAAKC;;;;;CAMd,SAAiB;AAQf,SAAO,iBAPkB;GACvB,GAAG;GACH,WAAW,MAAKH;GAChB,gBAAgB,MAAKC;GACrB,UAAU,MAAKC;GACf,aAAa,MAAKC;GACnB,CAC4B;;;;;;AAgCjC,SAAS,iBAAiB,MAA0B;CAClD,MAAM,OAAO,KAAK,UAAU,KAAK;AAEjC,KAAI,OAAO,WAAW,YACpB,QAAO,OAAO,KAAK,MAAM,QAAQ,CAAC,SAAS,SAAS;AAEtD,QAAO,KAAK,KAAK;;;;;;;;;;;;;;AAenB,SAAgB,aAAa,QAAwB;AACnD,KAAI;EACF,IAAIC;AACJ,MAAI,OAAO,WAAW,YACpB,QAAO,OAAO,KAAK,QAAQ,SAAS,CAAC,SAAS,QAAQ;MAEtD,QAAO,KAAK,OAAO;EAErB,MAAM,OAAO,KAAK,MAAM,KAAK;AAG7B,MACE,CAAC,QACD,OAAO,SAAS,YAChB,CAAC,KAAK,eACN,OAAO,KAAK,gBAAgB,YAC5B,OAAO,KAAK,aAAa,YACzB,CAAC,KAAK,aACN,CAAC,KAAK,kBACL,KAAK,mBAAmB,SAAS,KAAK,mBAAmB,OAE1D,OAAM,IAAI,MAAM,2BAA2B;EAI7C,MAAM,UAAU,OAAO,KAAK,MAAM,WAAW,KAAK,IAAI;AACtD,MAAI,YAAY,EACd,OAAM,IAAI,MAAM,+BAA+B,QAAQ,yBAAyB;AAGlF,SAAO,IAAI,OAAO;GAChB,WAAW,KAAK;GAChB,gBAAgB,KAAK;GACrB,UAAU,KAAK;GACf,aAAa,KAAK;GACnB,CAAC;UACK,OAAO;AACd,QAAM,IAAI,MAAM,mBAAmB,iBAAiB,QAAQ,MAAM,UAAU,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;AAyBnG,SAAgB,uBACd,QACA,cACA,UAKQ;CACR,MAAMC,cAAuC,EAAE;AAE/C,MAAK,MAAM,OAAO,aAChB,aAAY,IAAI,WAAW,OAAO,IAAI;AAGxC,QAAO,IAAI,OAAO;EAChB,WAAW,SAAS;EACpB,gBAAgB,SAAS;EACzB,UAAU,SAAS;EACnB;EACD,CAAC;;;;;;;;;;;;;;;;;;;;;;AAuBJ,SAAgB,sBACd,QACA,cACA,UACyB;CACzB,MAAMC,aAAsC,EAAE;AAE9C,MAAK,MAAM,OAAO,cAAc;EAC9B,MAAM,QAAQ,OAAO,YAAY,IAAI;AACrC,MAAI,UAAU,OACZ,YAAW,IAAI,WAAW,UAAU,OAAO,KAAK,SAAS;;AAI7D,QAAO"}
@@ -1,5 +1,6 @@
1
1
  import { AnySchema, AnyTable, FragnoId, IdColumn, Relation } from "../schema/create.js";
2
2
  import { Condition, ConditionBuilder } from "./condition-builder.js";
3
+ import { CursorResult } from "./cursor.js";
3
4
  import { DeleteBuilder, FindBuilder, UnitOfWork, UpdateBuilder, UpdateManyBuilder } from "./unit-of-work.js";
4
5
  import { Prettify } from "../util/types.js";
5
6
 
@@ -49,6 +50,10 @@ interface AbstractQuery<TSchema extends AnySchema, TUOWConfig = void> {
49
50
  <TableName extends keyof TSchema["tables"] & string, const TBuilderResult>(table: TableName, builderFn: (builder: Omit<FindBuilder<TSchema["tables"][TableName]>, "build">) => TBuilderResult): Promise<SelectResult<TSchema["tables"][TableName], ExtractJoinOut<TBuilderResult>, Extract<ExtractSelect<TBuilderResult>, SelectClause<TSchema["tables"][TableName]>>>[]>;
50
51
  <TableName extends keyof TSchema["tables"] & string>(table: TableName): Promise<SelectResult<TSchema["tables"][TableName], {}, true>[]>;
51
52
  };
53
+ /**
54
+ * Find multiple records with cursor pagination metadata
55
+ */
56
+ findWithCursor: <TableName extends keyof TSchema["tables"] & string, const TBuilderResult>(table: TableName, builderFn: (builder: Omit<FindBuilder<TSchema["tables"][TableName]>, "build">) => TBuilderResult) => Promise<CursorResult<SelectResult<TSchema["tables"][TableName], ExtractJoinOut<TBuilderResult>, Extract<ExtractSelect<TBuilderResult>, SelectClause<TSchema["tables"][TableName]>>>>>;
52
57
  /**
53
58
  * Find the first record matching the criteria
54
59
  * Implemented as a wrapper around find() with pageSize(1)
@@ -1 +1 @@
1
- {"version":3,"file":"query.d.ts","names":[],"sources":["../../src/query/query.ts"],"sourcesContent":[],"mappings":"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"}
1
+ {"version":3,"file":"query.d.ts","names":[],"sources":["../../src/query/query.ts"],"sourcesContent":[],"mappings":";;;;;;;KAYY,eAAA,GAAkB,aAAa;KAE/B,uBAAuB,0BAA0B;AAFjD,KAIA,eAJe,CAAA,UAIW,QAJR,CAAA,GAAA,QAElB,MAGE,CAHF,CAAA,SAAY,CAAA,IAAW,MAAA,SAGU,CAHiB,GAAA,KAAA,GAGL,CAHK,GAGD,CAHC,CAAA,SAAA,CAAA,CAGY,CAHZ,CAAA,CAAA,MAAA,CAAA,EAE9D;AAAsC,KAI1B,mBAJ0B,CAAA,UAII,QAJJ,CAAA,GAIgB,QAJhB,CAIyB,eAJzB,CAIyC,CAJzC,CAAA,CAAA;KAMjC,YALS,CAAA,CAAA,CAAA,GAAA,QAA+B,MAM/B,CAN+B,IAAA,IAAA,SAMb,CANa,CAMX,CANW,CAAA,GAMN,CANM,GAAA,KAAA,GAMM,CANN,CAMQ,CANR,CAAA,EAAY;KASpD,eATwD,CAAA,CAAA,CAAA,GAAA,QAAa,MAU5D,CAV4D,IAAA,IAAA,SAU1C,CAV0C,CAUxC,CAVwC,CAAA,GAAA,KAAA,GAU3B,CAV2B,GAUvB,CAVuB,CAUrB,CAVqB,CAAA,EAAC;AAG3E,KAUK,eAVO,CAAA,UAUmB,QAVA,CAAA,GAAA,QAAW,MAW5B,CAX4B,CAAA,SAAA,CAAA,IAAA,MAAA,SAWG,CAXH,GAAA,KAAA,GAWe,CAXf,GAWmB,CAXnB,CAAA,SAAA,CAAA,CAWgC,CAXhC,CAAA,CAAA,KAAA,CAAA,EAAqC;AAAhB,KAcnD,mBAdmD,CAAA,UAcrB,QAdqB,CAAA,GAcT,QAdS,CAe7D,OAf6D,CAerD,YAfqD,CAexC,eAfwC,CAexB,CAfwB,CAAA,CAAA,CAAA,GAejB,eAfiB,CAeD,eAfC,CAee,CAff,CAAA,CAAA,CAAA;AAAT,KAkB1C,mBAlB0C,CAAA,UAkBZ,QAlBY,CAAA,GAAA,QAAQ,MAmBhD,CAnBgD,CAAA,SAAA,CAAA,IAAA,MAAA,SAmBjB,CAnBiB,GAAA,KAAA,GAmBL,CAnBK,IAmBA,CAnBA,CAAA,SAAA,CAAA,CAmBa,CAnBb,CAAA,SAmBwB,QAnBxB,GAAA,KAAA,GAqBxD,CArBwD,CAAA,SAAA,CAAA,CAqB3C,CArB2C,CAAA,CAAA,KAAA,CAAA,EAAqB;KAwB9E,gBArBS,CAAA,UAqBkB,YArBlB,CAqB+B,CArB/B,CAAA,EAAA,UAqB6C,QArB7C,CAAA,GAqByD,CArBzD,SAAA,IAAA,GAsBV,mBAtBU,CAsBU,CAtBV,CAAA,GAuBV,CAvBU,SAAA,CAAA,MAuBO,CAvBP,CAAA,SAAA,CAAA,CAAA,EAAA,GAwBR,QAxBQ,CAAA,QAyBA,CAzBkB,CAAA,MAAA,CAAA,IAAA,MAAA,SAyBU,CAzBV,GAAA,KAAA,GAyBsB,CAzBtB,GAyB0B,CAzB1B,SAAA,MAyB0C,CAzB1C,CAAA,SAAA,CAAA,GA0BpB,CA1BoB,CAAA,SAAA,CAAA,CA0BP,CA1BO,CAAA,CAAA,MAAA,CAAA,GAAA,KAAA,EAAE,CAAA,GAAA,KAAA;AAAK,KA+B3B,YA/B2B,CAAA,UA+BJ,QA/BI,EAAA,OAAA,EAAA,eA+B8B,YA/B9B,CA+B2C,CA/B3C,CAAA,CAAA,GA+BiD,QA/BjD,CAgCrC,gBAhCqC,CAgCpB,MAhCoB,EAgCZ,CAhCY,CAAA,GAgCP,OAhCO,CAAA;UAmC7B,eAnCyC,CAAA,MAAA,CAAA,CAAA;EAAE,GAAA,EAoC9C,MApC8C,GAAA,IAAA;EAAC,IAAA,EAqC9C,MArC8C,EAAA;AAAA;AAIxC,KAoCF,WApCE,CAAA,UAoCoB,QApCpB,EAAA,MAAA,CAAA,CAAA,CAAA,GAAA,QAAkB,MAqClB,CArCkB,CAAA,WAAA,CAAA,GAqCD,CArCC,CAAA,WAAA,CAAA,CAqCc,CArCd,CAAA,SAqCyB,QArCzB,CAAA,KAAA,KAAA,EAAA,KAAA,OAAA,CAAA,GAAA,CAAA,eAsCV,YAtCU,CAsCG,MAtCH,CAAA,GAAA,IAAA,EAAA,UAAA,CAAA,CAAA,CAAA,CAAA,OAAA,CAAA,EAuCd,eAvCc,CAuCE,MAvCF,EAuCU,MAvCV,EAuCkB,OAvClB,EAAA,KAAA,CAAA,EAAA,GAwCrB,WAxCqB,CAyCxB,CAzCwB,EA0CxB,QA1CwB,CA2CtB,GA3CsB,GAAA,SA4Cb,CA5Ce,GA4CX,eA5CW,CA4CK,YA5CL,CA4CkB,MA5ClB,EA4C0B,OA5C1B,EA4CmC,MA5CnC,CAAA,CAAA,CA4C4C,IA5C5C,CAAA,EAAa,CAAA,CAAA,GAAA,KAAA,EAAI;AAAE,KAmDzC,OAnDyC,CAAA,SAAA,MAAA,CAAA,GAAA,CAAA,UAAA,EAmDD,MAnDC,EAAA,KAAA,GAAA,MAAA,CAAA;;AAAC;;;KAyDjD,aArDwC,CAAA,CAAA,CAAA,GAuD3C,CAvD2C,SAuDjC,WAvDiC,CAAA,GAAA,EAAA,KAAA,QAAA,EAAA,GAAA,CAAA,GAwDvC,OAxDuC,GA0DvC,CA1DuC,SA0D7B,IA1D6B,CA0DxB,WA1DwB,CAAA,GAAA,EAAA,KAAA,QAAA,EAAA,GAAA,CAAA,EAAA,GAAA,CAAA,GA2DrC,OA3DqC,GAAA,IAAA;;;;;AAG7C,KA+DK,cA/DO,CAAA,CAAA,CAAA,GAiEV,CAjE6B,SAiEnB,WAjEmB,CAAA,GAAA,EAAA,GAAA,EAAA,KAAA,SAAA,CAAA,GAkEzB,QAlEyB,GAoEzB,CApEyB,SAoEf,IApEe,CAoEV,WApEU,CAAA,GAAA,EAAA,GAAA,EAAA,KAAA,SAAA,CAAA,EAAA,GAAA,CAAA,GAqEvB,QArEuB,GAAA,CAAA,CAAA;AAAW,KAwE9B,gBAxE8B,CAAA,UAyE9B,QAzE8B,GAyEnB,QAzEmB,EAAA,eA0EzB,YA1EyB,CA0EZ,CA1EY,CAAA,GA0EP,YA1EO,CA0EM,CA1EN,CAAA,EAAA,UAAA,CAAA,CAAA,EAAA,eAAA,OAAA,GAAA,IAAA,CAAA,GA6EtC,IA7EsC,CA8ExC,eA9EwC,CA8ExB,CA9EwB,EA8ErB,MA9EqB,EA8Eb,OA9Ea,EA8EJ,MA9EI,CAAA,EA+ExC,MA/EwC,SAAA,IAAA,GAAA,OAAA,GAAA,OAAA,GAAA,QAAA,GAAA,SAAA,CAAA;AACH,KAiF3B,eAjF2B,CAAA,UAkF3B,QAlF2B,GAkFhB,QAlFgB,EAAA,eAmFtB,YAnFsB,CAmFT,CAnFS,CAAA,GAmFJ,YAnFI,CAmFS,CAnFT,CAAA,EAAA,WAAA,CAAA,CAAA,EAAA,eAAA,OAAA,GAAA,IAAA,CAAA,GAAA;EAAhB,MAAA,CAAA,EAuFZ,MAvFY;EAAb,KAAA,CAAA,EAAA,CAAA,EAAA,EAwFK,gBAxFL,CAwFsB,CAxFtB,CAAA,SAAA,CAAA,CAAA,EAAA,GAwFwC,SAxFxC,GAAA,OAAA;EAAR,KAAA,CAAA,EAAA,MAAA;EAA4E,OAAA,CAAA,EA0FlE,OA1FkE,CAAA,MA0FpD,CA1FoD,CAAA,SAAA,CAAA,CAAA,GA0FpC,OA1FoC,CAAA,MA0FtB,CA1FsB,CAAA,SAAA,CAAA,CAAA,EAAA;EAAhB,IAAA,CAAA,EAAA,CAAA,EAAA,EA2FhD,WA3FgD,CA2FpC,CA3FoC,CAAA,EAAA,GAAA,IAAA;CAAhB,GAAA,CA4FzC,MA5FyC,SAAA,IAAA,GAAA;EADQ,MAAA,CAAA,EAAA,MAAA;CAAQ,GAAA,CAAA,CAAA,CAAA;AAIlD,UAgGK,aAhGc,CAAA,gBAgGgB,SAhGhB,EAAA,aAAA,IAAA,CAAA,CAAA;EAAW;;;EACe,IAAA,EAAA;IAAK,CAAA,kBAAA,MAqGjC,OArGiC,CAAA,QAAA,CAAA,GAAA,MAAA,EAAA,oBAAA,CAAA,CAAA,KAAA,EAsGjD,SAtGiD,EAAA,SAAA,EAAA,CAAA,OAAA,EAwG7C,IAxG6C,CAwGxC,WAxGwC,CAwG5B,OAxG4B,CAAA,QAAA,CAAA,CAwGV,SAxGU,CAAA,CAAA,EAAA,OAAA,CAAA,EAAA,GAyGnD,cAzGmD,CAAA,EA0GvD,OA1GuD,CA2GxD,YA3GwD,CA4GtD,OA5GsD,CAAA,QAAA,CAAA,CA4GpC,SA5GoC,CAAA,EA6GtD,cA7GsD,CA6GvC,cA7GuC,CAAA,EA8GtD,OA9GsD,CA8G9C,aA9G8C,CA8GhC,cA9GgC,CAAA,EA8Gf,YA9Ge,CA8GF,OA9GE,CAAA,QAAA,CAAA,CA8GgB,SA9GhB,CAAA,CAAA,CAAA,CAAA,EAAA,CAAA;IAAa,CAAA,kBAAA,MAkH9C,OAlH8C,CAAA,QAAA,CAAA,GAAA,MAAA,CAAA,CAAA,KAAA,EAmH9D,SAnH8D,CAAA,EAoHpE,OApHoE,CAoH5D,YApH4D,CAoH/C,OApH+C,CAAA,QAAA,CAAA,CAoH7B,SApH6B,CAAA,EAAA,CAAA,CAAA,EAAA,IAAA,CAAA,EAAA,CAAA;EAAW,CAAA;EAEhF;;;EAGD,cAAA,EAAA,CAAA,kBAAgB,MAqHsB,OArHtB,CAAA,QAAA,CAAA,GAAA,MAAA,EAAA,oBAAA,CAAA,CAAA,KAAA,EAsHV,SAtHU,EAAA,SAAA,EAAA,CAAA,OAAA,EAwHN,IAxHM,CAwHD,WAxHC,CAwHW,OAxHX,CAAA,QAAA,CAAA,CAwH6B,SAxH7B,CAAA,CAAA,EAAA,OAAA,CAAA,EAAA,GAyHZ,cAzHY,EAAA,GA0Hd,OA1Hc,CA2HjB,YA3HiB,CA4Hf,YA5He,CA6Hb,OA7Ha,CAAA,QAAA,CAAA,CA6HK,SA7HL,CAAA,EA8Hb,cA9Ha,CA8HE,cA9HF,CAAA,EA+Hb,OA/Ha,CA+HL,aA/HK,CA+HS,cA/HT,CAAA,EA+H0B,YA/H1B,CA+HuC,OA/HvC,CAAA,QAAA,CAAA,CA+HyD,SA/HzD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;EAAwB;;;;EACrB,SAAA,EAAA;IAApB,CAAA,kBAAA,MA0IyB,OA1IzB,CAAA,QAAA,CAAA,GAAA,MAAA,EAAA,oBAAA,CAAA,CAAA,KAAA,EA2IS,SA3IT,EAAA,SAAA,EAAA,CAAA,OAAA,EA6Ia,IA7Ib,CA6IkB,WA7IlB,CA6I8B,OA7I9B,CAAA,QAAA,CAAA,CA6IgD,SA7IhD,CAAA,CAAA,EAAA,OAAA,CAAA,EAAA,GA8IO,cA9IP,CAAA,EA+IG,OA/IH,CA+IW,YA/IX,CAgJE,OAhJF,CAAA,QAAA,CAAA,CAgJoB,SAhJpB,CAAA,EAiJE,cAjJF,CAiJiB,cAjJjB,CAAA,EAkJE,OAlJF,CAkJU,aAlJV,CAkJwB,cAlJxB,CAAA,EAkJyC,YAlJzC,CAkJsD,OAlJtD,CAAA,QAAA,CAAA,CAkJwE,SAlJxE,CAAA,CAAA,CAAA,CAAA,GAAA,IAAA,CAAA;IACA,CAAA,kBAAA,MAoJyB,OApJzB,CAAA,QAAA,CAAA,GAAA,MAAA,CAAA,CAAA,KAAA,EAqJS,SArJT,CAAA,EAsJG,OAtJH,CAsJW,YAtJX,CAsJwB,OAtJxB,CAAA,QAAA,CAAA,CAsJ0C,SAtJ1C,CAAA,EAAA,CAAA,CAAA,EAAA,IAAA,CAAA,GAAA,IAAA,CAAA;EAAiB,CAAA;EAEP;;;;EAA4D,MAAA,EAAA,CAAA,kBAAA,MA2JvC,OA3JuC,CAAA,QAAA,CAAA,GAAA,MAAA,CAAA,CAAA,KAAA,EA4J/D,SA5J+D,EAAA,MAAA,EA6J9D,mBA7J8D,CA6J1C,OA7J0C,CAAA,QAAA,CAAA,CA6JxB,SA7JwB,CAAA,CAAA,EAAA,GA8JnE,OA9JmE,CA8J3D,QA9J2D,CAAA;EAC9D;;;;EAKA,UAAA,EAAA,CAAA,kBAAY,MA8Je,OA9Jf,CAAA,QAAA,CAAA,GAAA,MAAA,CAAA,CAAA,KAAA,EA+Jb,SA/Ja,EAAA,MAAA,EAgKZ,mBAhKY,CAgKQ,OAhKR,CAAA,QAAA,CAAA,CAgK0B,SAhK1B,CAAA,CAAA,EAAA,EAAA,GAiKjB,OAjKiB,CAiKT,QAjKS,EAAA,CAAA;EAAW;;;;EACR,MAAA,EAAA,CAAA,kBAAA,MAsKQ,OAtKR,CAAA,QAAA,CAAA,GAAA,MAAA,CAAA,CAAA,KAAA,EAuKhB,SAvKgB,EAAA,EAAA,EAwKnB,QAxKmB,GAAA,MAAA,EAAA,SAAA,EAAA,CAAA,OAAA,EA0KZ,IA1KY,CA0KP,aA1KO,CA0KO,OA1KP,CAAA,QAAA,CAAA,CA0KyB,SA1KzB,CAAA,CAAA,EAAA,OAAA,CAAA,EAAA,GA2KlB,IA3KkB,CA2Kb,aA3Ka,CA2KC,OA3KD,CAAA,QAAA,CAAA,CA2KmB,SA3KnB,CAAA,CAAA,EAAA,OAAA,CAAA,EAAA,GA4KpB,OA5KoB,CAAA,IAAA,CAAA;EAAzB;;;;EAGQ,UAAA,EAAA,CAAA,kBAAe,MA+Kc,OA7K/B,CAAA,QAAI,CAAA,GAAA,MAAA,CAAA,CAAA,KAAA,EA8KD,SA9KC,EAAA,SAAA,EAAA,CAAA,OAAA,EA+Ka,iBA/Kb,CA+K+B,OA/K/B,CAAA,QAAA,CAAA,CA+KiD,SA/KjD,CAAA,CAAA,EAAA,GAAA,IAAA,EAAA,GAgLL,OAhLK,CAAA,IAAA,CAAA;EAGA;;;EACmB,MAAA,EAAA,CAAA,kBAAA,MAiLI,OAjLJ,CAAA,QAAA,CAAA,GAAA,MAAA,CAAA,CAAA,KAAA,EAkLpB,SAlLoB,EAAA,EAAA,EAmLvB,QAnLuB,GAAA,MAAA,EAAA,SAAA,CAAA,EAAA,CAAA,OAAA,EAoLL,IApLK,CAoLA,aApLA,EAAA,OAAA,CAAA,EAAA,GAoL4B,IApL5B,CAoLiC,aApLjC,EAAA,OAAA,CAAA,EAAA,GAqLxB,OArLwB,CAAA,IAAA,CAAA;EAAe;;;EACxB,UAAA,EAAA,CAAA,kBAAA,MAyLiB,OAzLjB,CAAA,QAAA,CAAA,GAAA,MAAA,CAAA,CAAA,KAAA,EA0LX,SA1LW,EAAA,SAAA,EAAA,CAAA,OAAA,EA4LP,IA5LO,CA4LF,WA5LE,CA4LU,OA5LV,CAAA,QAAA,CAAA,CA4L4B,SA5L5B,CAAA,CAAA,EAAA,OAAA,GAAA,OAAA,CAAA,EAAA,GAAA,IAAA,EAAA,GA8Lf,OA9Le,CAAA,IAAA,CAAA;EACY;;;EAAhB,gBAAA,EAAA,CAAA,IAAA,CAAA,EAAA,MAAA,EAAA,MAAA,CAAA,EAkM2B,UAlM3B,EAAA,GAkM0C,UAlM1C,CAkMqD,OAlMrD,EAAA,EAAA,CAAA"}
@@ -1,6 +1,7 @@
1
1
  import { AnySchema, AnyTable, FragnoId, IdColumn, Index, Relation } from "../schema/create.js";
2
2
  import { Condition, ConditionBuilder } from "./condition-builder.js";
3
3
  import { CompiledJoin } from "./orm/orm.js";
4
+ import { Cursor, CursorResult } from "./cursor.js";
4
5
  import { SelectClause, SelectResult, TableToInsertValues, TableToUpdateValues } from "./query.js";
5
6
 
6
7
  //#region src/query/unit-of-work.d.ts
@@ -72,11 +73,11 @@ type FindOptions<TTable extends AnyTable = AnyTable, TSelect extends SelectClaus
72
73
  /**
73
74
  * Cursor for pagination - continue after this cursor
74
75
  */
75
- after?: string;
76
+ after?: Cursor | string;
76
77
  /**
77
78
  * Cursor for pagination - continue before this cursor
78
79
  */
79
- before?: string;
80
+ before?: Cursor | string;
80
81
  /**
81
82
  * Number of results per page
82
83
  */
@@ -98,6 +99,7 @@ type RetrievalOperation<TSchema extends AnySchema, TTable extends AnyTable = TSc
98
99
  table: TTable;
99
100
  indexName: string;
100
101
  options: FindOptions<TTable, SelectClause<TTable>>;
102
+ withCursor?: boolean;
101
103
  } | {
102
104
  type: "count";
103
105
  table: TTable;
@@ -212,12 +214,16 @@ declare class FindBuilder<TTable extends AnyTable, TSelect extends SelectClause<
212
214
  orderByIndex<TIndexName extends ValidIndexName<TTable>>(indexName: TIndexName, direction: "asc" | "desc"): this;
213
215
  /**
214
216
  * Set cursor to continue pagination after this point (forward pagination)
217
+ * If a Cursor object is provided, its metadata will be used to set defaults for
218
+ * index, orderByIndex, and pageSize (if not explicitly set)
215
219
  */
216
- after(cursor: string): this;
220
+ after(cursor: Cursor | string): this;
217
221
  /**
218
222
  * Set cursor to continue pagination before this point (backward pagination)
223
+ * If a Cursor object is provided, its metadata will be used to set defaults for
224
+ * index, orderByIndex, and pageSize (if not explicitly set)
219
225
  */
220
- before(cursor: string): this;
226
+ before(cursor: Cursor | string): this;
221
227
  /**
222
228
  * Set the number of results per page
223
229
  */
@@ -388,6 +394,10 @@ declare class UnitOfWork<const TSchema extends AnySchema, const TRetrievalResult
388
394
  * Add a find operation using a builder callback (retrieval phase only)
389
395
  */
390
396
  find<TTableName extends keyof TSchema["tables"] & string, TSelect extends SelectClause<TSchema["tables"][TTableName]> = true, TJoinOut = {}>(tableName: TTableName, builderFn?: (builder: Omit<FindBuilder<TSchema["tables"][TTableName]>, "build">) => Omit<FindBuilder<TSchema["tables"][TTableName], TSelect, TJoinOut>, "build"> | void): UnitOfWork<TSchema, [...TRetrievalResults, SelectResult<TSchema["tables"][TTableName], TJoinOut, TSelect>[]], TRawInput>;
397
+ /**
398
+ * Add a find operation with cursor metadata (retrieval phase only)
399
+ */
400
+ findWithCursor<TTableName extends keyof TSchema["tables"] & string, TSelect extends SelectClause<TSchema["tables"][TTableName]> = true, TJoinOut = {}>(tableName: TTableName, builderFn: (builder: Omit<FindBuilder<TSchema["tables"][TTableName]>, "build">) => Omit<FindBuilder<TSchema["tables"][TTableName], TSelect, TJoinOut>, "build"> | void): UnitOfWork<TSchema, [...TRetrievalResults, CursorResult<SelectResult<TSchema["tables"][TTableName], TJoinOut, TSelect>>], TRawInput>;
391
401
  /**
392
402
  * Add a create operation (mutation phase only)
393
403
  * Returns a FragnoId with the external ID that can be used immediately in subsequent operations
@@ -1 +1 @@
1
- {"version":3,"file":"unit-of-work.d.ts","names":[],"sources":["../../src/query/unit-of-work.ts"],"sourcesContent":[],"mappings":"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"}
1
+ {"version":3,"file":"unit-of-work.d.ts","names":[],"sources":["../../src/query/unit-of-work.ts"],"sourcesContent":[],"mappings":"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"}
@@ -1,4 +1,5 @@
1
1
  import { FragnoId } from "../schema/create.js";
2
+ import { Cursor } from "./cursor.js";
2
3
  import { buildCondition } from "./condition-builder.js";
3
4
 
4
5
  //#region src/query/unit-of-work.ts
@@ -17,6 +18,7 @@ var FindBuilder = class {
17
18
  #selectClause;
18
19
  #joinClause;
19
20
  #countMode = false;
21
+ #cursorMetadata;
20
22
  constructor(tableName, table) {
21
23
  this.#tableName = tableName;
22
24
  this.#table = table;
@@ -61,16 +63,22 @@ var FindBuilder = class {
61
63
  }
62
64
  /**
63
65
  * Set cursor to continue pagination after this point (forward pagination)
66
+ * If a Cursor object is provided, its metadata will be used to set defaults for
67
+ * index, orderByIndex, and pageSize (if not explicitly set)
64
68
  */
65
69
  after(cursor) {
66
70
  this.#afterCursor = cursor;
71
+ if (cursor instanceof Cursor) this.#cursorMetadata = cursor;
67
72
  return this;
68
73
  }
69
74
  /**
70
75
  * Set cursor to continue pagination before this point (backward pagination)
76
+ * If a Cursor object is provided, its metadata will be used to set defaults for
77
+ * index, orderByIndex, and pageSize (if not explicitly set)
71
78
  */
72
79
  before(cursor) {
73
80
  this.#beforeCursor = cursor;
81
+ if (cursor instanceof Cursor) this.#cursorMetadata = cursor;
74
82
  return this;
75
83
  }
76
84
  /**
@@ -92,30 +100,46 @@ var FindBuilder = class {
92
100
  * @internal
93
101
  */
94
102
  build() {
95
- if (!this.#indexName) throw new Error(`Must specify an index using .whereIndex() before finalizing find operation on table "${this.#tableName}"`);
103
+ let indexName = this.#indexName;
104
+ let orderByIndex = this.#orderByIndexClause;
105
+ let pageSize = this.#pageSizeValue;
106
+ if (this.#cursorMetadata) {
107
+ if (!indexName) indexName = this.#cursorMetadata.indexName;
108
+ if (!orderByIndex) orderByIndex = {
109
+ indexName: this.#cursorMetadata.indexName,
110
+ direction: this.#cursorMetadata.orderDirection
111
+ };
112
+ if (pageSize === void 0) pageSize = this.#cursorMetadata.pageSize;
113
+ if (indexName && indexName !== this.#cursorMetadata.indexName) throw new Error(`Index mismatch: builder specifies "${indexName}" but cursor specifies "${this.#cursorMetadata.indexName}"`);
114
+ if (orderByIndex && (orderByIndex.indexName !== this.#cursorMetadata.indexName || orderByIndex.direction !== this.#cursorMetadata.orderDirection)) throw new Error(`Order mismatch: builder and cursor specify different ordering`);
115
+ if (pageSize !== void 0 && pageSize !== this.#cursorMetadata.pageSize) throw new Error(`Page size mismatch: builder specifies ${pageSize} but cursor specifies ${this.#cursorMetadata.pageSize}`);
116
+ }
117
+ if (!indexName) throw new Error(`Must specify an index using .whereIndex() before finalizing find operation on table "${this.#tableName}"`);
96
118
  if (this.#countMode) return {
97
119
  type: "count",
98
- indexName: this.#indexName,
120
+ indexName,
99
121
  options: {
100
- useIndex: this.#indexName,
122
+ useIndex: indexName,
101
123
  where: this.#whereClause
102
124
  }
103
125
  };
104
126
  let compiledJoins;
105
127
  if (this.#joinClause) compiledJoins = buildJoinIndexed(this.#table, this.#joinClause);
128
+ const afterCursor = this.#afterCursor instanceof Cursor ? this.#afterCursor.encode() : this.#afterCursor;
129
+ const beforeCursor = this.#beforeCursor instanceof Cursor ? this.#beforeCursor.encode() : this.#beforeCursor;
106
130
  const options = {
107
- useIndex: this.#indexName,
131
+ useIndex: indexName,
108
132
  select: this.#selectClause,
109
133
  where: this.#whereClause,
110
- orderByIndex: this.#orderByIndexClause,
111
- after: this.#afterCursor,
112
- before: this.#beforeCursor,
113
- pageSize: this.#pageSizeValue,
134
+ orderByIndex,
135
+ after: afterCursor,
136
+ before: beforeCursor,
137
+ pageSize,
114
138
  joins: compiledJoins
115
139
  };
116
140
  return {
117
141
  type: "find",
118
- indexName: this.#indexName,
142
+ indexName,
119
143
  options
120
144
  };
121
145
  }
@@ -417,6 +441,25 @@ var UnitOfWork = class {
417
441
  return this;
418
442
  }
419
443
  /**
444
+ * Add a find operation with cursor metadata (retrieval phase only)
445
+ */
446
+ findWithCursor(tableName, builderFn) {
447
+ if (this.#state !== "building-retrieval") throw new Error(`findWithCursor() can only be called during retrieval phase. Current state: ${this.#state}`);
448
+ const table = this.#schema.tables[tableName];
449
+ if (!table) throw new Error(`Table ${tableName} not found in schema`);
450
+ const builder = new FindBuilder(tableName, table);
451
+ builderFn(builder);
452
+ const { indexName, options, type } = builder.build();
453
+ this.#retrievalOps.push({
454
+ type,
455
+ table,
456
+ indexName,
457
+ options,
458
+ withCursor: true
459
+ });
460
+ return this;
461
+ }
462
+ /**
420
463
  * Add a create operation (mutation phase only)
421
464
  * Returns a FragnoId with the external ID that can be used immediately in subsequent operations
422
465
  */
@@ -1 +1 @@
1
- {"version":3,"file":"unit-of-work.js","names":["#table","#tableName","#indexName","#whereClause","#countMode","#selectClause","#orderByIndexClause","#afterCursor","#beforeCursor","#pageSizeValue","#joinClause","compiledJoins: CompiledJoin[] | undefined","options: FindOptions<TTable, TSelect>","#id","#setValues","#checkVersion","compiled: CompiledJoin[]","builder: Record<string, unknown>","conditions: Condition | undefined","orderBy: [AnyColumn, \"asc\" | \"desc\"][] | undefined","#schema","#compiler","#executor","#decoder","#name","#config","#state","#retrievalOps","retrievalBatch: unknown[]","#retrievalResults","externalId: string","#mutationOps","mutationBatch: CompiledMutation<unknown>[]","#createdInternalIds","createdIds: FragnoId[]","retrievalBatch: TOutput[]","mutationBatch: CompiledMutation<TOutput>[]"],"sources":["../../src/query/unit-of-work.ts"],"sourcesContent":["import type { AnySchema, AnyTable, Index, IdColumn, AnyColumn, Relation } from \"../schema/create\";\nimport { FragnoId } from \"../schema/create\";\nimport type { Condition, ConditionBuilder } from \"./condition-builder\";\nimport type { SelectClause, TableToInsertValues, TableToUpdateValues, SelectResult } from \"./query\";\nimport { buildCondition } from \"./condition-builder\";\nimport type { CompiledJoin } from \"./orm/orm\";\n\n/**\n * Builder for updateMany operations that supports both whereIndex and set chaining\n */\nexport interface UpdateManyBuilder<TTable extends AnyTable> {\n whereIndex<TIndexName extends ValidIndexName<TTable>>(\n indexName: TIndexName,\n condition?: (eb: IndexSpecificConditionBuilder<TTable, TIndexName>) => Condition | boolean,\n ): this;\n set(values: TableToUpdateValues<TTable>): this;\n}\n\n/**\n * Extract column names from a single index\n */\nexport type IndexColumns<TIndex extends Index> = TIndex[\"columnNames\"][number];\n\ntype RemoveEmptyObject<T> = T extends object ? (keyof T extends never ? never : T) : never;\n\n/**\n * Extract all indexed column names from a table's indexes\n */\ntype IndexedColumns<TIndexes extends Record<string, Index>> = TIndexes[keyof TIndexes] extends Index\n ? IndexColumns<TIndexes[keyof TIndexes]>\n : never;\n\ntype OmitNever<T> = { [K in keyof T as T[K] extends never ? never : K]: T[K] };\n\n/**\n * Extract the name of the ID column from a table\n * Checks if column has 'id' property set to true (which IdColumn class has)\n */\nexport type InferIdColumnName<TTable extends AnyTable> = keyof OmitNever<{\n [K in keyof TTable[\"columns\"]]: TTable[\"columns\"][K] extends IdColumn<\n infer _,\n infer __,\n infer ___\n >\n ? K\n : never;\n}>;\n\n/**\n * Get the columns for a specific index name.\n * For \"primary\", returns only the ID column.\n * For named indexes, returns the columns defined in that index.\n */\ntype ColumnsForIndex<\n TTable extends AnyTable,\n TIndexName extends ValidIndexName<TTable>,\n> = TIndexName extends \"primary\"\n ? Pick<TTable[\"columns\"], InferIdColumnName<TTable>>\n : TIndexName extends keyof TTable[\"indexes\"]\n ? Pick<TTable[\"columns\"], IndexColumns<TTable[\"indexes\"][TIndexName]>>\n : never;\n\n/**\n * ConditionBuilder restricted to indexed columns only.\n * Used throughout Unit of Work to ensure all queries can leverage indexes for optimal performance.\n */\nexport type IndexedConditionBuilder<TTable extends AnyTable> = ConditionBuilder<\n Pick<TTable[\"columns\"], IndexedColumns<TTable[\"indexes\"]>>\n>;\n\n/**\n * ConditionBuilder restricted to columns in a specific index.\n */\ntype IndexSpecificConditionBuilder<\n TTable extends AnyTable,\n TIndexName extends ValidIndexName<TTable>,\n> = ConditionBuilder<ColumnsForIndex<TTable, TIndexName>>;\n\n/**\n * Valid index names for a table, including the static \"primary\" index\n */\nexport type ValidIndexName<TTable extends AnyTable> =\n | \"primary\"\n | (string & keyof TTable[\"indexes\"]);\n\n/**\n * Find options for Unit of Work (internal, used after builder finalization)\n */\ntype FindOptions<\n TTable extends AnyTable = AnyTable,\n TSelect extends SelectClause<TTable> = SelectClause<TTable>,\n> = {\n /**\n * Which index to use for this query (required)\n */\n useIndex: string;\n /**\n * Select clause - which columns to return\n */\n select?: TSelect;\n /**\n * Where clause - filtering restricted to indexed columns only\n */\n where?: (eb: IndexedConditionBuilder<TTable>) => Condition | boolean;\n /**\n * Order by index - specify which index to order by and direction\n */\n orderByIndex?: {\n indexName: string;\n direction: \"asc\" | \"desc\";\n };\n /**\n * Cursor for pagination - continue after this cursor\n */\n after?: string;\n /**\n * Cursor for pagination - continue before this cursor\n */\n before?: string;\n /**\n * Number of results per page\n */\n pageSize?: number;\n /**\n * Join operations to include related data\n */\n joins?: CompiledJoin[];\n};\n\n/**\n * Unit of Work state machine\n */\nexport type UOWState = \"building-retrieval\" | \"building-mutation\" | \"executed\";\n\n/**\n * Retrieval operation - read operations in the first phase\n */\nexport type RetrievalOperation<\n TSchema extends AnySchema,\n TTable extends AnyTable = TSchema[\"tables\"][keyof TSchema[\"tables\"]],\n> =\n | {\n type: \"find\";\n table: TTable;\n indexName: string;\n options: FindOptions<TTable, SelectClause<TTable>>;\n }\n | {\n type: \"count\";\n table: TTable;\n indexName: string;\n options: Pick<FindOptions<TTable>, \"where\" | \"useIndex\">;\n };\n\n/**\n * Mutation operations - write operations in the second phase\n */\nexport type MutationOperation<\n TSchema extends AnySchema,\n TTable extends AnyTable = TSchema[\"tables\"][keyof TSchema[\"tables\"]],\n> =\n | {\n type: \"update\";\n table: TTable[\"name\"];\n id: FragnoId | string;\n checkVersion: boolean;\n set: TableToUpdateValues<TTable>;\n }\n | {\n type: \"create\";\n table: TTable[\"name\"];\n values: TableToInsertValues<TTable>;\n generatedExternalId: string;\n }\n | {\n type: \"delete\";\n table: TTable[\"name\"];\n id: FragnoId | string;\n checkVersion: boolean;\n };\n\n/**\n * Compiled mutation with metadata for execution\n */\nexport interface CompiledMutation<TOutput> {\n query: TOutput;\n /**\n * Number of rows this operation must affect for the transaction to succeed.\n * If actual affected rows doesn't match, it indicates a version conflict.\n * null means don't check affected rows (e.g., for create operations).\n */\n expectedAffectedRows: number | null;\n}\n\n/**\n * Compiler interface for Unit of Work operations\n */\nexport interface UOWCompiler<TSchema extends AnySchema, TOutput> {\n /**\n * Compile a retrieval operation to the adapter's query format\n */\n compileRetrievalOperation(op: RetrievalOperation<TSchema>): TOutput | null;\n\n /**\n * Compile a mutation operation to the adapter's query format\n */\n compileMutationOperation(op: MutationOperation<TSchema>): CompiledMutation<TOutput> | null;\n}\n\nexport type MutationResult =\n | { success: true; createdInternalIds: (bigint | null)[] }\n | { success: false };\n\n/**\n * Executor interface for Unit of Work operations\n */\nexport interface UOWExecutor<TOutput, TRawResult = unknown> {\n /**\n * Execute the retrieval phase - all queries run in a single transaction for snapshot isolation\n */\n executeRetrievalPhase(retrievalBatch: TOutput[]): Promise<TRawResult[]>;\n\n /**\n * Execute the mutation phase - all queries run in a transaction with version checks\n * Returns success status indicating if mutations completed without conflicts,\n * and internal IDs for create operations (null if database doesn't support RETURNING)\n */\n executeMutationPhase(mutationBatch: CompiledMutation<TOutput>[]): Promise<MutationResult>;\n}\n\n/**\n * Decoder interface for Unit of Work retrieval results\n *\n * Transforms raw database results into application format (e.g., converting raw columns\n * into FragnoId objects with external ID, internal ID, and version).\n */\nexport interface UOWDecoder<TSchema extends AnySchema, TRawInput = unknown> {\n /**\n * Decode raw database results from the retrieval phase\n *\n * @param rawResults - Array of raw result sets from database queries\n * @param operations - Array of retrieval operations that produced these results\n * @returns Decoded results in application format\n */\n (rawResults: TRawInput[], operations: RetrievalOperation<TSchema>[]): unknown[];\n}\n\n/**\n * Builder for find operations in Unit of Work\n */\nexport class FindBuilder<\n TTable extends AnyTable,\n TSelect extends SelectClause<TTable> = true,\n TJoinOut = {},\n> {\n readonly #table: TTable;\n readonly #tableName: string;\n\n #indexName?: string;\n #whereClause?: (eb: IndexedConditionBuilder<TTable>) => Condition | boolean;\n #orderByIndexClause?: {\n indexName: string;\n direction: \"asc\" | \"desc\";\n };\n #afterCursor?: string;\n #beforeCursor?: string;\n #pageSizeValue?: number;\n #selectClause?: TSelect;\n #joinClause?: (jb: IndexedJoinBuilder<TTable, {}>) => IndexedJoinBuilder<TTable, TJoinOut>;\n #countMode = false;\n\n constructor(tableName: string, table: TTable) {\n this.#tableName = tableName;\n this.#table = table;\n }\n\n /**\n * Specify which index to use and optionally filter the results\n */\n whereIndex<TIndexName extends ValidIndexName<TTable>>(\n indexName: TIndexName,\n condition?: (eb: IndexSpecificConditionBuilder<TTable, TIndexName>) => Condition | boolean,\n ): this {\n // Validate index exists (primary is always valid)\n if (indexName !== \"primary\" && !(indexName in this.#table.indexes)) {\n throw new Error(\n `Index \"${String(indexName)}\" not found on table \"${this.#tableName}\". ` +\n `Available indexes: primary, ${Object.keys(this.#table.indexes).join(\", \")}`,\n );\n }\n\n this.#indexName = indexName === \"primary\" ? \"_primary\" : indexName;\n if (condition) {\n // Safe: IndexSpecificConditionBuilder is a subset of IndexedConditionBuilder.\n // The condition will only reference columns in the specific index, which are also indexed columns.\n this.#whereClause = condition as unknown as (\n eb: IndexedConditionBuilder<TTable>,\n ) => Condition | boolean;\n }\n return this;\n }\n\n /**\n * Specify columns to select\n * @throws Error if selectCount() has already been called\n */\n select<const TNewSelect extends SelectClause<TTable>>(\n columns: TNewSelect,\n ): FindBuilder<TTable, TNewSelect, TJoinOut> {\n if (this.#countMode) {\n throw new Error(\n `Cannot call select() after selectCount() on table \"${this.#tableName}\". ` +\n `Use either select() or selectCount(), not both.`,\n );\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (this as any).#selectClause = columns;\n return this as unknown as FindBuilder<TTable, TNewSelect, TJoinOut>;\n }\n\n /**\n * Select count instead of records\n * @throws Error if select() has already been called\n */\n selectCount(): this {\n if (this.#selectClause !== undefined) {\n throw new Error(\n `Cannot call selectCount() after select() on table \"${this.#tableName}\". ` +\n `Use either select() or selectCount(), not both.`,\n );\n }\n this.#countMode = true;\n return this;\n }\n\n /**\n * Order results by index in ascending or descending order\n */\n orderByIndex<TIndexName extends ValidIndexName<TTable>>(\n indexName: TIndexName,\n direction: \"asc\" | \"desc\",\n ): this {\n // Validate index exists (primary is always valid)\n if (indexName !== \"primary\" && !(indexName in this.#table.indexes)) {\n throw new Error(\n `Index \"${String(indexName)}\" not found on table \"${this.#tableName}\". ` +\n `Available indexes: primary, ${Object.keys(this.#table.indexes).join(\", \")}`,\n );\n }\n\n this.#orderByIndexClause = {\n indexName: indexName === \"primary\" ? \"_primary\" : indexName,\n direction,\n };\n return this;\n }\n\n /**\n * Set cursor to continue pagination after this point (forward pagination)\n */\n after(cursor: string): this {\n this.#afterCursor = cursor;\n return this;\n }\n\n /**\n * Set cursor to continue pagination before this point (backward pagination)\n */\n before(cursor: string): this {\n this.#beforeCursor = cursor;\n return this;\n }\n\n /**\n * Set the number of results per page\n */\n pageSize(size: number): this {\n this.#pageSizeValue = size;\n return this;\n }\n\n /**\n * Add joins to include related data\n * Join where clauses are restricted to indexed columns only\n */\n join<TNewJoinOut>(\n joinFn: (jb: IndexedJoinBuilder<TTable, {}>) => IndexedJoinBuilder<TTable, TNewJoinOut>,\n ): FindBuilder<TTable, TSelect, TNewJoinOut> {\n this.#joinClause = joinFn;\n return this as unknown as FindBuilder<TTable, TSelect, TNewJoinOut>;\n }\n\n /**\n * @internal\n */\n build():\n | { type: \"find\"; indexName: string; options: FindOptions<TTable, TSelect> }\n | {\n type: \"count\";\n indexName: string;\n options: Pick<FindOptions<TTable>, \"where\" | \"useIndex\">;\n } {\n if (!this.#indexName) {\n throw new Error(\n `Must specify an index using .whereIndex() before finalizing find operation on table \"${this.#tableName}\"`,\n );\n }\n\n // If in count mode, return count operation\n if (this.#countMode) {\n return {\n type: \"count\",\n indexName: this.#indexName,\n options: {\n useIndex: this.#indexName,\n where: this.#whereClause,\n },\n };\n }\n\n // Compile joins if provided\n let compiledJoins: CompiledJoin[] | undefined;\n if (this.#joinClause) {\n compiledJoins = buildJoinIndexed(this.#table, this.#joinClause);\n }\n\n const options: FindOptions<TTable, TSelect> = {\n useIndex: this.#indexName,\n select: this.#selectClause,\n where: this.#whereClause,\n orderByIndex: this.#orderByIndexClause,\n after: this.#afterCursor,\n before: this.#beforeCursor,\n pageSize: this.#pageSizeValue,\n joins: compiledJoins,\n };\n\n return { type: \"find\", indexName: this.#indexName, options };\n }\n}\n\n/**\n * Builder for update operations in Unit of Work\n */\nexport class UpdateBuilder<TTable extends AnyTable> {\n readonly #tableName: string;\n readonly #id: FragnoId | string;\n\n #checkVersion = false;\n #setValues?: TableToUpdateValues<TTable>;\n\n constructor(tableName: string, id: FragnoId | string) {\n this.#tableName = tableName;\n this.#id = id;\n }\n\n /**\n * Specify values to update\n */\n set(values: TableToUpdateValues<TTable>): this {\n this.#setValues = values;\n return this;\n }\n\n /**\n * Enable version checking for optimistic concurrency control\n * @throws Error if the ID is just a string (no version available)\n */\n check(): this {\n if (typeof this.#id === \"string\") {\n throw new Error(\n `Cannot use check() with a string ID on table \"${this.#tableName}\". ` +\n `Version checking requires a FragnoId with version information.`,\n );\n }\n this.#checkVersion = true;\n return this;\n }\n\n /**\n * @internal\n */\n build(): {\n id: FragnoId | string;\n checkVersion: boolean;\n set: TableToUpdateValues<TTable>;\n } {\n if (!this.#setValues) {\n throw new Error(\n `Must specify values using .set() before finalizing update operation on table \"${this.#tableName}\"`,\n );\n }\n\n return {\n id: this.#id,\n checkVersion: this.#checkVersion,\n set: this.#setValues,\n };\n }\n}\n\n/**\n * Builder for delete operations in Unit of Work\n */\nexport class DeleteBuilder {\n readonly #tableName: string;\n readonly #id: FragnoId | string;\n\n #checkVersion = false;\n\n constructor(tableName: string, id: FragnoId | string) {\n this.#tableName = tableName;\n this.#id = id;\n }\n\n /**\n * Enable version checking for optimistic concurrency control\n * @throws Error if the ID is just a string (no version available)\n */\n check(): this {\n if (typeof this.#id === \"string\") {\n throw new Error(\n `Cannot use check() with a string ID on table \"${this.#tableName}\". ` +\n `Version checking requires a FragnoId with version information.`,\n );\n }\n this.#checkVersion = true;\n return this;\n }\n\n /**\n * @internal\n */\n build(): { id: FragnoId | string; checkVersion: boolean } {\n return {\n id: this.#id,\n checkVersion: this.#checkVersion,\n };\n }\n}\n\n/**\n * Builder for join operations in Unit of Work\n * Similar to FindBuilder but tailored for joins (no cursor pagination, no count mode)\n */\nexport class JoinFindBuilder<\n TTable extends AnyTable,\n TSelect extends SelectClause<TTable> = true,\n TJoinOut = {},\n> {\n readonly #table: TTable;\n readonly #tableName: string;\n\n #indexName?: string;\n #whereClause?: (eb: IndexedConditionBuilder<TTable>) => Condition | boolean;\n #orderByIndexClause?: {\n indexName: string;\n direction: \"asc\" | \"desc\";\n };\n #pageSizeValue?: number;\n #selectClause?: TSelect;\n #joinClause?: (jb: IndexedJoinBuilder<TTable, TJoinOut>) => IndexedJoinBuilder<TTable, TJoinOut>;\n\n constructor(tableName: string, table: TTable) {\n this.#tableName = tableName;\n this.#table = table;\n }\n\n /**\n * Specify which index to use and optionally filter the results\n */\n whereIndex<TIndexName extends ValidIndexName<TTable>>(\n indexName: TIndexName,\n condition?: (eb: IndexSpecificConditionBuilder<TTable, TIndexName>) => Condition | boolean,\n ): this {\n // Validate index exists (primary is always valid)\n if (indexName !== \"primary\" && !(indexName in this.#table.indexes)) {\n throw new Error(\n `Index \"${String(indexName)}\" not found on table \"${this.#tableName}\". ` +\n `Available indexes: primary, ${Object.keys(this.#table.indexes).join(\", \")}`,\n );\n }\n\n this.#indexName = indexName === \"primary\" ? \"_primary\" : indexName;\n if (condition) {\n // Safe: IndexSpecificConditionBuilder is a subset of IndexedConditionBuilder.\n // The condition will only reference columns in the specific index, which are also indexed columns.\n this.#whereClause = condition as unknown as (\n eb: IndexedConditionBuilder<TTable>,\n ) => Condition | boolean;\n }\n return this;\n }\n\n /**\n * Specify columns to select\n */\n select<const TNewSelect extends SelectClause<TTable>>(\n columns: TNewSelect,\n ): JoinFindBuilder<TTable, TNewSelect, TJoinOut> {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (this as any).#selectClause = columns;\n return this as unknown as JoinFindBuilder<TTable, TNewSelect, TJoinOut>;\n }\n\n /**\n * Order results by index in ascending or descending order\n */\n orderByIndex<TIndexName extends ValidIndexName<TTable>>(\n indexName: TIndexName,\n direction: \"asc\" | \"desc\",\n ): this {\n // Validate index exists (primary is always valid)\n if (indexName !== \"primary\" && !(indexName in this.#table.indexes)) {\n throw new Error(\n `Index \"${String(indexName)}\" not found on table \"${this.#tableName}\". ` +\n `Available indexes: primary, ${Object.keys(this.#table.indexes).join(\", \")}`,\n );\n }\n\n this.#orderByIndexClause = {\n indexName: indexName === \"primary\" ? \"_primary\" : indexName,\n direction,\n };\n return this;\n }\n\n /**\n * Set the number of results to return\n */\n pageSize(size: number): this {\n this.#pageSizeValue = size;\n return this;\n }\n\n /**\n * Add joins to include related data\n * Join where clauses are restricted to indexed columns only\n */\n join<TNewJoinOut>(\n joinFn: (jb: IndexedJoinBuilder<TTable, {}>) => IndexedJoinBuilder<TTable, TNewJoinOut>,\n ): JoinFindBuilder<TTable, TSelect, TJoinOut & TNewJoinOut> {\n this.#joinClause = joinFn;\n return this as unknown as JoinFindBuilder<TTable, TSelect, TJoinOut & TNewJoinOut>;\n }\n\n /**\n * @internal\n */\n build(): {\n indexName: string | undefined;\n select: TSelect | undefined;\n where: ((eb: IndexedConditionBuilder<TTable>) => Condition | boolean) | undefined;\n orderByIndex:\n | {\n indexName: string;\n direction: \"asc\" | \"desc\";\n }\n | undefined;\n pageSize: number | undefined;\n joins: CompiledJoin[] | undefined;\n } {\n // Compile joins if provided\n let compiledJoins: CompiledJoin[] | undefined;\n if (this.#joinClause) {\n compiledJoins = buildJoinIndexed(this.#table, this.#joinClause);\n }\n\n return {\n indexName: this.#indexName,\n select: this.#selectClause,\n where: this.#whereClause,\n orderByIndex: this.#orderByIndexClause,\n pageSize: this.#pageSizeValue,\n joins: compiledJoins,\n };\n }\n}\n\ninterface MapRelationType<T> {\n // FIXME: Not sure why we need the RemoveEmptyObject, we should somehow fix at the source where it's added to the union\n one: RemoveEmptyObject<T> | null;\n many: RemoveEmptyObject<T>[];\n}\n\n/**\n * Join builder with indexed-only where clauses for Unit of Work\n * TJoinOut accumulates the types of all joined relations\n */\nexport type IndexedJoinBuilder<TTable extends AnyTable, TJoinOut> = {\n [K in keyof TTable[\"relations\"]]: TTable[\"relations\"][K] extends Relation<\n infer TRelationType,\n infer TTargetTable\n >\n ? <TSelect extends SelectClause<TTable[\"relations\"][K][\"table\"]> = true, TNestedJoinOut = {}>(\n builderFn?: (\n builder: JoinFindBuilder<TTable[\"relations\"][K][\"table\"]>,\n ) => JoinFindBuilder<TTable[\"relations\"][K][\"table\"], TSelect, TNestedJoinOut>,\n ) => IndexedJoinBuilder<\n TTable,\n TJoinOut & {\n [P in K]: MapRelationType<\n SelectResult<TTargetTable, TNestedJoinOut, TSelect>\n >[TRelationType];\n }\n >\n : never;\n};\n\n/**\n * Build join operations with indexed-only where clauses for Unit of Work\n * This ensures all join conditions can leverage indexes for optimal performance\n */\nexport function buildJoinIndexed<TTable extends AnyTable, TJoinOut>(\n table: TTable,\n fn: (builder: IndexedJoinBuilder<TTable, {}>) => IndexedJoinBuilder<TTable, TJoinOut>,\n): CompiledJoin[] {\n const compiled: CompiledJoin[] = [];\n const builder: Record<string, unknown> = {};\n\n for (const name in table.relations) {\n const relation = table.relations[name]!;\n\n builder[name] = (builderFn?: (b: JoinFindBuilder<AnyTable>) => JoinFindBuilder<AnyTable>) => {\n // Create join builder for this relation's table\n const joinBuilder = new JoinFindBuilder(relation.table.ormName, relation.table);\n if (builderFn) {\n builderFn(joinBuilder);\n }\n const config = joinBuilder.build();\n\n // Build condition with indexed columns only\n let conditions: Condition | undefined;\n if (config.where) {\n const cond = buildCondition(relation.table.columns, config.where);\n if (cond === true) {\n conditions = undefined;\n } else if (cond === false) {\n // If condition evaluates to false, skip this join\n compiled.push({\n relation,\n options: false,\n });\n delete builder[name];\n return builder;\n } else {\n conditions = cond;\n }\n }\n\n // Build orderBy from orderByIndex if provided\n let orderBy: [AnyColumn, \"asc\" | \"desc\"][] | undefined;\n if (config.orderByIndex) {\n const index = relation.table.indexes[config.orderByIndex.indexName];\n if (index) {\n // Use all columns from the index for ordering\n orderBy = index.columns.map(\n (col) => [col, config.orderByIndex!.direction] as [AnyColumn, \"asc\" | \"desc\"],\n );\n } else {\n // Fallback to ID column if index not found\n orderBy = [[relation.table.getIdColumn(), config.orderByIndex.direction]];\n }\n }\n\n compiled.push({\n relation,\n options: {\n select: config.select ?? true,\n where: conditions,\n orderBy,\n join: config.joins,\n limit: config.pageSize,\n },\n });\n\n delete builder[name];\n return builder;\n };\n }\n\n fn(builder as IndexedJoinBuilder<TTable, {}>);\n return compiled;\n}\n\nexport function createUnitOfWork<\n const TSchema extends AnySchema,\n const TRetrievalResults extends unknown[] = [],\n const TRawInput = unknown,\n>(\n schema: TSchema,\n compiler: UOWCompiler<TSchema, unknown>,\n executor: UOWExecutor<unknown, TRawInput>,\n decoder: UOWDecoder<TSchema, TRawInput>,\n name?: string,\n): UnitOfWork<TSchema, TRetrievalResults, TRawInput> {\n return new UnitOfWork(schema, compiler, executor, decoder, name) as UnitOfWork<\n TSchema,\n TRetrievalResults,\n TRawInput\n >;\n}\n\nexport interface UnitOfWorkConfig {\n dryRun?: boolean;\n onQuery?: (query: unknown) => void;\n}\n\n/**\n * Unit of Work implementation with optimistic concurrency control\n *\n * UOW has two phases:\n * 1. Retrieval phase: Read operations to fetch entities with their versions\n * 2. Mutation phase: Write operations that check versions before committing\n *\n * @example\n * ```ts\n * const uow = queryEngine.createUnitOfWork(\"update-user-balance\");\n *\n * // Retrieval phase\n * uow.find(\"users\", (b) => b.where(\"primary\", (eb) => eb(\"id\", \"=\", userId)));\n *\n * // Execute retrieval and transition to mutation phase\n * const [users] = await uow.executeRetrieve();\n *\n * // Mutation phase with version check\n * const user = users[0];\n * uow.update(\"users\", user.id, (b) => b.set({ balance: newBalance }).check());\n *\n * // Execute mutations\n * const { success } = await uow.executeMutations();\n * if (!success) {\n * // Handle version conflict\n * }\n * ```\n */\nexport class UnitOfWork<\n const TSchema extends AnySchema,\n const TRetrievalResults extends unknown[] = [],\n const TRawInput = unknown,\n> {\n #schema: TSchema;\n\n #name?: string;\n #config?: UnitOfWorkConfig;\n\n #state: UOWState = \"building-retrieval\";\n\n #retrievalOps: RetrievalOperation<TSchema>[] = [];\n #mutationOps: MutationOperation<TSchema>[] = [];\n\n #compiler: UOWCompiler<TSchema, unknown>;\n #executor: UOWExecutor<unknown, TRawInput>;\n #decoder: UOWDecoder<TSchema, TRawInput>;\n\n #retrievalResults?: TRetrievalResults;\n #createdInternalIds: (bigint | null)[] = [];\n\n constructor(\n schema: TSchema,\n compiler: UOWCompiler<TSchema, unknown>,\n executor: UOWExecutor<unknown, TRawInput>,\n decoder: UOWDecoder<TSchema, TRawInput>,\n name?: string,\n config?: UnitOfWorkConfig,\n ) {\n this.#schema = schema;\n this.#compiler = compiler;\n this.#executor = executor;\n this.#decoder = decoder;\n this.#name = name;\n this.#config = config;\n }\n\n get schema(): TSchema {\n return this.#schema;\n }\n\n get state(): UOWState {\n return this.#state;\n }\n\n get name(): string | undefined {\n return this.#name;\n }\n\n /**\n * Execute the retrieval phase and transition to mutation phase\n * Returns all results from find operations\n */\n async executeRetrieve(): Promise<TRetrievalResults> {\n if (this.#retrievalOps.length === 0) {\n return [] as unknown as TRetrievalResults;\n }\n\n if (this.#state !== \"building-retrieval\") {\n throw new Error(\n `Cannot execute retrieval from state ${this.#state}. Must be in building-retrieval state.`,\n );\n }\n\n // Compile retrieval operations\n const retrievalBatch: unknown[] = [];\n for (const op of this.#retrievalOps) {\n const compiled = this.#compiler.compileRetrievalOperation(op);\n if (compiled !== null) {\n this.#config?.onQuery?.(compiled);\n\n retrievalBatch.push(compiled);\n }\n }\n\n if (this.#config?.dryRun) {\n this.#state = \"executed\";\n return [] as unknown as TRetrievalResults;\n }\n\n const results = this.#decoder(\n await this.#executor.executeRetrievalPhase(retrievalBatch),\n this.#retrievalOps,\n );\n\n // Store results and transition to mutation phase\n this.#retrievalResults = results as TRetrievalResults;\n this.#state = \"building-mutation\";\n\n return this.#retrievalResults;\n }\n\n /**\n * Add a find operation using a builder callback (retrieval phase only)\n */\n find<\n TTableName extends keyof TSchema[\"tables\"] & string,\n TSelect extends SelectClause<TSchema[\"tables\"][TTableName]> = true,\n TJoinOut = {},\n >(\n tableName: TTableName,\n builderFn?: (\n // We omit \"build\" because we don't want to expose it to the user\n builder: Omit<FindBuilder<TSchema[\"tables\"][TTableName]>, \"build\">,\n ) => Omit<FindBuilder<TSchema[\"tables\"][TTableName], TSelect, TJoinOut>, \"build\"> | void,\n ): UnitOfWork<\n TSchema,\n [...TRetrievalResults, SelectResult<TSchema[\"tables\"][TTableName], TJoinOut, TSelect>[]],\n TRawInput\n > {\n if (this.#state !== \"building-retrieval\") {\n throw new Error(\n `find() can only be called during retrieval phase. Current state: ${this.#state}`,\n );\n }\n\n const table = this.#schema.tables[tableName];\n if (!table) {\n throw new Error(`Table ${tableName} not found in schema`);\n }\n\n // Create builder, pass to callback (or use default), then extract configuration\n const builder = new FindBuilder(tableName, table as TSchema[\"tables\"][TTableName]);\n if (builderFn) {\n builderFn(builder);\n } else {\n // Default to primary index with no filter\n builder.whereIndex(\"primary\");\n }\n const { indexName, options, type } = builder.build();\n\n this.#retrievalOps.push({\n type,\n // Safe: we know the table is part of the schema from the find() method\n table: table as TSchema[\"tables\"][TTableName],\n indexName,\n // Safe: we're storing the options for later compilation\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n options: options as any,\n });\n\n return this as unknown as UnitOfWork<\n TSchema,\n [...TRetrievalResults, SelectResult<TSchema[\"tables\"][TTableName], TJoinOut, TSelect>[]],\n TRawInput\n >;\n }\n\n /**\n * Add a create operation (mutation phase only)\n * Returns a FragnoId with the external ID that can be used immediately in subsequent operations\n */\n create<TableName extends keyof TSchema[\"tables\"] & string>(\n table: TableName,\n values: TableToInsertValues<TSchema[\"tables\"][TableName]>,\n ): FragnoId {\n if (this.#state === \"executed\") {\n throw new Error(`create() can only be called during mutation phase.`);\n }\n\n const tableSchema = this.#schema.tables[table];\n if (!tableSchema) {\n throw new Error(`Table ${table} not found in schema`);\n }\n\n const idColumn = tableSchema.getIdColumn();\n let externalId: string;\n let updatedValues = values;\n\n // Check if ID value is provided in values\n const providedIdValue = (values as Record<string, unknown>)[idColumn.ormName];\n\n if (providedIdValue !== undefined) {\n // Extract string from FragnoId or use string directly\n if (\n typeof providedIdValue === \"object\" &&\n providedIdValue !== null &&\n \"externalId\" in providedIdValue\n ) {\n externalId = (providedIdValue as FragnoId).externalId;\n } else {\n externalId = providedIdValue as string;\n }\n } else {\n // Generate using the column's default configuration\n const generated = idColumn.generateDefaultValue();\n if (generated === undefined) {\n throw new Error(\n `No ID value provided and ID column ${idColumn.ormName} has no default generator`,\n );\n }\n externalId = generated as string;\n\n // Add the generated ID to values so it's used in the insert\n updatedValues = {\n ...values,\n [idColumn.ormName]: externalId,\n } as TableToInsertValues<TSchema[\"tables\"][TableName]>;\n }\n\n this.#mutationOps.push({\n type: \"create\",\n table,\n values: updatedValues,\n generatedExternalId: externalId,\n });\n\n return FragnoId.fromExternal(externalId, 0);\n }\n\n /**\n * Add an update operation using a builder callback (mutation phase only)\n */\n update<TableName extends keyof TSchema[\"tables\"] & string>(\n table: TableName,\n id: FragnoId | string,\n builderFn: (\n // We omit \"build\" because we don't want to expose it to the user\n builder: Omit<UpdateBuilder<TSchema[\"tables\"][TableName]>, \"build\">,\n ) => Omit<UpdateBuilder<TSchema[\"tables\"][TableName]>, \"build\"> | void,\n ): void {\n if (this.#state === \"executed\") {\n throw new Error(`update() can only be called during mutation phase.`);\n }\n\n // Create builder, pass to callback, then extract configuration\n const builder = new UpdateBuilder<TSchema[\"tables\"][TableName]>(table, id);\n builderFn(builder);\n const { id: opId, checkVersion, set } = builder.build();\n\n this.#mutationOps.push({\n type: \"update\",\n table,\n id: opId,\n checkVersion,\n set,\n });\n }\n\n /**\n * Add a delete operation using a builder callback (mutation phase only)\n */\n delete<TableName extends keyof TSchema[\"tables\"] & string>(\n table: TableName,\n id: FragnoId | string,\n builderFn?: (\n // We omit \"build\" because we don't want to expose it to the user\n builder: Omit<DeleteBuilder, \"build\">,\n ) => Omit<DeleteBuilder, \"build\"> | void,\n ): void {\n if (this.#state === \"executed\") {\n throw new Error(`delete() can only be called during mutation phase.`);\n }\n\n // Create builder, optionally pass to callback, then extract configuration\n const builder = new DeleteBuilder(table, id);\n builderFn?.(builder);\n const { id: opId, checkVersion } = builder.build();\n\n this.#mutationOps.push({\n type: \"delete\",\n table,\n id: opId,\n checkVersion,\n });\n }\n\n /**\n * Execute the mutation phase\n * Returns success flag indicating if mutations completed without conflicts\n */\n async executeMutations(): Promise<{ success: boolean }> {\n if (this.#state === \"executed\") {\n throw new Error(`Cannot execute mutations from state ${this.#state}.`);\n }\n\n // Compile mutation operations\n const mutationBatch: CompiledMutation<unknown>[] = [];\n for (const op of this.#mutationOps) {\n const compiled = this.#compiler.compileMutationOperation(op);\n if (compiled !== null) {\n this.#config?.onQuery?.(compiled);\n mutationBatch.push(compiled);\n }\n }\n\n if (this.#config?.dryRun) {\n this.#state = \"executed\";\n return {\n success: true,\n };\n }\n\n // Execute mutation phase\n const result = await this.#executor.executeMutationPhase(mutationBatch);\n this.#state = \"executed\";\n\n if (result.success) {\n this.#createdInternalIds = result.createdInternalIds;\n }\n\n return {\n success: result.success,\n };\n }\n\n /**\n * Get the retrieval operations (for inspection/debugging)\n */\n getRetrievalOperations(): ReadonlyArray<RetrievalOperation<TSchema>> {\n return this.#retrievalOps;\n }\n\n /**\n * Get the mutation operations (for inspection/debugging)\n */\n getMutationOperations(): ReadonlyArray<MutationOperation<TSchema>> {\n return this.#mutationOps;\n }\n\n /**\n * Get the IDs of created entities after executeMutations() has been called.\n * Returns FragnoId objects with external IDs (always available) and internal IDs\n * (available when database supports RETURNING).\n *\n * @throws Error if called before executeMutations()\n * @returns Array of FragnoIds in the same order as create() calls\n */\n getCreatedIds(): FragnoId[] {\n if (this.#state !== \"executed\") {\n throw new Error(\n `getCreatedIds() can only be called after executeMutations(). Current state: ${this.#state}`,\n );\n }\n\n const createdIds: FragnoId[] = [];\n let createIndex = 0;\n\n for (const op of this.#mutationOps) {\n if (op.type === \"create\") {\n const internalId = this.#createdInternalIds[createIndex] ?? undefined;\n createdIds.push(\n new FragnoId({\n externalId: op.generatedExternalId,\n internalId,\n version: 0, // New records always start at version 0\n }),\n );\n createIndex++;\n }\n }\n\n return createdIds;\n }\n\n /**\n * @internal\n * Compile the unit of work to executable queries for testing\n */\n compile<TOutput>(compiler: UOWCompiler<TSchema, TOutput>): {\n name?: string;\n retrievalBatch: TOutput[];\n mutationBatch: CompiledMutation<TOutput>[];\n } {\n const retrievalBatch: TOutput[] = [];\n for (const op of this.#retrievalOps) {\n const compiled = compiler.compileRetrievalOperation(op);\n if (compiled !== null) {\n retrievalBatch.push(compiled);\n }\n }\n\n const mutationBatch: CompiledMutation<TOutput>[] = [];\n for (const op of this.#mutationOps) {\n const compiled = compiler.compileMutationOperation(op);\n if (compiled !== null) {\n mutationBatch.push(compiled);\n }\n }\n\n return {\n name: this.#name,\n retrievalBatch,\n mutationBatch,\n };\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"unit-of-work.js","names":["#table","#tableName","#indexName","#whereClause","#countMode","#selectClause","#orderByIndexClause","#afterCursor","#cursorMetadata","#beforeCursor","#pageSizeValue","#joinClause","compiledJoins: CompiledJoin[] | undefined","options: FindOptions<TTable, TSelect>","#id","#setValues","#checkVersion","compiled: CompiledJoin[]","builder: Record<string, unknown>","conditions: Condition | undefined","orderBy: [AnyColumn, \"asc\" | \"desc\"][] | undefined","#schema","#compiler","#executor","#decoder","#name","#config","#state","#retrievalOps","retrievalBatch: unknown[]","#retrievalResults","externalId: string","#mutationOps","mutationBatch: CompiledMutation<unknown>[]","#createdInternalIds","createdIds: FragnoId[]","retrievalBatch: TOutput[]","mutationBatch: CompiledMutation<TOutput>[]"],"sources":["../../src/query/unit-of-work.ts"],"sourcesContent":["import type { AnySchema, AnyTable, Index, IdColumn, AnyColumn, Relation } from \"../schema/create\";\nimport { FragnoId } from \"../schema/create\";\nimport type { Condition, ConditionBuilder } from \"./condition-builder\";\nimport type { SelectClause, TableToInsertValues, TableToUpdateValues, SelectResult } from \"./query\";\nimport { buildCondition } from \"./condition-builder\";\nimport type { CompiledJoin } from \"./orm/orm\";\nimport type { CursorResult } from \"./cursor\";\nimport { Cursor } from \"./cursor\";\n\n/**\n * Builder for updateMany operations that supports both whereIndex and set chaining\n */\nexport interface UpdateManyBuilder<TTable extends AnyTable> {\n whereIndex<TIndexName extends ValidIndexName<TTable>>(\n indexName: TIndexName,\n condition?: (eb: IndexSpecificConditionBuilder<TTable, TIndexName>) => Condition | boolean,\n ): this;\n set(values: TableToUpdateValues<TTable>): this;\n}\n\n/**\n * Extract column names from a single index\n */\nexport type IndexColumns<TIndex extends Index> = TIndex[\"columnNames\"][number];\n\ntype RemoveEmptyObject<T> = T extends object ? (keyof T extends never ? never : T) : never;\n\n/**\n * Extract all indexed column names from a table's indexes\n */\ntype IndexedColumns<TIndexes extends Record<string, Index>> = TIndexes[keyof TIndexes] extends Index\n ? IndexColumns<TIndexes[keyof TIndexes]>\n : never;\n\ntype OmitNever<T> = { [K in keyof T as T[K] extends never ? never : K]: T[K] };\n\n/**\n * Extract the name of the ID column from a table\n * Checks if column has 'id' property set to true (which IdColumn class has)\n */\nexport type InferIdColumnName<TTable extends AnyTable> = keyof OmitNever<{\n [K in keyof TTable[\"columns\"]]: TTable[\"columns\"][K] extends IdColumn<\n infer _,\n infer __,\n infer ___\n >\n ? K\n : never;\n}>;\n\n/**\n * Get the columns for a specific index name.\n * For \"primary\", returns only the ID column.\n * For named indexes, returns the columns defined in that index.\n */\ntype ColumnsForIndex<\n TTable extends AnyTable,\n TIndexName extends ValidIndexName<TTable>,\n> = TIndexName extends \"primary\"\n ? Pick<TTable[\"columns\"], InferIdColumnName<TTable>>\n : TIndexName extends keyof TTable[\"indexes\"]\n ? Pick<TTable[\"columns\"], IndexColumns<TTable[\"indexes\"][TIndexName]>>\n : never;\n\n/**\n * ConditionBuilder restricted to indexed columns only.\n * Used throughout Unit of Work to ensure all queries can leverage indexes for optimal performance.\n */\nexport type IndexedConditionBuilder<TTable extends AnyTable> = ConditionBuilder<\n Pick<TTable[\"columns\"], IndexedColumns<TTable[\"indexes\"]>>\n>;\n\n/**\n * ConditionBuilder restricted to columns in a specific index.\n */\ntype IndexSpecificConditionBuilder<\n TTable extends AnyTable,\n TIndexName extends ValidIndexName<TTable>,\n> = ConditionBuilder<ColumnsForIndex<TTable, TIndexName>>;\n\n/**\n * Valid index names for a table, including the static \"primary\" index\n */\nexport type ValidIndexName<TTable extends AnyTable> =\n | \"primary\"\n | (string & keyof TTable[\"indexes\"]);\n\n/**\n * Find options for Unit of Work (internal, used after builder finalization)\n */\ntype FindOptions<\n TTable extends AnyTable = AnyTable,\n TSelect extends SelectClause<TTable> = SelectClause<TTable>,\n> = {\n /**\n * Which index to use for this query (required)\n */\n useIndex: string;\n /**\n * Select clause - which columns to return\n */\n select?: TSelect;\n /**\n * Where clause - filtering restricted to indexed columns only\n */\n where?: (eb: IndexedConditionBuilder<TTable>) => Condition | boolean;\n /**\n * Order by index - specify which index to order by and direction\n */\n orderByIndex?: {\n indexName: string;\n direction: \"asc\" | \"desc\";\n };\n /**\n * Cursor for pagination - continue after this cursor\n */\n after?: Cursor | string;\n /**\n * Cursor for pagination - continue before this cursor\n */\n before?: Cursor | string;\n /**\n * Number of results per page\n */\n pageSize?: number;\n /**\n * Join operations to include related data\n */\n joins?: CompiledJoin[];\n};\n\n/**\n * Unit of Work state machine\n */\nexport type UOWState = \"building-retrieval\" | \"building-mutation\" | \"executed\";\n\n/**\n * Retrieval operation - read operations in the first phase\n */\nexport type RetrievalOperation<\n TSchema extends AnySchema,\n TTable extends AnyTable = TSchema[\"tables\"][keyof TSchema[\"tables\"]],\n> =\n | {\n type: \"find\";\n table: TTable;\n indexName: string;\n options: FindOptions<TTable, SelectClause<TTable>>;\n withCursor?: boolean;\n }\n | {\n type: \"count\";\n table: TTable;\n indexName: string;\n options: Pick<FindOptions<TTable>, \"where\" | \"useIndex\">;\n };\n\n/**\n * Mutation operations - write operations in the second phase\n */\nexport type MutationOperation<\n TSchema extends AnySchema,\n TTable extends AnyTable = TSchema[\"tables\"][keyof TSchema[\"tables\"]],\n> =\n | {\n type: \"update\";\n table: TTable[\"name\"];\n id: FragnoId | string;\n checkVersion: boolean;\n set: TableToUpdateValues<TTable>;\n }\n | {\n type: \"create\";\n table: TTable[\"name\"];\n values: TableToInsertValues<TTable>;\n generatedExternalId: string;\n }\n | {\n type: \"delete\";\n table: TTable[\"name\"];\n id: FragnoId | string;\n checkVersion: boolean;\n };\n\n/**\n * Compiled mutation with metadata for execution\n */\nexport interface CompiledMutation<TOutput> {\n query: TOutput;\n /**\n * Number of rows this operation must affect for the transaction to succeed.\n * If actual affected rows doesn't match, it indicates a version conflict.\n * null means don't check affected rows (e.g., for create operations).\n */\n expectedAffectedRows: number | null;\n}\n\n/**\n * Compiler interface for Unit of Work operations\n */\nexport interface UOWCompiler<TSchema extends AnySchema, TOutput> {\n /**\n * Compile a retrieval operation to the adapter's query format\n */\n compileRetrievalOperation(op: RetrievalOperation<TSchema>): TOutput | null;\n\n /**\n * Compile a mutation operation to the adapter's query format\n */\n compileMutationOperation(op: MutationOperation<TSchema>): CompiledMutation<TOutput> | null;\n}\n\nexport type MutationResult =\n | { success: true; createdInternalIds: (bigint | null)[] }\n | { success: false };\n\n/**\n * Executor interface for Unit of Work operations\n */\nexport interface UOWExecutor<TOutput, TRawResult = unknown> {\n /**\n * Execute the retrieval phase - all queries run in a single transaction for snapshot isolation\n */\n executeRetrievalPhase(retrievalBatch: TOutput[]): Promise<TRawResult[]>;\n\n /**\n * Execute the mutation phase - all queries run in a transaction with version checks\n * Returns success status indicating if mutations completed without conflicts,\n * and internal IDs for create operations (null if database doesn't support RETURNING)\n */\n executeMutationPhase(mutationBatch: CompiledMutation<TOutput>[]): Promise<MutationResult>;\n}\n\n/**\n * Decoder interface for Unit of Work retrieval results\n *\n * Transforms raw database results into application format (e.g., converting raw columns\n * into FragnoId objects with external ID, internal ID, and version).\n */\nexport interface UOWDecoder<TSchema extends AnySchema, TRawInput = unknown> {\n /**\n * Decode raw database results from the retrieval phase\n *\n * @param rawResults - Array of raw result sets from database queries\n * @param operations - Array of retrieval operations that produced these results\n * @returns Decoded results in application format\n */\n (rawResults: TRawInput[], operations: RetrievalOperation<TSchema>[]): unknown[];\n}\n\n/**\n * Builder for find operations in Unit of Work\n */\nexport class FindBuilder<\n TTable extends AnyTable,\n TSelect extends SelectClause<TTable> = true,\n TJoinOut = {},\n> {\n readonly #table: TTable;\n readonly #tableName: string;\n\n #indexName?: string;\n #whereClause?: (eb: IndexedConditionBuilder<TTable>) => Condition | boolean;\n #orderByIndexClause?: {\n indexName: string;\n direction: \"asc\" | \"desc\";\n };\n #afterCursor?: Cursor | string;\n #beforeCursor?: Cursor | string;\n #pageSizeValue?: number;\n #selectClause?: TSelect;\n #joinClause?: (jb: IndexedJoinBuilder<TTable, {}>) => IndexedJoinBuilder<TTable, TJoinOut>;\n #countMode = false;\n #cursorMetadata?: Cursor;\n\n constructor(tableName: string, table: TTable) {\n this.#tableName = tableName;\n this.#table = table;\n }\n\n /**\n * Specify which index to use and optionally filter the results\n */\n whereIndex<TIndexName extends ValidIndexName<TTable>>(\n indexName: TIndexName,\n condition?: (eb: IndexSpecificConditionBuilder<TTable, TIndexName>) => Condition | boolean,\n ): this {\n // Validate index exists (primary is always valid)\n if (indexName !== \"primary\" && !(indexName in this.#table.indexes)) {\n throw new Error(\n `Index \"${String(indexName)}\" not found on table \"${this.#tableName}\". ` +\n `Available indexes: primary, ${Object.keys(this.#table.indexes).join(\", \")}`,\n );\n }\n\n this.#indexName = indexName === \"primary\" ? \"_primary\" : indexName;\n if (condition) {\n // Safe: IndexSpecificConditionBuilder is a subset of IndexedConditionBuilder.\n // The condition will only reference columns in the specific index, which are also indexed columns.\n this.#whereClause = condition as unknown as (\n eb: IndexedConditionBuilder<TTable>,\n ) => Condition | boolean;\n }\n return this;\n }\n\n /**\n * Specify columns to select\n * @throws Error if selectCount() has already been called\n */\n select<const TNewSelect extends SelectClause<TTable>>(\n columns: TNewSelect,\n ): FindBuilder<TTable, TNewSelect, TJoinOut> {\n if (this.#countMode) {\n throw new Error(\n `Cannot call select() after selectCount() on table \"${this.#tableName}\". ` +\n `Use either select() or selectCount(), not both.`,\n );\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (this as any).#selectClause = columns;\n return this as unknown as FindBuilder<TTable, TNewSelect, TJoinOut>;\n }\n\n /**\n * Select count instead of records\n * @throws Error if select() has already been called\n */\n selectCount(): this {\n if (this.#selectClause !== undefined) {\n throw new Error(\n `Cannot call selectCount() after select() on table \"${this.#tableName}\". ` +\n `Use either select() or selectCount(), not both.`,\n );\n }\n this.#countMode = true;\n return this;\n }\n\n /**\n * Order results by index in ascending or descending order\n */\n orderByIndex<TIndexName extends ValidIndexName<TTable>>(\n indexName: TIndexName,\n direction: \"asc\" | \"desc\",\n ): this {\n // Validate index exists (primary is always valid)\n if (indexName !== \"primary\" && !(indexName in this.#table.indexes)) {\n throw new Error(\n `Index \"${String(indexName)}\" not found on table \"${this.#tableName}\". ` +\n `Available indexes: primary, ${Object.keys(this.#table.indexes).join(\", \")}`,\n );\n }\n\n this.#orderByIndexClause = {\n indexName: indexName === \"primary\" ? \"_primary\" : indexName,\n direction,\n };\n return this;\n }\n\n /**\n * Set cursor to continue pagination after this point (forward pagination)\n * If a Cursor object is provided, its metadata will be used to set defaults for\n * index, orderByIndex, and pageSize (if not explicitly set)\n */\n after(cursor: Cursor | string): this {\n this.#afterCursor = cursor;\n if (cursor instanceof Cursor) {\n this.#cursorMetadata = cursor;\n }\n return this;\n }\n\n /**\n * Set cursor to continue pagination before this point (backward pagination)\n * If a Cursor object is provided, its metadata will be used to set defaults for\n * index, orderByIndex, and pageSize (if not explicitly set)\n */\n before(cursor: Cursor | string): this {\n this.#beforeCursor = cursor;\n if (cursor instanceof Cursor) {\n this.#cursorMetadata = cursor;\n }\n return this;\n }\n\n /**\n * Set the number of results per page\n */\n pageSize(size: number): this {\n this.#pageSizeValue = size;\n return this;\n }\n\n /**\n * Add joins to include related data\n * Join where clauses are restricted to indexed columns only\n */\n join<TNewJoinOut>(\n joinFn: (jb: IndexedJoinBuilder<TTable, {}>) => IndexedJoinBuilder<TTable, TNewJoinOut>,\n ): FindBuilder<TTable, TSelect, TNewJoinOut> {\n this.#joinClause = joinFn;\n return this as unknown as FindBuilder<TTable, TSelect, TNewJoinOut>;\n }\n\n /**\n * @internal\n */\n build():\n | { type: \"find\"; indexName: string; options: FindOptions<TTable, TSelect> }\n | {\n type: \"count\";\n indexName: string;\n options: Pick<FindOptions<TTable>, \"where\" | \"useIndex\">;\n } {\n // Apply cursor metadata as defaults if available and not explicitly set\n let indexName = this.#indexName;\n let orderByIndex = this.#orderByIndexClause;\n let pageSize = this.#pageSizeValue;\n\n if (this.#cursorMetadata) {\n // Use cursor metadata as defaults\n if (!indexName) {\n indexName = this.#cursorMetadata.indexName;\n }\n if (!orderByIndex) {\n orderByIndex = {\n indexName: this.#cursorMetadata.indexName,\n direction: this.#cursorMetadata.orderDirection,\n };\n }\n if (pageSize === undefined) {\n pageSize = this.#cursorMetadata.pageSize;\n }\n\n // Validate that explicit params match cursor params\n if (indexName && indexName !== this.#cursorMetadata.indexName) {\n throw new Error(\n `Index mismatch: builder specifies \"${indexName}\" but cursor specifies \"${this.#cursorMetadata.indexName}\"`,\n );\n }\n if (\n orderByIndex &&\n (orderByIndex.indexName !== this.#cursorMetadata.indexName ||\n orderByIndex.direction !== this.#cursorMetadata.orderDirection)\n ) {\n throw new Error(`Order mismatch: builder and cursor specify different ordering`);\n }\n if (pageSize !== undefined && pageSize !== this.#cursorMetadata.pageSize) {\n throw new Error(\n `Page size mismatch: builder specifies ${pageSize} but cursor specifies ${this.#cursorMetadata.pageSize}`,\n );\n }\n }\n\n if (!indexName) {\n throw new Error(\n `Must specify an index using .whereIndex() before finalizing find operation on table \"${this.#tableName}\"`,\n );\n }\n\n // If in count mode, return count operation\n if (this.#countMode) {\n return {\n type: \"count\",\n indexName,\n options: {\n useIndex: indexName,\n where: this.#whereClause,\n },\n };\n }\n\n // Compile joins if provided\n let compiledJoins: CompiledJoin[] | undefined;\n if (this.#joinClause) {\n compiledJoins = buildJoinIndexed(this.#table, this.#joinClause);\n }\n\n // Convert Cursor objects to strings for after/before\n const afterCursor =\n this.#afterCursor instanceof Cursor ? this.#afterCursor.encode() : this.#afterCursor;\n const beforeCursor =\n this.#beforeCursor instanceof Cursor ? this.#beforeCursor.encode() : this.#beforeCursor;\n\n const options: FindOptions<TTable, TSelect> = {\n useIndex: indexName,\n select: this.#selectClause,\n where: this.#whereClause,\n orderByIndex,\n after: afterCursor,\n before: beforeCursor,\n pageSize,\n joins: compiledJoins,\n };\n\n return { type: \"find\", indexName, options };\n }\n}\n\n/**\n * Builder for update operations in Unit of Work\n */\nexport class UpdateBuilder<TTable extends AnyTable> {\n readonly #tableName: string;\n readonly #id: FragnoId | string;\n\n #checkVersion = false;\n #setValues?: TableToUpdateValues<TTable>;\n\n constructor(tableName: string, id: FragnoId | string) {\n this.#tableName = tableName;\n this.#id = id;\n }\n\n /**\n * Specify values to update\n */\n set(values: TableToUpdateValues<TTable>): this {\n this.#setValues = values;\n return this;\n }\n\n /**\n * Enable version checking for optimistic concurrency control\n * @throws Error if the ID is just a string (no version available)\n */\n check(): this {\n if (typeof this.#id === \"string\") {\n throw new Error(\n `Cannot use check() with a string ID on table \"${this.#tableName}\". ` +\n `Version checking requires a FragnoId with version information.`,\n );\n }\n this.#checkVersion = true;\n return this;\n }\n\n /**\n * @internal\n */\n build(): {\n id: FragnoId | string;\n checkVersion: boolean;\n set: TableToUpdateValues<TTable>;\n } {\n if (!this.#setValues) {\n throw new Error(\n `Must specify values using .set() before finalizing update operation on table \"${this.#tableName}\"`,\n );\n }\n\n return {\n id: this.#id,\n checkVersion: this.#checkVersion,\n set: this.#setValues,\n };\n }\n}\n\n/**\n * Builder for delete operations in Unit of Work\n */\nexport class DeleteBuilder {\n readonly #tableName: string;\n readonly #id: FragnoId | string;\n\n #checkVersion = false;\n\n constructor(tableName: string, id: FragnoId | string) {\n this.#tableName = tableName;\n this.#id = id;\n }\n\n /**\n * Enable version checking for optimistic concurrency control\n * @throws Error if the ID is just a string (no version available)\n */\n check(): this {\n if (typeof this.#id === \"string\") {\n throw new Error(\n `Cannot use check() with a string ID on table \"${this.#tableName}\". ` +\n `Version checking requires a FragnoId with version information.`,\n );\n }\n this.#checkVersion = true;\n return this;\n }\n\n /**\n * @internal\n */\n build(): { id: FragnoId | string; checkVersion: boolean } {\n return {\n id: this.#id,\n checkVersion: this.#checkVersion,\n };\n }\n}\n\n/**\n * Builder for join operations in Unit of Work\n * Similar to FindBuilder but tailored for joins (no cursor pagination, no count mode)\n */\nexport class JoinFindBuilder<\n TTable extends AnyTable,\n TSelect extends SelectClause<TTable> = true,\n TJoinOut = {},\n> {\n readonly #table: TTable;\n readonly #tableName: string;\n\n #indexName?: string;\n #whereClause?: (eb: IndexedConditionBuilder<TTable>) => Condition | boolean;\n #orderByIndexClause?: {\n indexName: string;\n direction: \"asc\" | \"desc\";\n };\n #pageSizeValue?: number;\n #selectClause?: TSelect;\n #joinClause?: (jb: IndexedJoinBuilder<TTable, TJoinOut>) => IndexedJoinBuilder<TTable, TJoinOut>;\n\n constructor(tableName: string, table: TTable) {\n this.#tableName = tableName;\n this.#table = table;\n }\n\n /**\n * Specify which index to use and optionally filter the results\n */\n whereIndex<TIndexName extends ValidIndexName<TTable>>(\n indexName: TIndexName,\n condition?: (eb: IndexSpecificConditionBuilder<TTable, TIndexName>) => Condition | boolean,\n ): this {\n // Validate index exists (primary is always valid)\n if (indexName !== \"primary\" && !(indexName in this.#table.indexes)) {\n throw new Error(\n `Index \"${String(indexName)}\" not found on table \"${this.#tableName}\". ` +\n `Available indexes: primary, ${Object.keys(this.#table.indexes).join(\", \")}`,\n );\n }\n\n this.#indexName = indexName === \"primary\" ? \"_primary\" : indexName;\n if (condition) {\n // Safe: IndexSpecificConditionBuilder is a subset of IndexedConditionBuilder.\n // The condition will only reference columns in the specific index, which are also indexed columns.\n this.#whereClause = condition as unknown as (\n eb: IndexedConditionBuilder<TTable>,\n ) => Condition | boolean;\n }\n return this;\n }\n\n /**\n * Specify columns to select\n */\n select<const TNewSelect extends SelectClause<TTable>>(\n columns: TNewSelect,\n ): JoinFindBuilder<TTable, TNewSelect, TJoinOut> {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (this as any).#selectClause = columns;\n return this as unknown as JoinFindBuilder<TTable, TNewSelect, TJoinOut>;\n }\n\n /**\n * Order results by index in ascending or descending order\n */\n orderByIndex<TIndexName extends ValidIndexName<TTable>>(\n indexName: TIndexName,\n direction: \"asc\" | \"desc\",\n ): this {\n // Validate index exists (primary is always valid)\n if (indexName !== \"primary\" && !(indexName in this.#table.indexes)) {\n throw new Error(\n `Index \"${String(indexName)}\" not found on table \"${this.#tableName}\". ` +\n `Available indexes: primary, ${Object.keys(this.#table.indexes).join(\", \")}`,\n );\n }\n\n this.#orderByIndexClause = {\n indexName: indexName === \"primary\" ? \"_primary\" : indexName,\n direction,\n };\n return this;\n }\n\n /**\n * Set the number of results to return\n */\n pageSize(size: number): this {\n this.#pageSizeValue = size;\n return this;\n }\n\n /**\n * Add joins to include related data\n * Join where clauses are restricted to indexed columns only\n */\n join<TNewJoinOut>(\n joinFn: (jb: IndexedJoinBuilder<TTable, {}>) => IndexedJoinBuilder<TTable, TNewJoinOut>,\n ): JoinFindBuilder<TTable, TSelect, TJoinOut & TNewJoinOut> {\n this.#joinClause = joinFn;\n return this as unknown as JoinFindBuilder<TTable, TSelect, TJoinOut & TNewJoinOut>;\n }\n\n /**\n * @internal\n */\n build(): {\n indexName: string | undefined;\n select: TSelect | undefined;\n where: ((eb: IndexedConditionBuilder<TTable>) => Condition | boolean) | undefined;\n orderByIndex:\n | {\n indexName: string;\n direction: \"asc\" | \"desc\";\n }\n | undefined;\n pageSize: number | undefined;\n joins: CompiledJoin[] | undefined;\n } {\n // Compile joins if provided\n let compiledJoins: CompiledJoin[] | undefined;\n if (this.#joinClause) {\n compiledJoins = buildJoinIndexed(this.#table, this.#joinClause);\n }\n\n return {\n indexName: this.#indexName,\n select: this.#selectClause,\n where: this.#whereClause,\n orderByIndex: this.#orderByIndexClause,\n pageSize: this.#pageSizeValue,\n joins: compiledJoins,\n };\n }\n}\n\ninterface MapRelationType<T> {\n // FIXME: Not sure why we need the RemoveEmptyObject, we should somehow fix at the source where it's added to the union\n one: RemoveEmptyObject<T> | null;\n many: RemoveEmptyObject<T>[];\n}\n\n/**\n * Join builder with indexed-only where clauses for Unit of Work\n * TJoinOut accumulates the types of all joined relations\n */\nexport type IndexedJoinBuilder<TTable extends AnyTable, TJoinOut> = {\n [K in keyof TTable[\"relations\"]]: TTable[\"relations\"][K] extends Relation<\n infer TRelationType,\n infer TTargetTable\n >\n ? <TSelect extends SelectClause<TTable[\"relations\"][K][\"table\"]> = true, TNestedJoinOut = {}>(\n builderFn?: (\n builder: JoinFindBuilder<TTable[\"relations\"][K][\"table\"]>,\n ) => JoinFindBuilder<TTable[\"relations\"][K][\"table\"], TSelect, TNestedJoinOut>,\n ) => IndexedJoinBuilder<\n TTable,\n TJoinOut & {\n [P in K]: MapRelationType<\n SelectResult<TTargetTable, TNestedJoinOut, TSelect>\n >[TRelationType];\n }\n >\n : never;\n};\n\n/**\n * Build join operations with indexed-only where clauses for Unit of Work\n * This ensures all join conditions can leverage indexes for optimal performance\n */\nexport function buildJoinIndexed<TTable extends AnyTable, TJoinOut>(\n table: TTable,\n fn: (builder: IndexedJoinBuilder<TTable, {}>) => IndexedJoinBuilder<TTable, TJoinOut>,\n): CompiledJoin[] {\n const compiled: CompiledJoin[] = [];\n const builder: Record<string, unknown> = {};\n\n for (const name in table.relations) {\n const relation = table.relations[name]!;\n\n builder[name] = (builderFn?: (b: JoinFindBuilder<AnyTable>) => JoinFindBuilder<AnyTable>) => {\n // Create join builder for this relation's table\n const joinBuilder = new JoinFindBuilder(relation.table.ormName, relation.table);\n if (builderFn) {\n builderFn(joinBuilder);\n }\n const config = joinBuilder.build();\n\n // Build condition with indexed columns only\n let conditions: Condition | undefined;\n if (config.where) {\n const cond = buildCondition(relation.table.columns, config.where);\n if (cond === true) {\n conditions = undefined;\n } else if (cond === false) {\n // If condition evaluates to false, skip this join\n compiled.push({\n relation,\n options: false,\n });\n delete builder[name];\n return builder;\n } else {\n conditions = cond;\n }\n }\n\n // Build orderBy from orderByIndex if provided\n let orderBy: [AnyColumn, \"asc\" | \"desc\"][] | undefined;\n if (config.orderByIndex) {\n const index = relation.table.indexes[config.orderByIndex.indexName];\n if (index) {\n // Use all columns from the index for ordering\n orderBy = index.columns.map(\n (col) => [col, config.orderByIndex!.direction] as [AnyColumn, \"asc\" | \"desc\"],\n );\n } else {\n // Fallback to ID column if index not found\n orderBy = [[relation.table.getIdColumn(), config.orderByIndex.direction]];\n }\n }\n\n compiled.push({\n relation,\n options: {\n select: config.select ?? true,\n where: conditions,\n orderBy,\n join: config.joins,\n limit: config.pageSize,\n },\n });\n\n delete builder[name];\n return builder;\n };\n }\n\n fn(builder as IndexedJoinBuilder<TTable, {}>);\n return compiled;\n}\n\nexport function createUnitOfWork<\n const TSchema extends AnySchema,\n const TRetrievalResults extends unknown[] = [],\n const TRawInput = unknown,\n>(\n schema: TSchema,\n compiler: UOWCompiler<TSchema, unknown>,\n executor: UOWExecutor<unknown, TRawInput>,\n decoder: UOWDecoder<TSchema, TRawInput>,\n name?: string,\n): UnitOfWork<TSchema, TRetrievalResults, TRawInput> {\n return new UnitOfWork(schema, compiler, executor, decoder, name) as UnitOfWork<\n TSchema,\n TRetrievalResults,\n TRawInput\n >;\n}\n\nexport interface UnitOfWorkConfig {\n dryRun?: boolean;\n onQuery?: (query: unknown) => void;\n}\n\n/**\n * Unit of Work implementation with optimistic concurrency control\n *\n * UOW has two phases:\n * 1. Retrieval phase: Read operations to fetch entities with their versions\n * 2. Mutation phase: Write operations that check versions before committing\n *\n * @example\n * ```ts\n * const uow = queryEngine.createUnitOfWork(\"update-user-balance\");\n *\n * // Retrieval phase\n * uow.find(\"users\", (b) => b.where(\"primary\", (eb) => eb(\"id\", \"=\", userId)));\n *\n * // Execute retrieval and transition to mutation phase\n * const [users] = await uow.executeRetrieve();\n *\n * // Mutation phase with version check\n * const user = users[0];\n * uow.update(\"users\", user.id, (b) => b.set({ balance: newBalance }).check());\n *\n * // Execute mutations\n * const { success } = await uow.executeMutations();\n * if (!success) {\n * // Handle version conflict\n * }\n * ```\n */\nexport class UnitOfWork<\n const TSchema extends AnySchema,\n const TRetrievalResults extends unknown[] = [],\n const TRawInput = unknown,\n> {\n #schema: TSchema;\n\n #name?: string;\n #config?: UnitOfWorkConfig;\n\n #state: UOWState = \"building-retrieval\";\n\n #retrievalOps: RetrievalOperation<TSchema>[] = [];\n #mutationOps: MutationOperation<TSchema>[] = [];\n\n #compiler: UOWCompiler<TSchema, unknown>;\n #executor: UOWExecutor<unknown, TRawInput>;\n #decoder: UOWDecoder<TSchema, TRawInput>;\n\n #retrievalResults?: TRetrievalResults;\n #createdInternalIds: (bigint | null)[] = [];\n\n constructor(\n schema: TSchema,\n compiler: UOWCompiler<TSchema, unknown>,\n executor: UOWExecutor<unknown, TRawInput>,\n decoder: UOWDecoder<TSchema, TRawInput>,\n name?: string,\n config?: UnitOfWorkConfig,\n ) {\n this.#schema = schema;\n this.#compiler = compiler;\n this.#executor = executor;\n this.#decoder = decoder;\n this.#name = name;\n this.#config = config;\n }\n\n get schema(): TSchema {\n return this.#schema;\n }\n\n get state(): UOWState {\n return this.#state;\n }\n\n get name(): string | undefined {\n return this.#name;\n }\n\n /**\n * Execute the retrieval phase and transition to mutation phase\n * Returns all results from find operations\n */\n async executeRetrieve(): Promise<TRetrievalResults> {\n if (this.#retrievalOps.length === 0) {\n return [] as unknown as TRetrievalResults;\n }\n\n if (this.#state !== \"building-retrieval\") {\n throw new Error(\n `Cannot execute retrieval from state ${this.#state}. Must be in building-retrieval state.`,\n );\n }\n\n // Compile retrieval operations\n const retrievalBatch: unknown[] = [];\n for (const op of this.#retrievalOps) {\n const compiled = this.#compiler.compileRetrievalOperation(op);\n if (compiled !== null) {\n this.#config?.onQuery?.(compiled);\n\n retrievalBatch.push(compiled);\n }\n }\n\n if (this.#config?.dryRun) {\n this.#state = \"executed\";\n return [] as unknown as TRetrievalResults;\n }\n\n const results = this.#decoder(\n await this.#executor.executeRetrievalPhase(retrievalBatch),\n this.#retrievalOps,\n );\n\n // Store results and transition to mutation phase\n this.#retrievalResults = results as TRetrievalResults;\n this.#state = \"building-mutation\";\n\n return this.#retrievalResults;\n }\n\n /**\n * Add a find operation using a builder callback (retrieval phase only)\n */\n find<\n TTableName extends keyof TSchema[\"tables\"] & string,\n TSelect extends SelectClause<TSchema[\"tables\"][TTableName]> = true,\n TJoinOut = {},\n >(\n tableName: TTableName,\n builderFn?: (\n // We omit \"build\" because we don't want to expose it to the user\n builder: Omit<FindBuilder<TSchema[\"tables\"][TTableName]>, \"build\">,\n ) => Omit<FindBuilder<TSchema[\"tables\"][TTableName], TSelect, TJoinOut>, \"build\"> | void,\n ): UnitOfWork<\n TSchema,\n [...TRetrievalResults, SelectResult<TSchema[\"tables\"][TTableName], TJoinOut, TSelect>[]],\n TRawInput\n > {\n if (this.#state !== \"building-retrieval\") {\n throw new Error(\n `find() can only be called during retrieval phase. Current state: ${this.#state}`,\n );\n }\n\n const table = this.#schema.tables[tableName];\n if (!table) {\n throw new Error(`Table ${tableName} not found in schema`);\n }\n\n // Create builder, pass to callback (or use default), then extract configuration\n const builder = new FindBuilder(tableName, table as TSchema[\"tables\"][TTableName]);\n if (builderFn) {\n builderFn(builder);\n } else {\n // Default to primary index with no filter\n builder.whereIndex(\"primary\");\n }\n const { indexName, options, type } = builder.build();\n\n this.#retrievalOps.push({\n type,\n // Safe: we know the table is part of the schema from the find() method\n table: table as TSchema[\"tables\"][TTableName],\n indexName,\n // Safe: we're storing the options for later compilation\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n options: options as any,\n });\n\n return this as unknown as UnitOfWork<\n TSchema,\n [...TRetrievalResults, SelectResult<TSchema[\"tables\"][TTableName], TJoinOut, TSelect>[]],\n TRawInput\n >;\n }\n\n /**\n * Add a find operation with cursor metadata (retrieval phase only)\n */\n findWithCursor<\n TTableName extends keyof TSchema[\"tables\"] & string,\n TSelect extends SelectClause<TSchema[\"tables\"][TTableName]> = true,\n TJoinOut = {},\n >(\n tableName: TTableName,\n builderFn: (\n // We omit \"build\" because we don't want to expose it to the user\n builder: Omit<FindBuilder<TSchema[\"tables\"][TTableName]>, \"build\">,\n ) => Omit<FindBuilder<TSchema[\"tables\"][TTableName], TSelect, TJoinOut>, \"build\"> | void,\n ): UnitOfWork<\n TSchema,\n [\n ...TRetrievalResults,\n CursorResult<SelectResult<TSchema[\"tables\"][TTableName], TJoinOut, TSelect>>,\n ],\n TRawInput\n > {\n if (this.#state !== \"building-retrieval\") {\n throw new Error(\n `findWithCursor() can only be called during retrieval phase. Current state: ${this.#state}`,\n );\n }\n\n const table = this.#schema.tables[tableName];\n if (!table) {\n throw new Error(`Table ${tableName} not found in schema`);\n }\n\n // Create builder and pass to callback\n const builder = new FindBuilder(tableName, table as TSchema[\"tables\"][TTableName]);\n builderFn(builder);\n const { indexName, options, type } = builder.build();\n\n this.#retrievalOps.push({\n type,\n // Safe: we know the table is part of the schema from the findWithCursor() method\n table: table as TSchema[\"tables\"][TTableName],\n indexName,\n // Safe: we're storing the options for later compilation\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n options: options as any,\n withCursor: true,\n });\n\n return this as unknown as UnitOfWork<\n TSchema,\n [\n ...TRetrievalResults,\n CursorResult<SelectResult<TSchema[\"tables\"][TTableName], TJoinOut, TSelect>>,\n ],\n TRawInput\n >;\n }\n\n /**\n * Add a create operation (mutation phase only)\n * Returns a FragnoId with the external ID that can be used immediately in subsequent operations\n */\n create<TableName extends keyof TSchema[\"tables\"] & string>(\n table: TableName,\n values: TableToInsertValues<TSchema[\"tables\"][TableName]>,\n ): FragnoId {\n if (this.#state === \"executed\") {\n throw new Error(`create() can only be called during mutation phase.`);\n }\n\n const tableSchema = this.#schema.tables[table];\n if (!tableSchema) {\n throw new Error(`Table ${table} not found in schema`);\n }\n\n const idColumn = tableSchema.getIdColumn();\n let externalId: string;\n let updatedValues = values;\n\n // Check if ID value is provided in values\n const providedIdValue = (values as Record<string, unknown>)[idColumn.ormName];\n\n if (providedIdValue !== undefined) {\n // Extract string from FragnoId or use string directly\n if (\n typeof providedIdValue === \"object\" &&\n providedIdValue !== null &&\n \"externalId\" in providedIdValue\n ) {\n externalId = (providedIdValue as FragnoId).externalId;\n } else {\n externalId = providedIdValue as string;\n }\n } else {\n // Generate using the column's default configuration\n const generated = idColumn.generateDefaultValue();\n if (generated === undefined) {\n throw new Error(\n `No ID value provided and ID column ${idColumn.ormName} has no default generator`,\n );\n }\n externalId = generated as string;\n\n // Add the generated ID to values so it's used in the insert\n updatedValues = {\n ...values,\n [idColumn.ormName]: externalId,\n } as TableToInsertValues<TSchema[\"tables\"][TableName]>;\n }\n\n this.#mutationOps.push({\n type: \"create\",\n table,\n values: updatedValues,\n generatedExternalId: externalId,\n });\n\n return FragnoId.fromExternal(externalId, 0);\n }\n\n /**\n * Add an update operation using a builder callback (mutation phase only)\n */\n update<TableName extends keyof TSchema[\"tables\"] & string>(\n table: TableName,\n id: FragnoId | string,\n builderFn: (\n // We omit \"build\" because we don't want to expose it to the user\n builder: Omit<UpdateBuilder<TSchema[\"tables\"][TableName]>, \"build\">,\n ) => Omit<UpdateBuilder<TSchema[\"tables\"][TableName]>, \"build\"> | void,\n ): void {\n if (this.#state === \"executed\") {\n throw new Error(`update() can only be called during mutation phase.`);\n }\n\n // Create builder, pass to callback, then extract configuration\n const builder = new UpdateBuilder<TSchema[\"tables\"][TableName]>(table, id);\n builderFn(builder);\n const { id: opId, checkVersion, set } = builder.build();\n\n this.#mutationOps.push({\n type: \"update\",\n table,\n id: opId,\n checkVersion,\n set,\n });\n }\n\n /**\n * Add a delete operation using a builder callback (mutation phase only)\n */\n delete<TableName extends keyof TSchema[\"tables\"] & string>(\n table: TableName,\n id: FragnoId | string,\n builderFn?: (\n // We omit \"build\" because we don't want to expose it to the user\n builder: Omit<DeleteBuilder, \"build\">,\n ) => Omit<DeleteBuilder, \"build\"> | void,\n ): void {\n if (this.#state === \"executed\") {\n throw new Error(`delete() can only be called during mutation phase.`);\n }\n\n // Create builder, optionally pass to callback, then extract configuration\n const builder = new DeleteBuilder(table, id);\n builderFn?.(builder);\n const { id: opId, checkVersion } = builder.build();\n\n this.#mutationOps.push({\n type: \"delete\",\n table,\n id: opId,\n checkVersion,\n });\n }\n\n /**\n * Execute the mutation phase\n * Returns success flag indicating if mutations completed without conflicts\n */\n async executeMutations(): Promise<{ success: boolean }> {\n if (this.#state === \"executed\") {\n throw new Error(`Cannot execute mutations from state ${this.#state}.`);\n }\n\n // Compile mutation operations\n const mutationBatch: CompiledMutation<unknown>[] = [];\n for (const op of this.#mutationOps) {\n const compiled = this.#compiler.compileMutationOperation(op);\n if (compiled !== null) {\n this.#config?.onQuery?.(compiled);\n mutationBatch.push(compiled);\n }\n }\n\n if (this.#config?.dryRun) {\n this.#state = \"executed\";\n return {\n success: true,\n };\n }\n\n // Execute mutation phase\n const result = await this.#executor.executeMutationPhase(mutationBatch);\n this.#state = \"executed\";\n\n if (result.success) {\n this.#createdInternalIds = result.createdInternalIds;\n }\n\n return {\n success: result.success,\n };\n }\n\n /**\n * Get the retrieval operations (for inspection/debugging)\n */\n getRetrievalOperations(): ReadonlyArray<RetrievalOperation<TSchema>> {\n return this.#retrievalOps;\n }\n\n /**\n * Get the mutation operations (for inspection/debugging)\n */\n getMutationOperations(): ReadonlyArray<MutationOperation<TSchema>> {\n return this.#mutationOps;\n }\n\n /**\n * Get the IDs of created entities after executeMutations() has been called.\n * Returns FragnoId objects with external IDs (always available) and internal IDs\n * (available when database supports RETURNING).\n *\n * @throws Error if called before executeMutations()\n * @returns Array of FragnoIds in the same order as create() calls\n */\n getCreatedIds(): FragnoId[] {\n if (this.#state !== \"executed\") {\n throw new Error(\n `getCreatedIds() can only be called after executeMutations(). Current state: ${this.#state}`,\n );\n }\n\n const createdIds: FragnoId[] = [];\n let createIndex = 0;\n\n for (const op of this.#mutationOps) {\n if (op.type === \"create\") {\n const internalId = this.#createdInternalIds[createIndex] ?? undefined;\n createdIds.push(\n new FragnoId({\n externalId: op.generatedExternalId,\n internalId,\n version: 0, // New records always start at version 0\n }),\n );\n createIndex++;\n }\n }\n\n return createdIds;\n }\n\n /**\n * @internal\n * Compile the unit of work to executable queries for testing\n */\n compile<TOutput>(compiler: UOWCompiler<TSchema, TOutput>): {\n name?: string;\n retrievalBatch: TOutput[];\n mutationBatch: CompiledMutation<TOutput>[];\n } {\n const retrievalBatch: TOutput[] = [];\n for (const op of this.#retrievalOps) {\n const compiled = compiler.compileRetrievalOperation(op);\n if (compiled !== null) {\n retrievalBatch.push(compiled);\n }\n }\n\n const mutationBatch: CompiledMutation<TOutput>[] = [];\n for (const op of this.#mutationOps) {\n const compiled = compiler.compileMutationOperation(op);\n if (compiled !== null) {\n mutationBatch.push(compiled);\n }\n }\n\n return {\n name: this.#name,\n retrievalBatch,\n mutationBatch,\n };\n }\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fragno-dev/db",
3
- "version": "0.1.12",
3
+ "version": "0.1.13",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": {
@@ -74,9 +74,9 @@
74
74
  "kysely-pglite": "^0.6.1",
75
75
  "vitest": "^3.2.4",
76
76
  "zod": "^4.1.12",
77
- "@fragno-dev/core": "0.1.6",
77
+ "@fragno-private/vitest-config": "0.0.0",
78
78
  "@fragno-private/typescript-config": "0.0.1",
79
- "@fragno-private/vitest-config": "0.0.0"
79
+ "@fragno-dev/core": "0.1.6"
80
80
  },
81
81
  "repository": {
82
82
  "type": "git",