@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,507 @@
|
|
|
1
|
+
import { ExponentialBackoffRetryPolicy, NoRetryPolicy } from "./retry-policy.js";
|
|
2
|
+
|
|
3
|
+
//#region src/query/unit-of-work/execute-unit-of-work.ts
|
|
4
|
+
/**
|
|
5
|
+
* Symbol to identify TxResult objects
|
|
6
|
+
*/
|
|
7
|
+
const TX_RESULT_BRAND = Symbol("TxResult");
|
|
8
|
+
/**
|
|
9
|
+
* Create a TxResult for service context.
|
|
10
|
+
* Schedules retrieve operations on the baseUow and returns a TxResult with callbacks stored.
|
|
11
|
+
* @internal Used by ServiceTxBuilder.build()
|
|
12
|
+
*/
|
|
13
|
+
function createServiceTx(schema, callbacks, baseUow) {
|
|
14
|
+
const { promise: retrievePhase, resolve: resolveRetrievePhase, reject: rejectRetrievePhase } = Promise.withResolvers();
|
|
15
|
+
const restrictedUow = baseUow.restrict({ readyFor: "none" });
|
|
16
|
+
let serviceCalls;
|
|
17
|
+
try {
|
|
18
|
+
if (callbacks.serviceCalls) serviceCalls = callbacks.serviceCalls();
|
|
19
|
+
} catch (error) {
|
|
20
|
+
restrictedUow.signalReadyForRetrieval();
|
|
21
|
+
restrictedUow.signalReadyForMutation();
|
|
22
|
+
retrievePhase.catch(() => {});
|
|
23
|
+
rejectRetrievePhase(error);
|
|
24
|
+
throw error;
|
|
25
|
+
}
|
|
26
|
+
let typedUow;
|
|
27
|
+
try {
|
|
28
|
+
if (schema && callbacks.retrieve) {
|
|
29
|
+
const emptyUow = restrictedUow.forSchema(schema);
|
|
30
|
+
typedUow = callbacks.retrieve(emptyUow);
|
|
31
|
+
}
|
|
32
|
+
} catch (error) {
|
|
33
|
+
restrictedUow.signalReadyForRetrieval();
|
|
34
|
+
restrictedUow.signalReadyForMutation();
|
|
35
|
+
retrievePhase.catch(() => {});
|
|
36
|
+
rejectRetrievePhase(error);
|
|
37
|
+
throw error;
|
|
38
|
+
}
|
|
39
|
+
restrictedUow.signalReadyForRetrieval();
|
|
40
|
+
if (typedUow) typedUow.retrievalPhase.then((results) => resolveRetrievePhase(results), (error) => rejectRetrievePhase(error));
|
|
41
|
+
else if (!callbacks.retrieve) resolveRetrievePhase([]);
|
|
42
|
+
const internal = {
|
|
43
|
+
schema,
|
|
44
|
+
callbacks,
|
|
45
|
+
typedUow,
|
|
46
|
+
restrictedUow,
|
|
47
|
+
retrievePhase,
|
|
48
|
+
resolveRetrievePhase,
|
|
49
|
+
rejectRetrievePhase,
|
|
50
|
+
retrieveSuccessResult: void 0,
|
|
51
|
+
mutateResult: void 0,
|
|
52
|
+
finalResult: void 0,
|
|
53
|
+
serviceCalls
|
|
54
|
+
};
|
|
55
|
+
return {
|
|
56
|
+
[TX_RESULT_BRAND]: true,
|
|
57
|
+
_internal: internal
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Recursively collect all TxResults from a service call tree.
|
|
62
|
+
* Returns them in a flat array in dependency order (serviceCalls before their dependents).
|
|
63
|
+
* Skips undefined values (which can occur with optional service patterns like
|
|
64
|
+
* optionalService?.method()).
|
|
65
|
+
*/
|
|
66
|
+
function collectAllTxResults(txResults) {
|
|
67
|
+
const collected = [];
|
|
68
|
+
const seen = /* @__PURE__ */ new Set();
|
|
69
|
+
function collect(txResult) {
|
|
70
|
+
if (txResult === void 0) return;
|
|
71
|
+
if (seen.has(txResult)) return;
|
|
72
|
+
seen.add(txResult);
|
|
73
|
+
const serviceCalls = txResult._internal.serviceCalls;
|
|
74
|
+
if (serviceCalls) for (const serviceCall of serviceCalls) collect(serviceCall);
|
|
75
|
+
collected.push(txResult);
|
|
76
|
+
}
|
|
77
|
+
for (const txResult of txResults) collect(txResult);
|
|
78
|
+
return collected;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Execute a single TxResult's callbacks after retrieve phase completes.
|
|
82
|
+
* This processes retrieveSuccess, mutate, and success callbacks in order.
|
|
83
|
+
*/
|
|
84
|
+
async function processTxResultAfterRetrieve(txResult, baseUow) {
|
|
85
|
+
const internal = txResult._internal;
|
|
86
|
+
const callbacks = internal.callbacks;
|
|
87
|
+
const retrieveResults = await internal.retrievePhase;
|
|
88
|
+
const serviceResults = [];
|
|
89
|
+
if (internal.serviceCalls) for (const serviceCall of internal.serviceCalls) {
|
|
90
|
+
if (serviceCall === void 0) {
|
|
91
|
+
serviceResults.push(void 0);
|
|
92
|
+
continue;
|
|
93
|
+
}
|
|
94
|
+
const serviceCallInternal = serviceCall._internal;
|
|
95
|
+
if (serviceCallInternal.retrieveSuccessResult !== void 0 && !(Array.isArray(serviceCallInternal.retrieveSuccessResult) && serviceCallInternal.retrieveSuccessResult.length === 0 && serviceCallInternal.callbacks.mutate)) serviceResults.push(serviceCallInternal.retrieveSuccessResult);
|
|
96
|
+
else if (serviceCallInternal.mutateResult !== void 0) serviceResults.push(serviceCallInternal.mutateResult);
|
|
97
|
+
else serviceResults.push(serviceCallInternal.retrieveSuccessResult);
|
|
98
|
+
}
|
|
99
|
+
if (callbacks.retrieveSuccess) internal.retrieveSuccessResult = callbacks.retrieveSuccess(retrieveResults, serviceResults);
|
|
100
|
+
else internal.retrieveSuccessResult = retrieveResults;
|
|
101
|
+
if (callbacks.mutate) {
|
|
102
|
+
const mutateCtx = {
|
|
103
|
+
uow: internal.schema ? baseUow.forSchema(internal.schema) : void 0,
|
|
104
|
+
retrieveResult: internal.retrieveSuccessResult,
|
|
105
|
+
serviceIntermediateResult: serviceResults
|
|
106
|
+
};
|
|
107
|
+
internal.mutateResult = callbacks.mutate(mutateCtx);
|
|
108
|
+
}
|
|
109
|
+
if (internal.typedUow) internal.typedUow.signalReadyForMutation();
|
|
110
|
+
else internal.restrictedUow.signalReadyForMutation();
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Execute a single TxResult's success callback after mutations complete.
|
|
114
|
+
*/
|
|
115
|
+
async function processTxResultAfterMutate(txResult) {
|
|
116
|
+
const internal = txResult._internal;
|
|
117
|
+
const callbacks = internal.callbacks;
|
|
118
|
+
const serviceIntermediateResults = [];
|
|
119
|
+
const serviceFinalResults = [];
|
|
120
|
+
if (internal.serviceCalls) for (const serviceCall of internal.serviceCalls) {
|
|
121
|
+
if (serviceCall === void 0) {
|
|
122
|
+
serviceIntermediateResults.push(void 0);
|
|
123
|
+
serviceFinalResults.push(void 0);
|
|
124
|
+
continue;
|
|
125
|
+
}
|
|
126
|
+
const serviceCallInternal = serviceCall._internal;
|
|
127
|
+
if (serviceCallInternal.retrieveSuccessResult !== void 0 && !(Array.isArray(serviceCallInternal.retrieveSuccessResult) && serviceCallInternal.retrieveSuccessResult.length === 0 && serviceCallInternal.callbacks.mutate)) serviceIntermediateResults.push(serviceCallInternal.retrieveSuccessResult);
|
|
128
|
+
else if (serviceCallInternal.mutateResult !== void 0) serviceIntermediateResults.push(serviceCallInternal.mutateResult);
|
|
129
|
+
else serviceIntermediateResults.push(serviceCallInternal.retrieveSuccessResult);
|
|
130
|
+
serviceFinalResults.push(serviceCallInternal.finalResult);
|
|
131
|
+
}
|
|
132
|
+
if (callbacks.success) {
|
|
133
|
+
const successCtx = {
|
|
134
|
+
retrieveResult: internal.retrieveSuccessResult,
|
|
135
|
+
mutateResult: internal.mutateResult,
|
|
136
|
+
serviceResult: serviceFinalResults,
|
|
137
|
+
serviceIntermediateResult: serviceIntermediateResults
|
|
138
|
+
};
|
|
139
|
+
internal.finalResult = callbacks.success(successCtx);
|
|
140
|
+
} else if (callbacks.mutate) internal.finalResult = await awaitPromisesInObject(internal.mutateResult);
|
|
141
|
+
else if (callbacks.retrieveSuccess || callbacks.retrieve) internal.finalResult = internal.retrieveSuccessResult;
|
|
142
|
+
else internal.finalResult = serviceFinalResults;
|
|
143
|
+
return internal.finalResult;
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Execute a transaction with the unified TxResult pattern.
|
|
147
|
+
*
|
|
148
|
+
* This is the handler-level function that actually executes TxResults with retry support.
|
|
149
|
+
*
|
|
150
|
+
* @param callbacks - Transaction callbacks (serviceCalls, retrieve, retrieveSuccess, mutate, success)
|
|
151
|
+
* @param options - Configuration including UOW factory, retry policy, and abort signal
|
|
152
|
+
* @returns Promise resolving to the result determined by return type priority
|
|
153
|
+
*
|
|
154
|
+
* @example
|
|
155
|
+
* ```ts
|
|
156
|
+
* // Simple retrieve + transform
|
|
157
|
+
* const user = await executeTx({
|
|
158
|
+
* retrieve: (ctx) => ctx.forSchema(usersSchema).find("users", ...),
|
|
159
|
+
* retrieveSuccess: ([users]) => users[0] ?? null,
|
|
160
|
+
* }, { createUnitOfWork });
|
|
161
|
+
* @internal Used by HandlerTxBuilder.execute()
|
|
162
|
+
*/
|
|
163
|
+
async function executeTx(callbacks, options) {
|
|
164
|
+
const signal = options.signal;
|
|
165
|
+
let attempt = 0;
|
|
166
|
+
while (true) {
|
|
167
|
+
if (signal?.aborted) throw new Error("Transaction execution aborted");
|
|
168
|
+
let retryPolicy;
|
|
169
|
+
try {
|
|
170
|
+
const baseUow = options.createUnitOfWork();
|
|
171
|
+
if (options.onAfterRetrieve) baseUow.enableReadTracking?.();
|
|
172
|
+
const context = {
|
|
173
|
+
forSchema: (schema, hooks) => {
|
|
174
|
+
return baseUow.forSchema(schema, hooks);
|
|
175
|
+
},
|
|
176
|
+
idempotencyKey: baseUow.idempotencyKey,
|
|
177
|
+
currentAttempt: attempt
|
|
178
|
+
};
|
|
179
|
+
let serviceCalls;
|
|
180
|
+
if (callbacks.serviceCalls) serviceCalls = callbacks.serviceCalls();
|
|
181
|
+
const typedUowFromRetrieve = callbacks.retrieve?.(context);
|
|
182
|
+
const allServiceCallTxResults = serviceCalls ? collectAllTxResults([...serviceCalls]) : [];
|
|
183
|
+
if (!(baseUow.getRetrievalOperations().length > 0)) {
|
|
184
|
+
if (options.retryPolicy) throw new Error("Retry policy is only supported when the transaction includes retrieve operations.");
|
|
185
|
+
retryPolicy = new NoRetryPolicy();
|
|
186
|
+
} else retryPolicy = options.retryPolicy ?? new ExponentialBackoffRetryPolicy({
|
|
187
|
+
maxRetries: 5,
|
|
188
|
+
initialDelayMs: 10,
|
|
189
|
+
maxDelayMs: 100
|
|
190
|
+
});
|
|
191
|
+
const allRetrieveResults = await baseUow.executeRetrieve();
|
|
192
|
+
if (options.onAfterRetrieve) await options.onAfterRetrieve(baseUow, allRetrieveResults);
|
|
193
|
+
const retrieveResult = typedUowFromRetrieve ? await typedUowFromRetrieve.retrievalPhase : [];
|
|
194
|
+
for (const txResult of allServiceCallTxResults) await processTxResultAfterRetrieve(txResult, baseUow);
|
|
195
|
+
const serviceResults = [];
|
|
196
|
+
if (serviceCalls) for (const serviceCall of serviceCalls) {
|
|
197
|
+
if (serviceCall === void 0) {
|
|
198
|
+
serviceResults.push(void 0);
|
|
199
|
+
continue;
|
|
200
|
+
}
|
|
201
|
+
const serviceCallInternal = serviceCall._internal;
|
|
202
|
+
if (serviceCallInternal.retrieveSuccessResult !== void 0 && !(Array.isArray(serviceCallInternal.retrieveSuccessResult) && serviceCallInternal.retrieveSuccessResult.length === 0 && serviceCallInternal.callbacks.mutate)) serviceResults.push(serviceCallInternal.retrieveSuccessResult);
|
|
203
|
+
else if (serviceCallInternal.mutateResult !== void 0) serviceResults.push(serviceCallInternal.mutateResult);
|
|
204
|
+
else serviceResults.push(serviceCallInternal.retrieveSuccessResult);
|
|
205
|
+
}
|
|
206
|
+
let retrieveSuccessResult;
|
|
207
|
+
if (callbacks.retrieveSuccess) retrieveSuccessResult = callbacks.retrieveSuccess(retrieveResult, serviceResults);
|
|
208
|
+
else retrieveSuccessResult = retrieveResult;
|
|
209
|
+
let mutateResult;
|
|
210
|
+
if (callbacks.mutate) {
|
|
211
|
+
const mutateCtx = {
|
|
212
|
+
...context,
|
|
213
|
+
retrieveResult: retrieveSuccessResult,
|
|
214
|
+
serviceIntermediateResult: serviceResults
|
|
215
|
+
};
|
|
216
|
+
mutateResult = callbacks.mutate(mutateCtx);
|
|
217
|
+
}
|
|
218
|
+
if (!options.planMode && options.onBeforeMutate) options.onBeforeMutate(baseUow);
|
|
219
|
+
if (!(await baseUow.executeMutations()).success) throw new ConcurrencyConflictError();
|
|
220
|
+
for (const txResult of allServiceCallTxResults) await processTxResultAfterMutate(txResult);
|
|
221
|
+
const serviceFinalResults = [];
|
|
222
|
+
if (serviceCalls) for (const serviceCall of serviceCalls) {
|
|
223
|
+
if (serviceCall === void 0) {
|
|
224
|
+
serviceFinalResults.push(void 0);
|
|
225
|
+
continue;
|
|
226
|
+
}
|
|
227
|
+
serviceFinalResults.push(serviceCall._internal.finalResult);
|
|
228
|
+
}
|
|
229
|
+
let finalResult;
|
|
230
|
+
if (callbacks.success) {
|
|
231
|
+
const successCtx = {
|
|
232
|
+
retrieveResult: retrieveSuccessResult,
|
|
233
|
+
mutateResult,
|
|
234
|
+
serviceResult: serviceFinalResults,
|
|
235
|
+
serviceIntermediateResult: serviceResults
|
|
236
|
+
};
|
|
237
|
+
finalResult = callbacks.success(successCtx);
|
|
238
|
+
} else if (callbacks.mutate) finalResult = await awaitPromisesInObject(mutateResult);
|
|
239
|
+
else if (callbacks.retrieveSuccess || callbacks.retrieve) finalResult = retrieveSuccessResult;
|
|
240
|
+
else finalResult = serviceFinalResults;
|
|
241
|
+
if (!options.planMode && options.onAfterMutate) await options.onAfterMutate(baseUow);
|
|
242
|
+
return await awaitPromisesInObject(finalResult);
|
|
243
|
+
} catch (error) {
|
|
244
|
+
if (signal?.aborted) throw new Error("Transaction execution aborted");
|
|
245
|
+
if (!(error instanceof ConcurrencyConflictError)) throw error;
|
|
246
|
+
if (!retryPolicy) throw error;
|
|
247
|
+
if (!retryPolicy.shouldRetry(attempt, error, signal)) {
|
|
248
|
+
if (signal?.aborted) throw new Error("Transaction execution aborted");
|
|
249
|
+
throw new ConcurrencyConflictError();
|
|
250
|
+
}
|
|
251
|
+
const delayMs = retryPolicy.getDelayMs(attempt);
|
|
252
|
+
if (delayMs > 0) await new Promise((resolve) => setTimeout(resolve, delayMs));
|
|
253
|
+
attempt++;
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
/**
|
|
258
|
+
* Error thrown when a Unit of Work execution fails due to optimistic concurrency conflict.
|
|
259
|
+
* This error triggers automatic retry behavior in executeTx.
|
|
260
|
+
*/
|
|
261
|
+
var ConcurrencyConflictError = class extends Error {
|
|
262
|
+
constructor(message = "Optimistic concurrency conflict detected") {
|
|
263
|
+
super(message);
|
|
264
|
+
this.name = "ConcurrencyConflictError";
|
|
265
|
+
}
|
|
266
|
+
};
|
|
267
|
+
/**
|
|
268
|
+
* Await promises in an object 1 level deep
|
|
269
|
+
*/
|
|
270
|
+
async function awaitPromisesInObject(obj) {
|
|
271
|
+
if (obj === null || obj === void 0) return obj;
|
|
272
|
+
if (typeof obj !== "object") return obj;
|
|
273
|
+
if (obj instanceof Promise) return await obj;
|
|
274
|
+
if (Array.isArray(obj)) return await Promise.all(obj.map((item) => item instanceof Promise ? item : Promise.resolve(item)));
|
|
275
|
+
if (obj.constructor !== Object) return obj;
|
|
276
|
+
const result = {};
|
|
277
|
+
const entries = Object.entries(obj);
|
|
278
|
+
const awaitedEntries = await Promise.all(entries.map(async ([key, value]) => {
|
|
279
|
+
return [key, value instanceof Promise ? await value : value];
|
|
280
|
+
}));
|
|
281
|
+
for (const [key, value] of awaitedEntries) result[key] = value;
|
|
282
|
+
return result;
|
|
283
|
+
}
|
|
284
|
+
/**
|
|
285
|
+
* Builder for service-level transactions.
|
|
286
|
+
* Uses a fluent API to build up transaction callbacks with proper type inference.
|
|
287
|
+
*
|
|
288
|
+
* @example
|
|
289
|
+
* ```ts
|
|
290
|
+
* return serviceTx(schema)
|
|
291
|
+
* .withServiceCalls(() => [otherService.getData()])
|
|
292
|
+
* .retrieve((uow) => uow.find("users", ...))
|
|
293
|
+
* .transformRetrieve(([users], serviceResult) => users[0])
|
|
294
|
+
* .mutate(({ uow, retrieveResult, serviceIntermediateResult }) =>
|
|
295
|
+
* uow.create("records", { ... })
|
|
296
|
+
* )
|
|
297
|
+
* .transform(({ mutateResult, serviceResult, serviceIntermediateResult }) => ({ id: mutateResult }))
|
|
298
|
+
* .build();
|
|
299
|
+
* ```
|
|
300
|
+
*/
|
|
301
|
+
var ServiceTxBuilder = class ServiceTxBuilder {
|
|
302
|
+
#state;
|
|
303
|
+
constructor(state) {
|
|
304
|
+
this.#state = state;
|
|
305
|
+
}
|
|
306
|
+
/**
|
|
307
|
+
* Add dependencies to execute before this transaction.
|
|
308
|
+
*/
|
|
309
|
+
withServiceCalls(fn) {
|
|
310
|
+
return new ServiceTxBuilder({
|
|
311
|
+
...this.#state,
|
|
312
|
+
withServiceCallsFn: fn
|
|
313
|
+
});
|
|
314
|
+
}
|
|
315
|
+
/**
|
|
316
|
+
* Add retrieval operations to the transaction.
|
|
317
|
+
*/
|
|
318
|
+
retrieve(fn) {
|
|
319
|
+
return new ServiceTxBuilder({
|
|
320
|
+
...this.#state,
|
|
321
|
+
retrieveFn: fn,
|
|
322
|
+
transformRetrieveFn: void 0
|
|
323
|
+
});
|
|
324
|
+
}
|
|
325
|
+
/**
|
|
326
|
+
* Transform retrieve results before passing to mutate.
|
|
327
|
+
*/
|
|
328
|
+
transformRetrieve(fn) {
|
|
329
|
+
return new ServiceTxBuilder({
|
|
330
|
+
...this.#state,
|
|
331
|
+
transformRetrieveFn: fn
|
|
332
|
+
});
|
|
333
|
+
}
|
|
334
|
+
/**
|
|
335
|
+
* Add mutation operations based on retrieve results.
|
|
336
|
+
*/
|
|
337
|
+
mutate(fn) {
|
|
338
|
+
return new ServiceTxBuilder({
|
|
339
|
+
...this.#state,
|
|
340
|
+
mutateFn: fn
|
|
341
|
+
});
|
|
342
|
+
}
|
|
343
|
+
/**
|
|
344
|
+
* Add final transformation after mutations complete.
|
|
345
|
+
*/
|
|
346
|
+
transform(fn) {
|
|
347
|
+
return new ServiceTxBuilder({
|
|
348
|
+
...this.#state,
|
|
349
|
+
transformFn: fn
|
|
350
|
+
});
|
|
351
|
+
}
|
|
352
|
+
/**
|
|
353
|
+
* Build and return the TxResult.
|
|
354
|
+
*/
|
|
355
|
+
build() {
|
|
356
|
+
const state = this.#state;
|
|
357
|
+
const callbacks = {
|
|
358
|
+
serviceCalls: state.withServiceCallsFn,
|
|
359
|
+
retrieve: state.retrieveFn,
|
|
360
|
+
retrieveSuccess: state.transformRetrieveFn,
|
|
361
|
+
mutate: state.mutateFn ? (ctx) => {
|
|
362
|
+
return state.mutateFn({
|
|
363
|
+
uow: ctx.uow,
|
|
364
|
+
retrieveResult: ctx.retrieveResult,
|
|
365
|
+
serviceIntermediateResult: ctx.serviceIntermediateResult
|
|
366
|
+
});
|
|
367
|
+
} : void 0,
|
|
368
|
+
success: state.transformFn ? (ctx) => {
|
|
369
|
+
return state.transformFn({
|
|
370
|
+
retrieveResult: ctx.retrieveResult,
|
|
371
|
+
mutateResult: ctx.mutateResult,
|
|
372
|
+
serviceResult: ctx.serviceResult,
|
|
373
|
+
serviceIntermediateResult: ctx.serviceIntermediateResult
|
|
374
|
+
});
|
|
375
|
+
} : void 0
|
|
376
|
+
};
|
|
377
|
+
return createServiceTx(state.schema, callbacks, state.baseUow);
|
|
378
|
+
}
|
|
379
|
+
};
|
|
380
|
+
/**
|
|
381
|
+
* Create a new ServiceTxBuilder for the given schema.
|
|
382
|
+
*/
|
|
383
|
+
function createServiceTxBuilder(schema, baseUow, hooks) {
|
|
384
|
+
return new ServiceTxBuilder({
|
|
385
|
+
schema,
|
|
386
|
+
baseUow,
|
|
387
|
+
hooks
|
|
388
|
+
});
|
|
389
|
+
}
|
|
390
|
+
/**
|
|
391
|
+
* Builder for handler-level transactions.
|
|
392
|
+
* Uses a fluent API to build up transaction callbacks with proper type inference.
|
|
393
|
+
*
|
|
394
|
+
* @example
|
|
395
|
+
* ```ts
|
|
396
|
+
* const result = await handlerTx()
|
|
397
|
+
* .withServiceCalls(() => [userService.getUser(id)])
|
|
398
|
+
* .mutate(({ forSchema, idempotencyKey, currentAttempt, serviceIntermediateResult }) => {
|
|
399
|
+
* return forSchema(ordersSchema).create("orders", { ... });
|
|
400
|
+
* })
|
|
401
|
+
* .transform(({ mutateResult, serviceResult }) => ({ ... }))
|
|
402
|
+
* .execute();
|
|
403
|
+
* ```
|
|
404
|
+
*/
|
|
405
|
+
var HandlerTxBuilder = class HandlerTxBuilder {
|
|
406
|
+
#state;
|
|
407
|
+
constructor(state) {
|
|
408
|
+
this.#state = state;
|
|
409
|
+
}
|
|
410
|
+
/**
|
|
411
|
+
* Add dependencies to execute before this transaction.
|
|
412
|
+
*/
|
|
413
|
+
withServiceCalls(fn) {
|
|
414
|
+
return new HandlerTxBuilder({
|
|
415
|
+
...this.#state,
|
|
416
|
+
withServiceCallsFn: fn
|
|
417
|
+
});
|
|
418
|
+
}
|
|
419
|
+
/**
|
|
420
|
+
* Add retrieval operations to the transaction.
|
|
421
|
+
* Return a TypedUnitOfWork from forSchema().find() to get typed results.
|
|
422
|
+
*/
|
|
423
|
+
retrieve(fn) {
|
|
424
|
+
return new HandlerTxBuilder({
|
|
425
|
+
...this.#state,
|
|
426
|
+
retrieveFn: fn,
|
|
427
|
+
transformRetrieveFn: void 0
|
|
428
|
+
});
|
|
429
|
+
}
|
|
430
|
+
/**
|
|
431
|
+
* Transform retrieve results before passing to mutate.
|
|
432
|
+
*/
|
|
433
|
+
transformRetrieve(fn) {
|
|
434
|
+
return new HandlerTxBuilder({
|
|
435
|
+
...this.#state,
|
|
436
|
+
transformRetrieveFn: fn
|
|
437
|
+
});
|
|
438
|
+
}
|
|
439
|
+
/**
|
|
440
|
+
* Add mutation operations based on retrieve results.
|
|
441
|
+
*/
|
|
442
|
+
mutate(fn) {
|
|
443
|
+
return new HandlerTxBuilder({
|
|
444
|
+
...this.#state,
|
|
445
|
+
mutateFn: fn
|
|
446
|
+
});
|
|
447
|
+
}
|
|
448
|
+
/**
|
|
449
|
+
* Add final transformation after mutations complete.
|
|
450
|
+
*/
|
|
451
|
+
transform(fn) {
|
|
452
|
+
return new HandlerTxBuilder({
|
|
453
|
+
...this.#state,
|
|
454
|
+
transformFn: fn
|
|
455
|
+
});
|
|
456
|
+
}
|
|
457
|
+
/**
|
|
458
|
+
* Execute the transaction and return the result.
|
|
459
|
+
*/
|
|
460
|
+
execute() {
|
|
461
|
+
const state = this.#state;
|
|
462
|
+
const callbacks = {
|
|
463
|
+
serviceCalls: state.withServiceCallsFn,
|
|
464
|
+
retrieve: state.retrieveFn ? (context) => {
|
|
465
|
+
return state.retrieveFn({
|
|
466
|
+
forSchema: context.forSchema,
|
|
467
|
+
idempotencyKey: context.idempotencyKey,
|
|
468
|
+
currentAttempt: context.currentAttempt
|
|
469
|
+
});
|
|
470
|
+
} : void 0,
|
|
471
|
+
retrieveSuccess: state.transformRetrieveFn,
|
|
472
|
+
mutate: state.mutateFn ? (ctx) => {
|
|
473
|
+
return state.mutateFn({
|
|
474
|
+
forSchema: ctx.forSchema,
|
|
475
|
+
idempotencyKey: ctx.idempotencyKey,
|
|
476
|
+
currentAttempt: ctx.currentAttempt,
|
|
477
|
+
retrieveResult: ctx.retrieveResult,
|
|
478
|
+
serviceIntermediateResult: ctx.serviceIntermediateResult
|
|
479
|
+
});
|
|
480
|
+
} : void 0,
|
|
481
|
+
success: state.transformFn ? (ctx) => {
|
|
482
|
+
return state.transformFn({
|
|
483
|
+
retrieveResult: ctx.retrieveResult,
|
|
484
|
+
mutateResult: ctx.mutateResult,
|
|
485
|
+
serviceResult: ctx.serviceResult,
|
|
486
|
+
serviceIntermediateResult: ctx.serviceIntermediateResult
|
|
487
|
+
});
|
|
488
|
+
} : void 0
|
|
489
|
+
};
|
|
490
|
+
const run = () => executeTx(callbacks, state.options);
|
|
491
|
+
return state.executeWrapper ? state.executeWrapper(run) : run();
|
|
492
|
+
}
|
|
493
|
+
};
|
|
494
|
+
/**
|
|
495
|
+
* Create a new HandlerTxBuilder with the given options.
|
|
496
|
+
*/
|
|
497
|
+
function createHandlerTxBuilder(options, hooks, executeWrapper) {
|
|
498
|
+
return new HandlerTxBuilder({
|
|
499
|
+
options,
|
|
500
|
+
hooks,
|
|
501
|
+
executeWrapper
|
|
502
|
+
});
|
|
503
|
+
}
|
|
504
|
+
|
|
505
|
+
//#endregion
|
|
506
|
+
export { HandlerTxBuilder, ServiceTxBuilder, createHandlerTxBuilder, createServiceTxBuilder };
|
|
507
|
+
//# sourceMappingURL=execute-unit-of-work.js.map
|