@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
|
@@ -1,5 +1,10 @@
|
|
|
1
1
|
import { describe, it, expect } from "vitest";
|
|
2
|
+
|
|
3
|
+
import { BetterSQLite3DriverConfig } from "../../adapters/generic-sql/driver-config";
|
|
4
|
+
import { GenericSQLUOWOperationCompiler } from "../../adapters/generic-sql/query/generic-sql-uow-operation-compiler";
|
|
5
|
+
import { createUOWCompilerFromOperationCompiler } from "../../adapters/shared/uow-operation-compiler";
|
|
2
6
|
import { schema, idColumn, type FragnoId, referenceColumn } from "../../schema/create";
|
|
7
|
+
import type { CompiledQuery } from "../../sql-driver/sql-driver";
|
|
3
8
|
import {
|
|
4
9
|
type UOWCompiler,
|
|
5
10
|
type UOWDecoder,
|
|
@@ -7,10 +12,6 @@ import {
|
|
|
7
12
|
type CompiledMutation,
|
|
8
13
|
type UOWExecutor,
|
|
9
14
|
} from "./unit-of-work";
|
|
10
|
-
import { GenericSQLUOWOperationCompiler } from "../../adapters/generic-sql/query/generic-sql-uow-operation-compiler";
|
|
11
|
-
import { BetterSQLite3DriverConfig } from "../../adapters/generic-sql/driver-config";
|
|
12
|
-
import { createUOWCompilerFromOperationCompiler } from "../../adapters/shared/uow-operation-compiler";
|
|
13
|
-
import type { CompiledQuery } from "../../sql-driver/sql-driver";
|
|
14
15
|
|
|
15
16
|
// Create compiler using actual implementation
|
|
16
17
|
function createCompiler(): UOWCompiler<CompiledQuery> {
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { describe, expectTypeOf, it } from "vitest";
|
|
2
|
+
|
|
2
3
|
import { column, idColumn, referenceColumn, schema } from "../../schema/create";
|
|
3
|
-
import { JoinFindBuilder, UnitOfWork } from "./unit-of-work";
|
|
4
4
|
import type { FragnoId, FragnoReference } from "../../schema/create";
|
|
5
|
+
import { JoinFindBuilder, UnitOfWork } from "./unit-of-work";
|
|
5
6
|
|
|
6
7
|
type Prettify<T> = {
|
|
7
8
|
[K in keyof T]: T[K];
|
|
@@ -138,7 +139,6 @@ describe("UnitOfWork type tests", () => {
|
|
|
138
139
|
const [_userResult] = await uow1.executeRetrieve();
|
|
139
140
|
type UserResult = RecursivePrettify<(typeof _userResult)[number]>;
|
|
140
141
|
|
|
141
|
-
// @ts-expect-error assert type
|
|
142
142
|
expectTypeOf<UserResult>().toEqualTypeOf<{
|
|
143
143
|
id: FragnoId;
|
|
144
144
|
name: string;
|
|
@@ -174,13 +174,8 @@ describe("UnitOfWork type tests", () => {
|
|
|
174
174
|
type _JoinOutInviter = Prettify<_JoinOut["inviter"]>;
|
|
175
175
|
// ^?
|
|
176
176
|
|
|
177
|
-
// FIXME: There should not be a `{}` in the type
|
|
178
177
|
expectTypeOf<_JoinOutInviter>().toEqualTypeOf<{
|
|
179
|
-
id: FragnoId;
|
|
180
178
|
name: string;
|
|
181
|
-
email: string;
|
|
182
|
-
age: number | null;
|
|
183
|
-
invitedBy: FragnoReference | null;
|
|
184
179
|
} | null>();
|
|
185
180
|
});
|
|
186
181
|
|
|
@@ -194,14 +189,49 @@ describe("UnitOfWork type tests", () => {
|
|
|
194
189
|
type _JoinOutPosts = Prettify<_JoinOut["posts"]>;
|
|
195
190
|
// ^?
|
|
196
191
|
|
|
197
|
-
// FIXME: There should not be a `{}` in the array
|
|
198
192
|
expectTypeOf<_JoinOutPosts>().toEqualTypeOf<
|
|
199
193
|
{
|
|
200
|
-
id: FragnoId;
|
|
201
194
|
title: string;
|
|
202
|
-
content: string;
|
|
203
|
-
userId: FragnoReference;
|
|
204
195
|
}[]
|
|
205
196
|
>();
|
|
206
197
|
});
|
|
198
|
+
|
|
199
|
+
it("preserves nested select narrowing in join builder", () => {
|
|
200
|
+
const builder = new JoinFindBuilder("users", testSchema.tables.users);
|
|
201
|
+
|
|
202
|
+
const _builderOut = builder.join((jb) =>
|
|
203
|
+
jb.posts((pb) => pb.select(["title"]).join((jb2) => jb2.author((ab) => ab.select(["name"])))),
|
|
204
|
+
);
|
|
205
|
+
|
|
206
|
+
type JoinOut = InferJoinOutPrettify<typeof _builderOut>;
|
|
207
|
+
type Post = Prettify<JoinOut["posts"][number]>;
|
|
208
|
+
type PostTitle = Post["title"];
|
|
209
|
+
type Author = Prettify<NonNullable<Post["author"]>>;
|
|
210
|
+
|
|
211
|
+
expectTypeOf<PostTitle>().toEqualTypeOf<string>();
|
|
212
|
+
expectTypeOf<Author>().toEqualTypeOf<{ name: string }>();
|
|
213
|
+
});
|
|
214
|
+
|
|
215
|
+
it("preserves nested select narrowing via UOW find", async () => {
|
|
216
|
+
const uow = createTestUOW();
|
|
217
|
+
|
|
218
|
+
const uow1 = uow.find("users", (b) =>
|
|
219
|
+
b
|
|
220
|
+
.whereIndex("primary")
|
|
221
|
+
.join((jb) =>
|
|
222
|
+
jb.posts((pb) =>
|
|
223
|
+
pb.select(["title"]).join((jb2) => jb2.author((ab) => ab.select(["name"]))),
|
|
224
|
+
),
|
|
225
|
+
),
|
|
226
|
+
);
|
|
227
|
+
|
|
228
|
+
const [_userResult] = await uow1.executeRetrieve();
|
|
229
|
+
type User = RecursivePrettify<(typeof _userResult)[number]>;
|
|
230
|
+
type Post = Prettify<User["posts"][number]>;
|
|
231
|
+
type PostTitle = Post["title"];
|
|
232
|
+
type Author = Prettify<NonNullable<Post["author"]>>;
|
|
233
|
+
|
|
234
|
+
expectTypeOf<PostTitle>().toEqualTypeOf<string>();
|
|
235
|
+
expectTypeOf<Author>().toEqualTypeOf<{ name: string }>();
|
|
236
|
+
});
|
|
207
237
|
});
|
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
import { describe, it, expect, assert, expectTypeOf } from "vitest";
|
|
2
|
+
|
|
2
3
|
import { column, schema, idColumn, FragnoId } from "../../schema/create";
|
|
4
|
+
import { createIndexedBuilder } from "../condition-builder";
|
|
5
|
+
import type { SimpleQueryInterface } from "../simple-query-interface";
|
|
3
6
|
import {
|
|
4
7
|
type UOWCompiler,
|
|
5
8
|
type UOWDecoder,
|
|
@@ -8,8 +11,6 @@ import {
|
|
|
8
11
|
type InferIdColumnName,
|
|
9
12
|
type IndexColumns,
|
|
10
13
|
} from "./unit-of-work";
|
|
11
|
-
import { createIndexedBuilder } from "../condition-builder";
|
|
12
|
-
import type { SimpleQueryInterface } from "../simple-query-interface";
|
|
13
14
|
|
|
14
15
|
// Mock compiler and executor for testing
|
|
15
16
|
function createMockCompiler(): UOWCompiler<unknown> {
|
|
@@ -1909,3 +1910,28 @@ describe("findFirst convenience method", () => {
|
|
|
1909
1910
|
expect(ops[0]?.indexName).toBe("_primary");
|
|
1910
1911
|
});
|
|
1911
1912
|
});
|
|
1913
|
+
|
|
1914
|
+
describe("triggerHook namespace resolution", () => {
|
|
1915
|
+
it("should fall back to schema name when namespace is null", () => {
|
|
1916
|
+
const hooksSchema = schema("hooks_test", (s) =>
|
|
1917
|
+
s.addTable("events", (t) => t.addColumn("id", idColumn())),
|
|
1918
|
+
);
|
|
1919
|
+
const uow = createUnitOfWork(createMockCompiler(), createMockExecutor(), createMockDecoder());
|
|
1920
|
+
uow.registerSchema(hooksSchema, null);
|
|
1921
|
+
|
|
1922
|
+
const hooks = {
|
|
1923
|
+
onTest: (_payload: { value: string }) => {},
|
|
1924
|
+
};
|
|
1925
|
+
|
|
1926
|
+
const typedUow = uow.forSchema(hooksSchema, hooks);
|
|
1927
|
+
typedUow.triggerHook("onTest", { value: "ok" });
|
|
1928
|
+
|
|
1929
|
+
const triggeredHooks = uow.getTriggeredHooks();
|
|
1930
|
+
expect(triggeredHooks).toHaveLength(1);
|
|
1931
|
+
expect(triggeredHooks[0]).toMatchObject({
|
|
1932
|
+
namespace: hooksSchema.name,
|
|
1933
|
+
hookName: "onTest",
|
|
1934
|
+
payload: { value: "ok" },
|
|
1935
|
+
});
|
|
1936
|
+
});
|
|
1937
|
+
});
|
|
@@ -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
|
*/
|
|
@@ -167,6 +176,7 @@ export type RetrievalOperation<
|
|
|
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";
|
|
@@ -366,6 +376,7 @@ export class FindBuilder<
|
|
|
366
376
|
`Use either select() or selectCount(), not both.`,
|
|
367
377
|
);
|
|
368
378
|
}
|
|
379
|
+
// prettier-ignore
|
|
369
380
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
370
381
|
(this as any).#selectClause = columns;
|
|
371
382
|
return this as unknown as FindBuilder<TTable, TNewSelect, TJoinOut>;
|
|
@@ -575,6 +586,17 @@ export class UpdateBuilder<TTable extends AnyTable> {
|
|
|
575
586
|
return this;
|
|
576
587
|
}
|
|
577
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
|
+
|
|
578
600
|
/**
|
|
579
601
|
* Enable version checking for optimistic concurrency control
|
|
580
602
|
* @throws Error if the ID is just a string (no version available)
|
|
@@ -711,6 +733,7 @@ export class JoinFindBuilder<
|
|
|
711
733
|
select<const TNewSelect extends SelectClause<TTable>>(
|
|
712
734
|
columns: TNewSelect,
|
|
713
735
|
): JoinFindBuilder<TTable, TNewSelect, TJoinOut> {
|
|
736
|
+
// prettier-ignore
|
|
714
737
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
715
738
|
(this as any).#selectClause = columns;
|
|
716
739
|
return this as unknown as JoinFindBuilder<TTable, TNewSelect, TJoinOut>;
|
|
@@ -809,15 +832,22 @@ export type IndexedJoinBuilder<TTable extends AnyTable, TJoinOut> = {
|
|
|
809
832
|
infer TRelationType,
|
|
810
833
|
infer TTargetTable
|
|
811
834
|
>
|
|
812
|
-
? <
|
|
813
|
-
|
|
814
|
-
|
|
815
|
-
|
|
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,
|
|
816
842
|
) => IndexedJoinBuilder<
|
|
817
843
|
TTable,
|
|
818
844
|
TJoinOut & {
|
|
819
845
|
[P in K]: MapRelationType<
|
|
820
|
-
SelectResult<
|
|
846
|
+
SelectResult<
|
|
847
|
+
TTargetTable,
|
|
848
|
+
ExtractJoinBuilderOut<ReturnType<TBuilderFn>>,
|
|
849
|
+
ExtractJoinBuilderSelect<ReturnType<TBuilderFn>>
|
|
850
|
+
>
|
|
821
851
|
>[TRelationType];
|
|
822
852
|
}
|
|
823
853
|
>
|
|
@@ -943,8 +973,14 @@ export interface IUnitOfWork {
|
|
|
943
973
|
// Schema registration (for cross-fragment operations like hooks)
|
|
944
974
|
registerSchema(schema: AnySchema, namespace: string | null): void;
|
|
945
975
|
|
|
946
|
-
// Hook triggering (schema-agnostic, string-based hook names)
|
|
947
|
-
|
|
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;
|
|
948
984
|
|
|
949
985
|
getTriggeredHooks(): readonly TriggeredHook[];
|
|
950
986
|
}
|
|
@@ -956,8 +992,10 @@ export interface IUnitOfWork {
|
|
|
956
992
|
*
|
|
957
993
|
* Note: This is just a marker interface. Restriction is enforced by the UnitOfWork class itself.
|
|
958
994
|
*/
|
|
959
|
-
export interface IUnitOfWorkRestricted
|
|
960
|
-
|
|
995
|
+
export interface IUnitOfWorkRestricted extends Omit<
|
|
996
|
+
IUnitOfWork,
|
|
997
|
+
"executeRetrieve" | "executeMutations"
|
|
998
|
+
> {}
|
|
961
999
|
|
|
962
1000
|
export type UOWInstrumentationPhase =
|
|
963
1001
|
| "beforeRetrieve"
|
|
@@ -1268,6 +1306,7 @@ export class UnitOfWork<const TRawInput = unknown> implements IUnitOfWork {
|
|
|
1268
1306
|
|
|
1269
1307
|
#retrievalResults?: unknown[];
|
|
1270
1308
|
#createdInternalIds: (bigint | null)[] = [];
|
|
1309
|
+
#readTrackingEnabled = false;
|
|
1271
1310
|
|
|
1272
1311
|
// Phase coordination promises
|
|
1273
1312
|
#retrievalPhaseDeferred = new DeferredPromise<unknown[]>();
|
|
@@ -1411,6 +1450,7 @@ export class UnitOfWork<const TRawInput = unknown> implements IUnitOfWork {
|
|
|
1411
1450
|
child.#mutationOps = this.#mutationOps;
|
|
1412
1451
|
child.#retrievalResults = this.#retrievalResults;
|
|
1413
1452
|
child.#createdInternalIds = this.#createdInternalIds;
|
|
1453
|
+
child.#readTrackingEnabled = this.#readTrackingEnabled;
|
|
1414
1454
|
child.#retrievalPhaseDeferred = this.#retrievalPhaseDeferred;
|
|
1415
1455
|
child.#mutationPhaseDeferred = this.#mutationPhaseDeferred;
|
|
1416
1456
|
child.#retrievalError = this.#retrievalError;
|
|
@@ -1460,6 +1500,7 @@ export class UnitOfWork<const TRawInput = unknown> implements IUnitOfWork {
|
|
|
1460
1500
|
this.#mutationOps = [];
|
|
1461
1501
|
this.#retrievalResults = undefined;
|
|
1462
1502
|
this.#createdInternalIds = [];
|
|
1503
|
+
this.#readTrackingEnabled = false;
|
|
1463
1504
|
|
|
1464
1505
|
// Reset state
|
|
1465
1506
|
this.#state = "building-retrieval";
|
|
@@ -1480,8 +1521,14 @@ export class UnitOfWork<const TRawInput = unknown> implements IUnitOfWork {
|
|
|
1480
1521
|
/**
|
|
1481
1522
|
* Trigger a hook to be executed after the transaction commits.
|
|
1482
1523
|
*/
|
|
1483
|
-
triggerHook(
|
|
1524
|
+
triggerHook(
|
|
1525
|
+
namespace: string,
|
|
1526
|
+
hookName: string,
|
|
1527
|
+
payload: unknown,
|
|
1528
|
+
options?: TriggerHookOptions,
|
|
1529
|
+
): void {
|
|
1484
1530
|
this.#triggeredHooks.push({
|
|
1531
|
+
namespace,
|
|
1485
1532
|
hookName,
|
|
1486
1533
|
payload,
|
|
1487
1534
|
options,
|
|
@@ -1499,6 +1546,14 @@ export class UnitOfWork<const TRawInput = unknown> implements IUnitOfWork {
|
|
|
1499
1546
|
return this.#coordinator.parent?.state ?? this.#state;
|
|
1500
1547
|
}
|
|
1501
1548
|
|
|
1549
|
+
enableReadTracking(): void {
|
|
1550
|
+
this.#readTrackingEnabled = true;
|
|
1551
|
+
}
|
|
1552
|
+
|
|
1553
|
+
get readTrackingEnabled(): boolean {
|
|
1554
|
+
return this.#readTrackingEnabled;
|
|
1555
|
+
}
|
|
1556
|
+
|
|
1502
1557
|
get name(): string | undefined {
|
|
1503
1558
|
return this.#name;
|
|
1504
1559
|
}
|
|
@@ -1830,8 +1885,7 @@ export class TypedUnitOfWork<
|
|
|
1830
1885
|
const TRetrievalResults extends unknown[] = [],
|
|
1831
1886
|
const TRawInput = unknown,
|
|
1832
1887
|
const THooks extends HooksMap = {},
|
|
1833
|
-
>
|
|
1834
|
-
{
|
|
1888
|
+
> {
|
|
1835
1889
|
#schema: TSchema;
|
|
1836
1890
|
#namespace?: string | null;
|
|
1837
1891
|
#uow: UnitOfWork<TRawInput>;
|
|
@@ -1844,6 +1898,9 @@ export class TypedUnitOfWork<
|
|
|
1844
1898
|
this.#uow = uow;
|
|
1845
1899
|
}
|
|
1846
1900
|
|
|
1901
|
+
/**
|
|
1902
|
+
* Type-only access to retrieval results for this typed UOW.
|
|
1903
|
+
*/
|
|
1847
1904
|
get $results(): Prettify<TRetrievalResults> {
|
|
1848
1905
|
throw new Error("type only");
|
|
1849
1906
|
}
|
|
@@ -1931,6 +1988,20 @@ export class TypedUnitOfWork<
|
|
|
1931
1988
|
return this.#uow.forSchema<TOtherSchema, TOtherHooks>(schema, hooks);
|
|
1932
1989
|
}
|
|
1933
1990
|
|
|
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
|
+
|
|
1934
2005
|
registerSchema(schema: AnySchema, namespace: string | null): void {
|
|
1935
2006
|
this.#uow.registerSchema(schema, namespace);
|
|
1936
2007
|
}
|
|
@@ -2008,6 +2079,7 @@ export class TypedUnitOfWork<
|
|
|
2008
2079
|
indexName,
|
|
2009
2080
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
2010
2081
|
options: options as any,
|
|
2082
|
+
readTracking: this.#uow.readTrackingEnabled,
|
|
2011
2083
|
});
|
|
2012
2084
|
|
|
2013
2085
|
// Track which operation index belongs to this view
|
|
@@ -2086,6 +2158,7 @@ export class TypedUnitOfWork<
|
|
|
2086
2158
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
2087
2159
|
options: options as any,
|
|
2088
2160
|
withSingleResult: true,
|
|
2161
|
+
readTracking: this.#uow.readTrackingEnabled,
|
|
2089
2162
|
});
|
|
2090
2163
|
|
|
2091
2164
|
// Track which operation index belongs to this view
|
|
@@ -2134,6 +2207,7 @@ export class TypedUnitOfWork<
|
|
|
2134
2207
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
2135
2208
|
options: options as any,
|
|
2136
2209
|
withCursor: true,
|
|
2210
|
+
readTracking: this.#uow.readTrackingEnabled,
|
|
2137
2211
|
});
|
|
2138
2212
|
|
|
2139
2213
|
// Track which operation index belongs to this view
|
|
@@ -2290,15 +2364,27 @@ export class TypedUnitOfWork<
|
|
|
2290
2364
|
throw new Error("type only");
|
|
2291
2365
|
}
|
|
2292
2366
|
|
|
2367
|
+
get namespace(): string | null | undefined {
|
|
2368
|
+
return this.#namespace;
|
|
2369
|
+
}
|
|
2370
|
+
|
|
2293
2371
|
/**
|
|
2294
2372
|
* Trigger a hook to be executed after the transaction commits.
|
|
2373
|
+
* The namespace is automatically injected from this typed view's schema registration.
|
|
2295
2374
|
*/
|
|
2296
2375
|
triggerHook<K extends keyof THooks & string>(
|
|
2297
2376
|
hookName: K,
|
|
2298
2377
|
payload: HookPayload<THooks[K]>,
|
|
2299
2378
|
options?: TriggerHookOptions,
|
|
2300
2379
|
): void {
|
|
2301
|
-
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);
|
|
2302
2388
|
}
|
|
2303
2389
|
|
|
2304
2390
|
getTriggeredHooks(): ReadonlyArray<TriggeredHook> {
|
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
import { assert, describe, expect, it } from "vitest";
|
|
2
|
-
|
|
3
|
-
import { decodeResult } from "./value-decoding";
|
|
2
|
+
|
|
4
3
|
import {
|
|
5
4
|
SQLocalDriverConfig,
|
|
6
5
|
NodePostgresDriverConfig,
|
|
7
6
|
PGLiteDriverConfig,
|
|
8
7
|
MySQL2DriverConfig,
|
|
9
8
|
} from "../adapters/generic-sql/driver-config";
|
|
9
|
+
import { column, idColumn, referenceColumn, schema, FragnoId } from "../schema/create";
|
|
10
|
+
import { decodeResult } from "./value-decoding";
|
|
10
11
|
|
|
11
12
|
describe("decodeResult", () => {
|
|
12
13
|
const testSchema = schema("test", (s) => {
|
|
@@ -33,6 +34,11 @@ describe("decodeResult", () => {
|
|
|
33
34
|
type: "one",
|
|
34
35
|
from: { table: "posts", column: "userId" },
|
|
35
36
|
to: { table: "users", column: "id" },
|
|
37
|
+
})
|
|
38
|
+
.addReference("posts", {
|
|
39
|
+
type: "many",
|
|
40
|
+
from: { table: "users", column: "id" },
|
|
41
|
+
to: { table: "posts", column: "userId" },
|
|
36
42
|
});
|
|
37
43
|
});
|
|
38
44
|
|
|
@@ -300,6 +306,48 @@ describe("decodeResult", () => {
|
|
|
300
306
|
expect(author["id"].internalId).toBe(BigInt(200));
|
|
301
307
|
expect(author["name"]).toBe("Alice");
|
|
302
308
|
});
|
|
309
|
+
|
|
310
|
+
it("should return null for missing one relations when internal id is null", () => {
|
|
311
|
+
const result = decodeResult(
|
|
312
|
+
{
|
|
313
|
+
id: "post1",
|
|
314
|
+
title: "My Post",
|
|
315
|
+
"author:id": null,
|
|
316
|
+
"author:_internalId": null,
|
|
317
|
+
"author:_version": null,
|
|
318
|
+
"author:name": null,
|
|
319
|
+
},
|
|
320
|
+
postsTable,
|
|
321
|
+
sqliteConfig,
|
|
322
|
+
);
|
|
323
|
+
|
|
324
|
+
expect(result).toEqual({
|
|
325
|
+
id: "post1",
|
|
326
|
+
title: "My Post",
|
|
327
|
+
author: null,
|
|
328
|
+
});
|
|
329
|
+
});
|
|
330
|
+
|
|
331
|
+
it("should return empty array for missing many relations when internal id is null", () => {
|
|
332
|
+
const result = decodeResult(
|
|
333
|
+
{
|
|
334
|
+
id: "user1",
|
|
335
|
+
name: "Alice",
|
|
336
|
+
"posts:id": null,
|
|
337
|
+
"posts:_internalId": null,
|
|
338
|
+
"posts:_version": null,
|
|
339
|
+
"posts:title": null,
|
|
340
|
+
},
|
|
341
|
+
usersTable,
|
|
342
|
+
sqliteConfig,
|
|
343
|
+
);
|
|
344
|
+
|
|
345
|
+
expect(result).toEqual({
|
|
346
|
+
id: "user1",
|
|
347
|
+
name: "Alice",
|
|
348
|
+
posts: [],
|
|
349
|
+
});
|
|
350
|
+
});
|
|
303
351
|
});
|
|
304
352
|
|
|
305
353
|
describe("complete record decoding", () => {
|
|
@@ -1,9 +1,12 @@
|
|
|
1
|
-
import type { AnyTable } from "../schema/create";
|
|
2
|
-
import { createSQLSerializer } from "./serialize/create-sql-serializer";
|
|
3
|
-
import { FragnoId, FragnoReference } from "../schema/create";
|
|
4
1
|
import type { DriverConfig } from "../adapters/generic-sql/driver-config";
|
|
5
2
|
import type { SQLiteStorageMode } from "../adapters/generic-sql/sqlite-storage";
|
|
6
3
|
import type { NamingResolver } from "../naming/sql-naming";
|
|
4
|
+
import type { AnyTable } from "../schema/create";
|
|
5
|
+
import { FragnoId, FragnoReference } from "../schema/create";
|
|
6
|
+
import { createSQLSerializer } from "./serialize/create-sql-serializer";
|
|
7
|
+
|
|
8
|
+
const isNullish = (value: unknown): value is null | undefined =>
|
|
9
|
+
value === null || value === undefined;
|
|
7
10
|
|
|
8
11
|
/**
|
|
9
12
|
* Decodes a database result record to application format.
|
|
@@ -84,9 +87,19 @@ export function decodeResult(
|
|
|
84
87
|
continue;
|
|
85
88
|
}
|
|
86
89
|
|
|
90
|
+
const relationRow = relationData[relationName];
|
|
91
|
+
const internalIdKey = relation.table.getInternalIdColumn().name;
|
|
92
|
+
if (
|
|
93
|
+
Object.prototype.hasOwnProperty.call(relationRow, internalIdKey) &&
|
|
94
|
+
isNullish(relationRow[internalIdKey])
|
|
95
|
+
) {
|
|
96
|
+
output[relationName] = relation.type === "many" ? [] : null;
|
|
97
|
+
continue;
|
|
98
|
+
}
|
|
99
|
+
|
|
87
100
|
// Recursively decode the relation data
|
|
88
101
|
output[relationName] = decodeResult(
|
|
89
|
-
|
|
102
|
+
relationRow,
|
|
90
103
|
relation.table,
|
|
91
104
|
driverConfig,
|
|
92
105
|
sqliteStorageMode,
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { NamingResolver } from "../naming/sql-naming";
|
|
1
2
|
import type { AnyTable, AnyColumn } from "../schema/create";
|
|
2
3
|
import { FragnoId, FragnoReference } from "../schema/create";
|
|
3
4
|
import {
|
|
@@ -5,7 +6,6 @@ import {
|
|
|
5
6
|
generateRuntimeDefault,
|
|
6
7
|
type RuntimeDefaultContext,
|
|
7
8
|
} from "./column-defaults";
|
|
8
|
-
import type { NamingResolver } from "../naming/sql-naming";
|
|
9
9
|
|
|
10
10
|
/**
|
|
11
11
|
* Marker class for reference column values that need subquery resolution.
|