@fragno-dev/db 0.2.0 → 0.2.2
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.
- package/.turbo/turbo-build.log +34 -30
- package/CHANGELOG.md +49 -0
- package/dist/adapters/generic-sql/query/where-builder.js +1 -1
- package/dist/db-fragment-definition-builder.d.ts +31 -39
- package/dist/db-fragment-definition-builder.d.ts.map +1 -1
- package/dist/db-fragment-definition-builder.js +20 -16
- package/dist/db-fragment-definition-builder.js.map +1 -1
- package/dist/fragments/internal-fragment.d.ts +94 -8
- package/dist/fragments/internal-fragment.d.ts.map +1 -1
- package/dist/fragments/internal-fragment.js +56 -55
- package/dist/fragments/internal-fragment.js.map +1 -1
- package/dist/hooks/hooks.d.ts +5 -3
- package/dist/hooks/hooks.d.ts.map +1 -1
- package/dist/hooks/hooks.js +38 -37
- package/dist/hooks/hooks.js.map +1 -1
- package/dist/mod.d.ts +3 -3
- package/dist/mod.d.ts.map +1 -1
- package/dist/mod.js +4 -4
- package/dist/mod.js.map +1 -1
- package/dist/query/unit-of-work/execute-unit-of-work.d.ts +367 -80
- package/dist/query/unit-of-work/execute-unit-of-work.d.ts.map +1 -1
- package/dist/query/unit-of-work/execute-unit-of-work.js +448 -148
- package/dist/query/unit-of-work/execute-unit-of-work.js.map +1 -1
- package/dist/query/unit-of-work/unit-of-work.d.ts +35 -11
- package/dist/query/unit-of-work/unit-of-work.d.ts.map +1 -1
- package/dist/query/unit-of-work/unit-of-work.js +49 -19
- package/dist/query/unit-of-work/unit-of-work.js.map +1 -1
- package/dist/query/value-decoding.js +1 -1
- package/dist/schema/create.d.ts +2 -3
- package/dist/schema/create.d.ts.map +1 -1
- package/dist/schema/create.js +2 -5
- package/dist/schema/create.js.map +1 -1
- package/dist/schema/generate-id.d.ts +20 -0
- package/dist/schema/generate-id.d.ts.map +1 -0
- package/dist/schema/generate-id.js +28 -0
- package/dist/schema/generate-id.js.map +1 -0
- package/dist/sql-driver/dialects/durable-object-dialect.d.ts.map +1 -1
- package/package.json +3 -3
- package/src/adapters/drizzle/drizzle-adapter-pglite.test.ts +1 -0
- package/src/adapters/drizzle/drizzle-adapter-sqlite3.test.ts +41 -25
- package/src/adapters/generic-sql/test/generic-drizzle-adapter-sqlite3.test.ts +39 -25
- package/src/db-fragment-definition-builder.test.ts +58 -42
- package/src/db-fragment-definition-builder.ts +78 -88
- package/src/db-fragment-instantiator.test.ts +64 -88
- package/src/db-fragment-integration.test.ts +292 -142
- package/src/fragments/internal-fragment.test.ts +272 -266
- package/src/fragments/internal-fragment.ts +155 -122
- package/src/hooks/hooks.test.ts +268 -264
- package/src/hooks/hooks.ts +74 -63
- package/src/mod.ts +14 -4
- package/src/query/unit-of-work/execute-unit-of-work.test.ts +1582 -998
- package/src/query/unit-of-work/execute-unit-of-work.ts +1746 -343
- package/src/query/unit-of-work/tx-builder.test.ts +1041 -0
- package/src/query/unit-of-work/unit-of-work-coordinator.test.ts +269 -21
- package/src/query/unit-of-work/unit-of-work.test.ts +64 -0
- package/src/query/unit-of-work/unit-of-work.ts +65 -30
- package/src/schema/create.ts +2 -5
- package/src/schema/generate-id.test.ts +57 -0
- package/src/schema/generate-id.ts +38 -0
- package/src/shared/config.ts +0 -10
- package/src/shared/connection-pool.ts +0 -24
- package/src/shared/prisma.ts +0 -45
|
@@ -1 +1 @@
|
|
|
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","#promise","#resolve","#reject","#expectedCount","#signalCount","#isRestricted","#parent","#children","#retrievalTracker","#mutationTracker","#parentCoordinator","#compiler","#executor","#decoder","#schemaNamespaceMap","#name","#config","#nonce","#coordinator","#state","#retrievalOps","#mutationOps","#retrievalResults","#createdInternalIds","#retrievalPhaseDeferred","#mutationPhaseDeferred","#retrievalError","#mutationError","#triggeredHooks","emptyResults: unknown[]","retrievalBatch: unknown[]","mutationBatch: CompiledMutation<unknown>[]","createdIds: FragnoId[]","retrievalBatch: TOutput[]","mutationBatch: CompiledMutation<TOutput>[]","#schema","#namespace","#uow","#cachedRetrievalPhase","#operationIndices","externalId: string"],"sources":["../../../src/query/unit-of-work/unit-of-work.ts"],"sourcesContent":["import type {\n AnySchema,\n AnyTable,\n Index,\n IdColumn,\n AnyColumn,\n Relation,\n} from \"../../schema/create\";\nimport { FragnoId } from \"../../schema/create\";\nimport type { Condition, ConditionBuilder } from \"../condition-builder\";\nimport type {\n SelectClause,\n TableToInsertValues,\n TableToUpdateValues,\n SelectResult,\n ExtractSelect,\n ExtractJoinOut,\n} from \"../simple-query-interface\";\nimport { buildCondition } from \"../condition-builder\";\nimport type { CompiledJoin } from \"../orm/orm\";\nimport type { CursorResult } from \"../cursor\";\nimport { Cursor } from \"../cursor\";\nimport type { Prettify } from \"../../util/types\";\nimport type { TriggeredHook, TriggerHookOptions, HooksMap, HookPayload } from \"../../hooks/hooks\";\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 schema: TSchema;\n namespace?: string;\n table: TTable;\n indexName: string;\n options: FindOptions<TTable, SelectClause<TTable>>;\n withCursor?: boolean;\n withSingleResult?: boolean;\n }\n | {\n type: \"count\";\n schema: TSchema;\n namespace?: string;\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 schema: TSchema;\n namespace?: string;\n table: TTable[\"name\"];\n id: FragnoId | string;\n checkVersion: boolean;\n set: TableToUpdateValues<TTable>;\n }\n | {\n type: \"create\";\n schema: TSchema;\n namespace?: string;\n table: TTable[\"name\"];\n values: TableToInsertValues<TTable>;\n generatedExternalId: string;\n }\n | {\n type: \"delete\";\n schema: TSchema;\n namespace?: string;\n table: TTable[\"name\"];\n id: FragnoId | string;\n checkVersion: boolean;\n }\n | {\n type: \"check\";\n schema: TSchema;\n namespace?: string;\n table: TTable[\"name\"];\n id: FragnoId;\n };\n\n/**\n * Compiled mutation with metadata for execution\n */\nexport interface CompiledMutation<TOutput> {\n query: TOutput;\n /**\n * The type of mutation operation (create, update, delete, or check).\n */\n op: \"create\" | \"update\" | \"delete\" | \"check\";\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: bigint | null;\n /**\n * Number of rows this SELECT query must return for the transaction to succeed.\n * Used for check operations to verify version without modifying data.\n * null means this is not a SELECT query that needs row count validation.\n */\n expectedReturnedRows: number | null;\n}\n\n/**\n * Compiler interface for Unit of Work operations\n */\nexport interface UOWCompiler<TOutput> {\n /**\n * Compile a retrieval operation to the adapter's query format\n */\n compileRetrievalOperation(op: RetrievalOperation<AnySchema>): TOutput | null;\n\n /**\n * Compile a mutation operation to the adapter's query format\n */\n compileMutationOperation(op: MutationOperation<AnySchema>): 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<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 decode(rawResults: TRawInput[], operations: RetrievalOperation<AnySchema>[]): 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 * @throws {RangeError} If size is not a positive integer\n */\n pageSize(size: number): this {\n if (!Number.isInteger(size) || size <= 0) {\n throw new RangeError(`pageSize must be a positive integer, received: ${size}`);\n }\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 * @throws {RangeError} If size is not a positive integer\n */\n pageSize(size: number): this {\n if (!Number.isInteger(size) || size <= 0) {\n throw new RangeError(`pageSize must be a positive integer, received: ${size}`);\n }\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\n/**\n * Full Unit of Work interface with all operations including execution.\n * This allows UOW instances to be passed between different contexts that use different schemas.\n */\nexport interface IUnitOfWork {\n // Getters (schema-agnostic)\n readonly state: UOWState;\n readonly name: string | undefined;\n readonly nonce: string;\n readonly retrievalPhase: Promise<unknown[]>;\n readonly mutationPhase: Promise<void>;\n\n // Execution (schema-agnostic)\n executeRetrieve(): Promise<unknown[]>;\n executeMutations(): Promise<{ success: boolean }>;\n\n // Inspection (schema-agnostic)\n getRetrievalOperations(): ReadonlyArray<RetrievalOperation<AnySchema>>;\n getMutationOperations(): ReadonlyArray<MutationOperation<AnySchema>>;\n getCreatedIds(): FragnoId[];\n\n // Parent-child relationships\n restrict(): IUnitOfWork;\n\n // Reset for retry support\n reset(): void;\n\n // Schema-specific view (for cross-schema operations)\n // The optional hooks parameter is for type inference only - pass your hooks map\n // to get proper typing for triggerHook. The value is not used at runtime.\n forSchema<TOtherSchema extends AnySchema, TOtherHooks extends HooksMap = {}>(\n schema: TOtherSchema,\n hooks?: TOtherHooks,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ): TypedUnitOfWork<TOtherSchema, [], any, TOtherHooks>;\n\n // Schema registration (for cross-fragment operations like hooks)\n registerSchema(schema: AnySchema, namespace: string): void;\n\n // Hook triggering (schema-agnostic, string-based hook names)\n triggerHook(hookName: string, payload: unknown, options?: TriggerHookOptions): void;\n\n getTriggeredHooks(): readonly TriggeredHook[];\n}\n\n/**\n * Restricted UOW interface without execute methods.\n * Useful when you want to allow building operations but not executing them,\n * to prevent deadlocks or enforce execution control at a higher level.\n *\n * Note: This is just a marker interface. Restriction is enforced by the UnitOfWork class itself.\n */\nexport interface IUnitOfWorkRestricted\n extends Omit<IUnitOfWork, \"executeRetrieve\" | \"executeMutations\"> {}\n\nexport function createUnitOfWork(\n compiler: UOWCompiler<unknown>,\n executor: UOWExecutor<unknown, unknown>,\n decoder: UOWDecoder<unknown>,\n schemaNamespaceMap?: WeakMap<AnySchema, string>,\n name?: string,\n): UnitOfWork {\n return new UnitOfWork(compiler, executor, decoder, name, undefined, schemaNamespaceMap);\n}\n\nexport interface UnitOfWorkConfig {\n dryRun?: boolean;\n onQuery?: (query: unknown) => void;\n nonce?: string;\n}\n\n/**\n * Encapsulates a promise with its resolver/rejecter functions.\n * Simplifies management of deferred promises with built-in error handling.\n */\nclass DeferredPromise<T> {\n #resolve?: (value: T) => void;\n #reject?: (error: Error) => void;\n #promise: Promise<T>;\n\n constructor() {\n const { promise, resolve, reject } = Promise.withResolvers<T>();\n this.#promise = promise;\n this.#resolve = resolve;\n this.#reject = reject;\n // Attach no-op error handler to prevent unhandled rejection warnings\n this.#promise.catch(() => {});\n }\n\n get promise(): Promise<T> {\n return this.#promise;\n }\n\n resolve(value: T): void {\n this.#resolve?.(value);\n }\n\n reject(error: Error): void {\n this.#reject?.(error);\n }\n\n /**\n * Reset to a new promise\n */\n reset(): void {\n const { promise, resolve, reject } = Promise.withResolvers<T>();\n this.#promise = promise;\n this.#resolve = resolve;\n this.#reject = reject;\n // Attach no-op error handler to prevent unhandled rejection warnings\n this.#promise.catch(() => {});\n }\n}\n\n/**\n * Tracks readiness signals from a group of children.\n * Maintains a promise that resolves when all registered children have signaled.\n */\nclass ReadinessTracker {\n #expectedCount = 0;\n #signalCount = 0;\n #resolve?: () => void;\n #promise: Promise<void> = Promise.resolve();\n\n get promise(): Promise<void> {\n return this.#promise;\n }\n\n /**\n * Register that we're expecting a signal from a child\n */\n registerChild(): void {\n if (this.#expectedCount === 0) {\n // First child - create new promise\n const { promise, resolve } = Promise.withResolvers<void>();\n this.#promise = promise;\n this.#resolve = resolve;\n }\n this.#expectedCount++;\n }\n\n /**\n * Signal that one child is ready\n */\n signal(): void {\n this.#signalCount++;\n if (this.#signalCount >= this.#expectedCount && this.#resolve) {\n this.#resolve();\n }\n }\n\n /**\n * Reset to initial state\n */\n reset(): void {\n this.#expectedCount = 0;\n this.#signalCount = 0;\n this.#resolve = undefined;\n this.#promise = Promise.resolve();\n }\n}\n\n/**\n * Manages parent-child relationships and readiness coordination for Unit of Work instances.\n * This allows parent UOWs to wait for all child UOWs to signal readiness before executing phases.\n */\nclass UOWChildCoordinator<TRawInput> {\n #parent: UnitOfWork<TRawInput> | null = null;\n #parentCoordinator: UOWChildCoordinator<TRawInput> | null = null;\n #children: Set<UnitOfWork<TRawInput>> = new Set();\n #isRestricted = false;\n\n #retrievalTracker = new ReadinessTracker();\n #mutationTracker = new ReadinessTracker();\n\n get isRestricted(): boolean {\n return this.#isRestricted;\n }\n\n get parent(): UnitOfWork<TRawInput> | null {\n return this.#parent;\n }\n\n get children(): ReadonlySet<UnitOfWork<TRawInput>> {\n return this.#children;\n }\n\n get retrievalReadinessPromise(): Promise<void> {\n return this.#retrievalTracker.promise;\n }\n\n get mutationReadinessPromise(): Promise<void> {\n return this.#mutationTracker.promise;\n }\n\n /**\n * Mark this UOW as a restricted child of the given parent\n */\n setAsRestricted(\n parent: UnitOfWork<TRawInput>,\n parentCoordinator: UOWChildCoordinator<TRawInput>,\n ): void {\n this.#parent = parent;\n this.#parentCoordinator = parentCoordinator;\n this.#isRestricted = true;\n }\n\n /**\n * Register a child UOW\n */\n addChild(child: UnitOfWork<TRawInput>): void {\n this.#children.add(child);\n this.#retrievalTracker.registerChild();\n this.#mutationTracker.registerChild();\n }\n\n /**\n * Signal that this child is ready for retrieval phase execution.\n * Only valid for restricted (child) UOWs.\n */\n signalReadyForRetrieval(): void {\n if (!this.#parentCoordinator) {\n throw new Error(\"signalReadyForRetrieval() can only be called on restricted child UOWs\");\n }\n\n this.#parentCoordinator.notifyChildReadyForRetrieval();\n }\n\n /**\n * Signal that this child is ready for mutation phase execution.\n * Only valid for restricted (child) UOWs.\n */\n signalReadyForMutation(): void {\n if (!this.#parentCoordinator) {\n throw new Error(\"signalReadyForMutation() can only be called on restricted child UOWs\");\n }\n\n this.#parentCoordinator.notifyChildReadyForMutation();\n }\n\n /**\n * Notify this coordinator that a child is ready for retrieval (internal use).\n * Called by child UOWs when they signal readiness.\n */\n notifyChildReadyForRetrieval(): void {\n this.#retrievalTracker.signal();\n }\n\n /**\n * Notify this coordinator that a child is ready for mutation (internal use).\n * Called by child UOWs when they signal readiness.\n */\n notifyChildReadyForMutation(): void {\n this.#mutationTracker.signal();\n }\n\n /**\n * Reset coordination state for retry support\n */\n reset(): void {\n this.#children.clear();\n this.#retrievalTracker.reset();\n this.#mutationTracker.reset();\n }\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 * This is the untyped base storage. Use TypedUnitOfWork for type-safe operations.\n *\n * @example\n * ```ts\n * const uow = queryEngine.createUnitOfWork(\"update-user-balance\");\n * const typedUow = uow.forSchema(mySchema);\n *\n * // Retrieval phase\n * typedUow.find(\"users\", (b) => b.whereIndex(\"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 * typedUow.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<const TRawInput = unknown> implements IUnitOfWork {\n #name?: string;\n #config?: UnitOfWorkConfig;\n #nonce: string;\n\n #state: UOWState = \"building-retrieval\";\n\n // Operations can come from any schema\n #retrievalOps: RetrievalOperation<AnySchema>[] = [];\n #mutationOps: MutationOperation<AnySchema>[] = [];\n\n #compiler: UOWCompiler<unknown>;\n #executor: UOWExecutor<unknown, TRawInput>;\n #decoder: UOWDecoder<TRawInput>;\n #schemaNamespaceMap: WeakMap<AnySchema, string>;\n\n #retrievalResults?: unknown[];\n #createdInternalIds: (bigint | null)[] = [];\n\n // Phase coordination promises\n #retrievalPhaseDeferred = new DeferredPromise<unknown[]>();\n #mutationPhaseDeferred = new DeferredPromise<void>();\n\n // Error tracking\n #retrievalError: Error | null = null;\n #mutationError: Error | null = null;\n\n // Child coordination\n #coordinator: UOWChildCoordinator<TRawInput> = new UOWChildCoordinator();\n\n // Hook triggers\n #triggeredHooks: TriggeredHook[] = [];\n\n constructor(\n compiler: UOWCompiler<unknown>,\n executor: UOWExecutor<unknown, TRawInput>,\n decoder: UOWDecoder<TRawInput>,\n name?: string,\n config?: UnitOfWorkConfig,\n schemaNamespaceMap?: WeakMap<AnySchema, string>,\n ) {\n this.#compiler = compiler;\n this.#executor = executor;\n this.#decoder = decoder;\n this.#schemaNamespaceMap = schemaNamespaceMap ?? new WeakMap();\n this.#name = name;\n this.#config = config;\n this.#nonce = config?.nonce ?? crypto.randomUUID();\n }\n\n /**\n * Register a schema with its namespace for cross-fragment operations.\n * This is used for internal fragments like hooks that need to create\n * records in a different schema during the same transaction.\n */\n registerSchema(schema: AnySchema, namespace: string): void {\n this.#schemaNamespaceMap.set(schema, namespace);\n }\n\n /**\n * Get a schema-specific typed view of this UOW for type-safe operations.\n * Returns a wrapper that provides typed operations for the given schema.\n * The namespace is automatically resolved from the schema-namespace map.\n * The optional hooks parameter is for type inference only - pass your hooks map\n * to get proper typing for triggerHook. The value is not used at runtime.\n */\n forSchema<TOtherSchema extends AnySchema, TOtherHooks extends HooksMap = {}>(\n schema: TOtherSchema,\n _hooks?: TOtherHooks,\n ): TypedUnitOfWork<TOtherSchema, [], TRawInput, TOtherHooks> {\n const resolvedNamespace = this.#schemaNamespaceMap.get(schema);\n\n return new TypedUnitOfWork<TOtherSchema, [], TRawInput, TOtherHooks>(\n schema,\n resolvedNamespace,\n this,\n );\n }\n\n /**\n * Create a restricted child UOW that cannot execute phases.\n * The child shares the same operation storage but must signal readiness\n * before the parent can execute each phase.\n */\n restrict(): UnitOfWork<TRawInput> {\n const child = new UnitOfWork(\n this.#compiler,\n this.#executor,\n this.#decoder,\n this.#name,\n { ...this.#config, nonce: this.#nonce },\n this.#schemaNamespaceMap,\n );\n child.#coordinator.setAsRestricted(this, this.#coordinator);\n\n // Share state with parent\n child.#state = this.#state;\n child.#retrievalOps = this.#retrievalOps;\n child.#mutationOps = this.#mutationOps;\n child.#retrievalResults = this.#retrievalResults;\n child.#createdInternalIds = this.#createdInternalIds;\n child.#retrievalPhaseDeferred = this.#retrievalPhaseDeferred;\n child.#mutationPhaseDeferred = this.#mutationPhaseDeferred;\n child.#retrievalError = this.#retrievalError;\n child.#mutationError = this.#mutationError;\n child.#triggeredHooks = this.#triggeredHooks;\n\n this.#coordinator.addChild(child);\n\n // For synchronous usage (the common case), immediately signal readiness\n // This allows services called directly from handlers to work without explicit signaling\n child.signalReadyForRetrieval();\n child.signalReadyForMutation();\n\n return child;\n }\n\n /**\n * Signal that this child is ready for retrieval phase execution.\n * Only valid for restricted (child) UOWs.\n */\n signalReadyForRetrieval(): void {\n this.#coordinator.signalReadyForRetrieval();\n }\n\n /**\n * Signal that this child is ready for mutation phase execution.\n * Only valid for restricted (child) UOWs.\n */\n signalReadyForMutation(): void {\n this.#coordinator.signalReadyForMutation();\n }\n\n /**\n * Reset the UOW to initial state for retry support.\n * Clears operations, resets state, and resets phase promises.\n */\n reset(): void {\n if (this.#coordinator.isRestricted) {\n throw new Error(\"reset() cannot be called on restricted child UOWs\");\n }\n\n // Clear operations\n this.#retrievalOps = [];\n this.#mutationOps = [];\n this.#retrievalResults = undefined;\n this.#createdInternalIds = [];\n\n // Reset state\n this.#state = \"building-retrieval\";\n this.#retrievalError = null;\n this.#mutationError = null;\n\n // Reset phase promises\n this.#retrievalPhaseDeferred.reset();\n this.#mutationPhaseDeferred.reset();\n\n // Reset child coordination\n this.#coordinator.reset();\n\n // Reset hooks\n this.#triggeredHooks = [];\n }\n\n /**\n * Trigger a hook to be executed after the transaction commits.\n */\n triggerHook(hookName: string, payload: unknown, options?: TriggerHookOptions): void {\n this.#triggeredHooks.push({\n hookName,\n payload,\n options,\n });\n }\n\n /**\n * Get all triggered hooks for this UOW.\n */\n getTriggeredHooks(): ReadonlyArray<TriggeredHook> {\n return this.#triggeredHooks;\n }\n\n get state(): UOWState {\n return this.#state;\n }\n\n get name(): string | undefined {\n return this.#name;\n }\n\n get nonce(): string {\n return this.#nonce;\n }\n\n /**\n * Promise that resolves when the retrieval phase is executed\n * Service methods can await this to coordinate multi-phase logic\n */\n get retrievalPhase(): Promise<unknown[]> {\n return this.#retrievalPhaseDeferred.promise;\n }\n\n /**\n * Promise that resolves when the mutation phase is executed\n * Service methods can await this to coordinate multi-phase logic\n */\n get mutationPhase(): Promise<void> {\n return this.#mutationPhaseDeferred.promise;\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<unknown[]> {\n if (this.#coordinator.isRestricted) {\n throw new Error(\"executeRetrieve() cannot be called on restricted child UOWs\");\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 try {\n // Wait for all children to signal readiness\n await this.#coordinator.retrievalReadinessPromise;\n\n if (this.#retrievalOps.length === 0) {\n this.#state = \"building-mutation\";\n const emptyResults: unknown[] = [];\n this.#retrievalPhaseDeferred.resolve(emptyResults);\n return emptyResults;\n }\n\n // Compile retrieval operations using single compiler\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 retrievalBatch.push(compiled);\n }\n }\n\n if (this.#config?.dryRun) {\n this.#state = \"executed\";\n const emptyResults: unknown[] = [];\n this.#retrievalPhaseDeferred.resolve(emptyResults);\n return emptyResults;\n }\n\n const rawResults = await this.#executor.executeRetrievalPhase(retrievalBatch);\n\n const results = this.#decoder.decode(rawResults, this.#retrievalOps);\n\n // Store results and transition to mutation phase\n this.#retrievalResults = results;\n this.#state = \"building-mutation\";\n\n this.#retrievalPhaseDeferred.resolve(this.#retrievalResults);\n\n return this.#retrievalResults;\n } catch (error) {\n this.#retrievalError = error instanceof Error ? error : new Error(String(error));\n throw error;\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.#coordinator.isRestricted) {\n throw new Error(\"executeMutations() cannot be called on restricted child UOWs\");\n }\n\n if (this.#state === \"executed\") {\n throw new Error(`Cannot execute mutations from state ${this.#state}.`);\n }\n\n try {\n // Wait for all children to signal readiness\n await this.#coordinator.mutationReadinessPromise;\n\n // Compile mutation operations using single compiler\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 this.#mutationPhaseDeferred.resolve();\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 // Resolve the mutation phase promise to unblock waiting service methods\n this.#mutationPhaseDeferred.resolve();\n\n return {\n success: result.success,\n };\n } catch (error) {\n this.#mutationError = error instanceof Error ? error : new Error(String(error));\n throw error;\n }\n }\n\n /**\n * Get the retrieval operations (for inspection/debugging)\n */\n getRetrievalOperations(): ReadonlyArray<RetrievalOperation<AnySchema>> {\n return this.#retrievalOps;\n }\n\n /**\n * Get the mutation operations (for inspection/debugging)\n */\n getMutationOperations(): ReadonlyArray<MutationOperation<AnySchema>> {\n return this.#mutationOps;\n }\n\n /**\n * @internal\n * Add a retrieval operation (used by TypedUnitOfWork)\n */\n addRetrievalOperation(op: RetrievalOperation<AnySchema>): number {\n if (this.#state !== \"building-retrieval\") {\n throw new Error(\n `Cannot add retrieval operation in state ${this.#state}. Must be in building-retrieval state.`,\n );\n }\n this.#retrievalOps.push(op);\n return this.#retrievalOps.length - 1;\n }\n\n /**\n * @internal\n * Add a mutation operation (used by TypedUnitOfWork)\n */\n addMutationOperation(op: MutationOperation<AnySchema>): void {\n if (this.#state === \"executed\") {\n throw new Error(`Cannot add mutation operation in executed state.`);\n }\n this.#mutationOps.push(op);\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<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\n/**\n * A typed facade around a UnitOfWork that provides type-safe operations for a specific schema.\n * All operations are stored in the underlying UOW, but this facade ensures type safety and\n * filters retrieval results to only include operations added through this facade.\n */\nexport class TypedUnitOfWork<\n const TSchema extends AnySchema,\n const TRetrievalResults extends unknown[] = [],\n const TRawInput = unknown,\n const THooks extends HooksMap = {},\n> implements IUnitOfWork\n{\n #schema: TSchema;\n #namespace?: string;\n #uow: UnitOfWork<TRawInput>;\n #operationIndices: number[] = [];\n #cachedRetrievalPhase?: Promise<TRetrievalResults>;\n\n constructor(schema: TSchema, namespace: string | undefined, uow: UnitOfWork<TRawInput>) {\n this.#schema = schema;\n this.#namespace = namespace;\n this.#uow = uow;\n }\n\n get $results(): Prettify<TRetrievalResults> {\n throw new Error(\"type only\");\n }\n\n get schema(): TSchema {\n return this.#schema;\n }\n\n get name(): string | undefined {\n return this.#uow.name;\n }\n\n get nonce(): string {\n return this.#uow.nonce;\n }\n\n get state() {\n return this.#uow.state;\n }\n\n get retrievalPhase(): Promise<TRetrievalResults> {\n // Cache the filtered promise to avoid recreating it on every access\n if (!this.#cachedRetrievalPhase) {\n this.#cachedRetrievalPhase = this.#uow.retrievalPhase.then((allResults) => {\n const allOperations = this.#uow.getRetrievalOperations();\n const filteredResults = this.#operationIndices.map((opIndex) => {\n const result = allResults[opIndex];\n const operation = allOperations[opIndex];\n // Transform array to single item for findFirst operations\n if (operation?.type === \"find\" && operation.withSingleResult) {\n return Array.isArray(result) ? (result[0] ?? null) : result;\n }\n return result;\n });\n return filteredResults as TRetrievalResults;\n });\n }\n return this.#cachedRetrievalPhase;\n }\n\n get mutationPhase(): Promise<void> {\n return this.#uow.mutationPhase;\n }\n\n getRetrievalOperations() {\n return this.#uow.getRetrievalOperations();\n }\n\n getMutationOperations() {\n return this.#uow.getMutationOperations();\n }\n\n getCreatedIds() {\n return this.#uow.getCreatedIds();\n }\n\n async executeRetrieve(): Promise<TRetrievalResults> {\n return this.#uow.executeRetrieve() as Promise<TRetrievalResults>;\n }\n\n async executeMutations(): Promise<{ success: boolean }> {\n return this.#uow.executeMutations();\n }\n\n restrict(): IUnitOfWork {\n return this.#uow.restrict();\n }\n\n reset(): void {\n return this.#uow.reset();\n }\n\n forSchema<TOtherSchema extends AnySchema, TOtherHooks extends HooksMap = {}>(\n schema: TOtherSchema,\n hooks?: TOtherHooks,\n ): TypedUnitOfWork<TOtherSchema, [], TRawInput, TOtherHooks> {\n return this.#uow.forSchema<TOtherSchema, TOtherHooks>(schema, hooks);\n }\n\n registerSchema(schema: AnySchema, namespace: string): void {\n this.#uow.registerSchema(schema, namespace);\n }\n\n compile<TOutput>(compiler: UOWCompiler<TOutput>): {\n name?: string;\n retrievalBatch: TOutput[];\n mutationBatch: CompiledMutation<TOutput>[];\n } {\n return this.#uow.compile(compiler);\n }\n\n find<TTableName extends keyof TSchema[\"tables\"] & string, const TBuilderResult>(\n tableName: TTableName,\n builderFn: (\n builder: Omit<FindBuilder<TSchema[\"tables\"][TTableName]>, \"build\">,\n ) => TBuilderResult,\n ): TypedUnitOfWork<\n TSchema,\n [\n ...TRetrievalResults,\n SelectResult<\n TSchema[\"tables\"][TTableName],\n ExtractJoinOut<TBuilderResult>,\n Extract<ExtractSelect<TBuilderResult>, SelectClause<TSchema[\"tables\"][TTableName]>>\n >[],\n ],\n TRawInput,\n THooks\n >;\n find<TTableName extends keyof TSchema[\"tables\"] & string>(\n tableName: TTableName,\n ): TypedUnitOfWork<\n TSchema,\n [...TRetrievalResults, SelectResult<TSchema[\"tables\"][TTableName], {}, true>[]],\n TRawInput,\n THooks\n >;\n find<TTableName extends keyof TSchema[\"tables\"] & string, const TBuilderResult>(\n tableName: TTableName,\n builderFn?: (\n builder: Omit<FindBuilder<TSchema[\"tables\"][TTableName]>, \"build\">,\n ) => TBuilderResult,\n ): TypedUnitOfWork<\n TSchema,\n [\n ...TRetrievalResults,\n SelectResult<\n TSchema[\"tables\"][TTableName],\n ExtractJoinOut<TBuilderResult>,\n Extract<ExtractSelect<TBuilderResult>, SelectClause<TSchema[\"tables\"][TTableName]>>\n >[],\n ],\n TRawInput,\n THooks\n > {\n const table = this.#schema.tables[tableName];\n if (!table) {\n throw new Error(`Table ${tableName} not found in schema`);\n }\n\n const builder = new FindBuilder(tableName, table as TSchema[\"tables\"][TTableName]);\n if (builderFn) {\n builderFn(builder);\n } else {\n builder.whereIndex(\"primary\");\n }\n const { indexName, options, type } = builder.build();\n\n const operationIndex = this.#uow.addRetrievalOperation({\n type,\n schema: this.#schema,\n namespace: this.#namespace,\n table: table as TSchema[\"tables\"][TTableName],\n indexName,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n options: options as any,\n });\n\n // Track which operation index belongs to this view\n this.#operationIndices.push(operationIndex);\n\n // Safe: return type is correctly specified in the method signature\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return this as any;\n }\n\n findFirst<TTableName extends keyof TSchema[\"tables\"] & string, const TBuilderResult>(\n tableName: TTableName,\n builderFn: (\n builder: Omit<FindBuilder<TSchema[\"tables\"][TTableName]>, \"build\">,\n ) => TBuilderResult,\n ): TypedUnitOfWork<\n TSchema,\n [\n ...TRetrievalResults,\n SelectResult<\n TSchema[\"tables\"][TTableName],\n ExtractJoinOut<TBuilderResult>,\n Extract<ExtractSelect<TBuilderResult>, SelectClause<TSchema[\"tables\"][TTableName]>>\n > | null,\n ],\n TRawInput,\n THooks\n >;\n findFirst<TTableName extends keyof TSchema[\"tables\"] & string>(\n tableName: TTableName,\n ): TypedUnitOfWork<\n TSchema,\n [...TRetrievalResults, SelectResult<TSchema[\"tables\"][TTableName], {}, true> | null],\n TRawInput,\n THooks\n >;\n findFirst<TTableName extends keyof TSchema[\"tables\"] & string, const TBuilderResult>(\n tableName: TTableName,\n builderFn?: (\n builder: Omit<FindBuilder<TSchema[\"tables\"][TTableName]>, \"build\">,\n ) => TBuilderResult,\n ): TypedUnitOfWork<\n TSchema,\n [\n ...TRetrievalResults,\n SelectResult<\n TSchema[\"tables\"][TTableName],\n ExtractJoinOut<TBuilderResult>,\n Extract<ExtractSelect<TBuilderResult>, SelectClause<TSchema[\"tables\"][TTableName]>>\n > | null,\n ],\n TRawInput,\n THooks\n > {\n const table = this.#schema.tables[tableName];\n if (!table) {\n throw new Error(`Table ${tableName} not found in schema`);\n }\n\n const builder = new FindBuilder(tableName, table as TSchema[\"tables\"][TTableName]);\n if (builderFn) {\n builderFn(builder);\n } else {\n builder.whereIndex(\"primary\");\n }\n // Automatically set pageSize to 1 for findFirst\n builder.pageSize(1);\n const { indexName, options, type } = builder.build();\n\n const operationIndex = this.#uow.addRetrievalOperation({\n type,\n schema: this.#schema,\n namespace: this.#namespace,\n table: table as TSchema[\"tables\"][TTableName],\n indexName,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n options: options as any,\n withSingleResult: true,\n });\n\n // Track which operation index belongs to this view\n this.#operationIndices.push(operationIndex);\n\n // Safe: return type is correctly specified in the method signature\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return this as any;\n }\n\n findWithCursor<TTableName extends keyof TSchema[\"tables\"] & string, const TBuilderResult>(\n tableName: TTableName,\n builderFn: (\n builder: Omit<FindBuilder<TSchema[\"tables\"][TTableName]>, \"build\">,\n ) => TBuilderResult,\n ): TypedUnitOfWork<\n TSchema,\n [\n ...TRetrievalResults,\n CursorResult<\n SelectResult<\n TSchema[\"tables\"][TTableName],\n ExtractJoinOut<TBuilderResult>,\n Extract<ExtractSelect<TBuilderResult>, SelectClause<TSchema[\"tables\"][TTableName]>>\n >\n >,\n ],\n TRawInput,\n THooks\n > {\n const table = this.#schema.tables[tableName];\n if (!table) {\n throw new Error(`Table ${tableName} not found in schema`);\n }\n\n const builder = new FindBuilder(tableName, table as TSchema[\"tables\"][TTableName]);\n builderFn(builder);\n const { indexName, options, type } = builder.build();\n\n const operationIndex = this.#uow.addRetrievalOperation({\n type,\n schema: this.#schema,\n namespace: this.#namespace,\n table: table as TSchema[\"tables\"][TTableName],\n indexName,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n options: options as any,\n withCursor: true,\n });\n\n // Track which operation index belongs to this view\n this.#operationIndices.push(operationIndex);\n\n // Safe: return type is correctly specified in the method signature\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return this as any;\n }\n\n create<TableName extends keyof TSchema[\"tables\"] & string>(\n tableName: TableName,\n values: TableToInsertValues<TSchema[\"tables\"][TableName]>,\n ): FragnoId {\n const tableSchema = this.#schema.tables[tableName];\n if (!tableSchema) {\n throw new Error(`Table ${tableName} 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.#uow.addMutationOperation({\n type: \"create\",\n schema: this.#schema,\n namespace: this.#namespace,\n table: tableName,\n values: updatedValues,\n generatedExternalId: externalId,\n });\n\n return FragnoId.fromExternal(externalId, 0);\n }\n\n update<TableName extends keyof TSchema[\"tables\"] & string>(\n tableName: TableName,\n id: FragnoId | string,\n builderFn: (\n builder: Omit<UpdateBuilder<TSchema[\"tables\"][TableName]>, \"build\">,\n ) => Omit<UpdateBuilder<TSchema[\"tables\"][TableName]>, \"build\"> | void,\n ): void {\n const builder = new UpdateBuilder<TSchema[\"tables\"][TableName]>(tableName, id);\n builderFn(builder);\n const { id: opId, checkVersion, set } = builder.build();\n\n this.#uow.addMutationOperation({\n type: \"update\",\n schema: this.#schema,\n namespace: this.#namespace,\n table: tableName,\n id: opId,\n checkVersion,\n set,\n });\n }\n\n delete<TableName extends keyof TSchema[\"tables\"] & string>(\n tableName: TableName,\n id: FragnoId | string,\n builderFn?: (builder: Omit<DeleteBuilder, \"build\">) => Omit<DeleteBuilder, \"build\"> | void,\n ): void {\n const builder = new DeleteBuilder(tableName, id);\n builderFn?.(builder);\n const { id: opId, checkVersion } = builder.build();\n\n this.#uow.addMutationOperation({\n type: \"delete\",\n schema: this.#schema,\n namespace: this.#namespace,\n table: tableName,\n id: opId,\n checkVersion,\n });\n }\n\n /**\n * Check that a record's version hasn't changed since retrieval.\n * This is useful for ensuring related records remain unchanged during a transaction.\n *\n * @param tableName - The table name\n * @param id - The FragnoId with version information (string IDs are not allowed)\n * @throws Error if the ID is a string without version information\n *\n * @example\n * ```ts\n * // Ensure both accounts haven't changed before creating a transfer\n * uow.check(\"accounts\", fromAccount.id);\n * uow.check(\"accounts\", toAccount.id);\n * uow.create(\"transactions\", { fromAccountId, toAccountId, amount });\n * ```\n */\n check<TableName extends keyof TSchema[\"tables\"] & string>(\n tableName: TableName,\n id: FragnoId,\n ): void {\n this.#uow.addMutationOperation({\n type: \"check\",\n schema: this.#schema,\n namespace: this.#namespace,\n table: tableName,\n id,\n });\n }\n\n get $hooks(): THooks {\n throw new Error(\"type only\");\n }\n\n /**\n * Trigger a hook to be executed after the transaction commits.\n */\n triggerHook<K extends keyof THooks & string>(\n hookName: K,\n payload: HookPayload<THooks[K]>,\n options?: TriggerHookOptions,\n ): void {\n this.#uow.triggerHook(hookName, payload, options);\n }\n\n getTriggeredHooks(): ReadonlyArray<TriggeredHook> {\n return this.#uow.getTriggeredHooks();\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","#promise","#resolve","#reject","#expectedCount","#signalCount","#isRestricted","#parent","#children","#retrievalTracker","#mutationTracker","#parentCoordinator","#compiler","#executor","#decoder","#schemaNamespaceMap","#name","#config","#idempotencyKey","#coordinator","#retrievalOps","#mutationOps","#retrievalResults","#createdInternalIds","#retrievalPhaseDeferred","#mutationPhaseDeferred","#retrievalError","#mutationError","#triggeredHooks","#state","emptyResults: unknown[]","retrievalBatch: unknown[]","mutationBatch: CompiledMutation<unknown>[]","createdIds: FragnoId[]","retrievalBatch: TOutput[]","mutationBatch: CompiledMutation<TOutput>[]","#schema","#namespace","#uow","#cachedRetrievalPhase","#operationIndices","externalId: string"],"sources":["../../../src/query/unit-of-work/unit-of-work.ts"],"sourcesContent":["import type {\n AnySchema,\n AnyTable,\n Index,\n IdColumn,\n AnyColumn,\n Relation,\n} from \"../../schema/create\";\nimport { FragnoId } from \"../../schema/create\";\nimport { generateId } from \"../../schema/generate-id\";\nimport type { Condition, ConditionBuilder } from \"../condition-builder\";\nimport type {\n SelectClause,\n TableToInsertValues,\n TableToUpdateValues,\n SelectResult,\n ExtractSelect,\n ExtractJoinOut,\n} from \"../simple-query-interface\";\nimport { buildCondition } from \"../condition-builder\";\nimport type { CompiledJoin } from \"../orm/orm\";\nimport type { CursorResult } from \"../cursor\";\nimport { Cursor } from \"../cursor\";\nimport type { Prettify } from \"../../util/types\";\nimport type { TriggeredHook, TriggerHookOptions, HooksMap, HookPayload } from \"../../hooks/hooks\";\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 schema: TSchema;\n namespace?: string;\n table: TTable;\n indexName: string;\n options: FindOptions<TTable, SelectClause<TTable>>;\n withCursor?: boolean;\n withSingleResult?: boolean;\n }\n | {\n type: \"count\";\n schema: TSchema;\n namespace?: string;\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 schema: TSchema;\n namespace?: string;\n table: TTable[\"name\"];\n id: FragnoId | string;\n checkVersion: boolean;\n set: TableToUpdateValues<TTable>;\n }\n | {\n type: \"create\";\n schema: TSchema;\n namespace?: string;\n table: TTable[\"name\"];\n values: TableToInsertValues<TTable>;\n generatedExternalId: string;\n }\n | {\n type: \"delete\";\n schema: TSchema;\n namespace?: string;\n table: TTable[\"name\"];\n id: FragnoId | string;\n checkVersion: boolean;\n }\n | {\n type: \"check\";\n schema: TSchema;\n namespace?: string;\n table: TTable[\"name\"];\n id: FragnoId;\n };\n\n/**\n * Compiled mutation with metadata for execution\n */\nexport interface CompiledMutation<TOutput> {\n query: TOutput;\n /**\n * The type of mutation operation (create, update, delete, or check).\n */\n op: \"create\" | \"update\" | \"delete\" | \"check\";\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: bigint | null;\n /**\n * Number of rows this SELECT query must return for the transaction to succeed.\n * Used for check operations to verify version without modifying data.\n * null means this is not a SELECT query that needs row count validation.\n */\n expectedReturnedRows: number | null;\n}\n\n/**\n * Compiler interface for Unit of Work operations\n */\nexport interface UOWCompiler<TOutput> {\n /**\n * Compile a retrieval operation to the adapter's query format\n */\n compileRetrievalOperation(op: RetrievalOperation<AnySchema>): TOutput | null;\n\n /**\n * Compile a mutation operation to the adapter's query format\n */\n compileMutationOperation(op: MutationOperation<AnySchema>): 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 executeRetrievalPhase(retrievalBatch: TOutput[]): Promise<TRawResult[]>;\n\n /**\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<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 decode(rawResults: TRawInput[], operations: RetrievalOperation<AnySchema>[]): 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 * @throws {RangeError} If size is not a positive integer\n */\n pageSize(size: number): this {\n if (!Number.isInteger(size) || size <= 0) {\n throw new RangeError(`pageSize must be a positive integer, received: ${size}`);\n }\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 * @throws {RangeError} If size is not a positive integer\n */\n pageSize(size: number): this {\n if (!Number.isInteger(size) || size <= 0) {\n throw new RangeError(`pageSize must be a positive integer, received: ${size}`);\n }\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\n/**\n * Full Unit of Work interface with all operations including execution.\n * This allows UOW instances to be passed between different contexts that use different schemas.\n */\nexport interface IUnitOfWork {\n // Getters (schema-agnostic)\n readonly state: UOWState;\n readonly name: string | undefined;\n readonly idempotencyKey: string;\n readonly retrievalPhase: Promise<unknown[]>;\n readonly mutationPhase: Promise<void>;\n\n // Execution (schema-agnostic)\n executeRetrieve(): Promise<unknown[]>;\n executeMutations(): Promise<{ success: boolean }>;\n\n // Inspection (schema-agnostic)\n getRetrievalOperations(): ReadonlyArray<RetrievalOperation<AnySchema>>;\n getMutationOperations(): ReadonlyArray<MutationOperation<AnySchema>>;\n getCreatedIds(): FragnoId[];\n\n // Parent-child relationships\n restrict(options?: { readyFor?: \"mutation\" | \"retrieval\" | \"none\" }): IUnitOfWork;\n\n // Coordination for restricted UOWs\n signalReadyForRetrieval(): void;\n signalReadyForMutation(): void;\n\n // Reset for retry support\n reset(): void;\n\n // Schema-specific view (for cross-schema operations)\n // The optional hooks parameter is for type inference only - pass your hooks map\n // to get proper typing for triggerHook. The value is not used at runtime.\n forSchema<TOtherSchema extends AnySchema, TOtherHooks extends HooksMap = {}>(\n schema: TOtherSchema,\n hooks?: TOtherHooks,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ): TypedUnitOfWork<TOtherSchema, [], any, TOtherHooks>;\n\n // Schema registration (for cross-fragment operations like hooks)\n registerSchema(schema: AnySchema, namespace: string): void;\n\n // Hook triggering (schema-agnostic, string-based hook names)\n triggerHook(hookName: string, payload: unknown, options?: TriggerHookOptions): void;\n\n getTriggeredHooks(): readonly TriggeredHook[];\n}\n\n/**\n * Restricted UOW interface without execute methods.\n * Useful when you want to allow building operations but not executing them,\n * to prevent deadlocks or enforce execution control at a higher level.\n *\n * Note: This is just a marker interface. Restriction is enforced by the UnitOfWork class itself.\n */\nexport interface IUnitOfWorkRestricted\n extends Omit<IUnitOfWork, \"executeRetrieve\" | \"executeMutations\"> {}\n\nexport function createUnitOfWork(\n compiler: UOWCompiler<unknown>,\n executor: UOWExecutor<unknown, unknown>,\n decoder: UOWDecoder<unknown>,\n schemaNamespaceMap?: WeakMap<AnySchema, string>,\n name?: string,\n): UnitOfWork {\n return new UnitOfWork(compiler, executor, decoder, name, undefined, schemaNamespaceMap);\n}\n\nexport interface UnitOfWorkConfig {\n dryRun?: boolean;\n onQuery?: (query: unknown) => void;\n idempotencyKey?: string;\n}\n\n/**\n * Encapsulates a promise with its resolver/rejecter functions.\n * Simplifies management of deferred promises with built-in error handling.\n */\nclass DeferredPromise<T> {\n #resolve?: (value: T) => void;\n #reject?: (error: Error) => void;\n #promise: Promise<T>;\n\n constructor() {\n const { promise, resolve, reject } = Promise.withResolvers<T>();\n this.#promise = promise;\n this.#resolve = resolve;\n this.#reject = reject;\n // Attach no-op error handler to prevent unhandled rejection warnings\n this.#promise.catch(() => {});\n }\n\n get promise(): Promise<T> {\n return this.#promise;\n }\n\n resolve(value: T): void {\n this.#resolve?.(value);\n }\n\n reject(error: Error): void {\n this.#reject?.(error);\n }\n\n /**\n * Reset to a new promise\n */\n reset(): void {\n const { promise, resolve, reject } = Promise.withResolvers<T>();\n this.#promise = promise;\n this.#resolve = resolve;\n this.#reject = reject;\n // Attach no-op error handler to prevent unhandled rejection warnings\n this.#promise.catch(() => {});\n }\n}\n\n/**\n * Tracks readiness signals from a group of children.\n * Maintains a promise that resolves when all registered children have signaled.\n */\nclass ReadinessTracker {\n #expectedCount = 0;\n #signalCount = 0;\n #resolve?: () => void;\n #promise: Promise<void> = Promise.resolve();\n\n get promise(): Promise<void> {\n return this.#promise;\n }\n\n /**\n * Register that we're expecting a signal from a child\n */\n registerChild(): void {\n if (this.#expectedCount === 0) {\n // First child - create new promise\n const { promise, resolve } = Promise.withResolvers<void>();\n this.#promise = promise;\n this.#resolve = resolve;\n }\n this.#expectedCount++;\n }\n\n /**\n * Signal that one child is ready\n */\n signal(): void {\n this.#signalCount++;\n if (this.#signalCount >= this.#expectedCount && this.#resolve) {\n this.#resolve();\n }\n }\n\n /**\n * Reset to initial state\n */\n reset(): void {\n this.#expectedCount = 0;\n this.#signalCount = 0;\n this.#resolve = undefined;\n this.#promise = Promise.resolve();\n }\n}\n\n/**\n * Manages parent-child relationships and readiness coordination for Unit of Work instances.\n * This allows parent UOWs to wait for all child UOWs to signal readiness before executing phases.\n */\nclass UOWChildCoordinator<TRawInput> {\n #parent: UnitOfWork<TRawInput> | null = null;\n #parentCoordinator: UOWChildCoordinator<TRawInput> | null = null;\n #children: Set<UnitOfWork<TRawInput>> = new Set();\n #isRestricted = false;\n\n #retrievalTracker = new ReadinessTracker();\n #mutationTracker = new ReadinessTracker();\n\n get isRestricted(): boolean {\n return this.#isRestricted;\n }\n\n get parent(): UnitOfWork<TRawInput> | null {\n return this.#parent;\n }\n\n get children(): ReadonlySet<UnitOfWork<TRawInput>> {\n return this.#children;\n }\n\n get retrievalReadinessPromise(): Promise<void> {\n return this.#retrievalTracker.promise;\n }\n\n get mutationReadinessPromise(): Promise<void> {\n return this.#mutationTracker.promise;\n }\n\n /**\n * Mark this UOW as a restricted child of the given parent\n */\n setAsRestricted(\n parent: UnitOfWork<TRawInput>,\n parentCoordinator: UOWChildCoordinator<TRawInput>,\n ): void {\n this.#parent = parent;\n this.#parentCoordinator = parentCoordinator;\n this.#isRestricted = true;\n }\n\n /**\n * Register a child UOW\n */\n addChild(child: UnitOfWork<TRawInput>): void {\n this.#children.add(child);\n this.#retrievalTracker.registerChild();\n this.#mutationTracker.registerChild();\n }\n\n /**\n * Signal that this child is ready for retrieval phase execution.\n * Only valid for restricted (child) UOWs.\n */\n signalReadyForRetrieval(): void {\n if (!this.#parentCoordinator) {\n throw new Error(\"signalReadyForRetrieval() can only be called on restricted child UOWs\");\n }\n\n this.#parentCoordinator.notifyChildReadyForRetrieval();\n }\n\n /**\n * Signal that this child is ready for mutation phase execution.\n * Only valid for restricted (child) UOWs.\n */\n signalReadyForMutation(): void {\n if (!this.#parentCoordinator) {\n throw new Error(\"signalReadyForMutation() can only be called on restricted child UOWs\");\n }\n\n this.#parentCoordinator.notifyChildReadyForMutation();\n }\n\n /**\n * Notify this coordinator that a child is ready for retrieval (internal use).\n * Called by child UOWs when they signal readiness.\n */\n notifyChildReadyForRetrieval(): void {\n this.#retrievalTracker.signal();\n }\n\n /**\n * Notify this coordinator that a child is ready for mutation (internal use).\n * Called by child UOWs when they signal readiness.\n */\n notifyChildReadyForMutation(): void {\n this.#mutationTracker.signal();\n }\n\n /**\n * Reset coordination state for retry support\n */\n reset(): void {\n this.#children.clear();\n this.#retrievalTracker.reset();\n this.#mutationTracker.reset();\n }\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 * This is the untyped base storage. Use TypedUnitOfWork for type-safe operations.\n *\n * @example\n * ```ts\n * const uow = queryEngine.createUnitOfWork(\"update-user-balance\");\n * const typedUow = uow.forSchema(mySchema);\n *\n * // Retrieval phase\n * typedUow.find(\"users\", (b) => b.whereIndex(\"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 * typedUow.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<const TRawInput = unknown> implements IUnitOfWork {\n #name?: string;\n #config?: UnitOfWorkConfig;\n #idempotencyKey: string;\n\n #state: UOWState = \"building-retrieval\";\n\n // Operations can come from any schema\n #retrievalOps: RetrievalOperation<AnySchema>[] = [];\n #mutationOps: MutationOperation<AnySchema>[] = [];\n\n #compiler: UOWCompiler<unknown>;\n #executor: UOWExecutor<unknown, TRawInput>;\n #decoder: UOWDecoder<TRawInput>;\n #schemaNamespaceMap: WeakMap<AnySchema, string>;\n\n #retrievalResults?: unknown[];\n #createdInternalIds: (bigint | null)[] = [];\n\n // Phase coordination promises\n #retrievalPhaseDeferred = new DeferredPromise<unknown[]>();\n #mutationPhaseDeferred = new DeferredPromise<void>();\n\n // Error tracking\n #retrievalError: Error | null = null;\n #mutationError: Error | null = null;\n\n // Child coordination\n #coordinator: UOWChildCoordinator<TRawInput> = new UOWChildCoordinator();\n\n // Hook triggers\n #triggeredHooks: TriggeredHook[] = [];\n\n constructor(\n compiler: UOWCompiler<unknown>,\n executor: UOWExecutor<unknown, TRawInput>,\n decoder: UOWDecoder<TRawInput>,\n name?: string,\n config?: UnitOfWorkConfig,\n schemaNamespaceMap?: WeakMap<AnySchema, string>,\n ) {\n this.#compiler = compiler;\n this.#executor = executor;\n this.#decoder = decoder;\n this.#schemaNamespaceMap = schemaNamespaceMap ?? new WeakMap();\n this.#name = name;\n this.#config = config;\n this.#idempotencyKey = config?.idempotencyKey ?? crypto.randomUUID();\n }\n\n /**\n * Register a schema with its namespace for cross-fragment operations.\n * This is used for internal fragments like hooks that need to create\n * records in a different schema during the same transaction.\n */\n registerSchema(schema: AnySchema, namespace: string): void {\n this.#schemaNamespaceMap.set(schema, namespace);\n }\n\n /**\n * Get a schema-specific typed view of this UOW for type-safe operations.\n * Returns a wrapper that provides typed operations for the given schema.\n * The namespace is automatically resolved from the schema-namespace map.\n * The optional hooks parameter is for type inference only - pass your hooks map\n * to get proper typing for triggerHook. The value is not used at runtime.\n */\n forSchema<TOtherSchema extends AnySchema, TOtherHooks extends HooksMap = {}>(\n schema: TOtherSchema,\n _hooks?: TOtherHooks,\n ): TypedUnitOfWork<TOtherSchema, [], TRawInput, TOtherHooks> {\n const resolvedNamespace = this.#schemaNamespaceMap.get(schema);\n\n return new TypedUnitOfWork<TOtherSchema, [], TRawInput, TOtherHooks>(\n schema,\n resolvedNamespace,\n this,\n );\n }\n\n /**\n * Create a restricted child UOW that cannot execute phases.\n * The child shares the same operation storage but must signal readiness\n * before the parent can execute each phase.\n *\n * @param options.readyFor - Controls automatic readiness signaling:\n * - \"mutation\" (default): Signals ready for both retrieval and mutation immediately\n * - \"retrieval\": Signals ready for retrieval only\n * - \"none\": No automatic signaling, caller must signal manually\n */\n restrict(options?: { readyFor?: \"mutation\" | \"retrieval\" | \"none\" }): UnitOfWork<TRawInput> {\n const readyFor = options?.readyFor ?? \"mutation\";\n\n const child = new UnitOfWork(\n this.#compiler,\n this.#executor,\n this.#decoder,\n this.#name,\n { ...this.#config, idempotencyKey: this.#idempotencyKey },\n this.#schemaNamespaceMap,\n );\n child.#coordinator.setAsRestricted(this, this.#coordinator);\n\n child.#retrievalOps = this.#retrievalOps;\n child.#mutationOps = this.#mutationOps;\n child.#retrievalResults = this.#retrievalResults;\n child.#createdInternalIds = this.#createdInternalIds;\n child.#retrievalPhaseDeferred = this.#retrievalPhaseDeferred;\n child.#mutationPhaseDeferred = this.#mutationPhaseDeferred;\n child.#retrievalError = this.#retrievalError;\n child.#mutationError = this.#mutationError;\n child.#triggeredHooks = this.#triggeredHooks;\n\n this.#coordinator.addChild(child);\n\n // Signal readiness based on options\n if (readyFor === \"mutation\" || readyFor === \"retrieval\") {\n child.signalReadyForRetrieval();\n }\n if (readyFor === \"mutation\") {\n child.signalReadyForMutation();\n }\n\n return child;\n }\n\n /**\n * Signal that this child is ready for retrieval phase execution.\n * Only valid for restricted (child) UOWs.\n */\n signalReadyForRetrieval(): void {\n this.#coordinator.signalReadyForRetrieval();\n }\n\n /**\n * Signal that this child is ready for mutation phase execution.\n * Only valid for restricted (child) UOWs.\n */\n signalReadyForMutation(): void {\n this.#coordinator.signalReadyForMutation();\n }\n\n /**\n * Reset the UOW to initial state for retry support.\n * Clears operations, resets state, and resets phase promises.\n */\n reset(): void {\n if (this.#coordinator.isRestricted) {\n throw new Error(\"reset() cannot be called on restricted child UOWs\");\n }\n\n // Clear operations\n this.#retrievalOps = [];\n this.#mutationOps = [];\n this.#retrievalResults = undefined;\n this.#createdInternalIds = [];\n\n // Reset state\n this.#state = \"building-retrieval\";\n this.#retrievalError = null;\n this.#mutationError = null;\n\n // Reset phase promises\n this.#retrievalPhaseDeferred.reset();\n this.#mutationPhaseDeferred.reset();\n\n // Reset child coordination\n this.#coordinator.reset();\n\n // Reset hooks\n this.#triggeredHooks = [];\n }\n\n /**\n * Trigger a hook to be executed after the transaction commits.\n */\n triggerHook(hookName: string, payload: unknown, options?: TriggerHookOptions): void {\n this.#triggeredHooks.push({\n hookName,\n payload,\n options,\n });\n }\n\n /**\n * Get all triggered hooks for this UOW.\n */\n getTriggeredHooks(): ReadonlyArray<TriggeredHook> {\n return this.#triggeredHooks;\n }\n\n get state(): UOWState {\n return this.#coordinator.parent?.state ?? this.#state;\n }\n\n get name(): string | undefined {\n return this.#name;\n }\n\n get idempotencyKey(): string {\n return this.#idempotencyKey;\n }\n\n /**\n * Promise that resolves when the retrieval phase is executed\n * Service methods can await this to coordinate multi-phase logic\n */\n get retrievalPhase(): Promise<unknown[]> {\n return this.#retrievalPhaseDeferred.promise;\n }\n\n /**\n * Promise that resolves when the mutation phase is executed\n * Service methods can await this to coordinate multi-phase logic\n */\n get mutationPhase(): Promise<void> {\n return this.#mutationPhaseDeferred.promise;\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<unknown[]> {\n if (this.#coordinator.isRestricted) {\n throw new Error(\"executeRetrieve() cannot be called on restricted child UOWs\");\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 try {\n // Wait for all children to signal readiness\n await this.#coordinator.retrievalReadinessPromise;\n\n if (this.#retrievalOps.length === 0) {\n this.#state = \"building-mutation\";\n const emptyResults: unknown[] = [];\n this.#retrievalPhaseDeferred.resolve(emptyResults);\n return emptyResults;\n }\n\n // Compile retrieval operations using single compiler\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 retrievalBatch.push(compiled);\n }\n }\n\n if (this.#config?.dryRun) {\n this.#state = \"executed\";\n const emptyResults: unknown[] = [];\n this.#retrievalPhaseDeferred.resolve(emptyResults);\n return emptyResults;\n }\n\n const rawResults = await this.#executor.executeRetrievalPhase(retrievalBatch);\n\n const results = this.#decoder.decode(rawResults, this.#retrievalOps);\n\n // Store results and transition to mutation phase\n this.#retrievalResults = results;\n this.#state = \"building-mutation\";\n\n this.#retrievalPhaseDeferred.resolve(this.#retrievalResults);\n\n return this.#retrievalResults;\n } catch (error) {\n this.#retrievalError = error instanceof Error ? error : new Error(String(error));\n throw error;\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.#coordinator.isRestricted) {\n throw new Error(\"executeMutations() cannot be called on restricted child UOWs\");\n }\n\n if (this.#state === \"executed\") {\n throw new Error(`Cannot execute mutations from state ${this.#state}.`);\n }\n\n try {\n // Wait for all children to signal readiness\n await this.#coordinator.mutationReadinessPromise;\n\n // Compile mutation operations using single compiler\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 this.#mutationPhaseDeferred.resolve();\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 // Mutate array in-place to preserve shared references with child UOWs\n this.#createdInternalIds.length = 0;\n this.#createdInternalIds.push(...result.createdInternalIds);\n }\n\n // Resolve the mutation phase promise to unblock waiting service methods\n this.#mutationPhaseDeferred.resolve();\n\n return {\n success: result.success,\n };\n } catch (error) {\n this.#mutationError = error instanceof Error ? error : new Error(String(error));\n throw error;\n }\n }\n\n /**\n * Get the retrieval operations (for inspection/debugging)\n */\n getRetrievalOperations(): ReadonlyArray<RetrievalOperation<AnySchema>> {\n return this.#retrievalOps;\n }\n\n /**\n * Get the mutation operations (for inspection/debugging)\n */\n getMutationOperations(): ReadonlyArray<MutationOperation<AnySchema>> {\n return this.#mutationOps;\n }\n\n /**\n * @internal\n * Add a retrieval operation (used by TypedUnitOfWork)\n */\n addRetrievalOperation(op: RetrievalOperation<AnySchema>): number {\n if (this.state !== \"building-retrieval\") {\n throw new Error(\n `Cannot add retrieval operation in state ${this.state}. Must be in building-retrieval state.`,\n );\n }\n this.#retrievalOps.push(op);\n return this.#retrievalOps.length - 1;\n }\n\n /**\n * @internal\n * Add a mutation operation (used by TypedUnitOfWork)\n */\n addMutationOperation(op: MutationOperation<AnySchema>): void {\n if (this.state === \"executed\") {\n throw new Error(`Cannot add mutation operation in executed state.`);\n }\n this.#mutationOps.push(op);\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<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\n/**\n * A typed facade around a UnitOfWork that provides type-safe operations for a specific schema.\n * All operations are stored in the underlying UOW, but this facade ensures type safety and\n * filters retrieval results to only include operations added through this facade.\n */\nexport class TypedUnitOfWork<\n const TSchema extends AnySchema,\n const TRetrievalResults extends unknown[] = [],\n const TRawInput = unknown,\n const THooks extends HooksMap = {},\n> implements IUnitOfWork\n{\n #schema: TSchema;\n #namespace?: string;\n #uow: UnitOfWork<TRawInput>;\n #operationIndices: number[] = [];\n #cachedRetrievalPhase?: Promise<TRetrievalResults>;\n\n constructor(schema: TSchema, namespace: string | undefined, uow: UnitOfWork<TRawInput>) {\n this.#schema = schema;\n this.#namespace = namespace;\n this.#uow = uow;\n }\n\n get $results(): Prettify<TRetrievalResults> {\n throw new Error(\"type only\");\n }\n\n get schema(): TSchema {\n return this.#schema;\n }\n\n get name(): string | undefined {\n return this.#uow.name;\n }\n\n get idempotencyKey(): string {\n return this.#uow.idempotencyKey;\n }\n\n get state() {\n return this.#uow.state;\n }\n\n get retrievalPhase(): Promise<TRetrievalResults> {\n // Cache the filtered promise to avoid recreating it on every access\n if (!this.#cachedRetrievalPhase) {\n this.#cachedRetrievalPhase = this.#uow.retrievalPhase.then((allResults) => {\n const allOperations = this.#uow.getRetrievalOperations();\n const filteredResults = this.#operationIndices.map((opIndex) => {\n const result = allResults[opIndex];\n const operation = allOperations[opIndex];\n // Transform array to single item for findFirst operations\n if (operation?.type === \"find\" && operation.withSingleResult) {\n return Array.isArray(result) ? (result[0] ?? null) : result;\n }\n return result;\n });\n return filteredResults as TRetrievalResults;\n });\n }\n return this.#cachedRetrievalPhase;\n }\n\n get mutationPhase(): Promise<void> {\n return this.#uow.mutationPhase;\n }\n\n getRetrievalOperations() {\n return this.#uow.getRetrievalOperations();\n }\n\n getMutationOperations() {\n return this.#uow.getMutationOperations();\n }\n\n getCreatedIds() {\n return this.#uow.getCreatedIds();\n }\n\n async executeRetrieve(): Promise<TRetrievalResults> {\n return this.#uow.executeRetrieve() as Promise<TRetrievalResults>;\n }\n\n async executeMutations(): Promise<{ success: boolean }> {\n return this.#uow.executeMutations();\n }\n\n restrict(options?: { readyFor?: \"mutation\" | \"retrieval\" | \"none\" }): IUnitOfWork {\n return this.#uow.restrict(options);\n }\n\n signalReadyForRetrieval(): void {\n this.#uow.signalReadyForRetrieval();\n }\n\n signalReadyForMutation(): void {\n this.#uow.signalReadyForMutation();\n }\n\n reset(): void {\n return this.#uow.reset();\n }\n\n forSchema<TOtherSchema extends AnySchema, TOtherHooks extends HooksMap = {}>(\n schema: TOtherSchema,\n hooks?: TOtherHooks,\n ): TypedUnitOfWork<TOtherSchema, [], TRawInput, TOtherHooks> {\n return this.#uow.forSchema<TOtherSchema, TOtherHooks>(schema, hooks);\n }\n\n registerSchema(schema: AnySchema, namespace: string): void {\n this.#uow.registerSchema(schema, namespace);\n }\n\n compile<TOutput>(compiler: UOWCompiler<TOutput>): {\n name?: string;\n retrievalBatch: TOutput[];\n mutationBatch: CompiledMutation<TOutput>[];\n } {\n return this.#uow.compile(compiler);\n }\n\n find<TTableName extends keyof TSchema[\"tables\"] & string, const TBuilderResult>(\n tableName: TTableName,\n builderFn: (\n builder: Omit<FindBuilder<TSchema[\"tables\"][TTableName]>, \"build\">,\n ) => TBuilderResult,\n ): TypedUnitOfWork<\n TSchema,\n [\n ...TRetrievalResults,\n SelectResult<\n TSchema[\"tables\"][TTableName],\n ExtractJoinOut<TBuilderResult>,\n Extract<ExtractSelect<TBuilderResult>, SelectClause<TSchema[\"tables\"][TTableName]>>\n >[],\n ],\n TRawInput,\n THooks\n >;\n find<TTableName extends keyof TSchema[\"tables\"] & string>(\n tableName: TTableName,\n ): TypedUnitOfWork<\n TSchema,\n [...TRetrievalResults, SelectResult<TSchema[\"tables\"][TTableName], {}, true>[]],\n TRawInput,\n THooks\n >;\n find<TTableName extends keyof TSchema[\"tables\"] & string, const TBuilderResult>(\n tableName: TTableName,\n builderFn?: (\n builder: Omit<FindBuilder<TSchema[\"tables\"][TTableName]>, \"build\">,\n ) => TBuilderResult,\n ): TypedUnitOfWork<\n TSchema,\n [\n ...TRetrievalResults,\n SelectResult<\n TSchema[\"tables\"][TTableName],\n ExtractJoinOut<TBuilderResult>,\n Extract<ExtractSelect<TBuilderResult>, SelectClause<TSchema[\"tables\"][TTableName]>>\n >[],\n ],\n TRawInput,\n THooks\n > {\n const table = this.#schema.tables[tableName];\n if (!table) {\n throw new Error(`Table ${tableName} not found in schema`);\n }\n\n const builder = new FindBuilder(tableName, table as TSchema[\"tables\"][TTableName]);\n if (builderFn) {\n builderFn(builder);\n } else {\n builder.whereIndex(\"primary\");\n }\n const { indexName, options, type } = builder.build();\n\n const operationIndex = this.#uow.addRetrievalOperation({\n type,\n schema: this.#schema,\n namespace: this.#namespace,\n table: table as TSchema[\"tables\"][TTableName],\n indexName,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n options: options as any,\n });\n\n // Track which operation index belongs to this view\n this.#operationIndices.push(operationIndex);\n\n // Safe: return type is correctly specified in the method signature\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return this as any;\n }\n\n findFirst<TTableName extends keyof TSchema[\"tables\"] & string, const TBuilderResult>(\n tableName: TTableName,\n builderFn: (\n builder: Omit<FindBuilder<TSchema[\"tables\"][TTableName]>, \"build\">,\n ) => TBuilderResult,\n ): TypedUnitOfWork<\n TSchema,\n [\n ...TRetrievalResults,\n SelectResult<\n TSchema[\"tables\"][TTableName],\n ExtractJoinOut<TBuilderResult>,\n Extract<ExtractSelect<TBuilderResult>, SelectClause<TSchema[\"tables\"][TTableName]>>\n > | null,\n ],\n TRawInput,\n THooks\n >;\n findFirst<TTableName extends keyof TSchema[\"tables\"] & string>(\n tableName: TTableName,\n ): TypedUnitOfWork<\n TSchema,\n [...TRetrievalResults, SelectResult<TSchema[\"tables\"][TTableName], {}, true> | null],\n TRawInput,\n THooks\n >;\n findFirst<TTableName extends keyof TSchema[\"tables\"] & string, const TBuilderResult>(\n tableName: TTableName,\n builderFn?: (\n builder: Omit<FindBuilder<TSchema[\"tables\"][TTableName]>, \"build\">,\n ) => TBuilderResult,\n ): TypedUnitOfWork<\n TSchema,\n [\n ...TRetrievalResults,\n SelectResult<\n TSchema[\"tables\"][TTableName],\n ExtractJoinOut<TBuilderResult>,\n Extract<ExtractSelect<TBuilderResult>, SelectClause<TSchema[\"tables\"][TTableName]>>\n > | null,\n ],\n TRawInput,\n THooks\n > {\n const table = this.#schema.tables[tableName];\n if (!table) {\n throw new Error(`Table ${tableName} not found in schema`);\n }\n\n const builder = new FindBuilder(tableName, table as TSchema[\"tables\"][TTableName]);\n if (builderFn) {\n builderFn(builder);\n } else {\n builder.whereIndex(\"primary\");\n }\n // Automatically set pageSize to 1 for findFirst\n builder.pageSize(1);\n const { indexName, options, type } = builder.build();\n\n const operationIndex = this.#uow.addRetrievalOperation({\n type,\n schema: this.#schema,\n namespace: this.#namespace,\n table: table as TSchema[\"tables\"][TTableName],\n indexName,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n options: options as any,\n withSingleResult: true,\n });\n\n // Track which operation index belongs to this view\n this.#operationIndices.push(operationIndex);\n\n // Safe: return type is correctly specified in the method signature\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return this as any;\n }\n\n findWithCursor<TTableName extends keyof TSchema[\"tables\"] & string, const TBuilderResult>(\n tableName: TTableName,\n builderFn: (\n builder: Omit<FindBuilder<TSchema[\"tables\"][TTableName]>, \"build\">,\n ) => TBuilderResult,\n ): TypedUnitOfWork<\n TSchema,\n [\n ...TRetrievalResults,\n CursorResult<\n SelectResult<\n TSchema[\"tables\"][TTableName],\n ExtractJoinOut<TBuilderResult>,\n Extract<ExtractSelect<TBuilderResult>, SelectClause<TSchema[\"tables\"][TTableName]>>\n >\n >,\n ],\n TRawInput,\n THooks\n > {\n const table = this.#schema.tables[tableName];\n if (!table) {\n throw new Error(`Table ${tableName} not found in schema`);\n }\n\n const builder = new FindBuilder(tableName, table as TSchema[\"tables\"][TTableName]);\n builderFn(builder);\n const { indexName, options, type } = builder.build();\n\n const operationIndex = this.#uow.addRetrievalOperation({\n type,\n schema: this.#schema,\n namespace: this.#namespace,\n table: table as TSchema[\"tables\"][TTableName],\n indexName,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n options: options as any,\n withCursor: true,\n });\n\n // Track which operation index belongs to this view\n this.#operationIndices.push(operationIndex);\n\n // Safe: return type is correctly specified in the method signature\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return this as any;\n }\n\n /**\n * Generate a new ID for a table without creating a record.\n * This is useful when you need to reference an ID before actually creating the record,\n * or when you need to pass the ID to external services.\n *\n * @example\n * ```ts\n * const userId = uow.generateId(\"users\");\n * // Use userId in related records or pass to external services\n * uow.create(\"users\", { id: userId, name: \"John\" });\n * ```\n */\n generateId<TableName extends keyof TSchema[\"tables\"] & string>(tableName: TableName): FragnoId {\n return generateId(this.#schema, tableName);\n }\n\n create<TableName extends keyof TSchema[\"tables\"] & string>(\n tableName: TableName,\n values: TableToInsertValues<TSchema[\"tables\"][TableName]>,\n ): FragnoId {\n const tableSchema = this.#schema.tables[tableName];\n if (!tableSchema) {\n throw new Error(`Table ${tableName} 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.#uow.addMutationOperation({\n type: \"create\",\n schema: this.#schema,\n namespace: this.#namespace,\n table: tableName,\n values: updatedValues,\n generatedExternalId: externalId,\n });\n\n return FragnoId.fromExternal(externalId, 0);\n }\n\n update<TableName extends keyof TSchema[\"tables\"] & string>(\n tableName: TableName,\n id: FragnoId | string,\n builderFn: (\n builder: Omit<UpdateBuilder<TSchema[\"tables\"][TableName]>, \"build\">,\n ) => Omit<UpdateBuilder<TSchema[\"tables\"][TableName]>, \"build\"> | void,\n ): void {\n const builder = new UpdateBuilder<TSchema[\"tables\"][TableName]>(tableName, id);\n builderFn(builder);\n const { id: opId, checkVersion, set } = builder.build();\n\n this.#uow.addMutationOperation({\n type: \"update\",\n schema: this.#schema,\n namespace: this.#namespace,\n table: tableName,\n id: opId,\n checkVersion,\n set,\n });\n }\n\n delete<TableName extends keyof TSchema[\"tables\"] & string>(\n tableName: TableName,\n id: FragnoId | string,\n builderFn?: (builder: Omit<DeleteBuilder, \"build\">) => Omit<DeleteBuilder, \"build\"> | void,\n ): void {\n const builder = new DeleteBuilder(tableName, id);\n builderFn?.(builder);\n const { id: opId, checkVersion } = builder.build();\n\n this.#uow.addMutationOperation({\n type: \"delete\",\n schema: this.#schema,\n namespace: this.#namespace,\n table: tableName,\n id: opId,\n checkVersion,\n });\n }\n\n /**\n * Check that a record's version hasn't changed since retrieval.\n * This is useful for ensuring related records remain unchanged during a transaction.\n *\n * @param tableName - The table name\n * @param id - The FragnoId with version information (string IDs are not allowed)\n * @throws Error if the ID is a string without version information\n *\n * @example\n * ```ts\n * // Ensure both accounts haven't changed before creating a transfer\n * uow.check(\"accounts\", fromAccount.id);\n * uow.check(\"accounts\", toAccount.id);\n * uow.create(\"transactions\", { fromAccountId, toAccountId, amount });\n * ```\n */\n check<TableName extends keyof TSchema[\"tables\"] & string>(\n tableName: TableName,\n id: FragnoId,\n ): void {\n this.#uow.addMutationOperation({\n type: \"check\",\n schema: this.#schema,\n namespace: this.#namespace,\n table: tableName,\n id,\n });\n }\n\n get $hooks(): THooks {\n throw new Error(\"type only\");\n }\n\n /**\n * Trigger a hook to be executed after the transaction commits.\n */\n triggerHook<K extends keyof THooks & string>(\n hookName: K,\n payload: HookPayload<THooks[K]>,\n options?: TriggerHookOptions,\n ): void {\n this.#uow.triggerHook(hookName, payload, options);\n }\n\n getTriggeredHooks(): ReadonlyArray<TriggeredHook> {\n return this.#uow.getTriggeredHooks();\n }\n}\n"],"mappings":"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"}
|
package/dist/schema/create.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { generateId } from "./generate-id.js";
|
|
2
2
|
|
|
3
3
|
//#region src/schema/create.d.ts
|
|
4
4
|
type AnySchema = Schema<Record<string, AnyTable>>;
|
|
@@ -311,7 +311,6 @@ declare class FragnoId {
|
|
|
311
311
|
};
|
|
312
312
|
toString(): string;
|
|
313
313
|
valueOf(): string;
|
|
314
|
-
[inspect.custom](): string;
|
|
315
314
|
}
|
|
316
315
|
/**
|
|
317
316
|
* FragnoReference represents a foreign key reference to another table's internal ID.
|
|
@@ -496,5 +495,5 @@ declare function compileForeignKey(key: ForeignKey, nameType?: "sql" | "orm"): {
|
|
|
496
495
|
columns: string[];
|
|
497
496
|
};
|
|
498
497
|
//#endregion
|
|
499
|
-
export { AnyColumn, AnyRelation, AnySchema, AnyTable, Column, DefaultBuilder, ExplicitRelationInit, ForeignKey, FragnoId, FragnoReference, IdColumn, Index, InternalIdColumn, Relation, RuntimeDefaultBuilder, Schema, SchemaBuilder, SchemaOperation, Table, TableBuilder, TableSubOperation, TypeMap, VersionColumn, column, compileForeignKey, idColumn, internalIdColumn, referenceColumn, schema, versionColumn };
|
|
498
|
+
export { AnyColumn, AnyRelation, AnySchema, AnyTable, Column, DefaultBuilder, ExplicitRelationInit, ForeignKey, FragnoId, FragnoReference, IdColumn, Index, InternalIdColumn, Relation, RuntimeDefaultBuilder, Schema, SchemaBuilder, SchemaOperation, Table, TableBuilder, TableSubOperation, TypeMap, VersionColumn, column, compileForeignKey, generateId, idColumn, internalIdColumn, referenceColumn, schema, versionColumn };
|
|
500
499
|
//# sourceMappingURL=create.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create.d.ts","names":[],"sources":["../../src/schema/create.ts"],"sourcesContent":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"create.d.ts","names":[],"sources":["../../src/schema/create.ts"],"sourcesContent":[],"mappings":"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"}
|
package/dist/schema/create.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { createId } from "../id.js";
|
|
2
|
-
import {
|
|
2
|
+
import { generateId } from "./generate-id.js";
|
|
3
3
|
|
|
4
4
|
//#region src/schema/create.ts
|
|
5
5
|
var RelationInit = class {
|
|
@@ -279,9 +279,6 @@ var FragnoId = class FragnoId {
|
|
|
279
279
|
valueOf() {
|
|
280
280
|
return this.#externalId;
|
|
281
281
|
}
|
|
282
|
-
[inspect.custom]() {
|
|
283
|
-
return `FragnoId { externalId: ${this.#externalId}, internalId: ${this.#internalId?.toString()} }`;
|
|
284
|
-
}
|
|
285
282
|
};
|
|
286
283
|
/**
|
|
287
284
|
* FragnoReference represents a foreign key reference to another table's internal ID.
|
|
@@ -690,5 +687,5 @@ function compileForeignKey(key, nameType = "orm") {
|
|
|
690
687
|
}
|
|
691
688
|
|
|
692
689
|
//#endregion
|
|
693
|
-
export { Column, ExplicitRelationInit, FragnoId, FragnoReference, IdColumn, InternalIdColumn, SchemaBuilder, TableBuilder, VersionColumn, column, compileForeignKey, idColumn, internalIdColumn, referenceColumn, schema, versionColumn };
|
|
690
|
+
export { Column, ExplicitRelationInit, FragnoId, FragnoReference, IdColumn, InternalIdColumn, SchemaBuilder, TableBuilder, VersionColumn, column, compileForeignKey, generateId, idColumn, internalIdColumn, referenceColumn, schema, versionColumn };
|
|
694
691
|
//# sourceMappingURL=create.js.map
|