@fragno-dev/db 0.1.14 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-build.log +242 -139
- package/CHANGELOG.md +47 -0
- package/README.md +123 -8
- package/dist/adapters/adapters.d.ts +19 -5
- package/dist/adapters/adapters.d.ts.map +1 -1
- package/dist/adapters/adapters.js.map +1 -1
- package/dist/adapters/drizzle/drizzle-adapter.d.ts +6 -19
- package/dist/adapters/drizzle/drizzle-adapter.d.ts.map +1 -1
- package/dist/adapters/drizzle/drizzle-adapter.js +7 -47
- package/dist/adapters/drizzle/drizzle-adapter.js.map +1 -1
- package/dist/adapters/drizzle/generate.d.ts +7 -1
- package/dist/adapters/drizzle/generate.d.ts.map +1 -1
- package/dist/adapters/drizzle/generate.js +46 -45
- package/dist/adapters/drizzle/generate.js.map +1 -1
- package/dist/adapters/generic-sql/driver-config.d.ts +74 -0
- package/dist/adapters/generic-sql/driver-config.d.ts.map +1 -0
- package/dist/adapters/generic-sql/driver-config.js +94 -0
- package/dist/adapters/generic-sql/driver-config.js.map +1 -0
- package/dist/adapters/generic-sql/generic-sql-adapter.d.ts +43 -0
- package/dist/adapters/generic-sql/generic-sql-adapter.d.ts.map +1 -0
- package/dist/adapters/generic-sql/generic-sql-adapter.js +87 -0
- package/dist/adapters/generic-sql/generic-sql-adapter.js.map +1 -0
- package/dist/adapters/generic-sql/generic-sql-uow-executor.js +67 -0
- package/dist/adapters/generic-sql/generic-sql-uow-executor.js.map +1 -0
- package/dist/adapters/generic-sql/migration/cold-kysely.js +33 -0
- package/dist/adapters/generic-sql/migration/cold-kysely.js.map +1 -0
- package/dist/adapters/generic-sql/migration/dialect/mysql.js +60 -0
- package/dist/adapters/generic-sql/migration/dialect/mysql.js.map +1 -0
- package/dist/adapters/generic-sql/migration/dialect/postgres.js +59 -0
- package/dist/adapters/generic-sql/migration/dialect/postgres.js.map +1 -0
- package/dist/adapters/generic-sql/migration/dialect/sqlite.js +96 -0
- package/dist/adapters/generic-sql/migration/dialect/sqlite.js.map +1 -0
- package/dist/adapters/generic-sql/migration/executor.d.ts +15 -0
- package/dist/adapters/generic-sql/migration/executor.d.ts.map +1 -0
- package/dist/adapters/generic-sql/migration/executor.js +18 -0
- package/dist/adapters/generic-sql/migration/executor.js.map +1 -0
- package/dist/adapters/generic-sql/migration/prepared-migrations.d.ts +66 -0
- package/dist/adapters/generic-sql/migration/prepared-migrations.d.ts.map +1 -0
- package/dist/adapters/generic-sql/migration/prepared-migrations.js +68 -0
- package/dist/adapters/generic-sql/migration/prepared-migrations.js.map +1 -0
- package/dist/adapters/generic-sql/migration/sql-generator.js +212 -0
- package/dist/adapters/generic-sql/migration/sql-generator.js.map +1 -0
- package/dist/adapters/generic-sql/query/create-sql-query-compiler.js +32 -0
- package/dist/adapters/generic-sql/query/create-sql-query-compiler.js.map +1 -0
- package/dist/adapters/generic-sql/query/cursor-utils.js +37 -0
- package/dist/adapters/generic-sql/query/cursor-utils.js.map +1 -0
- package/dist/adapters/generic-sql/query/dialect/mysql.js +33 -0
- package/dist/adapters/generic-sql/query/dialect/mysql.js.map +1 -0
- package/dist/adapters/generic-sql/query/dialect/postgres.js +32 -0
- package/dist/adapters/generic-sql/query/dialect/postgres.js.map +1 -0
- package/dist/adapters/generic-sql/query/dialect/sqlite.js +32 -0
- package/dist/adapters/generic-sql/query/dialect/sqlite.js.map +1 -0
- package/dist/adapters/generic-sql/query/generic-sql-uow-operation-compiler.js +152 -0
- package/dist/adapters/generic-sql/query/generic-sql-uow-operation-compiler.js.map +1 -0
- package/dist/adapters/generic-sql/query/select-builder.js +69 -0
- package/dist/adapters/generic-sql/query/select-builder.js.map +1 -0
- package/dist/adapters/generic-sql/query/sql-query-compiler.js +145 -0
- package/dist/adapters/generic-sql/query/sql-query-compiler.js.map +1 -0
- package/dist/adapters/generic-sql/query/where-builder.js +129 -0
- package/dist/adapters/generic-sql/query/where-builder.js.map +1 -0
- package/dist/adapters/generic-sql/result-interpreter.js +74 -0
- package/dist/adapters/generic-sql/result-interpreter.js.map +1 -0
- package/dist/adapters/generic-sql/uow-decoder.js +105 -0
- package/dist/adapters/generic-sql/uow-decoder.js.map +1 -0
- package/dist/adapters/generic-sql/uow-encoder.js +93 -0
- package/dist/adapters/generic-sql/uow-encoder.js.map +1 -0
- package/dist/adapters/kysely/kysely-adapter.d.ts +5 -16
- package/dist/adapters/kysely/kysely-adapter.d.ts.map +1 -1
- package/dist/adapters/kysely/kysely-adapter.js +6 -159
- package/dist/adapters/kysely/kysely-adapter.js.map +1 -1
- package/dist/adapters/{drizzle/drizzle-query.js → shared/from-unit-of-work-compiler.js} +48 -62
- package/dist/adapters/shared/from-unit-of-work-compiler.js.map +1 -0
- package/dist/adapters/{kysely/kysely-shared.d.ts → shared/table-name-mapper.d.ts} +3 -2
- package/dist/adapters/shared/table-name-mapper.d.ts.map +1 -0
- package/dist/adapters/shared/table-name-mapper.js +43 -0
- package/dist/adapters/shared/table-name-mapper.js.map +1 -0
- package/dist/adapters/shared/uow-operation-compiler.js +105 -0
- package/dist/adapters/shared/uow-operation-compiler.js.map +1 -0
- package/dist/db-fragment-definition-builder.d.ts +186 -0
- package/dist/db-fragment-definition-builder.d.ts.map +1 -0
- package/dist/db-fragment-definition-builder.js +207 -0
- package/dist/db-fragment-definition-builder.js.map +1 -0
- package/dist/fragments/internal-fragment.d.ts +53 -0
- package/dist/fragments/internal-fragment.d.ts.map +1 -0
- package/dist/fragments/internal-fragment.js +111 -0
- package/dist/fragments/internal-fragment.js.map +1 -0
- package/dist/hooks/hooks.d.ts +51 -0
- package/dist/hooks/hooks.d.ts.map +1 -0
- package/dist/hooks/hooks.js +88 -0
- package/dist/hooks/hooks.js.map +1 -0
- package/dist/migration-engine/generation-engine.d.ts +0 -2
- package/dist/migration-engine/generation-engine.d.ts.map +1 -1
- package/dist/migration-engine/generation-engine.js +38 -56
- package/dist/migration-engine/generation-engine.js.map +1 -1
- package/dist/mod.d.ts +35 -23
- package/dist/mod.d.ts.map +1 -1
- package/dist/mod.js +48 -45
- package/dist/mod.js.map +1 -1
- package/dist/node_modules/.pnpm/rou3@0.7.10/node_modules/rou3/dist/index.js +165 -0
- package/dist/node_modules/.pnpm/rou3@0.7.10/node_modules/rou3/dist/index.js.map +1 -0
- package/dist/packages/fragno/dist/api/bind-services.js +20 -0
- package/dist/packages/fragno/dist/api/bind-services.js.map +1 -0
- package/dist/packages/fragno/dist/api/error.js +48 -0
- package/dist/packages/fragno/dist/api/error.js.map +1 -0
- package/dist/packages/fragno/dist/api/fragment-definition-builder.js +320 -0
- package/dist/packages/fragno/dist/api/fragment-definition-builder.js.map +1 -0
- package/dist/packages/fragno/dist/api/fragment-instantiator.js +525 -0
- package/dist/packages/fragno/dist/api/fragment-instantiator.js.map +1 -0
- package/dist/packages/fragno/dist/api/fragno-response.js +73 -0
- package/dist/packages/fragno/dist/api/fragno-response.js.map +1 -0
- package/dist/packages/fragno/dist/api/internal/response-stream.js +81 -0
- package/dist/packages/fragno/dist/api/internal/response-stream.js.map +1 -0
- package/dist/packages/fragno/dist/api/internal/route.js +10 -0
- package/dist/packages/fragno/dist/api/internal/route.js.map +1 -0
- package/dist/packages/fragno/dist/api/mutable-request-state.js +97 -0
- package/dist/packages/fragno/dist/api/mutable-request-state.js.map +1 -0
- package/dist/packages/fragno/dist/api/request-context-storage.js +43 -0
- package/dist/packages/fragno/dist/api/request-context-storage.js.map +1 -0
- package/dist/packages/fragno/dist/api/request-input-context.js +118 -0
- package/dist/packages/fragno/dist/api/request-input-context.js.map +1 -0
- package/dist/packages/fragno/dist/api/request-middleware.js +83 -0
- package/dist/packages/fragno/dist/api/request-middleware.js.map +1 -0
- package/dist/packages/fragno/dist/api/request-output-context.js +119 -0
- package/dist/packages/fragno/dist/api/request-output-context.js.map +1 -0
- package/dist/packages/fragno/dist/api/route.js +17 -0
- package/dist/packages/fragno/dist/api/route.js.map +1 -0
- package/dist/packages/fragno/dist/internal/symbols.js +10 -0
- package/dist/packages/fragno/dist/internal/symbols.js.map +1 -0
- package/dist/query/column-defaults.js +27 -0
- package/dist/query/column-defaults.js.map +1 -0
- package/dist/query/cursor.d.ts +14 -6
- package/dist/query/cursor.d.ts.map +1 -1
- package/dist/query/cursor.js +16 -7
- package/dist/query/cursor.js.map +1 -1
- package/dist/query/orm/orm.d.ts +1 -1
- package/dist/query/orm/orm.js.map +1 -1
- package/dist/query/serialize/create-sql-serializer.js +30 -0
- package/dist/query/serialize/create-sql-serializer.js.map +1 -0
- package/dist/query/serialize/dialect/mysql-serializer.js +87 -0
- package/dist/query/serialize/dialect/mysql-serializer.js.map +1 -0
- package/dist/query/serialize/dialect/postgres-serializer.js +80 -0
- package/dist/query/serialize/dialect/postgres-serializer.js.map +1 -0
- package/dist/query/serialize/dialect/sqlite-serializer.js +93 -0
- package/dist/query/serialize/dialect/sqlite-serializer.js.map +1 -0
- package/dist/query/serialize/sql-serializer.js +67 -0
- package/dist/query/serialize/sql-serializer.js.map +1 -0
- package/dist/query/{query.d.ts → simple-query-interface.d.ts} +6 -6
- package/dist/query/simple-query-interface.d.ts.map +1 -0
- package/dist/query/unit-of-work/execute-unit-of-work.d.ts +133 -0
- package/dist/query/unit-of-work/execute-unit-of-work.d.ts.map +1 -0
- package/dist/query/unit-of-work/execute-unit-of-work.js +197 -0
- package/dist/query/unit-of-work/execute-unit-of-work.js.map +1 -0
- package/dist/query/unit-of-work/retry-policy.d.ts +88 -0
- package/dist/query/unit-of-work/retry-policy.d.ts.map +1 -0
- package/dist/query/unit-of-work/retry-policy.js +61 -0
- package/dist/query/unit-of-work/retry-policy.js.map +1 -0
- package/dist/query/{unit-of-work.d.ts → unit-of-work/unit-of-work.d.ts} +145 -58
- package/dist/query/unit-of-work/unit-of-work.d.ts.map +1 -0
- package/dist/query/{unit-of-work.js → unit-of-work/unit-of-work.js} +435 -198
- package/dist/query/unit-of-work/unit-of-work.js.map +1 -0
- package/dist/query/value-decoding.js +71 -0
- package/dist/query/value-decoding.js.map +1 -0
- package/dist/query/value-encoding.js +124 -0
- package/dist/query/value-encoding.js.map +1 -0
- package/dist/schema/create.d.ts +3 -0
- package/dist/schema/create.d.ts.map +1 -1
- package/dist/schema/create.js +4 -0
- package/dist/schema/create.js.map +1 -1
- package/dist/schema/type-conversion/create-sql-type-mapper.js +29 -0
- package/dist/schema/type-conversion/create-sql-type-mapper.js.map +1 -0
- package/dist/schema/type-conversion/dialect/mysql.js +57 -0
- package/dist/schema/type-conversion/dialect/mysql.js.map +1 -0
- package/dist/schema/type-conversion/dialect/postgres.js +56 -0
- package/dist/schema/type-conversion/dialect/postgres.js.map +1 -0
- package/dist/schema/type-conversion/dialect/sqlite.js +52 -0
- package/dist/schema/type-conversion/dialect/sqlite.js.map +1 -0
- package/dist/schema/type-conversion/type-mapping.js +63 -0
- package/dist/schema/type-conversion/type-mapping.js.map +1 -0
- package/dist/sql-driver/connection/connection-provider.d.ts +13 -0
- package/dist/sql-driver/connection/connection-provider.d.ts.map +1 -0
- package/dist/sql-driver/connection/connection-provider.js +19 -0
- package/dist/sql-driver/connection/connection-provider.js.map +1 -0
- package/dist/sql-driver/connection/single-connection-provider.js +23 -0
- package/dist/sql-driver/connection/single-connection-provider.js.map +1 -0
- package/dist/sql-driver/dialect-adapter/dialect-adapter.d.ts +7 -0
- package/dist/sql-driver/dialect-adapter/dialect-adapter.d.ts.map +1 -0
- package/dist/sql-driver/dialects/dialects.d.ts +2 -0
- package/dist/sql-driver/dialects/dialects.js +3 -0
- package/dist/sql-driver/dialects/durable-object-dialect.d.ts +72 -0
- package/dist/sql-driver/dialects/durable-object-dialect.d.ts.map +1 -0
- package/dist/sql-driver/dialects/durable-object-dialect.js +130 -0
- package/dist/sql-driver/dialects/durable-object-dialect.js.map +1 -0
- package/dist/sql-driver/driver/runtime-driver.d.ts +23 -0
- package/dist/sql-driver/driver/runtime-driver.d.ts.map +1 -0
- package/dist/sql-driver/driver/runtime-driver.js +56 -0
- package/dist/sql-driver/driver/runtime-driver.js.map +1 -0
- package/dist/sql-driver/query-executor/default-query-executor.js +26 -0
- package/dist/sql-driver/query-executor/default-query-executor.js.map +1 -0
- package/dist/sql-driver/query-executor/plugin.d.ts +17 -0
- package/dist/sql-driver/query-executor/plugin.d.ts.map +1 -0
- package/dist/sql-driver/query-executor/query-executor-base.js +25 -0
- package/dist/sql-driver/query-executor/query-executor-base.js.map +1 -0
- package/dist/sql-driver/query-executor/query-executor.d.ts +36 -0
- package/dist/sql-driver/query-executor/query-executor.d.ts.map +1 -0
- package/dist/sql-driver/sql-driver-adapter.d.ts +29 -0
- package/dist/sql-driver/sql-driver-adapter.d.ts.map +1 -0
- package/dist/sql-driver/sql-driver-adapter.js +68 -0
- package/dist/sql-driver/sql-driver-adapter.js.map +1 -0
- package/dist/sql-driver/sql-driver.d.ts +38 -0
- package/dist/sql-driver/sql-driver.d.ts.map +1 -0
- package/dist/sql-driver/sql-driver.js +1 -0
- package/dist/sql-driver/sql.js +50 -0
- package/dist/sql-driver/sql.js.map +1 -0
- package/dist/with-database.d.ts +32 -0
- package/dist/with-database.d.ts.map +1 -0
- package/dist/with-database.js +34 -0
- package/dist/with-database.js.map +1 -0
- package/package.json +43 -9
- package/src/adapters/adapters.ts +23 -4
- package/src/adapters/drizzle/drizzle-adapter-pglite.test.ts +140 -185
- package/src/adapters/drizzle/{drizzle-adapter-sqlite.test.ts → drizzle-adapter-sqlite3.test.ts} +187 -55
- package/src/adapters/drizzle/drizzle-adapter.ts +14 -93
- package/src/adapters/drizzle/generate.test.ts +102 -269
- package/src/adapters/drizzle/generate.ts +89 -63
- package/src/adapters/drizzle/migrate-drizzle.test.ts +19 -0
- package/src/adapters/drizzle/shared.ts +0 -34
- package/src/adapters/drizzle/test-utils.ts +36 -5
- package/src/adapters/generic-sql/README.md +14 -0
- package/src/adapters/generic-sql/driver-config.ts +144 -0
- package/src/adapters/generic-sql/generic-sql-adapter.test.ts +50 -0
- package/src/adapters/generic-sql/generic-sql-adapter.ts +146 -0
- package/src/adapters/generic-sql/generic-sql-uow-executor.ts +130 -0
- package/src/adapters/generic-sql/migration/cold-kysely.ts +55 -0
- package/src/adapters/{kysely/migration/execute-mysql.test.ts → generic-sql/migration/dialect/mysql.test.ts} +342 -484
- package/src/adapters/generic-sql/migration/dialect/mysql.ts +104 -0
- package/src/adapters/generic-sql/migration/dialect/postgres.test.ts +1008 -0
- package/src/adapters/generic-sql/migration/dialect/postgres.ts +113 -0
- package/src/adapters/{kysely/migration/execute-sqlite.test.ts → generic-sql/migration/dialect/sqlite.test.ts} +307 -510
- package/src/adapters/generic-sql/migration/dialect/sqlite.ts +189 -0
- package/src/adapters/generic-sql/migration/executor.ts +33 -0
- package/src/adapters/generic-sql/migration/prepared-migrations.test.ts +661 -0
- package/src/adapters/generic-sql/migration/prepared-migrations.ts +214 -0
- package/src/adapters/generic-sql/migration/sql-generator.ts +413 -0
- package/src/adapters/generic-sql/query/create-sql-query-compiler.ts +36 -0
- package/src/adapters/generic-sql/query/cursor-utils.ts +56 -0
- package/src/adapters/generic-sql/query/dialect/mysql.ts +34 -0
- package/src/adapters/generic-sql/query/dialect/postgres.ts +32 -0
- package/src/adapters/generic-sql/query/dialect/sqlite.ts +32 -0
- package/src/adapters/generic-sql/query/generic-sql-uow-operation-compiler.test.ts +1568 -0
- package/src/adapters/generic-sql/query/generic-sql-uow-operation-compiler.ts +314 -0
- package/src/adapters/generic-sql/query/select-builder.test.ts +256 -0
- package/src/adapters/generic-sql/query/select-builder.ts +137 -0
- package/src/adapters/generic-sql/query/sql-query-compiler.test.ts +195 -0
- package/src/adapters/generic-sql/query/sql-query-compiler.ts +367 -0
- package/src/adapters/generic-sql/query/where-builder.test.ts +744 -0
- package/src/adapters/generic-sql/query/where-builder.ts +211 -0
- package/src/adapters/generic-sql/result-interpreter.ts +102 -0
- package/src/adapters/generic-sql/test/generic-drizzle-adapter-sqlite3.test.ts +899 -0
- package/src/adapters/generic-sql/uow-decoder.test.ts +399 -0
- package/src/adapters/generic-sql/uow-decoder.ts +152 -0
- package/src/adapters/generic-sql/uow-encoder.test.ts +183 -0
- package/src/adapters/generic-sql/uow-encoder.ts +131 -0
- package/src/adapters/kysely/kysely-adapter-pglite.test.ts +90 -96
- package/src/adapters/kysely/kysely-adapter-sqlocal.test.ts +215 -0
- package/src/adapters/kysely/kysely-adapter.ts +10 -242
- package/src/adapters/{drizzle/drizzle-query.ts → shared/from-unit-of-work-compiler.ts} +111 -106
- package/src/adapters/shared/table-name-mapper.ts +50 -0
- package/src/adapters/shared/uow-operation-compiler.ts +211 -0
- package/src/db-fragment-definition-builder.test.ts +887 -0
- package/src/db-fragment-definition-builder.ts +737 -0
- package/src/db-fragment-instantiator.test.ts +543 -0
- package/src/db-fragment-integration.test.ts +406 -0
- package/src/fragments/internal-fragment.test.ts +549 -0
- package/src/fragments/internal-fragment.ts +249 -0
- package/src/hooks/hooks.test.ts +575 -0
- package/src/hooks/hooks.ts +179 -0
- package/src/migration-engine/generation-engine.test.ts +60 -27
- package/src/migration-engine/generation-engine.ts +99 -92
- package/src/mod.ts +139 -78
- package/src/query/column-defaults.ts +49 -0
- package/src/query/cursor.test.ts +147 -3
- package/src/query/cursor.ts +25 -8
- package/src/query/orm/orm.ts +1 -1
- package/src/query/query-type.test.ts +9 -9
- package/src/query/serialize/create-sql-serializer.ts +34 -0
- package/src/query/serialize/dialect/mysql-serializer.ts +142 -0
- package/src/query/serialize/dialect/postgres-serializer.ts +129 -0
- package/src/query/serialize/dialect/sqlite-serializer.test.ts +251 -0
- package/src/query/serialize/dialect/sqlite-serializer.ts +156 -0
- package/src/query/serialize/sql-serializer.ts +143 -0
- package/src/query/{query.ts → simple-query-interface.ts} +4 -4
- package/src/query/unit-of-work/execute-unit-of-work.test.ts +1310 -0
- package/src/query/unit-of-work/execute-unit-of-work.ts +504 -0
- package/src/query/unit-of-work/retry-policy.test.ts +217 -0
- package/src/query/unit-of-work/retry-policy.ts +141 -0
- package/src/query/unit-of-work/unit-of-work-coordinator.test.ts +831 -0
- package/src/query/{unit-of-work-types.test.ts → unit-of-work/unit-of-work-types.test.ts} +7 -5
- package/src/query/unit-of-work/unit-of-work.test.ts +1716 -0
- package/src/query/{unit-of-work.ts → unit-of-work/unit-of-work.ts} +716 -420
- package/src/query/{result-transform.test.ts → value-decoding.test.ts} +45 -298
- package/src/query/value-decoding.ts +113 -0
- package/src/query/value-encoding.test.ts +390 -0
- package/src/query/value-encoding.ts +168 -0
- package/src/schema/create.test.ts +5 -1
- package/src/schema/create.ts +5 -0
- package/src/schema/serialize.test.ts +165 -407
- package/src/schema/type-conversion/create-sql-type-mapper.ts +28 -0
- package/src/schema/type-conversion/dialect/mysql.ts +64 -0
- package/src/schema/type-conversion/dialect/postgres.ts +62 -0
- package/src/schema/type-conversion/dialect/sqlite.ts +63 -0
- package/src/schema/type-conversion/type-mapping.test.ts +137 -0
- package/src/schema/type-conversion/type-mapping.ts +153 -0
- package/src/shared/connection-pool.ts +5 -5
- package/src/sql-driver/better-sqlite3.test.ts +126 -0
- package/src/sql-driver/connection/connection-provider.ts +27 -0
- package/src/sql-driver/connection/single-connection-provider.ts +42 -0
- package/src/sql-driver/dialect-adapter/dialect-adapter.ts +9 -0
- package/src/sql-driver/dialect-adapter/sqlite-dialect-adapter.ts +7 -0
- package/src/sql-driver/dialects/dialects.ts +1 -0
- package/src/sql-driver/dialects/durable-object-dialect.ts +260 -0
- package/src/sql-driver/driver/runtime-driver.ts +91 -0
- package/src/sql-driver/query-executor/default-query-executor.ts +38 -0
- package/src/sql-driver/query-executor/plugin.ts +22 -0
- package/src/sql-driver/query-executor/query-executor-base.ts +53 -0
- package/src/sql-driver/query-executor/query-executor.ts +44 -0
- package/src/sql-driver/sql-driver-adapter.ts +96 -0
- package/src/sql-driver/sql-driver.ts +53 -0
- package/src/sql-driver/sql.ts +57 -0
- package/src/sql-driver/sqlocal.test.ts +117 -0
- package/src/with-database.ts +152 -0
- package/tsdown.config.ts +8 -2
- package/dist/adapters/drizzle/drizzle-connection-pool.js +0 -40
- package/dist/adapters/drizzle/drizzle-connection-pool.js.map +0 -1
- package/dist/adapters/drizzle/drizzle-query.d.ts +0 -23
- package/dist/adapters/drizzle/drizzle-query.d.ts.map +0 -1
- package/dist/adapters/drizzle/drizzle-query.js.map +0 -1
- package/dist/adapters/drizzle/drizzle-uow-compiler.d.ts +0 -10
- package/dist/adapters/drizzle/drizzle-uow-compiler.d.ts.map +0 -1
- package/dist/adapters/drizzle/drizzle-uow-compiler.js +0 -315
- package/dist/adapters/drizzle/drizzle-uow-compiler.js.map +0 -1
- package/dist/adapters/drizzle/drizzle-uow-decoder.js +0 -116
- package/dist/adapters/drizzle/drizzle-uow-decoder.js.map +0 -1
- package/dist/adapters/drizzle/drizzle-uow-executor.js +0 -149
- package/dist/adapters/drizzle/drizzle-uow-executor.js.map +0 -1
- package/dist/adapters/drizzle/join-column-utils.js +0 -28
- package/dist/adapters/drizzle/join-column-utils.js.map +0 -1
- package/dist/adapters/drizzle/shared.d.ts +0 -14
- package/dist/adapters/drizzle/shared.d.ts.map +0 -1
- package/dist/adapters/drizzle/shared.js +0 -35
- package/dist/adapters/drizzle/shared.js.map +0 -1
- package/dist/adapters/kysely/kysely-connection-pool.js +0 -41
- package/dist/adapters/kysely/kysely-connection-pool.js.map +0 -1
- package/dist/adapters/kysely/kysely-query-builder.js +0 -321
- package/dist/adapters/kysely/kysely-query-builder.js.map +0 -1
- package/dist/adapters/kysely/kysely-query-compiler.js +0 -66
- package/dist/adapters/kysely/kysely-query-compiler.js.map +0 -1
- package/dist/adapters/kysely/kysely-query.d.ts +0 -22
- package/dist/adapters/kysely/kysely-query.d.ts.map +0 -1
- package/dist/adapters/kysely/kysely-query.js +0 -223
- package/dist/adapters/kysely/kysely-query.js.map +0 -1
- package/dist/adapters/kysely/kysely-shared.d.ts.map +0 -1
- package/dist/adapters/kysely/kysely-shared.js +0 -18
- package/dist/adapters/kysely/kysely-shared.js.map +0 -1
- package/dist/adapters/kysely/kysely-uow-compiler.js +0 -170
- package/dist/adapters/kysely/kysely-uow-compiler.js.map +0 -1
- package/dist/adapters/kysely/kysely-uow-executor.js +0 -89
- package/dist/adapters/kysely/kysely-uow-executor.js.map +0 -1
- package/dist/adapters/kysely/migration/execute-base.js +0 -128
- package/dist/adapters/kysely/migration/execute-base.js.map +0 -1
- package/dist/adapters/kysely/migration/execute-factory.js +0 -34
- package/dist/adapters/kysely/migration/execute-factory.js.map +0 -1
- package/dist/adapters/kysely/migration/execute-mssql.js +0 -112
- package/dist/adapters/kysely/migration/execute-mssql.js.map +0 -1
- package/dist/adapters/kysely/migration/execute-mysql.js +0 -93
- package/dist/adapters/kysely/migration/execute-mysql.js.map +0 -1
- package/dist/adapters/kysely/migration/execute-postgres.js +0 -104
- package/dist/adapters/kysely/migration/execute-postgres.js.map +0 -1
- package/dist/adapters/kysely/migration/execute-sqlite.js +0 -123
- package/dist/adapters/kysely/migration/execute-sqlite.js.map +0 -1
- package/dist/adapters/kysely/migration/execute.js +0 -34
- package/dist/adapters/kysely/migration/execute.js.map +0 -1
- package/dist/bind-services.d.ts +0 -7
- package/dist/bind-services.d.ts.map +0 -1
- package/dist/bind-services.js +0 -14
- package/dist/bind-services.js.map +0 -1
- package/dist/fragment.d.ts +0 -173
- package/dist/fragment.d.ts.map +0 -1
- package/dist/fragment.js +0 -191
- package/dist/fragment.js.map +0 -1
- package/dist/migration-engine/create.d.ts +0 -37
- package/dist/migration-engine/create.d.ts.map +0 -1
- package/dist/migration-engine/create.js +0 -58
- package/dist/migration-engine/create.js.map +0 -1
- package/dist/migration-engine/shared.d.ts +0 -112
- package/dist/migration-engine/shared.d.ts.map +0 -1
- package/dist/query/query.d.ts.map +0 -1
- package/dist/query/result-transform.js +0 -168
- package/dist/query/result-transform.js.map +0 -1
- package/dist/query/unit-of-work.d.ts.map +0 -1
- package/dist/query/unit-of-work.js.map +0 -1
- package/dist/schema/serialize.js +0 -106
- package/dist/schema/serialize.js.map +0 -1
- package/dist/shared/settings-schema.js +0 -36
- package/dist/shared/settings-schema.js.map +0 -1
- package/src/adapters/drizzle/drizzle-adapter.test.ts +0 -170
- package/src/adapters/drizzle/drizzle-connection-pool.ts +0 -66
- package/src/adapters/drizzle/drizzle-query.test.ts +0 -499
- package/src/adapters/drizzle/drizzle-uow-compiler.test.ts +0 -1383
- package/src/adapters/drizzle/drizzle-uow-compiler.ts +0 -636
- package/src/adapters/drizzle/drizzle-uow-decoder.ts +0 -218
- package/src/adapters/drizzle/drizzle-uow-executor.ts +0 -276
- package/src/adapters/drizzle/join-column-utils.test.ts +0 -79
- package/src/adapters/drizzle/join-column-utils.ts +0 -39
- package/src/adapters/kysely/kysely-connection-pool.ts +0 -70
- package/src/adapters/kysely/kysely-query-builder.test.ts +0 -1344
- package/src/adapters/kysely/kysely-query-builder.ts +0 -666
- package/src/adapters/kysely/kysely-query-compiler.ts +0 -132
- package/src/adapters/kysely/kysely-query.test.ts +0 -498
- package/src/adapters/kysely/kysely-query.ts +0 -390
- package/src/adapters/kysely/kysely-shared.ts +0 -23
- package/src/adapters/kysely/kysely-uow-compiler.test.ts +0 -998
- package/src/adapters/kysely/kysely-uow-compiler.ts +0 -318
- package/src/adapters/kysely/kysely-uow-executor.ts +0 -145
- package/src/adapters/kysely/kysely-uow-joins.test.ts +0 -811
- package/src/adapters/kysely/migration/execute-base.ts +0 -256
- package/src/adapters/kysely/migration/execute-factory.ts +0 -53
- package/src/adapters/kysely/migration/execute-mssql.ts +0 -250
- package/src/adapters/kysely/migration/execute-mysql.ts +0 -211
- package/src/adapters/kysely/migration/execute-postgres.test.ts +0 -2657
- package/src/adapters/kysely/migration/execute-postgres.ts +0 -234
- package/src/adapters/kysely/migration/execute-sqlite.ts +0 -247
- package/src/adapters/kysely/migration/execute.ts +0 -50
- package/src/adapters/kysely/migration/kysely-migrator.test.ts +0 -261
- package/src/bind-services.test.ts +0 -214
- package/src/bind-services.ts +0 -37
- package/src/db-fragment.test.ts +0 -800
- package/src/fragment.ts +0 -727
- package/src/query/result-transform.ts +0 -271
- package/src/query/unit-of-work-multi-schema.test.ts +0 -64
- package/src/query/unit-of-work.test.ts +0 -943
- package/src/schema/serialize.ts +0 -396
- package/src/shared/settings-schema.ts +0 -61
- package/src/uow-context-integration.test.ts +0 -102
- package/src/uow-context.test.ts +0 -182
- /package/dist/query/{query.js → simple-query-interface.js} +0 -0
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"kysely-uow-compiler.js","names":["indexColumns: AnyColumn[]","orderDirection: \"asc\" | \"desc\"","orderBy: [AnyColumn, \"asc\" | \"desc\"][] | undefined","cursorCondition: Condition | undefined","combinedWhere: Condition | undefined"],"sources":["../../../src/adapters/kysely/kysely-uow-compiler.ts"],"sourcesContent":["import type { CompiledQuery, Kysely } from \"kysely\";\nimport type { AnyColumn, AnySchema, FragnoId } from \"../../schema/create\";\nimport type {\n CompiledMutation,\n MutationOperation,\n RetrievalOperation,\n UOWCompiler,\n} from \"../../query/unit-of-work\";\nimport { createKyselyQueryCompiler } from \"./kysely-query-compiler\";\nimport { createKyselyQueryBuilder } from \"./kysely-query-builder\";\nimport { buildCondition, type Condition } from \"../../query/condition-builder\";\nimport { decodeCursor, serializeCursorValues } from \"../../query/cursor\";\nimport type { AnySelectClause } from \"../../query/query\";\nimport { type TableNameMapper, createTableNameMapper } from \"./kysely-shared\";\nimport type { ConnectionPool } from \"../../shared/connection-pool\";\nimport type { SQLProvider } from \"../../shared/providers\";\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype KyselyAny = Kysely<any>;\n\n/**\n * Create a Kysely-specific Unit of Work compiler\n *\n * This compiler translates UOW operations into Kysely CompiledQuery objects\n * that can be executed as a batch/transaction.\n *\n * @param pool - Connection pool for acquiring database connections\n * @param provider - SQL provider (postgresql, mysql, sqlite, etc.)\n * @param mapper - Optional table name mapper for namespace prefixing (fallback for operations without explicit namespace)\n * @returns A UOWCompiler instance for Kysely\n */\nexport function createKyselyUOWCompiler(\n pool: ConnectionPool<KyselyAny>,\n provider: SQLProvider,\n mapper?: TableNameMapper,\n): UOWCompiler<CompiledQuery> {\n // Get kysely instance for query building (compilation doesn't execute, just builds SQL)\n const kysely = pool.getDatabaseSync();\n\n /**\n * Get the mapper for a specific operation\n * Uses operation's namespace if provided, otherwise falls back to the default mapper\n */\n function getMapperForOperation(namespace: string | undefined): TableNameMapper | undefined {\n if (namespace) {\n return createTableNameMapper(namespace);\n }\n return mapper;\n }\n\n // Cache query compilers and builders by namespace for performance\n const compilerCache = new Map<string | undefined, ReturnType<typeof createKyselyQueryCompiler>>();\n const builderCache = new Map<string | undefined, ReturnType<typeof createKyselyQueryBuilder>>();\n\n function getQueryCompiler(schema: AnySchema, namespace: string | undefined) {\n const cacheKey = namespace;\n let compiler = compilerCache.get(cacheKey);\n if (!compiler) {\n const opMapper = getMapperForOperation(namespace);\n compiler = createKyselyQueryCompiler(schema, pool, provider, opMapper);\n compilerCache.set(cacheKey, compiler);\n }\n return compiler;\n }\n\n function getQueryBuilder(namespace: string | undefined) {\n const cacheKey = namespace;\n let builder = builderCache.get(cacheKey);\n if (!builder) {\n const opMapper = getMapperForOperation(namespace);\n builder = createKyselyQueryBuilder(kysely, provider, opMapper);\n builderCache.set(cacheKey, builder);\n }\n return builder;\n }\n\n function toTable(schema: AnySchema, name: unknown) {\n const table = schema.tables[name as string];\n if (!table) {\n throw new Error(`Invalid table name ${name}.`);\n }\n return table;\n }\n\n return {\n compileRetrievalOperation(op: RetrievalOperation<AnySchema>): CompiledQuery | null {\n const queryCompiler = getQueryCompiler(op.schema, op.namespace);\n switch (op.type) {\n case \"count\": {\n return queryCompiler.count(op.table.name, {\n where: op.options.where,\n });\n }\n\n case \"find\": {\n // Map UOW FindOptions to query compiler's FindManyOptions\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 // (which is the actual primary key and maintains insertion order)\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 let cursorCondition: Condition | undefined;\n\n if ((after || before) && indexColumns.length > 0) {\n const cursor = after || before;\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, provider);\n\n // Build tuple comparison for cursor pagination\n // For \"after\" with \"asc\": (col1, col2, ...) > (val1, val2, ...)\n // For \"before\" with \"desc\": reverse the comparison\n const isAfter = !!after;\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 cursorCondition = {\n type: \"compare\",\n a: col,\n operator,\n b: val,\n };\n } else {\n // Multi-column tuple comparison - not yet supported for Kysely\n throw new Error(\n \"Multi-column cursor pagination is not yet supported in Kysely Unit of Work implementation\",\n );\n }\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 // When we have joins or need to bypass buildFindOptions, use operation-specific queryBuilder\n if (join && join.length > 0) {\n const queryBuilder = getQueryBuilder(op.namespace);\n return queryBuilder.findMany(op.table, {\n // Safe cast: select from UOW matches SimplifyFindOptions requirement\n select: (findManyOptions.select ?? true) as AnySelectClause,\n where: combinedWhere,\n orderBy,\n limit: pageSize,\n join,\n });\n }\n\n return queryCompiler.findMany(op.table.name, {\n ...findManyOptions,\n where: combinedWhere ? () => combinedWhere! : undefined,\n orderBy: orderBy?.map(([col, dir]) => [col.ormName, dir]),\n limit: pageSize,\n });\n }\n }\n },\n\n compileMutationOperation(\n op: MutationOperation<AnySchema>,\n ): CompiledMutation<CompiledQuery> | null {\n const queryCompiler = getQueryCompiler(op.schema, op.namespace);\n switch (op.type) {\n case \"create\":\n // queryCompiler.create() calls encodeValues() which handles runtime defaults\n return {\n query: queryCompiler.create(op.table, op.values),\n expectedAffectedRows: null, // creates don't need affected row checks\n };\n\n case \"update\": {\n const table = toTable(op.schema, op.table);\n const idColumn = table.getIdColumn();\n const versionColumn = table.getVersionColumn();\n\n const externalId = typeof op.id === \"string\" ? op.id : op.id.externalId;\n const versionToCheck = getVersionToCheck(op.id, op.checkVersion);\n\n // Build WHERE clause that filters by ID and optionally by version\n const whereClause =\n versionToCheck !== undefined\n ? () =>\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 const query = queryCompiler.updateMany(op.table, {\n where: whereClause,\n set: op.set,\n });\n\n return query\n ? {\n query,\n expectedAffectedRows: op.checkVersion ? 1 : null,\n }\n : null;\n }\n\n case \"delete\": {\n const table = toTable(op.schema, op.table);\n const idColumn = table.getIdColumn();\n const versionColumn = table.getVersionColumn();\n\n // Extract external ID based on whether op.id is FragnoId or string\n const externalId = typeof op.id === \"string\" ? op.id : op.id.externalId;\n const versionToCheck = getVersionToCheck(op.id, op.checkVersion);\n\n // Build WHERE clause that filters by ID and optionally by version\n const whereClause =\n versionToCheck !== undefined\n ? () =>\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 const query = queryCompiler.deleteMany(op.table, {\n where: whereClause,\n });\n\n return query\n ? {\n query,\n expectedAffectedRows: op.checkVersion ? 1 : null,\n }\n : null;\n }\n }\n },\n };\n}\n\n/**\n * Get the version to check for a given ID and checkVersion flag.\n * @returns The version to check or undefined if no check is required.\n * @throws Error if the ID is a string and checkVersion is true.\n */\nfunction getVersionToCheck(id: FragnoId | string, checkVersion: boolean): number | undefined {\n if (!checkVersion) {\n return undefined;\n }\n\n if (typeof id === \"string\") {\n throw new Error(\n `Cannot use checkVersion with a string ID. Version checking requires a FragnoId with version information.`,\n );\n }\n\n return id.version;\n}\n"],"mappings":"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"}
|
|
@@ -1,89 +0,0 @@
|
|
|
1
|
-
//#region src/adapters/kysely/kysely-uow-executor.ts
|
|
2
|
-
function getAffectedRows(result) {
|
|
3
|
-
const affectedRows = result.numAffectedRows ?? result.numChangedRows ?? ("affectedRows" in result && (typeof result["affectedRows"] === "number" || typeof result["affectedRows"] === "bigint") ? result["affectedRows"] : void 0);
|
|
4
|
-
if (affectedRows === void 0) throw new Error("No affected rows found");
|
|
5
|
-
if (affectedRows > Number.MAX_SAFE_INTEGER) throw new Error(`affectedRows BigInt value ${affectedRows.toString()} exceeds JS safe integer range`);
|
|
6
|
-
return Number(affectedRows);
|
|
7
|
-
}
|
|
8
|
-
/**
|
|
9
|
-
* Execute the retrieval phase of a Unit of Work using Kysely
|
|
10
|
-
*
|
|
11
|
-
* All retrieval queries are executed inside a single transaction to ensure
|
|
12
|
-
* snapshot isolation - all reads see a consistent view of the database.
|
|
13
|
-
*
|
|
14
|
-
* @param kysely - The Kysely database instance
|
|
15
|
-
* @param retrievalBatch - Array of compiled retrieval queries
|
|
16
|
-
* @returns Array of query results matching the retrieval operations order
|
|
17
|
-
*
|
|
18
|
-
* @example
|
|
19
|
-
* ```ts
|
|
20
|
-
* const retrievalResults = await executeKyselyRetrievalPhase(kysely, compiled.retrievalBatch);
|
|
21
|
-
* const [users, posts] = retrievalResults;
|
|
22
|
-
* ```
|
|
23
|
-
*/
|
|
24
|
-
async function executeKyselyRetrievalPhase(kysely, retrievalBatch) {
|
|
25
|
-
if (retrievalBatch.length === 0) return [];
|
|
26
|
-
const retrievalResults = [];
|
|
27
|
-
await kysely.transaction().execute(async (tx) => {
|
|
28
|
-
for (const compiledQuery of retrievalBatch) {
|
|
29
|
-
const result = await tx.executeQuery(compiledQuery);
|
|
30
|
-
retrievalResults.push(result.rows);
|
|
31
|
-
}
|
|
32
|
-
});
|
|
33
|
-
return retrievalResults;
|
|
34
|
-
}
|
|
35
|
-
/**
|
|
36
|
-
* Execute the mutation phase of a Unit of Work using Kysely
|
|
37
|
-
*
|
|
38
|
-
* All mutation queries are executed in a transaction with optimistic locking.
|
|
39
|
-
* If any version check fails, the entire transaction is rolled back and
|
|
40
|
-
* success=false is returned.
|
|
41
|
-
*
|
|
42
|
-
* @param kysely - The Kysely database instance
|
|
43
|
-
* @param mutationBatch - Array of compiled mutation queries with expected affected rows
|
|
44
|
-
* @returns Object with success flag and internal IDs from create operations
|
|
45
|
-
*
|
|
46
|
-
* @example
|
|
47
|
-
* ```ts
|
|
48
|
-
* const { success, createdInternalIds } = await executeKyselyMutationPhase(kysely, compiled.mutationBatch);
|
|
49
|
-
* if (!success) {
|
|
50
|
-
* console.log("Version conflict detected, retrying...");
|
|
51
|
-
* }
|
|
52
|
-
* ```
|
|
53
|
-
*/
|
|
54
|
-
async function executeKyselyMutationPhase(kysely, mutationBatch) {
|
|
55
|
-
if (mutationBatch.length === 0) return {
|
|
56
|
-
success: true,
|
|
57
|
-
createdInternalIds: []
|
|
58
|
-
};
|
|
59
|
-
const createdInternalIds = [];
|
|
60
|
-
try {
|
|
61
|
-
await kysely.transaction().execute(async (tx) => {
|
|
62
|
-
for (const compiledMutation of mutationBatch) {
|
|
63
|
-
const result = await tx.executeQuery(compiledMutation.query);
|
|
64
|
-
if (compiledMutation.expectedAffectedRows === null) if (Array.isArray(result.rows) && result.rows.length > 0) {
|
|
65
|
-
const row = result.rows[0];
|
|
66
|
-
if ("_internalId" in row || "_internal_id" in row) {
|
|
67
|
-
const internalId = row["_internalId"] ?? row["_internal_id"];
|
|
68
|
-
createdInternalIds.push(internalId);
|
|
69
|
-
} else createdInternalIds.push(null);
|
|
70
|
-
} else createdInternalIds.push(null);
|
|
71
|
-
else {
|
|
72
|
-
const affectedRows = getAffectedRows(result);
|
|
73
|
-
if (affectedRows !== compiledMutation.expectedAffectedRows) throw new Error(`Version conflict: expected ${compiledMutation.expectedAffectedRows} rows affected, but got ${affectedRows}`);
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
});
|
|
77
|
-
return {
|
|
78
|
-
success: true,
|
|
79
|
-
createdInternalIds
|
|
80
|
-
};
|
|
81
|
-
} catch (error) {
|
|
82
|
-
if (error instanceof Error && error.message.includes("Version conflict")) return { success: false };
|
|
83
|
-
throw error;
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
//#endregion
|
|
88
|
-
export { executeKyselyMutationPhase, executeKyselyRetrievalPhase };
|
|
89
|
-
//# sourceMappingURL=kysely-uow-executor.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"kysely-uow-executor.js","names":["retrievalResults: unknown[]","createdInternalIds: (bigint | null)[]"],"sources":["../../../src/adapters/kysely/kysely-uow-executor.ts"],"sourcesContent":["import type { CompiledQuery, Kysely, QueryResult } from \"kysely\";\nimport type { CompiledMutation, MutationResult } from \"../../query/unit-of-work\";\n\nfunction getAffectedRows(result: QueryResult<unknown>): number {\n const affectedRows =\n result.numAffectedRows ??\n result.numChangedRows ??\n // PGLite returns `affectedRows` instead of `numAffectedRows` or `numChangedRows`\n (\"affectedRows\" in result &&\n (typeof result[\"affectedRows\"] === \"number\" || typeof result[\"affectedRows\"] === \"bigint\")\n ? result[\"affectedRows\"]\n : undefined);\n\n if (affectedRows === undefined) {\n throw new Error(\"No affected rows found\");\n }\n\n if (affectedRows > Number.MAX_SAFE_INTEGER) {\n throw new Error(\n `affectedRows BigInt value ${affectedRows.toString()} exceeds JS safe integer range`,\n );\n }\n\n return Number(affectedRows);\n}\n\n/**\n * Execute the retrieval phase of a Unit of Work using Kysely\n *\n * All retrieval queries are executed inside a single transaction to ensure\n * snapshot isolation - all reads see a consistent view of the database.\n *\n * @param kysely - The Kysely database instance\n * @param retrievalBatch - Array of compiled retrieval queries\n * @returns Array of query results matching the retrieval operations order\n *\n * @example\n * ```ts\n * const retrievalResults = await executeKyselyRetrievalPhase(kysely, compiled.retrievalBatch);\n * const [users, posts] = retrievalResults;\n * ```\n */\nexport async function executeKyselyRetrievalPhase(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n kysely: Kysely<any>,\n retrievalBatch: CompiledQuery[],\n): Promise<unknown[]> {\n // If no retrieval operations, return empty array immediately\n if (retrievalBatch.length === 0) {\n return [];\n }\n\n const retrievalResults: unknown[] = [];\n\n // Execute all retrieval queries inside a transaction for snapshot isolation\n await kysely.transaction().execute(async (tx) => {\n for (const compiledQuery of retrievalBatch) {\n const result = await tx.executeQuery(compiledQuery);\n retrievalResults.push(result.rows);\n }\n });\n\n return retrievalResults;\n}\n\n/**\n * Execute the mutation phase of a Unit of Work using Kysely\n *\n * All mutation queries are executed in a transaction with optimistic locking.\n * If any version check fails, the entire transaction is rolled back and\n * success=false is returned.\n *\n * @param kysely - The Kysely database instance\n * @param mutationBatch - Array of compiled mutation queries with expected affected rows\n * @returns Object with success flag and internal IDs from create operations\n *\n * @example\n * ```ts\n * const { success, createdInternalIds } = await executeKyselyMutationPhase(kysely, compiled.mutationBatch);\n * if (!success) {\n * console.log(\"Version conflict detected, retrying...\");\n * }\n * ```\n */\nexport async function executeKyselyMutationPhase(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n kysely: Kysely<any>,\n mutationBatch: CompiledMutation<CompiledQuery>[],\n): Promise<MutationResult> {\n // If there are no mutations, return success immediately\n if (mutationBatch.length === 0) {\n return { success: true, createdInternalIds: [] };\n }\n\n const createdInternalIds: (bigint | null)[] = [];\n\n // Execute mutation batch in a transaction\n try {\n await kysely.transaction().execute(async (tx) => {\n for (const compiledMutation of mutationBatch) {\n const result = await tx.executeQuery(compiledMutation.query);\n\n // For creates (expectedAffectedRows === null), try to extract internal ID\n if (compiledMutation.expectedAffectedRows === null) {\n // Check if result has rows (RETURNING clause supported)\n if (Array.isArray(result.rows) && result.rows.length > 0) {\n const row = result.rows[0] as Record<string, unknown>;\n if (\"_internalId\" in row || \"_internal_id\" in row) {\n const internalId = (row[\"_internalId\"] ?? row[\"_internal_id\"]) as bigint;\n createdInternalIds.push(internalId);\n } else {\n // RETURNING supported but _internalId not found\n createdInternalIds.push(null);\n }\n } else {\n // No RETURNING support (e.g., MySQL)\n createdInternalIds.push(null);\n }\n } else {\n // Check affected rows for updates/deletes\n const affectedRows = getAffectedRows(result);\n\n if (affectedRows !== compiledMutation.expectedAffectedRows) {\n // Version conflict detected - the UPDATE/DELETE didn't affect the expected number of rows\n // This means either the row doesn't exist or the version has changed\n throw new Error(\n `Version conflict: expected ${compiledMutation.expectedAffectedRows} rows affected, but got ${affectedRows}`,\n );\n }\n }\n }\n });\n\n return { success: true, createdInternalIds };\n } catch (error) {\n // Transaction failed - could be version conflict or other constraint violation\n // Return success=false to indicate the UOW should be retried\n if (error instanceof Error && error.message.includes(\"Version conflict\")) {\n return { success: false };\n }\n\n // Other database errors should be thrown\n throw error;\n }\n}\n"],"mappings":";AAGA,SAAS,gBAAgB,QAAsC;CAC7D,MAAM,eACJ,OAAO,mBACP,OAAO,mBAEN,kBAAkB,WAClB,OAAO,OAAO,oBAAoB,YAAY,OAAO,OAAO,oBAAoB,YAC7E,OAAO,kBACP;AAEN,KAAI,iBAAiB,OACnB,OAAM,IAAI,MAAM,yBAAyB;AAG3C,KAAI,eAAe,OAAO,iBACxB,OAAM,IAAI,MACR,6BAA6B,aAAa,UAAU,CAAC,gCACtD;AAGH,QAAO,OAAO,aAAa;;;;;;;;;;;;;;;;;;AAmB7B,eAAsB,4BAEpB,QACA,gBACoB;AAEpB,KAAI,eAAe,WAAW,EAC5B,QAAO,EAAE;CAGX,MAAMA,mBAA8B,EAAE;AAGtC,OAAM,OAAO,aAAa,CAAC,QAAQ,OAAO,OAAO;AAC/C,OAAK,MAAM,iBAAiB,gBAAgB;GAC1C,MAAM,SAAS,MAAM,GAAG,aAAa,cAAc;AACnD,oBAAiB,KAAK,OAAO,KAAK;;GAEpC;AAEF,QAAO;;;;;;;;;;;;;;;;;;;;;AAsBT,eAAsB,2BAEpB,QACA,eACyB;AAEzB,KAAI,cAAc,WAAW,EAC3B,QAAO;EAAE,SAAS;EAAM,oBAAoB,EAAE;EAAE;CAGlD,MAAMC,qBAAwC,EAAE;AAGhD,KAAI;AACF,QAAM,OAAO,aAAa,CAAC,QAAQ,OAAO,OAAO;AAC/C,QAAK,MAAM,oBAAoB,eAAe;IAC5C,MAAM,SAAS,MAAM,GAAG,aAAa,iBAAiB,MAAM;AAG5D,QAAI,iBAAiB,yBAAyB,KAE5C,KAAI,MAAM,QAAQ,OAAO,KAAK,IAAI,OAAO,KAAK,SAAS,GAAG;KACxD,MAAM,MAAM,OAAO,KAAK;AACxB,SAAI,iBAAiB,OAAO,kBAAkB,KAAK;MACjD,MAAM,aAAc,IAAI,kBAAkB,IAAI;AAC9C,yBAAmB,KAAK,WAAW;WAGnC,oBAAmB,KAAK,KAAK;UAI/B,oBAAmB,KAAK,KAAK;SAE1B;KAEL,MAAM,eAAe,gBAAgB,OAAO;AAE5C,SAAI,iBAAiB,iBAAiB,qBAGpC,OAAM,IAAI,MACR,8BAA8B,iBAAiB,qBAAqB,0BAA0B,eAC/F;;;IAIP;AAEF,SAAO;GAAE,SAAS;GAAM;GAAoB;UACrC,OAAO;AAGd,MAAI,iBAAiB,SAAS,MAAM,QAAQ,SAAS,mBAAmB,CACtE,QAAO,EAAE,SAAS,OAAO;AAI3B,QAAM"}
|
|
@@ -1,128 +0,0 @@
|
|
|
1
|
-
import { schemaToDBType } from "../../../schema/serialize.js";
|
|
2
|
-
import { SETTINGS_TABLE_NAME } from "../../../shared/settings-schema.js";
|
|
3
|
-
import { sql } from "kysely";
|
|
4
|
-
|
|
5
|
-
//#region src/adapters/kysely/migration/execute-base.ts
|
|
6
|
-
/**
|
|
7
|
-
* Base migration executor with common functionality.
|
|
8
|
-
* Provider-specific executors should extend this class.
|
|
9
|
-
*/
|
|
10
|
-
var BaseMigrationExecutor = class {
|
|
11
|
-
constructor(db, provider) {
|
|
12
|
-
this.db = db;
|
|
13
|
-
this.provider = provider;
|
|
14
|
-
}
|
|
15
|
-
/**
|
|
16
|
-
* Default implementation: no preprocessing, no metadata.
|
|
17
|
-
* Providers can override to transform operations.
|
|
18
|
-
*/
|
|
19
|
-
preprocessOperations(operations) {
|
|
20
|
-
return operations;
|
|
21
|
-
}
|
|
22
|
-
/**
|
|
23
|
-
* Get table name, applying namespace mapping if provided.
|
|
24
|
-
* Settings table is never namespaced.
|
|
25
|
-
*/
|
|
26
|
-
getTableName(tableName, mapper) {
|
|
27
|
-
return tableName === SETTINGS_TABLE_NAME ? tableName : mapper ? mapper.toPhysical(tableName) : tableName;
|
|
28
|
-
}
|
|
29
|
-
/**
|
|
30
|
-
* Get column builder callback for creating/altering columns.
|
|
31
|
-
*/
|
|
32
|
-
getColumnBuilderCallback(col) {
|
|
33
|
-
return (build) => {
|
|
34
|
-
if (!col.isNullable) build = build.notNull();
|
|
35
|
-
if (col.role === "internal-id") {
|
|
36
|
-
build = build.primaryKey();
|
|
37
|
-
if (this.provider === "postgresql" || this.provider === "cockroachdb") {} else if (this.provider === "mysql") build = build.autoIncrement();
|
|
38
|
-
else if (this.provider === "sqlite") build = build.autoIncrement();
|
|
39
|
-
else if (this.provider === "mssql") build = build.identity();
|
|
40
|
-
}
|
|
41
|
-
if (col.role === "external-id") build = build.unique();
|
|
42
|
-
const defaultValue = this.defaultValueToDB(col);
|
|
43
|
-
if (defaultValue) build = build.defaultTo(defaultValue);
|
|
44
|
-
return build;
|
|
45
|
-
};
|
|
46
|
-
}
|
|
47
|
-
/**
|
|
48
|
-
* Convert column default value to database representation.
|
|
49
|
-
*/
|
|
50
|
-
defaultValueToDB(column) {
|
|
51
|
-
const value = column.default;
|
|
52
|
-
if (!value) return;
|
|
53
|
-
if (this.provider === "mysql" && column.type === "string") return;
|
|
54
|
-
if ("value" in value && value.value !== void 0) return sql.lit(value.value);
|
|
55
|
-
if ("dbSpecial" in value && value.dbSpecial === "now") return sql`CURRENT_TIMESTAMP`;
|
|
56
|
-
if ("runtime" in value) return;
|
|
57
|
-
}
|
|
58
|
-
/**
|
|
59
|
-
* Wrap a raw SQL builder in an ExecuteNode.
|
|
60
|
-
*/
|
|
61
|
-
rawToNode(raw) {
|
|
62
|
-
return {
|
|
63
|
-
compile: () => raw.compile(this.db),
|
|
64
|
-
execute: () => raw.execute(this.db)
|
|
65
|
-
};
|
|
66
|
-
}
|
|
67
|
-
/**
|
|
68
|
-
* Get the database type string for a column.
|
|
69
|
-
*/
|
|
70
|
-
getDBType(col) {
|
|
71
|
-
return schemaToDBType(col, this.provider);
|
|
72
|
-
}
|
|
73
|
-
};
|
|
74
|
-
/**
|
|
75
|
-
* Returns the appropriate foreign key action based on the provider.
|
|
76
|
-
* MSSQL doesn't support RESTRICT, so we use NO ACTION (functionally equivalent).
|
|
77
|
-
*/
|
|
78
|
-
function getForeignKeyAction(provider) {
|
|
79
|
-
return provider === "mssql" ? "no action" : "restrict";
|
|
80
|
-
}
|
|
81
|
-
/**
|
|
82
|
-
* Generates MSSQL default constraint name following the DF_tableName_columnName pattern.
|
|
83
|
-
*/
|
|
84
|
-
function getMssqlDefaultConstraintName(tableName, columnName) {
|
|
85
|
-
return `DF_${tableName}_${columnName}`;
|
|
86
|
-
}
|
|
87
|
-
/**
|
|
88
|
-
* Generate SQL to drop MSSQL default constraint.
|
|
89
|
-
*/
|
|
90
|
-
function mssqlDropDefaultConstraint(tableName, columnName) {
|
|
91
|
-
return sql`
|
|
92
|
-
DECLARE @ConstraintName NVARCHAR(200);
|
|
93
|
-
|
|
94
|
-
SELECT @ConstraintName = dc.name
|
|
95
|
-
FROM sys.default_constraints dc
|
|
96
|
-
JOIN sys.columns c ON dc.parent_object_id = c.object_id AND dc.parent_column_id = c.column_id
|
|
97
|
-
JOIN sys.tables t ON t.object_id = c.object_id
|
|
98
|
-
JOIN sys.schemas s ON t.schema_id = s.schema_id
|
|
99
|
-
WHERE s.name = 'dbo' AND t.name = ${sql.lit(tableName)} AND c.name = ${sql.lit(columnName)};
|
|
100
|
-
|
|
101
|
-
IF @ConstraintName IS NOT NULL
|
|
102
|
-
BEGIN
|
|
103
|
-
EXEC('ALTER TABLE [dbo].[' + ${sql.lit(tableName)} + '] DROP CONSTRAINT [' + @ConstraintName + ']');
|
|
104
|
-
END`;
|
|
105
|
-
}
|
|
106
|
-
/**
|
|
107
|
-
* Create a unique index with provider-specific handling.
|
|
108
|
-
*/
|
|
109
|
-
function createUniqueIndex(db, name, tableName, cols, provider) {
|
|
110
|
-
const query = db.schema.createIndex(name).on(tableName).columns(cols).unique();
|
|
111
|
-
if (provider === "mssql") return query.where((b) => {
|
|
112
|
-
return b.and(cols.map((col) => b(col, "is not", null)));
|
|
113
|
-
});
|
|
114
|
-
return query;
|
|
115
|
-
}
|
|
116
|
-
/**
|
|
117
|
-
* Drop a unique index with provider-specific handling.
|
|
118
|
-
*/
|
|
119
|
-
function dropUniqueIndex(db, name, tableName, provider) {
|
|
120
|
-
let query = db.schema.dropIndex(name).ifExists();
|
|
121
|
-
if (provider === "cockroachdb") query = query.cascade();
|
|
122
|
-
if (provider === "mssql") query = query.on(tableName);
|
|
123
|
-
return query;
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
//#endregion
|
|
127
|
-
export { BaseMigrationExecutor, createUniqueIndex, dropUniqueIndex, getForeignKeyAction, getMssqlDefaultConstraintName, mssqlDropDefaultConstraint };
|
|
128
|
-
//# sourceMappingURL=execute-base.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"execute-base.js","names":["db: KyselyAny","provider: SQLProvider"],"sources":["../../../../src/adapters/kysely/migration/execute-base.ts"],"sourcesContent":["import { type ColumnBuilderCallback, type Kysely, type RawBuilder, sql } from \"kysely\";\nimport type {\n ColumnInfo,\n MigrationOperation,\n MigrationOperationMetadata,\n} from \"../../../migration-engine/shared\";\nimport type { SQLProvider } from \"../../../shared/providers\";\nimport { schemaToDBType } from \"../../../schema/serialize\";\nimport type { TableNameMapper } from \"../kysely-shared\";\nimport { SETTINGS_TABLE_NAME } from \"../../../shared/settings-schema\";\n\nexport type ExecuteNode = {\n compile(): { sql: string; parameters: readonly unknown[] };\n execute(): Promise<unknown>;\n};\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype KyselyAny = Kysely<any>;\n\n/**\n * Migration executor interface.\n * Each provider implements this to handle database-specific migration execution.\n */\nexport interface MigrationExecutor<\n TMeta extends MigrationOperationMetadata = MigrationOperationMetadata,\n> {\n /**\n * Preprocess operations before execution.\n * Allows executors to combine, split, or transform operations based on provider capabilities.\n *\n * For example, SQLite can merge add-foreign-key operations into create-table operations.\n */\n preprocessOperations(operations: MigrationOperation[]): MigrationOperation<TMeta>[];\n\n /**\n * Execute a single migration operation.\n */\n executeOperation(\n operation: MigrationOperation<TMeta>,\n mapper?: TableNameMapper,\n ): ExecuteNode | ExecuteNode[];\n}\n\n/**\n * Base migration executor with common functionality.\n * Provider-specific executors should extend this class.\n */\nexport abstract class BaseMigrationExecutor<\n TMeta extends MigrationOperationMetadata = MigrationOperationMetadata,\n> implements MigrationExecutor<TMeta>\n{\n constructor(\n protected readonly db: KyselyAny,\n protected readonly provider: SQLProvider,\n ) {}\n\n /**\n * Default implementation: no preprocessing, no metadata.\n * Providers can override to transform operations.\n */\n preprocessOperations(operations: MigrationOperation[]): MigrationOperation<TMeta>[] {\n return operations as MigrationOperation<TMeta>[];\n }\n\n /**\n * Execute a single migration operation.\n * Must be implemented by provider-specific executors.\n */\n abstract executeOperation(\n operation: MigrationOperation<TMeta>,\n mapper?: TableNameMapper,\n ): ExecuteNode | ExecuteNode[];\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 return tableName === SETTINGS_TABLE_NAME\n ? tableName\n : mapper\n ? mapper.toPhysical(tableName)\n : tableName;\n }\n\n /**\n * Get column builder callback for creating/altering columns.\n */\n protected getColumnBuilderCallback(col: ColumnInfo): ColumnBuilderCallback {\n return (build) => {\n if (!col.isNullable) {\n build = build.notNull();\n }\n\n // Internal ID is the primary key with auto-increment\n if (col.role === \"internal-id\") {\n build = build.primaryKey();\n // Auto-increment for internal ID\n if (this.provider === \"postgresql\" || this.provider === \"cockroachdb\") {\n // SERIAL/BIGSERIAL handles auto-increment\n // Already handled in schemaToDBType\n } else if (this.provider === \"mysql\") {\n build = build.autoIncrement();\n } else if (this.provider === \"sqlite\") {\n build = build.autoIncrement();\n } else if (this.provider === \"mssql\") {\n build = build.identity();\n }\n }\n\n // External ID must be unique\n if (col.role === \"external-id\") {\n build = build.unique();\n }\n\n const defaultValue = this.defaultValueToDB(col);\n if (defaultValue) {\n build = build.defaultTo(defaultValue);\n }\n return build;\n };\n }\n\n /**\n * Convert column default value to database representation.\n */\n protected defaultValueToDB(column: ColumnInfo): RawBuilder<unknown> | undefined {\n const value = column.default;\n if (!value) {\n return undefined;\n }\n\n // MySQL doesn't support default values for TEXT columns\n if (this.provider === \"mysql\" && column.type === \"string\") {\n return undefined;\n }\n\n // Static default values: defaultTo(value)\n if (\"value\" in value && value.value !== undefined) {\n return sql.lit(value.value);\n }\n\n // Database-level special functions: defaultTo(b => b.now())\n if (\"dbSpecial\" in value && value.dbSpecial === \"now\") {\n return sql`CURRENT_TIMESTAMP`;\n }\n\n // Runtime defaults (defaultTo$) are NOT generated in SQL - they're handled in application code\n if (\"runtime\" in value) {\n return undefined;\n }\n\n return undefined;\n }\n\n /**\n * Wrap a raw SQL builder in an ExecuteNode.\n */\n protected rawToNode(raw: RawBuilder<unknown>): ExecuteNode {\n return {\n compile: () => raw.compile(this.db),\n execute: () => raw.execute(this.db),\n };\n }\n\n /**\n * Get the database type string for a column.\n */\n protected getDBType(col: ColumnInfo): string {\n return schemaToDBType(col, this.provider);\n }\n}\n\n// ============================================================================\n// Provider-Specific Helper Functions\n// ============================================================================\n\n/**\n * Returns the appropriate foreign key action based on the provider.\n * MSSQL doesn't support RESTRICT, so we use NO ACTION (functionally equivalent).\n */\nexport function getForeignKeyAction(provider: SQLProvider): \"restrict\" | \"no action\" {\n return provider === \"mssql\" ? \"no action\" : \"restrict\";\n}\n\n/**\n * Generates MSSQL default constraint name following the DF_tableName_columnName pattern.\n */\nexport function getMssqlDefaultConstraintName(tableName: string, columnName: string): string {\n const MSSQL_DEFAULT_CONSTRAINT_PREFIX = \"DF\" as const;\n return `${MSSQL_DEFAULT_CONSTRAINT_PREFIX}_${tableName}_${columnName}`;\n}\n\n/**\n * Generate SQL to drop MSSQL default constraint.\n */\nexport function mssqlDropDefaultConstraint(tableName: string, columnName: string) {\n return sql`\nDECLARE @ConstraintName NVARCHAR(200);\n\nSELECT @ConstraintName = dc.name\nFROM sys.default_constraints dc\nJOIN sys.columns c ON dc.parent_object_id = c.object_id AND dc.parent_column_id = c.column_id\nJOIN sys.tables t ON t.object_id = c.object_id\nJOIN sys.schemas s ON t.schema_id = s.schema_id\nWHERE s.name = 'dbo' AND t.name = ${sql.lit(tableName)} AND c.name = ${sql.lit(columnName)};\n\nIF @ConstraintName IS NOT NULL\nBEGIN\n EXEC('ALTER TABLE [dbo].[' + ${sql.lit(tableName)} + '] DROP CONSTRAINT [' + @ConstraintName + ']');\nEND`;\n}\n\n/**\n * Create a unique index with provider-specific handling.\n */\nexport function createUniqueIndex(\n db: KyselyAny,\n name: string,\n tableName: string,\n cols: string[],\n provider: SQLProvider,\n) {\n const query = db.schema.createIndex(name).on(tableName).columns(cols).unique();\n\n if (provider === \"mssql\") {\n // MSSQL: ignore null values in unique indexes by default\n return query.where((b) => {\n return b.and(cols.map((col) => b(col, \"is not\", null)));\n });\n }\n\n return query;\n}\n\n/**\n * Drop a unique index with provider-specific handling.\n */\nexport function dropUniqueIndex(\n db: KyselyAny,\n name: string,\n tableName: string,\n provider: SQLProvider,\n) {\n let query = db.schema.dropIndex(name).ifExists();\n\n if (provider === \"cockroachdb\") {\n query = query.cascade();\n }\n\n if (provider === \"mssql\") {\n query = query.on(tableName);\n }\n\n return query;\n}\n"],"mappings":";;;;;;;;;AA+CA,IAAsB,wBAAtB,MAGA;CACE,YACE,AAAmBA,IACnB,AAAmBC,UACnB;EAFmB;EACA;;;;;;CAOrB,qBAAqB,YAA+D;AAClF,SAAO;;;;;;CAgBT,AAAU,aAAa,WAAmB,QAAkC;AAC1E,SAAO,cAAc,sBACjB,YACA,SACE,OAAO,WAAW,UAAU,GAC5B;;;;;CAMR,AAAU,yBAAyB,KAAwC;AACzE,UAAQ,UAAU;AAChB,OAAI,CAAC,IAAI,WACP,SAAQ,MAAM,SAAS;AAIzB,OAAI,IAAI,SAAS,eAAe;AAC9B,YAAQ,MAAM,YAAY;AAE1B,QAAI,KAAK,aAAa,gBAAgB,KAAK,aAAa,eAAe,YAG5D,KAAK,aAAa,QAC3B,SAAQ,MAAM,eAAe;aACpB,KAAK,aAAa,SAC3B,SAAQ,MAAM,eAAe;aACpB,KAAK,aAAa,QAC3B,SAAQ,MAAM,UAAU;;AAK5B,OAAI,IAAI,SAAS,cACf,SAAQ,MAAM,QAAQ;GAGxB,MAAM,eAAe,KAAK,iBAAiB,IAAI;AAC/C,OAAI,aACF,SAAQ,MAAM,UAAU,aAAa;AAEvC,UAAO;;;;;;CAOX,AAAU,iBAAiB,QAAqD;EAC9E,MAAM,QAAQ,OAAO;AACrB,MAAI,CAAC,MACH;AAIF,MAAI,KAAK,aAAa,WAAW,OAAO,SAAS,SAC/C;AAIF,MAAI,WAAW,SAAS,MAAM,UAAU,OACtC,QAAO,IAAI,IAAI,MAAM,MAAM;AAI7B,MAAI,eAAe,SAAS,MAAM,cAAc,MAC9C,QAAO,GAAG;AAIZ,MAAI,aAAa,MACf;;;;;CASJ,AAAU,UAAU,KAAuC;AACzD,SAAO;GACL,eAAe,IAAI,QAAQ,KAAK,GAAG;GACnC,eAAe,IAAI,QAAQ,KAAK,GAAG;GACpC;;;;;CAMH,AAAU,UAAU,KAAyB;AAC3C,SAAO,eAAe,KAAK,KAAK,SAAS;;;;;;;AAY7C,SAAgB,oBAAoB,UAAiD;AACnF,QAAO,aAAa,UAAU,cAAc;;;;;AAM9C,SAAgB,8BAA8B,WAAmB,YAA4B;AAE3F,QAAO,MAAsC,UAAU,GAAG;;;;;AAM5D,SAAgB,2BAA2B,WAAmB,YAAoB;AAChF,QAAO,GAAG;;;;;;;;oCAQwB,IAAI,IAAI,UAAU,CAAC,gBAAgB,IAAI,IAAI,WAAW,CAAC;;;;mCAIxD,IAAI,IAAI,UAAU,CAAC;;;;;;AAOtD,SAAgB,kBACd,IACA,MACA,WACA,MACA,UACA;CACA,MAAM,QAAQ,GAAG,OAAO,YAAY,KAAK,CAAC,GAAG,UAAU,CAAC,QAAQ,KAAK,CAAC,QAAQ;AAE9E,KAAI,aAAa,QAEf,QAAO,MAAM,OAAO,MAAM;AACxB,SAAO,EAAE,IAAI,KAAK,KAAK,QAAQ,EAAE,KAAK,UAAU,KAAK,CAAC,CAAC;GACvD;AAGJ,QAAO;;;;;AAMT,SAAgB,gBACd,IACA,MACA,WACA,UACA;CACA,IAAI,QAAQ,GAAG,OAAO,UAAU,KAAK,CAAC,UAAU;AAEhD,KAAI,aAAa,cACf,SAAQ,MAAM,SAAS;AAGzB,KAAI,aAAa,QACf,SAAQ,MAAM,GAAG,UAAU;AAG7B,QAAO"}
|
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
import { SqliteMigrationExecutor } from "./execute-sqlite.js";
|
|
2
|
-
import { PostgresMigrationExecutor } from "./execute-postgres.js";
|
|
3
|
-
import { MysqlMigrationExecutor } from "./execute-mysql.js";
|
|
4
|
-
import { MssqlMigrationExecutor } from "./execute-mssql.js";
|
|
5
|
-
|
|
6
|
-
//#region src/adapters/kysely/migration/execute-factory.ts
|
|
7
|
-
/**
|
|
8
|
-
* Create a provider-specific migration executor.
|
|
9
|
-
*/
|
|
10
|
-
function createMigrationExecutor(config) {
|
|
11
|
-
const { provider } = config;
|
|
12
|
-
const dbOrFactory = config.db;
|
|
13
|
-
let kysely;
|
|
14
|
-
if (typeof dbOrFactory === "function") {
|
|
15
|
-
const result = dbOrFactory();
|
|
16
|
-
if (result && typeof result.then === "function") throw new Error("Cannot create migration executor with async database factory. Database must be initialized before calling preprocessOperations.");
|
|
17
|
-
kysely = result;
|
|
18
|
-
} else kysely = dbOrFactory;
|
|
19
|
-
switch (provider) {
|
|
20
|
-
case "sqlite": return new SqliteMigrationExecutor(kysely, provider);
|
|
21
|
-
case "postgresql":
|
|
22
|
-
case "cockroachdb": return new PostgresMigrationExecutor(kysely, provider);
|
|
23
|
-
case "mysql": return new MysqlMigrationExecutor(kysely, provider);
|
|
24
|
-
case "mssql": return new MssqlMigrationExecutor(kysely, provider);
|
|
25
|
-
default: {
|
|
26
|
-
const _exhaustive = provider;
|
|
27
|
-
throw new Error(`Unsupported provider: ${_exhaustive}`);
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
//#endregion
|
|
33
|
-
export { createMigrationExecutor };
|
|
34
|
-
//# sourceMappingURL=execute-factory.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"execute-factory.js","names":["kysely: KyselyAny","_exhaustive: never"],"sources":["../../../../src/adapters/kysely/migration/execute-factory.ts"],"sourcesContent":["import type { Kysely } from \"kysely\";\nimport type { KyselyConfig } from \"../kysely-adapter\";\nimport type { MigrationExecutor } from \"./execute-base\";\nimport { SqliteMigrationExecutor } from \"./execute-sqlite\";\nimport { PostgresMigrationExecutor } from \"./execute-postgres\";\nimport { MysqlMigrationExecutor } from \"./execute-mysql\";\nimport { MssqlMigrationExecutor } from \"./execute-mssql\";\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype KyselyAny = Kysely<any>;\n\n/**\n * Create a provider-specific migration executor.\n */\nexport function createMigrationExecutor(config: KyselyConfig): MigrationExecutor {\n const { provider } = config;\n // Resolve db instance synchronously\n // Safe cast: This is only called from synchronous contexts where the db must be available\n const dbOrFactory = config.db;\n let kysely: KyselyAny;\n\n if (typeof dbOrFactory === \"function\") {\n const result = dbOrFactory();\n // Check if it's a Promise - if so, this is an error in usage\n if (result && typeof (result as Promise<unknown>).then === \"function\") {\n throw new Error(\n \"Cannot create migration executor with async database factory. \" +\n \"Database must be initialized before calling preprocessOperations.\",\n );\n }\n // Safe cast: We've verified it's not a Promise\n kysely = result as KyselyAny;\n } else {\n kysely = dbOrFactory;\n }\n\n switch (provider) {\n case \"sqlite\":\n return new SqliteMigrationExecutor(kysely, provider);\n case \"postgresql\":\n case \"cockroachdb\":\n return new PostgresMigrationExecutor(kysely, provider);\n case \"mysql\":\n return new MysqlMigrationExecutor(kysely, provider);\n case \"mssql\":\n return new MssqlMigrationExecutor(kysely, provider);\n default: {\n // Ensure exhaustive switch\n const _exhaustive: never = provider;\n throw new Error(`Unsupported provider: ${_exhaustive}`);\n }\n }\n}\n"],"mappings":";;;;;;;;;AAcA,SAAgB,wBAAwB,QAAyC;CAC/E,MAAM,EAAE,aAAa;CAGrB,MAAM,cAAc,OAAO;CAC3B,IAAIA;AAEJ,KAAI,OAAO,gBAAgB,YAAY;EACrC,MAAM,SAAS,aAAa;AAE5B,MAAI,UAAU,OAAQ,OAA4B,SAAS,WACzD,OAAM,IAAI,MACR,kIAED;AAGH,WAAS;OAET,UAAS;AAGX,SAAQ,UAAR;EACE,KAAK,SACH,QAAO,IAAI,wBAAwB,QAAQ,SAAS;EACtD,KAAK;EACL,KAAK,cACH,QAAO,IAAI,0BAA0B,QAAQ,SAAS;EACxD,KAAK,QACH,QAAO,IAAI,uBAAuB,QAAQ,SAAS;EACrD,KAAK,QACH,QAAO,IAAI,uBAAuB,QAAQ,SAAS;EACrD,SAAS;GAEP,MAAMC,cAAqB;AAC3B,SAAM,IAAI,MAAM,yBAAyB,cAAc"}
|
|
@@ -1,112 +0,0 @@
|
|
|
1
|
-
import { isUpdated } from "../../../migration-engine/shared.js";
|
|
2
|
-
import { BaseMigrationExecutor, createUniqueIndex, dropUniqueIndex, getForeignKeyAction, getMssqlDefaultConstraintName, mssqlDropDefaultConstraint } from "./execute-base.js";
|
|
3
|
-
import { sql } from "kysely";
|
|
4
|
-
|
|
5
|
-
//#region src/adapters/kysely/migration/execute-mssql.ts
|
|
6
|
-
const errors = { IdColumnUpdate: "ID columns cannot be updated. Not every database supports updating primary keys and often requires workarounds." };
|
|
7
|
-
/**
|
|
8
|
-
* MSSQL-specific migration executor.
|
|
9
|
-
* Handles complex default constraint management and uses sp_rename for table renames.
|
|
10
|
-
*/
|
|
11
|
-
var MssqlMigrationExecutor = class extends BaseMigrationExecutor {
|
|
12
|
-
executeOperation(operation, mapper) {
|
|
13
|
-
switch (operation.type) {
|
|
14
|
-
case "create-table": return this.createTable(operation, mapper);
|
|
15
|
-
case "rename-table": return this.renameTable(operation, mapper);
|
|
16
|
-
case "alter-table": return this.alterTable(operation, mapper);
|
|
17
|
-
case "drop-table": return this.dropTable(operation, mapper);
|
|
18
|
-
case "add-foreign-key": return this.addForeignKey(operation, mapper);
|
|
19
|
-
case "drop-foreign-key": return this.dropForeignKey(operation, mapper);
|
|
20
|
-
case "add-index": return this.addIndex(operation, mapper);
|
|
21
|
-
case "drop-index": return this.dropIndex(operation, mapper);
|
|
22
|
-
case "custom": return this.handleCustomOperation(operation);
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
createTable(operation, mapper) {
|
|
26
|
-
const tableName = this.getTableName(operation.name, mapper);
|
|
27
|
-
let builder = this.db.schema.createTable(tableName);
|
|
28
|
-
for (const columnInfo of operation.columns) builder = builder.addColumn(columnInfo.name, sql.raw(this.getDBType(columnInfo)), this.getColumnBuilderCallback(columnInfo));
|
|
29
|
-
return builder;
|
|
30
|
-
}
|
|
31
|
-
renameTable(operation, mapper) {
|
|
32
|
-
return this.rawToNode(sql`EXEC sp_rename ${sql.lit(this.getTableName(operation.from, mapper))}, ${sql.lit(this.getTableName(operation.to, mapper))}`);
|
|
33
|
-
}
|
|
34
|
-
alterTable(operation, mapper) {
|
|
35
|
-
const results = [];
|
|
36
|
-
const tableName = this.getTableName(operation.name, mapper);
|
|
37
|
-
for (const columnOp of operation.value) results.push(...this.executeColumnOperation(tableName, columnOp));
|
|
38
|
-
return results;
|
|
39
|
-
}
|
|
40
|
-
executeColumnOperation(tableName, operation) {
|
|
41
|
-
const next = () => this.db.schema.alterTable(tableName);
|
|
42
|
-
const results = [];
|
|
43
|
-
switch (operation.type) {
|
|
44
|
-
case "rename-column":
|
|
45
|
-
results.push(next().renameColumn(operation.from, operation.to));
|
|
46
|
-
return results;
|
|
47
|
-
case "drop-column":
|
|
48
|
-
results.push(next().dropColumn(operation.name));
|
|
49
|
-
return results;
|
|
50
|
-
case "create-column": {
|
|
51
|
-
const col = operation.value;
|
|
52
|
-
results.push(next().addColumn(col.name, sql.raw(this.getDBType(col)), this.getColumnBuilderCallback(col)));
|
|
53
|
-
return results;
|
|
54
|
-
}
|
|
55
|
-
case "update-column": {
|
|
56
|
-
const col = operation.value;
|
|
57
|
-
if (col.role === "external-id" || col.role === "internal-id") throw new Error(errors.IdColumnUpdate);
|
|
58
|
-
if (!isUpdated(operation)) return results;
|
|
59
|
-
const mssqlRecreateDefaultConstraint = operation.updateDataType || operation.updateDefault;
|
|
60
|
-
if (mssqlRecreateDefaultConstraint) results.push(this.rawToNode(mssqlDropDefaultConstraint(tableName, col.name)));
|
|
61
|
-
if (operation.updateDataType) {
|
|
62
|
-
const dbType = sql.raw(this.getDBType(col));
|
|
63
|
-
results.push(next().alterColumn(operation.name, (b) => b.setDataType(dbType)));
|
|
64
|
-
}
|
|
65
|
-
if (operation.updateNullable) results.push(next().alterColumn(operation.name, (build) => col.isNullable ? build.dropNotNull() : build.setNotNull()));
|
|
66
|
-
if (mssqlRecreateDefaultConstraint) {
|
|
67
|
-
const defaultValue = this.defaultValueToDB(col);
|
|
68
|
-
if (defaultValue) {
|
|
69
|
-
const constraintName = getMssqlDefaultConstraintName(tableName, col.name);
|
|
70
|
-
results.push(this.rawToNode(sql`ALTER TABLE ${sql.ref(tableName)} ADD CONSTRAINT ${sql.ref(constraintName)} DEFAULT ${defaultValue} FOR ${sql.ref(col.name)}`));
|
|
71
|
-
}
|
|
72
|
-
} else if (operation.updateDefault) {
|
|
73
|
-
const defaultValue = this.defaultValueToDB(col);
|
|
74
|
-
results.push(next().alterColumn(operation.name, (build) => {
|
|
75
|
-
if (!defaultValue) return build.dropDefault();
|
|
76
|
-
return build.setDefault(defaultValue);
|
|
77
|
-
}));
|
|
78
|
-
}
|
|
79
|
-
return results;
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
dropTable(operation, mapper) {
|
|
84
|
-
return this.db.schema.dropTable(this.getTableName(operation.name, mapper));
|
|
85
|
-
}
|
|
86
|
-
addForeignKey(operation, mapper) {
|
|
87
|
-
const { table, value } = operation;
|
|
88
|
-
const action = getForeignKeyAction(this.provider);
|
|
89
|
-
return this.db.schema.alterTable(this.getTableName(table, mapper)).addForeignKeyConstraint(value.name, value.columns, this.getTableName(value.referencedTable, mapper), value.referencedColumns, (b) => b.onUpdate(action).onDelete(action));
|
|
90
|
-
}
|
|
91
|
-
dropForeignKey(operation, mapper) {
|
|
92
|
-
const { table, name } = operation;
|
|
93
|
-
return this.db.schema.alterTable(this.getTableName(table, mapper)).dropConstraint(name).ifExists();
|
|
94
|
-
}
|
|
95
|
-
addIndex(operation, mapper) {
|
|
96
|
-
const tableName = this.getTableName(operation.table, mapper);
|
|
97
|
-
if (operation.unique) return createUniqueIndex(this.db, operation.name, tableName, operation.columns, this.provider);
|
|
98
|
-
return this.db.schema.createIndex(operation.name).on(tableName).columns(operation.columns);
|
|
99
|
-
}
|
|
100
|
-
dropIndex(operation, mapper) {
|
|
101
|
-
const tableName = this.getTableName(operation.table, mapper);
|
|
102
|
-
return dropUniqueIndex(this.db, operation.name, tableName, this.provider);
|
|
103
|
-
}
|
|
104
|
-
handleCustomOperation(operation) {
|
|
105
|
-
const statement = sql.raw(operation["sql"]);
|
|
106
|
-
return this.rawToNode(statement);
|
|
107
|
-
}
|
|
108
|
-
};
|
|
109
|
-
|
|
110
|
-
//#endregion
|
|
111
|
-
export { MssqlMigrationExecutor };
|
|
112
|
-
//# sourceMappingURL=execute-mssql.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"execute-mssql.js","names":["results: ExecuteNode[]"],"sources":["../../../../src/adapters/kysely/migration/execute-mssql.ts"],"sourcesContent":["import { sql } from \"kysely\";\nimport {\n type ColumnOperation,\n isUpdated,\n type MigrationOperation,\n} from \"../../../migration-engine/shared\";\nimport type { TableNameMapper } from \"../kysely-shared\";\nimport {\n BaseMigrationExecutor,\n createUniqueIndex,\n dropUniqueIndex,\n type ExecuteNode,\n getForeignKeyAction,\n getMssqlDefaultConstraintName,\n mssqlDropDefaultConstraint,\n} from \"./execute-base\";\n\nconst errors = {\n IdColumnUpdate:\n \"ID columns cannot be updated. Not every database supports updating primary keys and often requires workarounds.\",\n} as const;\n\n/**\n * MSSQL-specific migration executor.\n * Handles complex default constraint management and uses sp_rename for table renames.\n */\nexport class MssqlMigrationExecutor extends BaseMigrationExecutor {\n executeOperation(\n operation: MigrationOperation,\n mapper?: TableNameMapper,\n ): ExecuteNode | ExecuteNode[] {\n switch (operation.type) {\n case \"create-table\":\n return this.createTable(operation, mapper);\n case \"rename-table\":\n return this.renameTable(operation, mapper);\n case \"alter-table\":\n return this.alterTable(operation, mapper);\n case \"drop-table\":\n return this.dropTable(operation, mapper);\n case \"add-foreign-key\":\n return this.addForeignKey(operation, mapper);\n case \"drop-foreign-key\":\n return this.dropForeignKey(operation, mapper);\n case \"add-index\":\n return this.addIndex(operation, mapper);\n case \"drop-index\":\n return this.dropIndex(operation, mapper);\n case \"custom\":\n return this.handleCustomOperation(operation);\n }\n }\n\n private createTable(\n operation: Extract<MigrationOperation, { type: \"create-table\" }>,\n mapper?: TableNameMapper,\n ): ExecuteNode {\n const tableName = this.getTableName(operation.name, mapper);\n let builder = this.db.schema.createTable(tableName);\n\n // Add columns\n for (const columnInfo of operation.columns) {\n builder = builder.addColumn(\n columnInfo.name,\n sql.raw(this.getDBType(columnInfo)),\n this.getColumnBuilderCallback(columnInfo),\n );\n }\n\n return builder;\n }\n\n private renameTable(\n operation: Extract<MigrationOperation, { type: \"rename-table\" }>,\n mapper?: TableNameMapper,\n ): ExecuteNode {\n // MSSQL uses sp_rename procedure\n return this.rawToNode(\n sql`EXEC sp_rename ${sql.lit(this.getTableName(operation.from, mapper))}, ${sql.lit(this.getTableName(operation.to, mapper))}`,\n );\n }\n\n private alterTable(\n operation: Extract<MigrationOperation, { type: \"alter-table\" }>,\n mapper?: TableNameMapper,\n ): ExecuteNode[] {\n const results: ExecuteNode[] = [];\n const tableName = this.getTableName(operation.name, mapper);\n\n for (const columnOp of operation.value) {\n results.push(...this.executeColumnOperation(tableName, columnOp));\n }\n\n return results;\n }\n\n private executeColumnOperation(tableName: string, operation: ColumnOperation): ExecuteNode[] {\n const next = () => this.db.schema.alterTable(tableName);\n const results: ExecuteNode[] = [];\n\n switch (operation.type) {\n case \"rename-column\":\n results.push(next().renameColumn(operation.from, operation.to));\n return results;\n\n case \"drop-column\":\n results.push(next().dropColumn(operation.name));\n return results;\n\n case \"create-column\": {\n const col = operation.value;\n results.push(\n next().addColumn(\n col.name,\n sql.raw(this.getDBType(col)),\n this.getColumnBuilderCallback(col),\n ),\n );\n return results;\n }\n\n case \"update-column\": {\n const col = operation.value;\n\n if (col.role === \"external-id\" || col.role === \"internal-id\") {\n throw new Error(errors.IdColumnUpdate);\n }\n\n if (!isUpdated(operation)) {\n return results;\n }\n\n // MSSQL requires dropping and recreating default constraints when changing data type or default value\n const mssqlRecreateDefaultConstraint = operation.updateDataType || operation.updateDefault;\n\n if (mssqlRecreateDefaultConstraint) {\n results.push(this.rawToNode(mssqlDropDefaultConstraint(tableName, col.name)));\n }\n\n if (operation.updateDataType) {\n const dbType = sql.raw(this.getDBType(col));\n results.push(next().alterColumn(operation.name, (b) => b.setDataType(dbType)));\n }\n\n if (operation.updateNullable) {\n results.push(\n next().alterColumn(operation.name, (build) =>\n col.isNullable ? build.dropNotNull() : build.setNotNull(),\n ),\n );\n }\n\n if (mssqlRecreateDefaultConstraint) {\n const defaultValue = this.defaultValueToDB(col);\n\n if (defaultValue) {\n const constraintName = getMssqlDefaultConstraintName(tableName, col.name);\n results.push(\n this.rawToNode(\n sql`ALTER TABLE ${sql.ref(tableName)} ADD CONSTRAINT ${sql.ref(constraintName)} DEFAULT ${defaultValue} FOR ${sql.ref(col.name)}`,\n ),\n );\n }\n } else if (operation.updateDefault) {\n const defaultValue = this.defaultValueToDB(col);\n results.push(\n next().alterColumn(operation.name, (build) => {\n if (!defaultValue) {\n return build.dropDefault();\n }\n return build.setDefault(defaultValue);\n }),\n );\n }\n\n return results;\n }\n }\n }\n\n private dropTable(\n operation: Extract<MigrationOperation, { type: \"drop-table\" }>,\n mapper?: TableNameMapper,\n ): ExecuteNode {\n return this.db.schema.dropTable(this.getTableName(operation.name, mapper));\n }\n\n private addForeignKey(\n operation: Extract<MigrationOperation, { type: \"add-foreign-key\" }>,\n mapper?: TableNameMapper,\n ): ExecuteNode {\n const { table, value } = operation;\n const action = getForeignKeyAction(this.provider);\n\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(action).onDelete(action),\n );\n }\n\n private dropForeignKey(\n operation: Extract<MigrationOperation, { type: \"drop-foreign-key\" }>,\n mapper?: TableNameMapper,\n ): ExecuteNode {\n const { table, name } = operation;\n return this.db.schema\n .alterTable(this.getTableName(table, mapper))\n .dropConstraint(name)\n .ifExists();\n }\n\n private addIndex(\n operation: Extract<MigrationOperation, { type: \"add-index\" }>,\n mapper?: TableNameMapper,\n ): ExecuteNode {\n const tableName = this.getTableName(operation.table, mapper);\n\n if (operation.unique) {\n return createUniqueIndex(\n this.db,\n operation.name,\n tableName,\n operation.columns,\n this.provider,\n );\n }\n\n return this.db.schema.createIndex(operation.name).on(tableName).columns(operation.columns);\n }\n\n private dropIndex(\n operation: Extract<MigrationOperation, { type: \"drop-index\" }>,\n mapper?: TableNameMapper,\n ): ExecuteNode {\n const tableName = this.getTableName(operation.table, mapper);\n return dropUniqueIndex(this.db, operation.name, tableName, this.provider);\n }\n\n private handleCustomOperation(\n operation: Extract<MigrationOperation, { type: \"custom\" }>,\n ): ExecuteNode {\n const statement = sql.raw(operation[\"sql\"] as string);\n return this.rawToNode(statement);\n }\n}\n"],"mappings":"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"}
|
|
@@ -1,93 +0,0 @@
|
|
|
1
|
-
import { isUpdated } from "../../../migration-engine/shared.js";
|
|
2
|
-
import { BaseMigrationExecutor, createUniqueIndex, dropUniqueIndex, getForeignKeyAction } from "./execute-base.js";
|
|
3
|
-
import { sql } from "kysely";
|
|
4
|
-
|
|
5
|
-
//#region src/adapters/kysely/migration/execute-mysql.ts
|
|
6
|
-
const errors = { IdColumnUpdate: "ID columns cannot be updated. Not every database supports updating primary keys and often requires workarounds." };
|
|
7
|
-
/**
|
|
8
|
-
* MySQL-specific migration executor.
|
|
9
|
-
* Uses modifyColumn for updates and "no action" for FK actions (RESTRICT not supported).
|
|
10
|
-
*/
|
|
11
|
-
var MysqlMigrationExecutor = class extends BaseMigrationExecutor {
|
|
12
|
-
executeOperation(operation, mapper) {
|
|
13
|
-
switch (operation.type) {
|
|
14
|
-
case "create-table": return this.createTable(operation, mapper);
|
|
15
|
-
case "rename-table": return this.renameTable(operation, mapper);
|
|
16
|
-
case "alter-table": return this.alterTable(operation, mapper);
|
|
17
|
-
case "drop-table": return this.dropTable(operation, mapper);
|
|
18
|
-
case "add-foreign-key": return this.addForeignKey(operation, mapper);
|
|
19
|
-
case "drop-foreign-key": return this.dropForeignKey(operation, mapper);
|
|
20
|
-
case "add-index": return this.addIndex(operation, mapper);
|
|
21
|
-
case "drop-index": return this.dropIndex(operation, mapper);
|
|
22
|
-
case "custom": return this.handleCustomOperation(operation);
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
createTable(operation, mapper) {
|
|
26
|
-
const tableName = this.getTableName(operation.name, mapper);
|
|
27
|
-
let builder = this.db.schema.createTable(tableName);
|
|
28
|
-
for (const columnInfo of operation.columns) builder = builder.addColumn(columnInfo.name, sql.raw(this.getDBType(columnInfo)), this.getColumnBuilderCallback(columnInfo));
|
|
29
|
-
return builder;
|
|
30
|
-
}
|
|
31
|
-
renameTable(operation, mapper) {
|
|
32
|
-
return this.db.schema.alterTable(this.getTableName(operation.from, mapper)).renameTo(this.getTableName(operation.to, mapper));
|
|
33
|
-
}
|
|
34
|
-
alterTable(operation, mapper) {
|
|
35
|
-
const results = [];
|
|
36
|
-
const tableName = this.getTableName(operation.name, mapper);
|
|
37
|
-
for (const columnOp of operation.value) results.push(...this.executeColumnOperation(tableName, columnOp));
|
|
38
|
-
return results;
|
|
39
|
-
}
|
|
40
|
-
executeColumnOperation(tableName, operation) {
|
|
41
|
-
const next = () => this.db.schema.alterTable(tableName);
|
|
42
|
-
const results = [];
|
|
43
|
-
switch (operation.type) {
|
|
44
|
-
case "rename-column":
|
|
45
|
-
results.push(next().renameColumn(operation.from, operation.to));
|
|
46
|
-
return results;
|
|
47
|
-
case "drop-column":
|
|
48
|
-
results.push(next().dropColumn(operation.name));
|
|
49
|
-
return results;
|
|
50
|
-
case "create-column": {
|
|
51
|
-
const col = operation.value;
|
|
52
|
-
results.push(next().addColumn(col.name, sql.raw(this.getDBType(col)), this.getColumnBuilderCallback(col)));
|
|
53
|
-
return results;
|
|
54
|
-
}
|
|
55
|
-
case "update-column": {
|
|
56
|
-
const col = operation.value;
|
|
57
|
-
if (col.role === "external-id" || col.role === "internal-id") throw new Error(errors.IdColumnUpdate);
|
|
58
|
-
if (!isUpdated(operation)) return results;
|
|
59
|
-
results.push(next().modifyColumn(operation.name, sql.raw(this.getDBType(col)), this.getColumnBuilderCallback(col)));
|
|
60
|
-
return results;
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
dropTable(operation, mapper) {
|
|
65
|
-
return this.db.schema.dropTable(this.getTableName(operation.name, mapper));
|
|
66
|
-
}
|
|
67
|
-
addForeignKey(operation, mapper) {
|
|
68
|
-
const { table, value } = operation;
|
|
69
|
-
const action = getForeignKeyAction(this.provider);
|
|
70
|
-
return this.db.schema.alterTable(this.getTableName(table, mapper)).addForeignKeyConstraint(value.name, value.columns, this.getTableName(value.referencedTable, mapper), value.referencedColumns, (b) => b.onUpdate(action).onDelete(action));
|
|
71
|
-
}
|
|
72
|
-
dropForeignKey(operation, mapper) {
|
|
73
|
-
const { table, name } = operation;
|
|
74
|
-
return this.db.schema.alterTable(this.getTableName(table, mapper)).dropConstraint(name);
|
|
75
|
-
}
|
|
76
|
-
addIndex(operation, mapper) {
|
|
77
|
-
const tableName = this.getTableName(operation.table, mapper);
|
|
78
|
-
if (operation.unique) return createUniqueIndex(this.db, operation.name, tableName, operation.columns, this.provider);
|
|
79
|
-
return this.db.schema.createIndex(operation.name).on(tableName).columns(operation.columns);
|
|
80
|
-
}
|
|
81
|
-
dropIndex(operation, mapper) {
|
|
82
|
-
const tableName = this.getTableName(operation.table, mapper);
|
|
83
|
-
return dropUniqueIndex(this.db, operation.name, tableName, this.provider);
|
|
84
|
-
}
|
|
85
|
-
handleCustomOperation(operation) {
|
|
86
|
-
const statement = sql.raw(operation["sql"]);
|
|
87
|
-
return this.rawToNode(statement);
|
|
88
|
-
}
|
|
89
|
-
};
|
|
90
|
-
|
|
91
|
-
//#endregion
|
|
92
|
-
export { MysqlMigrationExecutor };
|
|
93
|
-
//# sourceMappingURL=execute-mysql.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"execute-mysql.js","names":["results: ExecuteNode[]"],"sources":["../../../../src/adapters/kysely/migration/execute-mysql.ts"],"sourcesContent":["import { sql } from \"kysely\";\nimport {\n type ColumnOperation,\n isUpdated,\n type MigrationOperation,\n} from \"../../../migration-engine/shared\";\nimport type { TableNameMapper } from \"../kysely-shared\";\nimport {\n BaseMigrationExecutor,\n createUniqueIndex,\n dropUniqueIndex,\n type ExecuteNode,\n getForeignKeyAction,\n} from \"./execute-base\";\n\nconst errors = {\n IdColumnUpdate:\n \"ID columns cannot be updated. Not every database supports updating primary keys and often requires workarounds.\",\n} as const;\n\n/**\n * MySQL-specific migration executor.\n * Uses modifyColumn for updates and \"no action\" for FK actions (RESTRICT not supported).\n */\nexport class MysqlMigrationExecutor extends BaseMigrationExecutor {\n executeOperation(\n operation: MigrationOperation,\n mapper?: TableNameMapper,\n ): ExecuteNode | ExecuteNode[] {\n switch (operation.type) {\n case \"create-table\":\n return this.createTable(operation, mapper);\n case \"rename-table\":\n return this.renameTable(operation, mapper);\n case \"alter-table\":\n return this.alterTable(operation, mapper);\n case \"drop-table\":\n return this.dropTable(operation, mapper);\n case \"add-foreign-key\":\n return this.addForeignKey(operation, mapper);\n case \"drop-foreign-key\":\n return this.dropForeignKey(operation, mapper);\n case \"add-index\":\n return this.addIndex(operation, mapper);\n case \"drop-index\":\n return this.dropIndex(operation, mapper);\n case \"custom\":\n return this.handleCustomOperation(operation);\n }\n }\n\n private createTable(\n operation: Extract<MigrationOperation, { type: \"create-table\" }>,\n mapper?: TableNameMapper,\n ): ExecuteNode {\n const tableName = this.getTableName(operation.name, mapper);\n let builder = this.db.schema.createTable(tableName);\n\n // Add columns\n for (const columnInfo of operation.columns) {\n builder = builder.addColumn(\n columnInfo.name,\n sql.raw(this.getDBType(columnInfo)),\n this.getColumnBuilderCallback(columnInfo),\n );\n }\n\n return builder;\n }\n\n private renameTable(\n operation: Extract<MigrationOperation, { type: \"rename-table\" }>,\n mapper?: TableNameMapper,\n ): ExecuteNode {\n return this.db.schema\n .alterTable(this.getTableName(operation.from, mapper))\n .renameTo(this.getTableName(operation.to, mapper));\n }\n\n private alterTable(\n operation: Extract<MigrationOperation, { type: \"alter-table\" }>,\n mapper?: TableNameMapper,\n ): ExecuteNode[] {\n const results: ExecuteNode[] = [];\n const tableName = this.getTableName(operation.name, mapper);\n\n for (const columnOp of operation.value) {\n results.push(...this.executeColumnOperation(tableName, columnOp));\n }\n\n return results;\n }\n\n private executeColumnOperation(tableName: string, operation: ColumnOperation): ExecuteNode[] {\n const next = () => this.db.schema.alterTable(tableName);\n const results: ExecuteNode[] = [];\n\n switch (operation.type) {\n case \"rename-column\":\n results.push(next().renameColumn(operation.from, operation.to));\n return results;\n\n case \"drop-column\":\n results.push(next().dropColumn(operation.name));\n return results;\n\n case \"create-column\": {\n const col = operation.value;\n results.push(\n next().addColumn(\n col.name,\n sql.raw(this.getDBType(col)),\n this.getColumnBuilderCallback(col),\n ),\n );\n return results;\n }\n\n case \"update-column\": {\n const col = operation.value;\n\n if (col.role === \"external-id\" || col.role === \"internal-id\") {\n throw new Error(errors.IdColumnUpdate);\n }\n\n if (!isUpdated(operation)) {\n return results;\n }\n\n // MySQL: Use modifyColumn which requires the full column definition\n results.push(\n next().modifyColumn(\n operation.name,\n sql.raw(this.getDBType(col)),\n this.getColumnBuilderCallback(col),\n ),\n );\n\n return results;\n }\n }\n }\n\n private dropTable(\n operation: Extract<MigrationOperation, { type: \"drop-table\" }>,\n mapper?: TableNameMapper,\n ): ExecuteNode {\n return this.db.schema.dropTable(this.getTableName(operation.name, mapper));\n }\n\n private addForeignKey(\n operation: Extract<MigrationOperation, { type: \"add-foreign-key\" }>,\n mapper?: TableNameMapper,\n ): ExecuteNode {\n const { table, value } = operation;\n const action = getForeignKeyAction(this.provider);\n\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(action).onDelete(action),\n );\n }\n\n private dropForeignKey(\n operation: Extract<MigrationOperation, { type: \"drop-foreign-key\" }>,\n mapper?: TableNameMapper,\n ): ExecuteNode {\n const { table, name } = operation;\n // MySQL doesn't support IF EXISTS for dropping constraints\n return this.db.schema.alterTable(this.getTableName(table, mapper)).dropConstraint(name);\n }\n\n private addIndex(\n operation: Extract<MigrationOperation, { type: \"add-index\" }>,\n mapper?: TableNameMapper,\n ): ExecuteNode {\n const tableName = this.getTableName(operation.table, mapper);\n\n if (operation.unique) {\n return createUniqueIndex(\n this.db,\n operation.name,\n tableName,\n operation.columns,\n this.provider,\n );\n }\n\n return this.db.schema.createIndex(operation.name).on(tableName).columns(operation.columns);\n }\n\n private dropIndex(\n operation: Extract<MigrationOperation, { type: \"drop-index\" }>,\n mapper?: TableNameMapper,\n ): ExecuteNode {\n const tableName = this.getTableName(operation.table, mapper);\n return dropUniqueIndex(this.db, operation.name, tableName, this.provider);\n }\n\n private handleCustomOperation(\n operation: Extract<MigrationOperation, { type: \"custom\" }>,\n ): ExecuteNode {\n const statement = sql.raw(operation[\"sql\"] as string);\n return this.rawToNode(statement);\n }\n}\n"],"mappings":"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"}
|