@fragno-dev/db 0.1.14 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-build.log +242 -139
- package/CHANGELOG.md +47 -0
- package/README.md +123 -8
- package/dist/adapters/adapters.d.ts +19 -5
- package/dist/adapters/adapters.d.ts.map +1 -1
- package/dist/adapters/adapters.js.map +1 -1
- package/dist/adapters/drizzle/drizzle-adapter.d.ts +6 -19
- package/dist/adapters/drizzle/drizzle-adapter.d.ts.map +1 -1
- package/dist/adapters/drizzle/drizzle-adapter.js +7 -47
- package/dist/adapters/drizzle/drizzle-adapter.js.map +1 -1
- package/dist/adapters/drizzle/generate.d.ts +7 -1
- package/dist/adapters/drizzle/generate.d.ts.map +1 -1
- package/dist/adapters/drizzle/generate.js +46 -45
- package/dist/adapters/drizzle/generate.js.map +1 -1
- package/dist/adapters/generic-sql/driver-config.d.ts +74 -0
- package/dist/adapters/generic-sql/driver-config.d.ts.map +1 -0
- package/dist/adapters/generic-sql/driver-config.js +94 -0
- package/dist/adapters/generic-sql/driver-config.js.map +1 -0
- package/dist/adapters/generic-sql/generic-sql-adapter.d.ts +43 -0
- package/dist/adapters/generic-sql/generic-sql-adapter.d.ts.map +1 -0
- package/dist/adapters/generic-sql/generic-sql-adapter.js +87 -0
- package/dist/adapters/generic-sql/generic-sql-adapter.js.map +1 -0
- package/dist/adapters/generic-sql/generic-sql-uow-executor.js +67 -0
- package/dist/adapters/generic-sql/generic-sql-uow-executor.js.map +1 -0
- package/dist/adapters/generic-sql/migration/cold-kysely.js +33 -0
- package/dist/adapters/generic-sql/migration/cold-kysely.js.map +1 -0
- package/dist/adapters/generic-sql/migration/dialect/mysql.js +60 -0
- package/dist/adapters/generic-sql/migration/dialect/mysql.js.map +1 -0
- package/dist/adapters/generic-sql/migration/dialect/postgres.js +59 -0
- package/dist/adapters/generic-sql/migration/dialect/postgres.js.map +1 -0
- package/dist/adapters/generic-sql/migration/dialect/sqlite.js +96 -0
- package/dist/adapters/generic-sql/migration/dialect/sqlite.js.map +1 -0
- package/dist/adapters/generic-sql/migration/executor.d.ts +15 -0
- package/dist/adapters/generic-sql/migration/executor.d.ts.map +1 -0
- package/dist/adapters/generic-sql/migration/executor.js +18 -0
- package/dist/adapters/generic-sql/migration/executor.js.map +1 -0
- package/dist/adapters/generic-sql/migration/prepared-migrations.d.ts +66 -0
- package/dist/adapters/generic-sql/migration/prepared-migrations.d.ts.map +1 -0
- package/dist/adapters/generic-sql/migration/prepared-migrations.js +68 -0
- package/dist/adapters/generic-sql/migration/prepared-migrations.js.map +1 -0
- package/dist/adapters/generic-sql/migration/sql-generator.js +212 -0
- package/dist/adapters/generic-sql/migration/sql-generator.js.map +1 -0
- package/dist/adapters/generic-sql/query/create-sql-query-compiler.js +32 -0
- package/dist/adapters/generic-sql/query/create-sql-query-compiler.js.map +1 -0
- package/dist/adapters/generic-sql/query/cursor-utils.js +37 -0
- package/dist/adapters/generic-sql/query/cursor-utils.js.map +1 -0
- package/dist/adapters/generic-sql/query/dialect/mysql.js +33 -0
- package/dist/adapters/generic-sql/query/dialect/mysql.js.map +1 -0
- package/dist/adapters/generic-sql/query/dialect/postgres.js +32 -0
- package/dist/adapters/generic-sql/query/dialect/postgres.js.map +1 -0
- package/dist/adapters/generic-sql/query/dialect/sqlite.js +32 -0
- package/dist/adapters/generic-sql/query/dialect/sqlite.js.map +1 -0
- package/dist/adapters/generic-sql/query/generic-sql-uow-operation-compiler.js +152 -0
- package/dist/adapters/generic-sql/query/generic-sql-uow-operation-compiler.js.map +1 -0
- package/dist/adapters/generic-sql/query/select-builder.js +69 -0
- package/dist/adapters/generic-sql/query/select-builder.js.map +1 -0
- package/dist/adapters/generic-sql/query/sql-query-compiler.js +145 -0
- package/dist/adapters/generic-sql/query/sql-query-compiler.js.map +1 -0
- package/dist/adapters/generic-sql/query/where-builder.js +129 -0
- package/dist/adapters/generic-sql/query/where-builder.js.map +1 -0
- package/dist/adapters/generic-sql/result-interpreter.js +74 -0
- package/dist/adapters/generic-sql/result-interpreter.js.map +1 -0
- package/dist/adapters/generic-sql/uow-decoder.js +105 -0
- package/dist/adapters/generic-sql/uow-decoder.js.map +1 -0
- package/dist/adapters/generic-sql/uow-encoder.js +93 -0
- package/dist/adapters/generic-sql/uow-encoder.js.map +1 -0
- package/dist/adapters/kysely/kysely-adapter.d.ts +5 -16
- package/dist/adapters/kysely/kysely-adapter.d.ts.map +1 -1
- package/dist/adapters/kysely/kysely-adapter.js +6 -159
- package/dist/adapters/kysely/kysely-adapter.js.map +1 -1
- package/dist/adapters/{drizzle/drizzle-query.js → shared/from-unit-of-work-compiler.js} +48 -62
- package/dist/adapters/shared/from-unit-of-work-compiler.js.map +1 -0
- package/dist/adapters/{kysely/kysely-shared.d.ts → shared/table-name-mapper.d.ts} +3 -2
- package/dist/adapters/shared/table-name-mapper.d.ts.map +1 -0
- package/dist/adapters/shared/table-name-mapper.js +43 -0
- package/dist/adapters/shared/table-name-mapper.js.map +1 -0
- package/dist/adapters/shared/uow-operation-compiler.js +105 -0
- package/dist/adapters/shared/uow-operation-compiler.js.map +1 -0
- package/dist/db-fragment-definition-builder.d.ts +186 -0
- package/dist/db-fragment-definition-builder.d.ts.map +1 -0
- package/dist/db-fragment-definition-builder.js +207 -0
- package/dist/db-fragment-definition-builder.js.map +1 -0
- package/dist/fragments/internal-fragment.d.ts +53 -0
- package/dist/fragments/internal-fragment.d.ts.map +1 -0
- package/dist/fragments/internal-fragment.js +111 -0
- package/dist/fragments/internal-fragment.js.map +1 -0
- package/dist/hooks/hooks.d.ts +51 -0
- package/dist/hooks/hooks.d.ts.map +1 -0
- package/dist/hooks/hooks.js +88 -0
- package/dist/hooks/hooks.js.map +1 -0
- package/dist/migration-engine/generation-engine.d.ts +0 -2
- package/dist/migration-engine/generation-engine.d.ts.map +1 -1
- package/dist/migration-engine/generation-engine.js +38 -56
- package/dist/migration-engine/generation-engine.js.map +1 -1
- package/dist/mod.d.ts +35 -23
- package/dist/mod.d.ts.map +1 -1
- package/dist/mod.js +48 -45
- package/dist/mod.js.map +1 -1
- package/dist/node_modules/.pnpm/rou3@0.7.10/node_modules/rou3/dist/index.js +165 -0
- package/dist/node_modules/.pnpm/rou3@0.7.10/node_modules/rou3/dist/index.js.map +1 -0
- package/dist/packages/fragno/dist/api/bind-services.js +20 -0
- package/dist/packages/fragno/dist/api/bind-services.js.map +1 -0
- package/dist/packages/fragno/dist/api/error.js +48 -0
- package/dist/packages/fragno/dist/api/error.js.map +1 -0
- package/dist/packages/fragno/dist/api/fragment-definition-builder.js +320 -0
- package/dist/packages/fragno/dist/api/fragment-definition-builder.js.map +1 -0
- package/dist/packages/fragno/dist/api/fragment-instantiator.js +525 -0
- package/dist/packages/fragno/dist/api/fragment-instantiator.js.map +1 -0
- package/dist/packages/fragno/dist/api/fragno-response.js +73 -0
- package/dist/packages/fragno/dist/api/fragno-response.js.map +1 -0
- package/dist/packages/fragno/dist/api/internal/response-stream.js +81 -0
- package/dist/packages/fragno/dist/api/internal/response-stream.js.map +1 -0
- package/dist/packages/fragno/dist/api/internal/route.js +10 -0
- package/dist/packages/fragno/dist/api/internal/route.js.map +1 -0
- package/dist/packages/fragno/dist/api/mutable-request-state.js +97 -0
- package/dist/packages/fragno/dist/api/mutable-request-state.js.map +1 -0
- package/dist/packages/fragno/dist/api/request-context-storage.js +43 -0
- package/dist/packages/fragno/dist/api/request-context-storage.js.map +1 -0
- package/dist/packages/fragno/dist/api/request-input-context.js +118 -0
- package/dist/packages/fragno/dist/api/request-input-context.js.map +1 -0
- package/dist/packages/fragno/dist/api/request-middleware.js +83 -0
- package/dist/packages/fragno/dist/api/request-middleware.js.map +1 -0
- package/dist/packages/fragno/dist/api/request-output-context.js +119 -0
- package/dist/packages/fragno/dist/api/request-output-context.js.map +1 -0
- package/dist/packages/fragno/dist/api/route.js +17 -0
- package/dist/packages/fragno/dist/api/route.js.map +1 -0
- package/dist/packages/fragno/dist/internal/symbols.js +10 -0
- package/dist/packages/fragno/dist/internal/symbols.js.map +1 -0
- package/dist/query/column-defaults.js +27 -0
- package/dist/query/column-defaults.js.map +1 -0
- package/dist/query/cursor.d.ts +14 -6
- package/dist/query/cursor.d.ts.map +1 -1
- package/dist/query/cursor.js +16 -7
- package/dist/query/cursor.js.map +1 -1
- package/dist/query/orm/orm.d.ts +1 -1
- package/dist/query/orm/orm.js.map +1 -1
- package/dist/query/serialize/create-sql-serializer.js +30 -0
- package/dist/query/serialize/create-sql-serializer.js.map +1 -0
- package/dist/query/serialize/dialect/mysql-serializer.js +87 -0
- package/dist/query/serialize/dialect/mysql-serializer.js.map +1 -0
- package/dist/query/serialize/dialect/postgres-serializer.js +80 -0
- package/dist/query/serialize/dialect/postgres-serializer.js.map +1 -0
- package/dist/query/serialize/dialect/sqlite-serializer.js +93 -0
- package/dist/query/serialize/dialect/sqlite-serializer.js.map +1 -0
- package/dist/query/serialize/sql-serializer.js +67 -0
- package/dist/query/serialize/sql-serializer.js.map +1 -0
- package/dist/query/{query.d.ts → simple-query-interface.d.ts} +6 -6
- package/dist/query/simple-query-interface.d.ts.map +1 -0
- package/dist/query/unit-of-work/execute-unit-of-work.d.ts +133 -0
- package/dist/query/unit-of-work/execute-unit-of-work.d.ts.map +1 -0
- package/dist/query/unit-of-work/execute-unit-of-work.js +197 -0
- package/dist/query/unit-of-work/execute-unit-of-work.js.map +1 -0
- package/dist/query/unit-of-work/retry-policy.d.ts +88 -0
- package/dist/query/unit-of-work/retry-policy.d.ts.map +1 -0
- package/dist/query/unit-of-work/retry-policy.js +61 -0
- package/dist/query/unit-of-work/retry-policy.js.map +1 -0
- package/dist/query/{unit-of-work.d.ts → unit-of-work/unit-of-work.d.ts} +145 -58
- package/dist/query/unit-of-work/unit-of-work.d.ts.map +1 -0
- package/dist/query/{unit-of-work.js → unit-of-work/unit-of-work.js} +435 -198
- package/dist/query/unit-of-work/unit-of-work.js.map +1 -0
- package/dist/query/value-decoding.js +71 -0
- package/dist/query/value-decoding.js.map +1 -0
- package/dist/query/value-encoding.js +124 -0
- package/dist/query/value-encoding.js.map +1 -0
- package/dist/schema/create.d.ts +3 -0
- package/dist/schema/create.d.ts.map +1 -1
- package/dist/schema/create.js +4 -0
- package/dist/schema/create.js.map +1 -1
- package/dist/schema/type-conversion/create-sql-type-mapper.js +29 -0
- package/dist/schema/type-conversion/create-sql-type-mapper.js.map +1 -0
- package/dist/schema/type-conversion/dialect/mysql.js +57 -0
- package/dist/schema/type-conversion/dialect/mysql.js.map +1 -0
- package/dist/schema/type-conversion/dialect/postgres.js +56 -0
- package/dist/schema/type-conversion/dialect/postgres.js.map +1 -0
- package/dist/schema/type-conversion/dialect/sqlite.js +52 -0
- package/dist/schema/type-conversion/dialect/sqlite.js.map +1 -0
- package/dist/schema/type-conversion/type-mapping.js +63 -0
- package/dist/schema/type-conversion/type-mapping.js.map +1 -0
- package/dist/sql-driver/connection/connection-provider.d.ts +13 -0
- package/dist/sql-driver/connection/connection-provider.d.ts.map +1 -0
- package/dist/sql-driver/connection/connection-provider.js +19 -0
- package/dist/sql-driver/connection/connection-provider.js.map +1 -0
- package/dist/sql-driver/connection/single-connection-provider.js +23 -0
- package/dist/sql-driver/connection/single-connection-provider.js.map +1 -0
- package/dist/sql-driver/dialect-adapter/dialect-adapter.d.ts +7 -0
- package/dist/sql-driver/dialect-adapter/dialect-adapter.d.ts.map +1 -0
- package/dist/sql-driver/dialects/dialects.d.ts +2 -0
- package/dist/sql-driver/dialects/dialects.js +3 -0
- package/dist/sql-driver/dialects/durable-object-dialect.d.ts +72 -0
- package/dist/sql-driver/dialects/durable-object-dialect.d.ts.map +1 -0
- package/dist/sql-driver/dialects/durable-object-dialect.js +130 -0
- package/dist/sql-driver/dialects/durable-object-dialect.js.map +1 -0
- package/dist/sql-driver/driver/runtime-driver.d.ts +23 -0
- package/dist/sql-driver/driver/runtime-driver.d.ts.map +1 -0
- package/dist/sql-driver/driver/runtime-driver.js +56 -0
- package/dist/sql-driver/driver/runtime-driver.js.map +1 -0
- package/dist/sql-driver/query-executor/default-query-executor.js +26 -0
- package/dist/sql-driver/query-executor/default-query-executor.js.map +1 -0
- package/dist/sql-driver/query-executor/plugin.d.ts +17 -0
- package/dist/sql-driver/query-executor/plugin.d.ts.map +1 -0
- package/dist/sql-driver/query-executor/query-executor-base.js +25 -0
- package/dist/sql-driver/query-executor/query-executor-base.js.map +1 -0
- package/dist/sql-driver/query-executor/query-executor.d.ts +36 -0
- package/dist/sql-driver/query-executor/query-executor.d.ts.map +1 -0
- package/dist/sql-driver/sql-driver-adapter.d.ts +29 -0
- package/dist/sql-driver/sql-driver-adapter.d.ts.map +1 -0
- package/dist/sql-driver/sql-driver-adapter.js +68 -0
- package/dist/sql-driver/sql-driver-adapter.js.map +1 -0
- package/dist/sql-driver/sql-driver.d.ts +38 -0
- package/dist/sql-driver/sql-driver.d.ts.map +1 -0
- package/dist/sql-driver/sql-driver.js +1 -0
- package/dist/sql-driver/sql.js +50 -0
- package/dist/sql-driver/sql.js.map +1 -0
- package/dist/with-database.d.ts +32 -0
- package/dist/with-database.d.ts.map +1 -0
- package/dist/with-database.js +34 -0
- package/dist/with-database.js.map +1 -0
- package/package.json +43 -9
- package/src/adapters/adapters.ts +23 -4
- package/src/adapters/drizzle/drizzle-adapter-pglite.test.ts +140 -185
- package/src/adapters/drizzle/{drizzle-adapter-sqlite.test.ts → drizzle-adapter-sqlite3.test.ts} +187 -55
- package/src/adapters/drizzle/drizzle-adapter.ts +14 -93
- package/src/adapters/drizzle/generate.test.ts +102 -269
- package/src/adapters/drizzle/generate.ts +89 -63
- package/src/adapters/drizzle/migrate-drizzle.test.ts +19 -0
- package/src/adapters/drizzle/shared.ts +0 -34
- package/src/adapters/drizzle/test-utils.ts +36 -5
- package/src/adapters/generic-sql/README.md +14 -0
- package/src/adapters/generic-sql/driver-config.ts +144 -0
- package/src/adapters/generic-sql/generic-sql-adapter.test.ts +50 -0
- package/src/adapters/generic-sql/generic-sql-adapter.ts +146 -0
- package/src/adapters/generic-sql/generic-sql-uow-executor.ts +130 -0
- package/src/adapters/generic-sql/migration/cold-kysely.ts +55 -0
- package/src/adapters/{kysely/migration/execute-mysql.test.ts → generic-sql/migration/dialect/mysql.test.ts} +342 -484
- package/src/adapters/generic-sql/migration/dialect/mysql.ts +104 -0
- package/src/adapters/generic-sql/migration/dialect/postgres.test.ts +1008 -0
- package/src/adapters/generic-sql/migration/dialect/postgres.ts +113 -0
- package/src/adapters/{kysely/migration/execute-sqlite.test.ts → generic-sql/migration/dialect/sqlite.test.ts} +307 -510
- package/src/adapters/generic-sql/migration/dialect/sqlite.ts +189 -0
- package/src/adapters/generic-sql/migration/executor.ts +33 -0
- package/src/adapters/generic-sql/migration/prepared-migrations.test.ts +661 -0
- package/src/adapters/generic-sql/migration/prepared-migrations.ts +214 -0
- package/src/adapters/generic-sql/migration/sql-generator.ts +413 -0
- package/src/adapters/generic-sql/query/create-sql-query-compiler.ts +36 -0
- package/src/adapters/generic-sql/query/cursor-utils.ts +56 -0
- package/src/adapters/generic-sql/query/dialect/mysql.ts +34 -0
- package/src/adapters/generic-sql/query/dialect/postgres.ts +32 -0
- package/src/adapters/generic-sql/query/dialect/sqlite.ts +32 -0
- package/src/adapters/generic-sql/query/generic-sql-uow-operation-compiler.test.ts +1568 -0
- package/src/adapters/generic-sql/query/generic-sql-uow-operation-compiler.ts +314 -0
- package/src/adapters/generic-sql/query/select-builder.test.ts +256 -0
- package/src/adapters/generic-sql/query/select-builder.ts +137 -0
- package/src/adapters/generic-sql/query/sql-query-compiler.test.ts +195 -0
- package/src/adapters/generic-sql/query/sql-query-compiler.ts +367 -0
- package/src/adapters/generic-sql/query/where-builder.test.ts +744 -0
- package/src/adapters/generic-sql/query/where-builder.ts +211 -0
- package/src/adapters/generic-sql/result-interpreter.ts +102 -0
- package/src/adapters/generic-sql/test/generic-drizzle-adapter-sqlite3.test.ts +899 -0
- package/src/adapters/generic-sql/uow-decoder.test.ts +399 -0
- package/src/adapters/generic-sql/uow-decoder.ts +152 -0
- package/src/adapters/generic-sql/uow-encoder.test.ts +183 -0
- package/src/adapters/generic-sql/uow-encoder.ts +131 -0
- package/src/adapters/kysely/kysely-adapter-pglite.test.ts +90 -96
- package/src/adapters/kysely/kysely-adapter-sqlocal.test.ts +215 -0
- package/src/adapters/kysely/kysely-adapter.ts +10 -242
- package/src/adapters/{drizzle/drizzle-query.ts → shared/from-unit-of-work-compiler.ts} +111 -106
- package/src/adapters/shared/table-name-mapper.ts +50 -0
- package/src/adapters/shared/uow-operation-compiler.ts +211 -0
- package/src/db-fragment-definition-builder.test.ts +887 -0
- package/src/db-fragment-definition-builder.ts +737 -0
- package/src/db-fragment-instantiator.test.ts +543 -0
- package/src/db-fragment-integration.test.ts +406 -0
- package/src/fragments/internal-fragment.test.ts +549 -0
- package/src/fragments/internal-fragment.ts +249 -0
- package/src/hooks/hooks.test.ts +575 -0
- package/src/hooks/hooks.ts +179 -0
- package/src/migration-engine/generation-engine.test.ts +60 -27
- package/src/migration-engine/generation-engine.ts +99 -92
- package/src/mod.ts +139 -78
- package/src/query/column-defaults.ts +49 -0
- package/src/query/cursor.test.ts +147 -3
- package/src/query/cursor.ts +25 -8
- package/src/query/orm/orm.ts +1 -1
- package/src/query/query-type.test.ts +9 -9
- package/src/query/serialize/create-sql-serializer.ts +34 -0
- package/src/query/serialize/dialect/mysql-serializer.ts +142 -0
- package/src/query/serialize/dialect/postgres-serializer.ts +129 -0
- package/src/query/serialize/dialect/sqlite-serializer.test.ts +251 -0
- package/src/query/serialize/dialect/sqlite-serializer.ts +156 -0
- package/src/query/serialize/sql-serializer.ts +143 -0
- package/src/query/{query.ts → simple-query-interface.ts} +4 -4
- package/src/query/unit-of-work/execute-unit-of-work.test.ts +1310 -0
- package/src/query/unit-of-work/execute-unit-of-work.ts +504 -0
- package/src/query/unit-of-work/retry-policy.test.ts +217 -0
- package/src/query/unit-of-work/retry-policy.ts +141 -0
- package/src/query/unit-of-work/unit-of-work-coordinator.test.ts +831 -0
- package/src/query/{unit-of-work-types.test.ts → unit-of-work/unit-of-work-types.test.ts} +7 -5
- package/src/query/unit-of-work/unit-of-work.test.ts +1716 -0
- package/src/query/{unit-of-work.ts → unit-of-work/unit-of-work.ts} +716 -420
- package/src/query/{result-transform.test.ts → value-decoding.test.ts} +45 -298
- package/src/query/value-decoding.ts +113 -0
- package/src/query/value-encoding.test.ts +390 -0
- package/src/query/value-encoding.ts +168 -0
- package/src/schema/create.test.ts +5 -1
- package/src/schema/create.ts +5 -0
- package/src/schema/serialize.test.ts +165 -407
- package/src/schema/type-conversion/create-sql-type-mapper.ts +28 -0
- package/src/schema/type-conversion/dialect/mysql.ts +64 -0
- package/src/schema/type-conversion/dialect/postgres.ts +62 -0
- package/src/schema/type-conversion/dialect/sqlite.ts +63 -0
- package/src/schema/type-conversion/type-mapping.test.ts +137 -0
- package/src/schema/type-conversion/type-mapping.ts +153 -0
- package/src/shared/connection-pool.ts +5 -5
- package/src/sql-driver/better-sqlite3.test.ts +126 -0
- package/src/sql-driver/connection/connection-provider.ts +27 -0
- package/src/sql-driver/connection/single-connection-provider.ts +42 -0
- package/src/sql-driver/dialect-adapter/dialect-adapter.ts +9 -0
- package/src/sql-driver/dialect-adapter/sqlite-dialect-adapter.ts +7 -0
- package/src/sql-driver/dialects/dialects.ts +1 -0
- package/src/sql-driver/dialects/durable-object-dialect.ts +260 -0
- package/src/sql-driver/driver/runtime-driver.ts +91 -0
- package/src/sql-driver/query-executor/default-query-executor.ts +38 -0
- package/src/sql-driver/query-executor/plugin.ts +22 -0
- package/src/sql-driver/query-executor/query-executor-base.ts +53 -0
- package/src/sql-driver/query-executor/query-executor.ts +44 -0
- package/src/sql-driver/sql-driver-adapter.ts +96 -0
- package/src/sql-driver/sql-driver.ts +53 -0
- package/src/sql-driver/sql.ts +57 -0
- package/src/sql-driver/sqlocal.test.ts +117 -0
- package/src/with-database.ts +152 -0
- package/tsdown.config.ts +8 -2
- package/dist/adapters/drizzle/drizzle-connection-pool.js +0 -40
- package/dist/adapters/drizzle/drizzle-connection-pool.js.map +0 -1
- package/dist/adapters/drizzle/drizzle-query.d.ts +0 -23
- package/dist/adapters/drizzle/drizzle-query.d.ts.map +0 -1
- package/dist/adapters/drizzle/drizzle-query.js.map +0 -1
- package/dist/adapters/drizzle/drizzle-uow-compiler.d.ts +0 -10
- package/dist/adapters/drizzle/drizzle-uow-compiler.d.ts.map +0 -1
- package/dist/adapters/drizzle/drizzle-uow-compiler.js +0 -315
- package/dist/adapters/drizzle/drizzle-uow-compiler.js.map +0 -1
- package/dist/adapters/drizzle/drizzle-uow-decoder.js +0 -116
- package/dist/adapters/drizzle/drizzle-uow-decoder.js.map +0 -1
- package/dist/adapters/drizzle/drizzle-uow-executor.js +0 -149
- package/dist/adapters/drizzle/drizzle-uow-executor.js.map +0 -1
- package/dist/adapters/drizzle/join-column-utils.js +0 -28
- package/dist/adapters/drizzle/join-column-utils.js.map +0 -1
- package/dist/adapters/drizzle/shared.d.ts +0 -14
- package/dist/adapters/drizzle/shared.d.ts.map +0 -1
- package/dist/adapters/drizzle/shared.js +0 -35
- package/dist/adapters/drizzle/shared.js.map +0 -1
- package/dist/adapters/kysely/kysely-connection-pool.js +0 -41
- package/dist/adapters/kysely/kysely-connection-pool.js.map +0 -1
- package/dist/adapters/kysely/kysely-query-builder.js +0 -321
- package/dist/adapters/kysely/kysely-query-builder.js.map +0 -1
- package/dist/adapters/kysely/kysely-query-compiler.js +0 -66
- package/dist/adapters/kysely/kysely-query-compiler.js.map +0 -1
- package/dist/adapters/kysely/kysely-query.d.ts +0 -22
- package/dist/adapters/kysely/kysely-query.d.ts.map +0 -1
- package/dist/adapters/kysely/kysely-query.js +0 -223
- package/dist/adapters/kysely/kysely-query.js.map +0 -1
- package/dist/adapters/kysely/kysely-shared.d.ts.map +0 -1
- package/dist/adapters/kysely/kysely-shared.js +0 -18
- package/dist/adapters/kysely/kysely-shared.js.map +0 -1
- package/dist/adapters/kysely/kysely-uow-compiler.js +0 -170
- package/dist/adapters/kysely/kysely-uow-compiler.js.map +0 -1
- package/dist/adapters/kysely/kysely-uow-executor.js +0 -89
- package/dist/adapters/kysely/kysely-uow-executor.js.map +0 -1
- package/dist/adapters/kysely/migration/execute-base.js +0 -128
- package/dist/adapters/kysely/migration/execute-base.js.map +0 -1
- package/dist/adapters/kysely/migration/execute-factory.js +0 -34
- package/dist/adapters/kysely/migration/execute-factory.js.map +0 -1
- package/dist/adapters/kysely/migration/execute-mssql.js +0 -112
- package/dist/adapters/kysely/migration/execute-mssql.js.map +0 -1
- package/dist/adapters/kysely/migration/execute-mysql.js +0 -93
- package/dist/adapters/kysely/migration/execute-mysql.js.map +0 -1
- package/dist/adapters/kysely/migration/execute-postgres.js +0 -104
- package/dist/adapters/kysely/migration/execute-postgres.js.map +0 -1
- package/dist/adapters/kysely/migration/execute-sqlite.js +0 -123
- package/dist/adapters/kysely/migration/execute-sqlite.js.map +0 -1
- package/dist/adapters/kysely/migration/execute.js +0 -34
- package/dist/adapters/kysely/migration/execute.js.map +0 -1
- package/dist/bind-services.d.ts +0 -7
- package/dist/bind-services.d.ts.map +0 -1
- package/dist/bind-services.js +0 -14
- package/dist/bind-services.js.map +0 -1
- package/dist/fragment.d.ts +0 -173
- package/dist/fragment.d.ts.map +0 -1
- package/dist/fragment.js +0 -191
- package/dist/fragment.js.map +0 -1
- package/dist/migration-engine/create.d.ts +0 -37
- package/dist/migration-engine/create.d.ts.map +0 -1
- package/dist/migration-engine/create.js +0 -58
- package/dist/migration-engine/create.js.map +0 -1
- package/dist/migration-engine/shared.d.ts +0 -112
- package/dist/migration-engine/shared.d.ts.map +0 -1
- package/dist/query/query.d.ts.map +0 -1
- package/dist/query/result-transform.js +0 -168
- package/dist/query/result-transform.js.map +0 -1
- package/dist/query/unit-of-work.d.ts.map +0 -1
- package/dist/query/unit-of-work.js.map +0 -1
- package/dist/schema/serialize.js +0 -106
- package/dist/schema/serialize.js.map +0 -1
- package/dist/shared/settings-schema.js +0 -36
- package/dist/shared/settings-schema.js.map +0 -1
- package/src/adapters/drizzle/drizzle-adapter.test.ts +0 -170
- package/src/adapters/drizzle/drizzle-connection-pool.ts +0 -66
- package/src/adapters/drizzle/drizzle-query.test.ts +0 -499
- package/src/adapters/drizzle/drizzle-uow-compiler.test.ts +0 -1383
- package/src/adapters/drizzle/drizzle-uow-compiler.ts +0 -636
- package/src/adapters/drizzle/drizzle-uow-decoder.ts +0 -218
- package/src/adapters/drizzle/drizzle-uow-executor.ts +0 -276
- package/src/adapters/drizzle/join-column-utils.test.ts +0 -79
- package/src/adapters/drizzle/join-column-utils.ts +0 -39
- package/src/adapters/kysely/kysely-connection-pool.ts +0 -70
- package/src/adapters/kysely/kysely-query-builder.test.ts +0 -1344
- package/src/adapters/kysely/kysely-query-builder.ts +0 -666
- package/src/adapters/kysely/kysely-query-compiler.ts +0 -132
- package/src/adapters/kysely/kysely-query.test.ts +0 -498
- package/src/adapters/kysely/kysely-query.ts +0 -390
- package/src/adapters/kysely/kysely-shared.ts +0 -23
- package/src/adapters/kysely/kysely-uow-compiler.test.ts +0 -998
- package/src/adapters/kysely/kysely-uow-compiler.ts +0 -318
- package/src/adapters/kysely/kysely-uow-executor.ts +0 -145
- package/src/adapters/kysely/kysely-uow-joins.test.ts +0 -811
- package/src/adapters/kysely/migration/execute-base.ts +0 -256
- package/src/adapters/kysely/migration/execute-factory.ts +0 -53
- package/src/adapters/kysely/migration/execute-mssql.ts +0 -250
- package/src/adapters/kysely/migration/execute-mysql.ts +0 -211
- package/src/adapters/kysely/migration/execute-postgres.test.ts +0 -2657
- package/src/adapters/kysely/migration/execute-postgres.ts +0 -234
- package/src/adapters/kysely/migration/execute-sqlite.ts +0 -247
- package/src/adapters/kysely/migration/execute.ts +0 -50
- package/src/adapters/kysely/migration/kysely-migrator.test.ts +0 -261
- package/src/bind-services.test.ts +0 -214
- package/src/bind-services.ts +0 -37
- package/src/db-fragment.test.ts +0 -800
- package/src/fragment.ts +0 -727
- package/src/query/result-transform.ts +0 -271
- package/src/query/unit-of-work-multi-schema.test.ts +0 -64
- package/src/query/unit-of-work.test.ts +0 -943
- package/src/schema/serialize.ts +0 -396
- package/src/shared/settings-schema.ts +0 -61
- package/src/uow-context-integration.test.ts +0 -102
- package/src/uow-context.test.ts +0 -182
- /package/dist/query/{query.js → simple-query-interface.js} +0 -0
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
import type { AnySchema } from "../../../schema/create";
|
|
2
|
+
import type { SqlDriverAdapter } from "../../../sql-driver/sql-driver-adapter";
|
|
3
|
+
import type { TableNameMapper } from "../../shared/table-name-mapper";
|
|
4
|
+
import { generateMigrationFromSchema } from "../../../migration-engine/auto-from-schema";
|
|
5
|
+
import { createColdKysely } from "./cold-kysely";
|
|
6
|
+
import { type SQLGenerator } from "./sql-generator";
|
|
7
|
+
import { SQLiteSQLGenerator } from "./dialect/sqlite";
|
|
8
|
+
import { PostgresSQLGenerator } from "./dialect/postgres";
|
|
9
|
+
import { MySQLSQLGenerator } from "./dialect/mysql";
|
|
10
|
+
import { executeMigration, type CompiledMigration } from "./executor";
|
|
11
|
+
import type { SupportedDatabase } from "../driver-config";
|
|
12
|
+
import type { Kysely } from "kysely";
|
|
13
|
+
/**
|
|
14
|
+
* Options for executing a migration.
|
|
15
|
+
*/
|
|
16
|
+
export interface ExecuteOptions {
|
|
17
|
+
/**
|
|
18
|
+
* Whether to automatically update the schema version in the database after migration.
|
|
19
|
+
* If not specified, uses the value from PreparedMigrationsConfig.
|
|
20
|
+
*/
|
|
21
|
+
updateVersionInMigration?: boolean;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Interface for preparing and executing migrations.
|
|
26
|
+
* Provides a clean separation between compilation (SQL generation) and execution.
|
|
27
|
+
*/
|
|
28
|
+
export interface PreparedMigrations {
|
|
29
|
+
/**
|
|
30
|
+
* Execute migration from one version to another.
|
|
31
|
+
* This performs all three phases:
|
|
32
|
+
* - Phase 1: schema → operations
|
|
33
|
+
* - Phase 2: operations → SQL
|
|
34
|
+
* - Phase 3: SQL → database
|
|
35
|
+
*
|
|
36
|
+
* @param fromVersion - Current database version (0 for new database)
|
|
37
|
+
* @param toVersion - Target schema version (defaults to schema.version)
|
|
38
|
+
* @param options - Optional execution options (overrides config defaults)
|
|
39
|
+
*/
|
|
40
|
+
execute(fromVersion: number, toVersion?: number, options?: ExecuteOptions): Promise<void>;
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Execute migration using a specific driver.
|
|
44
|
+
* Useful for testing or when you need to use a different driver than the one provided in config.
|
|
45
|
+
*
|
|
46
|
+
* @param driver - SQL driver to use for execution
|
|
47
|
+
* @param fromVersion - Current database version (0 for new database)
|
|
48
|
+
* @param toVersion - Target schema version (defaults to schema.version)
|
|
49
|
+
* @param options - Optional execution options (overrides config defaults)
|
|
50
|
+
*/
|
|
51
|
+
executeWithDriver(
|
|
52
|
+
driver: SqlDriverAdapter,
|
|
53
|
+
fromVersion: number,
|
|
54
|
+
toVersion?: number,
|
|
55
|
+
options?: ExecuteOptions,
|
|
56
|
+
): Promise<void>;
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* Get the SQL for a migration from one version to another without executing it.
|
|
60
|
+
* Useful for generating migration files or previewing changes.
|
|
61
|
+
*
|
|
62
|
+
* @param fromVersion - Current database version (0 for new database)
|
|
63
|
+
* @param toVersion - Target schema version (defaults to schema.version)
|
|
64
|
+
* @param options - Optional execution options (affects version update SQL)
|
|
65
|
+
* @returns SQL string for the migration
|
|
66
|
+
*/
|
|
67
|
+
getSQL(fromVersion: number, toVersion?: number, options?: ExecuteOptions): string;
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* Get the compiled migration for a version range.
|
|
71
|
+
* Returns both the SQL statements and the version information.
|
|
72
|
+
*
|
|
73
|
+
* @param fromVersion - Current database version (0 for new database)
|
|
74
|
+
* @param toVersion - Target schema version (defaults to schema.version)
|
|
75
|
+
* @param options - Optional execution options (affects version update SQL)
|
|
76
|
+
* @returns Compiled migration with statements and version info
|
|
77
|
+
*/
|
|
78
|
+
compile(fromVersion: number, toVersion?: number, options?: ExecuteOptions): CompiledMigration;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* Configuration for creating a PreparedMigrations instance.
|
|
83
|
+
*/
|
|
84
|
+
export interface PreparedMigrationsConfig {
|
|
85
|
+
schema: AnySchema;
|
|
86
|
+
namespace: string;
|
|
87
|
+
database: SupportedDatabase;
|
|
88
|
+
mapper?: TableNameMapper;
|
|
89
|
+
driver?: SqlDriverAdapter;
|
|
90
|
+
/**
|
|
91
|
+
* Whether to automatically update the schema version in the database after migration.
|
|
92
|
+
* Defaults to true. Can be overridden per execution via ExecuteOptions.
|
|
93
|
+
*/
|
|
94
|
+
updateVersionInMigration?: boolean;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* Create a PreparedMigrations instance for a schema and namespace.
|
|
99
|
+
*/
|
|
100
|
+
export function createPreparedMigrations(config: PreparedMigrationsConfig): PreparedMigrations {
|
|
101
|
+
const {
|
|
102
|
+
schema,
|
|
103
|
+
namespace,
|
|
104
|
+
database,
|
|
105
|
+
driver,
|
|
106
|
+
updateVersionInMigration: defaultUpdateVersion = true,
|
|
107
|
+
} = config;
|
|
108
|
+
|
|
109
|
+
// Create the cold Kysely instance for SQL generation
|
|
110
|
+
const coldKysely = createColdKysely(database);
|
|
111
|
+
|
|
112
|
+
// Create the appropriate SQL generator for the database
|
|
113
|
+
const generator = createSQLGenerator(database, coldKysely);
|
|
114
|
+
|
|
115
|
+
/**
|
|
116
|
+
* Internal method to compile a migration for a given version range.
|
|
117
|
+
*/
|
|
118
|
+
function compile(
|
|
119
|
+
fromVersion: number,
|
|
120
|
+
toVersion: number,
|
|
121
|
+
updateVersionInMigration: boolean,
|
|
122
|
+
): CompiledMigration {
|
|
123
|
+
// Validate version numbers
|
|
124
|
+
if (fromVersion < 0) {
|
|
125
|
+
throw new Error(`fromVersion cannot be negative: ${fromVersion}`);
|
|
126
|
+
}
|
|
127
|
+
if (toVersion < 0) {
|
|
128
|
+
throw new Error(`toVersion cannot be negative: ${toVersion}`);
|
|
129
|
+
}
|
|
130
|
+
if (toVersion < fromVersion) {
|
|
131
|
+
throw new Error(
|
|
132
|
+
`Cannot migrate backwards: fromVersion (${fromVersion}) > toVersion (${toVersion})`,
|
|
133
|
+
);
|
|
134
|
+
}
|
|
135
|
+
if (toVersion > schema.version) {
|
|
136
|
+
throw new Error(`toVersion (${toVersion}) exceeds schema version (${schema.version})`);
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
// Phase 1: Generate migration operations from schema
|
|
140
|
+
const operations = generateMigrationFromSchema(schema, fromVersion, toVersion);
|
|
141
|
+
|
|
142
|
+
// Phase 2: Compile operations to SQL
|
|
143
|
+
const statements = generator.compile(operations, config.mapper);
|
|
144
|
+
|
|
145
|
+
// Add version update SQL if requested
|
|
146
|
+
if (updateVersionInMigration && toVersion !== fromVersion) {
|
|
147
|
+
const versionUpdate = generator.generateVersionUpdateSQL(namespace, fromVersion, toVersion);
|
|
148
|
+
statements.push(versionUpdate);
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
return {
|
|
152
|
+
statements,
|
|
153
|
+
fromVersion,
|
|
154
|
+
toVersion,
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
return {
|
|
159
|
+
async execute(fromVersion, toVersion, options) {
|
|
160
|
+
if (!driver) {
|
|
161
|
+
throw new Error(
|
|
162
|
+
"Driver not provided. Cannot execute migration. Use `executeWithDriver` instead.",
|
|
163
|
+
);
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
return this.executeWithDriver(driver, fromVersion, toVersion, options);
|
|
167
|
+
},
|
|
168
|
+
|
|
169
|
+
async executeWithDriver(driverToUse, fromVersion, toVersion, options) {
|
|
170
|
+
// Use option if provided, otherwise use config default
|
|
171
|
+
const updateVersionInMigration = options?.updateVersionInMigration ?? defaultUpdateVersion;
|
|
172
|
+
const targetVersion = toVersion ?? schema.version;
|
|
173
|
+
|
|
174
|
+
// Compile the migration (this will validate the version numbers)
|
|
175
|
+
const migration = compile(fromVersion, targetVersion, updateVersionInMigration);
|
|
176
|
+
|
|
177
|
+
// Execute the migration
|
|
178
|
+
await executeMigration(driverToUse, migration);
|
|
179
|
+
},
|
|
180
|
+
|
|
181
|
+
getSQL(fromVersion, toVersion, options) {
|
|
182
|
+
const updateVersionInMigration = options?.updateVersionInMigration ?? defaultUpdateVersion;
|
|
183
|
+
const targetVersion = toVersion ?? schema.version;
|
|
184
|
+
|
|
185
|
+
const migration = compile(fromVersion, targetVersion, updateVersionInMigration);
|
|
186
|
+
return migration.statements.map((stmt) => stmt.sql + ";").join("\n\n");
|
|
187
|
+
},
|
|
188
|
+
|
|
189
|
+
compile(fromVersion, toVersion, options) {
|
|
190
|
+
const updateVersionInMigration = options?.updateVersionInMigration ?? defaultUpdateVersion;
|
|
191
|
+
const targetVersion = toVersion ?? schema.version;
|
|
192
|
+
|
|
193
|
+
return compile(fromVersion, targetVersion, updateVersionInMigration);
|
|
194
|
+
},
|
|
195
|
+
};
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
/**
|
|
199
|
+
* Create the appropriate SQL generator for a database type.
|
|
200
|
+
*/
|
|
201
|
+
function createSQLGenerator(
|
|
202
|
+
database: SupportedDatabase,
|
|
203
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
204
|
+
coldKysely: Kysely<any>,
|
|
205
|
+
): SQLGenerator {
|
|
206
|
+
switch (database) {
|
|
207
|
+
case "sqlite":
|
|
208
|
+
return new SQLiteSQLGenerator(coldKysely, database);
|
|
209
|
+
case "postgresql":
|
|
210
|
+
return new PostgresSQLGenerator(coldKysely, database);
|
|
211
|
+
case "mysql":
|
|
212
|
+
return new MySQLSQLGenerator(coldKysely, database);
|
|
213
|
+
}
|
|
214
|
+
}
|
|
@@ -0,0 +1,413 @@
|
|
|
1
|
+
import {
|
|
2
|
+
type ColumnDefinitionBuilder,
|
|
3
|
+
type CompiledQuery,
|
|
4
|
+
type CreateTableBuilder,
|
|
5
|
+
type Kysely,
|
|
6
|
+
type RawBuilder,
|
|
7
|
+
sql,
|
|
8
|
+
} from "kysely";
|
|
9
|
+
import { createHash } from "node:crypto";
|
|
10
|
+
import type {
|
|
11
|
+
ColumnInfo,
|
|
12
|
+
ColumnOperation,
|
|
13
|
+
MigrationOperation,
|
|
14
|
+
} from "../../../migration-engine/shared";
|
|
15
|
+
import { SETTINGS_TABLE_NAME } from "../../../fragments/internal-fragment";
|
|
16
|
+
import type { TableNameMapper } from "../../shared/table-name-mapper";
|
|
17
|
+
import type { SupportedDatabase } from "../driver-config";
|
|
18
|
+
import { createSQLTypeMapper } from "../../../schema/type-conversion/create-sql-type-mapper";
|
|
19
|
+
|
|
20
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
21
|
+
type KyselyAny = Kysely<any>;
|
|
22
|
+
|
|
23
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
24
|
+
type CreateTableBuilderAny = CreateTableBuilder<any, any>;
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Interface for compiling migration operations to SQL.
|
|
28
|
+
*/
|
|
29
|
+
export interface CompilableQuery {
|
|
30
|
+
compile(): CompiledQuery;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Abstract base class for SQL generation from migration operations.
|
|
35
|
+
* Each database dialect extends this class and implements the abstract methods.
|
|
36
|
+
*/
|
|
37
|
+
export abstract class SQLGenerator {
|
|
38
|
+
protected readonly db: KyselyAny;
|
|
39
|
+
protected readonly database: SupportedDatabase;
|
|
40
|
+
protected readonly typeMapper: ReturnType<typeof createSQLTypeMapper>;
|
|
41
|
+
|
|
42
|
+
constructor(db: KyselyAny, database: SupportedDatabase) {
|
|
43
|
+
this.db = db;
|
|
44
|
+
this.database = database;
|
|
45
|
+
this.typeMapper = createSQLTypeMapper(database);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Preprocess operations before SQL generation.
|
|
50
|
+
* Dialects can override to transform operations based on database capabilities.
|
|
51
|
+
* For example, SQLite merges FK operations into create-table operations.
|
|
52
|
+
*/
|
|
53
|
+
abstract preprocess(operations: MigrationOperation[]): MigrationOperation[];
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Apply auto-increment to a column builder.
|
|
57
|
+
* PostgreSQL uses SERIAL types so this is a no-op there.
|
|
58
|
+
*/
|
|
59
|
+
abstract applyAutoIncrement(builder: ColumnDefinitionBuilder): ColumnDefinitionBuilder;
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* Get the default value for a column, or undefined if not supported.
|
|
63
|
+
* MySQL returns undefined for TEXT columns since it doesn't support defaults there.
|
|
64
|
+
*/
|
|
65
|
+
abstract getDefaultValue(column: ColumnInfo): RawBuilder<unknown> | undefined;
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Generate SQL for updating the schema version in the settings table.
|
|
69
|
+
* This is the same across all databases.
|
|
70
|
+
*/
|
|
71
|
+
generateVersionUpdateSQL(
|
|
72
|
+
namespace: string,
|
|
73
|
+
fromVersion: number,
|
|
74
|
+
toVersion: number,
|
|
75
|
+
): CompiledQuery {
|
|
76
|
+
const key = `${namespace}.schema_version`;
|
|
77
|
+
|
|
78
|
+
if (fromVersion === 0) {
|
|
79
|
+
// Insert new version record
|
|
80
|
+
const id = createHash("md5").update(key).digest("base64url").replace(/=/g, "");
|
|
81
|
+
return this.db
|
|
82
|
+
.insertInto(SETTINGS_TABLE_NAME)
|
|
83
|
+
.values({
|
|
84
|
+
id: sql.lit(id),
|
|
85
|
+
key: sql.lit(key),
|
|
86
|
+
value: sql.lit(toVersion.toString()),
|
|
87
|
+
})
|
|
88
|
+
.compile();
|
|
89
|
+
} else {
|
|
90
|
+
// Update existing version record
|
|
91
|
+
return this.db
|
|
92
|
+
.updateTable(SETTINGS_TABLE_NAME)
|
|
93
|
+
.set({
|
|
94
|
+
value: sql.lit(toVersion.toString()),
|
|
95
|
+
})
|
|
96
|
+
.where("key", "=", sql.lit(key))
|
|
97
|
+
.compile();
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* Compile migration operations to SQL statements.
|
|
103
|
+
* This is the main entry point for SQL generation.
|
|
104
|
+
*/
|
|
105
|
+
compile(operations: MigrationOperation[], mapper?: TableNameMapper): CompiledQuery[] {
|
|
106
|
+
const preprocessed = this.preprocess(operations);
|
|
107
|
+
const queries: CompiledQuery[] = [];
|
|
108
|
+
|
|
109
|
+
for (const operation of preprocessed) {
|
|
110
|
+
const compiled = this.compileOperation(operation, mapper);
|
|
111
|
+
if (Array.isArray(compiled)) {
|
|
112
|
+
queries.push(...compiled);
|
|
113
|
+
} else {
|
|
114
|
+
queries.push(compiled);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
return queries;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
/**
|
|
122
|
+
* Compile a single migration operation to SQL.
|
|
123
|
+
*/
|
|
124
|
+
protected compileOperation(
|
|
125
|
+
operation: MigrationOperation,
|
|
126
|
+
mapper?: TableNameMapper,
|
|
127
|
+
): CompiledQuery | CompiledQuery[] {
|
|
128
|
+
switch (operation.type) {
|
|
129
|
+
case "create-table":
|
|
130
|
+
return this.compileCreateTable(operation, mapper);
|
|
131
|
+
case "rename-table":
|
|
132
|
+
return this.compileRenameTable(operation, mapper);
|
|
133
|
+
case "alter-table":
|
|
134
|
+
return this.compileAlterTable(operation, mapper);
|
|
135
|
+
case "drop-table":
|
|
136
|
+
return this.compileDropTable(operation, mapper);
|
|
137
|
+
case "add-foreign-key":
|
|
138
|
+
return this.compileAddForeignKey(operation, mapper);
|
|
139
|
+
case "drop-foreign-key":
|
|
140
|
+
return this.compileDropForeignKey(operation, mapper);
|
|
141
|
+
case "add-index":
|
|
142
|
+
return this.compileAddIndex(operation, mapper);
|
|
143
|
+
case "drop-index":
|
|
144
|
+
return this.compileDropIndex(operation, mapper);
|
|
145
|
+
case "custom":
|
|
146
|
+
return this.compileCustom(operation);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
/**
|
|
151
|
+
* Compile a create-table operation.
|
|
152
|
+
* Subclasses can override to add FK constraints inline (e.g., SQLite).
|
|
153
|
+
*/
|
|
154
|
+
protected compileCreateTable(
|
|
155
|
+
operation: Extract<MigrationOperation, { type: "create-table" }>,
|
|
156
|
+
mapper?: TableNameMapper,
|
|
157
|
+
): CompiledQuery {
|
|
158
|
+
const tableName = this.getTableName(operation.name, mapper);
|
|
159
|
+
let builder: CreateTableBuilderAny = this.db.schema.createTable(tableName);
|
|
160
|
+
|
|
161
|
+
for (const col of operation.columns) {
|
|
162
|
+
builder = builder.addColumn(col.name, sql.raw(this.getDBType(col)), (b) =>
|
|
163
|
+
this.buildColumn(col, b),
|
|
164
|
+
);
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
// Allow subclasses to add inline foreign keys
|
|
168
|
+
builder = this.addInlineForeignKeys(builder, operation, mapper);
|
|
169
|
+
|
|
170
|
+
return builder.compile();
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
/**
|
|
174
|
+
* Hook for subclasses to add inline foreign keys to create-table.
|
|
175
|
+
* SQLite overrides this to add FKs at table creation time.
|
|
176
|
+
*/
|
|
177
|
+
protected addInlineForeignKeys(
|
|
178
|
+
builder: CreateTableBuilderAny,
|
|
179
|
+
_operation: Extract<MigrationOperation, { type: "create-table" }>,
|
|
180
|
+
_mapper?: TableNameMapper,
|
|
181
|
+
): CreateTableBuilderAny {
|
|
182
|
+
return builder;
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
/**
|
|
186
|
+
* Compile a rename-table operation.
|
|
187
|
+
*/
|
|
188
|
+
protected compileRenameTable(
|
|
189
|
+
operation: Extract<MigrationOperation, { type: "rename-table" }>,
|
|
190
|
+
mapper?: TableNameMapper,
|
|
191
|
+
): CompiledQuery {
|
|
192
|
+
return this.db.schema
|
|
193
|
+
.alterTable(this.getTableName(operation.from, mapper))
|
|
194
|
+
.renameTo(this.getTableName(operation.to, mapper))
|
|
195
|
+
.compile();
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
/**
|
|
199
|
+
* Compile an alter-table operation.
|
|
200
|
+
*/
|
|
201
|
+
protected compileAlterTable(
|
|
202
|
+
operation: Extract<MigrationOperation, { type: "alter-table" }>,
|
|
203
|
+
mapper?: TableNameMapper,
|
|
204
|
+
): CompiledQuery[] {
|
|
205
|
+
const queries: CompiledQuery[] = [];
|
|
206
|
+
const tableName = this.getTableName(operation.name, mapper);
|
|
207
|
+
|
|
208
|
+
for (const columnOp of operation.value) {
|
|
209
|
+
const compiled = this.compileColumnOperation(tableName, columnOp);
|
|
210
|
+
if (Array.isArray(compiled)) {
|
|
211
|
+
queries.push(...compiled);
|
|
212
|
+
} else {
|
|
213
|
+
queries.push(compiled);
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
return queries;
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
/**
|
|
221
|
+
* Compile a column operation within an alter-table.
|
|
222
|
+
* Subclasses override for database-specific handling (e.g., MySQL's modifyColumn).
|
|
223
|
+
*/
|
|
224
|
+
protected compileColumnOperation(
|
|
225
|
+
tableName: string,
|
|
226
|
+
operation: ColumnOperation,
|
|
227
|
+
): CompiledQuery | CompiledQuery[] {
|
|
228
|
+
const alter = () => this.db.schema.alterTable(tableName);
|
|
229
|
+
|
|
230
|
+
switch (operation.type) {
|
|
231
|
+
case "rename-column":
|
|
232
|
+
return alter().renameColumn(operation.from, operation.to).compile();
|
|
233
|
+
|
|
234
|
+
case "drop-column":
|
|
235
|
+
return alter().dropColumn(operation.name).compile();
|
|
236
|
+
|
|
237
|
+
case "create-column": {
|
|
238
|
+
const col = operation.value;
|
|
239
|
+
return alter()
|
|
240
|
+
.addColumn(col.name, sql.raw(this.getDBType(col)), (b) => this.buildColumn(col, b))
|
|
241
|
+
.compile();
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
case "update-column":
|
|
245
|
+
return this.compileUpdateColumn(tableName, operation);
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
/**
|
|
250
|
+
* Compile an update-column operation.
|
|
251
|
+
* Must be implemented by subclasses since each database handles this differently.
|
|
252
|
+
*/
|
|
253
|
+
protected abstract compileUpdateColumn(
|
|
254
|
+
tableName: string,
|
|
255
|
+
operation: Extract<ColumnOperation, { type: "update-column" }>,
|
|
256
|
+
): CompiledQuery | CompiledQuery[];
|
|
257
|
+
|
|
258
|
+
/**
|
|
259
|
+
* Compile a drop-table operation.
|
|
260
|
+
*/
|
|
261
|
+
protected compileDropTable(
|
|
262
|
+
operation: Extract<MigrationOperation, { type: "drop-table" }>,
|
|
263
|
+
mapper?: TableNameMapper,
|
|
264
|
+
): CompiledQuery {
|
|
265
|
+
return this.db.schema.dropTable(this.getTableName(operation.name, mapper)).compile();
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
/**
|
|
269
|
+
* Compile an add-foreign-key operation.
|
|
270
|
+
* Subclasses can throw if not supported (e.g., SQLite).
|
|
271
|
+
*/
|
|
272
|
+
protected compileAddForeignKey(
|
|
273
|
+
operation: Extract<MigrationOperation, { type: "add-foreign-key" }>,
|
|
274
|
+
mapper?: TableNameMapper,
|
|
275
|
+
): CompiledQuery {
|
|
276
|
+
const { table, value } = operation;
|
|
277
|
+
return this.db.schema
|
|
278
|
+
.alterTable(this.getTableName(table, mapper))
|
|
279
|
+
.addForeignKeyConstraint(
|
|
280
|
+
value.name,
|
|
281
|
+
value.columns,
|
|
282
|
+
this.getTableName(value.referencedTable, mapper),
|
|
283
|
+
value.referencedColumns,
|
|
284
|
+
(b) => b.onUpdate("restrict").onDelete("restrict"),
|
|
285
|
+
)
|
|
286
|
+
.compile();
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
/**
|
|
290
|
+
* Compile a drop-foreign-key operation.
|
|
291
|
+
* Subclasses can throw if not supported (e.g., SQLite).
|
|
292
|
+
*/
|
|
293
|
+
protected compileDropForeignKey(
|
|
294
|
+
operation: Extract<MigrationOperation, { type: "drop-foreign-key" }>,
|
|
295
|
+
mapper?: TableNameMapper,
|
|
296
|
+
): CompiledQuery {
|
|
297
|
+
const { table, name } = operation;
|
|
298
|
+
return this.db.schema
|
|
299
|
+
.alterTable(this.getTableName(table, mapper))
|
|
300
|
+
.dropConstraint(name)
|
|
301
|
+
.ifExists()
|
|
302
|
+
.compile();
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
/**
|
|
306
|
+
* Compile an add-index operation.
|
|
307
|
+
*/
|
|
308
|
+
protected compileAddIndex(
|
|
309
|
+
operation: Extract<MigrationOperation, { type: "add-index" }>,
|
|
310
|
+
mapper?: TableNameMapper,
|
|
311
|
+
): CompiledQuery {
|
|
312
|
+
const tableName = this.getTableName(operation.table, mapper);
|
|
313
|
+
const indexName = this.getIndexName(operation.name, operation.table, mapper);
|
|
314
|
+
let builder = this.db.schema.createIndex(indexName).on(tableName).columns(operation.columns);
|
|
315
|
+
|
|
316
|
+
if (operation.unique) {
|
|
317
|
+
builder = builder.unique();
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
return builder.compile();
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
/**
|
|
324
|
+
* Compile a drop-index operation.
|
|
325
|
+
*/
|
|
326
|
+
protected compileDropIndex(
|
|
327
|
+
operation: Extract<MigrationOperation, { type: "drop-index" }>,
|
|
328
|
+
mapper?: TableNameMapper,
|
|
329
|
+
): CompiledQuery {
|
|
330
|
+
const tableName = this.getTableName(operation.table, mapper);
|
|
331
|
+
const indexName = this.getIndexName(operation.name, operation.table, mapper);
|
|
332
|
+
return this.db.schema.dropIndex(indexName).ifExists().on(tableName).compile();
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
/**
|
|
336
|
+
* Compile a custom SQL operation.
|
|
337
|
+
*/
|
|
338
|
+
protected compileCustom(
|
|
339
|
+
operation: Extract<MigrationOperation, { type: "custom" }>,
|
|
340
|
+
): CompiledQuery {
|
|
341
|
+
// Custom operations have a 'sql' property with raw SQL
|
|
342
|
+
const rawSql = operation["sql"] as string;
|
|
343
|
+
return sql.raw(rawSql).compile(this.db);
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
/**
|
|
347
|
+
* Build a column with all its constraints.
|
|
348
|
+
*/
|
|
349
|
+
protected buildColumn(
|
|
350
|
+
col: ColumnInfo,
|
|
351
|
+
builder: ColumnDefinitionBuilder,
|
|
352
|
+
): ColumnDefinitionBuilder {
|
|
353
|
+
if (!col.isNullable) {
|
|
354
|
+
builder = builder.notNull();
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
if (col.role === "internal-id") {
|
|
358
|
+
builder = builder.primaryKey();
|
|
359
|
+
builder = this.applyAutoIncrement(builder);
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
if (col.role === "external-id") {
|
|
363
|
+
builder = builder.unique();
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
const defaultValue = this.getDefaultValue(col);
|
|
367
|
+
if (defaultValue) {
|
|
368
|
+
builder = builder.defaultTo(defaultValue);
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
return builder;
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
/**
|
|
375
|
+
* Get table name, applying namespace mapping if provided.
|
|
376
|
+
* Settings table is never namespaced.
|
|
377
|
+
*/
|
|
378
|
+
protected getTableName(tableName: string, mapper?: TableNameMapper): string {
|
|
379
|
+
if (tableName === SETTINGS_TABLE_NAME) {
|
|
380
|
+
return tableName;
|
|
381
|
+
}
|
|
382
|
+
return mapper ? mapper.toPhysical(tableName) : tableName;
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
/**
|
|
386
|
+
* Get the physical index name, applying namespace if a mapper is provided.
|
|
387
|
+
* Index names must be globally unique in most databases, so we namespace them
|
|
388
|
+
* to avoid collisions when multiple fragments use the same logical index names.
|
|
389
|
+
*/
|
|
390
|
+
protected getIndexName(indexName: string, tableName: string, mapper?: TableNameMapper): string {
|
|
391
|
+
if (!mapper) {
|
|
392
|
+
return indexName;
|
|
393
|
+
}
|
|
394
|
+
// Create a unique index name by including the physical table name
|
|
395
|
+
// This ensures index names are unique across namespaces
|
|
396
|
+
const physicalTable = mapper.toPhysical(tableName);
|
|
397
|
+
return `${indexName}_${physicalTable}`;
|
|
398
|
+
}
|
|
399
|
+
|
|
400
|
+
/**
|
|
401
|
+
* Get the database type string for a column.
|
|
402
|
+
*/
|
|
403
|
+
protected getDBType(col: ColumnInfo): string {
|
|
404
|
+
return this.typeMapper.getDatabaseType(col);
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
/**
|
|
408
|
+
* Compile raw SQL to a CompiledQuery.
|
|
409
|
+
*/
|
|
410
|
+
protected compileRaw(raw: RawBuilder<unknown>): CompiledQuery {
|
|
411
|
+
return raw.compile(this.db);
|
|
412
|
+
}
|
|
413
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type { DriverConfig } from "../driver-config";
|
|
2
|
+
import type { TableNameMapper } from "../../shared/table-name-mapper";
|
|
3
|
+
import { SQLQueryCompiler, type AnyKysely } from "./sql-query-compiler";
|
|
4
|
+
import { PostgreSQLQueryCompiler } from "./dialect/postgres";
|
|
5
|
+
import { MySQLQueryCompiler } from "./dialect/mysql";
|
|
6
|
+
import { SQLiteQueryCompiler } from "./dialect/sqlite";
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Factory function to create a dialect-specific SQL query compiler.
|
|
10
|
+
*
|
|
11
|
+
* Based on the database type in DriverConfig, returns the appropriate
|
|
12
|
+
* compiler implementation (PostgreSQL, MySQL, or SQLite).
|
|
13
|
+
*
|
|
14
|
+
* @param db - Kysely database instance
|
|
15
|
+
* @param driverConfig - Driver configuration with database type and capabilities
|
|
16
|
+
* @param mapper - Optional table name mapper for namespace prefixing
|
|
17
|
+
* @returns Dialect-specific SQLQueryCompiler instance
|
|
18
|
+
*/
|
|
19
|
+
export function createSQLQueryCompiler(
|
|
20
|
+
db: AnyKysely,
|
|
21
|
+
driverConfig: DriverConfig,
|
|
22
|
+
mapper?: TableNameMapper,
|
|
23
|
+
): SQLQueryCompiler {
|
|
24
|
+
switch (driverConfig.databaseType) {
|
|
25
|
+
case "postgresql":
|
|
26
|
+
return new PostgreSQLQueryCompiler(db, driverConfig, mapper);
|
|
27
|
+
case "mysql":
|
|
28
|
+
return new MySQLQueryCompiler(db, driverConfig, mapper);
|
|
29
|
+
case "sqlite":
|
|
30
|
+
return new SQLiteQueryCompiler(db, driverConfig, mapper);
|
|
31
|
+
default: {
|
|
32
|
+
const exhaustiveCheck: never = driverConfig.databaseType;
|
|
33
|
+
throw new Error(`Unsupported database type: ${exhaustiveCheck}`);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|