@fragno-dev/db 0.3.0 → 0.4.1
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 +327 -160
- package/CHANGELOG.md +74 -0
- package/README.md +24 -0
- package/dist/adapters/adapters.d.ts +1 -1
- package/dist/adapters/adapters.d.ts.map +1 -1
- package/dist/adapters/adapters.js.map +1 -1
- package/dist/adapters/generic-sql/generic-sql-adapter.d.ts +0 -3
- package/dist/adapters/generic-sql/generic-sql-adapter.d.ts.map +1 -1
- package/dist/adapters/generic-sql/generic-sql-adapter.js +11 -12
- package/dist/adapters/generic-sql/generic-sql-adapter.js.map +1 -1
- package/dist/adapters/generic-sql/generic-sql-uow-executor.js +46 -6
- package/dist/adapters/generic-sql/generic-sql-uow-executor.js.map +1 -1
- package/dist/adapters/generic-sql/migration/cold-kysely.js.map +1 -1
- package/dist/adapters/generic-sql/migration/dialect/mysql.js +1 -1
- package/dist/adapters/generic-sql/migration/dialect/mysql.js.map +1 -1
- package/dist/adapters/generic-sql/migration/dialect/postgres.js +1 -1
- package/dist/adapters/generic-sql/migration/dialect/postgres.js.map +1 -1
- package/dist/adapters/generic-sql/migration/dialect/sqlite.js +185 -19
- package/dist/adapters/generic-sql/migration/dialect/sqlite.js.map +1 -1
- package/dist/adapters/generic-sql/migration/executor.d.ts.map +1 -1
- package/dist/adapters/generic-sql/migration/executor.js +30 -3
- package/dist/adapters/generic-sql/migration/executor.js.map +1 -1
- package/dist/adapters/generic-sql/migration/prepared-migrations.d.ts.map +1 -1
- package/dist/adapters/generic-sql/migration/prepared-migrations.js +3 -3
- package/dist/adapters/generic-sql/migration/prepared-migrations.js.map +1 -1
- package/dist/adapters/generic-sql/migration/sql-generator.js +1 -1
- package/dist/adapters/generic-sql/migration/sql-generator.js.map +1 -1
- package/dist/adapters/generic-sql/query/create-sql-query-compiler.js +1 -1
- package/dist/adapters/generic-sql/query/create-sql-query-compiler.js.map +1 -1
- package/dist/adapters/generic-sql/query/cursor-utils.js.map +1 -1
- package/dist/adapters/generic-sql/query/db-now-sql.js +27 -0
- package/dist/adapters/generic-sql/query/db-now-sql.js.map +1 -0
- package/dist/adapters/generic-sql/query/generic-sql-uow-operation-compiler.js +9 -6
- package/dist/adapters/generic-sql/query/generic-sql-uow-operation-compiler.js.map +1 -1
- package/dist/adapters/generic-sql/query/select-builder.js.map +1 -1
- package/dist/adapters/generic-sql/query/sql-query-compiler.js +37 -9
- package/dist/adapters/generic-sql/query/sql-query-compiler.js.map +1 -1
- package/dist/adapters/generic-sql/query/where-builder.js +24 -20
- package/dist/adapters/generic-sql/query/where-builder.js.map +1 -1
- package/dist/adapters/generic-sql/uow-decoder.js +1 -1
- package/dist/adapters/generic-sql/uow-decoder.js.map +1 -1
- package/dist/adapters/generic-sql/uow-encoder.js +8 -9
- package/dist/adapters/generic-sql/uow-encoder.js.map +1 -1
- package/dist/adapters/in-memory/condition-evaluator.js +10 -6
- package/dist/adapters/in-memory/condition-evaluator.js.map +1 -1
- package/dist/adapters/in-memory/in-memory-adapter.d.ts.map +1 -1
- package/dist/adapters/in-memory/in-memory-adapter.js +45 -25
- package/dist/adapters/in-memory/in-memory-adapter.js.map +1 -1
- package/dist/adapters/in-memory/in-memory-uow.js +236 -13
- package/dist/adapters/in-memory/in-memory-uow.js.map +1 -1
- package/dist/adapters/in-memory/options.d.ts +2 -0
- package/dist/adapters/in-memory/options.d.ts.map +1 -1
- package/dist/adapters/in-memory/options.js +3 -2
- package/dist/adapters/in-memory/options.js.map +1 -1
- package/dist/adapters/in-memory/reference-resolution.js.map +1 -1
- package/dist/adapters/in-memory/store.js +1 -1
- package/dist/adapters/in-memory/store.js.map +1 -1
- package/dist/adapters/shared/from-unit-of-work-compiler.js +51 -24
- package/dist/adapters/shared/from-unit-of-work-compiler.js.map +1 -1
- package/dist/adapters/shared/uow-operation-compiler.js.map +1 -1
- package/dist/browser/adapters/adapters.d.ts +61 -0
- package/dist/browser/adapters/adapters.d.ts.map +1 -0
- package/dist/browser/adapters/generic-sql/migration/executor.d.ts +15 -0
- package/dist/browser/adapters/generic-sql/migration/executor.d.ts.map +1 -0
- package/dist/browser/adapters/generic-sql/migration/prepared-migrations.d.ts +66 -0
- package/dist/browser/adapters/generic-sql/migration/prepared-migrations.d.ts.map +1 -0
- package/dist/browser/adapters/generic-sql/sqlite-storage.d.ts +11 -0
- package/dist/browser/adapters/generic-sql/sqlite-storage.d.ts.map +1 -0
- package/dist/browser/adapters/in-memory/in-memory-adapter.d.ts +5 -0
- package/dist/browser/adapters/in-memory/index.d.ts +2 -0
- package/dist/browser/adapters/in-memory/options.d.ts +1 -0
- package/dist/browser/db-fragment-definition-builder.d.ts +237 -0
- package/dist/browser/db-fragment-definition-builder.d.ts.map +1 -0
- package/dist/browser/durable-hooks.d.ts +3 -0
- package/dist/browser/fragments/internal-fragment.d.ts +317 -0
- package/dist/browser/fragments/internal-fragment.d.ts.map +1 -0
- package/dist/browser/fragments/internal-fragment.schema.d.ts +1 -0
- package/dist/browser/hooks/durable-hooks-logger.d.ts +10 -0
- package/dist/browser/hooks/durable-hooks-logger.d.ts.map +1 -0
- package/dist/browser/hooks/hooks.d.ts +146 -0
- package/dist/browser/hooks/hooks.d.ts.map +1 -0
- package/dist/browser/id.js +1 -0
- package/dist/browser/internal/adapter-registry.d.ts +4 -0
- package/dist/browser/internal/outbox-state.d.ts +2 -0
- package/dist/browser/mod.d.ts +15 -0
- package/dist/browser/mod.d.ts.map +1 -0
- package/dist/browser/mod.js +17 -0
- package/dist/browser/mod.js.map +1 -0
- package/dist/browser/mod2.d.ts +48 -0
- package/dist/browser/mod2.d.ts.map +1 -0
- package/dist/browser/naming/sql-naming.d.ts +19 -0
- package/dist/browser/naming/sql-naming.d.ts.map +1 -0
- package/dist/browser/outbox/outbox.d.ts +21 -0
- package/dist/browser/outbox/outbox.d.ts.map +1 -0
- package/dist/browser/query/column-defaults.js +1 -0
- package/dist/browser/query/condition-builder.d.ts +44 -0
- package/dist/browser/query/condition-builder.d.ts.map +1 -0
- package/dist/browser/query/condition-builder.js +97 -0
- package/dist/browser/query/condition-builder.js.map +1 -0
- package/dist/browser/query/cursor.d.ts +105 -0
- package/dist/browser/query/cursor.d.ts.map +1 -0
- package/dist/browser/query/cursor.js +150 -0
- package/dist/browser/query/cursor.js.map +1 -0
- package/dist/browser/query/db-now.d.ts +22 -0
- package/dist/browser/query/db-now.d.ts.map +1 -0
- package/dist/browser/query/db-now.js +33 -0
- package/dist/browser/query/db-now.js.map +1 -0
- package/dist/browser/query/orm/orm.d.ts +18 -0
- package/dist/browser/query/orm/orm.d.ts.map +1 -0
- package/dist/browser/query/simple-query-interface.d.ts +108 -0
- package/dist/browser/query/simple-query-interface.d.ts.map +1 -0
- package/dist/browser/query/unit-of-work/execute-unit-of-work.d.ts +423 -0
- package/dist/browser/query/unit-of-work/execute-unit-of-work.d.ts.map +1 -0
- package/dist/browser/query/unit-of-work/execute-unit-of-work.js +507 -0
- package/dist/browser/query/unit-of-work/execute-unit-of-work.js.map +1 -0
- package/dist/browser/query/unit-of-work/retry-policy.d.ts +23 -0
- package/dist/browser/query/unit-of-work/retry-policy.d.ts.map +1 -0
- package/dist/browser/query/unit-of-work/retry-policy.js +40 -0
- package/dist/browser/query/unit-of-work/retry-policy.js.map +1 -0
- package/dist/browser/query/unit-of-work/unit-of-work.d.ts +703 -0
- package/dist/browser/query/unit-of-work/unit-of-work.d.ts.map +1 -0
- package/dist/browser/query/unit-of-work/unit-of-work.js +1206 -0
- package/dist/browser/query/unit-of-work/unit-of-work.js.map +1 -0
- package/dist/browser/query/value-encoding.js +38 -0
- package/dist/browser/query/value-encoding.js.map +1 -0
- package/dist/browser/schema/create.d.ts +326 -0
- package/dist/browser/schema/create.d.ts.map +1 -0
- package/dist/browser/schema/create.js +89 -0
- package/dist/browser/schema/create.js.map +1 -0
- package/dist/browser/schema/generate-id.js +28 -0
- package/dist/browser/schema/generate-id.js.map +1 -0
- package/dist/browser/shared/providers.d.ts +6 -0
- package/dist/browser/shared/providers.d.ts.map +1 -0
- package/dist/browser/sql-driver/connection/connection-provider.d.ts +13 -0
- package/dist/browser/sql-driver/connection/connection-provider.d.ts.map +1 -0
- package/dist/browser/sql-driver/dialect-adapter/dialect-adapter.d.ts +7 -0
- package/dist/browser/sql-driver/dialect-adapter/dialect-adapter.d.ts.map +1 -0
- package/dist/browser/sql-driver/driver/runtime-driver.d.ts +23 -0
- package/dist/browser/sql-driver/driver/runtime-driver.d.ts.map +1 -0
- package/dist/browser/sql-driver/query-executor/plugin.d.ts +17 -0
- package/dist/browser/sql-driver/query-executor/plugin.d.ts.map +1 -0
- package/dist/browser/sql-driver/query-executor/query-executor.d.ts +36 -0
- package/dist/browser/sql-driver/query-executor/query-executor.d.ts.map +1 -0
- package/dist/browser/sql-driver/sql-driver-adapter.d.ts +29 -0
- package/dist/browser/sql-driver/sql-driver-adapter.d.ts.map +1 -0
- package/dist/browser/sql-driver/sql-driver.d.ts +38 -0
- package/dist/browser/sql-driver/sql-driver.d.ts.map +1 -0
- package/dist/browser/sync/commands.d.ts +15 -0
- package/dist/browser/sync/commands.d.ts.map +1 -0
- package/dist/browser/sync/commands.js +27 -0
- package/dist/browser/sync/commands.js.map +1 -0
- package/dist/browser/sync/types.d.ts +63 -0
- package/dist/browser/sync/types.d.ts.map +1 -0
- package/dist/browser/util/types.d.ts +8 -0
- package/dist/browser/util/types.d.ts.map +1 -0
- package/dist/browser/with-database.d.ts +29 -0
- package/dist/browser/with-database.d.ts.map +1 -0
- package/dist/client.d.ts +4 -0
- package/dist/client.js +5 -0
- package/dist/db-fragment-definition-builder.d.ts +85 -28
- package/dist/db-fragment-definition-builder.d.ts.map +1 -1
- package/dist/db-fragment-definition-builder.js +374 -46
- package/dist/db-fragment-definition-builder.js.map +1 -1
- package/dist/dispatchers/cloudflare-do/dispatcher.d.ts +20 -0
- package/dist/dispatchers/cloudflare-do/dispatcher.d.ts.map +1 -0
- package/dist/dispatchers/cloudflare-do/dispatcher.js +147 -0
- package/dist/dispatchers/cloudflare-do/dispatcher.js.map +1 -0
- package/dist/dispatchers/cloudflare-do/index.d.ts +5 -20
- package/dist/dispatchers/cloudflare-do/index.d.ts.map +1 -1
- package/dist/dispatchers/cloudflare-do/index.js +23 -55
- package/dist/dispatchers/cloudflare-do/index.js.map +1 -1
- package/dist/dispatchers/node/dispatcher.d.ts +14 -0
- package/dist/dispatchers/node/dispatcher.d.ts.map +1 -0
- package/dist/dispatchers/node/dispatcher.js +80 -0
- package/dist/dispatchers/node/dispatcher.js.map +1 -0
- package/dist/dispatchers/node/index.d.ts +5 -10
- package/dist/dispatchers/node/index.d.ts.map +1 -1
- package/dist/dispatchers/node/index.js +21 -53
- package/dist/dispatchers/node/index.js.map +1 -1
- package/dist/durable-hooks.d.ts +31 -0
- package/dist/durable-hooks.d.ts.map +1 -0
- package/dist/durable-hooks.js +23 -0
- package/dist/durable-hooks.js.map +1 -0
- package/dist/fragments/internal-fragment.d.ts +128 -27
- package/dist/fragments/internal-fragment.d.ts.map +1 -1
- package/dist/fragments/internal-fragment.js +125 -78
- package/dist/fragments/internal-fragment.js.map +1 -1
- package/dist/fragments/internal-fragment.routes.js +138 -3
- package/dist/fragments/internal-fragment.routes.js.map +1 -1
- package/dist/fragments/internal-fragment.schema.d.ts +7 -1
- package/dist/fragments/internal-fragment.schema.d.ts.map +1 -1
- package/dist/fragments/internal-fragment.schema.js +18 -1
- package/dist/fragments/internal-fragment.schema.js.map +1 -1
- package/dist/hooks/durable-hooks-logger.d.ts +10 -0
- package/dist/hooks/durable-hooks-logger.d.ts.map +1 -0
- package/dist/hooks/durable-hooks-logger.js +75 -0
- package/dist/hooks/durable-hooks-logger.js.map +1 -0
- package/dist/hooks/durable-hooks-processor.d.ts +1 -14
- package/dist/hooks/durable-hooks-processor.js +58 -10
- package/dist/hooks/durable-hooks-processor.js.map +1 -1
- package/dist/hooks/durable-hooks-runtime.js +44 -0
- package/dist/hooks/durable-hooks-runtime.js.map +1 -0
- package/dist/hooks/hooks.d.ts +60 -2
- package/dist/hooks/hooks.d.ts.map +1 -1
- package/dist/hooks/hooks.js +214 -53
- package/dist/hooks/hooks.js.map +1 -1
- package/dist/id.d.ts +2 -2
- package/dist/id.js +2 -2
- package/dist/internal/adapter-registry.d.ts +11 -0
- package/dist/internal/adapter-registry.d.ts.map +1 -0
- package/dist/internal/adapter-registry.js +135 -0
- package/dist/internal/adapter-registry.js.map +1 -0
- package/dist/internal/outbox-state.d.ts +2 -0
- package/dist/internal/outbox-state.js +26 -0
- package/dist/internal/outbox-state.js.map +1 -0
- package/dist/migration-engine/auto-from-schema.d.ts +33 -0
- package/dist/migration-engine/auto-from-schema.d.ts.map +1 -0
- package/dist/migration-engine/auto-from-schema.js +210 -27
- package/dist/migration-engine/auto-from-schema.js.map +1 -1
- package/dist/migration-engine/generation-engine.d.ts.map +1 -1
- package/dist/migration-engine/generation-engine.js +17 -5
- package/dist/migration-engine/generation-engine.js.map +1 -1
- package/dist/migration-engine/shared.d.ts +113 -0
- package/dist/migration-engine/shared.d.ts.map +1 -0
- package/dist/migration-engine/shared.js.map +1 -1
- package/dist/mod.d.ts +12 -11
- package/dist/mod.d.ts.map +1 -1
- package/dist/mod.js +10 -10
- package/dist/mod.js.map +1 -1
- package/dist/naming/sql-naming.d.ts.map +1 -1
- package/dist/naming/sql-naming.js.map +1 -1
- package/dist/outbox/outbox-builder.js.map +1 -1
- package/dist/outbox/outbox.d.ts +3 -1
- package/dist/outbox/outbox.d.ts.map +1 -1
- package/dist/outbox/outbox.js.map +1 -1
- package/dist/query/column-defaults.js.map +1 -1
- package/dist/query/condition-builder.d.ts +7 -1
- package/dist/query/condition-builder.d.ts.map +1 -1
- package/dist/query/condition-builder.js +5 -1
- package/dist/query/condition-builder.js.map +1 -1
- package/dist/query/cursor-client.d.ts +105 -0
- package/dist/query/cursor-client.d.ts.map +1 -0
- package/dist/query/cursor-client.js +165 -0
- package/dist/query/cursor-client.js.map +1 -0
- package/dist/query/cursor.d.ts.map +1 -1
- package/dist/query/cursor.js +7 -1
- package/dist/query/cursor.js.map +1 -1
- package/dist/query/db-now.d.ts +15 -1
- package/dist/query/db-now.d.ts.map +1 -1
- package/dist/query/db-now.js +30 -2
- package/dist/query/db-now.js.map +1 -1
- package/dist/query/orm/orm.js.map +1 -1
- package/dist/query/serialize/create-sql-serializer.js +2 -2
- package/dist/query/serialize/create-sql-serializer.js.map +1 -1
- package/dist/query/serialize/dialect/mysql-serializer.js.map +1 -1
- package/dist/query/serialize/dialect/postgres-serializer.js.map +1 -1
- package/dist/query/serialize/dialect/sqlite-serializer.js +6 -2
- package/dist/query/serialize/dialect/sqlite-serializer.js.map +1 -1
- package/dist/query/simple-query-interface.d.ts +7 -3
- package/dist/query/simple-query-interface.d.ts.map +1 -1
- package/dist/query/unit-of-work/execute-unit-of-work.d.ts +37 -2
- 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 +39 -18
- 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 +42 -16
- package/dist/query/unit-of-work/unit-of-work.d.ts.map +1 -1
- package/dist/query/unit-of-work/unit-of-work.js +50 -6
- package/dist/query/unit-of-work/unit-of-work.js.map +1 -1
- package/dist/query/value-decoding.js +8 -1
- package/dist/query/value-decoding.js.map +1 -1
- package/dist/query/value-encoding.js.map +1 -1
- package/dist/schema/create.d.ts +69 -25
- package/dist/schema/create.d.ts.map +1 -1
- package/dist/schema/create.js +91 -16
- package/dist/schema/create.js.map +1 -1
- package/dist/schema/type-conversion/create-sql-type-mapper.js +1 -1
- package/dist/schema/type-conversion/create-sql-type-mapper.js.map +1 -1
- package/dist/schema/type-conversion/dialect/sqlite.js.map +1 -1
- package/dist/schema/validator.d.ts.map +1 -1
- package/dist/schema/validator.js.map +1 -1
- package/dist/schema-output/drizzle.d.ts.map +1 -1
- package/dist/schema-output/drizzle.js +8 -6
- package/dist/schema-output/drizzle.js.map +1 -1
- package/dist/schema-output/prisma.d.ts.map +1 -1
- package/dist/schema-output/prisma.js +21 -10
- package/dist/schema-output/prisma.js.map +1 -1
- package/dist/sql-driver/dialects/durable-object-dialect.js +3 -9
- package/dist/sql-driver/dialects/durable-object-dialect.js.map +1 -1
- package/dist/sql-driver/query-executor/default-query-executor.js.map +1 -1
- package/dist/sql-driver/query-executor/query-executor-base.js.map +1 -1
- package/dist/sql-driver/sql-driver-adapter.js.map +1 -1
- package/dist/sql-driver/sql.js.map +1 -1
- package/dist/sync/commands.d.ts +15 -0
- package/dist/sync/commands.d.ts.map +1 -0
- package/dist/sync/commands.js +27 -0
- package/dist/sync/commands.js.map +1 -0
- package/dist/sync/index.d.ts +4 -0
- package/dist/sync/index.js +4 -0
- package/dist/sync/read-tracking.d.ts +25 -0
- package/dist/sync/read-tracking.d.ts.map +1 -0
- package/dist/sync/read-tracking.js +148 -0
- package/dist/sync/read-tracking.js.map +1 -0
- package/dist/sync/submit.js +213 -0
- package/dist/sync/submit.js.map +1 -0
- package/dist/sync/types.d.ts +63 -0
- package/dist/sync/types.d.ts.map +1 -0
- package/dist/util/default-database-adapter.js +6 -1
- package/dist/util/default-database-adapter.js.map +1 -1
- package/dist/with-database.d.ts +3 -6
- package/dist/with-database.d.ts.map +1 -1
- package/dist/with-database.js +7 -15
- package/dist/with-database.js.map +1 -1
- package/package.json +33 -41
- package/src/adapters/adapters.ts +5 -4
- package/src/adapters/drizzle/migrate-drizzle.test.ts +46 -9
- package/src/adapters/drizzle/migration-parity-drizzle-kit.test.ts +5 -3
- package/src/adapters/drizzle/test-utils.ts +2 -1
- package/src/adapters/generic-sql/generic-sql-adapter.test.ts +5 -3
- package/src/adapters/generic-sql/generic-sql-adapter.ts +21 -24
- package/src/adapters/generic-sql/generic-sql-uow-executor.test.ts +1 -0
- package/src/adapters/generic-sql/generic-sql-uow-executor.ts +81 -15
- package/src/adapters/generic-sql/migration/adapter-migration-parity.test.ts +4 -2
- package/src/adapters/generic-sql/migration/cold-kysely.ts +1 -0
- package/src/adapters/generic-sql/migration/dialect/mysql.test.ts +3 -2
- package/src/adapters/generic-sql/migration/dialect/mysql.ts +1 -0
- package/src/adapters/generic-sql/migration/dialect/postgres.test.ts +5 -4
- package/src/adapters/generic-sql/migration/dialect/postgres.ts +2 -1
- package/src/adapters/generic-sql/migration/dialect/sqlite.test.ts +795 -3
- package/src/adapters/generic-sql/migration/dialect/sqlite.ts +385 -57
- package/src/adapters/generic-sql/migration/executor.test.ts +52 -0
- package/src/adapters/generic-sql/migration/executor.ts +47 -4
- package/src/adapters/generic-sql/migration/prepared-migrations.test.ts +117 -14
- package/src/adapters/generic-sql/migration/prepared-migrations.ts +9 -8
- package/src/adapters/generic-sql/migration/sql-generator.ts +5 -3
- package/src/adapters/generic-sql/query/create-sql-query-compiler.ts +3 -3
- package/src/adapters/generic-sql/query/cursor-utils.test.ts +3 -2
- package/src/adapters/generic-sql/query/cursor-utils.ts +1 -1
- package/src/adapters/generic-sql/query/db-now-sql.ts +49 -0
- package/src/adapters/generic-sql/query/generic-sql-uow-operation-compiler.test.ts +144 -8
- package/src/adapters/generic-sql/query/generic-sql-uow-operation-compiler.ts +16 -17
- package/src/adapters/generic-sql/query/select-builder.test.ts +1 -0
- package/src/adapters/generic-sql/query/select-builder.ts +2 -2
- package/src/adapters/generic-sql/query/sql-query-compiler.test.ts +24 -5
- package/src/adapters/generic-sql/query/sql-query-compiler.ts +83 -13
- package/src/adapters/generic-sql/query/where-builder.test.ts +7 -5
- package/src/adapters/generic-sql/query/where-builder.ts +48 -29
- package/src/adapters/generic-sql/sql-adapter-pglite-migrations.test.ts +6 -15
- package/src/adapters/generic-sql/sql-adapter-pglite-pagination.test.ts +52 -7
- package/src/adapters/generic-sql/sql-adapter-pglite-queries.test.ts +9 -6
- package/src/adapters/generic-sql/sql-adapter-sqlite3-driver.test.ts +273 -5
- package/src/adapters/generic-sql/sql-adapter-sqlite3-uow.test.ts +123 -6
- package/src/adapters/generic-sql/sql-adapter-sqlocal.test.ts +4 -2
- package/src/adapters/generic-sql/uow-decoder.test.ts +4 -3
- package/src/adapters/generic-sql/uow-decoder.ts +3 -3
- package/src/adapters/generic-sql/uow-encoder.test.ts +4 -2
- package/src/adapters/generic-sql/uow-encoder.ts +14 -18
- package/src/adapters/in-memory/condition-evaluator.test.ts +2 -1
- package/src/adapters/in-memory/condition-evaluator.ts +9 -4
- package/src/adapters/in-memory/in-memory-adapter.ts +155 -44
- package/src/adapters/in-memory/in-memory-uow.mutations.test.ts +50 -2
- package/src/adapters/in-memory/in-memory-uow.retrieval.test.ts +158 -3
- package/src/adapters/in-memory/in-memory-uow.ts +402 -26
- package/src/adapters/in-memory/options.test.ts +1 -0
- package/src/adapters/in-memory/options.ts +5 -1
- package/src/adapters/in-memory/outbox.test.ts +361 -0
- package/src/adapters/in-memory/reference-resolution.test.ts +3 -2
- package/src/adapters/in-memory/reference-resolution.ts +2 -2
- package/src/adapters/in-memory/sorted-array-index.test.ts +1 -0
- package/src/adapters/in-memory/store.test.ts +1 -0
- package/src/adapters/in-memory/store.ts +3 -3
- package/src/adapters/in-memory/value-normalization.test.ts +1 -0
- package/src/adapters/prisma/prisma-adapter-sqlite3.test.ts +51 -7
- package/src/adapters/shared/from-unit-of-work-compiler.ts +156 -46
- package/src/adapters/shared/uow-operation-compiler.ts +3 -3
- package/src/browser/mod.ts +64 -0
- package/src/client.ts +19 -0
- package/src/db-fragment-definition-builder.test.ts +821 -47
- package/src/db-fragment-definition-builder.ts +857 -110
- package/src/db-fragment-instantiator.test.ts +114 -90
- package/src/db-fragment-integration.test.ts +9 -6
- package/src/dispatchers/cloudflare-do/dispatcher.ts +204 -0
- package/src/dispatchers/cloudflare-do/index.test.ts +145 -12
- package/src/dispatchers/cloudflare-do/index.ts +49 -90
- package/src/dispatchers/node/dispatcher.ts +112 -0
- package/src/dispatchers/node/index.test.ts +43 -14
- package/src/dispatchers/node/index.ts +38 -75
- package/src/durable-hooks.test.ts +80 -0
- package/src/durable-hooks.ts +67 -0
- package/src/fragments/internal-fragment.routes.test.ts +570 -0
- package/src/fragments/internal-fragment.routes.ts +297 -5
- package/src/fragments/internal-fragment.schema.ts +45 -1
- package/src/fragments/internal-fragment.test.ts +223 -251
- package/src/fragments/internal-fragment.ts +278 -154
- package/src/hooks/durable-hooks-logger.ts +126 -0
- package/src/hooks/durable-hooks-processor.pglite.test.ts +87 -0
- package/src/hooks/durable-hooks-processor.test.ts +179 -14
- package/src/hooks/durable-hooks-processor.ts +120 -14
- package/src/hooks/durable-hooks-runtime.test.ts +65 -0
- package/src/hooks/durable-hooks-runtime.ts +81 -0
- package/src/hooks/hooks.test.ts +314 -53
- package/src/hooks/hooks.ts +360 -81
- package/src/id.test.ts +34 -0
- package/src/id.ts +1 -3
- package/src/internal/adapter-registry.test.ts +93 -0
- package/src/internal/adapter-registry.ts +239 -0
- package/src/internal/outbox-state.ts +43 -0
- package/src/migration-engine/auto-from-schema.test.ts +93 -0
- package/src/migration-engine/auto-from-schema.ts +360 -42
- package/src/migration-engine/create.test.ts +2 -1
- package/src/migration-engine/create.ts +1 -1
- package/src/migration-engine/generation-engine.test.ts +66 -9
- package/src/migration-engine/generation-engine.ts +31 -10
- package/src/migration-engine/shared.ts +13 -0
- package/src/mod.ts +45 -27
- package/src/naming/sql-naming.ts +1 -0
- package/src/outbox/outbox-builder.ts +2 -2
- package/src/outbox/outbox.test.ts +216 -45
- package/src/outbox/outbox.ts +3 -1
- package/src/query/column-defaults.ts +1 -1
- package/src/query/condition-builder.test.ts +15 -0
- package/src/query/condition-builder.ts +7 -0
- package/src/query/cursor-client.test.ts +70 -0
- package/src/query/cursor-client.ts +263 -0
- package/src/query/cursor.test.ts +3 -2
- package/src/query/cursor.ts +15 -3
- package/src/query/db-now.ts +69 -2
- package/src/query/orm/orm.ts +2 -2
- package/src/query/query-type.test.ts +2 -1
- package/src/query/serialize/create-sql-serializer.ts +3 -3
- package/src/query/serialize/dialect/mysql-serializer.ts +1 -1
- package/src/query/serialize/dialect/postgres-serializer.ts +1 -1
- package/src/query/serialize/dialect/sqlite-serializer.test.ts +39 -2
- package/src/query/serialize/dialect/sqlite-serializer.ts +18 -5
- package/src/query/simple-query-interface.ts +10 -4
- package/src/query/unit-of-work/execute-unit-of-work.test.ts +347 -9
- package/src/query/unit-of-work/execute-unit-of-work.ts +63 -20
- package/src/query/unit-of-work/retry-policy.test.ts +1 -0
- package/src/query/unit-of-work/tx-builder.test.ts +73 -1
- package/src/query/unit-of-work/unit-of-work-coordinator.test.ts +5 -4
- package/src/query/unit-of-work/unit-of-work-types.test.ts +41 -11
- package/src/query/unit-of-work/unit-of-work.test.ts +28 -2
- package/src/query/unit-of-work/unit-of-work.ts +105 -19
- package/src/query/value-decoding.test.ts +50 -2
- package/src/query/value-decoding.ts +17 -4
- package/src/query/value-encoding.test.ts +1 -0
- package/src/query/value-encoding.ts +1 -1
- package/src/schema/create.test.ts +164 -5
- package/src/schema/create.ts +222 -24
- package/src/schema/generate-id.test.ts +1 -0
- package/src/schema/serialize.test.ts +4 -3
- package/src/schema/type-conversion/create-sql-type-mapper.ts +1 -1
- package/src/schema/type-conversion/dialect/sqlite.ts +2 -2
- package/src/schema/type-conversion/type-mapping.test.ts +2 -1
- package/src/schema/validator.test.ts +4 -2
- package/src/schema/validator.ts +1 -0
- package/src/schema-output/drizzle.test.ts +72 -19
- package/src/schema-output/drizzle.ts +24 -18
- package/src/schema-output/prisma.test.ts +172 -14
- package/src/schema-output/prisma.ts +34 -14
- package/src/sql-driver/better-sqlite3.test.ts +5 -3
- package/src/sql-driver/dialects/durable-object-dialect.ts +3 -8
- package/src/sql-driver/query-executor/default-query-executor.ts +1 -1
- package/src/sql-driver/query-executor/query-executor-base.ts +1 -1
- package/src/sql-driver/query-executor/query-executor.ts +1 -1
- package/src/sql-driver/sql-driver-adapter.ts +2 -2
- package/src/sql-driver/sql.ts +2 -1
- package/src/sql-driver/sqlocal.test.ts +4 -2
- package/src/sync/commands.test.ts +39 -0
- package/src/sync/commands.ts +51 -0
- package/src/sync/conflict-checker.test.ts +450 -0
- package/src/sync/conflict-checker.ts +248 -0
- package/src/sync/index.ts +14 -0
- package/src/sync/plan.ts +9 -0
- package/src/sync/read-tracking.test.ts +177 -0
- package/src/sync/read-tracking.ts +287 -0
- package/src/sync/submit.test.ts +205 -0
- package/src/sync/submit.ts +328 -0
- package/src/sync/types.ts +80 -0
- package/src/util/default-database-adapter.ts +15 -2
- package/src/with-database.ts +20 -50
- package/tsconfig.json +1 -1
- package/tsdown.config.ts +38 -26
- package/vitest.config.ts +1 -0
- package/dist/hooks/durable-hooks-processor.d.ts.map +0 -1
- package/dist/node_modules/.pnpm/rou3@0.7.12/node_modules/rou3/dist/index.js +0 -168
- package/dist/node_modules/.pnpm/rou3@0.7.12/node_modules/rou3/dist/index.js.map +0 -1
- package/dist/packages/fragno/dist/api/bind-services.js +0 -20
- package/dist/packages/fragno/dist/api/bind-services.js.map +0 -1
- package/dist/packages/fragno/dist/api/error.js +0 -48
- package/dist/packages/fragno/dist/api/error.js.map +0 -1
- package/dist/packages/fragno/dist/api/fragment-definition-builder.js +0 -321
- package/dist/packages/fragno/dist/api/fragment-definition-builder.js.map +0 -1
- package/dist/packages/fragno/dist/api/fragment-instantiator.js +0 -669
- package/dist/packages/fragno/dist/api/fragment-instantiator.js.map +0 -1
- package/dist/packages/fragno/dist/api/fragno-response.js +0 -73
- package/dist/packages/fragno/dist/api/fragno-response.js.map +0 -1
- package/dist/packages/fragno/dist/api/internal/response-stream.js +0 -81
- package/dist/packages/fragno/dist/api/internal/response-stream.js.map +0 -1
- package/dist/packages/fragno/dist/api/internal/route.js +0 -10
- package/dist/packages/fragno/dist/api/internal/route.js.map +0 -1
- package/dist/packages/fragno/dist/api/mutable-request-state.js +0 -97
- package/dist/packages/fragno/dist/api/mutable-request-state.js.map +0 -1
- package/dist/packages/fragno/dist/api/request-context-storage.js +0 -43
- package/dist/packages/fragno/dist/api/request-context-storage.js.map +0 -1
- package/dist/packages/fragno/dist/api/request-input-context.js +0 -185
- package/dist/packages/fragno/dist/api/request-input-context.js.map +0 -1
- package/dist/packages/fragno/dist/api/request-middleware.js +0 -83
- package/dist/packages/fragno/dist/api/request-middleware.js.map +0 -1
- package/dist/packages/fragno/dist/api/request-output-context.js +0 -119
- package/dist/packages/fragno/dist/api/request-output-context.js.map +0 -1
- package/dist/packages/fragno/dist/api/route.js +0 -30
- package/dist/packages/fragno/dist/api/route.js.map +0 -1
- package/dist/packages/fragno/dist/internal/symbols.js +0 -10
- package/dist/packages/fragno/dist/internal/symbols.js.map +0 -1
- package/dist/packages/fragno/dist/internal/trace-context.js +0 -12
- package/dist/packages/fragno/dist/internal/trace-context.js.map +0 -1
|
@@ -0,0 +1,703 @@
|
|
|
1
|
+
import { DbInterval, DbIntervalInput, DbNow } from "../db-now.js";
|
|
2
|
+
import { Prettify } from "../../util/types.js";
|
|
3
|
+
import { AnySchema, AnyTable, FragnoId, IdColumn, Index, Relation } from "../../schema/create.js";
|
|
4
|
+
import { Condition, ConditionBuilder } from "../condition-builder.js";
|
|
5
|
+
import { Cursor, CursorResult } from "../cursor.js";
|
|
6
|
+
import { HookPayload, HooksMap, TriggerHookOptions, TriggeredHook } from "../../hooks/hooks.js";
|
|
7
|
+
import { CompiledJoin } from "../orm/orm.js";
|
|
8
|
+
import { ExtractJoinOut, ExtractSelect, SelectClause, SelectResult, TableToInsertValues, TableToUpdateValues } from "../simple-query-interface.js";
|
|
9
|
+
|
|
10
|
+
//#region src/query/unit-of-work/unit-of-work.d.ts
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Builder for updateMany operations that supports both whereIndex and set chaining
|
|
14
|
+
*/
|
|
15
|
+
interface UpdateManyBuilder<TTable extends AnyTable> {
|
|
16
|
+
whereIndex<TIndexName extends ValidIndexName<TTable>>(indexName: TIndexName, condition?: (eb: IndexSpecificConditionBuilder<TTable, TIndexName>) => Condition | boolean): this;
|
|
17
|
+
set(values: TableToUpdateValues<TTable>): this;
|
|
18
|
+
now(): DbNow;
|
|
19
|
+
interval(input: DbIntervalInput): DbInterval;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Extract column names from a single index
|
|
23
|
+
*/
|
|
24
|
+
type IndexColumns<TIndex extends Index> = TIndex["columnNames"][number];
|
|
25
|
+
type RemoveEmptyObject<T> = T extends object ? (keyof T extends never ? never : T) : never;
|
|
26
|
+
type ExtractJoinBuilderSelect<T> = T extends JoinFindBuilder<infer _Table, infer TSelect, infer _JoinOut> ? TSelect : true;
|
|
27
|
+
type ExtractJoinBuilderOut<T> = T extends JoinFindBuilder<infer _Table, infer _Select, infer TJoinOut> ? TJoinOut : {};
|
|
28
|
+
/**
|
|
29
|
+
* Extract all indexed column names from a table's indexes
|
|
30
|
+
*/
|
|
31
|
+
type IndexedColumns<TIndexes extends Record<string, Index>> = TIndexes[keyof TIndexes] extends Index ? IndexColumns<TIndexes[keyof TIndexes]> : never;
|
|
32
|
+
type OmitNever<T> = { [K in keyof T as T[K] extends never ? never : K]: T[K] };
|
|
33
|
+
/**
|
|
34
|
+
* Extract the name of the ID column from a table
|
|
35
|
+
* Checks if column has 'id' property set to true (which IdColumn class has)
|
|
36
|
+
*/
|
|
37
|
+
type InferIdColumnName<TTable extends AnyTable> = keyof OmitNever<{ [K in keyof TTable["columns"]]: TTable["columns"][K] extends IdColumn<infer _, infer __, infer ___> ? K : never }>;
|
|
38
|
+
/**
|
|
39
|
+
* Get the columns for a specific index name.
|
|
40
|
+
* For "primary", returns only the ID column.
|
|
41
|
+
* For named indexes, returns the columns defined in that index.
|
|
42
|
+
*/
|
|
43
|
+
type ColumnsForIndex<TTable extends AnyTable, TIndexName extends ValidIndexName<TTable>> = TIndexName extends "primary" ? Pick<TTable["columns"], InferIdColumnName<TTable>> : TIndexName extends keyof TTable["indexes"] ? Pick<TTable["columns"], IndexColumns<TTable["indexes"][TIndexName]>> : never;
|
|
44
|
+
/**
|
|
45
|
+
* ConditionBuilder restricted to indexed columns only.
|
|
46
|
+
* Used throughout Unit of Work to ensure all queries can leverage indexes for optimal performance.
|
|
47
|
+
*/
|
|
48
|
+
type IndexedConditionBuilder<TTable extends AnyTable> = ConditionBuilder<Pick<TTable["columns"], IndexedColumns<TTable["indexes"]>>>;
|
|
49
|
+
/**
|
|
50
|
+
* ConditionBuilder restricted to columns in a specific index.
|
|
51
|
+
*/
|
|
52
|
+
type IndexSpecificConditionBuilder<TTable extends AnyTable, TIndexName extends ValidIndexName<TTable>> = ConditionBuilder<ColumnsForIndex<TTable, TIndexName>>;
|
|
53
|
+
/**
|
|
54
|
+
* Valid index names for a table, including the static "primary" index
|
|
55
|
+
*/
|
|
56
|
+
type ValidIndexName<TTable extends AnyTable> = "primary" | (string & keyof TTable["indexes"]);
|
|
57
|
+
/**
|
|
58
|
+
* Find options for Unit of Work (internal, used after builder finalization)
|
|
59
|
+
*/
|
|
60
|
+
type FindOptions<TTable extends AnyTable = AnyTable, TSelect$1 extends SelectClause<TTable> = SelectClause<TTable>> = {
|
|
61
|
+
/**
|
|
62
|
+
* Which index to use for this query (required)
|
|
63
|
+
*/
|
|
64
|
+
useIndex: string;
|
|
65
|
+
/**
|
|
66
|
+
* Select clause - which columns to return
|
|
67
|
+
*/
|
|
68
|
+
select?: TSelect$1;
|
|
69
|
+
/**
|
|
70
|
+
* Where clause - filtering restricted to indexed columns only
|
|
71
|
+
*/
|
|
72
|
+
where?: (eb: IndexedConditionBuilder<TTable>) => Condition | boolean;
|
|
73
|
+
/**
|
|
74
|
+
* Order by index - specify which index to order by and direction
|
|
75
|
+
*/
|
|
76
|
+
orderByIndex?: {
|
|
77
|
+
indexName: string;
|
|
78
|
+
direction: "asc" | "desc";
|
|
79
|
+
};
|
|
80
|
+
/**
|
|
81
|
+
* Cursor for pagination - continue after this cursor
|
|
82
|
+
*/
|
|
83
|
+
after?: Cursor | string;
|
|
84
|
+
/**
|
|
85
|
+
* Cursor for pagination - continue before this cursor
|
|
86
|
+
*/
|
|
87
|
+
before?: Cursor | string;
|
|
88
|
+
/**
|
|
89
|
+
* Number of results per page
|
|
90
|
+
*/
|
|
91
|
+
pageSize?: number;
|
|
92
|
+
/**
|
|
93
|
+
* Join operations to include related data
|
|
94
|
+
*/
|
|
95
|
+
joins?: CompiledJoin[];
|
|
96
|
+
};
|
|
97
|
+
/**
|
|
98
|
+
* Unit of Work state machine
|
|
99
|
+
*/
|
|
100
|
+
type UOWState = "building-retrieval" | "building-mutation" | "executed";
|
|
101
|
+
/**
|
|
102
|
+
* Retrieval operation - read operations in the first phase
|
|
103
|
+
*/
|
|
104
|
+
type RetrievalOperation<TSchema extends AnySchema, TTable extends AnyTable = TSchema["tables"][keyof TSchema["tables"]]> = {
|
|
105
|
+
type: "find";
|
|
106
|
+
schema: TSchema;
|
|
107
|
+
namespace?: string | null;
|
|
108
|
+
table: TTable;
|
|
109
|
+
indexName: string;
|
|
110
|
+
options: FindOptions<TTable, SelectClause<TTable>>;
|
|
111
|
+
withCursor?: boolean;
|
|
112
|
+
withSingleResult?: boolean;
|
|
113
|
+
readTracking?: boolean;
|
|
114
|
+
} | {
|
|
115
|
+
type: "count";
|
|
116
|
+
schema: TSchema;
|
|
117
|
+
namespace?: string | null;
|
|
118
|
+
table: TTable;
|
|
119
|
+
indexName: string;
|
|
120
|
+
options: Pick<FindOptions<TTable>, "where" | "useIndex">;
|
|
121
|
+
};
|
|
122
|
+
/**
|
|
123
|
+
* Mutation operations - write operations in the second phase
|
|
124
|
+
*/
|
|
125
|
+
type MutationOperation<TSchema extends AnySchema, TTable extends AnyTable = TSchema["tables"][keyof TSchema["tables"]]> = {
|
|
126
|
+
type: "update";
|
|
127
|
+
schema: TSchema;
|
|
128
|
+
namespace?: string | null;
|
|
129
|
+
table: TTable["name"];
|
|
130
|
+
id: FragnoId | string;
|
|
131
|
+
checkVersion: boolean;
|
|
132
|
+
set: TableToUpdateValues<TTable>;
|
|
133
|
+
} | {
|
|
134
|
+
type: "create";
|
|
135
|
+
schema: TSchema;
|
|
136
|
+
namespace?: string | null;
|
|
137
|
+
table: TTable["name"];
|
|
138
|
+
values: TableToInsertValues<TTable>;
|
|
139
|
+
generatedExternalId: string;
|
|
140
|
+
} | {
|
|
141
|
+
type: "delete";
|
|
142
|
+
schema: TSchema;
|
|
143
|
+
namespace?: string | null;
|
|
144
|
+
table: TTable["name"];
|
|
145
|
+
id: FragnoId | string;
|
|
146
|
+
checkVersion: boolean;
|
|
147
|
+
} | {
|
|
148
|
+
type: "check";
|
|
149
|
+
schema: TSchema;
|
|
150
|
+
namespace?: string | null;
|
|
151
|
+
table: TTable["name"];
|
|
152
|
+
id: FragnoId;
|
|
153
|
+
};
|
|
154
|
+
/**
|
|
155
|
+
* Compiled mutation with metadata for execution
|
|
156
|
+
*/
|
|
157
|
+
interface CompiledMutation<TOutput> {
|
|
158
|
+
query: TOutput;
|
|
159
|
+
/**
|
|
160
|
+
* Original mutation operation for execution metadata (e.g., outbox payloads).
|
|
161
|
+
*/
|
|
162
|
+
operation?: MutationOperation<AnySchema>;
|
|
163
|
+
/**
|
|
164
|
+
* Idempotency key for the Unit of Work that produced this mutation.
|
|
165
|
+
*/
|
|
166
|
+
uowId?: string;
|
|
167
|
+
/**
|
|
168
|
+
* The type of mutation operation (create, update, delete, or check).
|
|
169
|
+
*/
|
|
170
|
+
op: "create" | "update" | "delete" | "check";
|
|
171
|
+
/**
|
|
172
|
+
* Number of rows this operation must affect for the transaction to succeed.
|
|
173
|
+
* If actual affected rows doesn't match, it indicates a version conflict.
|
|
174
|
+
* null means don't check affected rows (e.g., for create operations).
|
|
175
|
+
*/
|
|
176
|
+
expectedAffectedRows: bigint | null;
|
|
177
|
+
/**
|
|
178
|
+
* Number of rows this SELECT query must return for the transaction to succeed.
|
|
179
|
+
* Used for check operations to verify version without modifying data.
|
|
180
|
+
* null means this is not a SELECT query that needs row count validation.
|
|
181
|
+
*/
|
|
182
|
+
expectedReturnedRows: number | null;
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Compiler interface for Unit of Work operations
|
|
186
|
+
*/
|
|
187
|
+
interface UOWCompiler<TOutput> {
|
|
188
|
+
/**
|
|
189
|
+
* Compile a retrieval operation to the adapter's query format
|
|
190
|
+
*/
|
|
191
|
+
compileRetrievalOperation(op: RetrievalOperation<AnySchema>): TOutput | null;
|
|
192
|
+
/**
|
|
193
|
+
* Compile a mutation operation to the adapter's query format
|
|
194
|
+
*/
|
|
195
|
+
compileMutationOperation(op: MutationOperation<AnySchema>): CompiledMutation<TOutput> | null;
|
|
196
|
+
}
|
|
197
|
+
type MutationResult = {
|
|
198
|
+
success: true;
|
|
199
|
+
createdInternalIds: (bigint | null)[];
|
|
200
|
+
} | {
|
|
201
|
+
success: false;
|
|
202
|
+
};
|
|
203
|
+
/**
|
|
204
|
+
* Executor interface for Unit of Work operations
|
|
205
|
+
*/
|
|
206
|
+
interface UOWExecutor<TOutput, TRawResult = unknown> {
|
|
207
|
+
executeRetrievalPhase(retrievalBatch: TOutput[]): Promise<TRawResult[]>;
|
|
208
|
+
/**
|
|
209
|
+
* Returns success status indicating if mutations completed without conflicts,
|
|
210
|
+
* and internal IDs for create operations (null if database doesn't support RETURNING)
|
|
211
|
+
*/
|
|
212
|
+
executeMutationPhase(mutationBatch: CompiledMutation<TOutput>[]): Promise<MutationResult>;
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* Decoder interface for Unit of Work retrieval results
|
|
216
|
+
*
|
|
217
|
+
* Transforms raw database results into application format (e.g., converting raw columns
|
|
218
|
+
* into FragnoId objects with external ID, internal ID, and version).
|
|
219
|
+
*/
|
|
220
|
+
interface UOWDecoder<TRawInput = unknown> {
|
|
221
|
+
/**
|
|
222
|
+
* Decode raw database results from the retrieval phase
|
|
223
|
+
*
|
|
224
|
+
* @param rawResults - Array of raw result sets from database queries
|
|
225
|
+
* @param operations - Array of retrieval operations that produced these results
|
|
226
|
+
* @returns Decoded results in application format
|
|
227
|
+
*/
|
|
228
|
+
decode(rawResults: TRawInput[], operations: RetrievalOperation<AnySchema>[]): unknown[];
|
|
229
|
+
}
|
|
230
|
+
/**
|
|
231
|
+
* Builder for find operations in Unit of Work
|
|
232
|
+
*/
|
|
233
|
+
declare class FindBuilder<TTable extends AnyTable, TSelect$1 extends SelectClause<TTable> = true, TJoinOut$1 = {}> {
|
|
234
|
+
#private;
|
|
235
|
+
constructor(tableName: string, table: TTable);
|
|
236
|
+
/**
|
|
237
|
+
* Specify which index to use and optionally filter the results
|
|
238
|
+
*/
|
|
239
|
+
whereIndex<TIndexName extends ValidIndexName<TTable>>(indexName: TIndexName, condition?: (eb: IndexSpecificConditionBuilder<TTable, TIndexName>) => Condition | boolean): this;
|
|
240
|
+
/**
|
|
241
|
+
* Specify columns to select
|
|
242
|
+
* @throws Error if selectCount() has already been called
|
|
243
|
+
*/
|
|
244
|
+
select<const TNewSelect extends SelectClause<TTable>>(columns: TNewSelect): FindBuilder<TTable, TNewSelect, TJoinOut$1>;
|
|
245
|
+
/**
|
|
246
|
+
* Select count instead of records
|
|
247
|
+
* @throws Error if select() has already been called
|
|
248
|
+
*/
|
|
249
|
+
selectCount(): this;
|
|
250
|
+
/**
|
|
251
|
+
* Order results by index in ascending or descending order
|
|
252
|
+
*/
|
|
253
|
+
orderByIndex<TIndexName extends ValidIndexName<TTable>>(indexName: TIndexName, direction: "asc" | "desc"): this;
|
|
254
|
+
/**
|
|
255
|
+
* Set cursor to continue pagination after this point (forward pagination)
|
|
256
|
+
* If a Cursor object is provided, its metadata will be used to set defaults for
|
|
257
|
+
* index, orderByIndex, and pageSize (if not explicitly set)
|
|
258
|
+
*/
|
|
259
|
+
after(cursor: Cursor | string): this;
|
|
260
|
+
/**
|
|
261
|
+
* Set cursor to continue pagination before this point (backward pagination)
|
|
262
|
+
* If a Cursor object is provided, its metadata will be used to set defaults for
|
|
263
|
+
* index, orderByIndex, and pageSize (if not explicitly set)
|
|
264
|
+
*/
|
|
265
|
+
before(cursor: Cursor | string): this;
|
|
266
|
+
/**
|
|
267
|
+
* Set the number of results per page
|
|
268
|
+
* @throws {RangeError} If size is not a positive integer
|
|
269
|
+
*/
|
|
270
|
+
pageSize(size: number): this;
|
|
271
|
+
/**
|
|
272
|
+
* Add joins to include related data
|
|
273
|
+
* Join where clauses are restricted to indexed columns only
|
|
274
|
+
*/
|
|
275
|
+
join<TNewJoinOut>(joinFn: (jb: IndexedJoinBuilder<TTable, {}>) => IndexedJoinBuilder<TTable, TNewJoinOut>): FindBuilder<TTable, TSelect$1, TNewJoinOut>;
|
|
276
|
+
/**
|
|
277
|
+
* @internal
|
|
278
|
+
*/
|
|
279
|
+
build(): {
|
|
280
|
+
type: "find";
|
|
281
|
+
indexName: string;
|
|
282
|
+
options: FindOptions<TTable, TSelect$1>;
|
|
283
|
+
} | {
|
|
284
|
+
type: "count";
|
|
285
|
+
indexName: string;
|
|
286
|
+
options: Pick<FindOptions<TTable>, "where" | "useIndex">;
|
|
287
|
+
};
|
|
288
|
+
}
|
|
289
|
+
/**
|
|
290
|
+
* Builder for update operations in Unit of Work
|
|
291
|
+
*/
|
|
292
|
+
declare class UpdateBuilder<TTable extends AnyTable> {
|
|
293
|
+
#private;
|
|
294
|
+
constructor(tableName: string, id: FragnoId | string);
|
|
295
|
+
/**
|
|
296
|
+
* Specify values to update
|
|
297
|
+
*/
|
|
298
|
+
set(values: TableToUpdateValues<TTable>): this;
|
|
299
|
+
/**
|
|
300
|
+
* Database timestamp helper for mutation values.
|
|
301
|
+
*/
|
|
302
|
+
now(): DbNow;
|
|
303
|
+
interval(input: DbIntervalInput): DbInterval;
|
|
304
|
+
/**
|
|
305
|
+
* Enable version checking for optimistic concurrency control
|
|
306
|
+
* @throws Error if the ID is just a string (no version available)
|
|
307
|
+
*/
|
|
308
|
+
check(): this;
|
|
309
|
+
/**
|
|
310
|
+
* @internal
|
|
311
|
+
*/
|
|
312
|
+
build(): {
|
|
313
|
+
id: FragnoId | string;
|
|
314
|
+
checkVersion: boolean;
|
|
315
|
+
set: TableToUpdateValues<TTable>;
|
|
316
|
+
};
|
|
317
|
+
}
|
|
318
|
+
/**
|
|
319
|
+
* Builder for delete operations in Unit of Work
|
|
320
|
+
*/
|
|
321
|
+
declare class DeleteBuilder {
|
|
322
|
+
#private;
|
|
323
|
+
constructor(tableName: string, id: FragnoId | string);
|
|
324
|
+
/**
|
|
325
|
+
* Enable version checking for optimistic concurrency control
|
|
326
|
+
* @throws Error if the ID is just a string (no version available)
|
|
327
|
+
*/
|
|
328
|
+
check(): this;
|
|
329
|
+
/**
|
|
330
|
+
* @internal
|
|
331
|
+
*/
|
|
332
|
+
build(): {
|
|
333
|
+
id: FragnoId | string;
|
|
334
|
+
checkVersion: boolean;
|
|
335
|
+
};
|
|
336
|
+
}
|
|
337
|
+
/**
|
|
338
|
+
* Builder for join operations in Unit of Work
|
|
339
|
+
* Similar to FindBuilder but tailored for joins (no cursor pagination, no count mode)
|
|
340
|
+
*/
|
|
341
|
+
declare class JoinFindBuilder<TTable extends AnyTable, TSelect$1 extends SelectClause<TTable> = true, TJoinOut$1 = {}> {
|
|
342
|
+
#private;
|
|
343
|
+
constructor(tableName: string, table: TTable);
|
|
344
|
+
/**
|
|
345
|
+
* Specify which index to use and optionally filter the results
|
|
346
|
+
*/
|
|
347
|
+
whereIndex<TIndexName extends ValidIndexName<TTable>>(indexName: TIndexName, condition?: (eb: IndexSpecificConditionBuilder<TTable, TIndexName>) => Condition | boolean): this;
|
|
348
|
+
/**
|
|
349
|
+
* Specify columns to select
|
|
350
|
+
*/
|
|
351
|
+
select<const TNewSelect extends SelectClause<TTable>>(columns: TNewSelect): JoinFindBuilder<TTable, TNewSelect, TJoinOut$1>;
|
|
352
|
+
/**
|
|
353
|
+
* Order results by index in ascending or descending order
|
|
354
|
+
*/
|
|
355
|
+
orderByIndex<TIndexName extends ValidIndexName<TTable>>(indexName: TIndexName, direction: "asc" | "desc"): this;
|
|
356
|
+
/**
|
|
357
|
+
* Set the number of results to return
|
|
358
|
+
* @throws {RangeError} If size is not a positive integer
|
|
359
|
+
*/
|
|
360
|
+
pageSize(size: number): this;
|
|
361
|
+
/**
|
|
362
|
+
* Add joins to include related data
|
|
363
|
+
* Join where clauses are restricted to indexed columns only
|
|
364
|
+
*/
|
|
365
|
+
join<TNewJoinOut>(joinFn: (jb: IndexedJoinBuilder<TTable, {}>) => IndexedJoinBuilder<TTable, TNewJoinOut>): JoinFindBuilder<TTable, TSelect$1, TJoinOut$1 & TNewJoinOut>;
|
|
366
|
+
/**
|
|
367
|
+
* @internal
|
|
368
|
+
*/
|
|
369
|
+
build(): {
|
|
370
|
+
indexName: string | undefined;
|
|
371
|
+
select: TSelect$1 | undefined;
|
|
372
|
+
where: ((eb: IndexedConditionBuilder<TTable>) => Condition | boolean) | undefined;
|
|
373
|
+
orderByIndex: {
|
|
374
|
+
indexName: string;
|
|
375
|
+
direction: "asc" | "desc";
|
|
376
|
+
} | undefined;
|
|
377
|
+
pageSize: number | undefined;
|
|
378
|
+
joins: CompiledJoin[] | undefined;
|
|
379
|
+
};
|
|
380
|
+
}
|
|
381
|
+
interface MapRelationType<T> {
|
|
382
|
+
one: RemoveEmptyObject<T> | null;
|
|
383
|
+
many: RemoveEmptyObject<T>[];
|
|
384
|
+
}
|
|
385
|
+
/**
|
|
386
|
+
* Join builder with indexed-only where clauses for Unit of Work
|
|
387
|
+
* TJoinOut accumulates the types of all joined relations
|
|
388
|
+
*/
|
|
389
|
+
type IndexedJoinBuilder<TTable extends AnyTable, TJoinOut$1> = { [K in keyof TTable["relations"]]: TTable["relations"][K] extends Relation<infer TRelationType, infer TTargetTable> ? <TBuilderFn extends (builder: JoinFindBuilder<TTable["relations"][K]["table"]>) => unknown = (builder: JoinFindBuilder<TTable["relations"][K]["table"]>) => JoinFindBuilder<TTable["relations"][K]["table"]>>(builderFn?: TBuilderFn) => IndexedJoinBuilder<TTable, TJoinOut$1 & { [P in K]: MapRelationType<SelectResult<TTargetTable, ExtractJoinBuilderOut<ReturnType<TBuilderFn>>, ExtractJoinBuilderSelect<ReturnType<TBuilderFn>>>>[TRelationType] }> : never };
|
|
390
|
+
/**
|
|
391
|
+
* Full Unit of Work interface with all operations including execution.
|
|
392
|
+
* This allows UOW instances to be passed between different contexts that use different schemas.
|
|
393
|
+
*/
|
|
394
|
+
interface IUnitOfWork {
|
|
395
|
+
readonly state: UOWState;
|
|
396
|
+
readonly name: string | undefined;
|
|
397
|
+
readonly idempotencyKey: string;
|
|
398
|
+
readonly retrievalPhase: Promise<unknown[]>;
|
|
399
|
+
readonly mutationPhase: Promise<void>;
|
|
400
|
+
executeRetrieve(): Promise<unknown[]>;
|
|
401
|
+
executeMutations(): Promise<{
|
|
402
|
+
success: boolean;
|
|
403
|
+
}>;
|
|
404
|
+
getRetrievalOperations(): ReadonlyArray<RetrievalOperation<AnySchema>>;
|
|
405
|
+
getMutationOperations(): ReadonlyArray<MutationOperation<AnySchema>>;
|
|
406
|
+
getCreatedIds(): FragnoId[];
|
|
407
|
+
restrict(options?: {
|
|
408
|
+
readyFor?: "mutation" | "retrieval" | "none";
|
|
409
|
+
}): IUnitOfWork;
|
|
410
|
+
signalReadyForRetrieval(): void;
|
|
411
|
+
signalReadyForMutation(): void;
|
|
412
|
+
reset(): void;
|
|
413
|
+
forSchema<TOtherSchema extends AnySchema, TOtherHooks extends HooksMap = {}>(schema: TOtherSchema, hooks?: TOtherHooks): TypedUnitOfWork<TOtherSchema, [], any, TOtherHooks>;
|
|
414
|
+
registerSchema(schema: AnySchema, namespace: string | null): void;
|
|
415
|
+
triggerHook(namespace: string, hookName: string, payload: unknown, options?: TriggerHookOptions): void;
|
|
416
|
+
getTriggeredHooks(): readonly TriggeredHook[];
|
|
417
|
+
}
|
|
418
|
+
/**
|
|
419
|
+
* Restricted UOW interface without execute methods.
|
|
420
|
+
* Useful when you want to allow building operations but not executing them,
|
|
421
|
+
* to prevent deadlocks or enforce execution control at a higher level.
|
|
422
|
+
*
|
|
423
|
+
* Note: This is just a marker interface. Restriction is enforced by the UnitOfWork class itself.
|
|
424
|
+
*/
|
|
425
|
+
interface IUnitOfWorkRestricted extends Omit<IUnitOfWork, "executeRetrieve" | "executeMutations"> {}
|
|
426
|
+
type UOWInstrumentationPhase = "beforeRetrieve" | "afterRetrieve" | "beforeMutate" | "afterMutate";
|
|
427
|
+
type UOWInstrumentationInjection = {
|
|
428
|
+
type: "conflict";
|
|
429
|
+
reason?: string;
|
|
430
|
+
} | {
|
|
431
|
+
type: "error";
|
|
432
|
+
error: Error;
|
|
433
|
+
};
|
|
434
|
+
type UOWInstrumentationContext = {
|
|
435
|
+
phase: UOWInstrumentationPhase;
|
|
436
|
+
uowName?: string;
|
|
437
|
+
idempotencyKey: string;
|
|
438
|
+
retrievalOpsCount: number;
|
|
439
|
+
mutationOpsCount: number;
|
|
440
|
+
uow: IUnitOfWork;
|
|
441
|
+
};
|
|
442
|
+
type UOWInstrumentation = {
|
|
443
|
+
beforeRetrieve?: (ctx: UOWInstrumentationContext) => void | Promise<void> | UOWInstrumentationInjection;
|
|
444
|
+
afterRetrieve?: (ctx: UOWInstrumentationContext) => void | Promise<void> | UOWInstrumentationInjection;
|
|
445
|
+
beforeMutate?: (ctx: UOWInstrumentationContext) => void | Promise<void> | UOWInstrumentationInjection;
|
|
446
|
+
afterMutate?: (ctx: UOWInstrumentationContext) => void | Promise<void> | UOWInstrumentationInjection;
|
|
447
|
+
};
|
|
448
|
+
type UOWInstrumentationFinalizer = {
|
|
449
|
+
afterRetrieve?: (ctx: UOWInstrumentationContext) => void | Promise<void>;
|
|
450
|
+
afterMutate?: (ctx: UOWInstrumentationContext) => void | Promise<void>;
|
|
451
|
+
};
|
|
452
|
+
declare function createUnitOfWork(compiler: UOWCompiler<unknown>, executor: UOWExecutor<unknown, unknown>, decoder: UOWDecoder<unknown>, schemaNamespaceMap?: WeakMap<AnySchema, string | null>, name?: string): UnitOfWork;
|
|
453
|
+
interface UnitOfWorkConfig {
|
|
454
|
+
dryRun?: boolean;
|
|
455
|
+
onQuery?: (query: unknown) => void;
|
|
456
|
+
idempotencyKey?: string;
|
|
457
|
+
instrumentation?: UOWInstrumentation;
|
|
458
|
+
instrumentationFinalizer?: UOWInstrumentationFinalizer;
|
|
459
|
+
}
|
|
460
|
+
/**
|
|
461
|
+
* Unit of Work implementation with optimistic concurrency control
|
|
462
|
+
*
|
|
463
|
+
* UOW has two phases:
|
|
464
|
+
* 1. Retrieval phase: Read operations to fetch entities with their versions
|
|
465
|
+
* 2. Mutation phase: Write operations that check versions before committing
|
|
466
|
+
*
|
|
467
|
+
* This is the untyped base storage. Use TypedUnitOfWork for type-safe operations.
|
|
468
|
+
*
|
|
469
|
+
* @example
|
|
470
|
+
* ```ts
|
|
471
|
+
* const uow = queryEngine.createUnitOfWork("update-user-balance");
|
|
472
|
+
* const typedUow = uow.forSchema(mySchema);
|
|
473
|
+
*
|
|
474
|
+
* // Retrieval phase
|
|
475
|
+
* typedUow.find("users", (b) => b.whereIndex("primary", (eb) => eb("id", "=", userId)));
|
|
476
|
+
*
|
|
477
|
+
* // Execute retrieval and transition to mutation phase
|
|
478
|
+
* const [users] = await uow.executeRetrieve();
|
|
479
|
+
*
|
|
480
|
+
* // Mutation phase with version check
|
|
481
|
+
* const user = users[0];
|
|
482
|
+
* typedUow.update("users", user.id, (b) => b.set({ balance: newBalance }).check());
|
|
483
|
+
*
|
|
484
|
+
* // Execute mutations
|
|
485
|
+
* const { success } = await uow.executeMutations();
|
|
486
|
+
* if (!success) {
|
|
487
|
+
* // Handle version conflict
|
|
488
|
+
* }
|
|
489
|
+
* ```
|
|
490
|
+
*/
|
|
491
|
+
declare class UnitOfWork<const TRawInput = unknown> implements IUnitOfWork {
|
|
492
|
+
#private;
|
|
493
|
+
constructor(compiler: UOWCompiler<unknown>, executor: UOWExecutor<unknown, TRawInput>, decoder: UOWDecoder<TRawInput>, name?: string, config?: UnitOfWorkConfig, schemaNamespaceMap?: WeakMap<AnySchema, string | null>);
|
|
494
|
+
/**
|
|
495
|
+
* Register a schema with its namespace for cross-fragment operations.
|
|
496
|
+
* This is used for internal fragments like hooks that need to create
|
|
497
|
+
* records in a different schema during the same transaction.
|
|
498
|
+
*/
|
|
499
|
+
registerSchema(schema: AnySchema, namespace: string | null): void;
|
|
500
|
+
/**
|
|
501
|
+
* Get a schema-specific typed view of this UOW for type-safe operations.
|
|
502
|
+
* Returns a wrapper that provides typed operations for the given schema.
|
|
503
|
+
* The namespace is automatically resolved from the schema-namespace map.
|
|
504
|
+
* The optional hooks parameter is for type inference only - pass your hooks map
|
|
505
|
+
* to get proper typing for triggerHook. The value is not used at runtime.
|
|
506
|
+
*/
|
|
507
|
+
forSchema<TOtherSchema extends AnySchema, TOtherHooks extends HooksMap = {}>(schema: TOtherSchema, _hooks?: TOtherHooks): TypedUnitOfWork<TOtherSchema, [], TRawInput, TOtherHooks>;
|
|
508
|
+
/**
|
|
509
|
+
* Create a restricted child UOW that cannot execute phases.
|
|
510
|
+
* The child shares the same operation storage but must signal readiness
|
|
511
|
+
* before the parent can execute each phase.
|
|
512
|
+
*
|
|
513
|
+
* @param options.readyFor - Controls automatic readiness signaling:
|
|
514
|
+
* - "mutation" (default): Signals ready for both retrieval and mutation immediately
|
|
515
|
+
* - "retrieval": Signals ready for retrieval only
|
|
516
|
+
* - "none": No automatic signaling, caller must signal manually
|
|
517
|
+
*/
|
|
518
|
+
restrict(options?: {
|
|
519
|
+
readyFor?: "mutation" | "retrieval" | "none";
|
|
520
|
+
}): UnitOfWork<TRawInput>;
|
|
521
|
+
/**
|
|
522
|
+
* Signal that this child is ready for retrieval phase execution.
|
|
523
|
+
* Only valid for restricted (child) UOWs.
|
|
524
|
+
*/
|
|
525
|
+
signalReadyForRetrieval(): void;
|
|
526
|
+
/**
|
|
527
|
+
* Signal that this child is ready for mutation phase execution.
|
|
528
|
+
* Only valid for restricted (child) UOWs.
|
|
529
|
+
*/
|
|
530
|
+
signalReadyForMutation(): void;
|
|
531
|
+
/**
|
|
532
|
+
* Reset the UOW to initial state for retry support.
|
|
533
|
+
* Clears operations, resets state, and resets phase promises.
|
|
534
|
+
*/
|
|
535
|
+
reset(): void;
|
|
536
|
+
/**
|
|
537
|
+
* Trigger a hook to be executed after the transaction commits.
|
|
538
|
+
*/
|
|
539
|
+
triggerHook(namespace: string, hookName: string, payload: unknown, options?: TriggerHookOptions): void;
|
|
540
|
+
/**
|
|
541
|
+
* Get all triggered hooks for this UOW.
|
|
542
|
+
*/
|
|
543
|
+
getTriggeredHooks(): ReadonlyArray<TriggeredHook>;
|
|
544
|
+
get state(): UOWState;
|
|
545
|
+
enableReadTracking(): void;
|
|
546
|
+
get readTrackingEnabled(): boolean;
|
|
547
|
+
get name(): string | undefined;
|
|
548
|
+
get idempotencyKey(): string;
|
|
549
|
+
/**
|
|
550
|
+
* Promise that resolves when the retrieval phase is executed
|
|
551
|
+
* Service methods can await this to coordinate multi-phase logic
|
|
552
|
+
*/
|
|
553
|
+
get retrievalPhase(): Promise<unknown[]>;
|
|
554
|
+
/**
|
|
555
|
+
* Promise that resolves when the mutation phase is executed
|
|
556
|
+
* Service methods can await this to coordinate multi-phase logic
|
|
557
|
+
*/
|
|
558
|
+
get mutationPhase(): Promise<void>;
|
|
559
|
+
/**
|
|
560
|
+
* Execute the retrieval phase and transition to mutation phase
|
|
561
|
+
* Returns all results from find operations
|
|
562
|
+
*/
|
|
563
|
+
executeRetrieve(): Promise<unknown[]>;
|
|
564
|
+
/**
|
|
565
|
+
* Execute the mutation phase
|
|
566
|
+
* Returns success flag indicating if mutations completed without conflicts
|
|
567
|
+
*/
|
|
568
|
+
executeMutations(): Promise<{
|
|
569
|
+
success: boolean;
|
|
570
|
+
}>;
|
|
571
|
+
/**
|
|
572
|
+
* Get the retrieval operations (for inspection/debugging)
|
|
573
|
+
*/
|
|
574
|
+
getRetrievalOperations(): ReadonlyArray<RetrievalOperation<AnySchema>>;
|
|
575
|
+
/**
|
|
576
|
+
* Get the mutation operations (for inspection/debugging)
|
|
577
|
+
*/
|
|
578
|
+
getMutationOperations(): ReadonlyArray<MutationOperation<AnySchema>>;
|
|
579
|
+
/**
|
|
580
|
+
* @internal
|
|
581
|
+
* Add a retrieval operation (used by TypedUnitOfWork)
|
|
582
|
+
*/
|
|
583
|
+
addRetrievalOperation(op: RetrievalOperation<AnySchema>): number;
|
|
584
|
+
/**
|
|
585
|
+
* @internal
|
|
586
|
+
* Add a mutation operation (used by TypedUnitOfWork)
|
|
587
|
+
*/
|
|
588
|
+
addMutationOperation(op: MutationOperation<AnySchema>): void;
|
|
589
|
+
/**
|
|
590
|
+
* Get the IDs of created entities after executeMutations() has been called.
|
|
591
|
+
* Returns FragnoId objects with external IDs (always available) and internal IDs
|
|
592
|
+
* (available when database supports RETURNING).
|
|
593
|
+
*
|
|
594
|
+
* @throws Error if called before executeMutations()
|
|
595
|
+
* @returns Array of FragnoIds in the same order as create() calls
|
|
596
|
+
*/
|
|
597
|
+
getCreatedIds(): FragnoId[];
|
|
598
|
+
/**
|
|
599
|
+
* @internal
|
|
600
|
+
* Compile the unit of work to executable queries for testing
|
|
601
|
+
*/
|
|
602
|
+
compile<TOutput>(compiler: UOWCompiler<TOutput>): {
|
|
603
|
+
name?: string;
|
|
604
|
+
retrievalBatch: TOutput[];
|
|
605
|
+
mutationBatch: CompiledMutation<TOutput>[];
|
|
606
|
+
};
|
|
607
|
+
}
|
|
608
|
+
/**
|
|
609
|
+
* A typed facade around a UnitOfWork that provides type-safe operations for a specific schema.
|
|
610
|
+
* All operations are stored in the underlying UOW, but this facade ensures type safety and
|
|
611
|
+
* filters retrieval results to only include operations added through this facade.
|
|
612
|
+
*/
|
|
613
|
+
declare class TypedUnitOfWork<const TSchema extends AnySchema, const TRetrievalResults extends unknown[] = [], const TRawInput = unknown, const THooks extends HooksMap = {}> {
|
|
614
|
+
#private;
|
|
615
|
+
constructor(schema: TSchema, namespace: string | null | undefined, uow: UnitOfWork<TRawInput>);
|
|
616
|
+
/**
|
|
617
|
+
* Type-only access to retrieval results for this typed UOW.
|
|
618
|
+
*/
|
|
619
|
+
get $results(): Prettify<TRetrievalResults>;
|
|
620
|
+
get schema(): TSchema;
|
|
621
|
+
get name(): string | undefined;
|
|
622
|
+
get idempotencyKey(): string;
|
|
623
|
+
get state(): UOWState;
|
|
624
|
+
get retrievalPhase(): Promise<TRetrievalResults>;
|
|
625
|
+
get mutationPhase(): Promise<void>;
|
|
626
|
+
getRetrievalOperations(): readonly RetrievalOperation<AnySchema, AnyTable>[];
|
|
627
|
+
getMutationOperations(): readonly MutationOperation<AnySchema, AnyTable>[];
|
|
628
|
+
getCreatedIds(): FragnoId[];
|
|
629
|
+
executeRetrieve(): Promise<TRetrievalResults>;
|
|
630
|
+
executeMutations(): Promise<{
|
|
631
|
+
success: boolean;
|
|
632
|
+
}>;
|
|
633
|
+
restrict(options?: {
|
|
634
|
+
readyFor?: "mutation" | "retrieval" | "none";
|
|
635
|
+
}): IUnitOfWork;
|
|
636
|
+
signalReadyForRetrieval(): void;
|
|
637
|
+
signalReadyForMutation(): void;
|
|
638
|
+
reset(): void;
|
|
639
|
+
forSchema<TOtherSchema extends AnySchema, TOtherHooks extends HooksMap = {}>(schema: TOtherSchema, hooks?: TOtherHooks): TypedUnitOfWork<TOtherSchema, [], TRawInput, TOtherHooks>;
|
|
640
|
+
/**
|
|
641
|
+
* Database timestamp helper for inserts.
|
|
642
|
+
*/
|
|
643
|
+
now(): DbNow;
|
|
644
|
+
/**
|
|
645
|
+
* Build a database interval for use with now().plus(...).
|
|
646
|
+
*/
|
|
647
|
+
interval(input: DbIntervalInput): DbInterval;
|
|
648
|
+
registerSchema(schema: AnySchema, namespace: string | null): void;
|
|
649
|
+
compile<TOutput>(compiler: UOWCompiler<TOutput>): {
|
|
650
|
+
name?: string;
|
|
651
|
+
retrievalBatch: TOutput[];
|
|
652
|
+
mutationBatch: CompiledMutation<TOutput>[];
|
|
653
|
+
};
|
|
654
|
+
find<TTableName extends keyof TSchema["tables"] & string, const TBuilderResult>(tableName: TTableName, builderFn: (builder: Omit<FindBuilder<TSchema["tables"][TTableName]>, "build">) => TBuilderResult): TypedUnitOfWork<TSchema, [...TRetrievalResults, SelectResult<TSchema["tables"][TTableName], ExtractJoinOut<TBuilderResult>, Extract<ExtractSelect<TBuilderResult>, SelectClause<TSchema["tables"][TTableName]>>>[]], TRawInput, THooks>;
|
|
655
|
+
find<TTableName extends keyof TSchema["tables"] & string>(tableName: TTableName): TypedUnitOfWork<TSchema, [...TRetrievalResults, SelectResult<TSchema["tables"][TTableName], {}, true>[]], TRawInput, THooks>;
|
|
656
|
+
findFirst<TTableName extends keyof TSchema["tables"] & string, const TBuilderResult>(tableName: TTableName, builderFn: (builder: Omit<FindBuilder<TSchema["tables"][TTableName]>, "build">) => TBuilderResult): TypedUnitOfWork<TSchema, [...TRetrievalResults, SelectResult<TSchema["tables"][TTableName], ExtractJoinOut<TBuilderResult>, Extract<ExtractSelect<TBuilderResult>, SelectClause<TSchema["tables"][TTableName]>>> | null], TRawInput, THooks>;
|
|
657
|
+
findFirst<TTableName extends keyof TSchema["tables"] & string>(tableName: TTableName): TypedUnitOfWork<TSchema, [...TRetrievalResults, SelectResult<TSchema["tables"][TTableName], {}, true> | null], TRawInput, THooks>;
|
|
658
|
+
findWithCursor<TTableName extends keyof TSchema["tables"] & string, const TBuilderResult>(tableName: TTableName, builderFn: (builder: Omit<FindBuilder<TSchema["tables"][TTableName]>, "build">) => TBuilderResult): TypedUnitOfWork<TSchema, [...TRetrievalResults, CursorResult<SelectResult<TSchema["tables"][TTableName], ExtractJoinOut<TBuilderResult>, Extract<ExtractSelect<TBuilderResult>, SelectClause<TSchema["tables"][TTableName]>>>>], TRawInput, THooks>;
|
|
659
|
+
/**
|
|
660
|
+
* Generate a new ID for a table without creating a record.
|
|
661
|
+
* This is useful when you need to reference an ID before actually creating the record,
|
|
662
|
+
* or when you need to pass the ID to external services.
|
|
663
|
+
*
|
|
664
|
+
* @example
|
|
665
|
+
* ```ts
|
|
666
|
+
* const userId = uow.generateId("users");
|
|
667
|
+
* // Use userId in related records or pass to external services
|
|
668
|
+
* uow.create("users", { id: userId, name: "John" });
|
|
669
|
+
* ```
|
|
670
|
+
*/
|
|
671
|
+
generateId<TableName extends keyof TSchema["tables"] & string>(tableName: TableName): FragnoId;
|
|
672
|
+
create<TableName extends keyof TSchema["tables"] & string>(tableName: TableName, values: TableToInsertValues<TSchema["tables"][TableName]>): FragnoId;
|
|
673
|
+
update<TableName extends keyof TSchema["tables"] & string>(tableName: TableName, id: FragnoId | string, builderFn: (builder: Omit<UpdateBuilder<TSchema["tables"][TableName]>, "build">) => Omit<UpdateBuilder<TSchema["tables"][TableName]>, "build"> | void): void;
|
|
674
|
+
delete<TableName extends keyof TSchema["tables"] & string>(tableName: TableName, id: FragnoId | string, builderFn?: (builder: Omit<DeleteBuilder, "build">) => Omit<DeleteBuilder, "build"> | void): void;
|
|
675
|
+
/**
|
|
676
|
+
* Check that a record's version hasn't changed since retrieval.
|
|
677
|
+
* This is useful for ensuring related records remain unchanged during a transaction.
|
|
678
|
+
*
|
|
679
|
+
* @param tableName - The table name
|
|
680
|
+
* @param id - The FragnoId with version information (string IDs are not allowed)
|
|
681
|
+
* @throws Error if the ID is a string without version information
|
|
682
|
+
*
|
|
683
|
+
* @example
|
|
684
|
+
* ```ts
|
|
685
|
+
* // Ensure both accounts haven't changed before creating a transfer
|
|
686
|
+
* uow.check("accounts", fromAccount.id);
|
|
687
|
+
* uow.check("accounts", toAccount.id);
|
|
688
|
+
* uow.create("transactions", { fromAccountId, toAccountId, amount });
|
|
689
|
+
* ```
|
|
690
|
+
*/
|
|
691
|
+
check<TableName extends keyof TSchema["tables"] & string>(tableName: TableName, id: FragnoId): void;
|
|
692
|
+
get $hooks(): THooks;
|
|
693
|
+
get namespace(): string | null | undefined;
|
|
694
|
+
/**
|
|
695
|
+
* Trigger a hook to be executed after the transaction commits.
|
|
696
|
+
* The namespace is automatically injected from this typed view's schema registration.
|
|
697
|
+
*/
|
|
698
|
+
triggerHook<K$1 extends keyof THooks & string>(hookName: K$1, payload: HookPayload<THooks[K$1]>, options?: TriggerHookOptions): void;
|
|
699
|
+
getTriggeredHooks(): ReadonlyArray<TriggeredHook>;
|
|
700
|
+
}
|
|
701
|
+
//#endregion
|
|
702
|
+
export { DeleteBuilder, FindBuilder, IUnitOfWork, IUnitOfWorkRestricted, TypedUnitOfWork, UOWCompiler, UOWDecoder, UOWExecutor, UnitOfWork, UpdateBuilder, UpdateManyBuilder, createUnitOfWork };
|
|
703
|
+
//# sourceMappingURL=unit-of-work.d.ts.map
|