@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
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { createSQLSerializer } from "../../query/serialize/create-sql-serializer.js";
|
|
2
|
+
import { encodeValues } from "../../query/value-encoding.js";
|
|
3
|
+
import { processReferenceSubqueries } from "./query/where-builder.js";
|
|
4
|
+
|
|
5
|
+
//#region src/adapters/generic-sql/uow-encoder.ts
|
|
6
|
+
/**
|
|
7
|
+
* Encoder class for Unit of Work mutation operations.
|
|
8
|
+
*
|
|
9
|
+
* Handles the complete transformation from application values to database-ready values
|
|
10
|
+
* in three clear steps:
|
|
11
|
+
* 1. Resolution - Resolve FragnoId/FragnoReference objects and generate defaults
|
|
12
|
+
* 2. Reference Processing - Create subqueries for external ID lookups
|
|
13
|
+
* 3. Serialization - Apply database-specific type conversions
|
|
14
|
+
*
|
|
15
|
+
* This class mirrors the UnitOfWorkDecoder pattern for symmetry.
|
|
16
|
+
*/
|
|
17
|
+
var UnitOfWorkEncoder = class {
|
|
18
|
+
#serializer;
|
|
19
|
+
#db;
|
|
20
|
+
#mapper;
|
|
21
|
+
constructor(driverConfig, db, mapper) {
|
|
22
|
+
this.#serializer = createSQLSerializer(driverConfig);
|
|
23
|
+
this.#db = db;
|
|
24
|
+
this.#mapper = mapper;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Encode application values to database-ready format.
|
|
28
|
+
*
|
|
29
|
+
* This is the main entry point that handles all encoding steps:
|
|
30
|
+
* 1. **Resolution**: Transform ORM names to DB columns, resolve FragnoId/FragnoReference,
|
|
31
|
+
* generate defaults (CUIDs for IDs, etc.)
|
|
32
|
+
* 2. **Reference Processing**: Convert external ID strings to subqueries for internal ID lookup
|
|
33
|
+
* 3. **Serialization**: Apply database-specific conversions (Date → number for SQLite, etc.)
|
|
34
|
+
*
|
|
35
|
+
* @param options - Encoding options
|
|
36
|
+
* @param options.values - Application values to encode
|
|
37
|
+
* @param options.table - Table schema definition
|
|
38
|
+
* @param options.generateDefaults - Whether to generate default values for undefined columns
|
|
39
|
+
* @returns Database-ready values
|
|
40
|
+
*
|
|
41
|
+
* @example
|
|
42
|
+
* ```ts
|
|
43
|
+
* const encoded = encoder.encodeForDatabase({
|
|
44
|
+
* values: { userId: FragnoId(...), createdAt: new Date(), isActive: true },
|
|
45
|
+
* table: usersTable,
|
|
46
|
+
* generateDefaults: true
|
|
47
|
+
* });
|
|
48
|
+
* // For SQLite: { user_id: 456, created_at: 1705316400000, is_active: 1 }
|
|
49
|
+
* ```
|
|
50
|
+
*/
|
|
51
|
+
encodeForDatabase(options) {
|
|
52
|
+
const processed = processReferenceSubqueries(encodeValues(options.values, options.table, options.generateDefaults), this.#db, this.#mapper);
|
|
53
|
+
return this.serializeValues(processed, options.table);
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Serialize resolved values to database format.
|
|
57
|
+
*
|
|
58
|
+
* Applies database-specific type conversions:
|
|
59
|
+
* - SQLite: Date → number, boolean → 0/1, bigint → Buffer (or Number for reference columns)
|
|
60
|
+
* - PostgreSQL: Mostly pass-through (database handles types natively)
|
|
61
|
+
* - MySQL: Mostly pass-through
|
|
62
|
+
*
|
|
63
|
+
* @param values - Resolved values (after resolution and reference processing)
|
|
64
|
+
* @param table - The table schema definition
|
|
65
|
+
* @returns Serialized values ready for database driver
|
|
66
|
+
*/
|
|
67
|
+
serializeValues(values, table) {
|
|
68
|
+
const result = {};
|
|
69
|
+
for (const [dbColumnName, value] of Object.entries(values)) {
|
|
70
|
+
const col = this.findColumnByDbName(table, dbColumnName);
|
|
71
|
+
if (!col) {
|
|
72
|
+
result[dbColumnName] = value;
|
|
73
|
+
continue;
|
|
74
|
+
}
|
|
75
|
+
result[dbColumnName] = this.#serializer.serialize(value, col);
|
|
76
|
+
}
|
|
77
|
+
return result;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Find a column definition by its database column name.
|
|
81
|
+
*
|
|
82
|
+
* @param table - The table to search
|
|
83
|
+
* @param dbColumnName - The database column name (e.g., "user_id")
|
|
84
|
+
* @returns The column definition or undefined if not found
|
|
85
|
+
*/
|
|
86
|
+
findColumnByDbName(table, dbColumnName) {
|
|
87
|
+
for (const col of Object.values(table.columns)) if (col.name === dbColumnName) return col;
|
|
88
|
+
}
|
|
89
|
+
};
|
|
90
|
+
|
|
91
|
+
//#endregion
|
|
92
|
+
export { UnitOfWorkEncoder };
|
|
93
|
+
//# sourceMappingURL=uow-encoder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uow-encoder.js","names":["#serializer","#db","#mapper","result: Record<string, unknown>"],"sources":["../../../src/adapters/generic-sql/uow-encoder.ts"],"sourcesContent":["import type { AnyTable, AnyColumn } from \"../../schema/create\";\nimport type { DriverConfig } from \"./driver-config\";\nimport {\n createSQLSerializer,\n type SQLSerializer,\n} from \"../../query/serialize/create-sql-serializer\";\nimport { encodeValues } from \"../../query/value-encoding\";\nimport { processReferenceSubqueries } from \"./query/where-builder\";\nimport type { TableNameMapper } from \"../shared/table-name-mapper\";\nimport type { Kysely } from \"kysely\";\n\n/**\n * Encoder class for Unit of Work mutation operations.\n *\n * Handles the complete transformation from application values to database-ready values\n * in three clear steps:\n * 1. Resolution - Resolve FragnoId/FragnoReference objects and generate defaults\n * 2. Reference Processing - Create subqueries for external ID lookups\n * 3. Serialization - Apply database-specific type conversions\n *\n * This class mirrors the UnitOfWorkDecoder pattern for symmetry.\n */\nexport class UnitOfWorkEncoder {\n readonly #serializer: SQLSerializer;\n readonly #db: Kysely<any>; // eslint-disable-line @typescript-eslint/no-explicit-any\n readonly #mapper?: TableNameMapper;\n\n constructor(\n driverConfig: DriverConfig,\n db: Kysely<any>, // eslint-disable-line @typescript-eslint/no-explicit-any\n mapper?: TableNameMapper,\n ) {\n this.#serializer = createSQLSerializer(driverConfig);\n this.#db = db;\n this.#mapper = mapper;\n }\n\n /**\n * Encode application values to database-ready format.\n *\n * This is the main entry point that handles all encoding steps:\n * 1. **Resolution**: Transform ORM names to DB columns, resolve FragnoId/FragnoReference,\n * generate defaults (CUIDs for IDs, etc.)\n * 2. **Reference Processing**: Convert external ID strings to subqueries for internal ID lookup\n * 3. **Serialization**: Apply database-specific conversions (Date → number for SQLite, etc.)\n *\n * @param options - Encoding options\n * @param options.values - Application values to encode\n * @param options.table - Table schema definition\n * @param options.generateDefaults - Whether to generate default values for undefined columns\n * @returns Database-ready values\n *\n * @example\n * ```ts\n * const encoded = encoder.encodeForDatabase({\n * values: { userId: FragnoId(...), createdAt: new Date(), isActive: true },\n * table: usersTable,\n * generateDefaults: true\n * });\n * // For SQLite: { user_id: 456, created_at: 1705316400000, is_active: 1 }\n * ```\n */\n encodeForDatabase(options: {\n values: Record<string, unknown>;\n table: AnyTable;\n generateDefaults: boolean;\n }): Record<string, unknown> {\n // Step 1: Resolution - Resolve FragnoId/FragnoReference and generate defaults\n const resolved = encodeValues(options.values, options.table, options.generateDefaults);\n\n // Step 2: Reference Processing - Convert external IDs to subqueries\n const processed = processReferenceSubqueries(resolved, this.#db, this.#mapper);\n\n // Step 3: Serialization - Apply database-specific type conversions\n const serialized = this.serializeValues(processed, options.table);\n\n return serialized;\n }\n\n /**\n * Serialize resolved values to database format.\n *\n * Applies database-specific type conversions:\n * - SQLite: Date → number, boolean → 0/1, bigint → Buffer (or Number for reference columns)\n * - PostgreSQL: Mostly pass-through (database handles types natively)\n * - MySQL: Mostly pass-through\n *\n * @param values - Resolved values (after resolution and reference processing)\n * @param table - The table schema definition\n * @returns Serialized values ready for database driver\n */\n private serializeValues(\n values: Record<string, unknown>,\n table: AnyTable,\n ): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n\n for (const [dbColumnName, value] of Object.entries(values)) {\n // Find the column definition by database column name\n const col = this.findColumnByDbName(table, dbColumnName);\n\n if (!col) {\n // Not a regular column (might be a special value like sql.raw())\n // Pass through as-is\n result[dbColumnName] = value;\n continue;\n }\n\n // Serialize the value using the column definition and database type\n result[dbColumnName] = this.#serializer.serialize(value, col);\n }\n\n return result;\n }\n\n /**\n * Find a column definition by its database column name.\n *\n * @param table - The table to search\n * @param dbColumnName - The database column name (e.g., \"user_id\")\n * @returns The column definition or undefined if not found\n */\n private findColumnByDbName(table: AnyTable, dbColumnName: string): AnyColumn | undefined {\n for (const col of Object.values(table.columns)) {\n if (col.name === dbColumnName) {\n return col;\n }\n }\n return undefined;\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;AAsBA,IAAa,oBAAb,MAA+B;CAC7B,CAASA;CACT,CAASC;CACT,CAASC;CAET,YACE,cACA,IACA,QACA;AACA,QAAKF,aAAc,oBAAoB,aAAa;AACpD,QAAKC,KAAM;AACX,QAAKC,SAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4BjB,kBAAkB,SAIU;EAK1B,MAAM,YAAY,2BAHD,aAAa,QAAQ,QAAQ,QAAQ,OAAO,QAAQ,iBAAiB,EAG/B,MAAKD,IAAK,MAAKC,OAAQ;AAK9E,SAFmB,KAAK,gBAAgB,WAAW,QAAQ,MAAM;;;;;;;;;;;;;;CAiBnE,AAAQ,gBACN,QACA,OACyB;EACzB,MAAMC,SAAkC,EAAE;AAE1C,OAAK,MAAM,CAAC,cAAc,UAAU,OAAO,QAAQ,OAAO,EAAE;GAE1D,MAAM,MAAM,KAAK,mBAAmB,OAAO,aAAa;AAExD,OAAI,CAAC,KAAK;AAGR,WAAO,gBAAgB;AACvB;;AAIF,UAAO,gBAAgB,MAAKH,WAAY,UAAU,OAAO,IAAI;;AAG/D,SAAO;;;;;;;;;CAUT,AAAQ,mBAAmB,OAAiB,cAA6C;AACvF,OAAK,MAAM,OAAO,OAAO,OAAO,MAAM,QAAQ,CAC5C,KAAI,IAAI,SAAS,aACf,QAAO"}
|
|
@@ -1,10 +1,7 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { TableNameMapper } from "../shared/table-name-mapper.js";
|
|
2
|
+
import { DatabaseAdapter } from "../adapters.js";
|
|
3
|
+
import { GenericSQLAdapter, GenericSQLOptions, UnitOfWorkConfig } from "../generic-sql/generic-sql-adapter.js";
|
|
3
4
|
import { SQLProvider } from "../../shared/providers.js";
|
|
4
|
-
import { AbstractQuery } from "../../query/query.js";
|
|
5
|
-
import { DatabaseAdapter, fragnoDatabaseAdapterNameFakeSymbol, fragnoDatabaseAdapterVersionFakeSymbol } from "../adapters.js";
|
|
6
|
-
import { TableNameMapper } from "./kysely-shared.js";
|
|
7
|
-
import { KyselyUOWConfig } from "./kysely-query.js";
|
|
8
5
|
import { Kysely } from "kysely";
|
|
9
6
|
|
|
10
7
|
//#region src/adapters/kysely/kysely-adapter.d.ts
|
|
@@ -13,17 +10,9 @@ interface KyselyConfig {
|
|
|
13
10
|
db: KyselyAny | (() => KyselyAny | Promise<KyselyAny>);
|
|
14
11
|
provider: SQLProvider;
|
|
15
12
|
}
|
|
16
|
-
declare class KyselyAdapter implements DatabaseAdapter<
|
|
17
|
-
|
|
18
|
-
constructor(config: KyselyConfig);
|
|
19
|
-
get [fragnoDatabaseAdapterNameFakeSymbol](): string;
|
|
20
|
-
get [fragnoDatabaseAdapterVersionFakeSymbol](): number;
|
|
21
|
-
close(): Promise<void>;
|
|
13
|
+
declare class KyselyAdapter extends GenericSQLAdapter implements DatabaseAdapter<UnitOfWorkConfig> {
|
|
14
|
+
constructor(options: GenericSQLOptions);
|
|
22
15
|
createTableNameMapper(namespace: string): TableNameMapper;
|
|
23
|
-
createQueryEngine<T extends AnySchema>(schema: T, namespace: string): AbstractQuery<T, KyselyUOWConfig>;
|
|
24
|
-
isConnectionHealthy(): Promise<boolean>;
|
|
25
|
-
createMigrationEngine(schema: AnySchema, namespace: string): Migrator;
|
|
26
|
-
getSchemaVersion(namespace: string): Promise<string | undefined>;
|
|
27
16
|
}
|
|
28
17
|
//#endregion
|
|
29
18
|
export { KyselyAdapter, KyselyConfig };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"kysely-adapter.d.ts","names":[],"sources":["../../../src/adapters/kysely/kysely-adapter.ts"],"sourcesContent":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"kysely-adapter.d.ts","names":[],"sources":["../../../src/adapters/kysely/kysely-adapter.ts"],"sourcesContent":[],"mappings":";;;;;;;KAWK,SAAA,GAAY;UAEA,YAAA;MACX,mBAAmB,YAAY,QAAQ;EAHxC,QAAA,EAIO,WAJE;AAEd;AACM,cAIO,aAAA,SAAsB,iBAAA,YAA6B,eAJ1D,CAI0E,gBAJ1E,CAAA,CAAA;EAAmB,WAAA,CAAA,OAAA,EAKF,iBALE;EAAoB,qBAAA,CAAA,SAAA,EAAA,MAAA,CAAA,EAKL,eALK"}
|
|
@@ -1,169 +1,16 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import
|
|
4
|
-
import { execute, preprocessOperations } from "./migration/execute.js";
|
|
5
|
-
import { createTableNameMapper } from "./kysely-shared.js";
|
|
6
|
-
import { fromKysely } from "./kysely-query.js";
|
|
7
|
-
import { createKyselyConnectionPool } from "./kysely-connection-pool.js";
|
|
8
|
-
import { sql } from "kysely";
|
|
9
|
-
import { createHash } from "node:crypto";
|
|
1
|
+
import { createTableNameMapper } from "../shared/table-name-mapper.js";
|
|
2
|
+
import { GenericSQLAdapter } from "../generic-sql/generic-sql-adapter.js";
|
|
3
|
+
import "kysely";
|
|
10
4
|
|
|
11
5
|
//#region src/adapters/kysely/kysely-adapter.ts
|
|
12
|
-
var KyselyAdapter = class {
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
#schemaNamespaceMap = /* @__PURE__ */ new WeakMap();
|
|
16
|
-
constructor(config) {
|
|
17
|
-
this.#connectionPool = createKyselyConnectionPool(config.db);
|
|
18
|
-
this.#provider = config.provider;
|
|
19
|
-
}
|
|
20
|
-
get [fragnoDatabaseAdapterNameFakeSymbol]() {
|
|
21
|
-
return "kysely";
|
|
22
|
-
}
|
|
23
|
-
get [fragnoDatabaseAdapterVersionFakeSymbol]() {
|
|
24
|
-
return 0;
|
|
25
|
-
}
|
|
26
|
-
async close() {
|
|
27
|
-
await this.#connectionPool.close();
|
|
6
|
+
var KyselyAdapter = class extends GenericSQLAdapter {
|
|
7
|
+
constructor(options) {
|
|
8
|
+
super(options);
|
|
28
9
|
}
|
|
29
10
|
createTableNameMapper(namespace) {
|
|
30
11
|
return createTableNameMapper(namespace);
|
|
31
12
|
}
|
|
32
|
-
createQueryEngine(schema, namespace) {
|
|
33
|
-
this.#schemaNamespaceMap.set(schema, namespace);
|
|
34
|
-
const mapper = namespace ? createTableNameMapper(namespace) : void 0;
|
|
35
|
-
return fromKysely(schema, this.#connectionPool, this.#provider, mapper, void 0, this.#schemaNamespaceMap);
|
|
36
|
-
}
|
|
37
|
-
async isConnectionHealthy() {
|
|
38
|
-
const conn = await this.#connectionPool.connect();
|
|
39
|
-
try {
|
|
40
|
-
return (await conn.db.executeQuery(sql`SELECT 1 as healthy`.compile(conn.db))).rows[0]["healthy"] === 1;
|
|
41
|
-
} catch {
|
|
42
|
-
return false;
|
|
43
|
-
} finally {
|
|
44
|
-
await conn.release();
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
createMigrationEngine(schema, namespace) {
|
|
48
|
-
const mapper = namespace ? createTableNameMapper(namespace) : void 0;
|
|
49
|
-
const preprocessMigrationOperations = (operations, db) => {
|
|
50
|
-
let preprocessed = preprocessOperations(operations, {
|
|
51
|
-
db,
|
|
52
|
-
provider: this.#provider
|
|
53
|
-
});
|
|
54
|
-
if (this.#provider === "mysql") {
|
|
55
|
-
preprocessed.unshift({
|
|
56
|
-
type: "custom",
|
|
57
|
-
sql: "SET FOREIGN_KEY_CHECKS = 0"
|
|
58
|
-
});
|
|
59
|
-
preprocessed.push({
|
|
60
|
-
type: "custom",
|
|
61
|
-
sql: "SET FOREIGN_KEY_CHECKS = 1"
|
|
62
|
-
});
|
|
63
|
-
}
|
|
64
|
-
return preprocessed;
|
|
65
|
-
};
|
|
66
|
-
const toExecutableNodes = (operations, db) => {
|
|
67
|
-
const onCustomNode = (node, db$1) => {
|
|
68
|
-
const statement = sql.raw(node["sql"]);
|
|
69
|
-
return {
|
|
70
|
-
compile() {
|
|
71
|
-
return statement.compile(db$1);
|
|
72
|
-
},
|
|
73
|
-
execute() {
|
|
74
|
-
return statement.execute(db$1);
|
|
75
|
-
}
|
|
76
|
-
};
|
|
77
|
-
};
|
|
78
|
-
const config = {
|
|
79
|
-
db,
|
|
80
|
-
provider: this.#provider
|
|
81
|
-
};
|
|
82
|
-
return operations.flatMap((op) => execute(op, config, (node) => onCustomNode(node, db), mapper));
|
|
83
|
-
};
|
|
84
|
-
return createMigrator({
|
|
85
|
-
schema,
|
|
86
|
-
executor: async (operations) => {
|
|
87
|
-
const conn = await this.#connectionPool.connect();
|
|
88
|
-
try {
|
|
89
|
-
if (this.#provider === "sqlite") await sql.raw("PRAGMA defer_foreign_keys = ON").execute(conn.db);
|
|
90
|
-
await conn.db.transaction().execute(async (tx) => {
|
|
91
|
-
const nodes = toExecutableNodes(preprocessMigrationOperations(operations, tx), tx);
|
|
92
|
-
for (const node of nodes) try {
|
|
93
|
-
await node.execute();
|
|
94
|
-
} catch (e) {
|
|
95
|
-
console.error("failed at", node.compile(), e);
|
|
96
|
-
throw e;
|
|
97
|
-
}
|
|
98
|
-
});
|
|
99
|
-
} finally {
|
|
100
|
-
await conn.release();
|
|
101
|
-
}
|
|
102
|
-
},
|
|
103
|
-
sql: { toSql: (operations) => {
|
|
104
|
-
const parts = [];
|
|
105
|
-
if (this.#provider === "sqlite") parts.push("PRAGMA defer_foreign_keys = ON;");
|
|
106
|
-
const db = this.#connectionPool.getDatabaseSync();
|
|
107
|
-
const compiled = toExecutableNodes(preprocessMigrationOperations(operations, db), db).map((node) => `${node.compile().sql};`);
|
|
108
|
-
parts.push(...compiled);
|
|
109
|
-
return parts.join("\n\n");
|
|
110
|
-
} },
|
|
111
|
-
settings: {
|
|
112
|
-
getVersion: async () => {
|
|
113
|
-
const conn = await this.#connectionPool.connect();
|
|
114
|
-
try {
|
|
115
|
-
const v = await createSettingsManager(conn.db, namespace).get(`schema_version`);
|
|
116
|
-
return v ? parseInt(v) : 0;
|
|
117
|
-
} finally {
|
|
118
|
-
await conn.release();
|
|
119
|
-
}
|
|
120
|
-
},
|
|
121
|
-
updateSettingsInMigration: async (fromVersion, toVersion) => {
|
|
122
|
-
const conn = await this.#connectionPool.connect();
|
|
123
|
-
try {
|
|
124
|
-
const manager = createSettingsManager(conn.db, namespace);
|
|
125
|
-
return [{
|
|
126
|
-
type: "custom",
|
|
127
|
-
sql: fromVersion === 0 ? manager.insert(`schema_version`, toVersion.toString()) : manager.update(`schema_version`, toVersion.toString())
|
|
128
|
-
}];
|
|
129
|
-
} finally {
|
|
130
|
-
await conn.release();
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
}
|
|
134
|
-
});
|
|
135
|
-
}
|
|
136
|
-
async getSchemaVersion(namespace) {
|
|
137
|
-
const conn = await this.#connectionPool.connect();
|
|
138
|
-
try {
|
|
139
|
-
return await createSettingsManager(conn.db, namespace).get(`schema_version`);
|
|
140
|
-
} finally {
|
|
141
|
-
await conn.release();
|
|
142
|
-
}
|
|
143
|
-
}
|
|
144
13
|
};
|
|
145
|
-
function createSettingsManager(db, namespace) {
|
|
146
|
-
const tableName = SETTINGS_TABLE_NAME;
|
|
147
|
-
return {
|
|
148
|
-
async get(key) {
|
|
149
|
-
try {
|
|
150
|
-
return (await db.selectFrom(tableName).where("key", "=", sql.lit(`${namespace}.${key}`)).select(["value"]).executeTakeFirstOrThrow()).value;
|
|
151
|
-
} catch {
|
|
152
|
-
return;
|
|
153
|
-
}
|
|
154
|
-
},
|
|
155
|
-
insert(key, value) {
|
|
156
|
-
return db.insertInto(tableName).values({
|
|
157
|
-
id: sql.lit(createHash("md5").update(`${namespace}.${key}`).digest("base64url").replace(/=/g, "")),
|
|
158
|
-
key: sql.lit(`${namespace}.${key}`),
|
|
159
|
-
value: sql.lit(value)
|
|
160
|
-
}).compile().sql;
|
|
161
|
-
},
|
|
162
|
-
update(key, value) {
|
|
163
|
-
return db.updateTable(tableName).set({ value: sql.lit(value) }).where("key", "=", sql.lit(`${namespace}.${key}`)).compile().sql;
|
|
164
|
-
}
|
|
165
|
-
};
|
|
166
|
-
}
|
|
167
14
|
|
|
168
15
|
//#endregion
|
|
169
16
|
export { KyselyAdapter };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"kysely-adapter.js","names":["#connectionPool","#provider","#schemaNamespaceMap","db","config: KyselyConfig","parts: string[]"],"sources":["../../../src/adapters/kysely/kysely-adapter.ts"],"sourcesContent":["import { sql, type Kysely } from \"kysely\";\nimport type { SQLProvider } from \"../../shared/providers\";\nimport {\n fragnoDatabaseAdapterNameFakeSymbol,\n fragnoDatabaseAdapterVersionFakeSymbol,\n type DatabaseAdapter,\n} from \"../adapters\";\nimport { createMigrator, type Migrator } from \"../../migration-engine/create\";\nimport type { AnySchema } from \"../../schema/create\";\nimport type { CustomOperation, MigrationOperation } from \"../../migration-engine/shared\";\nimport { execute, preprocessOperations } from \"./migration/execute\";\nimport type { AbstractQuery } from \"../../query/query\";\nimport { fromKysely, type KyselyUOWConfig } from \"./kysely-query\";\nimport { createTableNameMapper } from \"./kysely-shared\";\nimport { createHash } from \"node:crypto\";\nimport { SETTINGS_TABLE_NAME } from \"../../shared/settings-schema\";\nimport type { ConnectionPool } from \"../../shared/connection-pool\";\nimport { createKyselyConnectionPool } from \"./kysely-connection-pool\";\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype KyselyAny = Kysely<any>;\n\nexport interface KyselyConfig {\n db: KyselyAny | (() => KyselyAny | Promise<KyselyAny>);\n provider: SQLProvider;\n}\n\nexport class KyselyAdapter implements DatabaseAdapter<KyselyUOWConfig> {\n #connectionPool: ConnectionPool<KyselyAny>;\n #provider: SQLProvider;\n #schemaNamespaceMap = new WeakMap<AnySchema, string>();\n\n constructor(config: KyselyConfig) {\n this.#connectionPool = createKyselyConnectionPool(config.db);\n this.#provider = config.provider;\n }\n\n get [fragnoDatabaseAdapterNameFakeSymbol](): string {\n return \"kysely\";\n }\n\n get [fragnoDatabaseAdapterVersionFakeSymbol](): number {\n return 0;\n }\n\n async close(): Promise<void> {\n await this.#connectionPool.close();\n }\n\n createTableNameMapper(namespace: string) {\n return createTableNameMapper(namespace);\n }\n\n createQueryEngine<T extends AnySchema>(\n schema: T,\n namespace: string,\n ): AbstractQuery<T, KyselyUOWConfig> {\n // Register schema-namespace mapping\n this.#schemaNamespaceMap.set(schema, namespace);\n\n // Only create mapper if namespace is non-empty\n const mapper = namespace ? createTableNameMapper(namespace) : undefined;\n return fromKysely(\n schema,\n this.#connectionPool,\n this.#provider,\n mapper,\n undefined,\n this.#schemaNamespaceMap,\n );\n }\n\n async isConnectionHealthy(): Promise<boolean> {\n const conn = await this.#connectionPool.connect();\n try {\n const result = await conn.db.executeQuery(sql`SELECT 1 as healthy`.compile(conn.db));\n return (result.rows[0] as Record<string, unknown>)[\"healthy\"] === 1;\n } catch {\n return false;\n } finally {\n await conn.release();\n }\n }\n\n createMigrationEngine(schema: AnySchema, namespace: string): Migrator {\n const mapper = namespace ? createTableNameMapper(namespace) : undefined;\n\n const preprocessMigrationOperations = (operations: MigrationOperation[], db: KyselyAny) => {\n // Preprocess operations using the provided db instance\n const config: KyselyConfig = {\n db,\n provider: this.#provider,\n };\n let preprocessed = preprocessOperations(operations, config);\n\n if (this.#provider === \"mysql\") {\n preprocessed.unshift({ type: \"custom\", sql: \"SET FOREIGN_KEY_CHECKS = 0\" });\n preprocessed.push({ type: \"custom\", sql: \"SET FOREIGN_KEY_CHECKS = 1\" });\n }\n\n return preprocessed;\n };\n\n // Convert operations to executable nodes bound to specific db instance\n const toExecutableNodes = (operations: MigrationOperation[], db: KyselyAny) => {\n const onCustomNode = (node: CustomOperation, db: KyselyAny) => {\n const statement = sql.raw(node[\"sql\"] as string);\n\n return {\n compile() {\n return statement.compile(db);\n },\n execute() {\n return statement.execute(db);\n },\n };\n };\n\n const config: KyselyConfig = { db, provider: this.#provider };\n return operations.flatMap((op) =>\n execute(op, config, (node) => onCustomNode(node, db), mapper),\n );\n };\n\n const migrator = createMigrator({\n schema,\n executor: async (operations) => {\n const conn = await this.#connectionPool.connect();\n try {\n // For SQLite, execute PRAGMA defer_foreign_keys BEFORE transaction\n if (this.#provider === \"sqlite\") {\n await sql.raw(\"PRAGMA defer_foreign_keys = ON\").execute(conn.db);\n }\n\n await conn.db.transaction().execute(async (tx) => {\n // Use the transaction instance for both preprocessing and execution\n const preprocessed = preprocessMigrationOperations(operations, tx);\n const nodes = toExecutableNodes(preprocessed, tx);\n for (const node of nodes) {\n try {\n await node.execute();\n } catch (e) {\n console.error(\"failed at\", node.compile(), e);\n throw e;\n }\n }\n });\n } finally {\n await conn.release();\n }\n },\n sql: {\n toSql: (operations) => {\n const parts: string[] = [];\n\n // Add SQLite PRAGMA at the beginning\n if (this.#provider === \"sqlite\") {\n parts.push(\"PRAGMA defer_foreign_keys = ON;\");\n }\n\n // Use getDatabaseSync for SQL generation (doesn't execute, just builds SQL strings)\n const db = this.#connectionPool.getDatabaseSync();\n const preprocessed = preprocessMigrationOperations(operations, db);\n const nodes = toExecutableNodes(preprocessed, db);\n const compiled = nodes.map((node) => `${node.compile().sql};`);\n\n parts.push(...compiled);\n\n return parts.join(\"\\n\\n\");\n },\n },\n\n settings: {\n getVersion: async () => {\n const conn = await this.#connectionPool.connect();\n try {\n const manager = createSettingsManager(conn.db, namespace);\n const v = await manager.get(`schema_version`);\n return v ? parseInt(v) : 0;\n } finally {\n await conn.release();\n }\n },\n updateSettingsInMigration: async (fromVersion, toVersion) => {\n const conn = await this.#connectionPool.connect();\n try {\n const manager = createSettingsManager(conn.db, namespace);\n return [\n {\n type: \"custom\",\n sql:\n fromVersion === 0\n ? manager.insert(`schema_version`, toVersion.toString())\n : manager.update(`schema_version`, toVersion.toString()),\n },\n ];\n } finally {\n await conn.release();\n }\n },\n },\n });\n\n return migrator;\n }\n\n async getSchemaVersion(namespace: string): Promise<string | undefined> {\n const conn = await this.#connectionPool.connect();\n try {\n const manager = createSettingsManager(conn.db, namespace);\n return await manager.get(`schema_version`);\n } finally {\n await conn.release();\n }\n }\n}\n\nfunction createSettingsManager(db: KyselyAny, namespace: string) {\n // Settings table is never namespaced, but keys include namespace prefix\n const tableName = SETTINGS_TABLE_NAME;\n\n return {\n async get(key: string): Promise<string | undefined> {\n try {\n const result = await db\n .selectFrom(tableName)\n .where(\"key\", \"=\", sql.lit(`${namespace}.${key}`))\n .select([\"value\"])\n .executeTakeFirstOrThrow();\n return result.value as string;\n } catch {\n return;\n }\n },\n\n insert(key: string, value: string) {\n return db\n .insertInto(tableName)\n .values({\n id: sql.lit(\n createHash(\"md5\").update(`${namespace}.${key}`).digest(\"base64url\").replace(/=/g, \"\"),\n ),\n key: sql.lit(`${namespace}.${key}`),\n value: sql.lit(value),\n })\n .compile().sql;\n },\n\n update(key: string, value: string) {\n return db\n .updateTable(tableName)\n .set({\n value: sql.lit(value),\n })\n .where(\"key\", \"=\", sql.lit(`${namespace}.${key}`))\n .compile().sql;\n },\n };\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"kysely-adapter.js","names":[],"sources":["../../../src/adapters/kysely/kysely-adapter.ts"],"sourcesContent":["import { type Kysely } from \"kysely\";\nimport type { SQLProvider } from \"../../shared/providers\";\nimport { type DatabaseAdapter } from \"../adapters\";\nimport { createTableNameMapper } from \"../shared/table-name-mapper\";\nimport {\n GenericSQLAdapter,\n type GenericSQLOptions,\n type UnitOfWorkConfig,\n} from \"../generic-sql/generic-sql-adapter\";\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype KyselyAny = Kysely<any>;\n\nexport interface KyselyConfig {\n db: KyselyAny | (() => KyselyAny | Promise<KyselyAny>);\n provider: SQLProvider;\n}\n\nexport class KyselyAdapter extends GenericSQLAdapter implements DatabaseAdapter<UnitOfWorkConfig> {\n constructor(options: GenericSQLOptions) {\n super(options);\n }\n\n createTableNameMapper(namespace: string) {\n return createTableNameMapper(namespace);\n }\n}\n"],"mappings":";;;;;AAkBA,IAAa,gBAAb,cAAmC,kBAA+D;CAChG,YAAY,SAA4B;AACtC,QAAM,QAAQ;;CAGhB,sBAAsB,WAAmB;AACvC,SAAO,sBAAsB,UAAU"}
|
|
@@ -1,13 +1,18 @@
|
|
|
1
|
-
import { UnitOfWork } from "../../query/unit-of-work.js";
|
|
2
|
-
import { parseDrizzle } from "./shared.js";
|
|
3
|
-
import { createDrizzleUOWCompiler } from "./drizzle-uow-compiler.js";
|
|
4
|
-
import { executeDrizzleMutationPhase, executeDrizzleRetrievalPhase } from "./drizzle-uow-executor.js";
|
|
5
|
-
import { createDrizzleUOWDecoder } from "./drizzle-uow-decoder.js";
|
|
1
|
+
import { UnitOfWork } from "../../query/unit-of-work/unit-of-work.js";
|
|
6
2
|
|
|
7
|
-
//#region src/adapters/
|
|
3
|
+
//#region src/adapters/shared/from-unit-of-work-compiler.ts
|
|
8
4
|
/**
|
|
9
|
-
*
|
|
5
|
+
* Type guard to check if a query is a CompiledMutation
|
|
10
6
|
*/
|
|
7
|
+
function isCompiledMutation(query) {
|
|
8
|
+
return query !== null && typeof query === "object" && "expectedAffectedRows" in query && "query" in query;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Type guard to check if a record has an id field
|
|
12
|
+
*/
|
|
13
|
+
function hasIdField(record) {
|
|
14
|
+
return record !== null && typeof record === "object" && "id" in record;
|
|
15
|
+
}
|
|
11
16
|
var UpdateManySpecialBuilder = class {
|
|
12
17
|
#indexName;
|
|
13
18
|
#condition;
|
|
@@ -30,73 +35,48 @@ var UpdateManySpecialBuilder = class {
|
|
|
30
35
|
}
|
|
31
36
|
};
|
|
32
37
|
/**
|
|
33
|
-
* Creates a
|
|
38
|
+
* Creates a generic SQL-based query engine for the given schema using a UnitOfWorkFactory.
|
|
34
39
|
*
|
|
35
|
-
* This is the main entry point for creating a database query interface using
|
|
40
|
+
* This is the main entry point for creating a database query interface using a Unit of Work compiler.
|
|
36
41
|
* It uses a compiler-based architecture where queries are compiled to SQL and then executed,
|
|
37
42
|
* enabling features like SQL snapshot testing.
|
|
38
43
|
*
|
|
39
44
|
* @param schema - The database schema definition
|
|
40
|
-
* @param
|
|
41
|
-
* @
|
|
42
|
-
* @param mapper - Optional table name mapper for namespace prefixing
|
|
43
|
-
* @param uowConfig - Optional UOW configuration
|
|
44
|
-
* @param schemaNamespaceMap - Optional WeakMap for schema-to-namespace lookups
|
|
45
|
-
* @returns An AbstractQuery instance for performing database operations
|
|
45
|
+
* @param factory - Factory containing compiler, executor, decoder, and optional configuration
|
|
46
|
+
* @returns An SimpleQueryInterface instance for performing database operations
|
|
46
47
|
*
|
|
47
48
|
* @example
|
|
48
49
|
* ```ts
|
|
49
|
-
* const
|
|
50
|
-
* const
|
|
50
|
+
* const operationCompiler = new GenericSQLUOWOperationCompiler(driverConfig);
|
|
51
|
+
* const factory: UnitOfWorkFactory = {
|
|
52
|
+
* compiler: createUOWCompilerFromOperationCompiler(operationCompiler),
|
|
53
|
+
* executor: createExecutor(sqlDriver),
|
|
54
|
+
* decoder: createKyselyUOWDecoder(driverConfig.databaseType),
|
|
55
|
+
* };
|
|
56
|
+
* const queryEngine = fromUnitOfWorkCompiler(mySchema, factory);
|
|
51
57
|
*
|
|
52
|
-
* const
|
|
58
|
+
* const users = await queryEngine.find('users', (b) =>
|
|
59
|
+
* b.whereIndex('age').where((eb) => eb('age', '>', 18))
|
|
60
|
+
* );
|
|
53
61
|
* ```
|
|
54
62
|
*/
|
|
55
|
-
function
|
|
63
|
+
function fromUnitOfWorkCompiler(schema, factory) {
|
|
64
|
+
const { compiler, executor, decoder, uowConfig, schemaNamespaceMap } = factory;
|
|
56
65
|
function createUOW(opts) {
|
|
57
|
-
const uowCompiler = createDrizzleUOWCompiler(pool, provider, mapper);
|
|
58
|
-
const executor = {
|
|
59
|
-
async executeRetrievalPhase(retrievalBatch) {
|
|
60
|
-
if (opts.config?.dryRun) return retrievalBatch.map(() => ({
|
|
61
|
-
rows: [],
|
|
62
|
-
affectedRows: 0
|
|
63
|
-
}));
|
|
64
|
-
const conn = await pool.connect();
|
|
65
|
-
try {
|
|
66
|
-
const db = parseDrizzle(conn.db)[0];
|
|
67
|
-
return await executeDrizzleRetrievalPhase(db, retrievalBatch, provider);
|
|
68
|
-
} finally {
|
|
69
|
-
await conn.release();
|
|
70
|
-
}
|
|
71
|
-
},
|
|
72
|
-
async executeMutationPhase(mutationBatch) {
|
|
73
|
-
if (opts.config?.dryRun) return {
|
|
74
|
-
success: true,
|
|
75
|
-
createdInternalIds: mutationBatch.map(() => null)
|
|
76
|
-
};
|
|
77
|
-
const conn = await pool.connect();
|
|
78
|
-
try {
|
|
79
|
-
const db = parseDrizzle(conn.db)[0];
|
|
80
|
-
return await executeDrizzleMutationPhase(db, mutationBatch, provider);
|
|
81
|
-
} finally {
|
|
82
|
-
await conn.release();
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
};
|
|
86
|
-
const decoder = createDrizzleUOWDecoder(provider);
|
|
87
66
|
const { onQuery,...restUowConfig } = opts.config ?? {};
|
|
88
|
-
return new UnitOfWork(
|
|
67
|
+
return new UnitOfWork(compiler, executor, decoder, opts.name, {
|
|
89
68
|
...restUowConfig,
|
|
90
|
-
onQuery: (query) => {
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
}, schemaNamespaceMap);
|
|
69
|
+
onQuery: onQuery ? (query) => {
|
|
70
|
+
onQuery(isCompiledMutation(query) ? query.query : query);
|
|
71
|
+
} : void 0
|
|
72
|
+
}, schemaNamespaceMap).forSchema(schema);
|
|
95
73
|
}
|
|
96
74
|
return {
|
|
97
75
|
async find(tableName, builderFn) {
|
|
98
|
-
const
|
|
99
|
-
|
|
76
|
+
const uow = createUOW({ config: uowConfig });
|
|
77
|
+
uow.find(tableName, builderFn);
|
|
78
|
+
const [result] = await uow.executeRetrieve();
|
|
79
|
+
return result ?? [];
|
|
100
80
|
},
|
|
101
81
|
async findWithCursor(tableName, builderFn) {
|
|
102
82
|
const [result] = await createUOW({ config: uowConfig }).findWithCursor(tableName, builderFn).executeRetrieve();
|
|
@@ -143,13 +123,16 @@ function fromDrizzle(schema, pool, provider, mapper, uowConfig, schemaNamespaceM
|
|
|
143
123
|
if (!setValues) throw new Error("set() must be called in updateMany");
|
|
144
124
|
const findUow = createUOW({ config: uowConfig });
|
|
145
125
|
findUow.find(tableName, (b) => {
|
|
146
|
-
if (condition) return b.whereIndex(indexName, condition);
|
|
126
|
+
if (condition !== void 0 && condition !== null) return b.whereIndex(indexName, condition);
|
|
147
127
|
return b.whereIndex(indexName);
|
|
148
128
|
});
|
|
149
129
|
const [records] = await findUow.executeRetrieve();
|
|
150
130
|
if (!records || records.length === 0) return;
|
|
151
131
|
const updateUow = createUOW({ config: uowConfig });
|
|
152
|
-
for (const record of records)
|
|
132
|
+
for (const record of records) {
|
|
133
|
+
if (!hasIdField(record)) throw new Error("Record missing id field");
|
|
134
|
+
updateUow.update(tableName, record.id, (b) => b.set(setValues));
|
|
135
|
+
}
|
|
153
136
|
const { success } = await updateUow.executeMutations();
|
|
154
137
|
if (!success) throw new Error("Failed to update records (version conflict)");
|
|
155
138
|
},
|
|
@@ -165,7 +148,10 @@ function fromDrizzle(schema, pool, provider, mapper, uowConfig, schemaNamespaceM
|
|
|
165
148
|
const [records] = await findUow.executeRetrieve();
|
|
166
149
|
if (!records || records.length === 0) return;
|
|
167
150
|
const deleteUow = createUOW({ config: uowConfig });
|
|
168
|
-
for (const record of records)
|
|
151
|
+
for (const record of records) {
|
|
152
|
+
if (!hasIdField(record)) throw new Error("Record missing id field");
|
|
153
|
+
deleteUow.delete(tableName, record.id);
|
|
154
|
+
}
|
|
169
155
|
const { success } = await deleteUow.executeMutations();
|
|
170
156
|
if (!success) throw new Error("Failed to delete records (version conflict)");
|
|
171
157
|
},
|
|
@@ -182,5 +168,5 @@ function fromDrizzle(schema, pool, provider, mapper, uowConfig, schemaNamespaceM
|
|
|
182
168
|
}
|
|
183
169
|
|
|
184
170
|
//#endregion
|
|
185
|
-
export {
|
|
186
|
-
//# sourceMappingURL=
|
|
171
|
+
export { fromUnitOfWorkCompiler };
|
|
172
|
+
//# sourceMappingURL=from-unit-of-work-compiler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"from-unit-of-work-compiler.js","names":["#indexName","#condition","#setValues"],"sources":["../../../src/adapters/shared/from-unit-of-work-compiler.ts"],"sourcesContent":["import type { SimpleQueryInterface, TableToUpdateValues } from \"../../query/simple-query-interface\";\nimport type { AnySchema, AnyTable, FragnoId } from \"../../schema/create\";\nimport type {\n CompiledMutation,\n UOWCompiler,\n UOWDecoder,\n UOWExecutor,\n ValidIndexName,\n} from \"../../query/unit-of-work/unit-of-work\";\nimport { UnitOfWork } from \"../../query/unit-of-work/unit-of-work\";\nimport type { CursorResult } from \"../../query/cursor\";\nimport type { CompiledQuery } from \"../../sql-driver/sql-driver\";\n\n/**\n * Configuration options for creating a Unit of Work with generic SQL\n */\nexport interface UnitOfWorkConfig {\n /**\n * Optional callback to receive compiled SQL queries for logging/debugging\n * This callback is invoked for each query as it's compiled\n */\n onQuery?: (query: CompiledQuery) => void;\n /**\n * If true, the query will not be executed and the query will be returned. Not respected for UOWs\n * since those have to be manually executed.\n */\n dryRun?: boolean;\n}\n\n/**\n * Factory interface for creating Unit of Work instances\n */\nexport interface UnitOfWorkFactory {\n /**\n * UOW compiler for compiling operations to SQL\n */\n compiler: UOWCompiler<CompiledQuery>;\n /**\n * UOW executor for running compiled queries\n */\n executor: UOWExecutor<CompiledQuery, unknown>;\n /**\n * UOW decoder for transforming raw results\n */\n decoder: UOWDecoder<unknown>;\n /**\n * Optional UOW configuration\n */\n uowConfig?: UnitOfWorkConfig;\n /**\n * Optional WeakMap for schema-to-namespace lookups\n */\n schemaNamespaceMap?: WeakMap<AnySchema, string>;\n}\n\n/**\n * Type guard to check if a query is a CompiledMutation\n */\nfunction isCompiledMutation(query: unknown): query is CompiledMutation<CompiledQuery> {\n return (\n query !== null &&\n typeof query === \"object\" &&\n \"expectedAffectedRows\" in query &&\n \"query\" in query\n );\n}\n\n/**\n * Type guard to check if a record has an id field\n */\nfunction hasIdField(record: unknown): record is { id: string | FragnoId } {\n return record !== null && typeof record === \"object\" && \"id\" in record;\n}\n\nclass UpdateManySpecialBuilder<TTable extends AnyTable> {\n #indexName?: ValidIndexName<TTable>;\n #condition?: unknown;\n #setValues?: TableToUpdateValues<TTable>;\n\n whereIndex<TIndexName extends ValidIndexName<TTable>>(\n indexName: TIndexName,\n condition?: unknown,\n ): this {\n this.#indexName = indexName;\n this.#condition = condition;\n return this;\n }\n\n set(values: TableToUpdateValues<TTable>): this {\n this.#setValues = values;\n return this;\n }\n\n getConfig() {\n return {\n indexName: this.#indexName,\n condition: this.#condition,\n setValues: this.#setValues,\n };\n }\n}\n\n/**\n * Creates a generic SQL-based query engine for the given schema using a UnitOfWorkFactory.\n *\n * This is the main entry point for creating a database query interface using a Unit of Work compiler.\n * It uses a compiler-based architecture where queries are compiled to SQL and then executed,\n * enabling features like SQL snapshot testing.\n *\n * @param schema - The database schema definition\n * @param factory - Factory containing compiler, executor, decoder, and optional configuration\n * @returns An SimpleQueryInterface instance for performing database operations\n *\n * @example\n * ```ts\n * const operationCompiler = new GenericSQLUOWOperationCompiler(driverConfig);\n * const factory: UnitOfWorkFactory = {\n * compiler: createUOWCompilerFromOperationCompiler(operationCompiler),\n * executor: createExecutor(sqlDriver),\n * decoder: createKyselyUOWDecoder(driverConfig.databaseType),\n * };\n * const queryEngine = fromUnitOfWorkCompiler(mySchema, factory);\n *\n * const users = await queryEngine.find('users', (b) =>\n * b.whereIndex('age').where((eb) => eb('age', '>', 18))\n * );\n * ```\n */\nexport function fromUnitOfWorkCompiler<T extends AnySchema>(\n schema: T,\n factory: UnitOfWorkFactory,\n): SimpleQueryInterface<T, UnitOfWorkConfig> {\n const { compiler, executor, decoder, uowConfig, schemaNamespaceMap } = factory;\n\n function createUOW(opts: { name?: string; config?: UnitOfWorkConfig }) {\n const { onQuery, ...restUowConfig } = opts.config ?? {};\n\n return new UnitOfWork(\n compiler,\n executor,\n decoder,\n opts.name,\n {\n ...restUowConfig,\n onQuery: onQuery\n ? (query) => {\n // Extract the actual query from CompiledMutation if needed\n const actualQuery = isCompiledMutation(query)\n ? query.query\n : (query as CompiledQuery);\n onQuery(actualQuery);\n }\n : undefined,\n },\n schemaNamespaceMap,\n ).forSchema(schema);\n }\n\n return {\n async find(tableName, builderFn) {\n const uow = createUOW({ config: uowConfig });\n uow.find(tableName, builderFn);\n const [result]: unknown[][] = await uow.executeRetrieve();\n return result ?? [];\n },\n\n async findWithCursor(tableName, builderFn) {\n const uow = createUOW({ config: uowConfig }).findWithCursor(tableName, builderFn);\n const [result] = await uow.executeRetrieve();\n // Result from findWithCursor is always a CursorResult - the UOW decoder handles the conversion\n return result as CursorResult<unknown>;\n },\n\n async findFirst(tableName, builderFn) {\n const uow = createUOW({ config: uowConfig });\n if (builderFn) {\n uow.find(tableName, (b) => {\n builderFn(b);\n return b.pageSize(1);\n });\n } else {\n uow.find(tableName, (b) => b.whereIndex(\"primary\").pageSize(1));\n }\n // executeRetrieve runs an array of `find` operation results, which each return an array of rows\n const [result]: unknown[][] = await uow.executeRetrieve();\n return result?.[0] ?? null;\n },\n\n async create(tableName, values) {\n const uow = createUOW({ config: uowConfig });\n uow.create(tableName, values);\n const { success } = await uow.executeMutations();\n if (!success) {\n throw new Error(\"Failed to create record\");\n }\n\n const createdIds = uow.getCreatedIds();\n const createdId = createdIds[0];\n if (!createdId) {\n throw new Error(\"Failed to get created ID\");\n }\n return createdId;\n },\n\n async createMany(tableName, valuesArray) {\n const uow = createUOW({ config: uowConfig });\n for (const values of valuesArray) {\n uow.create(tableName, values);\n }\n const { success } = await uow.executeMutations();\n if (!success) {\n throw new Error(\"Failed to create records\");\n }\n\n return uow.getCreatedIds();\n },\n\n async update(tableName, id, builderFn) {\n const uow = createUOW({ config: uowConfig });\n uow.update(tableName, id, builderFn);\n const { success } = await uow.executeMutations();\n if (!success) {\n throw new Error(\"Failed to update record (version conflict or record not found)\");\n }\n },\n\n async updateMany(tableName, builderFn) {\n const table = schema.tables[tableName];\n if (!table) {\n throw new Error(`Table ${tableName} not found in schema`);\n }\n\n const specialBuilder = new UpdateManySpecialBuilder<typeof table>();\n builderFn(specialBuilder);\n\n const { indexName, condition, setValues } = specialBuilder.getConfig();\n\n if (!indexName) {\n throw new Error(\"whereIndex() must be called in updateMany\");\n }\n if (!setValues) {\n throw new Error(\"set() must be called in updateMany\");\n }\n\n const findUow = createUOW({ config: uowConfig });\n findUow.find(tableName, (b) => {\n // Condition might be null or undefined, only pass if defined and not null\n if (condition !== undefined && condition !== null) {\n // TypeScript can't infer the complex condition type from the builder\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return b.whereIndex(indexName, condition as any);\n }\n return b.whereIndex(indexName);\n });\n const [records]: unknown[][] = await findUow.executeRetrieve();\n\n if (!records || records.length === 0) {\n return;\n }\n\n const updateUow = createUOW({ config: uowConfig });\n for (const record of records) {\n if (!hasIdField(record)) {\n throw new Error(\"Record missing id field\");\n }\n updateUow.update(tableName, record.id, (b) => b.set(setValues));\n }\n const { success } = await updateUow.executeMutations();\n if (!success) {\n throw new Error(\"Failed to update records (version conflict)\");\n }\n },\n\n async delete(tableName, id, builderFn) {\n const uow = createUOW({ config: uowConfig });\n uow.delete(tableName, id, builderFn);\n const { success } = await uow.executeMutations();\n if (!success) {\n throw new Error(\"Failed to delete record (version conflict or record not found)\");\n }\n },\n\n async deleteMany(tableName, builderFn) {\n const findUow = createUOW({ config: uowConfig });\n findUow.find(tableName, builderFn);\n const [records]: unknown[][] = await findUow.executeRetrieve();\n\n if (!records || records.length === 0) {\n return;\n }\n\n const deleteUow = createUOW({ config: uowConfig });\n for (const record of records) {\n if (!hasIdField(record)) {\n throw new Error(\"Record missing id field\");\n }\n deleteUow.delete(tableName, record.id);\n }\n const { success } = await deleteUow.executeMutations();\n if (!success) {\n throw new Error(\"Failed to delete records (version conflict)\");\n }\n },\n\n createUnitOfWork(name, nestedUowConfig) {\n return createUOW({\n name,\n config: {\n ...uowConfig,\n ...nestedUowConfig,\n },\n });\n },\n } as SimpleQueryInterface<T, UnitOfWorkConfig>;\n}\n"],"mappings":"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"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
//#region src/adapters/
|
|
1
|
+
//#region src/adapters/shared/table-name-mapper.d.ts
|
|
2
|
+
|
|
2
3
|
/**
|
|
3
4
|
* Maps logical table names (used by fragment authors) to physical table names (with namespace suffix)
|
|
4
5
|
*/
|
|
@@ -8,4 +9,4 @@ interface TableNameMapper {
|
|
|
8
9
|
}
|
|
9
10
|
//#endregion
|
|
10
11
|
export { TableNameMapper };
|
|
11
|
-
//# sourceMappingURL=
|
|
12
|
+
//# sourceMappingURL=table-name-mapper.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"table-name-mapper.d.ts","names":[],"sources":["../../../src/adapters/shared/table-name-mapper.ts"],"sourcesContent":[],"mappings":";;;;;UAeiB,eAAA"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
//#region src/adapters/shared/table-name-mapper.ts
|
|
2
|
+
/**
|
|
3
|
+
* Sanitizes a namespace for use in database table names and TypeScript exports.
|
|
4
|
+
* Converts dashes to underscores to ensure compatibility with SQL identifiers
|
|
5
|
+
* and Drizzle's relational query system.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* sanitizeNamespace("my-fragment") // => "my_fragment"
|
|
9
|
+
*/
|
|
10
|
+
function sanitizeNamespace(namespace) {
|
|
11
|
+
return namespace.replace(/-/g, "_");
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Creates a table name mapper for a given namespace.
|
|
15
|
+
* Physical names have format: {logicalName}_{namespace} (or {logicalName}_{sanitizedNamespace} if sanitize is true)
|
|
16
|
+
*
|
|
17
|
+
* @param namespace - The namespace to use for table name prefixing
|
|
18
|
+
* @param sanitize - Whether to sanitize the namespace by converting dashes to underscores (default: false)
|
|
19
|
+
* @returns A table name mapper with toPhysical and toLogical methods
|
|
20
|
+
*
|
|
21
|
+
* @example
|
|
22
|
+
* const mapper = createTableNameMapper("my-fragment");
|
|
23
|
+
* mapper.toPhysical("users") // => "users_my-fragment"
|
|
24
|
+
*
|
|
25
|
+
* @example
|
|
26
|
+
* const mapper = createTableNameMapper("my-fragment", true);
|
|
27
|
+
* mapper.toPhysical("users") // => "users_my_fragment"
|
|
28
|
+
* mapper.toLogical("users_my_fragment") // => "users"
|
|
29
|
+
*/
|
|
30
|
+
function createTableNameMapper(namespace, sanitize = false) {
|
|
31
|
+
const processedNamespace = sanitize ? sanitizeNamespace(namespace) : namespace;
|
|
32
|
+
return {
|
|
33
|
+
toPhysical: (logicalName) => `${logicalName}_${processedNamespace}`,
|
|
34
|
+
toLogical: (physicalName) => {
|
|
35
|
+
if (physicalName.endsWith(`_${processedNamespace}`)) return physicalName.slice(0, -(processedNamespace.length + 1));
|
|
36
|
+
return physicalName;
|
|
37
|
+
}
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
//#endregion
|
|
42
|
+
export { createTableNameMapper, sanitizeNamespace };
|
|
43
|
+
//# sourceMappingURL=table-name-mapper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"table-name-mapper.js","names":[],"sources":["../../../src/adapters/shared/table-name-mapper.ts"],"sourcesContent":["/**\n * Sanitizes a namespace for use in database table names and TypeScript exports.\n * Converts dashes to underscores to ensure compatibility with SQL identifiers\n * and Drizzle's relational query system.\n *\n * @example\n * sanitizeNamespace(\"my-fragment\") // => \"my_fragment\"\n */\nexport function sanitizeNamespace(namespace: string): string {\n return namespace.replace(/-/g, \"_\");\n}\n\n/**\n * Maps logical table names (used by fragment authors) to physical table names (with namespace suffix)\n */\nexport interface TableNameMapper {\n toPhysical(logicalName: string): string;\n toLogical(physicalName: string): string;\n}\n\n/**\n * Creates a table name mapper for a given namespace.\n * Physical names have format: {logicalName}_{namespace} (or {logicalName}_{sanitizedNamespace} if sanitize is true)\n *\n * @param namespace - The namespace to use for table name prefixing\n * @param sanitize - Whether to sanitize the namespace by converting dashes to underscores (default: false)\n * @returns A table name mapper with toPhysical and toLogical methods\n *\n * @example\n * const mapper = createTableNameMapper(\"my-fragment\");\n * mapper.toPhysical(\"users\") // => \"users_my-fragment\"\n *\n * @example\n * const mapper = createTableNameMapper(\"my-fragment\", true);\n * mapper.toPhysical(\"users\") // => \"users_my_fragment\"\n * mapper.toLogical(\"users_my_fragment\") // => \"users\"\n */\nexport function createTableNameMapper(namespace: string, sanitize = false): TableNameMapper {\n const processedNamespace = sanitize ? sanitizeNamespace(namespace) : namespace;\n\n return {\n toPhysical: (logicalName: string) => `${logicalName}_${processedNamespace}`,\n toLogical: (physicalName: string) => {\n if (physicalName.endsWith(`_${processedNamespace}`)) {\n return physicalName.slice(0, -(processedNamespace.length + 1));\n }\n return physicalName;\n },\n };\n}\n"],"mappings":";;;;;;;;;AAQA,SAAgB,kBAAkB,WAA2B;AAC3D,QAAO,UAAU,QAAQ,MAAM,IAAI;;;;;;;;;;;;;;;;;;;AA4BrC,SAAgB,sBAAsB,WAAmB,WAAW,OAAwB;CAC1F,MAAM,qBAAqB,WAAW,kBAAkB,UAAU,GAAG;AAErE,QAAO;EACL,aAAa,gBAAwB,GAAG,YAAY,GAAG;EACvD,YAAY,iBAAyB;AACnC,OAAI,aAAa,SAAS,IAAI,qBAAqB,CACjD,QAAO,aAAa,MAAM,GAAG,EAAE,mBAAmB,SAAS,GAAG;AAEhE,UAAO;;EAEV"}
|