@fragno-dev/db 0.1.11 → 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 (71) hide show
  1. package/.turbo/turbo-build.log +41 -39
  2. package/CHANGELOG.md +19 -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 +42 -34
  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 +4 -3
  14. package/dist/adapters/kysely/kysely-adapter.d.ts.map +1 -1
  15. package/dist/adapters/kysely/kysely-adapter.js.map +1 -1
  16. package/dist/adapters/kysely/kysely-query.d.ts +22 -0
  17. package/dist/adapters/kysely/kysely-query.d.ts.map +1 -0
  18. package/dist/adapters/kysely/kysely-query.js +101 -51
  19. package/dist/adapters/kysely/kysely-query.js.map +1 -1
  20. package/dist/adapters/kysely/kysely-uow-compiler.js +2 -1
  21. package/dist/adapters/kysely/kysely-uow-compiler.js.map +1 -1
  22. package/dist/adapters/kysely/kysely-uow-executor.js +2 -2
  23. package/dist/adapters/kysely/kysely-uow-executor.js.map +1 -1
  24. package/dist/adapters/kysely/migration/execute-base.js +1 -1
  25. package/dist/migration-engine/generation-engine.d.ts +1 -1
  26. package/dist/migration-engine/generation-engine.d.ts.map +1 -1
  27. package/dist/migration-engine/generation-engine.js.map +1 -1
  28. package/dist/mod.d.ts +7 -6
  29. package/dist/mod.d.ts.map +1 -1
  30. package/dist/mod.js +2 -1
  31. package/dist/mod.js.map +1 -1
  32. package/dist/query/cursor.d.ts +67 -32
  33. package/dist/query/cursor.d.ts.map +1 -1
  34. package/dist/query/cursor.js +84 -31
  35. package/dist/query/cursor.js.map +1 -1
  36. package/dist/query/query.d.ts +29 -8
  37. package/dist/query/query.d.ts.map +1 -1
  38. package/dist/query/result-transform.js +17 -5
  39. package/dist/query/result-transform.js.map +1 -1
  40. package/dist/query/unit-of-work.d.ts +19 -8
  41. package/dist/query/unit-of-work.d.ts.map +1 -1
  42. package/dist/query/unit-of-work.js +54 -12
  43. package/dist/query/unit-of-work.js.map +1 -1
  44. package/dist/schema/serialize.js +2 -0
  45. package/dist/schema/serialize.js.map +1 -1
  46. package/package.json +3 -3
  47. package/src/adapters/drizzle/drizzle-adapter-pglite.test.ts +242 -55
  48. package/src/adapters/drizzle/drizzle-adapter-sqlite.test.ts +95 -39
  49. package/src/adapters/drizzle/drizzle-query.test.ts +54 -4
  50. package/src/adapters/drizzle/drizzle-query.ts +74 -60
  51. package/src/adapters/drizzle/drizzle-uow-compiler.test.ts +82 -6
  52. package/src/adapters/drizzle/drizzle-uow-compiler.ts +3 -2
  53. package/src/adapters/drizzle/drizzle-uow-decoder.ts +40 -1
  54. package/src/adapters/kysely/kysely-adapter-pglite.test.ts +190 -4
  55. package/src/adapters/kysely/kysely-adapter.ts +6 -3
  56. package/src/adapters/kysely/kysely-query.test.ts +498 -0
  57. package/src/adapters/kysely/kysely-query.ts +187 -83
  58. package/src/adapters/kysely/kysely-uow-compiler.test.ts +85 -3
  59. package/src/adapters/kysely/kysely-uow-compiler.ts +3 -2
  60. package/src/adapters/kysely/kysely-uow-executor.ts +5 -9
  61. package/src/migration-engine/generation-engine.ts +2 -1
  62. package/src/mod.ts +12 -7
  63. package/src/query/cursor.test.ts +113 -68
  64. package/src/query/cursor.ts +127 -36
  65. package/src/query/query-type.test.ts +34 -14
  66. package/src/query/query.ts +94 -34
  67. package/src/query/result-transform.test.ts +5 -5
  68. package/src/query/result-transform.ts +29 -11
  69. package/src/query/unit-of-work.ts +141 -26
  70. package/src/schema/serialize.test.ts +223 -0
  71. package/src/schema/serialize.ts +16 -0
@@ -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
 
@@ -7,20 +8,30 @@ import { Prettify } from "../util/types.js";
7
8
  type AnySelectClause = SelectClause<AnyTable>;
8
9
  type SelectClause<T extends AnyTable> = true | (keyof T["columns"])[];
9
10
  type RawColumnValues<T extends AnyTable> = { [K in keyof T["columns"] as string extends K ? never : K]: T["columns"][K]["$out"] };
10
- type TableToColumnValues<T extends AnyTable> = RawColumnValues<T>;
11
+ type TableToColumnValues<T extends AnyTable> = Prettify<RawColumnValues<T>>;
11
12
  type PickNullable<T> = { [P in keyof T as null extends T[P] ? P : never]: T[P] };
12
13
  type PickNotNullable<T> = { [P in keyof T as null extends T[P] ? never : P]: T[P] };
13
14
  type RawInsertValues<T extends AnyTable> = { [K in keyof T["columns"] as string extends K ? never : K]: T["columns"][K]["$in"] };
14
15
  type TableToInsertValues<T extends AnyTable> = Prettify<Partial<PickNullable<RawInsertValues<T>>> & PickNotNullable<RawInsertValues<T>>>;
15
16
  type TableToUpdateValues<T extends AnyTable> = { [K in keyof T["columns"] as string extends K ? never : K]?: T["columns"][K] extends IdColumn ? never : T["columns"][K]["$in"] };
16
- type MainSelectResult<S extends SelectClause<T>, T extends AnyTable> = S extends true ? TableToColumnValues<T> : S extends (keyof T["columns"])[] ? { [K in S[number] as string extends K ? never : K]: K extends keyof T["columns"] ? T["columns"][K]["$out"] : never } : never;
17
- type SelectResult<T extends AnyTable, JoinOut, Select extends SelectClause<T>> = MainSelectResult<Select, T> & JoinOut;
17
+ type MainSelectResult<S extends SelectClause<T>, T extends AnyTable> = S extends true ? TableToColumnValues<T> : S extends (keyof T["columns"])[] ? Prettify<{ [K in S[number] as string extends K ? never : K]: K extends keyof T["columns"] ? T["columns"][K]["$out"] : never }> : never;
18
+ type SelectResult<T extends AnyTable, JoinOut, Select extends SelectClause<T>> = Prettify<MainSelectResult<Select, T> & JoinOut>;
18
19
  interface MapRelationType<Type$1> {
19
20
  one: Type$1 | null;
20
21
  many: Type$1[];
21
22
  }
22
- type JoinBuilder<T extends AnyTable, Out = {}> = { [K in keyof T["relations"]]: T["relations"][K] extends Relation<infer Type, infer Target> ? <Select extends SelectClause<Target> = true, JoinOut = {}>(options?: FindManyOptions<Target, Select, JoinOut, false>) => JoinBuilder<T, Out & { [$K in K]: MapRelationType<SelectResult<Target, JoinOut, Select>>[Type] }> : never };
23
+ type JoinBuilder<T extends AnyTable, Out = {}> = { [K in keyof T["relations"]]: T["relations"][K] extends Relation<infer Type, infer Target> ? <Select extends SelectClause<Target> = true, JoinOut = {}>(options?: FindManyOptions<Target, Select, JoinOut, false>) => JoinBuilder<T, Prettify<Out & { [$K in K]: MapRelationType<SelectResult<Target, JoinOut, Select>>[Type] }>> : never };
23
24
  type OrderBy<Column = string> = [columnName: Column, "asc" | "desc"];
