@fragno-dev/db 0.2.2 → 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 +404 -175
- package/CHANGELOG.md +109 -0
- package/README.md +54 -9
- package/dist/adapters/adapters.d.ts +23 -21
- package/dist/adapters/adapters.d.ts.map +1 -1
- package/dist/adapters/adapters.js.map +1 -1
- package/dist/adapters/generic-sql/driver-config.d.ts +16 -1
- package/dist/adapters/generic-sql/driver-config.d.ts.map +1 -1
- package/dist/adapters/generic-sql/driver-config.js +23 -1
- package/dist/adapters/generic-sql/driver-config.js.map +1 -1
- package/dist/adapters/generic-sql/generic-sql-adapter.d.ts +24 -9
- package/dist/adapters/generic-sql/generic-sql-adapter.d.ts.map +1 -1
- package/dist/adapters/generic-sql/generic-sql-adapter.js +60 -22
- package/dist/adapters/generic-sql/generic-sql-adapter.js.map +1 -1
- package/dist/adapters/generic-sql/generic-sql-uow-executor.js +169 -3
- 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 +25 -6
- package/dist/adapters/generic-sql/migration/dialect/mysql.js.map +1 -1
- package/dist/adapters/generic-sql/migration/dialect/postgres.js +7 -6
- package/dist/adapters/generic-sql/migration/dialect/postgres.js.map +1 -1
- package/dist/adapters/generic-sql/migration/dialect/sqlite.js +193 -16
- 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 +9 -9
- package/dist/adapters/generic-sql/migration/prepared-migrations.js.map +1 -1
- package/dist/adapters/generic-sql/migration/sql-generator.js +75 -52
- package/dist/adapters/generic-sql/migration/sql-generator.js.map +1 -1
- package/dist/adapters/generic-sql/query/create-sql-query-compiler.js +7 -6
- package/dist/adapters/generic-sql/query/create-sql-query-compiler.js.map +1 -1
- package/dist/adapters/generic-sql/query/cursor-utils.js +42 -4
- 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 +32 -21
- package/dist/adapters/generic-sql/query/generic-sql-uow-operation-compiler.js.map +1 -1
- package/dist/adapters/generic-sql/query/select-builder.js +5 -3
- package/dist/adapters/generic-sql/query/select-builder.js.map +1 -1
- package/dist/adapters/generic-sql/query/sql-query-compiler.js +49 -18
- package/dist/adapters/generic-sql/query/sql-query-compiler.js.map +1 -1
- package/dist/adapters/generic-sql/query/where-builder.js +43 -29
- package/dist/adapters/generic-sql/query/where-builder.js.map +1 -1
- package/dist/adapters/generic-sql/sqlite-storage.d.ts +13 -0
- package/dist/adapters/generic-sql/sqlite-storage.d.ts.map +1 -0
- package/dist/adapters/generic-sql/sqlite-storage.js +15 -0
- package/dist/adapters/generic-sql/sqlite-storage.js.map +1 -0
- package/dist/adapters/generic-sql/uow-decoder.js +6 -2
- package/dist/adapters/generic-sql/uow-decoder.js.map +1 -1
- package/dist/adapters/generic-sql/uow-encoder.js +27 -8
- package/dist/adapters/generic-sql/uow-encoder.js.map +1 -1
- package/dist/adapters/in-memory/condition-evaluator.js +135 -0
- package/dist/adapters/in-memory/condition-evaluator.js.map +1 -0
- package/dist/adapters/in-memory/errors.d.ts +13 -0
- package/dist/adapters/in-memory/errors.d.ts.map +1 -0
- package/dist/adapters/in-memory/errors.js +23 -0
- package/dist/adapters/in-memory/errors.js.map +1 -0
- package/dist/adapters/in-memory/in-memory-adapter.d.ts +27 -0
- package/dist/adapters/in-memory/in-memory-adapter.d.ts.map +1 -0
- package/dist/adapters/in-memory/in-memory-adapter.js +196 -0
- package/dist/adapters/in-memory/in-memory-adapter.js.map +1 -0
- package/dist/adapters/in-memory/in-memory-uow.js +871 -0
- package/dist/adapters/in-memory/in-memory-uow.js.map +1 -0
- package/dist/adapters/in-memory/index.d.ts +4 -0
- package/dist/adapters/in-memory/index.js +4 -0
- package/dist/adapters/in-memory/options.d.ts +30 -0
- package/dist/adapters/in-memory/options.d.ts.map +1 -0
- package/dist/adapters/in-memory/options.js +62 -0
- package/dist/adapters/in-memory/options.js.map +1 -0
- package/dist/adapters/in-memory/reference-resolution.js +26 -0
- package/dist/adapters/in-memory/reference-resolution.js.map +1 -0
- package/dist/adapters/in-memory/sorted-array-index.js +129 -0
- package/dist/adapters/in-memory/sorted-array-index.js.map +1 -0
- package/dist/adapters/in-memory/store.js +71 -0
- package/dist/adapters/in-memory/store.js.map +1 -0
- package/dist/adapters/in-memory/value-comparison.js +28 -0
- package/dist/adapters/in-memory/value-comparison.js.map +1 -0
- 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 +11 -11
- package/dist/adapters/shared/uow-operation-compiler.js.map +1 -1
- package/dist/adapters/sql/index.d.ts +5 -0
- package/dist/adapters/sql/index.js +4 -0
- 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 +101 -33
- package/dist/db-fragment-definition-builder.d.ts.map +1 -1
- package/dist/db-fragment-definition-builder.js +450 -60
- 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 +11 -0
- package/dist/dispatchers/cloudflare-do/index.d.ts.map +1 -0
- package/dist/dispatchers/cloudflare-do/index.js +31 -0
- package/dist/dispatchers/cloudflare-do/index.js.map +1 -0
- 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 +12 -0
- package/dist/dispatchers/node/index.d.ts.map +1 -0
- package/dist/dispatchers/node/index.js +27 -0
- package/dist/dispatchers/node/index.js.map +1 -0
- 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 +186 -8
- package/dist/fragments/internal-fragment.d.ts.map +1 -1
- package/dist/fragments/internal-fragment.js +203 -38
- package/dist/fragments/internal-fragment.js.map +1 -1
- package/dist/fragments/internal-fragment.routes.js +164 -0
- package/dist/fragments/internal-fragment.routes.js.map +1 -0
- package/dist/fragments/internal-fragment.schema.d.ts +15 -0
- package/dist/fragments/internal-fragment.schema.d.ts.map +1 -0
- package/dist/fragments/internal-fragment.schema.js +39 -0
- package/dist/fragments/internal-fragment.schema.js.map +1 -0
- 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 -0
- package/dist/hooks/durable-hooks-processor.js +80 -0
- package/dist/hooks/durable-hooks-processor.js.map +1 -0
- 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 +100 -1
- package/dist/hooks/hooks.d.ts.map +1 -1
- package/dist/hooks/hooks.js +254 -27
- 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 +223 -37
- package/dist/migration-engine/auto-from-schema.js.map +1 -1
- package/dist/migration-engine/generation-engine.d.ts +16 -10
- package/dist/migration-engine/generation-engine.d.ts.map +1 -1
- package/dist/migration-engine/generation-engine.js +86 -35
- 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 +20 -12
- package/dist/mod.d.ts.map +1 -1
- package/dist/mod.js +18 -12
- package/dist/mod.js.map +1 -1
- package/dist/naming/sql-naming.d.ts +19 -0
- package/dist/naming/sql-naming.d.ts.map +1 -0
- package/dist/naming/sql-naming.js +116 -0
- package/dist/naming/sql-naming.js.map +1 -0
- package/dist/outbox/outbox-builder.js +156 -0
- package/dist/outbox/outbox-builder.js.map +1 -0
- package/dist/outbox/outbox.d.ts +54 -0
- package/dist/outbox/outbox.d.ts.map +1 -0
- package/dist/outbox/outbox.js +37 -0
- package/dist/outbox/outbox.js.map +1 -0
- package/dist/query/column-defaults.js +20 -4
- 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 +3 -1
- package/dist/query/cursor.d.ts.map +1 -1
- package/dist/query/cursor.js +51 -14
- package/dist/query/cursor.js.map +1 -1
- package/dist/query/db-now.d.ts +22 -0
- package/dist/query/db-now.d.ts.map +1 -0
- package/dist/query/db-now.js +35 -0
- package/dist/query/db-now.js.map +1 -0
- package/dist/query/orm/orm.js.map +1 -1
- package/dist/query/serialize/create-sql-serializer.js +5 -4
- package/dist/query/serialize/create-sql-serializer.js.map +1 -1
- package/dist/query/serialize/dialect/mysql-serializer.js +12 -6
- package/dist/query/serialize/dialect/mysql-serializer.js.map +1 -1
- package/dist/query/serialize/dialect/postgres-serializer.js +25 -7
- package/dist/query/serialize/dialect/postgres-serializer.js.map +1 -1
- package/dist/query/serialize/dialect/sqlite-serializer.js +60 -12
- package/dist/query/serialize/dialect/sqlite-serializer.js.map +1 -1
- package/dist/query/serialize/sql-serializer.js +2 -2
- package/dist/query/serialize/sql-serializer.js.map +1 -1
- package/dist/query/simple-query-interface.d.ts +13 -4
- 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 +50 -24
- 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 +92 -30
- package/dist/query/unit-of-work/unit-of-work.d.ts.map +1 -1
- package/dist/query/unit-of-work/unit-of-work.js +136 -11
- package/dist/query/unit-of-work/unit-of-work.js.map +1 -1
- package/dist/query/value-decoding.js +16 -6
- package/dist/query/value-decoding.js.map +1 -1
- package/dist/query/value-encoding.js +29 -9
- package/dist/query/value-encoding.js.map +1 -1
- package/dist/schema/create.d.ts +103 -35
- package/dist/schema/create.d.ts.map +1 -1
- package/dist/schema/create.js +172 -58
- package/dist/schema/create.js.map +1 -1
- package/dist/schema/generate-id.js +2 -2
- package/dist/schema/generate-id.js.map +1 -1
- package/dist/schema/type-conversion/create-sql-type-mapper.js +4 -3
- package/dist/schema/type-conversion/create-sql-type-mapper.js.map +1 -1
- package/dist/schema/type-conversion/dialect/sqlite.js +9 -0
- package/dist/schema/type-conversion/dialect/sqlite.js.map +1 -1
- package/dist/schema/validator.d.ts +10 -0
- package/dist/schema/validator.d.ts.map +1 -0
- package/dist/schema/validator.js +123 -0
- package/dist/schema/validator.js.map +1 -0
- package/dist/schema-output/drizzle.d.ts +30 -0
- package/dist/schema-output/drizzle.d.ts.map +1 -0
- package/dist/{adapters/drizzle/generate.js → schema-output/drizzle.js} +88 -60
- package/dist/schema-output/drizzle.js.map +1 -0
- package/dist/schema-output/prisma.d.ts +17 -0
- package/dist/schema-output/prisma.d.ts.map +1 -0
- package/dist/schema-output/prisma.js +307 -0
- package/dist/schema-output/prisma.js.map +1 -0
- 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 +66 -0
- package/dist/util/default-database-adapter.js.map +1 -0
- package/dist/with-database.d.ts +3 -6
- package/dist/with-database.d.ts.map +1 -1
- package/dist/with-database.js +8 -7
- package/dist/with-database.js.map +1 -1
- package/package.json +62 -55
- package/src/adapters/adapters.ts +33 -26
- package/src/adapters/drizzle/migrate-drizzle.test.ts +99 -41
- package/src/adapters/drizzle/migration-parity-drizzle-kit.test.ts +601 -0
- package/src/adapters/drizzle/test-utils.ts +13 -8
- package/src/adapters/generic-sql/driver-config.ts +38 -0
- package/src/adapters/generic-sql/generic-sql-adapter.test.ts +10 -8
- package/src/adapters/generic-sql/generic-sql-adapter.ts +117 -34
- package/src/adapters/generic-sql/generic-sql-uow-executor.test.ts +55 -0
- package/src/adapters/generic-sql/generic-sql-uow-executor.ts +297 -3
- package/src/adapters/generic-sql/migration/adapter-migration-parity.test.ts +120 -0
- package/src/adapters/generic-sql/migration/cold-kysely.ts +1 -0
- package/src/adapters/generic-sql/migration/dialect/mysql.test.ts +27 -8
- package/src/adapters/generic-sql/migration/dialect/mysql.ts +47 -8
- package/src/adapters/generic-sql/migration/dialect/postgres.test.ts +28 -9
- package/src/adapters/generic-sql/migration/dialect/postgres.ts +9 -4
- package/src/adapters/generic-sql/migration/dialect/sqlite.test.ts +839 -8
- package/src/adapters/generic-sql/migration/dialect/sqlite.ts +396 -53
- 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 +238 -46
- package/src/adapters/generic-sql/migration/prepared-migrations.ts +21 -13
- package/src/adapters/generic-sql/migration/sql-generator.ts +145 -66
- package/src/adapters/generic-sql/query/create-sql-query-compiler.ts +11 -8
- package/src/adapters/generic-sql/query/cursor-utils.test.ts +272 -0
- package/src/adapters/generic-sql/query/cursor-utils.ts +42 -7
- 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 +171 -35
- package/src/adapters/generic-sql/query/generic-sql-uow-operation-compiler.ts +53 -40
- package/src/adapters/generic-sql/query/select-builder.test.ts +16 -11
- package/src/adapters/generic-sql/query/select-builder.ts +7 -3
- package/src/adapters/generic-sql/query/sql-query-compiler.test.ts +75 -6
- package/src/adapters/generic-sql/query/sql-query-compiler.ts +129 -24
- package/src/adapters/generic-sql/query/where-builder.test.ts +96 -20
- package/src/adapters/generic-sql/query/where-builder.ts +112 -41
- package/src/adapters/{kysely/kysely-adapter-pglite.test.ts → generic-sql/sql-adapter-pglite-migrations.test.ts} +11 -20
- package/src/adapters/generic-sql/sql-adapter-pglite-pagination.test.ts +851 -0
- package/src/adapters/{drizzle/drizzle-adapter-pglite.test.ts → generic-sql/sql-adapter-pglite-queries.test.ts} +18 -15
- package/src/adapters/generic-sql/{test/generic-drizzle-adapter-sqlite3.test.ts → sql-adapter-sqlite3-driver.test.ts} +282 -14
- package/src/adapters/{drizzle/drizzle-adapter-sqlite3.test.ts → generic-sql/sql-adapter-sqlite3-uow.test.ts} +129 -12
- package/src/adapters/{kysely/kysely-adapter-sqlocal.test.ts → generic-sql/sql-adapter-sqlocal.test.ts} +9 -7
- package/src/adapters/generic-sql/sqlite-storage.ts +20 -0
- package/src/adapters/generic-sql/uow-decoder.test.ts +5 -4
- package/src/adapters/generic-sql/uow-decoder.ts +23 -5
- package/src/adapters/generic-sql/uow-encoder.test.ts +36 -3
- package/src/adapters/generic-sql/uow-encoder.ts +48 -13
- package/src/adapters/in-memory/condition-evaluator.test.ts +194 -0
- package/src/adapters/in-memory/condition-evaluator.ts +280 -0
- package/src/adapters/in-memory/errors.ts +20 -0
- package/src/adapters/in-memory/in-memory-adapter.ts +388 -0
- package/src/adapters/in-memory/in-memory-uow.mutations.test.ts +344 -0
- package/src/adapters/in-memory/in-memory-uow.retrieval.test.ts +255 -0
- package/src/adapters/in-memory/in-memory-uow.ts +1724 -0
- package/src/adapters/in-memory/index.ts +3 -0
- package/src/adapters/in-memory/options.test.ts +42 -0
- package/src/adapters/in-memory/options.ts +91 -0
- package/src/adapters/in-memory/outbox.test.ts +361 -0
- package/src/adapters/in-memory/reference-resolution.test.ts +51 -0
- package/src/adapters/in-memory/reference-resolution.ts +67 -0
- package/src/adapters/in-memory/sorted-array-index.test.ts +124 -0
- package/src/adapters/in-memory/sorted-array-index.ts +228 -0
- package/src/adapters/in-memory/store.test.ts +69 -0
- package/src/adapters/in-memory/store.ts +145 -0
- package/src/adapters/in-memory/value-comparison.ts +53 -0
- package/src/adapters/in-memory/value-normalization.test.ts +58 -0
- package/src/adapters/prisma/prisma-adapter-sqlite3.test.ts +1207 -0
- package/src/adapters/shared/from-unit-of-work-compiler.ts +159 -47
- package/src/adapters/shared/uow-operation-compiler.ts +28 -18
- package/src/adapters/sql/index.ts +12 -0
- package/src/browser/mod.ts +64 -0
- package/src/client.ts +19 -0
- package/src/db-fragment-definition-builder.test.ts +845 -53
- package/src/db-fragment-definition-builder.ts +911 -95
- package/src/db-fragment-instantiator.test.ts +210 -94
- package/src/db-fragment-integration.test.ts +17 -12
- package/src/dispatchers/cloudflare-do/dispatcher.ts +204 -0
- package/src/dispatchers/cloudflare-do/index.test.ts +206 -0
- package/src/dispatchers/cloudflare-do/index.ts +63 -0
- package/src/dispatchers/node/dispatcher.ts +112 -0
- package/src/dispatchers/node/index.test.ts +120 -0
- package/src/dispatchers/node/index.ts +50 -0
- 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 +334 -0
- package/src/fragments/internal-fragment.schema.ts +95 -0
- package/src/fragments/internal-fragment.test.ts +505 -83
- package/src/fragments/internal-fragment.ts +453 -70
- 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 +282 -0
- package/src/hooks/durable-hooks-processor.ts +173 -0
- 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 +455 -34
- package/src/hooks/hooks.ts +501 -34
- 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 +107 -14
- package/src/migration-engine/auto-from-schema.ts +365 -44
- package/src/migration-engine/create.test.ts +4 -3
- package/src/migration-engine/create.ts +1 -1
- package/src/migration-engine/generation-engine.test.ts +292 -110
- package/src/migration-engine/generation-engine.ts +117 -66
- package/src/migration-engine/shared.ts +14 -0
- package/src/mod.ts +95 -39
- package/src/naming/sql-naming.ts +181 -0
- package/src/outbox/outbox-builder.ts +241 -0
- package/src/outbox/outbox.test.ts +424 -0
- package/src/outbox/outbox.ts +139 -0
- package/src/query/column-defaults.ts +42 -4
- package/src/query/condition-builder.test.ts +18 -3
- 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 +119 -20
- package/src/query/cursor.ts +88 -27
- package/src/query/db-now.ts +73 -0
- package/src/query/orm/orm.ts +2 -2
- package/src/query/query-type.test.ts +4 -3
- package/src/query/serialize/create-sql-serializer.ts +10 -5
- package/src/query/serialize/dialect/mysql-serializer.ts +13 -5
- package/src/query/serialize/dialect/postgres-serializer.ts +35 -5
- package/src/query/serialize/dialect/sqlite-serializer.test.ts +90 -3
- package/src/query/serialize/dialect/sqlite-serializer.ts +108 -12
- package/src/query/serialize/sql-serializer.ts +4 -4
- package/src/query/simple-query-interface.ts +15 -4
- package/src/query/unit-of-work/execute-unit-of-work.test.ts +372 -10
- package/src/query/unit-of-work/execute-unit-of-work.ts +87 -27
- 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 +17 -16
- package/src/query/unit-of-work/unit-of-work-types.test.ts +42 -12
- package/src/query/unit-of-work/unit-of-work.test.ts +196 -39
- package/src/query/unit-of-work/unit-of-work.ts +309 -38
- package/src/query/value-decoding.test.ts +63 -4
- package/src/query/value-decoding.ts +32 -6
- package/src/query/value-encoding.test.ts +86 -2
- package/src/query/value-encoding.ts +56 -6
- package/src/schema/create.test.ts +293 -47
- package/src/schema/create.ts +406 -70
- package/src/schema/generate-id.test.ts +3 -2
- package/src/schema/generate-id.ts +2 -2
- package/src/schema/serialize.test.ts +18 -5
- package/src/schema/type-conversion/create-sql-type-mapper.ts +8 -3
- package/src/schema/type-conversion/dialect/sqlite.ts +18 -0
- package/src/schema/type-conversion/type-mapping.test.ts +26 -1
- package/src/schema/validator.test.ts +199 -0
- package/src/schema/validator.ts +232 -0
- package/src/{adapters/drizzle/generate.test.ts → schema-output/drizzle.test.ts} +232 -129
- package/src/{adapters/drizzle/generate.ts → schema-output/drizzle.ts} +155 -99
- package/src/schema-output/prisma.test.ts +694 -0
- package/src/schema-output/prisma.ts +593 -0
- 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 +119 -0
- package/src/with-database.ts +20 -31
- package/tsconfig.json +1 -1
- package/tsdown.config.ts +38 -24
- package/vitest.config.ts +1 -0
- package/dist/adapters/drizzle/drizzle-adapter.d.ts +0 -20
- package/dist/adapters/drizzle/drizzle-adapter.d.ts.map +0 -1
- package/dist/adapters/drizzle/drizzle-adapter.js +0 -27
- package/dist/adapters/drizzle/drizzle-adapter.js.map +0 -1
- package/dist/adapters/drizzle/generate.d.ts +0 -30
- package/dist/adapters/drizzle/generate.d.ts.map +0 -1
- package/dist/adapters/drizzle/generate.js.map +0 -1
- package/dist/adapters/kysely/kysely-adapter.d.ts +0 -19
- package/dist/adapters/kysely/kysely-adapter.d.ts.map +0 -1
- package/dist/adapters/kysely/kysely-adapter.js +0 -17
- package/dist/adapters/kysely/kysely-adapter.js.map +0 -1
- package/dist/adapters/shared/table-name-mapper.d.ts +0 -12
- package/dist/adapters/shared/table-name-mapper.d.ts.map +0 -1
- package/dist/adapters/shared/table-name-mapper.js +0 -43
- package/dist/adapters/shared/table-name-mapper.js.map +0 -1
- package/dist/node_modules/.pnpm/rou3@0.7.10/node_modules/rou3/dist/index.js +0 -165
- package/dist/node_modules/.pnpm/rou3@0.7.10/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 -320
- package/dist/packages/fragno/dist/api/fragment-definition-builder.js.map +0 -1
- package/dist/packages/fragno/dist/api/fragment-instantiator.js +0 -525
- 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 -118
- 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 -17
- 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/schema-generator/schema-generator.d.ts +0 -15
- package/dist/schema-generator/schema-generator.d.ts.map +0 -1
- package/src/adapters/drizzle/drizzle-adapter.ts +0 -39
- package/src/adapters/kysely/kysely-adapter.ts +0 -27
- package/src/adapters/shared/table-name-mapper.ts +0 -50
- package/src/schema-generator/schema-generator.ts +0 -12
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { TriggeredHook, TriggerHookOptions, HooksMap, HookPayload } from "../../hooks/hooks";
|
|
1
2
|
import type {
|
|
2
3
|
AnySchema,
|
|
3
4
|
AnyTable,
|
|
@@ -8,7 +9,13 @@ import type {
|
|
|
8
9
|
} from "../../schema/create";
|
|
9
10
|
import { FragnoId } from "../../schema/create";
|
|
10
11
|
import { generateId } from "../../schema/generate-id";
|
|
12
|
+
import type { Prettify } from "../../util/types";
|
|
11
13
|
import type { Condition, ConditionBuilder } from "../condition-builder";
|
|
14
|
+
import { buildCondition } from "../condition-builder";
|
|
15
|
+
import type { CursorResult } from "../cursor";
|
|
16
|
+
import { Cursor } from "../cursor";
|
|
17
|
+
import { dbInterval, dbNow, type DbInterval, type DbIntervalInput, type DbNow } from "../db-now";
|
|
18
|
+
import type { CompiledJoin } from "../orm/orm";
|
|
12
19
|
import type {
|
|
13
20
|
SelectClause,
|
|
14
21
|
TableToInsertValues,
|
|
@@ -17,12 +24,6 @@ import type {
|
|
|
17
24
|
ExtractSelect,
|
|
18
25
|
ExtractJoinOut,
|
|
19
26
|
} from "../simple-query-interface";
|
|
20
|
-
import { buildCondition } from "../condition-builder";
|
|
21
|
-
import type { CompiledJoin } from "../orm/orm";
|
|
22
|
-
import type { CursorResult } from "../cursor";
|
|
23
|
-
import { Cursor } from "../cursor";
|
|
24
|
-
import type { Prettify } from "../../util/types";
|
|
25
|
-
import type { TriggeredHook, TriggerHookOptions, HooksMap, HookPayload } from "../../hooks/hooks";
|
|
26
27
|
|
|
27
28
|
/**
|
|
28
29
|
* Builder for updateMany operations that supports both whereIndex and set chaining
|
|
@@ -33,6 +34,8 @@ export interface UpdateManyBuilder<TTable extends AnyTable> {
|
|
|
33
34
|
condition?: (eb: IndexSpecificConditionBuilder<TTable, TIndexName>) => Condition | boolean,
|
|
34
35
|
): this;
|
|
35
36
|
set(values: TableToUpdateValues<TTable>): this;
|
|
37
|
+
now(): DbNow;
|
|
38
|
+
interval(input: DbIntervalInput): DbInterval;
|
|
36
39
|
}
|
|
37
40
|
|
|
38
41
|
/**
|
|
@@ -42,6 +45,12 @@ export type IndexColumns<TIndex extends Index> = TIndex["columnNames"][number];
|
|
|
42
45
|
|
|
43
46
|
type RemoveEmptyObject<T> = T extends object ? (keyof T extends never ? never : T) : never;
|
|
44
47
|
|
|
48
|
+
type ExtractJoinBuilderSelect<T> =
|
|
49
|
+
T extends JoinFindBuilder<infer _Table, infer TSelect, infer _JoinOut> ? TSelect : true;
|
|
50
|
+
|
|
51
|
+
type ExtractJoinBuilderOut<T> =
|
|
52
|
+
T extends JoinFindBuilder<infer _Table, infer _Select, infer TJoinOut> ? TJoinOut : {};
|
|
53
|
+
|
|
45
54
|
/**
|
|
46
55
|
* Extract all indexed column names from a table's indexes
|
|
47
56
|
*/
|
|
@@ -161,17 +170,18 @@ export type RetrievalOperation<
|
|
|
161
170
|
| {
|
|
162
171
|
type: "find";
|
|
163
172
|
schema: TSchema;
|
|
164
|
-
namespace?: string;
|
|
173
|
+
namespace?: string | null;
|
|
165
174
|
table: TTable;
|
|
166
175
|
indexName: string;
|
|
167
176
|
options: FindOptions<TTable, SelectClause<TTable>>;
|
|
168
177
|
withCursor?: boolean;
|
|
169
178
|
withSingleResult?: boolean;
|
|
179
|
+
readTracking?: boolean;
|
|
170
180
|
}
|
|
171
181
|
| {
|
|
172
182
|
type: "count";
|
|
173
183
|
schema: TSchema;
|
|
174
|
-
namespace?: string;
|
|
184
|
+
namespace?: string | null;
|
|
175
185
|
table: TTable;
|
|
176
186
|
indexName: string;
|
|
177
187
|
options: Pick<FindOptions<TTable>, "where" | "useIndex">;
|
|
@@ -187,7 +197,7 @@ export type MutationOperation<
|
|
|
187
197
|
| {
|
|
188
198
|
type: "update";
|
|
189
199
|
schema: TSchema;
|
|
190
|
-
namespace?: string;
|
|
200
|
+
namespace?: string | null;
|
|
191
201
|
table: TTable["name"];
|
|
192
202
|
id: FragnoId | string;
|
|
193
203
|
checkVersion: boolean;
|
|
@@ -196,7 +206,7 @@ export type MutationOperation<
|
|
|
196
206
|
| {
|
|
197
207
|
type: "create";
|
|
198
208
|
schema: TSchema;
|
|
199
|
-
namespace?: string;
|
|
209
|
+
namespace?: string | null;
|
|
200
210
|
table: TTable["name"];
|
|
201
211
|
values: TableToInsertValues<TTable>;
|
|
202
212
|
generatedExternalId: string;
|
|
@@ -204,7 +214,7 @@ export type MutationOperation<
|
|
|
204
214
|
| {
|
|
205
215
|
type: "delete";
|
|
206
216
|
schema: TSchema;
|
|
207
|
-
namespace?: string;
|
|
217
|
+
namespace?: string | null;
|
|
208
218
|
table: TTable["name"];
|
|
209
219
|
id: FragnoId | string;
|
|
210
220
|
checkVersion: boolean;
|
|
@@ -212,7 +222,7 @@ export type MutationOperation<
|
|
|
212
222
|
| {
|
|
213
223
|
type: "check";
|
|
214
224
|
schema: TSchema;
|
|
215
|
-
namespace?: string;
|
|
225
|
+
namespace?: string | null;
|
|
216
226
|
table: TTable["name"];
|
|
217
227
|
id: FragnoId;
|
|
218
228
|
};
|
|
@@ -222,6 +232,14 @@ export type MutationOperation<
|
|
|
222
232
|
*/
|
|
223
233
|
export interface CompiledMutation<TOutput> {
|
|
224
234
|
query: TOutput;
|
|
235
|
+
/**
|
|
236
|
+
* Original mutation operation for execution metadata (e.g., outbox payloads).
|
|
237
|
+
*/
|
|
238
|
+
operation?: MutationOperation<AnySchema>;
|
|
239
|
+
/**
|
|
240
|
+
* Idempotency key for the Unit of Work that produced this mutation.
|
|
241
|
+
*/
|
|
242
|
+
uowId?: string;
|
|
225
243
|
/**
|
|
226
244
|
* The type of mutation operation (create, update, delete, or check).
|
|
227
245
|
*/
|
|
@@ -358,6 +376,7 @@ export class FindBuilder<
|
|
|
358
376
|
`Use either select() or selectCount(), not both.`,
|
|
359
377
|
);
|
|
360
378
|
}
|
|
379
|
+
// prettier-ignore
|
|
361
380
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
362
381
|
(this as any).#selectClause = columns;
|
|
363
382
|
return this as unknown as FindBuilder<TTable, TNewSelect, TJoinOut>;
|
|
@@ -567,6 +586,17 @@ export class UpdateBuilder<TTable extends AnyTable> {
|
|
|
567
586
|
return this;
|
|
568
587
|
}
|
|
569
588
|
|
|
589
|
+
/**
|
|
590
|
+
* Database timestamp helper for mutation values.
|
|
591
|
+
*/
|
|
592
|
+
now(): DbNow {
|
|
593
|
+
return dbNow();
|
|
594
|
+
}
|
|
595
|
+
|
|
596
|
+
interval(input: DbIntervalInput): DbInterval {
|
|
597
|
+
return dbInterval(input);
|
|
598
|
+
}
|
|
599
|
+
|
|
570
600
|
/**
|
|
571
601
|
* Enable version checking for optimistic concurrency control
|
|
572
602
|
* @throws Error if the ID is just a string (no version available)
|
|
@@ -703,6 +733,7 @@ export class JoinFindBuilder<
|
|
|
703
733
|
select<const TNewSelect extends SelectClause<TTable>>(
|
|
704
734
|
columns: TNewSelect,
|
|
705
735
|
): JoinFindBuilder<TTable, TNewSelect, TJoinOut> {
|
|
736
|
+
// prettier-ignore
|
|
706
737
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
707
738
|
(this as any).#selectClause = columns;
|
|
708
739
|
return this as unknown as JoinFindBuilder<TTable, TNewSelect, TJoinOut>;
|
|
@@ -801,15 +832,22 @@ export type IndexedJoinBuilder<TTable extends AnyTable, TJoinOut> = {
|
|
|
801
832
|
infer TRelationType,
|
|
802
833
|
infer TTargetTable
|
|
803
834
|
>
|
|
804
|
-
? <
|
|
805
|
-
|
|
806
|
-
|
|
807
|
-
|
|
835
|
+
? <
|
|
836
|
+
TBuilderFn extends (builder: JoinFindBuilder<TTable["relations"][K]["table"]>) => unknown =
|
|
837
|
+
(
|
|
838
|
+
builder: JoinFindBuilder<TTable["relations"][K]["table"]>,
|
|
839
|
+
) => JoinFindBuilder<TTable["relations"][K]["table"]>,
|
|
840
|
+
>(
|
|
841
|
+
builderFn?: TBuilderFn,
|
|
808
842
|
) => IndexedJoinBuilder<
|
|
809
843
|
TTable,
|
|
810
844
|
TJoinOut & {
|
|
811
845
|
[P in K]: MapRelationType<
|
|
812
|
-
SelectResult<
|
|
846
|
+
SelectResult<
|
|
847
|
+
TTargetTable,
|
|
848
|
+
ExtractJoinBuilderOut<ReturnType<TBuilderFn>>,
|
|
849
|
+
ExtractJoinBuilderSelect<ReturnType<TBuilderFn>>
|
|
850
|
+
>
|
|
813
851
|
>[TRelationType];
|
|
814
852
|
}
|
|
815
853
|
>
|
|
@@ -832,7 +870,7 @@ export function buildJoinIndexed<TTable extends AnyTable, TJoinOut>(
|
|
|
832
870
|
|
|
833
871
|
builder[name] = (builderFn?: (b: JoinFindBuilder<AnyTable>) => JoinFindBuilder<AnyTable>) => {
|
|
834
872
|
// Create join builder for this relation's table
|
|
835
|
-
const joinBuilder = new JoinFindBuilder(relation.table.
|
|
873
|
+
const joinBuilder = new JoinFindBuilder(relation.table.name, relation.table);
|
|
836
874
|
if (builderFn) {
|
|
837
875
|
builderFn(joinBuilder);
|
|
838
876
|
}
|
|
@@ -933,10 +971,16 @@ export interface IUnitOfWork {
|
|
|
933
971
|
): TypedUnitOfWork<TOtherSchema, [], any, TOtherHooks>;
|
|
934
972
|
|
|
935
973
|
// Schema registration (for cross-fragment operations like hooks)
|
|
936
|
-
registerSchema(schema: AnySchema, namespace: string): void;
|
|
937
|
-
|
|
938
|
-
// Hook triggering (schema-agnostic, string-based hook names)
|
|
939
|
-
|
|
974
|
+
registerSchema(schema: AnySchema, namespace: string | null): void;
|
|
975
|
+
|
|
976
|
+
// Hook triggering (schema-agnostic, string-based hook names).
|
|
977
|
+
// Namespace identifies which fragment/dispatcher owns this hook.
|
|
978
|
+
triggerHook(
|
|
979
|
+
namespace: string,
|
|
980
|
+
hookName: string,
|
|
981
|
+
payload: unknown,
|
|
982
|
+
options?: TriggerHookOptions,
|
|
983
|
+
): void;
|
|
940
984
|
|
|
941
985
|
getTriggeredHooks(): readonly TriggeredHook[];
|
|
942
986
|
}
|
|
@@ -948,14 +992,55 @@ export interface IUnitOfWork {
|
|
|
948
992
|
*
|
|
949
993
|
* Note: This is just a marker interface. Restriction is enforced by the UnitOfWork class itself.
|
|
950
994
|
*/
|
|
951
|
-
export interface IUnitOfWorkRestricted
|
|
952
|
-
|
|
995
|
+
export interface IUnitOfWorkRestricted extends Omit<
|
|
996
|
+
IUnitOfWork,
|
|
997
|
+
"executeRetrieve" | "executeMutations"
|
|
998
|
+
> {}
|
|
999
|
+
|
|
1000
|
+
export type UOWInstrumentationPhase =
|
|
1001
|
+
| "beforeRetrieve"
|
|
1002
|
+
| "afterRetrieve"
|
|
1003
|
+
| "beforeMutate"
|
|
1004
|
+
| "afterMutate";
|
|
1005
|
+
|
|
1006
|
+
export type UOWInstrumentationInjection =
|
|
1007
|
+
| { type: "conflict"; reason?: string }
|
|
1008
|
+
| { type: "error"; error: Error };
|
|
1009
|
+
|
|
1010
|
+
export type UOWInstrumentationContext = {
|
|
1011
|
+
phase: UOWInstrumentationPhase;
|
|
1012
|
+
uowName?: string;
|
|
1013
|
+
idempotencyKey: string;
|
|
1014
|
+
retrievalOpsCount: number;
|
|
1015
|
+
mutationOpsCount: number;
|
|
1016
|
+
uow: IUnitOfWork;
|
|
1017
|
+
};
|
|
1018
|
+
|
|
1019
|
+
export type UOWInstrumentation = {
|
|
1020
|
+
beforeRetrieve?: (
|
|
1021
|
+
ctx: UOWInstrumentationContext,
|
|
1022
|
+
) => void | Promise<void> | UOWInstrumentationInjection;
|
|
1023
|
+
afterRetrieve?: (
|
|
1024
|
+
ctx: UOWInstrumentationContext,
|
|
1025
|
+
) => void | Promise<void> | UOWInstrumentationInjection;
|
|
1026
|
+
beforeMutate?: (
|
|
1027
|
+
ctx: UOWInstrumentationContext,
|
|
1028
|
+
) => void | Promise<void> | UOWInstrumentationInjection;
|
|
1029
|
+
afterMutate?: (
|
|
1030
|
+
ctx: UOWInstrumentationContext,
|
|
1031
|
+
) => void | Promise<void> | UOWInstrumentationInjection;
|
|
1032
|
+
};
|
|
1033
|
+
|
|
1034
|
+
export type UOWInstrumentationFinalizer = {
|
|
1035
|
+
afterRetrieve?: (ctx: UOWInstrumentationContext) => void | Promise<void>;
|
|
1036
|
+
afterMutate?: (ctx: UOWInstrumentationContext) => void | Promise<void>;
|
|
1037
|
+
};
|
|
953
1038
|
|
|
954
1039
|
export function createUnitOfWork(
|
|
955
1040
|
compiler: UOWCompiler<unknown>,
|
|
956
1041
|
executor: UOWExecutor<unknown, unknown>,
|
|
957
1042
|
decoder: UOWDecoder<unknown>,
|
|
958
|
-
schemaNamespaceMap?: WeakMap<AnySchema, string>,
|
|
1043
|
+
schemaNamespaceMap?: WeakMap<AnySchema, string | null>,
|
|
959
1044
|
name?: string,
|
|
960
1045
|
): UnitOfWork {
|
|
961
1046
|
return new UnitOfWork(compiler, executor, decoder, name, undefined, schemaNamespaceMap);
|
|
@@ -965,6 +1050,16 @@ export interface UnitOfWorkConfig {
|
|
|
965
1050
|
dryRun?: boolean;
|
|
966
1051
|
onQuery?: (query: unknown) => void;
|
|
967
1052
|
idempotencyKey?: string;
|
|
1053
|
+
instrumentation?: UOWInstrumentation;
|
|
1054
|
+
instrumentationFinalizer?: UOWInstrumentationFinalizer;
|
|
1055
|
+
}
|
|
1056
|
+
|
|
1057
|
+
function isUowInstrumentationInjection(value: unknown): value is UOWInstrumentationInjection {
|
|
1058
|
+
if (!value || typeof value !== "object") {
|
|
1059
|
+
return false;
|
|
1060
|
+
}
|
|
1061
|
+
const injection = value as UOWInstrumentationInjection;
|
|
1062
|
+
return injection.type === "conflict" || injection.type === "error";
|
|
968
1063
|
}
|
|
969
1064
|
|
|
970
1065
|
/**
|
|
@@ -1207,10 +1302,11 @@ export class UnitOfWork<const TRawInput = unknown> implements IUnitOfWork {
|
|
|
1207
1302
|
#compiler: UOWCompiler<unknown>;
|
|
1208
1303
|
#executor: UOWExecutor<unknown, TRawInput>;
|
|
1209
1304
|
#decoder: UOWDecoder<TRawInput>;
|
|
1210
|
-
#schemaNamespaceMap: WeakMap<AnySchema, string>;
|
|
1305
|
+
#schemaNamespaceMap: WeakMap<AnySchema, string | null>;
|
|
1211
1306
|
|
|
1212
1307
|
#retrievalResults?: unknown[];
|
|
1213
1308
|
#createdInternalIds: (bigint | null)[] = [];
|
|
1309
|
+
#readTrackingEnabled = false;
|
|
1214
1310
|
|
|
1215
1311
|
// Phase coordination promises
|
|
1216
1312
|
#retrievalPhaseDeferred = new DeferredPromise<unknown[]>();
|
|
@@ -1232,7 +1328,7 @@ export class UnitOfWork<const TRawInput = unknown> implements IUnitOfWork {
|
|
|
1232
1328
|
decoder: UOWDecoder<TRawInput>,
|
|
1233
1329
|
name?: string,
|
|
1234
1330
|
config?: UnitOfWorkConfig,
|
|
1235
|
-
schemaNamespaceMap?: WeakMap<AnySchema, string>,
|
|
1331
|
+
schemaNamespaceMap?: WeakMap<AnySchema, string | null>,
|
|
1236
1332
|
) {
|
|
1237
1333
|
this.#compiler = compiler;
|
|
1238
1334
|
this.#executor = executor;
|
|
@@ -1243,12 +1339,67 @@ export class UnitOfWork<const TRawInput = unknown> implements IUnitOfWork {
|
|
|
1243
1339
|
this.#idempotencyKey = config?.idempotencyKey ?? crypto.randomUUID();
|
|
1244
1340
|
}
|
|
1245
1341
|
|
|
1342
|
+
#createInstrumentationContext(phase: UOWInstrumentationPhase): UOWInstrumentationContext {
|
|
1343
|
+
return {
|
|
1344
|
+
phase,
|
|
1345
|
+
uowName: this.#name,
|
|
1346
|
+
idempotencyKey: this.#idempotencyKey,
|
|
1347
|
+
retrievalOpsCount: this.#retrievalOps.length,
|
|
1348
|
+
mutationOpsCount: this.#mutationOps.length,
|
|
1349
|
+
uow: this,
|
|
1350
|
+
};
|
|
1351
|
+
}
|
|
1352
|
+
|
|
1353
|
+
async #runInstrumentation(
|
|
1354
|
+
phase: UOWInstrumentationPhase,
|
|
1355
|
+
): Promise<UOWInstrumentationInjection | null> {
|
|
1356
|
+
const hook = this.#config?.instrumentation?.[phase];
|
|
1357
|
+
if (!hook) {
|
|
1358
|
+
return null;
|
|
1359
|
+
}
|
|
1360
|
+
|
|
1361
|
+
const result = await hook(this.#createInstrumentationContext(phase));
|
|
1362
|
+
if (isUowInstrumentationInjection(result)) {
|
|
1363
|
+
return result;
|
|
1364
|
+
}
|
|
1365
|
+
|
|
1366
|
+
return null;
|
|
1367
|
+
}
|
|
1368
|
+
|
|
1369
|
+
async #runInstrumentationFinalizer(phase: "afterRetrieve" | "afterMutate"): Promise<void> {
|
|
1370
|
+
const hook = this.#config?.instrumentationFinalizer?.[phase];
|
|
1371
|
+
if (!hook) {
|
|
1372
|
+
return;
|
|
1373
|
+
}
|
|
1374
|
+
|
|
1375
|
+
await hook(this.#createInstrumentationContext(phase));
|
|
1376
|
+
}
|
|
1377
|
+
|
|
1378
|
+
#handleRetrieveInjection(injection: UOWInstrumentationInjection): never {
|
|
1379
|
+
if (injection.type === "error") {
|
|
1380
|
+
throw injection.error;
|
|
1381
|
+
}
|
|
1382
|
+
|
|
1383
|
+
throw new Error(injection.reason ?? "Injected conflict");
|
|
1384
|
+
}
|
|
1385
|
+
|
|
1386
|
+
#handleMutationInjection(injection: UOWInstrumentationInjection): { success: false } | never {
|
|
1387
|
+
if (injection.type === "error") {
|
|
1388
|
+
throw injection.error;
|
|
1389
|
+
}
|
|
1390
|
+
|
|
1391
|
+
this.#state = "executed";
|
|
1392
|
+
this.#createdInternalIds.length = 0;
|
|
1393
|
+
this.#mutationPhaseDeferred.resolve();
|
|
1394
|
+
return { success: false };
|
|
1395
|
+
}
|
|
1396
|
+
|
|
1246
1397
|
/**
|
|
1247
1398
|
* Register a schema with its namespace for cross-fragment operations.
|
|
1248
1399
|
* This is used for internal fragments like hooks that need to create
|
|
1249
1400
|
* records in a different schema during the same transaction.
|
|
1250
1401
|
*/
|
|
1251
|
-
registerSchema(schema: AnySchema, namespace: string): void {
|
|
1402
|
+
registerSchema(schema: AnySchema, namespace: string | null): void {
|
|
1252
1403
|
this.#schemaNamespaceMap.set(schema, namespace);
|
|
1253
1404
|
}
|
|
1254
1405
|
|
|
@@ -1299,6 +1450,7 @@ export class UnitOfWork<const TRawInput = unknown> implements IUnitOfWork {
|
|
|
1299
1450
|
child.#mutationOps = this.#mutationOps;
|
|
1300
1451
|
child.#retrievalResults = this.#retrievalResults;
|
|
1301
1452
|
child.#createdInternalIds = this.#createdInternalIds;
|
|
1453
|
+
child.#readTrackingEnabled = this.#readTrackingEnabled;
|
|
1302
1454
|
child.#retrievalPhaseDeferred = this.#retrievalPhaseDeferred;
|
|
1303
1455
|
child.#mutationPhaseDeferred = this.#mutationPhaseDeferred;
|
|
1304
1456
|
child.#retrievalError = this.#retrievalError;
|
|
@@ -1348,6 +1500,7 @@ export class UnitOfWork<const TRawInput = unknown> implements IUnitOfWork {
|
|
|
1348
1500
|
this.#mutationOps = [];
|
|
1349
1501
|
this.#retrievalResults = undefined;
|
|
1350
1502
|
this.#createdInternalIds = [];
|
|
1503
|
+
this.#readTrackingEnabled = false;
|
|
1351
1504
|
|
|
1352
1505
|
// Reset state
|
|
1353
1506
|
this.#state = "building-retrieval";
|
|
@@ -1368,8 +1521,14 @@ export class UnitOfWork<const TRawInput = unknown> implements IUnitOfWork {
|
|
|
1368
1521
|
/**
|
|
1369
1522
|
* Trigger a hook to be executed after the transaction commits.
|
|
1370
1523
|
*/
|
|
1371
|
-
triggerHook(
|
|
1524
|
+
triggerHook(
|
|
1525
|
+
namespace: string,
|
|
1526
|
+
hookName: string,
|
|
1527
|
+
payload: unknown,
|
|
1528
|
+
options?: TriggerHookOptions,
|
|
1529
|
+
): void {
|
|
1372
1530
|
this.#triggeredHooks.push({
|
|
1531
|
+
namespace,
|
|
1373
1532
|
hookName,
|
|
1374
1533
|
payload,
|
|
1375
1534
|
options,
|
|
@@ -1387,6 +1546,14 @@ export class UnitOfWork<const TRawInput = unknown> implements IUnitOfWork {
|
|
|
1387
1546
|
return this.#coordinator.parent?.state ?? this.#state;
|
|
1388
1547
|
}
|
|
1389
1548
|
|
|
1549
|
+
enableReadTracking(): void {
|
|
1550
|
+
this.#readTrackingEnabled = true;
|
|
1551
|
+
}
|
|
1552
|
+
|
|
1553
|
+
get readTrackingEnabled(): boolean {
|
|
1554
|
+
return this.#readTrackingEnabled;
|
|
1555
|
+
}
|
|
1556
|
+
|
|
1390
1557
|
get name(): string | undefined {
|
|
1391
1558
|
return this.#name;
|
|
1392
1559
|
}
|
|
@@ -1426,13 +1593,25 @@ export class UnitOfWork<const TRawInput = unknown> implements IUnitOfWork {
|
|
|
1426
1593
|
);
|
|
1427
1594
|
}
|
|
1428
1595
|
|
|
1596
|
+
let afterRan = false;
|
|
1597
|
+
let failed = false;
|
|
1429
1598
|
try {
|
|
1430
1599
|
// Wait for all children to signal readiness
|
|
1431
1600
|
await this.#coordinator.retrievalReadinessPromise;
|
|
1432
1601
|
|
|
1602
|
+
const beforeInjection = await this.#runInstrumentation("beforeRetrieve");
|
|
1603
|
+
if (beforeInjection) {
|
|
1604
|
+
return this.#handleRetrieveInjection(beforeInjection);
|
|
1605
|
+
}
|
|
1606
|
+
|
|
1433
1607
|
if (this.#retrievalOps.length === 0) {
|
|
1434
1608
|
this.#state = "building-mutation";
|
|
1435
1609
|
const emptyResults: unknown[] = [];
|
|
1610
|
+
afterRan = true;
|
|
1611
|
+
const afterInjection = await this.#runInstrumentation("afterRetrieve");
|
|
1612
|
+
if (afterInjection) {
|
|
1613
|
+
return this.#handleRetrieveInjection(afterInjection);
|
|
1614
|
+
}
|
|
1436
1615
|
this.#retrievalPhaseDeferred.resolve(emptyResults);
|
|
1437
1616
|
return emptyResults;
|
|
1438
1617
|
}
|
|
@@ -1450,6 +1629,11 @@ export class UnitOfWork<const TRawInput = unknown> implements IUnitOfWork {
|
|
|
1450
1629
|
if (this.#config?.dryRun) {
|
|
1451
1630
|
this.#state = "executed";
|
|
1452
1631
|
const emptyResults: unknown[] = [];
|
|
1632
|
+
afterRan = true;
|
|
1633
|
+
const afterInjection = await this.#runInstrumentation("afterRetrieve");
|
|
1634
|
+
if (afterInjection) {
|
|
1635
|
+
return this.#handleRetrieveInjection(afterInjection);
|
|
1636
|
+
}
|
|
1453
1637
|
this.#retrievalPhaseDeferred.resolve(emptyResults);
|
|
1454
1638
|
return emptyResults;
|
|
1455
1639
|
}
|
|
@@ -1462,12 +1646,33 @@ export class UnitOfWork<const TRawInput = unknown> implements IUnitOfWork {
|
|
|
1462
1646
|
this.#retrievalResults = results;
|
|
1463
1647
|
this.#state = "building-mutation";
|
|
1464
1648
|
|
|
1649
|
+
afterRan = true;
|
|
1650
|
+
const afterInjection = await this.#runInstrumentation("afterRetrieve");
|
|
1651
|
+
if (afterInjection) {
|
|
1652
|
+
return this.#handleRetrieveInjection(afterInjection);
|
|
1653
|
+
}
|
|
1654
|
+
|
|
1465
1655
|
this.#retrievalPhaseDeferred.resolve(this.#retrievalResults);
|
|
1466
1656
|
|
|
1467
1657
|
return this.#retrievalResults;
|
|
1468
1658
|
} catch (error) {
|
|
1469
1659
|
this.#retrievalError = error instanceof Error ? error : new Error(String(error));
|
|
1660
|
+
failed = true;
|
|
1470
1661
|
throw error;
|
|
1662
|
+
} finally {
|
|
1663
|
+
try {
|
|
1664
|
+
await this.#runInstrumentationFinalizer("afterRetrieve");
|
|
1665
|
+
} catch {
|
|
1666
|
+
// Ignore finalizer errors when unwinding failures.
|
|
1667
|
+
}
|
|
1668
|
+
|
|
1669
|
+
if (!afterRan && failed) {
|
|
1670
|
+
try {
|
|
1671
|
+
await this.#runInstrumentation("afterRetrieve");
|
|
1672
|
+
} catch {
|
|
1673
|
+
// Ignore after-retrieve hook errors when unwinding failures.
|
|
1674
|
+
}
|
|
1675
|
+
}
|
|
1471
1676
|
}
|
|
1472
1677
|
}
|
|
1473
1678
|
|
|
@@ -1484,15 +1689,23 @@ export class UnitOfWork<const TRawInput = unknown> implements IUnitOfWork {
|
|
|
1484
1689
|
throw new Error(`Cannot execute mutations from state ${this.#state}.`);
|
|
1485
1690
|
}
|
|
1486
1691
|
|
|
1692
|
+
let afterRan = false;
|
|
1693
|
+
let failed = false;
|
|
1487
1694
|
try {
|
|
1488
1695
|
// Wait for all children to signal readiness
|
|
1489
1696
|
await this.#coordinator.mutationReadinessPromise;
|
|
1490
1697
|
|
|
1698
|
+
const beforeInjection = await this.#runInstrumentation("beforeMutate");
|
|
1699
|
+
if (beforeInjection) {
|
|
1700
|
+
return this.#handleMutationInjection(beforeInjection);
|
|
1701
|
+
}
|
|
1702
|
+
|
|
1491
1703
|
// Compile mutation operations using single compiler
|
|
1492
1704
|
const mutationBatch: CompiledMutation<unknown>[] = [];
|
|
1493
1705
|
for (const op of this.#mutationOps) {
|
|
1494
1706
|
const compiled = this.#compiler.compileMutationOperation(op);
|
|
1495
1707
|
if (compiled !== null) {
|
|
1708
|
+
compiled.uowId = this.#idempotencyKey;
|
|
1496
1709
|
this.#config?.onQuery?.(compiled);
|
|
1497
1710
|
mutationBatch.push(compiled);
|
|
1498
1711
|
}
|
|
@@ -1500,6 +1713,11 @@ export class UnitOfWork<const TRawInput = unknown> implements IUnitOfWork {
|
|
|
1500
1713
|
|
|
1501
1714
|
if (this.#config?.dryRun) {
|
|
1502
1715
|
this.#state = "executed";
|
|
1716
|
+
afterRan = true;
|
|
1717
|
+
const afterInjection = await this.#runInstrumentation("afterMutate");
|
|
1718
|
+
if (afterInjection) {
|
|
1719
|
+
return this.#handleMutationInjection(afterInjection);
|
|
1720
|
+
}
|
|
1503
1721
|
this.#mutationPhaseDeferred.resolve();
|
|
1504
1722
|
return {
|
|
1505
1723
|
success: true,
|
|
@@ -1516,6 +1734,12 @@ export class UnitOfWork<const TRawInput = unknown> implements IUnitOfWork {
|
|
|
1516
1734
|
this.#createdInternalIds.push(...result.createdInternalIds);
|
|
1517
1735
|
}
|
|
1518
1736
|
|
|
1737
|
+
afterRan = true;
|
|
1738
|
+
const afterInjection = await this.#runInstrumentation("afterMutate");
|
|
1739
|
+
if (afterInjection) {
|
|
1740
|
+
return this.#handleMutationInjection(afterInjection);
|
|
1741
|
+
}
|
|
1742
|
+
|
|
1519
1743
|
// Resolve the mutation phase promise to unblock waiting service methods
|
|
1520
1744
|
this.#mutationPhaseDeferred.resolve();
|
|
1521
1745
|
|
|
@@ -1524,7 +1748,22 @@ export class UnitOfWork<const TRawInput = unknown> implements IUnitOfWork {
|
|
|
1524
1748
|
};
|
|
1525
1749
|
} catch (error) {
|
|
1526
1750
|
this.#mutationError = error instanceof Error ? error : new Error(String(error));
|
|
1751
|
+
failed = true;
|
|
1527
1752
|
throw error;
|
|
1753
|
+
} finally {
|
|
1754
|
+
try {
|
|
1755
|
+
await this.#runInstrumentationFinalizer("afterMutate");
|
|
1756
|
+
} catch {
|
|
1757
|
+
// Ignore finalizer errors when unwinding failures.
|
|
1758
|
+
}
|
|
1759
|
+
|
|
1760
|
+
if (!afterRan && failed) {
|
|
1761
|
+
try {
|
|
1762
|
+
await this.#runInstrumentation("afterMutate");
|
|
1763
|
+
} catch {
|
|
1764
|
+
// Ignore after-mutate hook errors when unwinding failures.
|
|
1765
|
+
}
|
|
1766
|
+
}
|
|
1528
1767
|
}
|
|
1529
1768
|
}
|
|
1530
1769
|
|
|
@@ -1623,6 +1862,7 @@ export class UnitOfWork<const TRawInput = unknown> implements IUnitOfWork {
|
|
|
1623
1862
|
for (const op of this.#mutationOps) {
|
|
1624
1863
|
const compiled = compiler.compileMutationOperation(op);
|
|
1625
1864
|
if (compiled !== null) {
|
|
1865
|
+
compiled.uowId = this.#idempotencyKey;
|
|
1626
1866
|
mutationBatch.push(compiled);
|
|
1627
1867
|
}
|
|
1628
1868
|
}
|
|
@@ -1645,20 +1885,22 @@ export class TypedUnitOfWork<
|
|
|
1645
1885
|
const TRetrievalResults extends unknown[] = [],
|
|
1646
1886
|
const TRawInput = unknown,
|
|
1647
1887
|
const THooks extends HooksMap = {},
|
|
1648
|
-
>
|
|
1649
|
-
{
|
|
1888
|
+
> {
|
|
1650
1889
|
#schema: TSchema;
|
|
1651
|
-
#namespace?: string;
|
|
1890
|
+
#namespace?: string | null;
|
|
1652
1891
|
#uow: UnitOfWork<TRawInput>;
|
|
1653
1892
|
#operationIndices: number[] = [];
|
|
1654
1893
|
#cachedRetrievalPhase?: Promise<TRetrievalResults>;
|
|
1655
1894
|
|
|
1656
|
-
constructor(schema: TSchema, namespace: string | undefined, uow: UnitOfWork<TRawInput>) {
|
|
1895
|
+
constructor(schema: TSchema, namespace: string | null | undefined, uow: UnitOfWork<TRawInput>) {
|
|
1657
1896
|
this.#schema = schema;
|
|
1658
1897
|
this.#namespace = namespace;
|
|
1659
1898
|
this.#uow = uow;
|
|
1660
1899
|
}
|
|
1661
1900
|
|
|
1901
|
+
/**
|
|
1902
|
+
* Type-only access to retrieval results for this typed UOW.
|
|
1903
|
+
*/
|
|
1662
1904
|
get $results(): Prettify<TRetrievalResults> {
|
|
1663
1905
|
throw new Error("type only");
|
|
1664
1906
|
}
|
|
@@ -1746,7 +1988,21 @@ export class TypedUnitOfWork<
|
|
|
1746
1988
|
return this.#uow.forSchema<TOtherSchema, TOtherHooks>(schema, hooks);
|
|
1747
1989
|
}
|
|
1748
1990
|
|
|
1749
|
-
|
|
1991
|
+
/**
|
|
1992
|
+
* Database timestamp helper for inserts.
|
|
1993
|
+
*/
|
|
1994
|
+
now(): DbNow {
|
|
1995
|
+
return dbNow();
|
|
1996
|
+
}
|
|
1997
|
+
|
|
1998
|
+
/**
|
|
1999
|
+
* Build a database interval for use with now().plus(...).
|
|
2000
|
+
*/
|
|
2001
|
+
interval(input: DbIntervalInput): DbInterval {
|
|
2002
|
+
return dbInterval(input);
|
|
2003
|
+
}
|
|
2004
|
+
|
|
2005
|
+
registerSchema(schema: AnySchema, namespace: string | null): void {
|
|
1750
2006
|
this.#uow.registerSchema(schema, namespace);
|
|
1751
2007
|
}
|
|
1752
2008
|
|
|
@@ -1823,6 +2079,7 @@ export class TypedUnitOfWork<
|
|
|
1823
2079
|
indexName,
|
|
1824
2080
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
1825
2081
|
options: options as any,
|
|
2082
|
+
readTracking: this.#uow.readTrackingEnabled,
|
|
1826
2083
|
});
|
|
1827
2084
|
|
|
1828
2085
|
// Track which operation index belongs to this view
|
|
@@ -1901,6 +2158,7 @@ export class TypedUnitOfWork<
|
|
|
1901
2158
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
1902
2159
|
options: options as any,
|
|
1903
2160
|
withSingleResult: true,
|
|
2161
|
+
readTracking: this.#uow.readTrackingEnabled,
|
|
1904
2162
|
});
|
|
1905
2163
|
|
|
1906
2164
|
// Track which operation index belongs to this view
|
|
@@ -1949,6 +2207,7 @@ export class TypedUnitOfWork<
|
|
|
1949
2207
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
1950
2208
|
options: options as any,
|
|
1951
2209
|
withCursor: true,
|
|
2210
|
+
readTracking: this.#uow.readTrackingEnabled,
|
|
1952
2211
|
});
|
|
1953
2212
|
|
|
1954
2213
|
// Track which operation index belongs to this view
|
|
@@ -1989,7 +2248,7 @@ export class TypedUnitOfWork<
|
|
|
1989
2248
|
let updatedValues = values;
|
|
1990
2249
|
|
|
1991
2250
|
// Check if ID value is provided in values
|
|
1992
|
-
const providedIdValue = (values as Record<string, unknown>)[idColumn.
|
|
2251
|
+
const providedIdValue = (values as Record<string, unknown>)[idColumn.name];
|
|
1993
2252
|
|
|
1994
2253
|
if (providedIdValue !== undefined) {
|
|
1995
2254
|
// Extract string from FragnoId or use string directly
|
|
@@ -2007,7 +2266,7 @@ export class TypedUnitOfWork<
|
|
|
2007
2266
|
const generated = idColumn.generateDefaultValue();
|
|
2008
2267
|
if (generated === undefined) {
|
|
2009
2268
|
throw new Error(
|
|
2010
|
-
`No ID value provided and ID column ${idColumn.
|
|
2269
|
+
`No ID value provided and ID column ${idColumn.name} has no default generator`,
|
|
2011
2270
|
);
|
|
2012
2271
|
}
|
|
2013
2272
|
externalId = generated as string;
|
|
@@ -2015,7 +2274,7 @@ export class TypedUnitOfWork<
|
|
|
2015
2274
|
// Add the generated ID to values so it's used in the insert
|
|
2016
2275
|
updatedValues = {
|
|
2017
2276
|
...values,
|
|
2018
|
-
[idColumn.
|
|
2277
|
+
[idColumn.name]: externalId,
|
|
2019
2278
|
} as TableToInsertValues<TSchema["tables"][TableName]>;
|
|
2020
2279
|
}
|
|
2021
2280
|
|
|
@@ -2105,15 +2364,27 @@ export class TypedUnitOfWork<
|
|
|
2105
2364
|
throw new Error("type only");
|
|
2106
2365
|
}
|
|
2107
2366
|
|
|
2367
|
+
get namespace(): string | null | undefined {
|
|
2368
|
+
return this.#namespace;
|
|
2369
|
+
}
|
|
2370
|
+
|
|
2108
2371
|
/**
|
|
2109
2372
|
* Trigger a hook to be executed after the transaction commits.
|
|
2373
|
+
* The namespace is automatically injected from this typed view's schema registration.
|
|
2110
2374
|
*/
|
|
2111
2375
|
triggerHook<K extends keyof THooks & string>(
|
|
2112
2376
|
hookName: K,
|
|
2113
2377
|
payload: HookPayload<THooks[K]>,
|
|
2114
2378
|
options?: TriggerHookOptions,
|
|
2115
2379
|
): void {
|
|
2116
|
-
this.#
|
|
2380
|
+
if (this.#namespace === undefined) {
|
|
2381
|
+
throw new Error(
|
|
2382
|
+
"Cannot trigger hook: schema has no registered namespace. " +
|
|
2383
|
+
"Ensure the schema is registered with a namespace via registerSchema().",
|
|
2384
|
+
);
|
|
2385
|
+
}
|
|
2386
|
+
const hookNamespace = this.#namespace ?? this.#schema.name;
|
|
2387
|
+
this.#uow.triggerHook(hookNamespace, hookName, payload, options);
|
|
2117
2388
|
}
|
|
2118
2389
|
|
|
2119
2390
|
getTriggeredHooks(): ReadonlyArray<TriggeredHook> {
|