@fragno-dev/db 0.1.14 → 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 -139
- package/CHANGELOG.md +47 -0
- package/README.md +123 -8
- package/dist/adapters/adapters.d.ts +19 -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 -19
- package/dist/adapters/drizzle/drizzle-adapter.d.ts.map +1 -1
- package/dist/adapters/drizzle/drizzle-adapter.js +7 -47
- package/dist/adapters/drizzle/drizzle-adapter.js.map +1 -1
- package/dist/adapters/drizzle/generate.d.ts +7 -1
- package/dist/adapters/drizzle/generate.d.ts.map +1 -1
- package/dist/adapters/drizzle/generate.js +46 -45
- 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 -16
- package/dist/adapters/kysely/kysely-adapter.d.ts.map +1 -1
- package/dist/adapters/kysely/kysely-adapter.js +6 -159
- package/dist/adapters/kysely/kysely-adapter.js.map +1 -1
- package/dist/adapters/{drizzle/drizzle-query.js → shared/from-unit-of-work-compiler.js} +48 -62
- package/dist/adapters/shared/from-unit-of-work-compiler.js.map +1 -0
- package/dist/adapters/{kysely/kysely-shared.d.ts → shared/table-name-mapper.d.ts} +3 -2
- 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 +186 -0
- package/dist/db-fragment-definition-builder.d.ts.map +1 -0
- package/dist/db-fragment-definition-builder.js +207 -0
- package/dist/db-fragment-definition-builder.js.map +1 -0
- package/dist/fragments/internal-fragment.d.ts +53 -0
- package/dist/fragments/internal-fragment.d.ts.map +1 -0
- package/dist/fragments/internal-fragment.js +111 -0
- package/dist/fragments/internal-fragment.js.map +1 -0
- 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 +38 -56
- package/dist/migration-engine/generation-engine.js.map +1 -1
- package/dist/mod.d.ts +35 -23
- package/dist/mod.d.ts.map +1 -1
- package/dist/mod.js +48 -45
- package/dist/mod.js.map +1 -1
- package/dist/node_modules/.pnpm/rou3@0.7.10/node_modules/rou3/dist/index.js +165 -0
- package/dist/node_modules/.pnpm/rou3@0.7.10/node_modules/rou3/dist/index.js.map +1 -0
- package/dist/packages/fragno/dist/api/bind-services.js +20 -0
- package/dist/packages/fragno/dist/api/bind-services.js.map +1 -0
- package/dist/packages/fragno/dist/api/error.js +48 -0
- package/dist/packages/fragno/dist/api/error.js.map +1 -0
- package/dist/packages/fragno/dist/api/fragment-definition-builder.js +320 -0
- package/dist/packages/fragno/dist/api/fragment-definition-builder.js.map +1 -0
- package/dist/packages/fragno/dist/api/fragment-instantiator.js +525 -0
- package/dist/packages/fragno/dist/api/fragment-instantiator.js.map +1 -0
- package/dist/packages/fragno/dist/api/fragno-response.js +73 -0
- package/dist/packages/fragno/dist/api/fragno-response.js.map +1 -0
- package/dist/packages/fragno/dist/api/internal/response-stream.js +81 -0
- package/dist/packages/fragno/dist/api/internal/response-stream.js.map +1 -0
- package/dist/packages/fragno/dist/api/internal/route.js +10 -0
- package/dist/packages/fragno/dist/api/internal/route.js.map +1 -0
- package/dist/packages/fragno/dist/api/mutable-request-state.js +97 -0
- package/dist/packages/fragno/dist/api/mutable-request-state.js.map +1 -0
- package/dist/packages/fragno/dist/api/request-context-storage.js +43 -0
- package/dist/packages/fragno/dist/api/request-context-storage.js.map +1 -0
- package/dist/packages/fragno/dist/api/request-input-context.js +118 -0
- package/dist/packages/fragno/dist/api/request-input-context.js.map +1 -0
- package/dist/packages/fragno/dist/api/request-middleware.js +83 -0
- package/dist/packages/fragno/dist/api/request-middleware.js.map +1 -0
- package/dist/packages/fragno/dist/api/request-output-context.js +119 -0
- package/dist/packages/fragno/dist/api/request-output-context.js.map +1 -0
- package/dist/packages/fragno/dist/api/route.js +17 -0
- package/dist/packages/fragno/dist/api/route.js.map +1 -0
- package/dist/packages/fragno/dist/internal/symbols.js +10 -0
- package/dist/packages/fragno/dist/internal/symbols.js.map +1 -0
- package/dist/query/column-defaults.js +27 -0
- package/dist/query/column-defaults.js.map +1 -0
- package/dist/query/cursor.d.ts +14 -6
- package/dist/query/cursor.d.ts.map +1 -1
- package/dist/query/cursor.js +16 -7
- 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} +6 -6
- package/dist/query/simple-query-interface.d.ts.map +1 -0
- package/dist/query/unit-of-work/execute-unit-of-work.d.ts +133 -0
- package/dist/query/unit-of-work/execute-unit-of-work.d.ts.map +1 -0
- package/dist/query/unit-of-work/execute-unit-of-work.js +197 -0
- package/dist/query/unit-of-work/execute-unit-of-work.js.map +1 -0
- package/dist/query/unit-of-work/retry-policy.d.ts +88 -0
- package/dist/query/unit-of-work/retry-policy.d.ts.map +1 -0
- package/dist/query/unit-of-work/retry-policy.js +61 -0
- 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} +145 -58
- 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} +435 -198
- 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 +32 -0
- package/dist/with-database.d.ts.map +1 -0
- package/dist/with-database.js +34 -0
- package/dist/with-database.js.map +1 -0
- package/package.json +43 -9
- package/src/adapters/adapters.ts +23 -4
- package/src/adapters/drizzle/drizzle-adapter-pglite.test.ts +140 -185
- package/src/adapters/drizzle/{drizzle-adapter-sqlite.test.ts → drizzle-adapter-sqlite3.test.ts} +187 -55
- package/src/adapters/drizzle/drizzle-adapter.ts +14 -93
- package/src/adapters/drizzle/generate.test.ts +102 -269
- package/src/adapters/drizzle/generate.ts +89 -63
- 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 +36 -5
- 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 +90 -96
- package/src/adapters/kysely/kysely-adapter-sqlocal.test.ts +215 -0
- package/src/adapters/kysely/kysely-adapter.ts +10 -242
- package/src/adapters/{drizzle/drizzle-query.ts → shared/from-unit-of-work-compiler.ts} +111 -106
- 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 +887 -0
- package/src/db-fragment-definition-builder.ts +737 -0
- package/src/db-fragment-instantiator.test.ts +543 -0
- package/src/db-fragment-integration.test.ts +406 -0
- package/src/fragments/internal-fragment.test.ts +549 -0
- package/src/fragments/internal-fragment.ts +249 -0
- package/src/hooks/hooks.test.ts +575 -0
- package/src/hooks/hooks.ts +179 -0
- package/src/migration-engine/generation-engine.test.ts +60 -27
- package/src/migration-engine/generation-engine.ts +99 -92
- package/src/mod.ts +139 -78
- package/src/query/column-defaults.ts +49 -0
- package/src/query/cursor.test.ts +147 -3
- package/src/query/cursor.ts +25 -8
- 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} +4 -4
- package/src/query/unit-of-work/execute-unit-of-work.test.ts +1310 -0
- package/src/query/unit-of-work/execute-unit-of-work.ts +504 -0
- package/src/query/unit-of-work/retry-policy.test.ts +217 -0
- package/src/query/unit-of-work/retry-policy.ts +141 -0
- package/src/query/unit-of-work/unit-of-work-coordinator.test.ts +831 -0
- package/src/query/{unit-of-work-types.test.ts → unit-of-work/unit-of-work-types.test.ts} +7 -5
- package/src/query/unit-of-work/unit-of-work.test.ts +1716 -0
- package/src/query/{unit-of-work.ts → unit-of-work/unit-of-work.ts} +716 -420
- package/src/query/{result-transform.test.ts → value-decoding.test.ts} +45 -298
- 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 +152 -0
- package/tsdown.config.ts +8 -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 -315
- package/dist/adapters/drizzle/drizzle-uow-compiler.js.map +0 -1
- package/dist/adapters/drizzle/drizzle-uow-decoder.js +0 -116
- package/dist/adapters/drizzle/drizzle-uow-decoder.js.map +0 -1
- package/dist/adapters/drizzle/drizzle-uow-executor.js +0 -149
- 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 +0 -14
- 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 -66
- package/dist/adapters/kysely/kysely-query-compiler.js.map +0 -1
- package/dist/adapters/kysely/kysely-query.d.ts +0 -22
- package/dist/adapters/kysely/kysely-query.d.ts.map +0 -1
- package/dist/adapters/kysely/kysely-query.js +0 -223
- package/dist/adapters/kysely/kysely-query.js.map +0 -1
- package/dist/adapters/kysely/kysely-shared.d.ts.map +0 -1
- package/dist/adapters/kysely/kysely-shared.js +0 -18
- package/dist/adapters/kysely/kysely-shared.js.map +0 -1
- package/dist/adapters/kysely/kysely-uow-compiler.js +0 -170
- package/dist/adapters/kysely/kysely-uow-compiler.js.map +0 -1
- package/dist/adapters/kysely/kysely-uow-executor.js +0 -89
- 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/bind-services.d.ts +0 -7
- package/dist/bind-services.d.ts.map +0 -1
- package/dist/bind-services.js +0 -14
- package/dist/bind-services.js.map +0 -1
- package/dist/fragment.d.ts +0 -173
- package/dist/fragment.d.ts.map +0 -1
- package/dist/fragment.js +0 -191
- package/dist/fragment.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/query/query.d.ts.map +0 -1
- package/dist/query/result-transform.js +0 -168
- package/dist/query/result-transform.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 -106
- package/dist/schema/serialize.js.map +0 -1
- package/dist/shared/settings-schema.js +0 -36
- package/dist/shared/settings-schema.js.map +0 -1
- package/src/adapters/drizzle/drizzle-adapter.test.ts +0 -170
- 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.test.ts +0 -1383
- package/src/adapters/drizzle/drizzle-uow-compiler.ts +0 -636
- package/src/adapters/drizzle/drizzle-uow-decoder.ts +0 -218
- package/src/adapters/drizzle/drizzle-uow-executor.ts +0 -276
- 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 -132
- package/src/adapters/kysely/kysely-query.test.ts +0 -498
- package/src/adapters/kysely/kysely-query.ts +0 -390
- package/src/adapters/kysely/kysely-shared.ts +0 -23
- package/src/adapters/kysely/kysely-uow-compiler.test.ts +0 -998
- package/src/adapters/kysely/kysely-uow-compiler.ts +0 -318
- package/src/adapters/kysely/kysely-uow-executor.ts +0 -145
- package/src/adapters/kysely/kysely-uow-joins.test.ts +0 -811
- 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/bind-services.test.ts +0 -214
- package/src/bind-services.ts +0 -37
- package/src/db-fragment.test.ts +0 -800
- package/src/fragment.ts +0 -727
- package/src/query/result-transform.ts +0 -271
- package/src/query/unit-of-work-multi-schema.test.ts +0 -64
- package/src/query/unit-of-work.test.ts +0 -943
- package/src/schema/serialize.ts +0 -396
- package/src/shared/settings-schema.ts +0 -61
- package/src/uow-context-integration.test.ts +0 -102
- package/src/uow-context.test.ts +0 -182
- /package/dist/query/{query.js → simple-query-interface.js} +0 -0
|
@@ -1,218 +0,0 @@
|
|
|
1
|
-
import type { AnySchema, AnyTable } from "../../schema/create";
|
|
2
|
-
import type { SQLProvider } from "../../shared/providers";
|
|
3
|
-
import type { RetrievalOperation, UOWDecoder } from "../../query/unit-of-work";
|
|
4
|
-
import { decodeResult } from "../../query/result-transform";
|
|
5
|
-
import { getOrderedJoinColumns } from "./join-column-utils";
|
|
6
|
-
import type { DrizzleResult } from "./shared";
|
|
7
|
-
import { createCursorFromRecord, Cursor, type CursorResult } from "../../query/cursor";
|
|
8
|
-
|
|
9
|
-
/**
|
|
10
|
-
* Join information with nested join support
|
|
11
|
-
*/
|
|
12
|
-
interface JoinInfo {
|
|
13
|
-
relation: { name: string; table: AnyTable };
|
|
14
|
-
options:
|
|
15
|
-
| {
|
|
16
|
-
select: true | string[];
|
|
17
|
-
join?: JoinInfo[];
|
|
18
|
-
}
|
|
19
|
-
| false;
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
/**
|
|
23
|
-
* Recursively transform join arrays to objects, handling nested joins.
|
|
24
|
-
*
|
|
25
|
-
* Drizzle joins use `json_build_array` where nested join data is appended after the parent's columns.
|
|
26
|
-
* For example, if post has columns [id, title, content, _internalId, _version] and a nested author join,
|
|
27
|
-
* the array will be: [id, title, content, _internalId, _version, authorArray]
|
|
28
|
-
*
|
|
29
|
-
* @param value - The join array from Drizzle
|
|
30
|
-
* @param joinInfo - Join metadata including nested joins
|
|
31
|
-
* @param relationName - Name of the current relation (for prefixing column names)
|
|
32
|
-
* @returns Object with flattened keys (relationName:columnName) for all levels
|
|
33
|
-
*/
|
|
34
|
-
function transformJoinArray(
|
|
35
|
-
value: unknown[],
|
|
36
|
-
joinInfo: JoinInfo,
|
|
37
|
-
relationName: string,
|
|
38
|
-
): Record<string, unknown> {
|
|
39
|
-
const result: Record<string, unknown> = {};
|
|
40
|
-
|
|
41
|
-
if (joinInfo.options === false) {
|
|
42
|
-
return result;
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
const targetTable = joinInfo.relation.table;
|
|
46
|
-
|
|
47
|
-
// Get ordered columns using shared utility (must match compiler's column order)
|
|
48
|
-
const orderedSelectedColumns = getOrderedJoinColumns(targetTable, joinInfo.options.select);
|
|
49
|
-
|
|
50
|
-
// Map column values to flattened format: relationName:columnName
|
|
51
|
-
for (let i = 0; i < orderedSelectedColumns.length && i < value.length; i++) {
|
|
52
|
-
const columnName = orderedSelectedColumns[i];
|
|
53
|
-
if (columnName) {
|
|
54
|
-
result[`${relationName}:${columnName}`] = value[i];
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
// Handle nested joins - they appear after all columns in the array
|
|
59
|
-
if (joinInfo.options.join && joinInfo.options.join.length > 0) {
|
|
60
|
-
let nestedArrayIndex = orderedSelectedColumns.length;
|
|
61
|
-
|
|
62
|
-
for (const nestedJoin of joinInfo.options.join) {
|
|
63
|
-
const nestedRelationName = `${relationName}:${nestedJoin.relation.name}`;
|
|
64
|
-
const nestedValue = value[nestedArrayIndex];
|
|
65
|
-
|
|
66
|
-
if (Array.isArray(nestedValue)) {
|
|
67
|
-
// Recursively transform nested join
|
|
68
|
-
const nestedResult = transformJoinArray(nestedValue, nestedJoin, nestedRelationName);
|
|
69
|
-
Object.assign(result, nestedResult);
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
nestedArrayIndex++;
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
return result;
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
/**
|
|
80
|
-
* Drizzle joins using `json_build_array` so the result is a tuple of values that we need to map to
|
|
81
|
-
* the correct columns. This function handles nested joins recursively.
|
|
82
|
-
*
|
|
83
|
-
* @param row - Raw database result row that may contain join arrays
|
|
84
|
-
* @param op - The retrieval operation containing join information
|
|
85
|
-
* @returns Transformed row with join arrays converted to objects
|
|
86
|
-
*/
|
|
87
|
-
function transformJoinArraysToObjects(
|
|
88
|
-
row: Record<string, unknown>,
|
|
89
|
-
op: {
|
|
90
|
-
type: string;
|
|
91
|
-
table: AnyTable;
|
|
92
|
-
options?: {
|
|
93
|
-
joins?: JoinInfo[];
|
|
94
|
-
};
|
|
95
|
-
},
|
|
96
|
-
provider: SQLProvider,
|
|
97
|
-
): Record<string, unknown> {
|
|
98
|
-
// Only process find operations with joins
|
|
99
|
-
if (op.type !== "find" || !op.options?.joins) {
|
|
100
|
-
return row;
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
const transformedRow = { ...row };
|
|
104
|
-
|
|
105
|
-
for (const join of op.options.joins) {
|
|
106
|
-
const relationName = join.relation.name;
|
|
107
|
-
let value = row[relationName];
|
|
108
|
-
|
|
109
|
-
// For SQLite, json_array returns a JSON string that needs to be parsed
|
|
110
|
-
if (provider === "sqlite" && typeof value === "string") {
|
|
111
|
-
try {
|
|
112
|
-
value = JSON.parse(value) as unknown;
|
|
113
|
-
} catch {
|
|
114
|
-
// If parsing fails, skip this join
|
|
115
|
-
continue;
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
// Skip if not an array (join didn't return data)
|
|
120
|
-
if (!Array.isArray(value)) {
|
|
121
|
-
continue;
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
// Skip if join options are false (join was disabled)
|
|
125
|
-
if (join.options === false) {
|
|
126
|
-
continue;
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
// Get the target table for this relation
|
|
130
|
-
const relation = op.table.relations[relationName];
|
|
131
|
-
if (!relation) {
|
|
132
|
-
continue;
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
// Recursively transform this join and its nested joins
|
|
136
|
-
const joinResult = transformJoinArray(value, join, relationName);
|
|
137
|
-
Object.assign(transformedRow, joinResult);
|
|
138
|
-
|
|
139
|
-
// Remove the original array property
|
|
140
|
-
delete transformedRow[relationName];
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
return transformedRow;
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
export function createDrizzleUOWDecoder(provider: SQLProvider): UOWDecoder<DrizzleResult> {
|
|
147
|
-
return (rawResults, ops) => {
|
|
148
|
-
if (rawResults.length !== ops.length) {
|
|
149
|
-
throw new Error("rawResults and ops must have the same length");
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
return rawResults.map((result, index) => {
|
|
153
|
-
const op = ops[index] as RetrievalOperation<AnySchema>;
|
|
154
|
-
if (!op) {
|
|
155
|
-
throw new Error("op must be defined");
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
// Handle count operations - return the count value directly
|
|
159
|
-
if (op.type === "count") {
|
|
160
|
-
if (result.rows.length > 0 && result.rows[0]) {
|
|
161
|
-
const row = result.rows[0] as Record<string, unknown>;
|
|
162
|
-
const countValue = row["count"] ?? row["count(*)"];
|
|
163
|
-
|
|
164
|
-
if (typeof countValue !== "number") {
|
|
165
|
-
throw new Error(`Unexpected result for count, received: ${countValue}`);
|
|
166
|
-
}
|
|
167
|
-
|
|
168
|
-
return countValue;
|
|
169
|
-
}
|
|
170
|
-
return 0;
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
// Handle find operations - decode each row
|
|
174
|
-
const decodedRows = result.rows.map((row) => {
|
|
175
|
-
const transformedRow = transformJoinArraysToObjects(row, op, provider);
|
|
176
|
-
return decodeResult(transformedRow, op.table, provider);
|
|
177
|
-
});
|
|
178
|
-
|
|
179
|
-
// If cursor generation is requested, wrap in CursorResult
|
|
180
|
-
if (op.withCursor) {
|
|
181
|
-
let cursor: Cursor | undefined;
|
|
182
|
-
|
|
183
|
-
// Generate cursor from last item if results exist
|
|
184
|
-
if (decodedRows.length > 0 && op.options.orderByIndex && op.options.pageSize) {
|
|
185
|
-
const lastItem = decodedRows[decodedRows.length - 1];
|
|
186
|
-
const indexName = op.options.orderByIndex.indexName;
|
|
187
|
-
|
|
188
|
-
// Get index columns
|
|
189
|
-
let indexColumns;
|
|
190
|
-
if (indexName === "_primary") {
|
|
191
|
-
indexColumns = [op.table.getIdColumn()];
|
|
192
|
-
} else {
|
|
193
|
-
const index = op.table.indexes[indexName];
|
|
194
|
-
if (index) {
|
|
195
|
-
indexColumns = index.columns;
|
|
196
|
-
}
|
|
197
|
-
}
|
|
198
|
-
|
|
199
|
-
if (indexColumns && lastItem) {
|
|
200
|
-
cursor = createCursorFromRecord(lastItem as Record<string, unknown>, indexColumns, {
|
|
201
|
-
indexName: op.options.orderByIndex.indexName,
|
|
202
|
-
orderDirection: op.options.orderByIndex.direction,
|
|
203
|
-
pageSize: op.options.pageSize,
|
|
204
|
-
});
|
|
205
|
-
}
|
|
206
|
-
}
|
|
207
|
-
|
|
208
|
-
const cursorResult: CursorResult<unknown> = {
|
|
209
|
-
items: decodedRows,
|
|
210
|
-
cursor,
|
|
211
|
-
};
|
|
212
|
-
return cursorResult;
|
|
213
|
-
}
|
|
214
|
-
|
|
215
|
-
return decodedRows;
|
|
216
|
-
});
|
|
217
|
-
};
|
|
218
|
-
}
|
|
@@ -1,276 +0,0 @@
|
|
|
1
|
-
import { SQL, StringChunk, sql, type SQLChunk } from "drizzle-orm";
|
|
2
|
-
import type { CompiledMutation, MutationResult } from "../../query/unit-of-work";
|
|
3
|
-
import type { DBType } from "./shared";
|
|
4
|
-
import type { DrizzleCompiledQuery } from "./drizzle-uow-compiler";
|
|
5
|
-
import type { DrizzleResult } from "./shared";
|
|
6
|
-
import { BaseSQLiteDatabase } from "drizzle-orm/sqlite-core";
|
|
7
|
-
import { SQLiteSyncDialect } from "drizzle-orm/sqlite-core";
|
|
8
|
-
|
|
9
|
-
type SyncSQLiteDB = BaseSQLiteDatabase<
|
|
10
|
-
"sync",
|
|
11
|
-
unknown,
|
|
12
|
-
Record<string, never>,
|
|
13
|
-
Record<string, never>
|
|
14
|
-
>;
|
|
15
|
-
|
|
16
|
-
function isSyncSQLite(db: unknown): boolean {
|
|
17
|
-
return (
|
|
18
|
-
db instanceof BaseSQLiteDatabase &&
|
|
19
|
-
"dialect" in db &&
|
|
20
|
-
(db as { dialect?: unknown }).dialect instanceof SQLiteSyncDialect
|
|
21
|
-
);
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
function assertSyncSQLite(db: unknown): asserts db is SyncSQLiteDB {
|
|
25
|
-
if (!isSyncSQLite(db)) {
|
|
26
|
-
throw new Error("Expected synchronous SQLite database (better-sqlite3)");
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
function postgresToSQL(sqlString: string, params: unknown[]): SQLChunk[] {
|
|
31
|
-
const placeholderRegex = /\$(\d+)/g;
|
|
32
|
-
const queryChunks: SQLChunk[] = [];
|
|
33
|
-
let lastIndex = 0;
|
|
34
|
-
let match: RegExpExecArray | null;
|
|
35
|
-
|
|
36
|
-
while ((match = placeholderRegex.exec(sqlString)) !== null) {
|
|
37
|
-
const textBefore = sqlString.substring(lastIndex, match.index);
|
|
38
|
-
if (textBefore) {
|
|
39
|
-
queryChunks.push(new StringChunk(textBefore));
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
const paramIndex = parseInt(match[1]!, 10) - 1;
|
|
43
|
-
queryChunks.push(sql.param(params[paramIndex]));
|
|
44
|
-
|
|
45
|
-
lastIndex = match.index + match[0].length;
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
const textAfter = sqlString.substring(lastIndex);
|
|
49
|
-
if (textAfter) {
|
|
50
|
-
queryChunks.push(new StringChunk(textAfter));
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
return queryChunks;
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
function sqliteToSQL(sqlString: string, params: unknown[]): SQLChunk[] {
|
|
57
|
-
const chunks: SQLChunk[] = [];
|
|
58
|
-
let currentIndex = 0;
|
|
59
|
-
|
|
60
|
-
const parts = sqlString.split("?");
|
|
61
|
-
for (let i = 0; i < parts.length; i++) {
|
|
62
|
-
if (parts[i]) {
|
|
63
|
-
chunks.push(new StringChunk(parts[i]));
|
|
64
|
-
}
|
|
65
|
-
if (i < parts.length - 1 && currentIndex < params.length) {
|
|
66
|
-
chunks.push(sql.param(params[currentIndex++]));
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
return chunks;
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
function toSQL(query: DrizzleCompiledQuery, provider: "sqlite" | "mysql" | "postgresql"): SQL {
|
|
74
|
-
const { sql: sqlString, params } = query;
|
|
75
|
-
|
|
76
|
-
const queryChunks =
|
|
77
|
-
provider === "sqlite" ? sqliteToSQL(sqlString, params) : postgresToSQL(sqlString, params);
|
|
78
|
-
|
|
79
|
-
return new SQL(queryChunks);
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
function getAffectedRows(result: unknown): number {
|
|
83
|
-
if (Array.isArray(result)) {
|
|
84
|
-
return result.length;
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
if (result && typeof result === "object") {
|
|
88
|
-
// libsql uses rowsAffected
|
|
89
|
-
if ("rowsAffected" in result && typeof result["rowsAffected"] === "number") {
|
|
90
|
-
return result["rowsAffected"];
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
if ("affectedRows" in result && typeof result["affectedRows"] === "number") {
|
|
94
|
-
return result["affectedRows"];
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
if (
|
|
98
|
-
"rowCount" in result &&
|
|
99
|
-
(typeof result["rowCount"] === "number" || typeof result["rowCount"] === "bigint")
|
|
100
|
-
) {
|
|
101
|
-
const rowCount = result["rowCount"];
|
|
102
|
-
if (rowCount > Number.MAX_SAFE_INTEGER) {
|
|
103
|
-
throw new Error(
|
|
104
|
-
`rowCount BigInt value ${rowCount.toString()} exceeds JS safe integer range`,
|
|
105
|
-
);
|
|
106
|
-
}
|
|
107
|
-
return Number(rowCount);
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
if ("changes" in result && typeof result["changes"] === "number") {
|
|
111
|
-
return result["changes"];
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
throw new Error(`Unable to determine affected rows from result: ${JSON.stringify(result)}`);
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
async function executeInTransaction(
|
|
119
|
-
db: DBType,
|
|
120
|
-
provider: "sqlite" | "mysql" | "postgresql",
|
|
121
|
-
syncExecutor: (db: SyncSQLiteDB) => void,
|
|
122
|
-
asyncExecutor: (tx: {
|
|
123
|
-
execute?: (sql: SQL) => Promise<unknown>;
|
|
124
|
-
run?: (sql: SQL) => Promise<unknown>;
|
|
125
|
-
}) => Promise<void>,
|
|
126
|
-
): Promise<void> {
|
|
127
|
-
if (provider === "sqlite" && isSyncSQLite(db)) {
|
|
128
|
-
assertSyncSQLite(db);
|
|
129
|
-
db.transaction(() => syncExecutor(db));
|
|
130
|
-
} else {
|
|
131
|
-
await db.transaction(
|
|
132
|
-
async (tx) =>
|
|
133
|
-
await asyncExecutor(
|
|
134
|
-
tx as { execute?: (sql: SQL) => Promise<unknown>; run?: (sql: SQL) => Promise<unknown> },
|
|
135
|
-
),
|
|
136
|
-
);
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
function extractCreatedInternalId(result: unknown): bigint | null {
|
|
141
|
-
if (result && typeof result === "object" && "lastInsertRowid" in result) {
|
|
142
|
-
if (typeof result.lastInsertRowid === "bigint") {
|
|
143
|
-
return result.lastInsertRowid;
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
if (typeof result.lastInsertRowid === "number") {
|
|
147
|
-
return BigInt(result.lastInsertRowid);
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
throw new Error(`Unexpected lastInsertRowid type: ${typeof result.lastInsertRowid}`);
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
if (Array.isArray(result) && result.length > 0) {
|
|
154
|
-
const row = result[0] as Record<string, unknown>;
|
|
155
|
-
if ("_internalId" in row || "_internal_id" in row) {
|
|
156
|
-
return (row["_internalId"] ?? row["_internal_id"]) as bigint;
|
|
157
|
-
}
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
return null;
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
function validateAffectedRows(result: unknown, expected: number): void {
|
|
164
|
-
const actual = getAffectedRows(result);
|
|
165
|
-
if (actual !== expected) {
|
|
166
|
-
throw new Error(`Version conflict: expected ${expected} rows affected, but got ${actual}`);
|
|
167
|
-
}
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
/**
|
|
171
|
-
* Execute the retrieval phase of a Unit of Work using Drizzle
|
|
172
|
-
*
|
|
173
|
-
* All retrieval queries are executed inside a single transaction to ensure
|
|
174
|
-
* snapshot isolation - all reads see a consistent view of the database.
|
|
175
|
-
*/
|
|
176
|
-
export async function executeDrizzleRetrievalPhase(
|
|
177
|
-
db: DBType,
|
|
178
|
-
retrievalBatch: DrizzleCompiledQuery[],
|
|
179
|
-
provider: "sqlite" | "mysql" | "postgresql",
|
|
180
|
-
): Promise<DrizzleResult[]> {
|
|
181
|
-
if (retrievalBatch.length === 0) {
|
|
182
|
-
return [];
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
const retrievalResults: DrizzleResult[] = [];
|
|
186
|
-
|
|
187
|
-
await executeInTransaction(
|
|
188
|
-
db,
|
|
189
|
-
provider,
|
|
190
|
-
(syncDb) => {
|
|
191
|
-
for (const query of retrievalBatch) {
|
|
192
|
-
const sqlObj = toSQL(query, provider);
|
|
193
|
-
const rows = syncDb.all(sqlObj as never) as Record<string, unknown>[];
|
|
194
|
-
const result: DrizzleResult = { rows, affectedRows: 0 };
|
|
195
|
-
retrievalResults.push(result);
|
|
196
|
-
}
|
|
197
|
-
},
|
|
198
|
-
async (tx) => {
|
|
199
|
-
for (const query of retrievalBatch) {
|
|
200
|
-
const sqlObj = toSQL(query, provider);
|
|
201
|
-
// Fallback to run when execute is not available (e.g., libsql)
|
|
202
|
-
const executeMethod = tx.execute ?? tx.run;
|
|
203
|
-
if (!executeMethod) {
|
|
204
|
-
throw new Error("Transaction object has neither execute nor run method");
|
|
205
|
-
}
|
|
206
|
-
const result = (await executeMethod.call(tx, sqlObj)) as DrizzleResult;
|
|
207
|
-
retrievalResults.push(result);
|
|
208
|
-
}
|
|
209
|
-
},
|
|
210
|
-
);
|
|
211
|
-
|
|
212
|
-
return retrievalResults;
|
|
213
|
-
}
|
|
214
|
-
|
|
215
|
-
/**
|
|
216
|
-
* Execute the mutation phase of a Unit of Work using Drizzle
|
|
217
|
-
*
|
|
218
|
-
* All mutation queries are executed in a transaction with optimistic locking.
|
|
219
|
-
* If any version check fails, the entire transaction is rolled back and
|
|
220
|
-
* success=false is returned.
|
|
221
|
-
*/
|
|
222
|
-
export async function executeDrizzleMutationPhase(
|
|
223
|
-
db: DBType,
|
|
224
|
-
mutationBatch: CompiledMutation<DrizzleCompiledQuery>[],
|
|
225
|
-
provider: "sqlite" | "mysql" | "postgresql",
|
|
226
|
-
): Promise<MutationResult> {
|
|
227
|
-
if (mutationBatch.length === 0) {
|
|
228
|
-
return { success: true, createdInternalIds: [] };
|
|
229
|
-
}
|
|
230
|
-
|
|
231
|
-
const createdInternalIds: (bigint | null)[] = [];
|
|
232
|
-
|
|
233
|
-
try {
|
|
234
|
-
await executeInTransaction(
|
|
235
|
-
db,
|
|
236
|
-
provider,
|
|
237
|
-
(syncDb) => {
|
|
238
|
-
for (const { query, expectedAffectedRows } of mutationBatch) {
|
|
239
|
-
const sqlObj = toSQL(query, provider);
|
|
240
|
-
// Type assertion needed due to drizzle-orm version mismatch in dependencies
|
|
241
|
-
const result = syncDb.run(sqlObj as never);
|
|
242
|
-
|
|
243
|
-
if (expectedAffectedRows === null) {
|
|
244
|
-
createdInternalIds.push(extractCreatedInternalId(result));
|
|
245
|
-
} else {
|
|
246
|
-
validateAffectedRows(result, expectedAffectedRows);
|
|
247
|
-
}
|
|
248
|
-
}
|
|
249
|
-
},
|
|
250
|
-
async (tx) => {
|
|
251
|
-
for (const { query, expectedAffectedRows } of mutationBatch) {
|
|
252
|
-
const sqlObj = toSQL(query, provider);
|
|
253
|
-
// Fallback to run when execute is not available (e.g., libsql)
|
|
254
|
-
const executeMethod = tx.execute ?? tx.run;
|
|
255
|
-
if (!executeMethod) {
|
|
256
|
-
throw new Error("Transaction object has neither execute nor run method");
|
|
257
|
-
}
|
|
258
|
-
const result = await executeMethod.call(tx, sqlObj);
|
|
259
|
-
|
|
260
|
-
if (expectedAffectedRows === null) {
|
|
261
|
-
createdInternalIds.push(extractCreatedInternalId(result));
|
|
262
|
-
} else {
|
|
263
|
-
validateAffectedRows(result, expectedAffectedRows);
|
|
264
|
-
}
|
|
265
|
-
}
|
|
266
|
-
},
|
|
267
|
-
);
|
|
268
|
-
|
|
269
|
-
return { success: true, createdInternalIds };
|
|
270
|
-
} catch (error) {
|
|
271
|
-
if (error instanceof Error && error.message.includes("Version conflict")) {
|
|
272
|
-
return { success: false };
|
|
273
|
-
}
|
|
274
|
-
throw error;
|
|
275
|
-
}
|
|
276
|
-
}
|
|
@@ -1,79 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect } from "vitest";
|
|
2
|
-
import { getOrderedJoinColumns } from "./join-column-utils";
|
|
3
|
-
import { schema, column, idColumn } from "../../schema/create";
|
|
4
|
-
|
|
5
|
-
describe("getOrderedJoinColumns", () => {
|
|
6
|
-
const testSchema = schema((s) => {
|
|
7
|
-
return s
|
|
8
|
-
.addTable("users", (t) => {
|
|
9
|
-
return t
|
|
10
|
-
.addColumn("id", idColumn())
|
|
11
|
-
.addColumn("name", column("string"))
|
|
12
|
-
.addColumn("email", column("string"))
|
|
13
|
-
.addColumn("age", column("integer").nullable());
|
|
14
|
-
})
|
|
15
|
-
.addTable("posts", (t) => {
|
|
16
|
-
return t
|
|
17
|
-
.addColumn("id", idColumn())
|
|
18
|
-
.addColumn("title", column("string"))
|
|
19
|
-
.addColumn("content", column("string"));
|
|
20
|
-
});
|
|
21
|
-
});
|
|
22
|
-
|
|
23
|
-
const usersTable = testSchema.tables["users"];
|
|
24
|
-
const postsTable = testSchema.tables["posts"];
|
|
25
|
-
|
|
26
|
-
it("should return all columns when select is true", () => {
|
|
27
|
-
const columns = getOrderedJoinColumns(usersTable, true);
|
|
28
|
-
|
|
29
|
-
// Should include all columns including hidden ones (_internalId, _version)
|
|
30
|
-
expect(columns).toEqual(["id", "name", "email", "age", "_internalId", "_version"]);
|
|
31
|
-
});
|
|
32
|
-
|
|
33
|
-
it("should return selected columns plus hidden columns when select is array", () => {
|
|
34
|
-
const columns = getOrderedJoinColumns(usersTable, ["name", "email"]);
|
|
35
|
-
|
|
36
|
-
// Selected columns first, then hidden columns
|
|
37
|
-
expect(columns).toEqual(["name", "email", "_internalId", "_version"]);
|
|
38
|
-
});
|
|
39
|
-
|
|
40
|
-
it("should return only id plus hidden columns when selecting just id", () => {
|
|
41
|
-
const columns = getOrderedJoinColumns(usersTable, ["id"]);
|
|
42
|
-
|
|
43
|
-
expect(columns).toEqual(["id", "_internalId", "_version"]);
|
|
44
|
-
});
|
|
45
|
-
|
|
46
|
-
it("should handle table with no nullable columns", () => {
|
|
47
|
-
const columns = getOrderedJoinColumns(postsTable, true);
|
|
48
|
-
|
|
49
|
-
expect(columns).toEqual(["id", "title", "content", "_internalId", "_version"]);
|
|
50
|
-
});
|
|
51
|
-
|
|
52
|
-
it("should handle selecting specific columns from different table", () => {
|
|
53
|
-
const columns = getOrderedJoinColumns(postsTable, ["title"]);
|
|
54
|
-
|
|
55
|
-
expect(columns).toEqual(["title", "_internalId", "_version"]);
|
|
56
|
-
});
|
|
57
|
-
|
|
58
|
-
it("should deduplicate hidden columns if already selected", () => {
|
|
59
|
-
// This shouldn't happen in practice, but the function should handle it
|
|
60
|
-
const columns = getOrderedJoinColumns(usersTable, ["name", "_internalId"]);
|
|
61
|
-
|
|
62
|
-
// _internalId should not be duplicated
|
|
63
|
-
expect(columns).toEqual(["name", "_internalId", "_version"]);
|
|
64
|
-
});
|
|
65
|
-
|
|
66
|
-
it("should maintain column order as defined in table", () => {
|
|
67
|
-
const columns = getOrderedJoinColumns(usersTable, ["email", "name", "id"]);
|
|
68
|
-
|
|
69
|
-
// Even though we select in different order, should follow selected order
|
|
70
|
-
expect(columns).toEqual(["email", "name", "id", "_internalId", "_version"]);
|
|
71
|
-
});
|
|
72
|
-
|
|
73
|
-
it("should skip unknown column keys", () => {
|
|
74
|
-
const columns = getOrderedJoinColumns(usersTable, ["name", "unknownColumn", "email"]);
|
|
75
|
-
|
|
76
|
-
// Should only include known columns
|
|
77
|
-
expect(columns).toEqual(["name", "email", "_internalId", "_version"]);
|
|
78
|
-
});
|
|
79
|
-
});
|
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
import type { AnyTable } from "../../schema/create";
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Determine the ordered list of columns for a join selection.
|
|
5
|
-
*
|
|
6
|
-
* This logic is shared between the compiler (which builds the SQL)
|
|
7
|
-
* and the decoder (which maps the result array back to objects).
|
|
8
|
-
* The order MUST match exactly for the decoder to work correctly.
|
|
9
|
-
*
|
|
10
|
-
* @param targetTable - The table being joined
|
|
11
|
-
* @param select - Selection options (true for all columns, or array of column keys)
|
|
12
|
-
* @returns Array of column ORM names in the order they appear in the SQL/result
|
|
13
|
-
*/
|
|
14
|
-
export function getOrderedJoinColumns(targetTable: AnyTable, select: true | string[]): string[] {
|
|
15
|
-
const orderedColumns: string[] = [];
|
|
16
|
-
|
|
17
|
-
if (select === true) {
|
|
18
|
-
// All columns selected - iterate in the order they appear in targetTable.columns
|
|
19
|
-
for (const col of Object.values(targetTable.columns)) {
|
|
20
|
-
orderedColumns.push(col.ormName);
|
|
21
|
-
}
|
|
22
|
-
} else {
|
|
23
|
-
// Specific columns selected
|
|
24
|
-
for (const colKey of select) {
|
|
25
|
-
const col = targetTable.columns[colKey];
|
|
26
|
-
if (col) {
|
|
27
|
-
orderedColumns.push(col.ormName);
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
// Add hidden columns at the end (for FragnoId construction)
|
|
31
|
-
for (const col of Object.values(targetTable.columns)) {
|
|
32
|
-
if (col && col.isHidden && !orderedColumns.includes(col.ormName)) {
|
|
33
|
-
orderedColumns.push(col.ormName);
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
return orderedColumns;
|
|
39
|
-
}
|
|
@@ -1,70 +0,0 @@
|
|
|
1
|
-
import type { Kysely } from "kysely";
|
|
2
|
-
import type { ConnectionPool } from "../../shared/connection-pool";
|
|
3
|
-
|
|
4
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
5
|
-
type KyselyAny = Kysely<any>;
|
|
6
|
-
|
|
7
|
-
/**
|
|
8
|
-
* Creates a Kysely-specific connection pool with proper cleanup.
|
|
9
|
-
* Calls db.destroy() when the pool is closed to properly release database connections.
|
|
10
|
-
*/
|
|
11
|
-
export function createKyselyConnectionPool(
|
|
12
|
-
dbOrFactory: KyselyAny | (() => KyselyAny | Promise<KyselyAny>),
|
|
13
|
-
): ConnectionPool<KyselyAny> {
|
|
14
|
-
let cachedDb: KyselyAny | undefined;
|
|
15
|
-
let initPromise: Promise<KyselyAny> | undefined;
|
|
16
|
-
|
|
17
|
-
const ensureInitialized = async (): Promise<KyselyAny> => {
|
|
18
|
-
if (cachedDb) {
|
|
19
|
-
return cachedDb;
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
if (!initPromise) {
|
|
23
|
-
initPromise = (async () => {
|
|
24
|
-
const db =
|
|
25
|
-
typeof dbOrFactory === "function"
|
|
26
|
-
? await (dbOrFactory as () => KyselyAny | Promise<KyselyAny>)()
|
|
27
|
-
: dbOrFactory;
|
|
28
|
-
cachedDb = db;
|
|
29
|
-
return db;
|
|
30
|
-
})();
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
return initPromise;
|
|
34
|
-
};
|
|
35
|
-
|
|
36
|
-
// Eagerly start initialization if it's a factory function
|
|
37
|
-
if (typeof dbOrFactory === "function") {
|
|
38
|
-
void ensureInitialized();
|
|
39
|
-
} else {
|
|
40
|
-
// Direct instance - cache it immediately
|
|
41
|
-
cachedDb = dbOrFactory;
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
return {
|
|
45
|
-
async connect() {
|
|
46
|
-
const db = await ensureInitialized();
|
|
47
|
-
|
|
48
|
-
return {
|
|
49
|
-
db,
|
|
50
|
-
release: async () => {},
|
|
51
|
-
};
|
|
52
|
-
},
|
|
53
|
-
|
|
54
|
-
getDatabaseSync() {
|
|
55
|
-
if (!cachedDb) {
|
|
56
|
-
throw new Error("Cannot get database synchronously: database not initialized.");
|
|
57
|
-
}
|
|
58
|
-
return cachedDb;
|
|
59
|
-
},
|
|
60
|
-
|
|
61
|
-
async close() {
|
|
62
|
-
if (cachedDb) {
|
|
63
|
-
// Properly destroy Kysely instance to close all connections
|
|
64
|
-
await cachedDb.destroy();
|
|
65
|
-
}
|
|
66
|
-
cachedDb = undefined;
|
|
67
|
-
initPromise = undefined;
|
|
68
|
-
},
|
|
69
|
-
};
|
|
70
|
-
}
|