@fragno-dev/db 0.1.15 → 0.2.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 +242 -179
- package/CHANGELOG.md +23 -0
- package/README.md +123 -8
- package/dist/adapters/adapters.d.ts +5 -5
- package/dist/adapters/adapters.d.ts.map +1 -1
- package/dist/adapters/adapters.js.map +1 -1
- package/dist/adapters/drizzle/drizzle-adapter.d.ts +6 -21
- package/dist/adapters/drizzle/drizzle-adapter.d.ts.map +1 -1
- package/dist/adapters/drizzle/drizzle-adapter.js +7 -54
- package/dist/adapters/drizzle/drizzle-adapter.js.map +1 -1
- package/dist/adapters/drizzle/generate.d.ts +3 -0
- package/dist/adapters/drizzle/generate.d.ts.map +1 -1
- package/dist/adapters/drizzle/generate.js +36 -28
- package/dist/adapters/drizzle/generate.js.map +1 -1
- package/dist/adapters/generic-sql/driver-config.d.ts +74 -0
- package/dist/adapters/generic-sql/driver-config.d.ts.map +1 -0
- package/dist/adapters/generic-sql/driver-config.js +94 -0
- package/dist/adapters/generic-sql/driver-config.js.map +1 -0
- package/dist/adapters/generic-sql/generic-sql-adapter.d.ts +43 -0
- package/dist/adapters/generic-sql/generic-sql-adapter.d.ts.map +1 -0
- package/dist/adapters/generic-sql/generic-sql-adapter.js +87 -0
- package/dist/adapters/generic-sql/generic-sql-adapter.js.map +1 -0
- package/dist/adapters/generic-sql/generic-sql-uow-executor.js +67 -0
- package/dist/adapters/generic-sql/generic-sql-uow-executor.js.map +1 -0
- package/dist/adapters/generic-sql/migration/cold-kysely.js +33 -0
- package/dist/adapters/generic-sql/migration/cold-kysely.js.map +1 -0
- package/dist/adapters/generic-sql/migration/dialect/mysql.js +60 -0
- package/dist/adapters/generic-sql/migration/dialect/mysql.js.map +1 -0
- package/dist/adapters/generic-sql/migration/dialect/postgres.js +59 -0
- package/dist/adapters/generic-sql/migration/dialect/postgres.js.map +1 -0
- package/dist/adapters/generic-sql/migration/dialect/sqlite.js +96 -0
- package/dist/adapters/generic-sql/migration/dialect/sqlite.js.map +1 -0
- package/dist/adapters/generic-sql/migration/executor.d.ts +15 -0
- package/dist/adapters/generic-sql/migration/executor.d.ts.map +1 -0
- package/dist/adapters/generic-sql/migration/executor.js +18 -0
- package/dist/adapters/generic-sql/migration/executor.js.map +1 -0
- package/dist/adapters/generic-sql/migration/prepared-migrations.d.ts +66 -0
- package/dist/adapters/generic-sql/migration/prepared-migrations.d.ts.map +1 -0
- package/dist/adapters/generic-sql/migration/prepared-migrations.js +68 -0
- package/dist/adapters/generic-sql/migration/prepared-migrations.js.map +1 -0
- package/dist/adapters/generic-sql/migration/sql-generator.js +212 -0
- package/dist/adapters/generic-sql/migration/sql-generator.js.map +1 -0
- package/dist/adapters/generic-sql/query/create-sql-query-compiler.js +32 -0
- package/dist/adapters/generic-sql/query/create-sql-query-compiler.js.map +1 -0
- package/dist/adapters/generic-sql/query/cursor-utils.js +37 -0
- package/dist/adapters/generic-sql/query/cursor-utils.js.map +1 -0
- package/dist/adapters/generic-sql/query/dialect/mysql.js +33 -0
- package/dist/adapters/generic-sql/query/dialect/mysql.js.map +1 -0
- package/dist/adapters/generic-sql/query/dialect/postgres.js +32 -0
- package/dist/adapters/generic-sql/query/dialect/postgres.js.map +1 -0
- package/dist/adapters/generic-sql/query/dialect/sqlite.js +32 -0
- package/dist/adapters/generic-sql/query/dialect/sqlite.js.map +1 -0
- package/dist/adapters/generic-sql/query/generic-sql-uow-operation-compiler.js +152 -0
- package/dist/adapters/generic-sql/query/generic-sql-uow-operation-compiler.js.map +1 -0
- package/dist/adapters/generic-sql/query/select-builder.js +69 -0
- package/dist/adapters/generic-sql/query/select-builder.js.map +1 -0
- package/dist/adapters/generic-sql/query/sql-query-compiler.js +145 -0
- package/dist/adapters/generic-sql/query/sql-query-compiler.js.map +1 -0
- package/dist/adapters/generic-sql/query/where-builder.js +129 -0
- package/dist/adapters/generic-sql/query/where-builder.js.map +1 -0
- package/dist/adapters/generic-sql/result-interpreter.js +74 -0
- package/dist/adapters/generic-sql/result-interpreter.js.map +1 -0
- package/dist/adapters/generic-sql/uow-decoder.js +105 -0
- package/dist/adapters/generic-sql/uow-decoder.js.map +1 -0
- package/dist/adapters/generic-sql/uow-encoder.js +93 -0
- package/dist/adapters/generic-sql/uow-encoder.js.map +1 -0
- package/dist/adapters/kysely/kysely-adapter.d.ts +5 -18
- package/dist/adapters/kysely/kysely-adapter.d.ts.map +1 -1
- package/dist/adapters/kysely/kysely-adapter.js +6 -165
- package/dist/adapters/kysely/kysely-adapter.js.map +1 -1
- package/dist/adapters/{drizzle/drizzle-query.js → shared/from-unit-of-work-compiler.js} +47 -61
- package/dist/adapters/shared/from-unit-of-work-compiler.js.map +1 -0
- package/dist/adapters/{drizzle/shared.d.ts → shared/table-name-mapper.d.ts} +2 -4
- package/dist/adapters/shared/table-name-mapper.d.ts.map +1 -0
- package/dist/adapters/shared/table-name-mapper.js +43 -0
- package/dist/adapters/shared/table-name-mapper.js.map +1 -0
- package/dist/adapters/shared/uow-operation-compiler.js +105 -0
- package/dist/adapters/shared/uow-operation-compiler.js.map +1 -0
- package/dist/db-fragment-definition-builder.d.ts +53 -19
- package/dist/db-fragment-definition-builder.d.ts.map +1 -1
- package/dist/db-fragment-definition-builder.js +89 -19
- package/dist/db-fragment-definition-builder.js.map +1 -1
- package/dist/fragments/internal-fragment.d.ts +39 -5
- package/dist/fragments/internal-fragment.d.ts.map +1 -1
- package/dist/fragments/internal-fragment.js +82 -10
- package/dist/fragments/internal-fragment.js.map +1 -1
- package/dist/hooks/hooks.d.ts +51 -0
- package/dist/hooks/hooks.d.ts.map +1 -0
- package/dist/hooks/hooks.js +88 -0
- package/dist/hooks/hooks.js.map +1 -0
- package/dist/migration-engine/generation-engine.d.ts +0 -2
- package/dist/migration-engine/generation-engine.d.ts.map +1 -1
- package/dist/migration-engine/generation-engine.js +23 -61
- package/dist/migration-engine/generation-engine.js.map +1 -1
- package/dist/mod.d.ts +34 -10
- package/dist/mod.d.ts.map +1 -1
- package/dist/mod.js +47 -16
- package/dist/mod.js.map +1 -1
- package/dist/node_modules/.pnpm/{rou3@0.7.8 → rou3@0.7.10}/node_modules/rou3/dist/index.js +1 -1
- package/dist/node_modules/.pnpm/rou3@0.7.10/node_modules/rou3/dist/index.js.map +1 -0
- package/dist/packages/fragno/dist/api/fragment-instantiator.js +69 -31
- package/dist/packages/fragno/dist/api/fragment-instantiator.js.map +1 -1
- package/dist/query/column-defaults.js +27 -0
- package/dist/query/column-defaults.js.map +1 -0
- package/dist/query/cursor.d.ts +4 -4
- package/dist/query/cursor.d.ts.map +1 -1
- package/dist/query/cursor.js +8 -6
- package/dist/query/cursor.js.map +1 -1
- package/dist/query/orm/orm.d.ts +1 -1
- package/dist/query/orm/orm.js.map +1 -1
- package/dist/query/serialize/create-sql-serializer.js +30 -0
- package/dist/query/serialize/create-sql-serializer.js.map +1 -0
- package/dist/query/serialize/dialect/mysql-serializer.js +87 -0
- package/dist/query/serialize/dialect/mysql-serializer.js.map +1 -0
- package/dist/query/serialize/dialect/postgres-serializer.js +80 -0
- package/dist/query/serialize/dialect/postgres-serializer.js.map +1 -0
- package/dist/query/serialize/dialect/sqlite-serializer.js +93 -0
- package/dist/query/serialize/dialect/sqlite-serializer.js.map +1 -0
- package/dist/query/serialize/sql-serializer.js +67 -0
- package/dist/query/serialize/sql-serializer.js.map +1 -0
- package/dist/query/{query.d.ts → simple-query-interface.d.ts} +5 -5
- package/dist/query/simple-query-interface.d.ts.map +1 -0
- package/dist/query/{execute-unit-of-work.d.ts → unit-of-work/execute-unit-of-work.d.ts} +13 -3
- package/dist/query/unit-of-work/execute-unit-of-work.d.ts.map +1 -0
- package/dist/query/{execute-unit-of-work.js → unit-of-work/execute-unit-of-work.js} +17 -4
- package/dist/query/unit-of-work/execute-unit-of-work.js.map +1 -0
- package/dist/query/{retry-policy.d.ts → unit-of-work/retry-policy.d.ts} +1 -1
- package/dist/query/unit-of-work/retry-policy.d.ts.map +1 -0
- package/dist/query/{retry-policy.js → unit-of-work/retry-policy.js} +1 -1
- package/dist/query/unit-of-work/retry-policy.js.map +1 -0
- package/dist/query/{unit-of-work.d.ts → unit-of-work/unit-of-work.d.ts} +51 -18
- package/dist/query/unit-of-work/unit-of-work.d.ts.map +1 -0
- package/dist/query/{unit-of-work.js → unit-of-work/unit-of-work.js} +58 -11
- package/dist/query/unit-of-work/unit-of-work.js.map +1 -0
- package/dist/query/value-decoding.js +71 -0
- package/dist/query/value-decoding.js.map +1 -0
- package/dist/query/value-encoding.js +124 -0
- package/dist/query/value-encoding.js.map +1 -0
- package/dist/schema/create.d.ts +3 -0
- package/dist/schema/create.d.ts.map +1 -1
- package/dist/schema/create.js +4 -0
- package/dist/schema/create.js.map +1 -1
- package/dist/schema/type-conversion/create-sql-type-mapper.js +29 -0
- package/dist/schema/type-conversion/create-sql-type-mapper.js.map +1 -0
- package/dist/schema/type-conversion/dialect/mysql.js +57 -0
- package/dist/schema/type-conversion/dialect/mysql.js.map +1 -0
- package/dist/schema/type-conversion/dialect/postgres.js +56 -0
- package/dist/schema/type-conversion/dialect/postgres.js.map +1 -0
- package/dist/schema/type-conversion/dialect/sqlite.js +52 -0
- package/dist/schema/type-conversion/dialect/sqlite.js.map +1 -0
- package/dist/schema/type-conversion/type-mapping.js +63 -0
- package/dist/schema/type-conversion/type-mapping.js.map +1 -0
- package/dist/sql-driver/connection/connection-provider.d.ts +13 -0
- package/dist/sql-driver/connection/connection-provider.d.ts.map +1 -0
- package/dist/sql-driver/connection/connection-provider.js +19 -0
- package/dist/sql-driver/connection/connection-provider.js.map +1 -0
- package/dist/sql-driver/connection/single-connection-provider.js +23 -0
- package/dist/sql-driver/connection/single-connection-provider.js.map +1 -0
- package/dist/sql-driver/dialect-adapter/dialect-adapter.d.ts +7 -0
- package/dist/sql-driver/dialect-adapter/dialect-adapter.d.ts.map +1 -0
- package/dist/sql-driver/dialects/dialects.d.ts +2 -0
- package/dist/sql-driver/dialects/dialects.js +3 -0
- package/dist/sql-driver/dialects/durable-object-dialect.d.ts +72 -0
- package/dist/sql-driver/dialects/durable-object-dialect.d.ts.map +1 -0
- package/dist/sql-driver/dialects/durable-object-dialect.js +130 -0
- package/dist/sql-driver/dialects/durable-object-dialect.js.map +1 -0
- package/dist/sql-driver/driver/runtime-driver.d.ts +23 -0
- package/dist/sql-driver/driver/runtime-driver.d.ts.map +1 -0
- package/dist/sql-driver/driver/runtime-driver.js +56 -0
- package/dist/sql-driver/driver/runtime-driver.js.map +1 -0
- package/dist/sql-driver/query-executor/default-query-executor.js +26 -0
- package/dist/sql-driver/query-executor/default-query-executor.js.map +1 -0
- package/dist/sql-driver/query-executor/plugin.d.ts +17 -0
- package/dist/sql-driver/query-executor/plugin.d.ts.map +1 -0
- package/dist/sql-driver/query-executor/query-executor-base.js +25 -0
- package/dist/sql-driver/query-executor/query-executor-base.js.map +1 -0
- package/dist/sql-driver/query-executor/query-executor.d.ts +36 -0
- package/dist/sql-driver/query-executor/query-executor.d.ts.map +1 -0
- package/dist/sql-driver/sql-driver-adapter.d.ts +29 -0
- package/dist/sql-driver/sql-driver-adapter.d.ts.map +1 -0
- package/dist/sql-driver/sql-driver-adapter.js +68 -0
- package/dist/sql-driver/sql-driver-adapter.js.map +1 -0
- package/dist/sql-driver/sql-driver.d.ts +38 -0
- package/dist/sql-driver/sql-driver.d.ts.map +1 -0
- package/dist/sql-driver/sql-driver.js +1 -0
- package/dist/sql-driver/sql.js +50 -0
- package/dist/sql-driver/sql.js.map +1 -0
- package/dist/with-database.d.ts +6 -2
- package/dist/with-database.d.ts.map +1 -1
- package/dist/with-database.js +1 -1
- package/dist/with-database.js.map +1 -1
- package/package.json +37 -10
- package/src/adapters/adapters.ts +8 -5
- package/src/adapters/drizzle/drizzle-adapter-pglite.test.ts +60 -169
- package/src/adapters/drizzle/{drizzle-adapter-sqlite.test.ts → drizzle-adapter-sqlite3.test.ts} +31 -55
- package/src/adapters/drizzle/drizzle-adapter.ts +15 -107
- package/src/adapters/drizzle/generate.test.ts +2 -2
- package/src/adapters/drizzle/generate.ts +78 -34
- package/src/adapters/drizzle/migrate-drizzle.test.ts +19 -0
- package/src/adapters/drizzle/shared.ts +0 -34
- package/src/adapters/drizzle/test-utils.ts +3 -3
- package/src/adapters/generic-sql/README.md +14 -0
- package/src/adapters/generic-sql/driver-config.ts +144 -0
- package/src/adapters/generic-sql/generic-sql-adapter.test.ts +50 -0
- package/src/adapters/generic-sql/generic-sql-adapter.ts +146 -0
- package/src/adapters/generic-sql/generic-sql-uow-executor.ts +130 -0
- package/src/adapters/generic-sql/migration/cold-kysely.ts +55 -0
- package/src/adapters/{kysely/migration/execute-mysql.test.ts → generic-sql/migration/dialect/mysql.test.ts} +342 -484
- package/src/adapters/generic-sql/migration/dialect/mysql.ts +104 -0
- package/src/adapters/generic-sql/migration/dialect/postgres.test.ts +1008 -0
- package/src/adapters/generic-sql/migration/dialect/postgres.ts +113 -0
- package/src/adapters/{kysely/migration/execute-sqlite.test.ts → generic-sql/migration/dialect/sqlite.test.ts} +307 -510
- package/src/adapters/generic-sql/migration/dialect/sqlite.ts +189 -0
- package/src/adapters/generic-sql/migration/executor.ts +33 -0
- package/src/adapters/generic-sql/migration/prepared-migrations.test.ts +661 -0
- package/src/adapters/generic-sql/migration/prepared-migrations.ts +214 -0
- package/src/adapters/generic-sql/migration/sql-generator.ts +413 -0
- package/src/adapters/generic-sql/query/create-sql-query-compiler.ts +36 -0
- package/src/adapters/generic-sql/query/cursor-utils.ts +56 -0
- package/src/adapters/generic-sql/query/dialect/mysql.ts +34 -0
- package/src/adapters/generic-sql/query/dialect/postgres.ts +32 -0
- package/src/adapters/generic-sql/query/dialect/sqlite.ts +32 -0
- package/src/adapters/generic-sql/query/generic-sql-uow-operation-compiler.test.ts +1568 -0
- package/src/adapters/generic-sql/query/generic-sql-uow-operation-compiler.ts +314 -0
- package/src/adapters/generic-sql/query/select-builder.test.ts +256 -0
- package/src/adapters/generic-sql/query/select-builder.ts +137 -0
- package/src/adapters/generic-sql/query/sql-query-compiler.test.ts +195 -0
- package/src/adapters/generic-sql/query/sql-query-compiler.ts +367 -0
- package/src/adapters/generic-sql/query/where-builder.test.ts +744 -0
- package/src/adapters/generic-sql/query/where-builder.ts +211 -0
- package/src/adapters/generic-sql/result-interpreter.ts +102 -0
- package/src/adapters/generic-sql/test/generic-drizzle-adapter-sqlite3.test.ts +899 -0
- package/src/adapters/generic-sql/uow-decoder.test.ts +399 -0
- package/src/adapters/generic-sql/uow-decoder.ts +152 -0
- package/src/adapters/generic-sql/uow-encoder.test.ts +183 -0
- package/src/adapters/generic-sql/uow-encoder.ts +131 -0
- package/src/adapters/kysely/kysely-adapter-pglite.test.ts +26 -76
- package/src/adapters/kysely/{kysely-adapter-sqlite.test.ts → kysely-adapter-sqlocal.test.ts} +76 -17
- package/src/adapters/kysely/kysely-adapter.ts +10 -250
- package/src/adapters/{drizzle/drizzle-query.ts → shared/from-unit-of-work-compiler.ts} +110 -104
- package/src/adapters/shared/table-name-mapper.ts +50 -0
- package/src/adapters/shared/uow-operation-compiler.ts +211 -0
- package/src/db-fragment-definition-builder.test.ts +2 -2
- package/src/db-fragment-definition-builder.ts +281 -50
- package/src/db-fragment-instantiator.test.ts +78 -2
- package/src/db-fragment-integration.test.ts +14 -16
- package/src/fragments/internal-fragment.test.ts +434 -45
- package/src/fragments/internal-fragment.ts +184 -20
- package/src/hooks/hooks.test.ts +575 -0
- package/src/hooks/hooks.ts +179 -0
- package/src/migration-engine/generation-engine.test.ts +44 -54
- package/src/migration-engine/generation-engine.ts +48 -94
- package/src/mod.ts +117 -29
- package/src/query/column-defaults.ts +49 -0
- package/src/query/cursor.test.ts +31 -6
- package/src/query/cursor.ts +11 -7
- package/src/query/orm/orm.ts +1 -1
- package/src/query/query-type.test.ts +9 -9
- package/src/query/serialize/create-sql-serializer.ts +34 -0
- package/src/query/serialize/dialect/mysql-serializer.ts +142 -0
- package/src/query/serialize/dialect/postgres-serializer.ts +129 -0
- package/src/query/serialize/dialect/sqlite-serializer.test.ts +251 -0
- package/src/query/serialize/dialect/sqlite-serializer.ts +156 -0
- package/src/query/serialize/sql-serializer.ts +143 -0
- package/src/query/{query.ts → simple-query-interface.ts} +2 -2
- package/src/query/{execute-unit-of-work.test.ts → unit-of-work/execute-unit-of-work.test.ts} +16 -16
- package/src/query/{execute-unit-of-work.ts → unit-of-work/execute-unit-of-work.ts} +49 -8
- package/src/query/{unit-of-work-coordinator.test.ts → unit-of-work/unit-of-work-coordinator.test.ts} +41 -43
- package/src/query/{unit-of-work-types.test.ts → unit-of-work/unit-of-work-types.test.ts} +5 -3
- package/src/query/{unit-of-work.test.ts → unit-of-work/unit-of-work.test.ts} +100 -9
- package/src/query/{unit-of-work.ts → unit-of-work/unit-of-work.ts} +135 -32
- package/src/query/{result-transform.test.ts → value-decoding.test.ts} +45 -427
- package/src/query/value-decoding.ts +113 -0
- package/src/query/value-encoding.test.ts +390 -0
- package/src/query/value-encoding.ts +168 -0
- package/src/schema/create.test.ts +5 -1
- package/src/schema/create.ts +5 -0
- package/src/schema/serialize.test.ts +165 -407
- package/src/schema/type-conversion/create-sql-type-mapper.ts +28 -0
- package/src/schema/type-conversion/dialect/mysql.ts +64 -0
- package/src/schema/type-conversion/dialect/postgres.ts +62 -0
- package/src/schema/type-conversion/dialect/sqlite.ts +63 -0
- package/src/schema/type-conversion/type-mapping.test.ts +137 -0
- package/src/schema/type-conversion/type-mapping.ts +153 -0
- package/src/shared/connection-pool.ts +5 -5
- package/src/sql-driver/better-sqlite3.test.ts +126 -0
- package/src/sql-driver/connection/connection-provider.ts +27 -0
- package/src/sql-driver/connection/single-connection-provider.ts +42 -0
- package/src/sql-driver/dialect-adapter/dialect-adapter.ts +9 -0
- package/src/sql-driver/dialect-adapter/sqlite-dialect-adapter.ts +7 -0
- package/src/sql-driver/dialects/dialects.ts +1 -0
- package/src/sql-driver/dialects/durable-object-dialect.ts +260 -0
- package/src/sql-driver/driver/runtime-driver.ts +91 -0
- package/src/sql-driver/query-executor/default-query-executor.ts +38 -0
- package/src/sql-driver/query-executor/plugin.ts +22 -0
- package/src/sql-driver/query-executor/query-executor-base.ts +53 -0
- package/src/sql-driver/query-executor/query-executor.ts +44 -0
- package/src/sql-driver/sql-driver-adapter.ts +96 -0
- package/src/sql-driver/sql-driver.ts +53 -0
- package/src/sql-driver/sql.ts +57 -0
- package/src/sql-driver/sqlocal.test.ts +117 -0
- package/src/with-database.ts +35 -23
- package/tsdown.config.ts +7 -2
- package/dist/adapters/drizzle/drizzle-connection-pool.js +0 -40
- package/dist/adapters/drizzle/drizzle-connection-pool.js.map +0 -1
- package/dist/adapters/drizzle/drizzle-query.d.ts +0 -23
- package/dist/adapters/drizzle/drizzle-query.d.ts.map +0 -1
- package/dist/adapters/drizzle/drizzle-query.js.map +0 -1
- package/dist/adapters/drizzle/drizzle-uow-compiler.d.ts +0 -10
- package/dist/adapters/drizzle/drizzle-uow-compiler.d.ts.map +0 -1
- package/dist/adapters/drizzle/drizzle-uow-compiler.js +0 -334
- package/dist/adapters/drizzle/drizzle-uow-compiler.js.map +0 -1
- package/dist/adapters/drizzle/drizzle-uow-decoder.js +0 -123
- package/dist/adapters/drizzle/drizzle-uow-decoder.js.map +0 -1
- package/dist/adapters/drizzle/drizzle-uow-executor.js +0 -160
- package/dist/adapters/drizzle/drizzle-uow-executor.js.map +0 -1
- package/dist/adapters/drizzle/join-column-utils.js +0 -28
- package/dist/adapters/drizzle/join-column-utils.js.map +0 -1
- package/dist/adapters/drizzle/shared.d.ts.map +0 -1
- package/dist/adapters/drizzle/shared.js +0 -35
- package/dist/adapters/drizzle/shared.js.map +0 -1
- package/dist/adapters/kysely/kysely-connection-pool.js +0 -41
- package/dist/adapters/kysely/kysely-connection-pool.js.map +0 -1
- package/dist/adapters/kysely/kysely-query-builder.js +0 -321
- package/dist/adapters/kysely/kysely-query-builder.js.map +0 -1
- package/dist/adapters/kysely/kysely-query-compiler.js +0 -67
- package/dist/adapters/kysely/kysely-query-compiler.js.map +0 -1
- package/dist/adapters/kysely/kysely-query.d.ts +0 -23
- package/dist/adapters/kysely/kysely-query.d.ts.map +0 -1
- package/dist/adapters/kysely/kysely-query.js +0 -230
- package/dist/adapters/kysely/kysely-query.js.map +0 -1
- package/dist/adapters/kysely/kysely-shared.d.ts +0 -14
- package/dist/adapters/kysely/kysely-shared.d.ts.map +0 -1
- package/dist/adapters/kysely/kysely-shared.js +0 -33
- package/dist/adapters/kysely/kysely-shared.js.map +0 -1
- package/dist/adapters/kysely/kysely-uow-compiler.js +0 -193
- package/dist/adapters/kysely/kysely-uow-compiler.js.map +0 -1
- package/dist/adapters/kysely/kysely-uow-executor.js +0 -93
- package/dist/adapters/kysely/kysely-uow-executor.js.map +0 -1
- package/dist/adapters/kysely/migration/execute-base.js +0 -128
- package/dist/adapters/kysely/migration/execute-base.js.map +0 -1
- package/dist/adapters/kysely/migration/execute-factory.js +0 -34
- package/dist/adapters/kysely/migration/execute-factory.js.map +0 -1
- package/dist/adapters/kysely/migration/execute-mssql.js +0 -112
- package/dist/adapters/kysely/migration/execute-mssql.js.map +0 -1
- package/dist/adapters/kysely/migration/execute-mysql.js +0 -93
- package/dist/adapters/kysely/migration/execute-mysql.js.map +0 -1
- package/dist/adapters/kysely/migration/execute-postgres.js +0 -104
- package/dist/adapters/kysely/migration/execute-postgres.js.map +0 -1
- package/dist/adapters/kysely/migration/execute-sqlite.js +0 -123
- package/dist/adapters/kysely/migration/execute-sqlite.js.map +0 -1
- package/dist/adapters/kysely/migration/execute.js +0 -34
- package/dist/adapters/kysely/migration/execute.js.map +0 -1
- package/dist/migration-engine/create.d.ts +0 -37
- package/dist/migration-engine/create.d.ts.map +0 -1
- package/dist/migration-engine/create.js +0 -58
- package/dist/migration-engine/create.js.map +0 -1
- package/dist/migration-engine/shared.d.ts +0 -112
- package/dist/migration-engine/shared.d.ts.map +0 -1
- package/dist/node_modules/.pnpm/rou3@0.7.8/node_modules/rou3/dist/index.js.map +0 -1
- package/dist/query/execute-unit-of-work.d.ts.map +0 -1
- package/dist/query/execute-unit-of-work.js.map +0 -1
- package/dist/query/query.d.ts.map +0 -1
- package/dist/query/result-transform.js +0 -170
- package/dist/query/result-transform.js.map +0 -1
- package/dist/query/retry-policy.d.ts.map +0 -1
- package/dist/query/retry-policy.js.map +0 -1
- package/dist/query/unit-of-work.d.ts.map +0 -1
- package/dist/query/unit-of-work.js.map +0 -1
- package/dist/schema/serialize.js +0 -111
- package/dist/schema/serialize.js.map +0 -1
- package/src/adapters/drizzle/drizzle-adapter.test.ts +0 -122
- package/src/adapters/drizzle/drizzle-connection-pool.ts +0 -66
- package/src/adapters/drizzle/drizzle-query.test.ts +0 -499
- package/src/adapters/drizzle/drizzle-uow-compiler-mysql.test.ts +0 -1442
- package/src/adapters/drizzle/drizzle-uow-compiler-sqlite.test.ts +0 -1414
- package/src/adapters/drizzle/drizzle-uow-compiler.test.ts +0 -1400
- package/src/adapters/drizzle/drizzle-uow-compiler.ts +0 -677
- package/src/adapters/drizzle/drizzle-uow-decoder.ts +0 -228
- package/src/adapters/drizzle/drizzle-uow-executor.ts +0 -309
- package/src/adapters/drizzle/join-column-utils.test.ts +0 -79
- package/src/adapters/drizzle/join-column-utils.ts +0 -39
- package/src/adapters/kysely/kysely-connection-pool.ts +0 -70
- package/src/adapters/kysely/kysely-query-builder.test.ts +0 -1344
- package/src/adapters/kysely/kysely-query-builder.ts +0 -666
- package/src/adapters/kysely/kysely-query-compiler.ts +0 -127
- package/src/adapters/kysely/kysely-query.test.ts +0 -498
- package/src/adapters/kysely/kysely-query.ts +0 -399
- package/src/adapters/kysely/kysely-shared.ts +0 -57
- package/src/adapters/kysely/kysely-uow-compiler.test.ts +0 -986
- package/src/adapters/kysely/kysely-uow-compiler.ts +0 -350
- package/src/adapters/kysely/kysely-uow-executor.ts +0 -164
- package/src/adapters/kysely/kysely-uow-joins.test.ts +0 -794
- package/src/adapters/kysely/migration/execute-base.ts +0 -256
- package/src/adapters/kysely/migration/execute-factory.ts +0 -53
- package/src/adapters/kysely/migration/execute-mssql.ts +0 -250
- package/src/adapters/kysely/migration/execute-mysql.ts +0 -211
- package/src/adapters/kysely/migration/execute-postgres.test.ts +0 -2657
- package/src/adapters/kysely/migration/execute-postgres.ts +0 -234
- package/src/adapters/kysely/migration/execute-sqlite.ts +0 -247
- package/src/adapters/kysely/migration/execute.ts +0 -50
- package/src/adapters/kysely/migration/kysely-migrator.test.ts +0 -261
- package/src/query/result-transform.ts +0 -274
- package/src/schema/serialize.ts +0 -407
- /package/dist/query/{query.js → simple-query-interface.js} +0 -0
- /package/src/query/{retry-policy.test.ts → unit-of-work/retry-policy.test.ts} +0 -0
- /package/src/query/{retry-policy.ts → unit-of-work/retry-policy.ts} +0 -0
package/src/query/{execute-unit-of-work.test.ts → unit-of-work/execute-unit-of-work.test.ts}
RENAMED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { describe, it, expect, vi, assert, expectTypeOf } from "vitest";
|
|
2
|
-
import { schema, idColumn, FragnoId } from "
|
|
2
|
+
import { schema, idColumn, FragnoId } from "../../schema/create";
|
|
3
3
|
import {
|
|
4
4
|
createUnitOfWork,
|
|
5
5
|
type TypedUnitOfWork,
|
|
@@ -118,7 +118,11 @@ function createMockCompiler(): UOWCompiler<unknown> {
|
|
|
118
118
|
|
|
119
119
|
// Mock decoder that returns raw results as-is
|
|
120
120
|
function createMockDecoder(): UOWDecoder {
|
|
121
|
-
return
|
|
121
|
+
return {
|
|
122
|
+
decode(rawResults) {
|
|
123
|
+
return rawResults;
|
|
124
|
+
},
|
|
125
|
+
};
|
|
122
126
|
}
|
|
123
127
|
|
|
124
128
|
// Helper to create a UOW factory that tracks how many times it's called
|
|
@@ -838,7 +842,7 @@ describe("executeRestrictedUnitOfWork", () => {
|
|
|
838
842
|
});
|
|
839
843
|
|
|
840
844
|
describe("error handling", () => {
|
|
841
|
-
it("should throw error from callback", async () => {
|
|
845
|
+
it("should throw error from callback immediately without retry", async () => {
|
|
842
846
|
const { factory, callCount } = createMockUOWFactory([{ success: true }]);
|
|
843
847
|
|
|
844
848
|
await expect(
|
|
@@ -848,13 +852,13 @@ describe("executeRestrictedUnitOfWork", () => {
|
|
|
848
852
|
},
|
|
849
853
|
{ createUnitOfWork: factory },
|
|
850
854
|
),
|
|
851
|
-
).rejects.toThrow("
|
|
855
|
+
).rejects.toThrow("Callback error");
|
|
852
856
|
|
|
853
|
-
// Should
|
|
854
|
-
expect(callCount.value).toBe(
|
|
857
|
+
// Should NOT retry non-conflict errors
|
|
858
|
+
expect(callCount.value).toBe(1); // Only initial attempt
|
|
855
859
|
});
|
|
856
860
|
|
|
857
|
-
it("should
|
|
861
|
+
it("should throw callback error directly", async () => {
|
|
858
862
|
const { factory } = createMockUOWFactory([{ success: true }]);
|
|
859
863
|
const originalError = new Error("Original error");
|
|
860
864
|
|
|
@@ -870,8 +874,8 @@ describe("executeRestrictedUnitOfWork", () => {
|
|
|
870
874
|
);
|
|
871
875
|
expect.fail("Should have thrown");
|
|
872
876
|
} catch (error) {
|
|
873
|
-
|
|
874
|
-
expect(
|
|
877
|
+
// Error should be thrown directly, not wrapped
|
|
878
|
+
expect(error).toBe(originalError);
|
|
875
879
|
}
|
|
876
880
|
});
|
|
877
881
|
});
|
|
@@ -1292,19 +1296,15 @@ describe("executeRestrictedUnitOfWork", () => {
|
|
|
1292
1296
|
);
|
|
1293
1297
|
expect.fail("Should have thrown an error");
|
|
1294
1298
|
} catch (error) {
|
|
1295
|
-
// The error should be wrapped
|
|
1299
|
+
// The error should be thrown directly (not wrapped) since it's not a concurrency conflict
|
|
1296
1300
|
expect(error).toBeInstanceOf(Error);
|
|
1297
|
-
|
|
1298
|
-
expect((error as Error).cause).toBeInstanceOf(Error);
|
|
1299
|
-
expect(((error as Error).cause as Error).message).toContain(
|
|
1300
|
-
'relation "settings" does not exist',
|
|
1301
|
-
);
|
|
1301
|
+
expect((error as Error).message).toContain('relation "settings" does not exist');
|
|
1302
1302
|
deferred.resolve((error as Error).message);
|
|
1303
1303
|
}
|
|
1304
1304
|
|
|
1305
1305
|
// Verify no unhandled rejection occurred
|
|
1306
1306
|
// If the test completes without throwing, the promise rejection was properly handled
|
|
1307
|
-
expect(await deferred.promise).toContain("
|
|
1307
|
+
expect(await deferred.promise).toContain('relation "settings" does not exist');
|
|
1308
1308
|
});
|
|
1309
1309
|
});
|
|
1310
1310
|
});
|
|
@@ -1,7 +1,19 @@
|
|
|
1
|
-
import type { AnySchema } from "
|
|
1
|
+
import type { AnySchema } from "../../schema/create";
|
|
2
2
|
import type { TypedUnitOfWork, IUnitOfWork } from "./unit-of-work";
|
|
3
|
+
import type { HooksMap } from "../../hooks/hooks";
|
|
3
4
|
import { NoRetryPolicy, ExponentialBackoffRetryPolicy, type RetryPolicy } from "./retry-policy";
|
|
4
|
-
import type { FragnoId } from "
|
|
5
|
+
import type { FragnoId } from "../../schema/create";
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Error thrown when a Unit of Work execution fails due to optimistic concurrency conflict.
|
|
9
|
+
* This error triggers automatic retry behavior in executeRestrictedUnitOfWork.
|
|
10
|
+
*/
|
|
11
|
+
export class ConcurrencyConflictError extends Error {
|
|
12
|
+
constructor(message = "Optimistic concurrency conflict detected") {
|
|
13
|
+
super(message);
|
|
14
|
+
this.name = "ConcurrencyConflictError";
|
|
15
|
+
}
|
|
16
|
+
}
|
|
5
17
|
|
|
6
18
|
/**
|
|
7
19
|
* Type utility that unwraps promises 1 level deep in objects, arrays, or direct promises
|
|
@@ -330,6 +342,18 @@ export interface ExecuteRestrictedUnitOfWorkOptions {
|
|
|
330
342
|
* Abort signal to cancel execution
|
|
331
343
|
*/
|
|
332
344
|
signal?: AbortSignal;
|
|
345
|
+
|
|
346
|
+
/**
|
|
347
|
+
* Callback invoked before mutations are executed.
|
|
348
|
+
* Use this to add additional mutation operations (e.g., hook event records).
|
|
349
|
+
*/
|
|
350
|
+
onBeforeMutate?: (uow: IUnitOfWork) => void;
|
|
351
|
+
|
|
352
|
+
/**
|
|
353
|
+
* Callback invoked after successful mutation phase.
|
|
354
|
+
* Use this for post-mutation processing like hook execution.
|
|
355
|
+
*/
|
|
356
|
+
onSuccess?: (uow: IUnitOfWork) => Promise<void>;
|
|
333
357
|
}
|
|
334
358
|
|
|
335
359
|
/**
|
|
@@ -370,9 +394,12 @@ export interface ExecuteRestrictedUnitOfWorkOptions {
|
|
|
370
394
|
* );
|
|
371
395
|
* ```
|
|
372
396
|
*/
|
|
373
|
-
export async function executeRestrictedUnitOfWork<TResult>(
|
|
397
|
+
export async function executeRestrictedUnitOfWork<TResult, THooks extends HooksMap = {}>(
|
|
374
398
|
callback: (context: {
|
|
375
|
-
forSchema: <S extends AnySchema
|
|
399
|
+
forSchema: <S extends AnySchema, H extends HooksMap = THooks>(
|
|
400
|
+
schema: S,
|
|
401
|
+
hooks?: H,
|
|
402
|
+
) => TypedUnitOfWork<S, [], unknown, H>;
|
|
376
403
|
executeRetrieve: () => Promise<void>;
|
|
377
404
|
executeMutate: () => Promise<void>;
|
|
378
405
|
nonce: string;
|
|
@@ -401,10 +428,9 @@ export async function executeRestrictedUnitOfWork<TResult>(
|
|
|
401
428
|
// Create a fresh UOW for this attempt
|
|
402
429
|
const baseUow = options.createUnitOfWork();
|
|
403
430
|
|
|
404
|
-
// Create context object with forSchema, executeRetrieve, executeMutate, nonce, and currentAttempt
|
|
405
431
|
const context = {
|
|
406
|
-
forSchema: <S extends AnySchema>(schema: S) => {
|
|
407
|
-
return baseUow.forSchema(schema);
|
|
432
|
+
forSchema: <S extends AnySchema, H extends HooksMap = THooks>(schema: S, hooks?: H) => {
|
|
433
|
+
return baseUow.forSchema(schema, hooks);
|
|
408
434
|
},
|
|
409
435
|
executeRetrieve: async () => {
|
|
410
436
|
await baseUow.executeRetrieve();
|
|
@@ -418,9 +444,18 @@ export async function executeRestrictedUnitOfWork<TResult>(
|
|
|
418
444
|
await baseUow.executeRetrieve();
|
|
419
445
|
}
|
|
420
446
|
|
|
447
|
+
// Add hook mutations before executing
|
|
448
|
+
if (options.onBeforeMutate) {
|
|
449
|
+
options.onBeforeMutate(baseUow);
|
|
450
|
+
}
|
|
451
|
+
|
|
421
452
|
const result = await baseUow.executeMutations();
|
|
422
453
|
if (!result.success) {
|
|
423
|
-
throw new
|
|
454
|
+
throw new ConcurrencyConflictError();
|
|
455
|
+
}
|
|
456
|
+
|
|
457
|
+
if (options.onSuccess) {
|
|
458
|
+
await options.onSuccess(baseUow);
|
|
424
459
|
}
|
|
425
460
|
},
|
|
426
461
|
nonce: baseUow.nonce,
|
|
@@ -440,6 +475,12 @@ export async function executeRestrictedUnitOfWork<TResult>(
|
|
|
440
475
|
throw new Error("Unit of Work execution aborted");
|
|
441
476
|
}
|
|
442
477
|
|
|
478
|
+
// Only retry concurrency conflicts, not other errors
|
|
479
|
+
if (!(error instanceof ConcurrencyConflictError)) {
|
|
480
|
+
// Not a concurrency conflict - throw immediately without retry
|
|
481
|
+
throw error;
|
|
482
|
+
}
|
|
483
|
+
|
|
443
484
|
if (!retryPolicy.shouldRetry(attempt, error, signal)) {
|
|
444
485
|
// No more retries - check again if aborted or throw conflict error
|
|
445
486
|
if (signal?.aborted) {
|
package/src/query/{unit-of-work-coordinator.test.ts → unit-of-work/unit-of-work-coordinator.test.ts}
RENAMED
|
@@ -1,42 +1,38 @@
|
|
|
1
1
|
import { describe, it, expect } from "vitest";
|
|
2
|
-
import { schema, idColumn, type FragnoId, referenceColumn } from "
|
|
2
|
+
import { schema, idColumn, type FragnoId, referenceColumn } from "../../schema/create";
|
|
3
3
|
import {
|
|
4
4
|
type UOWCompiler,
|
|
5
5
|
type UOWDecoder,
|
|
6
6
|
createUnitOfWork,
|
|
7
|
-
type RetrievalOperation,
|
|
8
|
-
type MutationOperation,
|
|
9
7
|
type CompiledMutation,
|
|
8
|
+
type UOWExecutor,
|
|
10
9
|
} from "./unit-of-work";
|
|
11
|
-
import
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
query: `${op.type.toUpperCase()} ${op.table}`,
|
|
22
|
-
expectedAffectedRows: op.type === "create" ? null : op.type === "check" ? null : 1,
|
|
23
|
-
expectedReturnedRows: op.type === "check" ? 1 : null,
|
|
24
|
-
};
|
|
25
|
-
},
|
|
26
|
-
};
|
|
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
|
+
// Create compiler using actual implementation
|
|
16
|
+
function createCompiler(): UOWCompiler<CompiledQuery> {
|
|
17
|
+
const driverConfig = new BetterSQLite3DriverConfig();
|
|
18
|
+
const operationCompiler = new GenericSQLUOWOperationCompiler(driverConfig);
|
|
19
|
+
return createUOWCompilerFromOperationCompiler(operationCompiler);
|
|
27
20
|
}
|
|
28
21
|
|
|
29
|
-
// Mock executor that tracks execution
|
|
30
|
-
function createMockExecutor() {
|
|
22
|
+
// Mock executor that tracks execution and works with CompiledQuery
|
|
23
|
+
function createMockExecutor(): UOWExecutor<CompiledQuery, unknown> & {
|
|
24
|
+
getLog: () => string[];
|
|
25
|
+
clearLog: () => void;
|
|
26
|
+
} {
|
|
31
27
|
const executionLog: string[] = [];
|
|
32
28
|
|
|
33
29
|
return {
|
|
34
|
-
executeRetrievalPhase: async (queries:
|
|
30
|
+
executeRetrievalPhase: async (queries: CompiledQuery[]) => {
|
|
35
31
|
executionLog.push(`RETRIEVAL: ${queries.length} queries`);
|
|
36
32
|
// Return mock results for each query
|
|
37
33
|
return queries.map(() => [{ id: "mock-id", name: "Mock User" }]);
|
|
38
34
|
},
|
|
39
|
-
executeMutationPhase: async (mutations: CompiledMutation<
|
|
35
|
+
executeMutationPhase: async (mutations: CompiledMutation<CompiledQuery>[]) => {
|
|
40
36
|
executionLog.push(`MUTATION: ${mutations.length} mutations`);
|
|
41
37
|
return {
|
|
42
38
|
success: true,
|
|
@@ -51,11 +47,13 @@ function createMockExecutor() {
|
|
|
51
47
|
}
|
|
52
48
|
|
|
53
49
|
function createMockDecoder(): UOWDecoder {
|
|
54
|
-
return
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
50
|
+
return {
|
|
51
|
+
decode(rawResults, operations) {
|
|
52
|
+
if (rawResults.length !== operations.length) {
|
|
53
|
+
throw new Error("rawResults and operations must have the same length");
|
|
54
|
+
}
|
|
55
|
+
return rawResults;
|
|
56
|
+
},
|
|
59
57
|
};
|
|
60
58
|
}
|
|
61
59
|
|
|
@@ -68,7 +66,7 @@ describe("UOW Coordinator - Parent-Child Execution", () => {
|
|
|
68
66
|
);
|
|
69
67
|
|
|
70
68
|
const executor = createMockExecutor();
|
|
71
|
-
const parentUow = createUnitOfWork(
|
|
69
|
+
const parentUow = createUnitOfWork(createCompiler(), executor, createMockDecoder());
|
|
72
70
|
|
|
73
71
|
// Simulate service method 1: adds retrieval operation via child UOW
|
|
74
72
|
const serviceMethod1 = () => {
|
|
@@ -120,7 +118,7 @@ describe("UOW Coordinator - Parent-Child Execution", () => {
|
|
|
120
118
|
);
|
|
121
119
|
|
|
122
120
|
const executor = createMockExecutor();
|
|
123
|
-
const parentUow = createUnitOfWork(
|
|
121
|
+
const parentUow = createUnitOfWork(createCompiler(), executor, createMockDecoder());
|
|
124
122
|
|
|
125
123
|
// Service A: Get user by ID, awaits retrieval phase
|
|
126
124
|
const getUserById = async (userId: string) => {
|
|
@@ -205,7 +203,7 @@ describe("UOW Coordinator - Parent-Child Execution", () => {
|
|
|
205
203
|
);
|
|
206
204
|
|
|
207
205
|
const executor = createMockExecutor();
|
|
208
|
-
const parentUow = createUnitOfWork(
|
|
206
|
+
const parentUow = createUnitOfWork(createCompiler(), executor, createMockDecoder());
|
|
209
207
|
|
|
210
208
|
// Service A: Check if user exists
|
|
211
209
|
const validateUser = async (userId: string) => {
|
|
@@ -327,7 +325,7 @@ describe("UOW Coordinator - Parent-Child Execution", () => {
|
|
|
327
325
|
);
|
|
328
326
|
|
|
329
327
|
const executor = createMockExecutor();
|
|
330
|
-
const parentUow = createUnitOfWork(
|
|
328
|
+
const parentUow = createUnitOfWork(createCompiler(), executor, createMockDecoder());
|
|
331
329
|
|
|
332
330
|
// Level 1: Handler (root)
|
|
333
331
|
const handler = async () => {
|
|
@@ -440,7 +438,7 @@ describe("UOW Coordinator - Parent-Child Execution", () => {
|
|
|
440
438
|
);
|
|
441
439
|
|
|
442
440
|
const executor = createMockExecutor();
|
|
443
|
-
const parentUow = createUnitOfWork(
|
|
441
|
+
const parentUow = createUnitOfWork(createCompiler(), executor, createMockDecoder());
|
|
444
442
|
|
|
445
443
|
// Service method that creates TWO sibling child UOWs
|
|
446
444
|
const processUserOrder = async (email: string) => {
|
|
@@ -548,13 +546,13 @@ describe("UOW Coordinator - Parent-Child Execution", () => {
|
|
|
548
546
|
|
|
549
547
|
// Create mock executor that returns account data with low balance
|
|
550
548
|
const executionLog: string[] = [];
|
|
551
|
-
const customExecutor = {
|
|
552
|
-
executeRetrievalPhase: async (queries:
|
|
549
|
+
const customExecutor: UOWExecutor<CompiledQuery, unknown> = {
|
|
550
|
+
executeRetrievalPhase: async (queries: CompiledQuery[]) => {
|
|
553
551
|
executionLog.push(`RETRIEVAL: ${queries.length} queries`);
|
|
554
552
|
// Return mock account data with balance field set to low value
|
|
555
553
|
return queries.map(() => [{ id: "mock-id", userId: "user-1", balance: 100 }]);
|
|
556
554
|
},
|
|
557
|
-
executeMutationPhase: async (mutations: CompiledMutation<
|
|
555
|
+
executeMutationPhase: async (mutations: CompiledMutation<CompiledQuery>[]) => {
|
|
558
556
|
executionLog.push(`MUTATION: ${mutations.length} mutations`);
|
|
559
557
|
return {
|
|
560
558
|
success: true,
|
|
@@ -563,7 +561,7 @@ describe("UOW Coordinator - Parent-Child Execution", () => {
|
|
|
563
561
|
},
|
|
564
562
|
};
|
|
565
563
|
|
|
566
|
-
const parentUow = createUnitOfWork(
|
|
564
|
+
const parentUow = createUnitOfWork(createCompiler(), customExecutor, createMockDecoder());
|
|
567
565
|
|
|
568
566
|
// Service: Get account balance
|
|
569
567
|
const getAccountBalance = async (userId: string) => {
|
|
@@ -654,7 +652,7 @@ describe("UOW Coordinator - Parent-Child Execution", () => {
|
|
|
654
652
|
);
|
|
655
653
|
|
|
656
654
|
const executor = createMockExecutor();
|
|
657
|
-
const parentUow = createUnitOfWork(
|
|
655
|
+
const parentUow = createUnitOfWork(createCompiler(), executor, createMockDecoder());
|
|
658
656
|
|
|
659
657
|
// Service A: Validates user and throws if not active
|
|
660
658
|
const validateActiveUser = async (userId: string) => {
|
|
@@ -726,7 +724,7 @@ describe("UOW Coordinator - Parent-Child Execution", () => {
|
|
|
726
724
|
|
|
727
725
|
it("should inherit nonce from parent to children for idempotent operations", () => {
|
|
728
726
|
const executor = createMockExecutor();
|
|
729
|
-
const parentUow = createUnitOfWork(
|
|
727
|
+
const parentUow = createUnitOfWork(createCompiler(), executor, createMockDecoder());
|
|
730
728
|
|
|
731
729
|
// Parent UOW should have a nonce
|
|
732
730
|
const parentNonce = parentUow.nonce;
|
|
@@ -756,8 +754,8 @@ describe("UOW Coordinator - Parent-Child Execution", () => {
|
|
|
756
754
|
const executor = createMockExecutor();
|
|
757
755
|
|
|
758
756
|
// Create two separate parent UOWs
|
|
759
|
-
const parentUow1 = createUnitOfWork(
|
|
760
|
-
const parentUow2 = createUnitOfWork(
|
|
757
|
+
const parentUow1 = createUnitOfWork(createCompiler(), executor, createMockDecoder());
|
|
758
|
+
const parentUow2 = createUnitOfWork(createCompiler(), executor, createMockDecoder());
|
|
761
759
|
|
|
762
760
|
// They should have different nonces
|
|
763
761
|
expect(parentUow1.nonce).not.toBe(parentUow2.nonce);
|
|
@@ -783,14 +781,14 @@ describe("UOW Coordinator - Parent-Child Execution", () => {
|
|
|
783
781
|
);
|
|
784
782
|
|
|
785
783
|
// Create executor that throws "table does not exist" error
|
|
786
|
-
const failingExecutor = {
|
|
784
|
+
const failingExecutor: UOWExecutor<CompiledQuery, unknown> = {
|
|
787
785
|
executeRetrievalPhase: async () => {
|
|
788
786
|
throw new Error('relation "settings" does not exist');
|
|
789
787
|
},
|
|
790
788
|
executeMutationPhase: async () => ({ success: true, createdInternalIds: [] }),
|
|
791
789
|
};
|
|
792
790
|
|
|
793
|
-
const parentUow = createUnitOfWork(
|
|
791
|
+
const parentUow = createUnitOfWork(createCompiler(), failingExecutor, createMockDecoder());
|
|
794
792
|
|
|
795
793
|
// Service method that awaits retrievalPhase (simulating settingsService.get())
|
|
796
794
|
const getSettingValue = async (key: string) => {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { describe, expectTypeOf, it } from "vitest";
|
|
2
|
-
import { column, idColumn, referenceColumn, schema } from "
|
|
2
|
+
import { column, idColumn, referenceColumn, schema } from "../../schema/create";
|
|
3
3
|
import { JoinFindBuilder, UnitOfWork } from "./unit-of-work";
|
|
4
|
-
import type { FragnoId, FragnoReference } from "
|
|
4
|
+
import type { FragnoId, FragnoReference } from "../../schema/create";
|
|
5
5
|
|
|
6
6
|
type Prettify<T> = {
|
|
7
7
|
[K in keyof T]: T[K];
|
|
@@ -94,7 +94,9 @@ describe("UnitOfWork type tests", () => {
|
|
|
94
94
|
executeRetrievalPhase: async () => [],
|
|
95
95
|
executeMutationPhase: async () => ({ success: true, createdInternalIds: [] }),
|
|
96
96
|
};
|
|
97
|
-
const mockDecoder =
|
|
97
|
+
const mockDecoder = {
|
|
98
|
+
decode: () => [],
|
|
99
|
+
};
|
|
98
100
|
return new UnitOfWork(mockCompiler, mockExecutor, mockDecoder).forSchema(testSchema);
|
|
99
101
|
}
|
|
100
102
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { describe, it, expect, assert, expectTypeOf } from "vitest";
|
|
2
|
-
import { column, schema, idColumn, FragnoId } from "
|
|
2
|
+
import { column, schema, idColumn, FragnoId } from "../../schema/create";
|
|
3
3
|
import {
|
|
4
4
|
type UOWCompiler,
|
|
5
5
|
type UOWDecoder,
|
|
@@ -7,8 +7,8 @@ import {
|
|
|
7
7
|
type InferIdColumnName,
|
|
8
8
|
type IndexColumns,
|
|
9
9
|
} from "./unit-of-work";
|
|
10
|
-
import { createIndexedBuilder } from "
|
|
11
|
-
import type {
|
|
10
|
+
import { createIndexedBuilder } from "../condition-builder";
|
|
11
|
+
import type { SimpleQueryInterface } from "../simple-query-interface";
|
|
12
12
|
|
|
13
13
|
// Mock compiler and executor for testing
|
|
14
14
|
function createMockCompiler(): UOWCompiler<unknown> {
|
|
@@ -26,11 +26,13 @@ function createMockExecutor() {
|
|
|
26
26
|
}
|
|
27
27
|
|
|
28
28
|
function createMockDecoder(): UOWDecoder {
|
|
29
|
-
return
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
29
|
+
return {
|
|
30
|
+
decode(rawResults, operations) {
|
|
31
|
+
if (rawResults.length !== operations.length) {
|
|
32
|
+
throw new Error("rawResults and operations must have the same length");
|
|
33
|
+
}
|
|
34
|
+
return rawResults;
|
|
35
|
+
},
|
|
34
36
|
};
|
|
35
37
|
}
|
|
36
38
|
|
|
@@ -119,6 +121,50 @@ describe("FindBuilder", () => {
|
|
|
119
121
|
expect(op.options.pageSize).toBe(5);
|
|
120
122
|
});
|
|
121
123
|
|
|
124
|
+
it("should throw RangeError for pageSize <= 0", () => {
|
|
125
|
+
const testSchema = schema((s) =>
|
|
126
|
+
s.addTable("users", (t) => t.addColumn("id", idColumn()).addColumn("name", "string")),
|
|
127
|
+
);
|
|
128
|
+
|
|
129
|
+
const uow = createUnitOfWork(createMockCompiler(), createMockExecutor(), createMockDecoder());
|
|
130
|
+
|
|
131
|
+
expect(() => {
|
|
132
|
+
uow.forSchema(testSchema).find("users", (b) => b.whereIndex("primary").pageSize(0));
|
|
133
|
+
}).toThrow(RangeError);
|
|
134
|
+
|
|
135
|
+
expect(() => {
|
|
136
|
+
uow.forSchema(testSchema).find("users", (b) => b.whereIndex("primary").pageSize(-1));
|
|
137
|
+
}).toThrow(RangeError);
|
|
138
|
+
|
|
139
|
+
expect(() => {
|
|
140
|
+
uow.forSchema(testSchema).find("users", (b) => b.whereIndex("primary").pageSize(-10));
|
|
141
|
+
}).toThrow(RangeError);
|
|
142
|
+
});
|
|
143
|
+
|
|
144
|
+
it("should throw RangeError for non-integer pageSize", () => {
|
|
145
|
+
const testSchema = schema((s) =>
|
|
146
|
+
s.addTable("users", (t) => t.addColumn("id", idColumn()).addColumn("name", "string")),
|
|
147
|
+
);
|
|
148
|
+
|
|
149
|
+
const uow = createUnitOfWork(createMockCompiler(), createMockExecutor(), createMockDecoder());
|
|
150
|
+
|
|
151
|
+
expect(() => {
|
|
152
|
+
uow.forSchema(testSchema).find("users", (b) => b.whereIndex("primary").pageSize(1.5));
|
|
153
|
+
}).toThrow(RangeError);
|
|
154
|
+
|
|
155
|
+
expect(() => {
|
|
156
|
+
uow.forSchema(testSchema).find("users", (b) => b.whereIndex("primary").pageSize(3.14));
|
|
157
|
+
}).toThrow(RangeError);
|
|
158
|
+
|
|
159
|
+
expect(() => {
|
|
160
|
+
uow.forSchema(testSchema).find("users", (b) => b.whereIndex("primary").pageSize(NaN));
|
|
161
|
+
}).toThrow(RangeError);
|
|
162
|
+
|
|
163
|
+
expect(() => {
|
|
164
|
+
uow.forSchema(testSchema).find("users", (b) => b.whereIndex("primary").pageSize(Infinity));
|
|
165
|
+
}).toThrow(RangeError);
|
|
166
|
+
});
|
|
167
|
+
|
|
122
168
|
it("should throw if index doesn't exist", () => {
|
|
123
169
|
const testSchema = schema((s) =>
|
|
124
170
|
s.addTable("users", (t) => t.addColumn("id", idColumn()).addColumn("name", "string")),
|
|
@@ -406,6 +452,51 @@ describe("FindBuilder", () => {
|
|
|
406
452
|
expect(joinOptions.limit).toBe(5);
|
|
407
453
|
});
|
|
408
454
|
|
|
455
|
+
it("should throw RangeError for invalid pageSize in join", () => {
|
|
456
|
+
const testSchema = schema((s) =>
|
|
457
|
+
s
|
|
458
|
+
.addTable("users", (t) => t.addColumn("id", idColumn()).addColumn("name", "string"))
|
|
459
|
+
.addTable("posts", (t) =>
|
|
460
|
+
t
|
|
461
|
+
.addColumn("id", idColumn())
|
|
462
|
+
.addColumn("userId", column("string"))
|
|
463
|
+
.addColumn("title", "string")
|
|
464
|
+
.createIndex("idx_user", ["userId"]),
|
|
465
|
+
)
|
|
466
|
+
.addReference("user", {
|
|
467
|
+
type: "one",
|
|
468
|
+
from: { table: "posts", column: "userId" },
|
|
469
|
+
to: { table: "users", column: "id" },
|
|
470
|
+
}),
|
|
471
|
+
);
|
|
472
|
+
|
|
473
|
+
const uow = createUnitOfWork(createMockCompiler(), createMockExecutor(), createMockDecoder());
|
|
474
|
+
|
|
475
|
+
expect(() => {
|
|
476
|
+
uow
|
|
477
|
+
.forSchema(testSchema)
|
|
478
|
+
.find("posts", (b) =>
|
|
479
|
+
b.whereIndex("primary").join((jb) => jb["user"]((builder) => builder.pageSize(0))),
|
|
480
|
+
);
|
|
481
|
+
}).toThrow(RangeError);
|
|
482
|
+
|
|
483
|
+
expect(() => {
|
|
484
|
+
uow
|
|
485
|
+
.forSchema(testSchema)
|
|
486
|
+
.find("posts", (b) =>
|
|
487
|
+
b.whereIndex("primary").join((jb) => jb["user"]((builder) => builder.pageSize(-5))),
|
|
488
|
+
);
|
|
489
|
+
}).toThrow(RangeError);
|
|
490
|
+
|
|
491
|
+
expect(() => {
|
|
492
|
+
uow
|
|
493
|
+
.forSchema(testSchema)
|
|
494
|
+
.find("posts", (b) =>
|
|
495
|
+
b.whereIndex("primary").join((jb) => jb["user"]((builder) => builder.pageSize(2.5))),
|
|
496
|
+
);
|
|
497
|
+
}).toThrow(RangeError);
|
|
498
|
+
});
|
|
499
|
+
|
|
409
500
|
it("should support nested joins", () => {
|
|
410
501
|
const testSchema = schema((s) =>
|
|
411
502
|
s
|
|
@@ -648,7 +739,7 @@ describe("IndexedConditionBuilder", () => {
|
|
|
648
739
|
);
|
|
649
740
|
const uow = baseUow.forSchema(typeTestSchema);
|
|
650
741
|
expectTypeOf<keyof typeof typeTestSchema.tables>().toEqualTypeOf<"users">();
|
|
651
|
-
type _Query =
|
|
742
|
+
type _Query = SimpleQueryInterface<typeof typeTestSchema>;
|
|
652
743
|
expectTypeOf<Parameters<_Query["create"]>[0]>().toEqualTypeOf<"users">();
|
|
653
744
|
|
|
654
745
|
expectTypeOf<Parameters<typeof uow.find>[0]>().toEqualTypeOf<"users">();
|