25
+ /**
26
+ * Extract Select type parameter from a FindBuilder type (handles Omit wrapper)
27
+ * @internal
28
+ */
29
+ type ExtractSelect<T> = T extends FindBuilder<any, infer TSelect, any> ? TSelect : T extends Omit<FindBuilder<any, infer TSelect, any>, any> ? TSelect : true;
30
+ /**
31
+ * Extract JoinOut type parameter from a FindBuilder type (handles Omit wrapper)
32
+ * @internal
33
+ */
34
+ type ExtractJoinOut<T> = T extends FindBuilder<any, any, infer TJoinOut> ? TJoinOut : T extends Omit<FindBuilder<any, any, infer TJoinOut>, any> ? TJoinOut : {};
24
35
  type FindFirstOptions<T extends AnyTable = AnyTable, Select extends SelectClause<T> = SelectClause<T>, JoinOut = {}, IsRoot extends boolean = true> = Omit<FindManyOptions<T, Select, JoinOut, IsRoot>, IsRoot extends true ? "limit" : "limit" | "offset" | "orderBy">;
25
36
  type FindManyOptions<T extends AnyTable = AnyTable, Select extends SelectClause<T> = SelectClause<T>, _JoinOut = {}, IsRoot extends boolean = true> = {
26
37
  select?: Select;
@@ -35,12 +46,22 @@ interface AbstractQuery<TSchema extends AnySchema, TUOWConfig = void> {
35
46
  /**
36
47
  * Find multiple records using a builder pattern
37
48
  */
38
- find: <TableName extends keyof TSchema["tables"] & string, Select extends SelectClause<TSchema["tables"][TableName]> = true, JoinOut = {}>(table: TableName, builderFn?: (builder: Omit<FindBuilder<TSchema["tables"][TableName]>, "build">) => Omit<FindBuilder<TSchema["tables"][TableName], Select, JoinOut>, "build">) => Promise<SelectResult<TSchema["tables"][TableName], JoinOut, Select>[]>;
49
+ find: {
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]>>>[]>;
51
+ <TableName extends keyof TSchema["tables"] & string>(table: TableName): Promise<SelectResult<TSchema["tables"][TableName], {}, true>[]>;
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]>>>>>;
39
57
  /**
40
58
  * Find the first record matching the criteria
41
59
  * Implemented as a wrapper around find() with pageSize(1)
42
60
  */
43
- findFirst: <TableName extends keyof TSchema["tables"] & string, Select extends SelectClause<TSchema["tables"][TableName]> = true, JoinOut = {}>(table: TableName, builderFn?: (builder: Omit<FindBuilder<TSchema["tables"][TableName]>, "build">) => Omit<FindBuilder<TSchema["tables"][TableName], Select, JoinOut>, "build">) => Promise<SelectResult<TSchema["tables"][TableName], JoinOut, Select> | null>;
61
+ findFirst: {
62
+ <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]>>> | null>;
63
+ <TableName extends keyof TSchema["tables"] & string>(table: TableName): Promise<SelectResult<TSchema["tables"][TableName], {}, true> | null>;
64
+ };
44
65
  /**
45
66
  * Create a single record
46
67
  * @returns The ID of the created record
@@ -55,7 +76,7 @@ interface AbstractQuery<TSchema extends AnySchema, TUOWConfig = void> {
55
76
  * Update a single record by ID
56
77
  * Note: you cannot update the id of a row, some databases don't support that (including MongoDB).
57
78
  */
58
- update: <TableName extends keyof TSchema["tables"] & string>(table: TableName, id: FragnoId | string, builderFn: (builder: Omit<UpdateBuilder<TSchema["tables"][TableName]>, "build" | "check">) => Omit<UpdateBuilder<TSchema["tables"][TableName]>, "build" | "check">) => Promise<void>;
79
+ update: <TableName extends keyof TSchema["tables"] & string>(table: TableName, id: FragnoId | string, builderFn: (builder: Omit<UpdateBuilder<TSchema["tables"][TableName]>, "build">) => Omit<UpdateBuilder<TSchema["tables"][TableName]>, "build">) => Promise<void>;
59
80
  /**
60
81
  * Update multiple records matching a where clause
61
82
  * Note: you cannot update the id of a row, some databases don't support that (including MongoDB).
@@ -64,7 +85,7 @@ interface AbstractQuery<TSchema extends AnySchema, TUOWConfig = void> {
64
85
  /**
65
86
  * Delete a single record by ID
66
87
  */
67
- delete: <TableName extends keyof TSchema["tables"] & string>(table: TableName, id: FragnoId | string, builderFn?: (builder: Omit<DeleteBuilder, "build" | "check">) => Omit<DeleteBuilder, "build" | "check">) => Promise<void>;
88
+ delete: <TableName extends keyof TSchema["tables"] & string>(table: TableName, id: FragnoId | string, builderFn?: (builder: Omit<DeleteBuilder, "build">) => Omit<DeleteBuilder, "build">) => Promise<void>;
68
89
  /**
69
90
  * Delete multiple records matching a where clause
70
91
  */
