@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,212 @@
|
|
|
1
|
+
import { SETTINGS_TABLE_NAME } from "../../../fragments/internal-fragment.js";
|
|
2
|
+
import { createSQLTypeMapper } from "../../../schema/type-conversion/create-sql-type-mapper.js";
|
|
3
|
+
import { sql } from "kysely";
|
|
4
|
+
import { createHash } from "node:crypto";
|
|
5
|
+
|
|
6
|
+
//#region src/adapters/generic-sql/migration/sql-generator.ts
|
|
7
|
+
/**
|
|
8
|
+
* Abstract base class for SQL generation from migration operations.
|
|
9
|
+
* Each database dialect extends this class and implements the abstract methods.
|
|
10
|
+
*/
|
|
11
|
+
var SQLGenerator = class {
|
|
12
|
+
db;
|
|
13
|
+
database;
|
|
14
|
+
typeMapper;
|
|
15
|
+
constructor(db, database) {
|
|
16
|
+
this.db = db;
|
|
17
|
+
this.database = database;
|
|
18
|
+
this.typeMapper = createSQLTypeMapper(database);
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Generate SQL for updating the schema version in the settings table.
|
|
22
|
+
* This is the same across all databases.
|
|
23
|
+
*/
|
|
24
|
+
generateVersionUpdateSQL(namespace, fromVersion, toVersion) {
|
|
25
|
+
const key = `${namespace}.schema_version`;
|
|
26
|
+
if (fromVersion === 0) {
|
|
27
|
+
const id = createHash("md5").update(key).digest("base64url").replace(/=/g, "");
|
|
28
|
+
return this.db.insertInto(SETTINGS_TABLE_NAME).values({
|
|
29
|
+
id: sql.lit(id),
|
|
30
|
+
key: sql.lit(key),
|
|
31
|
+
value: sql.lit(toVersion.toString())
|
|
32
|
+
}).compile();
|
|
33
|
+
} else return this.db.updateTable(SETTINGS_TABLE_NAME).set({ value: sql.lit(toVersion.toString()) }).where("key", "=", sql.lit(key)).compile();
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Compile migration operations to SQL statements.
|
|
37
|
+
* This is the main entry point for SQL generation.
|
|
38
|
+
*/
|
|
39
|
+
compile(operations, mapper) {
|
|
40
|
+
const preprocessed = this.preprocess(operations);
|
|
41
|
+
const queries = [];
|
|
42
|
+
for (const operation of preprocessed) {
|
|
43
|
+
const compiled = this.compileOperation(operation, mapper);
|
|
44
|
+
if (Array.isArray(compiled)) queries.push(...compiled);
|
|
45
|
+
else queries.push(compiled);
|
|
46
|
+
}
|
|
47
|
+
return queries;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Compile a single migration operation to SQL.
|
|
51
|
+
*/
|
|
52
|
+
compileOperation(operation, mapper) {
|
|
53
|
+
switch (operation.type) {
|
|
54
|
+
case "create-table": return this.compileCreateTable(operation, mapper);
|
|
55
|
+
case "rename-table": return this.compileRenameTable(operation, mapper);
|
|
56
|
+
case "alter-table": return this.compileAlterTable(operation, mapper);
|
|
57
|
+
case "drop-table": return this.compileDropTable(operation, mapper);
|
|
58
|
+
case "add-foreign-key": return this.compileAddForeignKey(operation, mapper);
|
|
59
|
+
case "drop-foreign-key": return this.compileDropForeignKey(operation, mapper);
|
|
60
|
+
case "add-index": return this.compileAddIndex(operation, mapper);
|
|
61
|
+
case "drop-index": return this.compileDropIndex(operation, mapper);
|
|
62
|
+
case "custom": return this.compileCustom(operation);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Compile a create-table operation.
|
|
67
|
+
* Subclasses can override to add FK constraints inline (e.g., SQLite).
|
|
68
|
+
*/
|
|
69
|
+
compileCreateTable(operation, mapper) {
|
|
70
|
+
const tableName = this.getTableName(operation.name, mapper);
|
|
71
|
+
let builder = this.db.schema.createTable(tableName);
|
|
72
|
+
for (const col of operation.columns) builder = builder.addColumn(col.name, sql.raw(this.getDBType(col)), (b) => this.buildColumn(col, b));
|
|
73
|
+
builder = this.addInlineForeignKeys(builder, operation, mapper);
|
|
74
|
+
return builder.compile();
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Hook for subclasses to add inline foreign keys to create-table.
|
|
78
|
+
* SQLite overrides this to add FKs at table creation time.
|
|
79
|
+
*/
|
|
80
|
+
addInlineForeignKeys(builder, _operation, _mapper) {
|
|
81
|
+
return builder;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Compile a rename-table operation.
|
|
85
|
+
*/
|
|
86
|
+
compileRenameTable(operation, mapper) {
|
|
87
|
+
return this.db.schema.alterTable(this.getTableName(operation.from, mapper)).renameTo(this.getTableName(operation.to, mapper)).compile();
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Compile an alter-table operation.
|
|
91
|
+
*/
|
|
92
|
+
compileAlterTable(operation, mapper) {
|
|
93
|
+
const queries = [];
|
|
94
|
+
const tableName = this.getTableName(operation.name, mapper);
|
|
95
|
+
for (const columnOp of operation.value) {
|
|
96
|
+
const compiled = this.compileColumnOperation(tableName, columnOp);
|
|
97
|
+
if (Array.isArray(compiled)) queries.push(...compiled);
|
|
98
|
+
else queries.push(compiled);
|
|
99
|
+
}
|
|
100
|
+
return queries;
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Compile a column operation within an alter-table.
|
|
104
|
+
* Subclasses override for database-specific handling (e.g., MySQL's modifyColumn).
|
|
105
|
+
*/
|
|
106
|
+
compileColumnOperation(tableName, operation) {
|
|
107
|
+
const alter = () => this.db.schema.alterTable(tableName);
|
|
108
|
+
switch (operation.type) {
|
|
109
|
+
case "rename-column": return alter().renameColumn(operation.from, operation.to).compile();
|
|
110
|
+
case "drop-column": return alter().dropColumn(operation.name).compile();
|
|
111
|
+
case "create-column": {
|
|
112
|
+
const col = operation.value;
|
|
113
|
+
return alter().addColumn(col.name, sql.raw(this.getDBType(col)), (b) => this.buildColumn(col, b)).compile();
|
|
114
|
+
}
|
|
115
|
+
case "update-column": return this.compileUpdateColumn(tableName, operation);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Compile a drop-table operation.
|
|
120
|
+
*/
|
|
121
|
+
compileDropTable(operation, mapper) {
|
|
122
|
+
return this.db.schema.dropTable(this.getTableName(operation.name, mapper)).compile();
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Compile an add-foreign-key operation.
|
|
126
|
+
* Subclasses can throw if not supported (e.g., SQLite).
|
|
127
|
+
*/
|
|
128
|
+
compileAddForeignKey(operation, mapper) {
|
|
129
|
+
const { table, value } = operation;
|
|
130
|
+
return this.db.schema.alterTable(this.getTableName(table, mapper)).addForeignKeyConstraint(value.name, value.columns, this.getTableName(value.referencedTable, mapper), value.referencedColumns, (b) => b.onUpdate("restrict").onDelete("restrict")).compile();
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Compile a drop-foreign-key operation.
|
|
134
|
+
* Subclasses can throw if not supported (e.g., SQLite).
|
|
135
|
+
*/
|
|
136
|
+
compileDropForeignKey(operation, mapper) {
|
|
137
|
+
const { table, name } = operation;
|
|
138
|
+
return this.db.schema.alterTable(this.getTableName(table, mapper)).dropConstraint(name).ifExists().compile();
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Compile an add-index operation.
|
|
142
|
+
*/
|
|
143
|
+
compileAddIndex(operation, mapper) {
|
|
144
|
+
const tableName = this.getTableName(operation.table, mapper);
|
|
145
|
+
const indexName = this.getIndexName(operation.name, operation.table, mapper);
|
|
146
|
+
let builder = this.db.schema.createIndex(indexName).on(tableName).columns(operation.columns);
|
|
147
|
+
if (operation.unique) builder = builder.unique();
|
|
148
|
+
return builder.compile();
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Compile a drop-index operation.
|
|
152
|
+
*/
|
|
153
|
+
compileDropIndex(operation, mapper) {
|
|
154
|
+
const tableName = this.getTableName(operation.table, mapper);
|
|
155
|
+
const indexName = this.getIndexName(operation.name, operation.table, mapper);
|
|
156
|
+
return this.db.schema.dropIndex(indexName).ifExists().on(tableName).compile();
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Compile a custom SQL operation.
|
|
160
|
+
*/
|
|
161
|
+
compileCustom(operation) {
|
|
162
|
+
const rawSql = operation["sql"];
|
|
163
|
+
return sql.raw(rawSql).compile(this.db);
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Build a column with all its constraints.
|
|
167
|
+
*/
|
|
168
|
+
buildColumn(col, builder) {
|
|
169
|
+
if (!col.isNullable) builder = builder.notNull();
|
|
170
|
+
if (col.role === "internal-id") {
|
|
171
|
+
builder = builder.primaryKey();
|
|
172
|
+
builder = this.applyAutoIncrement(builder);
|
|
173
|
+
}
|
|
174
|
+
if (col.role === "external-id") builder = builder.unique();
|
|
175
|
+
const defaultValue = this.getDefaultValue(col);
|
|
176
|
+
if (defaultValue) builder = builder.defaultTo(defaultValue);
|
|
177
|
+
return builder;
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Get table name, applying namespace mapping if provided.
|
|
181
|
+
* Settings table is never namespaced.
|
|
182
|
+
*/
|
|
183
|
+
getTableName(tableName, mapper) {
|
|
184
|
+
if (tableName === SETTINGS_TABLE_NAME) return tableName;
|
|
185
|
+
return mapper ? mapper.toPhysical(tableName) : tableName;
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Get the physical index name, applying namespace if a mapper is provided.
|
|
189
|
+
* Index names must be globally unique in most databases, so we namespace them
|
|
190
|
+
* to avoid collisions when multiple fragments use the same logical index names.
|
|
191
|
+
*/
|
|
192
|
+
getIndexName(indexName, tableName, mapper) {
|
|
193
|
+
if (!mapper) return indexName;
|
|
194
|
+
return `${indexName}_${mapper.toPhysical(tableName)}`;
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* Get the database type string for a column.
|
|
198
|
+
*/
|
|
199
|
+
getDBType(col) {
|
|
200
|
+
return this.typeMapper.getDatabaseType(col);
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* Compile raw SQL to a CompiledQuery.
|
|
204
|
+
*/
|
|
205
|
+
compileRaw(raw) {
|
|
206
|
+
return raw.compile(this.db);
|
|
207
|
+
}
|
|
208
|
+
};
|
|
209
|
+
|
|
210
|
+
//#endregion
|
|
211
|
+
export { SQLGenerator };
|
|
212
|
+
//# sourceMappingURL=sql-generator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sql-generator.js","names":["queries: CompiledQuery[]","builder: CreateTableBuilderAny"],"sources":["../../../../src/adapters/generic-sql/migration/sql-generator.ts"],"sourcesContent":["import {\n type ColumnDefinitionBuilder,\n type CompiledQuery,\n type CreateTableBuilder,\n type Kysely,\n type RawBuilder,\n sql,\n} from \"kysely\";\nimport { createHash } from \"node:crypto\";\nimport type {\n ColumnInfo,\n ColumnOperation,\n MigrationOperation,\n} from \"../../../migration-engine/shared\";\nimport { SETTINGS_TABLE_NAME } from \"../../../fragments/internal-fragment\";\nimport type { TableNameMapper } from \"../../shared/table-name-mapper\";\nimport type { SupportedDatabase } from \"../driver-config\";\nimport { createSQLTypeMapper } from \"../../../schema/type-conversion/create-sql-type-mapper\";\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype KyselyAny = Kysely<any>;\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype CreateTableBuilderAny = CreateTableBuilder<any, any>;\n\n/**\n * Interface for compiling migration operations to SQL.\n */\nexport interface CompilableQuery {\n compile(): CompiledQuery;\n}\n\n/**\n * Abstract base class for SQL generation from migration operations.\n * Each database dialect extends this class and implements the abstract methods.\n */\nexport abstract class SQLGenerator {\n protected readonly db: KyselyAny;\n protected readonly database: SupportedDatabase;\n protected readonly typeMapper: ReturnType<typeof createSQLTypeMapper>;\n\n constructor(db: KyselyAny, database: SupportedDatabase) {\n this.db = db;\n this.database = database;\n this.typeMapper = createSQLTypeMapper(database);\n }\n\n /**\n * Preprocess operations before SQL generation.\n * Dialects can override to transform operations based on database capabilities.\n * For example, SQLite merges FK operations into create-table operations.\n */\n abstract preprocess(operations: MigrationOperation[]): MigrationOperation[];\n\n /**\n * Apply auto-increment to a column builder.\n * PostgreSQL uses SERIAL types so this is a no-op there.\n */\n abstract applyAutoIncrement(builder: ColumnDefinitionBuilder): ColumnDefinitionBuilder;\n\n /**\n * Get the default value for a column, or undefined if not supported.\n * MySQL returns undefined for TEXT columns since it doesn't support defaults there.\n */\n abstract getDefaultValue(column: ColumnInfo): RawBuilder<unknown> | undefined;\n\n /**\n * Generate SQL for updating the schema version in the settings table.\n * This is the same across all databases.\n */\n generateVersionUpdateSQL(\n namespace: string,\n fromVersion: number,\n toVersion: number,\n ): CompiledQuery {\n const key = `${namespace}.schema_version`;\n\n if (fromVersion === 0) {\n // Insert new version record\n const id = createHash(\"md5\").update(key).digest(\"base64url\").replace(/=/g, \"\");\n return this.db\n .insertInto(SETTINGS_TABLE_NAME)\n .values({\n id: sql.lit(id),\n key: sql.lit(key),\n value: sql.lit(toVersion.toString()),\n })\n .compile();\n } else {\n // Update existing version record\n return this.db\n .updateTable(SETTINGS_TABLE_NAME)\n .set({\n value: sql.lit(toVersion.toString()),\n })\n .where(\"key\", \"=\", sql.lit(key))\n .compile();\n }\n }\n\n /**\n * Compile migration operations to SQL statements.\n * This is the main entry point for SQL generation.\n */\n compile(operations: MigrationOperation[], mapper?: TableNameMapper): CompiledQuery[] {\n const preprocessed = this.preprocess(operations);\n const queries: CompiledQuery[] = [];\n\n for (const operation of preprocessed) {\n const compiled = this.compileOperation(operation, mapper);\n if (Array.isArray(compiled)) {\n queries.push(...compiled);\n } else {\n queries.push(compiled);\n }\n }\n\n return queries;\n }\n\n /**\n * Compile a single migration operation to SQL.\n */\n protected compileOperation(\n operation: MigrationOperation,\n mapper?: TableNameMapper,\n ): CompiledQuery | CompiledQuery[] {\n switch (operation.type) {\n case \"create-table\":\n return this.compileCreateTable(operation, mapper);\n case \"rename-table\":\n return this.compileRenameTable(operation, mapper);\n case \"alter-table\":\n return this.compileAlterTable(operation, mapper);\n case \"drop-table\":\n return this.compileDropTable(operation, mapper);\n case \"add-foreign-key\":\n return this.compileAddForeignKey(operation, mapper);\n case \"drop-foreign-key\":\n return this.compileDropForeignKey(operation, mapper);\n case \"add-index\":\n return this.compileAddIndex(operation, mapper);\n case \"drop-index\":\n return this.compileDropIndex(operation, mapper);\n case \"custom\":\n return this.compileCustom(operation);\n }\n }\n\n /**\n * Compile a create-table operation.\n * Subclasses can override to add FK constraints inline (e.g., SQLite).\n */\n protected compileCreateTable(\n operation: Extract<MigrationOperation, { type: \"create-table\" }>,\n mapper?: TableNameMapper,\n ): CompiledQuery {\n const tableName = this.getTableName(operation.name, mapper);\n let builder: CreateTableBuilderAny = this.db.schema.createTable(tableName);\n\n for (const col of operation.columns) {\n builder = builder.addColumn(col.name, sql.raw(this.getDBType(col)), (b) =>\n this.buildColumn(col, b),\n );\n }\n\n // Allow subclasses to add inline foreign keys\n builder = this.addInlineForeignKeys(builder, operation, mapper);\n\n return builder.compile();\n }\n\n /**\n * Hook for subclasses to add inline foreign keys to create-table.\n * SQLite overrides this to add FKs at table creation time.\n */\n protected addInlineForeignKeys(\n builder: CreateTableBuilderAny,\n _operation: Extract<MigrationOperation, { type: \"create-table\" }>,\n _mapper?: TableNameMapper,\n ): CreateTableBuilderAny {\n return builder;\n }\n\n /**\n * Compile a rename-table operation.\n */\n protected compileRenameTable(\n operation: Extract<MigrationOperation, { type: \"rename-table\" }>,\n mapper?: TableNameMapper,\n ): CompiledQuery {\n return this.db.schema\n .alterTable(this.getTableName(operation.from, mapper))\n .renameTo(this.getTableName(operation.to, mapper))\n .compile();\n }\n\n /**\n * Compile an alter-table operation.\n */\n protected compileAlterTable(\n operation: Extract<MigrationOperation, { type: \"alter-table\" }>,\n mapper?: TableNameMapper,\n ): CompiledQuery[] {\n const queries: CompiledQuery[] = [];\n const tableName = this.getTableName(operation.name, mapper);\n\n for (const columnOp of operation.value) {\n const compiled = this.compileColumnOperation(tableName, columnOp);\n if (Array.isArray(compiled)) {\n queries.push(...compiled);\n } else {\n queries.push(compiled);\n }\n }\n\n return queries;\n }\n\n /**\n * Compile a column operation within an alter-table.\n * Subclasses override for database-specific handling (e.g., MySQL's modifyColumn).\n */\n protected compileColumnOperation(\n tableName: string,\n operation: ColumnOperation,\n ): CompiledQuery | CompiledQuery[] {\n const alter = () => this.db.schema.alterTable(tableName);\n\n switch (operation.type) {\n case \"rename-column\":\n return alter().renameColumn(operation.from, operation.to).compile();\n\n case \"drop-column\":\n return alter().dropColumn(operation.name).compile();\n\n case \"create-column\": {\n const col = operation.value;\n return alter()\n .addColumn(col.name, sql.raw(this.getDBType(col)), (b) => this.buildColumn(col, b))\n .compile();\n }\n\n case \"update-column\":\n return this.compileUpdateColumn(tableName, operation);\n }\n }\n\n /**\n * Compile an update-column operation.\n * Must be implemented by subclasses since each database handles this differently.\n */\n protected abstract compileUpdateColumn(\n tableName: string,\n operation: Extract<ColumnOperation, { type: \"update-column\" }>,\n ): CompiledQuery | CompiledQuery[];\n\n /**\n * Compile a drop-table operation.\n */\n protected compileDropTable(\n operation: Extract<MigrationOperation, { type: \"drop-table\" }>,\n mapper?: TableNameMapper,\n ): CompiledQuery {\n return this.db.schema.dropTable(this.getTableName(operation.name, mapper)).compile();\n }\n\n /**\n * Compile an add-foreign-key operation.\n * Subclasses can throw if not supported (e.g., SQLite).\n */\n protected compileAddForeignKey(\n operation: Extract<MigrationOperation, { type: \"add-foreign-key\" }>,\n mapper?: TableNameMapper,\n ): CompiledQuery {\n const { table, value } = operation;\n return this.db.schema\n .alterTable(this.getTableName(table, mapper))\n .addForeignKeyConstraint(\n value.name,\n value.columns,\n this.getTableName(value.referencedTable, mapper),\n value.referencedColumns,\n (b) => b.onUpdate(\"restrict\").onDelete(\"restrict\"),\n )\n .compile();\n }\n\n /**\n * Compile a drop-foreign-key operation.\n * Subclasses can throw if not supported (e.g., SQLite).\n */\n protected compileDropForeignKey(\n operation: Extract<MigrationOperation, { type: \"drop-foreign-key\" }>,\n mapper?: TableNameMapper,\n ): CompiledQuery {\n const { table, name } = operation;\n return this.db.schema\n .alterTable(this.getTableName(table, mapper))\n .dropConstraint(name)\n .ifExists()\n .compile();\n }\n\n /**\n * Compile an add-index operation.\n */\n protected compileAddIndex(\n operation: Extract<MigrationOperation, { type: \"add-index\" }>,\n mapper?: TableNameMapper,\n ): CompiledQuery {\n const tableName = this.getTableName(operation.table, mapper);\n const indexName = this.getIndexName(operation.name, operation.table, mapper);\n let builder = this.db.schema.createIndex(indexName).on(tableName).columns(operation.columns);\n\n if (operation.unique) {\n builder = builder.unique();\n }\n\n return builder.compile();\n }\n\n /**\n * Compile a drop-index operation.\n */\n protected compileDropIndex(\n operation: Extract<MigrationOperation, { type: \"drop-index\" }>,\n mapper?: TableNameMapper,\n ): CompiledQuery {\n const tableName = this.getTableName(operation.table, mapper);\n const indexName = this.getIndexName(operation.name, operation.table, mapper);\n return this.db.schema.dropIndex(indexName).ifExists().on(tableName).compile();\n }\n\n /**\n * Compile a custom SQL operation.\n */\n protected compileCustom(\n operation: Extract<MigrationOperation, { type: \"custom\" }>,\n ): CompiledQuery {\n // Custom operations have a 'sql' property with raw SQL\n const rawSql = operation[\"sql\"] as string;\n return sql.raw(rawSql).compile(this.db);\n }\n\n /**\n * Build a column with all its constraints.\n */\n protected buildColumn(\n col: ColumnInfo,\n builder: ColumnDefinitionBuilder,\n ): ColumnDefinitionBuilder {\n if (!col.isNullable) {\n builder = builder.notNull();\n }\n\n if (col.role === \"internal-id\") {\n builder = builder.primaryKey();\n builder = this.applyAutoIncrement(builder);\n }\n\n if (col.role === \"external-id\") {\n builder = builder.unique();\n }\n\n const defaultValue = this.getDefaultValue(col);\n if (defaultValue) {\n builder = builder.defaultTo(defaultValue);\n }\n\n return builder;\n }\n\n /**\n * Get table name, applying namespace mapping if provided.\n * Settings table is never namespaced.\n */\n protected getTableName(tableName: string, mapper?: TableNameMapper): string {\n if (tableName === SETTINGS_TABLE_NAME) {\n return tableName;\n }\n return mapper ? mapper.toPhysical(tableName) : tableName;\n }\n\n /**\n * Get the physical index name, applying namespace if a mapper is provided.\n * Index names must be globally unique in most databases, so we namespace them\n * to avoid collisions when multiple fragments use the same logical index names.\n */\n protected getIndexName(indexName: string, tableName: string, mapper?: TableNameMapper): string {\n if (!mapper) {\n return indexName;\n }\n // Create a unique index name by including the physical table name\n // This ensures index names are unique across namespaces\n const physicalTable = mapper.toPhysical(tableName);\n return `${indexName}_${physicalTable}`;\n }\n\n /**\n * Get the database type string for a column.\n */\n protected getDBType(col: ColumnInfo): string {\n return this.typeMapper.getDatabaseType(col);\n }\n\n /**\n * Compile raw SQL to a CompiledQuery.\n */\n protected compileRaw(raw: RawBuilder<unknown>): CompiledQuery {\n return raw.compile(this.db);\n }\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import "./sql-query-compiler.js";
|
|
2
|
+
import { PostgreSQLQueryCompiler } from "./dialect/postgres.js";
|
|
3
|
+
import { MySQLQueryCompiler } from "./dialect/mysql.js";
|
|
4
|
+
import { SQLiteQueryCompiler } from "./dialect/sqlite.js";
|
|
5
|
+
|
|
6
|
+
//#region src/adapters/generic-sql/query/create-sql-query-compiler.ts
|
|
7
|
+
/**
|
|
8
|
+
* Factory function to create a dialect-specific SQL query compiler.
|
|
9
|
+
*
|
|
10
|
+
* Based on the database type in DriverConfig, returns the appropriate
|
|
11
|
+
* compiler implementation (PostgreSQL, MySQL, or SQLite).
|
|
12
|
+
*
|
|
13
|
+
* @param db - Kysely database instance
|
|
14
|
+
* @param driverConfig - Driver configuration with database type and capabilities
|
|
15
|
+
* @param mapper - Optional table name mapper for namespace prefixing
|
|
16
|
+
* @returns Dialect-specific SQLQueryCompiler instance
|
|
17
|
+
*/
|
|
18
|
+
function createSQLQueryCompiler(db, driverConfig, mapper) {
|
|
19
|
+
switch (driverConfig.databaseType) {
|
|
20
|
+
case "postgresql": return new PostgreSQLQueryCompiler(db, driverConfig, mapper);
|
|
21
|
+
case "mysql": return new MySQLQueryCompiler(db, driverConfig, mapper);
|
|
22
|
+
case "sqlite": return new SQLiteQueryCompiler(db, driverConfig, mapper);
|
|
23
|
+
default: {
|
|
24
|
+
const exhaustiveCheck = driverConfig.databaseType;
|
|
25
|
+
throw new Error(`Unsupported database type: ${exhaustiveCheck}`);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
//#endregion
|
|
31
|
+
export { createSQLQueryCompiler };
|
|
32
|
+
//# sourceMappingURL=create-sql-query-compiler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-sql-query-compiler.js","names":["exhaustiveCheck: never"],"sources":["../../../../src/adapters/generic-sql/query/create-sql-query-compiler.ts"],"sourcesContent":["import type { DriverConfig } from \"../driver-config\";\nimport type { TableNameMapper } from \"../../shared/table-name-mapper\";\nimport { SQLQueryCompiler, type AnyKysely } from \"./sql-query-compiler\";\nimport { PostgreSQLQueryCompiler } from \"./dialect/postgres\";\nimport { MySQLQueryCompiler } from \"./dialect/mysql\";\nimport { SQLiteQueryCompiler } from \"./dialect/sqlite\";\n\n/**\n * Factory function to create a dialect-specific SQL query compiler.\n *\n * Based on the database type in DriverConfig, returns the appropriate\n * compiler implementation (PostgreSQL, MySQL, or SQLite).\n *\n * @param db - Kysely database instance\n * @param driverConfig - Driver configuration with database type and capabilities\n * @param mapper - Optional table name mapper for namespace prefixing\n * @returns Dialect-specific SQLQueryCompiler instance\n */\nexport function createSQLQueryCompiler(\n db: AnyKysely,\n driverConfig: DriverConfig,\n mapper?: TableNameMapper,\n): SQLQueryCompiler {\n switch (driverConfig.databaseType) {\n case \"postgresql\":\n return new PostgreSQLQueryCompiler(db, driverConfig, mapper);\n case \"mysql\":\n return new MySQLQueryCompiler(db, driverConfig, mapper);\n case \"sqlite\":\n return new SQLiteQueryCompiler(db, driverConfig, mapper);\n default: {\n const exhaustiveCheck: never = driverConfig.databaseType;\n throw new Error(`Unsupported database type: ${exhaustiveCheck}`);\n }\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;AAkBA,SAAgB,uBACd,IACA,cACA,QACkB;AAClB,SAAQ,aAAa,cAArB;EACE,KAAK,aACH,QAAO,IAAI,wBAAwB,IAAI,cAAc,OAAO;EAC9D,KAAK,QACH,QAAO,IAAI,mBAAmB,IAAI,cAAc,OAAO;EACzD,KAAK,SACH,QAAO,IAAI,oBAAoB,IAAI,cAAc,OAAO;EAC1D,SAAS;GACP,MAAMA,kBAAyB,aAAa;AAC5C,SAAM,IAAI,MAAM,8BAA8B,kBAAkB"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { decodeCursor, serializeCursorValues } from "../../../query/cursor.js";
|
|
2
|
+
|
|
3
|
+
//#region src/adapters/generic-sql/query/cursor-utils.ts
|
|
4
|
+
/**
|
|
5
|
+
* Build a cursor condition for pagination.
|
|
6
|
+
*
|
|
7
|
+
* Handles both single-column and multi-column cursor comparisons.
|
|
8
|
+
* For single columns: uses simple comparison (col > value)
|
|
9
|
+
* For multi-columns: builds tuple comparison ((col1, col2) > (val1, val2))
|
|
10
|
+
*
|
|
11
|
+
* @param cursor - The cursor string or object
|
|
12
|
+
* @param indexColumns - Columns used in the index for ordering
|
|
13
|
+
* @param orderDirection - Direction of ordering (asc/desc)
|
|
14
|
+
* @param isAfter - True for "after" cursor (forward pagination), false for "before" (backward)
|
|
15
|
+
* @param driverConfig - The driver configuration for value serialization
|
|
16
|
+
* @returns A Condition object for the cursor, or undefined if no cursor
|
|
17
|
+
* @throws Error if multi-column cursors are not supported by the implementation
|
|
18
|
+
*/
|
|
19
|
+
function buildCursorCondition(cursor, indexColumns, orderDirection, isAfter, driverConfig) {
|
|
20
|
+
if (!cursor || indexColumns.length === 0) return;
|
|
21
|
+
const serializedValues = serializeCursorValues(typeof cursor === "string" ? decodeCursor(cursor) : cursor, indexColumns, driverConfig);
|
|
22
|
+
const useGreaterThan = isAfter && orderDirection === "asc" || !isAfter && orderDirection === "desc";
|
|
23
|
+
if (indexColumns.length === 1) {
|
|
24
|
+
const col = indexColumns[0];
|
|
25
|
+
const val = serializedValues[col.ormName];
|
|
26
|
+
return {
|
|
27
|
+
type: "compare",
|
|
28
|
+
a: col,
|
|
29
|
+
operator: useGreaterThan ? ">" : "<",
|
|
30
|
+
b: val
|
|
31
|
+
};
|
|
32
|
+
} else throw new Error("Multi-column cursor pagination is not yet supported in Generic SQL implementation");
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
//#endregion
|
|
36
|
+
export { buildCursorCondition };
|
|
37
|
+
//# sourceMappingURL=cursor-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cursor-utils.js","names":[],"sources":["../../../../src/adapters/generic-sql/query/cursor-utils.ts"],"sourcesContent":["import type { AnyColumn } from \"../../../schema/create\";\nimport type { Condition } from \"../../../query/condition-builder\";\nimport { decodeCursor, serializeCursorValues, type Cursor } from \"../../../query/cursor\";\nimport type { DriverConfig } from \"../driver-config\";\n\n/**\n * Build a cursor condition for pagination.\n *\n * Handles both single-column and multi-column cursor comparisons.\n * For single columns: uses simple comparison (col > value)\n * For multi-columns: builds tuple comparison ((col1, col2) > (val1, val2))\n *\n * @param cursor - The cursor string or object\n * @param indexColumns - Columns used in the index for ordering\n * @param orderDirection - Direction of ordering (asc/desc)\n * @param isAfter - True for \"after\" cursor (forward pagination), false for \"before\" (backward)\n * @param driverConfig - The driver configuration for value serialization\n * @returns A Condition object for the cursor, or undefined if no cursor\n * @throws Error if multi-column cursors are not supported by the implementation\n */\nexport function buildCursorCondition(\n cursor: string | Cursor | undefined,\n indexColumns: AnyColumn[],\n orderDirection: \"asc\" | \"desc\",\n isAfter: boolean,\n driverConfig: DriverConfig,\n): Condition | undefined {\n if (!cursor || indexColumns.length === 0) {\n return undefined;\n }\n\n // Decode cursor if it's a string, otherwise use it as-is\n const cursorObj = typeof cursor === \"string\" ? decodeCursor(cursor) : cursor;\n const serializedValues = serializeCursorValues(cursorObj, indexColumns, driverConfig);\n\n // Determine comparison operator based on direction and after/before\n const useGreaterThan =\n (isAfter && orderDirection === \"asc\") || (!isAfter && orderDirection === \"desc\");\n\n if (indexColumns.length === 1) {\n // Simple single-column case\n const col = indexColumns[0]!;\n const val = serializedValues[col.ormName];\n const operator = useGreaterThan ? \">\" : \"<\";\n return {\n type: \"compare\",\n a: col,\n operator,\n b: val,\n };\n } else {\n throw new Error(\n \"Multi-column cursor pagination is not yet supported in Generic SQL implementation\",\n );\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAoBA,SAAgB,qBACd,QACA,cACA,gBACA,SACA,cACuB;AACvB,KAAI,CAAC,UAAU,aAAa,WAAW,EACrC;CAKF,MAAM,mBAAmB,sBADP,OAAO,WAAW,WAAW,aAAa,OAAO,GAAG,QACZ,cAAc,aAAa;CAGrF,MAAM,iBACH,WAAW,mBAAmB,SAAW,CAAC,WAAW,mBAAmB;AAE3E,KAAI,aAAa,WAAW,GAAG;EAE7B,MAAM,MAAM,aAAa;EACzB,MAAM,MAAM,iBAAiB,IAAI;AAEjC,SAAO;GACL,MAAM;GACN,GAAG;GACH,UAJe,iBAAiB,MAAM;GAKtC,GAAG;GACJ;OAED,OAAM,IAAI,MACR,oFACD"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { SQLQueryCompiler } from "../sql-query-compiler.js";
|
|
2
|
+
|
|
3
|
+
//#region src/adapters/generic-sql/query/dialect/mysql.ts
|
|
4
|
+
/**
|
|
5
|
+
* MySQL-specific query compiler.
|
|
6
|
+
*
|
|
7
|
+
* MySQL does not support RETURNING clause, so inserts return empty results.
|
|
8
|
+
*/
|
|
9
|
+
var MySQLQueryCompiler = class extends SQLQueryCompiler {
|
|
10
|
+
/**
|
|
11
|
+
* MySQL uses standard .limit()
|
|
12
|
+
*/
|
|
13
|
+
applyLimit(query, limit) {
|
|
14
|
+
return query.limit(limit);
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* MySQL uses standard .offset()
|
|
18
|
+
*/
|
|
19
|
+
applyOffset(query, offset) {
|
|
20
|
+
return query.offset(offset);
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* MySQL does not support RETURNING clause.
|
|
24
|
+
* Return the query as-is without RETURNING.
|
|
25
|
+
*/
|
|
26
|
+
applyReturning(query, _columns) {
|
|
27
|
+
return query;
|
|
28
|
+
}
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
//#endregion
|
|
32
|
+
export { MySQLQueryCompiler };
|
|
33
|
+
//# sourceMappingURL=mysql.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mysql.js","names":[],"sources":["../../../../../src/adapters/generic-sql/query/dialect/mysql.ts"],"sourcesContent":["import { SQLQueryCompiler } from \"../sql-query-compiler\";\n\n/**\n * MySQL-specific query compiler.\n *\n * MySQL does not support RETURNING clause, so inserts return empty results.\n */\nexport class MySQLQueryCompiler extends SQLQueryCompiler {\n /**\n * MySQL uses standard .limit()\n */\n protected applyLimit<T>(query: T & { limit(limit: number): T }, limit: number): T {\n return query.limit(limit);\n }\n\n /**\n * MySQL uses standard .offset()\n */\n protected applyOffset<T>(query: T & { offset(offset: number): T }, offset: number): T {\n return query.offset(offset);\n }\n\n /**\n * MySQL does not support RETURNING clause.\n * Return the query as-is without RETURNING.\n */\n protected applyReturning<T>(\n query: T & { returning(columns: string[]): T },\n _columns: string[],\n ): T {\n // MySQL doesn't support RETURNING, just return the query unchanged\n return query;\n }\n}\n"],"mappings":";;;;;;;;AAOA,IAAa,qBAAb,cAAwC,iBAAiB;;;;CAIvD,AAAU,WAAc,OAAwC,OAAkB;AAChF,SAAO,MAAM,MAAM,MAAM;;;;;CAM3B,AAAU,YAAe,OAA0C,QAAmB;AACpF,SAAO,MAAM,OAAO,OAAO;;;;;;CAO7B,AAAU,eACR,OACA,UACG;AAEH,SAAO"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { SQLQueryCompiler } from "../sql-query-compiler.js";
|
|
2
|
+
|
|
3
|
+
//#region src/adapters/generic-sql/query/dialect/postgres.ts
|
|
4
|
+
/**
|
|
5
|
+
* PostgreSQL-specific query compiler.
|
|
6
|
+
*
|
|
7
|
+
* Uses standard SQL with full RETURNING support.
|
|
8
|
+
*/
|
|
9
|
+
var PostgreSQLQueryCompiler = class extends SQLQueryCompiler {
|
|
10
|
+
/**
|
|
11
|
+
* PostgreSQL uses standard .limit()
|
|
12
|
+
*/
|
|
13
|
+
applyLimit(query, limit) {
|
|
14
|
+
return query.limit(limit);
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* PostgreSQL uses standard .offset()
|
|
18
|
+
*/
|
|
19
|
+
applyOffset(query, offset) {
|
|
20
|
+
return query.offset(offset);
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* PostgreSQL supports full RETURNING clause
|
|
24
|
+
*/
|
|
25
|
+
applyReturning(query, columns) {
|
|
26
|
+
return query.returning(columns);
|
|
27
|
+
}
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
//#endregion
|
|
31
|
+
export { PostgreSQLQueryCompiler };
|
|
32
|
+
//# sourceMappingURL=postgres.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"postgres.js","names":[],"sources":["../../../../../src/adapters/generic-sql/query/dialect/postgres.ts"],"sourcesContent":["import { SQLQueryCompiler } from \"../sql-query-compiler\";\n\n/**\n * PostgreSQL-specific query compiler.\n *\n * Uses standard SQL with full RETURNING support.\n */\nexport class PostgreSQLQueryCompiler extends SQLQueryCompiler {\n /**\n * PostgreSQL uses standard .limit()\n */\n protected applyLimit<T>(query: T & { limit(limit: number): T }, limit: number): T {\n return query.limit(limit);\n }\n\n /**\n * PostgreSQL uses standard .offset()\n */\n protected applyOffset<T>(query: T & { offset(offset: number): T }, offset: number): T {\n return query.offset(offset);\n }\n\n /**\n * PostgreSQL supports full RETURNING clause\n */\n protected applyReturning<T>(\n query: T & { returning(columns: string[]): T },\n columns: string[],\n ): T {\n return query.returning(columns);\n }\n}\n"],"mappings":";;;;;;;;AAOA,IAAa,0BAAb,cAA6C,iBAAiB;;;;CAI5D,AAAU,WAAc,OAAwC,OAAkB;AAChF,SAAO,MAAM,MAAM,MAAM;;;;;CAM3B,AAAU,YAAe,OAA0C,QAAmB;AACpF,SAAO,MAAM,OAAO,OAAO;;;;;CAM7B,AAAU,eACR,OACA,SACG;AACH,SAAO,MAAM,UAAU,QAAQ"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { SQLQueryCompiler } from "../sql-query-compiler.js";
|
|
2
|
+
|
|
3
|
+
//#region src/adapters/generic-sql/query/dialect/sqlite.ts
|
|
4
|
+
/**
|
|
5
|
+
* SQLite-specific query compiler.
|
|
6
|
+
*
|
|
7
|
+
* SQLite supports RETURNING and uses standard limit/offset.
|
|
8
|
+
*/
|
|
9
|
+
var SQLiteQueryCompiler = class extends SQLQueryCompiler {
|
|
10
|
+
/**
|
|
11
|
+
* SQLite uses standard .limit()
|
|
12
|
+
*/
|
|
13
|
+
applyLimit(query, limit) {
|
|
14
|
+
return query.limit(limit);
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* SQLite uses standard .offset()
|
|
18
|
+
*/
|
|
19
|
+
applyOffset(query, offset) {
|
|
20
|
+
return query.offset(offset);
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* SQLite supports RETURNING clause (since version 3.35.0)
|
|
24
|
+
*/
|
|
25
|
+
applyReturning(query, columns) {
|
|
26
|
+
return query.returning(columns);
|
|
27
|
+
}
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
//#endregion
|
|
31
|
+
export { SQLiteQueryCompiler };
|
|
32
|
+
//# sourceMappingURL=sqlite.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sqlite.js","names":[],"sources":["../../../../../src/adapters/generic-sql/query/dialect/sqlite.ts"],"sourcesContent":["import { SQLQueryCompiler } from \"../sql-query-compiler\";\n\n/**\n * SQLite-specific query compiler.\n *\n * SQLite supports RETURNING and uses standard limit/offset.\n */\nexport class SQLiteQueryCompiler extends SQLQueryCompiler {\n /**\n * SQLite uses standard .limit()\n */\n protected applyLimit<T>(query: T & { limit(limit: number): T }, limit: number): T {\n return query.limit(limit);\n }\n\n /**\n * SQLite uses standard .offset()\n */\n protected applyOffset<T>(query: T & { offset(offset: number): T }, offset: number): T {\n return query.offset(offset);\n }\n\n /**\n * SQLite supports RETURNING clause (since version 3.35.0)\n */\n protected applyReturning<T>(\n query: T & { returning(columns: string[]): T },\n columns: string[],\n ): T {\n return query.returning(columns);\n }\n}\n"],"mappings":";;;;;;;;AAOA,IAAa,sBAAb,cAAyC,iBAAiB;;;;CAIxD,AAAU,WAAc,OAAwC,OAAkB;AAChF,SAAO,MAAM,MAAM,MAAM;;;;;CAM3B,AAAU,YAAe,OAA0C,QAAmB;AACpF,SAAO,MAAM,OAAO,OAAO;;;;;CAM7B,AAAU,eACR,OACA,SACG;AACH,SAAO,MAAM,UAAU,QAAQ"}
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
import { buildCondition } from "../../../query/condition-builder.js";
|
|
2
|
+
import { createColdKysely } from "../migration/cold-kysely.js";
|
|
3
|
+
import { UOWOperationCompiler } from "../../shared/uow-operation-compiler.js";
|
|
4
|
+
import "./sql-query-compiler.js";
|
|
5
|
+
import { createSQLQueryCompiler } from "./create-sql-query-compiler.js";
|
|
6
|
+
import { buildCursorCondition } from "./cursor-utils.js";
|
|
7
|
+
import { buildFindOptions } from "../../../query/orm/orm.js";
|
|
8
|
+
|
|
9
|
+
//#region src/adapters/generic-sql/query/generic-sql-uow-operation-compiler.ts
|
|
10
|
+
/**
|
|
11
|
+
* Generic SQL UOW Operation Compiler.
|
|
12
|
+
*
|
|
13
|
+
* Uses SQLQueryCompiler for dialect-specific SQL generation while handling
|
|
14
|
+
* high-level business logic like cursor pagination, version checking, and index resolution.
|
|
15
|
+
*/
|
|
16
|
+
var GenericSQLUOWOperationCompiler = class extends UOWOperationCompiler {
|
|
17
|
+
constructor(driverConfig, mapperFactory) {
|
|
18
|
+
super(driverConfig, mapperFactory);
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Get SQL compiler for a specific namespace
|
|
22
|
+
*/
|
|
23
|
+
getSQLCompiler(namespace) {
|
|
24
|
+
const mapper = this.getMapperForOperation(namespace);
|
|
25
|
+
return createSQLQueryCompiler(createColdKysely(this.driverConfig.databaseType), this.driverConfig, mapper);
|
|
26
|
+
}
|
|
27
|
+
compileCount(op) {
|
|
28
|
+
const sqlCompiler = this.getSQLCompiler(op.namespace);
|
|
29
|
+
let conditions = op.options.where ? buildCondition(op.table.columns, op.options.where) : void 0;
|
|
30
|
+
if (conditions === true) conditions = void 0;
|
|
31
|
+
if (conditions === false) return null;
|
|
32
|
+
return sqlCompiler.compileCount(op.table, { where: conditions });
|
|
33
|
+
}
|
|
34
|
+
compileFind(op) {
|
|
35
|
+
const sqlCompiler = this.getSQLCompiler(op.namespace);
|
|
36
|
+
const { useIndex: _useIndex, orderByIndex, joins: join, after, before, pageSize,...findManyOptions } = op.options;
|
|
37
|
+
let indexColumns = [];
|
|
38
|
+
let orderDirection = "asc";
|
|
39
|
+
if (orderByIndex) {
|
|
40
|
+
const index = op.table.indexes[orderByIndex.indexName];
|
|
41
|
+
orderDirection = orderByIndex.direction;
|
|
42
|
+
if (!index) if (orderByIndex.indexName === "_primary") indexColumns = [op.table.getIdColumn()];
|
|
43
|
+
else throw new Error(`Index "${orderByIndex.indexName}" not found on table "${op.table.name}"`);
|
|
44
|
+
else indexColumns = index.columns;
|
|
45
|
+
}
|
|
46
|
+
let orderBy;
|
|
47
|
+
if (indexColumns.length > 0) orderBy = indexColumns.map((col) => [col, orderDirection]);
|
|
48
|
+
if ((after || before) && indexColumns.length > 1) throw new Error("Multi-column cursor pagination is not yet supported in Generic SQL implementation");
|
|
49
|
+
const cursorCondition = buildCursorCondition(after || before, indexColumns, orderDirection, !!after, this.driverConfig);
|
|
50
|
+
let combinedWhere;
|
|
51
|
+
if (findManyOptions.where) {
|
|
52
|
+
const whereResult = buildCondition(op.table.columns, findManyOptions.where);
|
|
53
|
+
if (whereResult === true) combinedWhere = void 0;
|
|
54
|
+
else if (whereResult === false) return null;
|
|
55
|
+
else combinedWhere = whereResult;
|
|
56
|
+
}
|
|
57
|
+
if (cursorCondition) if (combinedWhere) combinedWhere = {
|
|
58
|
+
type: "and",
|
|
59
|
+
items: [combinedWhere, cursorCondition]
|
|
60
|
+
};
|
|
61
|
+
else combinedWhere = cursorCondition;
|
|
62
|
+
const effectiveLimit = pageSize && op.withCursor ? pageSize + 1 : pageSize;
|
|
63
|
+
if (join && join.length > 0) return sqlCompiler.compileFindMany(op.table, {
|
|
64
|
+
select: findManyOptions.select ?? true,
|
|
65
|
+
where: combinedWhere,
|
|
66
|
+
orderBy,
|
|
67
|
+
limit: effectiveLimit,
|
|
68
|
+
join
|
|
69
|
+
});
|
|
70
|
+
const compiledOptions = buildFindOptions(op.table, {
|
|
71
|
+
...findManyOptions,
|
|
72
|
+
where: combinedWhere ? () => combinedWhere : void 0,
|
|
73
|
+
orderBy: orderBy?.map(([col, dir]) => [col.ormName, dir]),
|
|
74
|
+
limit: effectiveLimit
|
|
75
|
+
});
|
|
76
|
+
if (compiledOptions === false) return null;
|
|
77
|
+
return sqlCompiler.compileFindMany(op.table, compiledOptions);
|
|
78
|
+
}
|
|
79
|
+
compileCreate(op) {
|
|
80
|
+
const sqlCompiler = this.getSQLCompiler(op.namespace);
|
|
81
|
+
const table = this.getTable(op.schema, op.table);
|
|
82
|
+
return {
|
|
83
|
+
query: sqlCompiler.compileCreate(table, op.values),
|
|
84
|
+
op: "create",
|
|
85
|
+
expectedAffectedRows: null,
|
|
86
|
+
expectedReturnedRows: null
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
compileUpdate(op) {
|
|
90
|
+
const sqlCompiler = this.getSQLCompiler(op.namespace);
|
|
91
|
+
const table = this.getTable(op.schema, op.table);
|
|
92
|
+
const idColumn = table.getIdColumn();
|
|
93
|
+
const versionColumn = table.getVersionColumn();
|
|
94
|
+
const externalId = this.getExternalId(op.id);
|
|
95
|
+
const versionToCheck = this.getVersionToCheck(op.id, op.checkVersion);
|
|
96
|
+
const conditionsResult = versionToCheck !== void 0 ? buildCondition(table.columns, (eb) => eb.and(eb(idColumn.ormName, "=", externalId), eb(versionColumn.ormName, "=", versionToCheck))) : buildCondition(table.columns, (eb) => eb(idColumn.ormName, "=", externalId));
|
|
97
|
+
if (conditionsResult === false) return null;
|
|
98
|
+
const conditions = conditionsResult === true ? void 0 : conditionsResult;
|
|
99
|
+
const useReturningForCheck = op.checkVersion && this.driverConfig.supportsReturning && !this.driverConfig.supportsRowsAffected;
|
|
100
|
+
return {
|
|
101
|
+
query: sqlCompiler.compileUpdate(table, {
|
|
102
|
+
set: op.set,
|
|
103
|
+
where: conditions,
|
|
104
|
+
returning: useReturningForCheck
|
|
105
|
+
}),
|
|
106
|
+
op: "update",
|
|
107
|
+
expectedAffectedRows: useReturningForCheck ? null : op.checkVersion ? 1n : null,
|
|
108
|
+
expectedReturnedRows: useReturningForCheck ? 1 : null
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
compileDelete(op) {
|
|
112
|
+
const sqlCompiler = this.getSQLCompiler(op.namespace);
|
|
113
|
+
const table = this.getTable(op.schema, op.table);
|
|
114
|
+
const idColumn = table.getIdColumn();
|
|
115
|
+
const versionColumn = table.getVersionColumn();
|
|
116
|
+
const externalId = this.getExternalId(op.id);
|
|
117
|
+
const versionToCheck = this.getVersionToCheck(op.id, op.checkVersion);
|
|
118
|
+
const conditionsResult = versionToCheck !== void 0 ? buildCondition(table.columns, (eb) => eb.and(eb(idColumn.ormName, "=", externalId), eb(versionColumn.ormName, "=", versionToCheck))) : buildCondition(table.columns, (eb) => eb(idColumn.ormName, "=", externalId));
|
|
119
|
+
if (conditionsResult === false) return null;
|
|
120
|
+
const conditions = conditionsResult === true ? void 0 : conditionsResult;
|
|
121
|
+
const useReturningForCheck = op.checkVersion && this.driverConfig.supportsReturning && !this.driverConfig.supportsRowsAffected;
|
|
122
|
+
return {
|
|
123
|
+
query: sqlCompiler.compileDelete(table, {
|
|
124
|
+
where: conditions,
|
|
125
|
+
returning: useReturningForCheck
|
|
126
|
+
}),
|
|
127
|
+
op: "delete",
|
|
128
|
+
expectedAffectedRows: useReturningForCheck ? null : op.checkVersion ? 1n : null,
|
|
129
|
+
expectedReturnedRows: useReturningForCheck ? 1 : null
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
compileCheck(op) {
|
|
133
|
+
const sqlCompiler = this.getSQLCompiler(op.namespace);
|
|
134
|
+
const table = this.getTable(op.schema, op.table);
|
|
135
|
+
const idColumn = table.getIdColumn();
|
|
136
|
+
const versionColumn = table.getVersionColumn();
|
|
137
|
+
const externalId = op.id.externalId;
|
|
138
|
+
const version = op.id.version;
|
|
139
|
+
const condition = buildCondition(table.columns, (eb) => eb.and(eb(idColumn.ormName, "=", externalId), eb(versionColumn.ormName, "=", version)));
|
|
140
|
+
if (typeof condition === "boolean") throw new Error("Condition is a boolean, but should be a condition object.");
|
|
141
|
+
return {
|
|
142
|
+
query: sqlCompiler.compileCheck(table, condition),
|
|
143
|
+
op: "check",
|
|
144
|
+
expectedAffectedRows: null,
|
|
145
|
+
expectedReturnedRows: 1
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
};
|
|
149
|
+
|
|
150
|
+
//#endregion
|
|
151
|
+
export { GenericSQLUOWOperationCompiler };
|
|
152
|
+
//# sourceMappingURL=generic-sql-uow-operation-compiler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generic-sql-uow-operation-compiler.js","names":["indexColumns: AnyColumn[]","orderDirection: \"asc\" | \"desc\"","orderBy: [AnyColumn, \"asc\" | \"desc\"][] | undefined","combinedWhere: Condition | undefined","conditions: Condition | undefined"],"sources":["../../../../src/adapters/generic-sql/query/generic-sql-uow-operation-compiler.ts"],"sourcesContent":["import { UOWOperationCompiler } from \"../../shared/uow-operation-compiler\";\nimport type { CompiledQuery } from \"kysely\";\nimport type { DriverConfig } from \"../driver-config\";\nimport type { TableNameMapper } from \"../../shared/table-name-mapper\";\nimport type {\n RetrievalOperation,\n MutationOperation,\n CompiledMutation,\n} from \"../../../query/unit-of-work/unit-of-work\";\nimport type { AnyColumn, AnySchema } from \"../../../schema/create\";\nimport { buildCondition } from \"../../../query/condition-builder\";\nimport { createSQLQueryCompiler } from \"./create-sql-query-compiler\";\nimport { SQLQueryCompiler } from \"./sql-query-compiler\";\nimport { buildCursorCondition } from \"./cursor-utils\";\nimport type { Condition } from \"../../../query/condition-builder\";\nimport { buildFindOptions } from \"../../../query/orm/orm\";\nimport type { AnySelectClause } from \"../../../query/simple-query-interface\";\nimport { createColdKysely } from \"../migration/cold-kysely\";\n\n/**\n * Generic SQL UOW Operation Compiler.\n *\n * Uses SQLQueryCompiler for dialect-specific SQL generation while handling\n * high-level business logic like cursor pagination, version checking, and index resolution.\n */\nexport class GenericSQLUOWOperationCompiler extends UOWOperationCompiler<CompiledQuery> {\n constructor(\n driverConfig: DriverConfig,\n mapperFactory?: (namespace: string | undefined) => TableNameMapper | undefined,\n ) {\n super(driverConfig, mapperFactory);\n }\n\n /**\n * Get SQL compiler for a specific namespace\n */\n private getSQLCompiler(namespace: string | undefined): SQLQueryCompiler {\n const mapper = this.getMapperForOperation(namespace);\n const kysely = createColdKysely(this.driverConfig.databaseType);\n return createSQLQueryCompiler(kysely, this.driverConfig, mapper);\n }\n\n override compileCount(\n op: RetrievalOperation<AnySchema> & { type: \"count\" },\n ): CompiledQuery | null {\n const sqlCompiler = this.getSQLCompiler(op.namespace);\n\n // Build where condition\n let conditions = op.options.where\n ? buildCondition(op.table.columns, op.options.where)\n : undefined;\n\n if (conditions === true) {\n conditions = undefined;\n }\n if (conditions === false) {\n return null;\n }\n\n return sqlCompiler.compileCount(op.table, { where: conditions });\n }\n\n override compileFind(op: RetrievalOperation<AnySchema> & { type: \"find\" }): CompiledQuery | null {\n const sqlCompiler = this.getSQLCompiler(op.namespace);\n\n // Extract options\n const {\n useIndex: _useIndex,\n orderByIndex,\n joins: join,\n after,\n before,\n pageSize,\n ...findManyOptions\n } = op.options;\n\n // Get index columns for ordering and cursor pagination\n let indexColumns: AnyColumn[] = [];\n let orderDirection: \"asc\" | \"desc\" = \"asc\";\n\n if (orderByIndex) {\n const index = op.table.indexes[orderByIndex.indexName];\n orderDirection = orderByIndex.direction;\n\n if (!index) {\n // If _primary index doesn't exist, fall back to internal ID column\n if (orderByIndex.indexName === \"_primary\") {\n indexColumns = [op.table.getIdColumn()];\n } else {\n throw new Error(\n `Index \"${orderByIndex.indexName}\" not found on table \"${op.table.name}\"`,\n );\n }\n } else {\n // Order by all columns in the index with the specified direction\n indexColumns = index.columns;\n }\n }\n\n // Convert orderByIndex to orderBy format\n let orderBy: [AnyColumn, \"asc\" | \"desc\"][] | undefined;\n if (indexColumns.length > 0) {\n orderBy = indexColumns.map((col) => [col, orderDirection]);\n }\n\n // Handle cursor pagination - build a cursor condition\n // TODO: Multi-column cursor pagination not yet supported\n if ((after || before) && indexColumns.length > 1) {\n throw new Error(\n \"Multi-column cursor pagination is not yet supported in Generic SQL implementation\",\n );\n }\n const cursorCondition = buildCursorCondition(\n after || before,\n indexColumns,\n orderDirection,\n !!after,\n this.driverConfig,\n );\n\n // Combine user where clause with cursor condition\n let combinedWhere: Condition | undefined;\n if (findManyOptions.where) {\n const whereResult = buildCondition(op.table.columns, findManyOptions.where);\n if (whereResult === true) {\n combinedWhere = undefined;\n } else if (whereResult === false) {\n return null;\n } else {\n combinedWhere = whereResult;\n }\n }\n\n if (cursorCondition) {\n if (combinedWhere) {\n combinedWhere = {\n type: \"and\",\n items: [combinedWhere, cursorCondition],\n };\n } else {\n combinedWhere = cursorCondition;\n }\n }\n\n // For cursor pagination, fetch one extra item to determine if there's a next page\n const effectiveLimit = pageSize && op.withCursor ? pageSize + 1 : pageSize;\n\n // When we have joins, use the query builder directly\n if (join && join.length > 0) {\n return sqlCompiler.compileFindMany(op.table, {\n select: (findManyOptions.select ?? true) as AnySelectClause,\n where: combinedWhere,\n orderBy,\n limit: effectiveLimit,\n join,\n });\n }\n\n // Otherwise, use buildFindOptions to process the query options\n const compiledOptions = buildFindOptions(op.table, {\n ...findManyOptions,\n where: combinedWhere ? () => combinedWhere! : undefined,\n orderBy: orderBy?.map(([col, dir]) => [col.ormName, dir]),\n limit: effectiveLimit,\n });\n\n if (compiledOptions === false) {\n return null;\n }\n\n return sqlCompiler.compileFindMany(op.table, compiledOptions);\n }\n\n override compileCreate(\n op: MutationOperation<AnySchema> & { type: \"create\" },\n ): CompiledMutation<CompiledQuery> | null {\n const sqlCompiler = this.getSQLCompiler(op.namespace);\n const table = this.getTable(op.schema, op.table);\n\n return {\n query: sqlCompiler.compileCreate(table, op.values),\n op: \"create\",\n expectedAffectedRows: null, // creates don't need affected row checks\n expectedReturnedRows: null,\n };\n }\n\n override compileUpdate(\n op: MutationOperation<AnySchema> & { type: \"update\" },\n ): CompiledMutation<CompiledQuery> | null {\n const sqlCompiler = this.getSQLCompiler(op.namespace);\n const table = this.getTable(op.schema, op.table);\n const idColumn = table.getIdColumn();\n const versionColumn = table.getVersionColumn();\n\n const externalId = this.getExternalId(op.id);\n const versionToCheck = this.getVersionToCheck(op.id, op.checkVersion);\n\n // Build WHERE clause that filters by ID and optionally by version\n const conditionsResult =\n versionToCheck !== undefined\n ? buildCondition(table.columns, (eb) =>\n eb.and(\n eb(idColumn.ormName, \"=\", externalId),\n eb(versionColumn.ormName, \"=\", versionToCheck),\n ),\n )\n : buildCondition(table.columns, (eb) => eb(idColumn.ormName, \"=\", externalId));\n\n if (conditionsResult === false) {\n return null;\n }\n\n const conditions: Condition | undefined =\n conditionsResult === true ? undefined : conditionsResult;\n\n // Determine if we should use RETURNING-based checking\n // Use RETURNING when driver supports it but doesn't support affected rows reporting\n const useReturningForCheck =\n op.checkVersion &&\n this.driverConfig.supportsReturning &&\n !this.driverConfig.supportsRowsAffected;\n\n const query = sqlCompiler.compileUpdate(table, {\n set: op.set,\n where: conditions,\n returning: useReturningForCheck,\n });\n\n return {\n query,\n op: \"update\",\n expectedAffectedRows: useReturningForCheck ? null : op.checkVersion ? 1n : null,\n expectedReturnedRows: useReturningForCheck ? 1 : null,\n };\n }\n\n override compileDelete(\n op: MutationOperation<AnySchema> & { type: \"delete\" },\n ): CompiledMutation<CompiledQuery> | null {\n const sqlCompiler = this.getSQLCompiler(op.namespace);\n const table = this.getTable(op.schema, op.table);\n const idColumn = table.getIdColumn();\n const versionColumn = table.getVersionColumn();\n\n const externalId = this.getExternalId(op.id);\n const versionToCheck = this.getVersionToCheck(op.id, op.checkVersion);\n\n // Build WHERE clause that filters by ID and optionally by version\n const conditionsResult =\n versionToCheck !== undefined\n ? buildCondition(table.columns, (eb) =>\n eb.and(\n eb(idColumn.ormName, \"=\", externalId),\n eb(versionColumn.ormName, \"=\", versionToCheck),\n ),\n )\n : buildCondition(table.columns, (eb) => eb(idColumn.ormName, \"=\", externalId));\n\n if (conditionsResult === false) {\n return null;\n }\n\n const conditions: Condition | undefined =\n conditionsResult === true ? undefined : conditionsResult;\n\n // Determine if we should use RETURNING-based checking\n // Use RETURNING when driver supports it but doesn't support affected rows reporting\n const useReturningForCheck =\n op.checkVersion &&\n this.driverConfig.supportsReturning &&\n !this.driverConfig.supportsRowsAffected;\n\n const query = sqlCompiler.compileDelete(table, {\n where: conditions,\n returning: useReturningForCheck,\n });\n\n return {\n query,\n op: \"delete\",\n expectedAffectedRows: useReturningForCheck ? null : op.checkVersion ? 1n : null,\n expectedReturnedRows: useReturningForCheck ? 1 : null,\n };\n }\n\n override compileCheck(\n op: MutationOperation<AnySchema> & { type: \"check\" },\n ): CompiledMutation<CompiledQuery> {\n const sqlCompiler = this.getSQLCompiler(op.namespace);\n const table = this.getTable(op.schema, op.table);\n const idColumn = table.getIdColumn();\n const versionColumn = table.getVersionColumn();\n\n const externalId = op.id.externalId;\n const version = op.id.version;\n\n // Build a SELECT 1 query to check if the row exists with the correct version\n const condition = buildCondition(table.columns, (eb) =>\n eb.and(eb(idColumn.ormName, \"=\", externalId), eb(versionColumn.ormName, \"=\", version)),\n );\n\n if (typeof condition === \"boolean\") {\n throw new Error(\"Condition is a boolean, but should be a condition object.\");\n }\n\n return {\n query: sqlCompiler.compileCheck(table, condition),\n op: \"check\",\n expectedAffectedRows: null,\n expectedReturnedRows: 1, // Check that exactly 1 row was returned\n };\n }\n}\n"],"mappings":"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"}
|