@fragno-dev/db 0.2.1 → 0.3.0
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 +206 -140
- package/CHANGELOG.md +67 -0
- package/README.md +30 -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 +27 -9
- package/dist/adapters/generic-sql/generic-sql-adapter.d.ts.map +1 -1
- package/dist/adapters/generic-sql/generic-sql-adapter.js +55 -16
- package/dist/adapters/generic-sql/generic-sql-adapter.js.map +1 -1
- package/dist/adapters/generic-sql/generic-sql-uow-executor.js +129 -3
- package/dist/adapters/generic-sql/generic-sql-uow-executor.js.map +1 -1
- package/dist/adapters/generic-sql/migration/dialect/mysql.js +24 -5
- package/dist/adapters/generic-sql/migration/dialect/mysql.js.map +1 -1
- package/dist/adapters/generic-sql/migration/dialect/postgres.js +6 -5
- package/dist/adapters/generic-sql/migration/dialect/postgres.js.map +1 -1
- package/dist/adapters/generic-sql/migration/dialect/sqlite.js +21 -10
- package/dist/adapters/generic-sql/migration/dialect/sqlite.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 +8 -8
- package/dist/adapters/generic-sql/migration/prepared-migrations.js.map +1 -1
- package/dist/adapters/generic-sql/migration/sql-generator.js +74 -51
- package/dist/adapters/generic-sql/migration/sql-generator.js.map +1 -1
- package/dist/adapters/generic-sql/query/create-sql-query-compiler.js +6 -5
- 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/generic-sql-uow-operation-compiler.js +25 -17
- 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 +15 -12
- package/dist/adapters/generic-sql/query/sql-query-compiler.js.map +1 -1
- package/dist/adapters/generic-sql/query/where-builder.js +38 -28
- 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 +7 -3
- package/dist/adapters/generic-sql/uow-decoder.js.map +1 -1
- package/dist/adapters/generic-sql/uow-encoder.js +28 -8
- package/dist/adapters/generic-sql/uow-encoder.js.map +1 -1
- package/dist/adapters/in-memory/condition-evaluator.js +131 -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 +176 -0
- package/dist/adapters/in-memory/in-memory-adapter.js.map +1 -0
- package/dist/adapters/in-memory/in-memory-uow.js +648 -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 +28 -0
- package/dist/adapters/in-memory/options.d.ts.map +1 -0
- package/dist/adapters/in-memory/options.js +61 -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.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/db-fragment-definition-builder.d.ts +45 -96
- package/dist/db-fragment-definition-builder.d.ts.map +1 -1
- package/dist/db-fragment-definition-builder.js +121 -99
- package/dist/db-fragment-definition-builder.js.map +1 -1
- package/dist/dispatchers/cloudflare-do/index.d.ts +26 -0
- package/dist/dispatchers/cloudflare-do/index.d.ts.map +1 -0
- package/dist/dispatchers/cloudflare-do/index.js +63 -0
- package/dist/dispatchers/cloudflare-do/index.js.map +1 -0
- package/dist/dispatchers/node/index.d.ts +17 -0
- package/dist/dispatchers/node/index.d.ts.map +1 -0
- package/dist/dispatchers/node/index.js +59 -0
- package/dist/dispatchers/node/index.js.map +1 -0
- package/dist/fragments/internal-fragment.d.ts +172 -9
- package/dist/fragments/internal-fragment.d.ts.map +1 -1
- package/dist/fragments/internal-fragment.js +193 -74
- package/dist/fragments/internal-fragment.js.map +1 -1
- package/dist/fragments/internal-fragment.routes.js +29 -0
- package/dist/fragments/internal-fragment.routes.js.map +1 -0
- package/dist/fragments/internal-fragment.schema.d.ts +9 -0
- package/dist/fragments/internal-fragment.schema.d.ts.map +1 -0
- package/dist/fragments/internal-fragment.schema.js +22 -0
- package/dist/fragments/internal-fragment.schema.js.map +1 -0
- package/dist/hooks/durable-hooks-processor.d.ts +14 -0
- package/dist/hooks/durable-hooks-processor.d.ts.map +1 -0
- package/dist/hooks/durable-hooks-processor.js +32 -0
- package/dist/hooks/durable-hooks-processor.js.map +1 -0
- package/dist/hooks/hooks.d.ts +47 -4
- package/dist/hooks/hooks.d.ts.map +1 -1
- package/dist/hooks/hooks.js +106 -39
- package/dist/hooks/hooks.js.map +1 -1
- package/dist/migration-engine/auto-from-schema.js +14 -11
- 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 +72 -33
- package/dist/migration-engine/generation-engine.js.map +1 -1
- package/dist/migration-engine/shared.js.map +1 -1
- package/dist/mod.d.ts +17 -10
- package/dist/mod.d.ts.map +1 -1
- package/dist/mod.js +14 -8
- 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/node_modules/.pnpm/{rou3@0.7.10 → rou3@0.7.12}/node_modules/rou3/dist/index.js +8 -5
- package/dist/node_modules/.pnpm/rou3@0.7.12/node_modules/rou3/dist/index.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 +52 -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/packages/fragno/dist/api/fragment-definition-builder.js +3 -2
- package/dist/packages/fragno/dist/api/fragment-definition-builder.js.map +1 -1
- package/dist/packages/fragno/dist/api/fragment-instantiator.js +164 -20
- package/dist/packages/fragno/dist/api/fragment-instantiator.js.map +1 -1
- package/dist/packages/fragno/dist/api/request-input-context.js +67 -0
- package/dist/packages/fragno/dist/api/request-input-context.js.map +1 -1
- package/dist/packages/fragno/dist/api/route.js +14 -1
- package/dist/packages/fragno/dist/api/route.js.map +1 -1
- package/dist/packages/fragno/dist/internal/trace-context.js +12 -0
- package/dist/packages/fragno/dist/internal/trace-context.js.map +1 -0
- package/dist/query/column-defaults.js +20 -4
- package/dist/query/column-defaults.js.map +1 -1
- package/dist/query/cursor.d.ts +3 -1
- package/dist/query/cursor.d.ts.map +1 -1
- package/dist/query/cursor.js +45 -14
- package/dist/query/cursor.js.map +1 -1
- package/dist/query/db-now.d.ts +8 -0
- package/dist/query/db-now.d.ts.map +1 -0
- package/dist/query/db-now.js +7 -0
- package/dist/query/db-now.js.map +1 -0
- package/dist/query/serialize/create-sql-serializer.js +3 -2
- 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 +55 -11
- 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 +6 -1
- package/dist/query/simple-query-interface.d.ts.map +1 -1
- package/dist/query/unit-of-work/execute-unit-of-work.d.ts +351 -100
- 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 +440 -267
- 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 +67 -22
- package/dist/query/unit-of-work/unit-of-work.d.ts.map +1 -1
- package/dist/query/unit-of-work/unit-of-work.js +110 -13
- package/dist/query/unit-of-work/unit-of-work.js.map +1 -1
- package/dist/query/value-decoding.js +8 -5
- 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 +40 -14
- package/dist/schema/create.d.ts.map +1 -1
- package/dist/schema/create.js +82 -42
- package/dist/schema/create.js.map +1 -1
- package/dist/schema/generate-id.d.ts +20 -0
- package/dist/schema/generate-id.d.ts.map +1 -0
- package/dist/schema/generate-id.js +28 -0
- package/dist/schema/generate-id.js.map +1 -0
- package/dist/schema/type-conversion/create-sql-type-mapper.js +3 -2
- 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} +82 -56
- 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 +296 -0
- package/dist/schema-output/prisma.js.map +1 -0
- package/dist/util/default-database-adapter.js +61 -0
- package/dist/util/default-database-adapter.js.map +1 -0
- package/dist/with-database.d.ts +1 -1
- package/dist/with-database.d.ts.map +1 -1
- package/dist/with-database.js +12 -3
- package/dist/with-database.js.map +1 -1
- package/package.json +43 -28
- package/src/adapters/adapters.ts +30 -24
- package/src/adapters/drizzle/migrate-drizzle.test.ts +54 -33
- package/src/adapters/drizzle/migration-parity-drizzle-kit.test.ts +599 -0
- package/src/adapters/drizzle/test-utils.ts +12 -8
- package/src/adapters/generic-sql/driver-config.ts +38 -0
- package/src/adapters/generic-sql/generic-sql-adapter.test.ts +5 -5
- package/src/adapters/generic-sql/generic-sql-adapter.ts +110 -24
- package/src/adapters/generic-sql/generic-sql-uow-executor.test.ts +54 -0
- package/src/adapters/generic-sql/generic-sql-uow-executor.ts +231 -3
- package/src/adapters/generic-sql/migration/adapter-migration-parity.test.ts +118 -0
- package/src/adapters/generic-sql/migration/dialect/mysql.test.ts +26 -8
- package/src/adapters/generic-sql/migration/dialect/mysql.ts +46 -8
- package/src/adapters/generic-sql/migration/dialect/postgres.test.ts +25 -7
- package/src/adapters/generic-sql/migration/dialect/postgres.ts +8 -4
- package/src/adapters/generic-sql/migration/dialect/sqlite.test.ts +47 -8
- package/src/adapters/generic-sql/migration/dialect/sqlite.ts +27 -12
- package/src/adapters/generic-sql/migration/prepared-migrations.test.ts +128 -39
- package/src/adapters/generic-sql/migration/prepared-migrations.ts +15 -8
- package/src/adapters/generic-sql/migration/sql-generator.ts +142 -65
- package/src/adapters/generic-sql/query/create-sql-query-compiler.ts +9 -6
- package/src/adapters/generic-sql/query/cursor-utils.test.ts +271 -0
- package/src/adapters/generic-sql/query/cursor-utils.ts +41 -6
- package/src/adapters/generic-sql/query/generic-sql-uow-operation-compiler.test.ts +27 -27
- package/src/adapters/generic-sql/query/generic-sql-uow-operation-compiler.ts +38 -24
- package/src/adapters/generic-sql/query/select-builder.test.ts +15 -11
- package/src/adapters/generic-sql/query/select-builder.ts +6 -2
- package/src/adapters/generic-sql/query/sql-query-compiler.test.ts +52 -2
- package/src/adapters/generic-sql/query/sql-query-compiler.ts +50 -15
- package/src/adapters/generic-sql/query/where-builder.test.ts +91 -17
- package/src/adapters/generic-sql/query/where-builder.ts +90 -38
- package/src/adapters/{kysely/kysely-adapter-pglite.test.ts → generic-sql/sql-adapter-pglite-migrations.test.ts} +6 -6
- package/src/adapters/generic-sql/sql-adapter-pglite-pagination.test.ts +806 -0
- package/src/adapters/{drizzle/drizzle-adapter-pglite.test.ts → generic-sql/sql-adapter-pglite-queries.test.ts} +11 -11
- package/src/adapters/generic-sql/{test/generic-drizzle-adapter-sqlite3.test.ts → sql-adapter-sqlite3-driver.test.ts} +49 -35
- package/src/adapters/{drizzle/drizzle-adapter-sqlite3.test.ts → generic-sql/sql-adapter-sqlite3-uow.test.ts} +48 -32
- package/src/adapters/{kysely/kysely-adapter-sqlocal.test.ts → generic-sql/sql-adapter-sqlocal.test.ts} +6 -6
- package/src/adapters/generic-sql/sqlite-storage.ts +20 -0
- package/src/adapters/generic-sql/uow-decoder.test.ts +1 -1
- package/src/adapters/generic-sql/uow-decoder.ts +21 -3
- package/src/adapters/generic-sql/uow-encoder.test.ts +33 -2
- package/src/adapters/generic-sql/uow-encoder.ts +50 -11
- package/src/adapters/in-memory/condition-evaluator.test.ts +193 -0
- package/src/adapters/in-memory/condition-evaluator.ts +275 -0
- package/src/adapters/in-memory/errors.ts +20 -0
- package/src/adapters/in-memory/in-memory-adapter.ts +277 -0
- package/src/adapters/in-memory/in-memory-uow.mutations.test.ts +296 -0
- package/src/adapters/in-memory/in-memory-uow.retrieval.test.ts +100 -0
- package/src/adapters/in-memory/in-memory-uow.ts +1348 -0
- package/src/adapters/in-memory/index.ts +3 -0
- package/src/adapters/in-memory/options.test.ts +41 -0
- package/src/adapters/in-memory/options.ts +87 -0
- package/src/adapters/in-memory/reference-resolution.test.ts +50 -0
- package/src/adapters/in-memory/reference-resolution.ts +67 -0
- package/src/adapters/in-memory/sorted-array-index.test.ts +123 -0
- package/src/adapters/in-memory/sorted-array-index.ts +228 -0
- package/src/adapters/in-memory/store.test.ts +68 -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 +57 -0
- package/src/adapters/prisma/prisma-adapter-sqlite3.test.ts +1163 -0
- package/src/adapters/shared/from-unit-of-work-compiler.ts +3 -1
- package/src/adapters/shared/uow-operation-compiler.ts +26 -16
- package/src/adapters/sql/index.ts +12 -0
- package/src/db-fragment-definition-builder.test.ts +88 -54
- package/src/db-fragment-definition-builder.ts +201 -322
- package/src/db-fragment-instantiator.test.ts +169 -101
- package/src/db-fragment-integration.test.ts +301 -149
- package/src/dispatchers/cloudflare-do/index.test.ts +73 -0
- package/src/dispatchers/cloudflare-do/index.ts +104 -0
- package/src/dispatchers/node/index.test.ts +91 -0
- package/src/dispatchers/node/index.ts +87 -0
- package/src/fragments/internal-fragment.routes.ts +42 -0
- package/src/fragments/internal-fragment.schema.ts +51 -0
- package/src/fragments/internal-fragment.test.ts +730 -274
- package/src/fragments/internal-fragment.ts +447 -154
- package/src/hooks/durable-hooks-processor.test.ts +117 -0
- package/src/hooks/durable-hooks-processor.ts +67 -0
- package/src/hooks/hooks.test.ts +411 -259
- package/src/hooks/hooks.ts +265 -66
- package/src/migration-engine/auto-from-schema.test.ts +14 -14
- package/src/migration-engine/auto-from-schema.ts +5 -2
- package/src/migration-engine/create.test.ts +2 -2
- package/src/migration-engine/generation-engine.test.ts +229 -104
- package/src/migration-engine/generation-engine.ts +94 -64
- package/src/migration-engine/shared.ts +1 -0
- package/src/mod.ts +78 -30
- package/src/naming/sql-naming.ts +180 -0
- package/src/outbox/outbox-builder.ts +241 -0
- package/src/outbox/outbox.test.ts +253 -0
- package/src/outbox/outbox.ts +137 -0
- package/src/query/column-defaults.ts +41 -3
- package/src/query/condition-builder.test.ts +3 -3
- package/src/query/cursor.test.ts +116 -18
- package/src/query/cursor.ts +75 -26
- package/src/query/db-now.ts +6 -0
- package/src/query/query-type.test.ts +2 -2
- package/src/query/serialize/create-sql-serializer.ts +7 -2
- package/src/query/serialize/dialect/mysql-serializer.ts +12 -4
- package/src/query/serialize/dialect/postgres-serializer.ts +34 -4
- package/src/query/serialize/dialect/sqlite-serializer.test.ts +51 -1
- package/src/query/serialize/dialect/sqlite-serializer.ts +92 -9
- package/src/query/serialize/sql-serializer.ts +4 -4
- package/src/query/simple-query-interface.ts +5 -0
- package/src/query/unit-of-work/execute-unit-of-work.test.ts +1512 -1458
- package/src/query/unit-of-work/execute-unit-of-work.ts +1708 -596
- package/src/query/unit-of-work/tx-builder.test.ts +1041 -0
- package/src/query/unit-of-work/unit-of-work-coordinator.test.ts +32 -32
- package/src/query/unit-of-work/unit-of-work-types.test.ts +1 -1
- package/src/query/unit-of-work/unit-of-work.test.ts +231 -36
- package/src/query/unit-of-work/unit-of-work.ts +229 -31
- package/src/query/value-decoding.test.ts +13 -2
- package/src/query/value-decoding.ts +17 -4
- package/src/query/value-encoding.test.ts +85 -2
- package/src/query/value-encoding.ts +56 -6
- package/src/schema/create.test.ts +129 -42
- package/src/schema/create.ts +187 -47
- package/src/schema/generate-id.test.ts +57 -0
- package/src/schema/generate-id.ts +38 -0
- package/src/schema/serialize.test.ts +14 -2
- package/src/schema/type-conversion/create-sql-type-mapper.ts +7 -2
- package/src/schema/type-conversion/dialect/sqlite.ts +18 -0
- package/src/schema/type-conversion/type-mapping.test.ts +25 -1
- package/src/schema/validator.test.ts +197 -0
- package/src/schema/validator.ts +231 -0
- package/src/{adapters/drizzle/generate.test.ts → schema-output/drizzle.test.ts} +179 -129
- package/src/{adapters/drizzle/generate.ts → schema-output/drizzle.ts} +143 -93
- package/src/schema-output/prisma.test.ts +536 -0
- package/src/schema-output/prisma.ts +573 -0
- package/src/util/default-database-adapter.ts +106 -0
- package/src/with-database.ts +22 -3
- package/tsdown.config.ts +6 -4
- 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.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
- package/src/shared/config.ts +0 -10
- package/src/shared/connection-pool.ts +0 -24
- package/src/shared/prisma.ts +0 -45
|
@@ -4,6 +4,7 @@ import {
|
|
|
4
4
|
type UOWCompiler,
|
|
5
5
|
type UOWDecoder,
|
|
6
6
|
createUnitOfWork,
|
|
7
|
+
UnitOfWork,
|
|
7
8
|
type InferIdColumnName,
|
|
8
9
|
type IndexColumns,
|
|
9
10
|
} from "./unit-of-work";
|
|
@@ -38,7 +39,7 @@ function createMockDecoder(): UOWDecoder {
|
|
|
38
39
|
|
|
39
40
|
describe("FindBuilder", () => {
|
|
40
41
|
it("should support primary index", () => {
|
|
41
|
-
const testSchema = schema((s) =>
|
|
42
|
+
const testSchema = schema("test", (s) =>
|
|
42
43
|
s.addTable("users", (t) =>
|
|
43
44
|
t
|
|
44
45
|
.addColumn("id", idColumn())
|
|
@@ -59,7 +60,7 @@ describe("FindBuilder", () => {
|
|
|
59
60
|
});
|
|
60
61
|
|
|
61
62
|
it("should support custom indexes", () => {
|
|
62
|
-
const testSchema = schema((s) =>
|
|
63
|
+
const testSchema = schema("test", (s) =>
|
|
63
64
|
s.addTable("users", (t) =>
|
|
64
65
|
t
|
|
65
66
|
.addColumn("id", idColumn())
|
|
@@ -82,7 +83,7 @@ describe("FindBuilder", () => {
|
|
|
82
83
|
});
|
|
83
84
|
|
|
84
85
|
it("should support cursor-based pagination", () => {
|
|
85
|
-
const testSchema = schema((s) =>
|
|
86
|
+
const testSchema = schema("test", (s) =>
|
|
86
87
|
s.addTable("users", (t) => t.addColumn("id", idColumn()).addColumn("name", "string")),
|
|
87
88
|
);
|
|
88
89
|
|
|
@@ -102,7 +103,7 @@ describe("FindBuilder", () => {
|
|
|
102
103
|
});
|
|
103
104
|
|
|
104
105
|
it("should support backward cursor pagination", () => {
|
|
105
|
-
const testSchema = schema((s) =>
|
|
106
|
+
const testSchema = schema("test", (s) =>
|
|
106
107
|
s.addTable("users", (t) => t.addColumn("id", idColumn()).addColumn("name", "string")),
|
|
107
108
|
);
|
|
108
109
|
|
|
@@ -122,7 +123,7 @@ describe("FindBuilder", () => {
|
|
|
122
123
|
});
|
|
123
124
|
|
|
124
125
|
it("should throw RangeError for pageSize <= 0", () => {
|
|
125
|
-
const testSchema = schema((s) =>
|
|
126
|
+
const testSchema = schema("test", (s) =>
|
|
126
127
|
s.addTable("users", (t) => t.addColumn("id", idColumn()).addColumn("name", "string")),
|
|
127
128
|
);
|
|
128
129
|
|
|
@@ -142,7 +143,7 @@ describe("FindBuilder", () => {
|
|
|
142
143
|
});
|
|
143
144
|
|
|
144
145
|
it("should throw RangeError for non-integer pageSize", () => {
|
|
145
|
-
const testSchema = schema((s) =>
|
|
146
|
+
const testSchema = schema("test", (s) =>
|
|
146
147
|
s.addTable("users", (t) => t.addColumn("id", idColumn()).addColumn("name", "string")),
|
|
147
148
|
);
|
|
148
149
|
|
|
@@ -166,7 +167,7 @@ describe("FindBuilder", () => {
|
|
|
166
167
|
});
|
|
167
168
|
|
|
168
169
|
it("should throw if index doesn't exist", () => {
|
|
169
|
-
const testSchema = schema((s) =>
|
|
170
|
+
const testSchema = schema("test", (s) =>
|
|
170
171
|
s.addTable("users", (t) => t.addColumn("id", idColumn()).addColumn("name", "string")),
|
|
171
172
|
);
|
|
172
173
|
|
|
@@ -177,7 +178,7 @@ describe("FindBuilder", () => {
|
|
|
177
178
|
});
|
|
178
179
|
|
|
179
180
|
it("should throw if finalized without index", () => {
|
|
180
|
-
const testSchema = schema((s) =>
|
|
181
|
+
const testSchema = schema("test", (s) =>
|
|
181
182
|
s.addTable("users", (t) => t.addColumn("id", idColumn()).addColumn("name", "string")),
|
|
182
183
|
);
|
|
183
184
|
|
|
@@ -190,7 +191,7 @@ describe("FindBuilder", () => {
|
|
|
190
191
|
});
|
|
191
192
|
|
|
192
193
|
it("should support count operations", () => {
|
|
193
|
-
const testSchema = schema((s) =>
|
|
194
|
+
const testSchema = schema("test", (s) =>
|
|
194
195
|
s.addTable("users", (t) =>
|
|
195
196
|
t.addColumn("id", idColumn()).addColumn("name", "string").addColumn("age", "integer"),
|
|
196
197
|
),
|
|
@@ -205,7 +206,7 @@ describe("FindBuilder", () => {
|
|
|
205
206
|
});
|
|
206
207
|
|
|
207
208
|
it("should throw when using both select and selectCount", () => {
|
|
208
|
-
const testSchema = schema((s) =>
|
|
209
|
+
const testSchema = schema("test", (s) =>
|
|
209
210
|
s.addTable("users", (t) => t.addColumn("id", idColumn()).addColumn("name", "string")),
|
|
210
211
|
);
|
|
211
212
|
|
|
@@ -228,7 +229,7 @@ describe("FindBuilder", () => {
|
|
|
228
229
|
});
|
|
229
230
|
|
|
230
231
|
it("should support orderByIndex", () => {
|
|
231
|
-
const testSchema = schema((s) =>
|
|
232
|
+
const testSchema = schema("test", (s) =>
|
|
232
233
|
s.addTable("users", (t) =>
|
|
233
234
|
t
|
|
234
235
|
.addColumn("id", idColumn())
|
|
@@ -257,7 +258,7 @@ describe("FindBuilder", () => {
|
|
|
257
258
|
});
|
|
258
259
|
|
|
259
260
|
it("should support join operations", () => {
|
|
260
|
-
const testSchema = schema((s) =>
|
|
261
|
+
const testSchema = schema("test", (s) =>
|
|
261
262
|
s
|
|
262
263
|
.addTable("users", (t) => t.addColumn("id", idColumn()).addColumn("name", "string"))
|
|
263
264
|
.addTable("posts", (t) =>
|
|
@@ -291,7 +292,7 @@ describe("FindBuilder", () => {
|
|
|
291
292
|
});
|
|
292
293
|
|
|
293
294
|
it("should support join operations without builder function", () => {
|
|
294
|
-
const testSchema = schema((s) =>
|
|
295
|
+
const testSchema = schema("test", (s) =>
|
|
295
296
|
s
|
|
296
297
|
.addTable("users", (t) => t.addColumn("id", idColumn()).addColumn("name", "string"))
|
|
297
298
|
.addTable("posts", (t) =>
|
|
@@ -325,7 +326,7 @@ describe("FindBuilder", () => {
|
|
|
325
326
|
});
|
|
326
327
|
|
|
327
328
|
it("should support join with whereIndex", () => {
|
|
328
|
-
const testSchema = schema((s) =>
|
|
329
|
+
const testSchema = schema("test", (s) =>
|
|
329
330
|
s
|
|
330
331
|
.addTable("users", (t) =>
|
|
331
332
|
t
|
|
@@ -373,7 +374,7 @@ describe("FindBuilder", () => {
|
|
|
373
374
|
});
|
|
374
375
|
|
|
375
376
|
it("should support join with orderByIndex", () => {
|
|
376
|
-
const testSchema = schema((s) =>
|
|
377
|
+
const testSchema = schema("test", (s) =>
|
|
377
378
|
s
|
|
378
379
|
.addTable("users", (t) =>
|
|
379
380
|
t
|
|
@@ -418,7 +419,7 @@ describe("FindBuilder", () => {
|
|
|
418
419
|
});
|
|
419
420
|
|
|
420
421
|
it("should support join with pageSize", () => {
|
|
421
|
-
const testSchema = schema((s) =>
|
|
422
|
+
const testSchema = schema("test", (s) =>
|
|
422
423
|
s
|
|
423
424
|
.addTable("users", (t) => t.addColumn("id", idColumn()).addColumn("name", "string"))
|
|
424
425
|
.addTable("posts", (t) =>
|
|
@@ -453,7 +454,7 @@ describe("FindBuilder", () => {
|
|
|
453
454
|
});
|
|
454
455
|
|
|
455
456
|
it("should throw RangeError for invalid pageSize in join", () => {
|
|
456
|
-
const testSchema = schema((s) =>
|
|
457
|
+
const testSchema = schema("test", (s) =>
|
|
457
458
|
s
|
|
458
459
|
.addTable("users", (t) => t.addColumn("id", idColumn()).addColumn("name", "string"))
|
|
459
460
|
.addTable("posts", (t) =>
|
|
@@ -498,7 +499,7 @@ describe("FindBuilder", () => {
|
|
|
498
499
|
});
|
|
499
500
|
|
|
500
501
|
it("should support nested joins", () => {
|
|
501
|
-
const testSchema = schema((s) =>
|
|
502
|
+
const testSchema = schema("test", (s) =>
|
|
502
503
|
s
|
|
503
504
|
.addTable("users", (t) => t.addColumn("id", idColumn()).addColumn("name", "string"))
|
|
504
505
|
.addTable("posts", (t) =>
|
|
@@ -564,7 +565,7 @@ describe("FindBuilder", () => {
|
|
|
564
565
|
});
|
|
565
566
|
|
|
566
567
|
describe("IndexedConditionBuilder", () => {
|
|
567
|
-
const testSchema = schema((s) =>
|
|
568
|
+
const testSchema = schema("test", (s) =>
|
|
568
569
|
s.addTable("users", (t) =>
|
|
569
570
|
t
|
|
570
571
|
.addColumn("id", idColumn())
|
|
@@ -585,7 +586,7 @@ describe("IndexedConditionBuilder", () => {
|
|
|
585
586
|
const indexedColumns = new Set<string>();
|
|
586
587
|
for (const index of Object.values(usersTable.indexes)) {
|
|
587
588
|
for (const col of index.columns) {
|
|
588
|
-
indexedColumns.add(col.
|
|
589
|
+
indexedColumns.add(col.name);
|
|
589
590
|
}
|
|
590
591
|
}
|
|
591
592
|
|
|
@@ -712,7 +713,7 @@ describe("IndexedConditionBuilder", () => {
|
|
|
712
713
|
describe("type safety", () => {
|
|
713
714
|
it("should restrict to only indexed columns at type level", () => {
|
|
714
715
|
// This schema has "bio" column that is NOT indexed
|
|
715
|
-
const typeTestSchema = schema((s) =>
|
|
716
|
+
const typeTestSchema = schema("typetest", (s) =>
|
|
716
717
|
s.addTable("users", (t) =>
|
|
717
718
|
t
|
|
718
719
|
.addColumn("id", idColumn())
|
|
@@ -770,7 +771,7 @@ describe("IndexedConditionBuilder", () => {
|
|
|
770
771
|
});
|
|
771
772
|
|
|
772
773
|
describe("UpdateBuilder with string ID", () => {
|
|
773
|
-
const testSchema = schema((s) =>
|
|
774
|
+
const testSchema = schema("test", (s) =>
|
|
774
775
|
s.addTable("users", (t) => t.addColumn("id", idColumn()).addColumn("name", "string")),
|
|
775
776
|
);
|
|
776
777
|
|
|
@@ -806,7 +807,7 @@ describe("UpdateBuilder with string ID", () => {
|
|
|
806
807
|
});
|
|
807
808
|
|
|
808
809
|
describe("DeleteBuilder with string ID", () => {
|
|
809
|
-
const testSchema = schema((s) =>
|
|
810
|
+
const testSchema = schema("test", (s) =>
|
|
810
811
|
s.addTable("users", (t) => t.addColumn("id", idColumn()).addColumn("name", "string")),
|
|
811
812
|
);
|
|
812
813
|
|
|
@@ -838,8 +839,72 @@ describe("DeleteBuilder with string ID", () => {
|
|
|
838
839
|
});
|
|
839
840
|
});
|
|
840
841
|
|
|
842
|
+
describe("generateId", () => {
|
|
843
|
+
const testSchema = schema("test", (s) =>
|
|
844
|
+
s.addTable("users", (t) =>
|
|
845
|
+
t.addColumn("id", idColumn()).addColumn("email", "string").addColumn("name", "string"),
|
|
846
|
+
),
|
|
847
|
+
);
|
|
848
|
+
|
|
849
|
+
it("should generate a new FragnoId without creating a record", () => {
|
|
850
|
+
const uow = createUnitOfWork(createMockCompiler(), createMockExecutor(), createMockDecoder());
|
|
851
|
+
|
|
852
|
+
const id = uow.forSchema(testSchema).generateId("users");
|
|
853
|
+
|
|
854
|
+
expect(id).toBeInstanceOf(FragnoId);
|
|
855
|
+
expect(id.externalId).toBeDefined();
|
|
856
|
+
expect(typeof id.externalId).toBe("string");
|
|
857
|
+
expect(id.externalId.length).toBeGreaterThan(0);
|
|
858
|
+
expect(id.version).toBe(0);
|
|
859
|
+
|
|
860
|
+
// No mutation operations should be added
|
|
861
|
+
expect(uow.getMutationOperations()).toHaveLength(0);
|
|
862
|
+
});
|
|
863
|
+
|
|
864
|
+
it("should generate unique IDs on each call", () => {
|
|
865
|
+
const uow = createUnitOfWork(createMockCompiler(), createMockExecutor(), createMockDecoder());
|
|
866
|
+
const typedUow = uow.forSchema(testSchema);
|
|
867
|
+
|
|
868
|
+
const id1 = typedUow.generateId("users");
|
|
869
|
+
const id2 = typedUow.generateId("users");
|
|
870
|
+
|
|
871
|
+
expect(id1.externalId).not.toBe(id2.externalId);
|
|
872
|
+
});
|
|
873
|
+
|
|
874
|
+
it("should allow using generated ID in create", async () => {
|
|
875
|
+
const executor = {
|
|
876
|
+
executeRetrievalPhase: async () => [],
|
|
877
|
+
executeMutationPhase: async () => ({
|
|
878
|
+
success: true,
|
|
879
|
+
createdInternalIds: [1n],
|
|
880
|
+
}),
|
|
881
|
+
};
|
|
882
|
+
|
|
883
|
+
const uow = createUnitOfWork(createMockCompiler(), executor, createMockDecoder());
|
|
884
|
+
const typedUow = uow.forSchema(testSchema);
|
|
885
|
+
|
|
886
|
+
const id = typedUow.generateId("users");
|
|
887
|
+
typedUow.create("users", { id, email: "test@example.com", name: "Test" });
|
|
888
|
+
|
|
889
|
+
await uow.executeMutations();
|
|
890
|
+
const createdIds = uow.getCreatedIds();
|
|
891
|
+
|
|
892
|
+
expect(createdIds).toHaveLength(1);
|
|
893
|
+
expect(createdIds[0].externalId).toBe(id.externalId);
|
|
894
|
+
});
|
|
895
|
+
|
|
896
|
+
it("should throw for non-existent table", () => {
|
|
897
|
+
const uow = createUnitOfWork(createMockCompiler(), createMockExecutor(), createMockDecoder());
|
|
898
|
+
|
|
899
|
+
expect(() => {
|
|
900
|
+
// @ts-expect-error - testing runtime error for non-existent table
|
|
901
|
+
uow.forSchema(testSchema).generateId("nonexistent");
|
|
902
|
+
}).toThrow("Table nonexistent not found in schema");
|
|
903
|
+
});
|
|
904
|
+
});
|
|
905
|
+
|
|
841
906
|
describe("getCreatedIds", () => {
|
|
842
|
-
const testSchema = schema((s) =>
|
|
907
|
+
const testSchema = schema("test", (s) =>
|
|
843
908
|
s.addTable("users", (t) =>
|
|
844
909
|
t.addColumn("id", idColumn()).addColumn("email", "string").addColumn("name", "string"),
|
|
845
910
|
),
|
|
@@ -955,20 +1020,20 @@ describe("getCreatedIds", () => {
|
|
|
955
1020
|
describe("Phase promises with multiple views", () => {
|
|
956
1021
|
it("should return only operations added to the current view when using retrievalPhase promise", async () => {
|
|
957
1022
|
// Create two separate schemas
|
|
958
|
-
const schema1 = schema((s) =>
|
|
1023
|
+
const schema1 = schema("schema1", (s) =>
|
|
959
1024
|
s.addTable("users", (t) =>
|
|
960
1025
|
t.addColumn("id", idColumn()).addColumn("name", "string").addColumn("email", "string"),
|
|
961
1026
|
),
|
|
962
1027
|
);
|
|
963
1028
|
|
|
964
|
-
const schema2 = schema((s) =>
|
|
1029
|
+
const schema2 = schema("schema2", (s) =>
|
|
965
1030
|
s.addTable("posts", (t) =>
|
|
966
1031
|
t.addColumn("id", idColumn()).addColumn("title", "string").addColumn("content", "string"),
|
|
967
1032
|
),
|
|
968
1033
|
);
|
|
969
1034
|
|
|
970
1035
|
// Create a schema namespace map
|
|
971
|
-
const schemaNamespaceMap = new WeakMap<typeof schema1 | typeof schema2, string>();
|
|
1036
|
+
const schemaNamespaceMap = new WeakMap<typeof schema1 | typeof schema2, string | null>();
|
|
972
1037
|
schemaNamespaceMap.set(schema1, "namespace1");
|
|
973
1038
|
schemaNamespaceMap.set(schema2, "namespace2");
|
|
974
1039
|
|
|
@@ -1025,7 +1090,7 @@ describe("Phase promises with multiple views", () => {
|
|
|
1025
1090
|
});
|
|
1026
1091
|
|
|
1027
1092
|
it("should isolate operations when getUnitOfWork is called multiple times with same schema", async () => {
|
|
1028
|
-
const testSchema = schema((s) =>
|
|
1093
|
+
const testSchema = schema("test", (s) =>
|
|
1029
1094
|
s.addTable("users", (t) =>
|
|
1030
1095
|
t.addColumn("id", idColumn()).addColumn("name", "string").addColumn("email", "string"),
|
|
1031
1096
|
),
|
|
@@ -1071,19 +1136,19 @@ describe("Phase promises with multiple views", () => {
|
|
|
1071
1136
|
});
|
|
1072
1137
|
|
|
1073
1138
|
it("should show that getCreatedIds returns ALL created IDs regardless of which view created them", async () => {
|
|
1074
|
-
const schema1 = schema((s) =>
|
|
1139
|
+
const schema1 = schema("schema1", (s) =>
|
|
1075
1140
|
s.addTable("users", (t) =>
|
|
1076
1141
|
t.addColumn("id", idColumn()).addColumn("name", "string").addColumn("email", "string"),
|
|
1077
1142
|
),
|
|
1078
1143
|
);
|
|
1079
1144
|
|
|
1080
|
-
const schema2 = schema((s) =>
|
|
1145
|
+
const schema2 = schema("schema2", (s) =>
|
|
1081
1146
|
s.addTable("posts", (t) =>
|
|
1082
1147
|
t.addColumn("id", idColumn()).addColumn("title", "string").addColumn("content", "string"),
|
|
1083
1148
|
),
|
|
1084
1149
|
);
|
|
1085
1150
|
|
|
1086
|
-
const schemaNamespaceMap = new WeakMap<typeof schema1 | typeof schema2, string>();
|
|
1151
|
+
const schemaNamespaceMap = new WeakMap<typeof schema1 | typeof schema2, string | null>();
|
|
1087
1152
|
schemaNamespaceMap.set(schema1, "namespace1");
|
|
1088
1153
|
schemaNamespaceMap.set(schema2, "namespace2");
|
|
1089
1154
|
|
|
@@ -1126,19 +1191,19 @@ describe("Phase promises with multiple views", () => {
|
|
|
1126
1191
|
});
|
|
1127
1192
|
|
|
1128
1193
|
it("should generate unique IDs when multiple views create items", async () => {
|
|
1129
|
-
const schema1 = schema((s) =>
|
|
1194
|
+
const schema1 = schema("schema1", (s) =>
|
|
1130
1195
|
s.addTable("users", (t) =>
|
|
1131
1196
|
t.addColumn("id", idColumn()).addColumn("name", "string").addColumn("email", "string"),
|
|
1132
1197
|
),
|
|
1133
1198
|
);
|
|
1134
1199
|
|
|
1135
|
-
const schema2 = schema((s) =>
|
|
1200
|
+
const schema2 = schema("schema2", (s) =>
|
|
1136
1201
|
s.addTable("posts", (t) =>
|
|
1137
1202
|
t.addColumn("id", idColumn()).addColumn("title", "string").addColumn("content", "string"),
|
|
1138
1203
|
),
|
|
1139
1204
|
);
|
|
1140
1205
|
|
|
1141
|
-
const schemaNamespaceMap = new WeakMap<typeof schema1 | typeof schema2, string>();
|
|
1206
|
+
const schemaNamespaceMap = new WeakMap<typeof schema1 | typeof schema2, string | null>();
|
|
1142
1207
|
schemaNamespaceMap.set(schema1, "namespace1");
|
|
1143
1208
|
schemaNamespaceMap.set(schema2, "namespace2");
|
|
1144
1209
|
|
|
@@ -1193,8 +1258,138 @@ describe("Phase promises with multiple views", () => {
|
|
|
1193
1258
|
});
|
|
1194
1259
|
});
|
|
1195
1260
|
|
|
1261
|
+
describe("Instrumentation", () => {
|
|
1262
|
+
const testSchema = schema("test", (s) =>
|
|
1263
|
+
s.addTable("users", (t) =>
|
|
1264
|
+
t.addColumn("id", idColumn()).addColumn("name", "string").addColumn("email", "string"),
|
|
1265
|
+
),
|
|
1266
|
+
);
|
|
1267
|
+
|
|
1268
|
+
it("should run instrumentation hooks around retrieve and mutate phases", async () => {
|
|
1269
|
+
const calls: string[] = [];
|
|
1270
|
+
const contexts: Array<{
|
|
1271
|
+
phase: string;
|
|
1272
|
+
idempotencyKey: string;
|
|
1273
|
+
retrievalOpsCount: number;
|
|
1274
|
+
mutationOpsCount: number;
|
|
1275
|
+
}> = [];
|
|
1276
|
+
|
|
1277
|
+
const executor = {
|
|
1278
|
+
executeRetrievalPhase: async () => [[]],
|
|
1279
|
+
executeMutationPhase: async () => ({ success: true, createdInternalIds: [] }),
|
|
1280
|
+
};
|
|
1281
|
+
|
|
1282
|
+
const uow = new UnitOfWork(createMockCompiler(), executor, createMockDecoder(), undefined, {
|
|
1283
|
+
instrumentation: {
|
|
1284
|
+
beforeRetrieve: (ctx) => {
|
|
1285
|
+
calls.push("beforeRetrieve");
|
|
1286
|
+
contexts.push({
|
|
1287
|
+
phase: ctx.phase,
|
|
1288
|
+
idempotencyKey: ctx.idempotencyKey,
|
|
1289
|
+
retrievalOpsCount: ctx.retrievalOpsCount,
|
|
1290
|
+
mutationOpsCount: ctx.mutationOpsCount,
|
|
1291
|
+
});
|
|
1292
|
+
},
|
|
1293
|
+
afterRetrieve: (ctx) => {
|
|
1294
|
+
calls.push("afterRetrieve");
|
|
1295
|
+
contexts.push({
|
|
1296
|
+
phase: ctx.phase,
|
|
1297
|
+
idempotencyKey: ctx.idempotencyKey,
|
|
1298
|
+
retrievalOpsCount: ctx.retrievalOpsCount,
|
|
1299
|
+
mutationOpsCount: ctx.mutationOpsCount,
|
|
1300
|
+
});
|
|
1301
|
+
},
|
|
1302
|
+
beforeMutate: (ctx) => {
|
|
1303
|
+
calls.push("beforeMutate");
|
|
1304
|
+
contexts.push({
|
|
1305
|
+
phase: ctx.phase,
|
|
1306
|
+
idempotencyKey: ctx.idempotencyKey,
|
|
1307
|
+
retrievalOpsCount: ctx.retrievalOpsCount,
|
|
1308
|
+
mutationOpsCount: ctx.mutationOpsCount,
|
|
1309
|
+
});
|
|
1310
|
+
},
|
|
1311
|
+
afterMutate: (ctx) => {
|
|
1312
|
+
calls.push("afterMutate");
|
|
1313
|
+
contexts.push({
|
|
1314
|
+
phase: ctx.phase,
|
|
1315
|
+
idempotencyKey: ctx.idempotencyKey,
|
|
1316
|
+
retrievalOpsCount: ctx.retrievalOpsCount,
|
|
1317
|
+
mutationOpsCount: ctx.mutationOpsCount,
|
|
1318
|
+
});
|
|
1319
|
+
},
|
|
1320
|
+
},
|
|
1321
|
+
});
|
|
1322
|
+
|
|
1323
|
+
const typed = uow.forSchema(testSchema);
|
|
1324
|
+
typed.find("users", (b) => b.whereIndex("primary"));
|
|
1325
|
+
typed.create("users", { name: "Alice", email: "alice@example.com" });
|
|
1326
|
+
|
|
1327
|
+
await uow.executeRetrieve();
|
|
1328
|
+
await uow.executeMutations();
|
|
1329
|
+
|
|
1330
|
+
expect(calls).toEqual(["beforeRetrieve", "afterRetrieve", "beforeMutate", "afterMutate"]);
|
|
1331
|
+
|
|
1332
|
+
for (const ctx of contexts) {
|
|
1333
|
+
expect(ctx.idempotencyKey).toBeTypeOf("string");
|
|
1334
|
+
expect(ctx.idempotencyKey.length).toBeGreaterThan(0);
|
|
1335
|
+
expect(ctx.retrievalOpsCount).toBe(1);
|
|
1336
|
+
expect(ctx.mutationOpsCount).toBe(1);
|
|
1337
|
+
}
|
|
1338
|
+
});
|
|
1339
|
+
|
|
1340
|
+
it("should short-circuit mutations on conflict injection", async () => {
|
|
1341
|
+
let mutationExecuted = false;
|
|
1342
|
+
|
|
1343
|
+
const executor = {
|
|
1344
|
+
executeRetrievalPhase: async () => [],
|
|
1345
|
+
executeMutationPhase: async () => {
|
|
1346
|
+
mutationExecuted = true;
|
|
1347
|
+
return { success: true, createdInternalIds: [] };
|
|
1348
|
+
},
|
|
1349
|
+
};
|
|
1350
|
+
|
|
1351
|
+
const uow = new UnitOfWork(createMockCompiler(), executor, createMockDecoder(), undefined, {
|
|
1352
|
+
instrumentation: {
|
|
1353
|
+
beforeMutate: () => ({ type: "conflict", reason: "Injected conflict" }),
|
|
1354
|
+
afterMutate: () => {
|
|
1355
|
+
throw new Error("afterMutate should not run");
|
|
1356
|
+
},
|
|
1357
|
+
},
|
|
1358
|
+
});
|
|
1359
|
+
|
|
1360
|
+
uow.forSchema(testSchema).create("users", { name: "Alice", email: "alice@example.com" });
|
|
1361
|
+
|
|
1362
|
+
const result = await uow.executeMutations();
|
|
1363
|
+
expect(result.success).toBe(false);
|
|
1364
|
+
expect(mutationExecuted).toBe(false);
|
|
1365
|
+
});
|
|
1366
|
+
|
|
1367
|
+
it("should throw on error injection before retrieval", async () => {
|
|
1368
|
+
let retrievalExecuted = false;
|
|
1369
|
+
|
|
1370
|
+
const executor = {
|
|
1371
|
+
executeRetrievalPhase: async () => {
|
|
1372
|
+
retrievalExecuted = true;
|
|
1373
|
+
return [];
|
|
1374
|
+
},
|
|
1375
|
+
executeMutationPhase: async () => ({ success: true, createdInternalIds: [] }),
|
|
1376
|
+
};
|
|
1377
|
+
|
|
1378
|
+
const uow = new UnitOfWork(createMockCompiler(), executor, createMockDecoder(), undefined, {
|
|
1379
|
+
instrumentation: {
|
|
1380
|
+
beforeRetrieve: () => ({ type: "error", error: new Error("Injected failure") }),
|
|
1381
|
+
},
|
|
1382
|
+
});
|
|
1383
|
+
|
|
1384
|
+
uow.forSchema(testSchema).find("users", (b) => b.whereIndex("primary"));
|
|
1385
|
+
|
|
1386
|
+
await expect(uow.executeRetrieve()).rejects.toThrow("Injected failure");
|
|
1387
|
+
expect(retrievalExecuted).toBe(false);
|
|
1388
|
+
});
|
|
1389
|
+
});
|
|
1390
|
+
|
|
1196
1391
|
describe("Error Handling", () => {
|
|
1197
|
-
const testSchema = schema((s) =>
|
|
1392
|
+
const testSchema = schema("test", (s) =>
|
|
1198
1393
|
s.addTable("users", (t) =>
|
|
1199
1394
|
t.addColumn("id", idColumn()).addColumn("name", "string").addColumn("email", "string"),
|
|
1200
1395
|
),
|
|
@@ -1479,7 +1674,7 @@ describe("Error Handling", () => {
|
|
|
1479
1674
|
});
|
|
1480
1675
|
|
|
1481
1676
|
describe("findFirst convenience method", () => {
|
|
1482
|
-
const testSchema = schema((s) =>
|
|
1677
|
+
const testSchema = schema("test", (s) =>
|
|
1483
1678
|
s
|
|
1484
1679
|
.addTable("users", (t) =>
|
|
1485
1680
|
t
|