@@ -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":"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"}
@@ -75,13 +75,25 @@ function encodeValues(values, table, generateDefault, provider) {
75
75
  let value = values[k];
76
76
  if (generateDefault && value === void 0) value = generateRuntimeDefault(col);
77
77
  if (value !== void 0) {
78
- if (col.role === "reference" && typeof value === "string") {
79
- const relation = Object.values(table.relations).find((rel) => rel.on.some(([localCol]) => localCol === k));
80
- if (relation) {
81
- result[col.name] = new ReferenceSubquery(relation.table, value);
78
+ if (col.role === "reference") {
79
+ if (typeof value === "string") {
80
+ const relation = Object.values(table.relations).find((rel) => rel.on.some(([localCol]) => localCol === k));
81
+ if (relation) {
82
+ result[col.name] = new ReferenceSubquery(relation.table, value);
83
+ continue;
84
+ }
85
+ throw new Error(`Reference column ${k} not found in table ${table.name}`);
86
+ } else if (value instanceof FragnoId) if (value.internalId !== void 0) {
87
+ result[col.name] = value.internalId;
82
88
  continue;
89
+ } else {
90
+ const relation = Object.values(table.relations).find((rel) => rel.on.some(([localCol]) => localCol === k));
91
+ if (relation) {
92
+ result[col.name] = new ReferenceSubquery(relation.table, value.externalId);
93
+ continue;
94
+ }
95
+ throw new Error(`Reference column ${k} not found in table ${table.name}`);
83
96
  }
84
- throw new Error(`Reference column ${k} not found in table ${table.name}`);
85
97
  }
86
98
  result[col.name] = serialize(value, col, provider);
87
99
  }
@@ -1 +1 @@
1
- {"version":3,"file":"result-transform.js","names":["#referencedTable","#externalIdValue","result: Record<string, unknown>","output: Record<string, unknown>","columnValues: Record<string, unknown>","relationData: Record<string, Record<string, unknown>>"],"sources":["../../src/query/result-transform.ts"],"sourcesContent":["import type { AnyColumn, AnyTable } from \"../schema/create\";\nimport type { SQLProvider } from \"../shared/providers\";\nimport { deserialize, serialize } from \"../schema/serialize\";\nimport { FragnoId, FragnoReference } from \"../schema/create\";\nimport { createId } from \"../id\";\n\n/**\n * Marker class for reference column values that need subquery resolution.\n * When a reference column receives a string (external ID), this marker tells\n * the query builder to generate a subquery to look up the internal ID.\n * @internal\n */\nexport class ReferenceSubquery {\n #referencedTable: AnyTable;\n #externalIdValue: string;\n\n constructor(referencedTable: AnyTable, externalIdValue: string) {\n this.#referencedTable = referencedTable;\n this.#externalIdValue = externalIdValue;\n }\n\n get referencedTable() {\n return this.#referencedTable;\n }\n\n get externalIdValue() {\n return this.#externalIdValue;\n }\n}\n\n/**\n * Generate a runtime default value for a column that has defaultTo$()\n *\n * Only generates values for runtime defaults (defaultTo$), NOT static defaults (defaultTo).\n * Static defaults should be handled by the database via DEFAULT constraints.\n *\n * @param column - The column with a default value configuration\n * @returns The generated default value, or undefined if the column has no runtime default\n *\n * @internal\n */\nexport function generateRuntimeDefault(column: AnyColumn): unknown {\n // Check if column has a default value configuration\n if (!column.default) {\n return undefined;\n }\n\n // If it's a static default value (defaultTo), return undefined\n // as the database should handle this via DEFAULT constraint\n if (\"value\" in column.default) {\n return undefined;\n }\n\n // If it's a database-level special function (defaultTo(b => b.now())), return undefined\n // as the database should handle this via DEFAULT NOW() or equivalent\n if (\"dbSpecial\" in column.default) {\n return undefined;\n }\n\n // Handle runtime defaults (defaultTo$)\n const runtime = column.default.runtime;\n\n if (runtime === \"cuid\") {\n return createId();\n }\n\n if (runtime === \"now\") {\n return new Date();\n }\n\n if (typeof runtime === \"function\") {\n return runtime();\n }\n\n return undefined;\n}\n\n/**\n * Encodes a record of values from the application format to database format.\n *\n * This function transforms object keys to match SQL column names and serializes\n * values according to the database provider's requirements (e.g., converting\n * JavaScript Date objects to numbers for SQLite).\n *\n * @param values - The record of values to encode in application format\n * @param table - The table schema definition containing column information\n * @param generateDefault - Whether to generate default values for undefined columns\n * @param provider - The SQL provider (sqlite, postgresql, mysql, etc.)\n * @returns A record with database-compatible column names and serialized values\n *\n * @example\n * ```ts\n * const encoded = encodeValues(\n * { userId: 123, createdAt: new Date() },\n * userTable,\n * true,\n * 'sqlite'\n * );\n * // Returns: { user_id: 123, created_at: 1234567890 }\n * ```\n */\nexport function encodeValues(\n values: Record<string, unknown>,\n table: AnyTable,\n generateDefault: boolean,\n provider: SQLProvider,\n): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n\n for (const k in table.columns) {\n const col = table.columns[k];\n\n // Skip internal ID - never provided by user, auto-generated by database\n if (col.role === \"internal-id\") {\n continue;\n }\n let value = values[k];\n\n if (generateDefault && value === undefined) {\n // Only generate runtime defaults (defaultTo$), not static defaults (defaultTo).\n // Static defaults should be handled by the database via DEFAULT constraints.\n value = generateRuntimeDefault(col);\n }\n\n if (value !== undefined) {\n // Handle string references - convert external ID to internal ID via subquery\n if (col.role === \"reference\" && typeof value === \"string\") {\n // Find relation that uses this column\n const relation = Object.values(table.relations).find((rel) =>\n rel.on.some(([localCol]) => localCol === k),\n );\n if (relation) {\n result[col.name] = new ReferenceSubquery(relation.table, value);\n continue;\n }\n\n throw new Error(`Reference column ${k} not found in table ${table.name}`);\n }\n\n result[col.name] = serialize(value, col, provider);\n }\n }\n\n return result;\n}\n\n/**\n * Decodes a database result record to application format.\n *\n * This function transforms database column names back to application property names\n * and deserializes values according to the database provider's format (e.g., converting\n * SQLite integers back to JavaScript Date objects).\n *\n * Supports relation data encoded with the pattern `relationName:columnName`.\n *\n * @param result - The raw database result record\n * @param table - The table schema definition containing column and relation information\n * @param provider - The SQL provider (sqlite, postgresql, mysql, etc.)\n * @returns A record in application format with deserialized values\n *\n * @example\n * ```ts\n * const decoded = decodeResult(\n * { user_id: 123, created_at: 1234567890, 'posts:title': 'Hello' },\n * userTable,\n * 'sqlite'\n * );\n * // Returns: { userId: 123, createdAt: Date, posts: { title: 'Hello' } }\n * ```\n */\nexport function decodeResult(\n result: Record<string, unknown>,\n table: AnyTable,\n provider: SQLProvider,\n): Record<string, unknown> {\n const output: Record<string, unknown> = {};\n // First pass: collect all column values\n const columnValues: Record<string, unknown> = {};\n\n // Collect all relation data (including nested) keyed by relation name\n const relationData: Record<string, Record<string, unknown>> = {};\n\n for (const k in result) {\n const colonIndex = k.indexOf(\":\");\n const value = result[k];\n\n // Direct column (no colon)\n if (colonIndex === -1) {\n const col = table.columns[k];\n if (!col) {\n continue;\n }\n\n // Store all column values (including hidden ones for FragnoId creation)\n columnValues[k] = deserialize(value, col, provider);\n continue;\n }\n\n // Relation column (has colon)\n const relationName = k.slice(0, colonIndex);\n const remainder = k.slice(colonIndex + 1);\n\n const relation = table.relations[relationName];\n if (relation === undefined) {\n continue;\n }\n\n // Collect relation data with the remaining key path\n relationData[relationName] ??= {};\n relationData[relationName][remainder] = value;\n }\n\n // Process each relation's data recursively\n for (const relationName in relationData) {\n const relation = table.relations[relationName];\n if (!relation) {\n continue;\n }\n\n // Recursively decode the relation data\n output[relationName] = decodeResult(relationData[relationName], relation.table, provider);\n }\n\n // Second pass: create output with FragnoId objects where appropriate\n for (const k in columnValues) {\n const col = table.columns[k];\n if (!col) {\n continue;\n }\n\n // Filter out hidden columns (like _internalId, _version) from results\n if (col.isHidden) {\n continue;\n }\n\n // For external ID columns, create FragnoId if we have both external and internal IDs\n if (col.role === \"external-id\" && columnValues[\"_internalId\"] !== undefined) {\n output[k] = new FragnoId({\n externalId: columnValues[k] as string,\n internalId: columnValues[\"_internalId\"] as bigint,\n // _version is always selected as a hidden column, so it should always be present\n version: columnValues[\"_version\"] as number,\n });\n } else if (col.role === \"reference\") {\n // For reference columns, create FragnoReference with internal ID\n output[k] = FragnoReference.fromInternal(columnValues[k] as bigint);\n } else {\n output[k] = columnValues[k];\n }\n }\n\n return output;\n}\n"],"mappings":";;;;;;;;;;;AAYA,IAAa,oBAAb,MAA+B;CAC7B;CACA;CAEA,YAAY,iBAA2B,iBAAyB;AAC9D,QAAKA,kBAAmB;AACxB,QAAKC,kBAAmB;;CAG1B,IAAI,kBAAkB;AACpB,SAAO,MAAKD;;CAGd,IAAI,kBAAkB;AACpB,SAAO,MAAKC;;;;;;;;;;;;;;AAehB,SAAgB,uBAAuB,QAA4B;AAEjE,KAAI,CAAC,OAAO,QACV;AAKF,KAAI,WAAW,OAAO,QACpB;AAKF,KAAI,eAAe,OAAO,QACxB;CAIF,MAAM,UAAU,OAAO,QAAQ;AAE/B,KAAI,YAAY,OACd,QAAO,UAAU;AAGnB,KAAI,YAAY,MACd,wBAAO,IAAI,MAAM;AAGnB,KAAI,OAAO,YAAY,WACrB,QAAO,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;AA8BpB,SAAgB,aACd,QACA,OACA,iBACA,UACyB;CACzB,MAAMC,SAAkC,EAAE;AAE1C,MAAK,MAAM,KAAK,MAAM,SAAS;EAC7B,MAAM,MAAM,MAAM,QAAQ;AAG1B,MAAI,IAAI,SAAS,cACf;EAEF,IAAI,QAAQ,OAAO;AAEnB,MAAI,mBAAmB,UAAU,OAG/B,SAAQ,uBAAuB,IAAI;AAGrC,MAAI,UAAU,QAAW;AAEvB,OAAI,IAAI,SAAS,eAAe,OAAO,UAAU,UAAU;IAEzD,MAAM,WAAW,OAAO,OAAO,MAAM,UAAU,CAAC,MAAM,QACpD,IAAI,GAAG,MAAM,CAAC,cAAc,aAAa,EAAE,CAC5C;AACD,QAAI,UAAU;AACZ,YAAO,IAAI,QAAQ,IAAI,kBAAkB,SAAS,OAAO,MAAM;AAC/D;;AAGF,UAAM,IAAI,MAAM,oBAAoB,EAAE,sBAAsB,MAAM,OAAO;;AAG3E,UAAO,IAAI,QAAQ,UAAU,OAAO,KAAK,SAAS;;;AAItD,QAAO;;;;;;;;;;;;;;;;;;;;;;;;;;AA2BT,SAAgB,aACd,QACA,OACA,UACyB;CACzB,MAAMC,SAAkC,EAAE;CAE1C,MAAMC,eAAwC,EAAE;CAGhD,MAAMC,eAAwD,EAAE;AAEhE,MAAK,MAAM,KAAK,QAAQ;EACtB,MAAM,aAAa,EAAE,QAAQ,IAAI;EACjC,MAAM,QAAQ,OAAO;AAGrB,MAAI,eAAe,IAAI;GACrB,MAAM,MAAM,MAAM,QAAQ;AAC1B,OAAI,CAAC,IACH;AAIF,gBAAa,KAAK,YAAY,OAAO,KAAK,SAAS;AACnD;;EAIF,MAAM,eAAe,EAAE,MAAM,GAAG,WAAW;EAC3C,MAAM,YAAY,EAAE,MAAM,aAAa,EAAE;AAGzC,MADiB,MAAM,UAAU,kBAChB,OACf;AAIF,eAAa,kBAAkB,EAAE;AACjC,eAAa,cAAc,aAAa;;AAI1C,MAAK,MAAM,gBAAgB,cAAc;EACvC,MAAM,WAAW,MAAM,UAAU;AACjC,MAAI,CAAC,SACH;AAIF,SAAO,gBAAgB,aAAa,aAAa,eAAe,SAAS,OAAO,SAAS;;AAI3F,MAAK,MAAM,KAAK,cAAc;EAC5B,MAAM,MAAM,MAAM,QAAQ;AAC1B,MAAI,CAAC,IACH;AAIF,MAAI,IAAI,SACN;AAIF,MAAI,IAAI,SAAS,iBAAiB,aAAa,mBAAmB,OAChE,QAAO,KAAK,IAAI,SAAS;GACvB,YAAY,aAAa;GACzB,YAAY,aAAa;GAEzB,SAAS,aAAa;GACvB,CAAC;WACO,IAAI,SAAS,YAEtB,QAAO,KAAK,gBAAgB,aAAa,aAAa,GAAa;MAEnE,QAAO,KAAK,aAAa;;AAI7B,QAAO"}
1
+ {"version":3,"file":"result-transform.js","names":["#referencedTable","#externalIdValue","result: Record<string, unknown>","output: Record<string, unknown>","columnValues: Record<string, unknown>","relationData: Record<string, Record<string, unknown>>"],"sources":["../../src/query/result-transform.ts"],"sourcesContent":["import type { AnyColumn, AnyTable } from \"../schema/create\";\nimport type { SQLProvider } from \"../shared/providers\";\nimport { deserialize, serialize } from \"../schema/serialize\";\nimport { FragnoId, FragnoReference } from \"../schema/create\";\nimport { createId } from \"../id\";\n\n/**\n * Marker class for reference column values that need subquery resolution.\n * When a reference column receives a string (external ID), this marker tells\n * the query builder to generate a subquery to look up the internal ID.\n * @internal\n */\nexport class ReferenceSubquery {\n #referencedTable: AnyTable;\n #externalIdValue: string;\n\n constructor(referencedTable: AnyTable, externalIdValue: string) {\n this.#referencedTable = referencedTable;\n this.#externalIdValue = externalIdValue;\n }\n\n get referencedTable() {\n return this.#referencedTable;\n }\n\n get externalIdValue() {\n return this.#externalIdValue;\n }\n}\n\n/**\n * Generate a runtime default value for a column that has defaultTo$()\n *\n * Only generates values for runtime defaults (defaultTo$), NOT static defaults (defaultTo).\n * Static defaults should be handled by the database via DEFAULT constraints.\n *\n * @param column - The column with a default value configuration\n * @returns The generated default value, or undefined if the column has no runtime default\n *\n * @internal\n */\nexport function generateRuntimeDefault(column: AnyColumn): unknown {\n // Check if column has a default value configuration\n if (!column.default) {\n return undefined;\n }\n\n // If it's a static default value (defaultTo), return undefined\n // as the database should handle this via DEFAULT constraint\n if (\"value\" in column.default) {\n return undefined;\n }\n\n // If it's a database-level special function (defaultTo(b => b.now())), return undefined\n // as the database should handle this via DEFAULT NOW() or equivalent\n if (\"dbSpecial\" in column.default) {\n return undefined;\n }\n\n // Handle runtime defaults (defaultTo$)\n const runtime = column.default.runtime;\n\n if (runtime === \"cuid\") {\n return createId();\n }\n\n if (runtime === \"now\") {\n return new Date();\n }\n\n if (typeof runtime === \"function\") {\n return runtime();\n }\n\n return undefined;\n}\n\n/**\n * Encodes a record of values from the application format to database format.\n *\n * This function transforms object keys to match SQL column names and serializes\n * values according to the database provider's requirements (e.g., converting\n * JavaScript Date objects to numbers for SQLite).\n *\n * @param values - The record of values to encode in application format\n * @param table - The table schema definition containing column information\n * @param generateDefault - Whether to generate default values for undefined columns\n * @param provider - The SQL provider (sqlite, postgresql, mysql, etc.)\n * @returns A record with database-compatible column names and serialized values\n *\n * @example\n * ```ts\n * const encoded = encodeValues(\n * { userId: 123, createdAt: new Date() },\n * userTable,\n * true,\n * 'sqlite'\n * );\n * // Returns: { user_id: 123, created_at: 1234567890 }\n * ```\n */\nexport function encodeValues(\n values: Record<string, unknown>,\n table: AnyTable,\n generateDefault: boolean,\n provider: SQLProvider,\n): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n\n for (const k in table.columns) {\n const col = table.columns[k];\n\n // Skip internal ID - never provided by user, auto-generated by database\n if (col.role === \"internal-id\") {\n continue;\n }\n let value = values[k];\n\n if (generateDefault && value === undefined) {\n // Only generate runtime defaults (defaultTo$), not static defaults (defaultTo).\n // Static defaults should be handled by the database via DEFAULT constraints.\n value = generateRuntimeDefault(col);\n }\n\n if (value !== undefined) {\n // Handle string references and FragnoId objects\n if (col.role === \"reference\") {\n if (typeof value === \"string\") {\n // String external ID - generate subquery\n const relation = Object.values(table.relations).find((rel) =>\n rel.on.some(([localCol]) => localCol === k),\n );\n if (relation) {\n result[col.name] = new ReferenceSubquery(relation.table, value);\n continue;\n }\n throw new Error(`Reference column ${k} not found in table ${table.name}`);\n } else if (value instanceof FragnoId) {\n // FragnoId object\n if (value.internalId !== undefined) {\n // If internal ID is populated, use it directly (no subquery needed)\n result[col.name] = value.internalId;\n continue;\n } else {\n // If internal ID is not populated, use external ID via subquery\n const relation = Object.values(table.relations).find((rel) =>\n rel.on.some(([localCol]) => localCol === k),\n );\n if (relation) {\n result[col.name] = new ReferenceSubquery(relation.table, value.externalId);\n continue;\n }\n throw new Error(`Reference column ${k} not found in table ${table.name}`);\n }\n }\n }\n\n result[col.name] = serialize(value, col, provider);\n }\n }\n\n return result;\n}\n\n/**\n * Decodes a database result record to application format.\n *\n * This function transforms database column names back to application property names\n * and deserializes values according to the database provider's format (e.g., converting\n * SQLite integers back to JavaScript Date objects).\n *\n * Supports relation data encoded with the pattern `relationName:columnName`.\n *\n * @param result - The raw database result record\n * @param table - The table schema definition containing column and relation information\n * @param provider - The SQL provider (sqlite, postgresql, mysql, etc.)\n * @returns A record in application format with deserialized values\n *\n * @example\n * ```ts\n * const decoded = decodeResult(\n * { user_id: 123, created_at: 1234567890, 'posts:title': 'Hello' },\n * userTable,\n * 'sqlite'\n * );\n * // Returns: { userId: 123, createdAt: Date, posts: { title: 'Hello' } }\n * ```\n */\nexport function decodeResult(\n result: Record<string, unknown>,\n table: AnyTable,\n provider: SQLProvider,\n): Record<string, unknown> {\n const output: Record<string, unknown> = {};\n // First pass: collect all column values\n const columnValues: Record<string, unknown> = {};\n\n // Collect all relation data (including nested) keyed by relation name\n const relationData: Record<string, Record<string, unknown>> = {};\n\n for (const k in result) {\n const colonIndex = k.indexOf(\":\");\n const value = result[k];\n\n // Direct column (no colon)\n if (colonIndex === -1) {\n const col = table.columns[k];\n if (!col) {\n continue;\n }\n\n // Store all column values (including hidden ones for FragnoId creation)\n columnValues[k] = deserialize(value, col, provider);\n continue;\n }\n\n // Relation column (has colon)\n const relationName = k.slice(0, colonIndex);\n const remainder = k.slice(colonIndex + 1);\n\n const relation = table.relations[relationName];\n if (relation === undefined) {\n continue;\n }\n\n // Collect relation data with the remaining key path\n relationData[relationName] ??= {};\n relationData[relationName][remainder] = value;\n }\n\n // Process each relation's data recursively\n for (const relationName in relationData) {\n const relation = table.relations[relationName];\n if (!relation) {\n continue;\n }\n\n // Recursively decode the relation data\n output[relationName] = decodeResult(relationData[relationName], relation.table, provider);\n }\n\n // Second pass: create output with FragnoId objects where appropriate\n for (const k in columnValues) {\n const col = table.columns[k];\n if (!col) {\n continue;\n }\n\n // Filter out hidden columns (like _internalId, _version) from results\n if (col.isHidden) {\n continue;\n }\n\n // For external ID columns, create FragnoId if we have both external and internal IDs\n if (col.role === \"external-id\" && columnValues[\"_internalId\"] !== undefined) {\n output[k] = new FragnoId({\n externalId: columnValues[k] as string,\n internalId: columnValues[\"_internalId\"] as bigint,\n // _version is always selected as a hidden column, so it should always be present\n version: columnValues[\"_version\"] as number,\n });\n } else if (col.role === \"reference\") {\n // For reference columns, create FragnoReference with internal ID\n output[k] = FragnoReference.fromInternal(columnValues[k] as bigint);\n } else {\n output[k] = columnValues[k];\n }\n }\n\n return output;\n}\n"],"mappings":"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"}
@@ -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
  */
@@ -387,19 +393,24 @@ declare class UnitOfWork<const TSchema extends AnySchema, const TRetrievalResult
387
393
  /**
388
394
  * Add a find operation using a builder callback (retrieval phase only)
389
395
  */
390
- 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">): UnitOfWork<TSchema, [...TRetrievalResults, SelectResult<TSchema["tables"][TTableName], TJoinOut, TSelect>[]], TRawInput>;
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)
403
+ * Returns a FragnoId with the external ID that can be used immediately in subsequent operations
393
404
  */
394
- create<TableName extends keyof TSchema["tables"] & string>(table: TableName, values: TableToInsertValues<TSchema["tables"][TableName]>): this;
405
+ create<TableName extends keyof TSchema["tables"] & string>(table: TableName, values: TableToInsertValues<TSchema["tables"][TableName]>): FragnoId;
395
406
  /**
396
407
  * Add an update operation using a builder callback (mutation phase only)
397
408
  */
398
- update<TableName extends keyof TSchema["tables"] & string>(table: TableName, id: FragnoId | string, builderFn: (builder: Omit<UpdateBuilder<TSchema["tables"][TableName]>, "build">) => Omit<UpdateBuilder<TSchema["tables"][TableName]>, "build">): this;
409
+ update<TableName extends keyof TSchema["tables"] & string>(table: TableName, id: FragnoId | string, builderFn: (builder: Omit<UpdateBuilder<TSchema["tables"][TableName]>, "build">) => Omit<UpdateBuilder<TSchema["tables"][TableName]>, "build"> | void): void;
399
410
  /**
400
411
  * Add a delete operation using a builder callback (mutation phase only)
401
412
  */
402
- delete<TableName extends keyof TSchema["tables"] & string>(table: TableName, id: FragnoId | string, builderFn?: (builder: Omit<DeleteBuilder, "build">) => Omit<DeleteBuilder, "build">): this;
413
+ delete<TableName extends keyof TSchema["tables"] & string>(table: TableName, id: FragnoId | string, builderFn?: (builder: Omit<DeleteBuilder, "build">) => Omit<DeleteBuilder, "build"> | void): void;
403
414
  /**
404
415
  * Execute the mutation phase
405
416
  * Returns success flag indicating if mutations completed without conflicts
@@ -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":";;;;;;;;AAYA;;;AACgC,UADf,iBACe,CAAA,eADkB,QAClB,CAAA,CAAA;EACjB,UAAA,CAAA,mBADiB,cACjB,CADgC,MAChC,CAAA,CAAA,CAAA,SAAA,EAAA,UAAA,EAAA,SAAA,CAAA,EAAA,CAAA,EAAA,EACM,6BADN,CACoC,MADpC,EAC4C,UAD5C,CAAA,EAAA,GAC4D,SAD5D,GAAA,OAAA,CAAA,EAAA,IAAA;EACoC,GAAA,CAAA,MAAA,EAErC,mBAFqC,CAEjB,MAFiB,CAAA,CAAA,EAAA,IAAA;;;;;AAErC,KAMF,YANE,CAAA,eAM0B,KAN1B,CAAA,GAMmC,MANnC,CAAA,aAAA,CAAA,CAAA,MAAA,CAAA;KAQT,iBAR4B,CAAA,CAAA,CAAA,GAQL,CARK,SAAA,MAAA,GAAA,CAAA,MAQqB,CARrB,SAAA,KAAA,GAAA,KAAA,GAQ+C,CAR/C,CAAA,GAAA,KAAA;AAMjC;AAA+E;;KAO1E,cALiD,CAAA,iBAKjB,MALiB,CAAA,MAAA,EAKF,KALE,CAAA,CAAA,GAKQ,QALR,CAAA,MAKuB,QALvB,CAAA,SAKyC,KALzC,GAMlD,YANkD,CAMrC,QANqC,CAAA,MAMtB,QANsB,CAAA,CAAA,GAAA,KAAA;KASjD,SAT2E,CAAA,CAAA,CAAA,GAAA,QAAC,MAS/C,CAT+C,IAS1C,CAT0C,CASxC,CATwC,CAAA,SAAA,KAAA,GAAA,KAAA,GASb,CATa,GAST,CATS,CASP,CATO,CAAA,EAAA;;;;;AAKc,KAUnF,iBAVmF,CAAA,eAUlD,QAVkD,CAAA,GAAA,MAUhC,SAVgC,CAAA,QAC9E,MAUH,MAVG,CAAA,SAAA,CAAA,GAUiB,MAVjB,CAAA,SAAA,CAAA,CAUmC,CAVnC,CAAA,SAU8C,QAV9C,CAAA,KAAA,EAAA,EAAA,KAAA,GAAA,EAAA,KAAA,IAAA,CAAA,GAeX,CAfW,GAAA,KAAA,EAAe,CAAA;;;AAAhB;;;KAwBX,eArBoC,CAAA,eAsBxB,QAtBwB,EAAA,mBAuBpB,cAvBoB,CAuBL,MAvBK,CAAA,CAAA,GAwBrC,UAxBqC,SAAA,SAAA,GAyBrC,IAzBqC,CAyBhC,MAzBgC,CAAA,SAAA,CAAA,EAyBb,iBAzBa,CAyBK,MAzBL,CAAA,CAAA,GA0BrC,UA1BqC,SAAA,MA0BZ,MA1BY,CAAA,SAAA,CAAA,GA2BnC,IA3BmC,CA2B9B,MA3B8B,CAAA,SAAA,CAAA,EA2BX,YA3BW,CA2BE,MA3BF,CAAA,SAAA,CAAA,CA2BoB,UA3BpB,CAAA,CAAA,CAAA,GAAA,KAAA;;;;;AAM7B,KA4BA,uBA5BiB,CAAA,eA4BsB,QA5BtB,CAAA,GA4BkC,gBA5BlC,CA6B3B,IA7B2B,CA6BtB,MA7BsB,CAAA,SAAA,CAAA,EA6BH,cA7BG,CA6BY,MA7BZ,CAAA,SAAA,CAAA,CAAA,CAAA,CAAA;;;;KAmCxB,6BAlC+C,CAAA,eAmCnC,QAnCmC,EAAA,mBAoC/B,cApC+B,CAoChB,MApCgB,CAAA,CAAA,GAqChD,gBArCgD,CAqC/B,eArC+B,CAqCf,MArCe,EAqCP,UArCO,CAAA,CAAA;;;;AADoB,KA2C5D,cA3C4D,CAAA,eA2C9B,QA3C8B,CAAA,GAAA,SAAA,GAAA,CAAA,MAAA,GAAA,MA6CpD,MA7CoD,CAAA,SAAA,CAAA,CAAA;AAQrE;;;KA0CE,WAjCgB,CAAA,eAkCJ,QAlCI,GAkCO,QAlCP,EAAA,gBAmCH,YAnCG,CAmCU,MAnCV,CAAA,GAmCoB,YAnCpB,CAmCiC,MAnCjC,CAAA,CAAA,GAAA;EACjB;;;EACwB,QAAA,EAAA,MAAA;EAAxB;;;EAEO,MAAA,CAAA,EAwCA,OAxCA;EAAgC;;;EAArC,KAAA,CAAA,EAAA,CAAA,EAAA,EA4CS,uBA5CT,CA4CiC,MA5CjC,CAAA,EAAA,GA4C6C,SA5C7C,GAAA,OAAA;EAAI;AAOV;;EACO,YAAA,CAAA,EAAA;IAAkC,SAAA,EAAA,MAAA;IAAf,SAAA,EAAA,KAAA,GAAA,MAAA;EAAxB,CAAA;EAD6D;;AAE7D;EAMe,KAAA,CAAA,EAwCP,MAxCO,GAAA,MAAA;EACmB;;;EACS,MAAA,CAAA,EA0ClC,MA1CkC,GAAA,MAAA;EAAxB;;;EAKT,QAAA,CAAA,EAAA,MAAc;EAOrB;;;EAE0B,KAAA,CAAA,EAoCrB,YApCqB,EAAA;CAAb;;;;AAaqB,KA6B3B,QAAA,GA7B2B,oBAAA,GAAA,mBAAA,GAAA,UAAA;;;;AAe5B,KAmBC,kBAnBD,CAAA,gBAoBO,SApBP,EAAA,eAqBM,QArBN,GAqBiB,OArBjB,CAAA,QAAA,CAAA,CAAA,MAqByC,OArBzC,CAAA,QAAA,CAAA,CAAA,CAAA,GAAA;EAQD,IAAA,EAAA,MAAA;EAAY,KAAA,EAiBT,MAjBS;EAMV,SAAA,EAAQ,MAAA;EAKR,OAAA,EAQG,WARH,CAQe,MARG,EAQK,YARL,CAQkB,MARlB,CAAA,CAAA;EACZ,UAAA,CAAA,EAAA,OAAA;CACD,GAAA;EAAW,IAAA,EAAA,OAAA;EAAwB,KAAA,EAWvC,MAXuC;EAIvC,SAAA,EAAA,MAAA;EAEc,OAAA,EAOZ,IAPY,CAOP,WAPO,CAOK,MAPL,CAAA,EAAA,OAAA,GAAA,UAAA,CAAA;CAAqB;;;;AAOhB,KAMpB,iBANoB,CAAA,gBAOd,SAPc,EAAA,eAQf,QARe,GAQJ,OARI,CAAA,QAAA,CAAA,CAAA,MAQoB,OARpB,CAAA,QAAA,CAAA,CAAA,CAAA,GAAA;EAAZ,IAAA,EAAA,QAAA;EAAL,KAAA,EAYF,MAZE,CAAA,MAAA,CAAA;EAAI,EAAA,EAaT,QAbS,GAAA,MAAA;EAMP,YAAA,EAAA,OAAiB;EACX,GAAA,EAQP,mBARO,CAQa,MARb,CAAA;CACD,GAAA;EAAW,IAAA,EAAA,QAAA;EAAwB,KAAA,EAWvC,MAXuC,CAAA,MAAA,CAAA;EAIvC,MAAA,EAQC,mBARD,CAQqB,MARrB,CAAA;EACH,mBAAA,EAAA,MAAA;CAEqB,GAAA;EAApB,IAAA,EAAA,QAAA;EAIE,KAAA,EAMA,MANA,CAAA,MAAA,CAAA;EACqB,EAAA,EAMxB,QANwB,GAAA,MAAA;EAApB,YAAA,EAAA,OAAA;CAKD;;;AAQb;AAaiB,UAbA,gBAaW,CAAA,OAAA,CAAA,CAAA;EAAiB,KAAA,EAZpC,OAYoC;EAIM;;;;;EAK0B,oBAAA,EAAA,MAAA,GAAA,IAAA;;;AAG7E;AAOA;AAIwC,UAvBvB,WAuBuB,CAAA,gBAvBK,SAuBL,EAAA,OAAA,CAAA,CAAA;EAAoB;;;EAOtB,yBAAA,CAAA,EAAA,EA1BN,kBA0BM,CA1Ba,OA0Bb,CAAA,CAAA,EA1BwB,OA0BxB,GAAA,IAAA;EAAsC;;;EAS3D,wBAAU,CAAA,EAAA,EA9BI,iBA8BJ,CA9BsB,OA8BtB,CAAA,CAAA,EA9BiC,gBA8BjC,CA9BkD,OA8BlD,CAAA,GAAA,IAAA;;AAQZ,KAnCH,cAAA,GAmCG;EAA4C,OAAA,EAAA,IAAA;EAAnB,kBAAA,EAAA,CAAA,MAAA,GAAA,IAAA,CAAA,EAAA;CAAkB,GAAA;EAM7C,OAAA,EAAA,KAAW;CACP;;;;AA6B8B,UAhE9B,WAgE8B,CAAA,OAAA,EAAA,aAAA,OAAA,CAAA,CAAA;EAAf;;;EAE2B,qBAAA,CAAA,cAAA,EA9DnB,OA8DmB,EAAA,CAAA,EA9DP,OA8DO,CA9DC,UA8DD,EAAA,CAAA;EAAtC;;;;;EA2BJ,oBAAA,CAAA,aAAA,EAlFqB,gBAkFrB,CAlFsC,OAkFtC,CAAA,EAAA,CAAA,EAlFmD,OAkFnD,CAlF2D,cAkF3D,CAAA;;;;;;;;AAmEA,UA5IA,UA4IA,CAAA,gBA5I2B,SA4I3B,EAAA,YAAA,OAAA,CAAA,CAAA;EAqBmB;;;;;;;EACF,CAAA,UAAA,EA1JnB,SA0JmB,EAAA,EAAA,UAAA,EA1JM,kBA0JN,CA1JyB,OA0JzB,CAAA,EAAA,CAAA,EAAA,OAAA,EAAA;;;;;AAaA,cAjKrB,WAiKqB,CAAA,eAhKjB,QAgKiB,EAAA,gBA/JhB,YA+JgB,CA/JH,MA+JG,CAAA,GAAA,IAAA,EAAA,WAAA,CAAA,CAAA,CAAA,CAAA;EAAZ,CAAA,OAAA;EAAL,WAAA,CAAA,SAAA,EAAA,MAAA,EAAA,KAAA,EA3IuB,MA2IvB;EAAI;AA0FrB;;EAOqC,UAAA,CAAA,mBApOL,cAoOK,CApOU,MAoOV,CAAA,CAAA,CAAA,SAAA,EAnOtB,UAmOsB,EAAA,SAAA,CAAA,EAAA,CAAA,EAAA,EAlOhB,6BAkOgB,CAlOc,MAkOd,EAlOsB,UAkOtB,CAAA,EAAA,GAlOsC,SAkOtC,GAAA,OAAA,CAAA,EAAA,IAAA;EAQH;;;;EA0BzB,MAAA,CAAA,yBA3OyB,YA2OzB,CA3OsC,MA2OtC,CAAA,CAAA,CAAA,OAAA,EA1OI,UA0OJ,CAAA,EAzOJ,WAyOI,CAzOQ,MAyOR,EAzOgB,UAyOhB,EAzO4B,QAyO5B,CAAA;EAAmB;AAmB5B;AAyCA;;EAE+B,WAAA,CAAA,CAAA,EAAA,IAAA;EAAb;;;EAwBc,YAAA,CAAA,mBAjSE,cAiSF,CAjSiB,MAiSjB,CAAA,CAAA,CAAA,SAAA,EAhSjB,UAgSiB,EAAA,SAAA,EAAA,KAAA,GAAA,MAAA,CAAA,EAAA,IAAA;EACjB;;;;;EAyBgC,KAAA,CAAA,MAAA,EAnS/B,MAmS+B,GAAA,MAAA,CAAA,EAAA,IAAA;EAAb;;;;;EAE7B,MAAA,CAAA,MAAA,EAxRY,MAwRZ,GAAA,MAAA,CAAA,EAAA,IAAA;EAS4C;;;EAgCb,QAAA,CAAA,IAAA,EAAA,MAAA,CAAA,EAAA,IAAA;EAAnB;;;;EACI,IAAA,CAAA,WAAA,CAAA,CAAA,MAAA,EAAA,CAAA,EAAA,EA7SJ,kBA6SI,CA7Se,MA6Sf,EAAA,CAAA,CAAA,CAAA,EAAA,GA7S+B,kBA6S/B,CA7SkD,MA6SlD,EA7S0D,WA6S1D,CAAA,CAAA,EA5ShB,WA4SgB,CA5SJ,MA4SI,EA5SI,OA4SJ,EA5Sa,WA4Sb,CAAA;EAAQ;;;EAAxB,KAAA,CAAA,CAAA,EAAA;IAUO,IAAA,EAAA,MAAA;IAC6B,SAAA,EAAA,MAAA;IAAxB,OAAA,EA9SiC,WA8SjC,CA9S6C,MA8S7C,EA9SqD,OA8SrD,CAAA;EAAoC,CAAA,GAAA;IAQ1C,IAAA,EAAA,OAAA;IAAY,SAAA,EAAA,MAAA;IAmBb,OAAA,EArUO,IAqUP,CArUY,WAqUG,CArUS,MAqUT,CAAA,EAAA,OAAA,GAAA,UAAA,CAAA;EAEA,CAAA;;;;;AAQb,cArPC,aAqPiB,CAAA,eArPY,QAqPZ,CAAA,CAAA;EAAgB,CAAA,OAAA;EAChC,WAAA,CAAA,SAAA,EAAA,MAAA,EAAA,EAAA,EA/OuB,QA+OvB,GAAA,MAAA;EAAsB;;;EAIA,GAAA,CAAA,MAAA,EA3OtB,mBA2OsB,CA3OF,MA2OE,CAAA,CAAA,EAAA,IAAA;EAAoB;;;;EAErC,KAAA,CAAA,CAAA,EAAA,IAAA;EACU;;;EAA0C,KAAA,CAAA,CAAA,EAAA;IAA1D,EAAA,EAtNL,QAsNK,GAAA,MAAA;IAEL,YAAA,EAAA,OAAA;IACA,GAAA,EAvNC,mBAuND,CAvNqB,MAuNrB,CAAA;EACQ,CAAA;;;;;AAAI,cArMP,aAAA,CAqMO;EAER,CAAA,OAAA;EALD,WAAA,CAAA,SAAA,EAAA,MAAA,EAAA,EAAA,EA5L0B,QA4L1B,GAAA,MAAA;EAAkB;AAe7B;;;EAEmC,KAAA,CAAA,CAAA,EAAA,IAAA;EAAnB;;;EAAmC,KAAA,CAAA,CAAA,EAAA;IAChD,EAAA,EAvLc,QAuLd,GAAA,MAAA;IAAY,YAAA,EAAA,OAAA;EAqEC,CAAA;;;;;;AAOJ,cAvPC,eAuPD,CAAA,eAtPK,QAsPL,EAAA,gBArPM,YAqPN,CArPmB,MAqPnB,CAAA,GAAA,IAAA,EAAA,WAAA,CAAA,CAAA,CAAA,CAAA;EACU,CAAA,OAAA;EAAS,WAAA,CAAA,SAAA,EAAA,MAAA,EAAA,KAAA,EAtOS,MAsOT;EAApB;;;EAE+B,UAAA,CAAA,mBAhOV,cAgOU,CAhOK,MAgOL,CAAA,CAAA,CAAA,SAAA,EA/N3B,UA+N2B,EAAA,SAAA,CAAA,EAAA,CAAA,EAAA,EA9NrB,6BA8NqB,CA9NS,MA8NT,EA9NiB,UA8NjB,CAAA,EAAA,GA9NiC,SA8NjC,GAAA,OAAA,CAAA,EAAA,IAAA;EAAvC;;AAQH;EAiCa,MAAA,CAAA,yBA/OqB,YA+OX,CA/OwB,MA+OxB,CAAA,CAAA,CAAA,OAAA,EA9OV,UA8OU,CAAA,EA7OlB,eA6OkB,CA7OF,MA6OE,EA7OM,UA6ON,EA7OkB,QA6OlB,CAAA;EACC;;;EAuBV,YAAA,CAAA,mBA5PoB,cA4PpB,CA5PmC,MA4PnC,CAAA,CAAA,CAAA,SAAA,EA3PC,UA2PD,EAAA,SAAA,EAAA,KAAA,GAAA,MAAA,CAAA,EAAA,IAAA;EACqB;;;EACF,QAAA,CAAA,IAAA,EAAA,MAAA,CAAA,EAAA,IAAA;EAApB;;;;EA4BsB,IAAA,CAAA,WAAA,CAAA,CAAA,MAAA,EAAA,CAAA,EAAA,EA1PlB,kBA0PkB,CA1PC,MA0PD,EAAA,CAAA,CAAA,CAAA,EAAA,GA1PiB,kBA0PjB,CA1PoC,MA0PpC,EA1P4C,WA0P5C,CAAA,CAAA,EAzP9B,eAyP8B,CAzPd,MAyPc,EAzPN,OAyPM,EAzPG,QAyPH,GAzPc,WAyPd,CAAA;EAAR;;;EA4CwB,KAAA,CAAA,CAAA,EAAA;IAA/B,SAAA,EAAA,MAAA,GAAA,SAAA;IAGL,MAAA,EA9RH,OA8RG,GAAA,SAAA;IAGiB,KAAA,EAAA,CAAA,CAAA,EAAA,EAhSf,uBAgSe,CAhSS,MAgST,CAAA,EAAA,GAhSqB,SAgSrB,GAAA,OAAA,CAAA,GAAA,SAAA;IAAkB,YAAA,EAAA;MAA9B,SAAA,EAAA,MAAA;MAAL,SAAA,EAAA,KAAA,GAAA,MAAA;IACW,CAAA,GAAA,SAAA;IAAkB,QAAA,EAAA,MAAA,GAAA,SAAA;IAAa,KAAA,EAzR9C,YAyR8C,EAAA,GAAA,SAAA;EAAS,CAAA;;UAtQxD,eAsQD,CAAA,CAAA,CAAA,CAAA;EAEL,GAAA,EAtQG,iBAsQH,CAtQqB,CAsQrB,CAAA,GAAA,IAAA;EACI,IAAA,EAtQA,iBAsQA,CAtQkB,CAsQlB,CAAA,EAAA;;;;;;AACJ,KAhQQ,kBAgQR,CAAA,eAhQ0C,QAgQ1C,EAAA,QAAA,CAAA,GAAA,QAHC,MA5PS,MA4PT,CAAA,WAAA,CAAA,GA5P+B,MA4P/B,CAAA,WAAA,CAAA,CA5PmD,CA4PnD,CAAA,SA5P8D,QA4P9D,CAAA,KAAA,cAAA,EAAA,KAAA,aAAA,CAAA,GAAA,CAAA,gBAxPkB,YAwPlB,CAxP+B,MAwP/B,CAAA,WAAA,CAAA,CAxPmD,CAwPnD,CAAA,CAAA,OAAA,CAAA,CAAA,GAAA,IAAA,EAAA,iBAAA,CAAA,CAAA,CAAA,CAAA,SAAA,CAAA,EAAA,CAAA,OAAA,EAtPc,eAsPd,CAtP8B,MAsP9B,CAAA,WAAA,CAAA,CAtPkD,CAsPlD,CAAA,CAAA,OAAA,CAAA,CAAA,EAAA,GArPQ,eAqPR,CArPwB,MAqPxB,CAAA,WAAA,CAAA,CArP4C,CAqP5C,CAAA,CAAA,OAAA,CAAA,EArPyD,OAqPzD,EArPkE,cAqPlE,CAAA,EAAA,GApPM,kBAoPN,CAnPG,MAmPH,EAlPG,QAkPH,GAAA,QAjPW,CAgSa,GAhST,eAgSS,CA/RjB,YA+RiB,CA/RJ,YA+RI,EA/RU,cA+RV,EA/R0B,OA+R1B,CAAA,CAAA,CA9RjB,aA8RiB,CAAA,EACI,CAAA,GAAA,KAAA,EAAkB;;;;;AAM/B,iBA3RJ,gBA2RI,CAAA,eA3R4B,QA2R5B,EAAA,QAAA,CAAA,CAAA,KAAA,EA1RX,MA0RW,EAAA,EAAA,EAAA,CAAA,OAAA,EAzRJ,kBAyRI,CAzRe,MAyRf,EAAA,CAAA,CAAA,CAAA,EAAA,GAzR+B,kBAyR/B,CAzRkD,MAyRlD,EAzR0D,QAyR1D,CAAA,CAAA,EAxRjB,YAwRiB,EAAA;AAAL,iBAnNC,gBAmND,CAAA,sBAlNS,SAkNT,EAAA,gCAAA,OAAA,EAAA,GAAA,EAAA,EAAA,kBAAA,OAAA,CAAA,CAAA,MAAA,EA9ML,OA8MK,EAAA,QAAA,EA7MH,WA6MG,CA7MS,OA6MT,EAAA,OAAA,CAAA,EAAA,QAAA,EA5MH,WA4MG,CAAA,OAAA,EA5MkB,SA4MlB,CAAA,EAAA,OAAA,EA3MJ,UA2MI,CA3MO,OA2MP,EA3MgB,SA2MhB,CAAA,EAAA,IAAA,CAAA,EAAA,MAAA,CAAA,EAzMZ,UAyMY,CAzMD,OAyMC,EAzMQ,iBAyMR,EAzM2B,SAyM3B,CAAA;AACW,UAlMT,gBAAA,CAkMS;EAAkB,MAAA,CAAA,EAAA,OAAA;EAAa,OAAA,CAAA,EAAA,CAAA,KAAA,EAAA,OAAA,EAAA,GAAA,IAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAqHhD,cAtRI,UAsRJ,CAAA,sBArRe,SAqRf,EAAA,gCAAA,OAAA,EAAA,GAAA,EAAA,EAAA,kBAAA,OAAA,CAAA,CAAA;EAuBwB,CAAA,OAAA;EACtB,WAAA,CAAA,MAAA,EAvRC,OAuRD,EAAA,QAAA,EAtRG,WAsRH,CAtRe,OAsRf,EAAA,OAAA,CAAA,EAAA,QAAA,EArRG,WAqRH,CAAA,OAAA,EArRwB,SAqRxB,CAAA,EAAA,OAAA,EApRE,UAoRF,CApRa,OAoRb,EApRsB,SAoRtB,CAAA,EAAA,IAAA,CAAA,EAAA,MAAA,EAAA,MAAA,CAAA,EAlRE,gBAkRF;EACH,IAAA,MAAA,CAAA,CAAA,EAzQQ,OAyQR;EAGY,IAAA,KAAA,CAAA,CAAA,EAxQL,QAwQK;EAAL,IAAA,IAAA,CAAA,CAAA,EAAA,MAAA,GAAA,SAAA;EACD;;;;EA6D4B,eAAA,CAAA,CAAA,EA1Tf,OA0Te,CA1TP,iBA0TO,CAAA;EAAd;;;EAOD,IAAA,CAAA,mBAAA,MAtRE,OAsRF,CAAA,QAAA,CAAA,GAAA,MAAA,EAAA,gBArRP,YAqRO,CArRM,OAqRN,CAAA,QAAA,CAAA,CArRwB,UAqRxB,CAAA,CAAA,GAAA,IAAA,EAAA,WAAA,CAAA,CAAA,CAAA,CAAA,SAAA,EAlRZ,UAkRY,EAAA,SAAA,CAAA,EAAA,CAAA,OAAA,EA/QZ,IA+QY,CA/QP,WA+QO,CA/QK,OA+QL,CAAA,QAAA,CAAA,CA/QuB,UA+QvB,CAAA,CAAA,EAAA,OAAA,CAAA,EAAA,GA9QlB,IA8QkB,CA9Qb,WA8Qa,CA9QD,OA8QC,CAAA,QAAA,CAAA,CA9QiB,UA8QjB,CAAA,EA9Q8B,OA8Q9B,EA9QuC,QA8QvC,CAAA,EAAA,OAAA,CAAA,GAAA,IAAA,CAAA,EA7QtB,UA6QsB,CA5QvB,OA4QuB,EAAA,CAYR,GAvRX,iBAuRW,EAvRQ,YAsTc,CAtTD,OAsTC,CAAA,QAAA,CAAA,CAtTiB,UAsTjB,CAAA,EAtT8B,QAsT9B,EAtTwC,OAsTxC,CAAA,EAAA,CAAS,EArT9C,SAqT8C,CAAA;EAArB;;;EAGV,cAAA,CAAA,mBAAA,MA5QU,OA4QV,CAAA,QAAA,CAAA,GAAA,MAAA,EAAA,gBA3QC,YA2QD,CA3Qc,OA2Qd,CAAA,QAAA,CAAA,CA3QgC,UA2QhC,CAAA,CAAA,GAAA,IAAA,EAAA,WAAA,CAAA,CAAA,CAAA,CAAA,SAAA,EAxQJ,UAwQI,EAAA,SAAA,EAAA,CAAA,OAAA,EArQJ,IAqQI,CArQC,WAqQD,CArQa,OAqQb,CAAA,QAAA,CAAA,CArQ+B,UAqQ/B,CAAA,CAAA,EAAA,OAAA,CAAA,EAAA,GApQV,IAoQU,CApQL,WAoQK,CApQO,OAoQP,CAAA,QAAA,CAAA,CApQyB,UAoQzB,CAAA,EApQsC,OAoQtC,EApQ+C,QAoQ/C,CAAA,EAAA,OAAA,CAAA,GAAA,IAAA,CAAA,EAnQd,UAmQc,CAlQf,OAkQe,EAAA,CAAgB,GAhQ1B,iBAgQ0B,EA/P7B,aAAa,aAAa,kBAAkB,aAAa,UAAU,YAErE;;;;;iCA2C6B,mCACtB,mBACC,oBAAoB,kBAAkB,cAC7C;;;;iCA0D4B,mCACtB,eACH,wCAGO,KAAK,cAAc,kBAAkB,0BAC3C,KAAK,cAAc,kBAAkB;;;;iCAuBb,mCACtB,eACH,yCAGO,KAAK,4BACX,KAAK;;;;;sBAuBc;;;;;;4BAsCA,cAAc,mBAAmB;;;;2BAOlC,cAAc,kBAAkB;;;;;;;;;mBAYxC;;;;;6BA+BU,YAAY,SAAS;;oBAE9B;mBACD,iBAAiB"}
@@ -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,7 +441,27 @@ 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)
464
+ * Returns a FragnoId with the external ID that can be used immediately in subsequent operations
421
465
  */
422
466
  create(table, values) {
423
467
  if (this.#state === "executed") throw new Error(`create() can only be called during mutation phase.`);
@@ -444,7 +488,7 @@ var UnitOfWork = class {
444
488
  values: updatedValues,
445
489
  generatedExternalId: externalId
446
490
  });
447
- return this;
491
+ return FragnoId.fromExternal(externalId, 0);
448
492
  }
449
493
  /**
450
494
  * Add an update operation using a builder callback (mutation phase only)
@@ -461,7 +505,6 @@ var UnitOfWork = class {
461
505
  checkVersion,
462
506
  set
463
507
  });
464
- return this;
465
508
  }
466
509
  /**
467
510
  * Add a delete operation using a builder callback (mutation phase only)
@@ -477,7 +520,6 @@ var UnitOfWork = class {
477
520
  id: opId,
478
521
  checkVersion
479
522
  });
480
- return this;
481
523
  }
482
524
  /**
483
525
  * Execute the mutation phase