@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,28 +1,37 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
import type { MigrationOperation } from "../../../../migration-engine/shared";
|
|
3
|
+
import { createColdKysely } from "../cold-kysely";
|
|
4
|
+
import { MySQLSQLGenerator } from "./mysql";
|
|
5
|
+
|
|
6
|
+
describe("MySQLSQLGenerator", () => {
|
|
7
|
+
const coldKysely = createColdKysely("mysql");
|
|
8
|
+
const generator = new MySQLSQLGenerator(coldKysely, "mysql");
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Helper to compile a single operation and extract the main SQL statement.
|
|
12
|
+
* MySQL wraps operations with FK checks, so the main statement is at index 1.
|
|
13
|
+
*/
|
|
14
|
+
function compileOne(operation: MigrationOperation): string {
|
|
15
|
+
const statements = generator.compile([operation]);
|
|
16
|
+
// MySQL wraps with FK checks: [SET FK=0, ...operations..., SET FK=1]
|
|
17
|
+
expect(statements.length).toBeGreaterThanOrEqual(3);
|
|
18
|
+
expect(statements[0].sql).toBe("SET FOREIGN_KEY_CHECKS = 0");
|
|
19
|
+
expect(statements[statements.length - 1].sql).toBe("SET FOREIGN_KEY_CHECKS = 1");
|
|
20
|
+
return statements[1].sql;
|
|
13
21
|
}
|
|
14
|
-
}
|
|
15
22
|
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
23
|
+
/**
|
|
24
|
+
* Helper to compile a single operation and extract all main SQL statements.
|
|
25
|
+
* For alter-table operations that generate multiple statements.
|
|
26
|
+
*/
|
|
27
|
+
function compileMany(operation: MigrationOperation): string[] {
|
|
28
|
+
const statements = generator.compile([operation]);
|
|
29
|
+
expect(statements.length).toBeGreaterThanOrEqual(2);
|
|
30
|
+
expect(statements[0].sql).toBe("SET FOREIGN_KEY_CHECKS = 0");
|
|
31
|
+
expect(statements[statements.length - 1].sql).toBe("SET FOREIGN_KEY_CHECKS = 1");
|
|
32
|
+
// Return everything except FK check statements
|
|
33
|
+
return statements.slice(1, -1).map((s) => s.sql);
|
|
34
|
+
}
|
|
26
35
|
|
|
27
36
|
describe("create-table", () => {
|
|
28
37
|
it("should generate SQL for simple table with columns", () => {
|
|
@@ -51,14 +60,8 @@ describe("execute() - MySQL", () => {
|
|
|
51
60
|
],
|
|
52
61
|
};
|
|
53
62
|
|
|
54
|
-
const
|
|
55
|
-
|
|
56
|
-
});
|
|
57
|
-
|
|
58
|
-
assertSingleResult(result);
|
|
59
|
-
|
|
60
|
-
const compiled = result.compile();
|
|
61
|
-
expect(compiled.sql).toMatchInlineSnapshot(
|
|
63
|
+
const sql = compileOne(operation);
|
|
64
|
+
expect(sql).toMatchInlineSnapshot(
|
|
62
65
|
`"create table \`users\` (\`id\` integer not null unique, \`name\` text not null, \`email\` text not null)"`,
|
|
63
66
|
);
|
|
64
67
|
});
|
|
@@ -80,15 +83,9 @@ describe("execute() - MySQL", () => {
|
|
|
80
83
|
],
|
|
81
84
|
};
|
|
82
85
|
|
|
83
|
-
const
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
assertSingleResult(result);
|
|
88
|
-
|
|
89
|
-
const compiled = result.compile();
|
|
90
|
-
expect(compiled.sql).toMatchInlineSnapshot(
|
|
91
|
-
`"create table \`test_types\` (\`col_int\` integer not null unique, \`col_bigint\` bigint not null, \`col_decimal\` decimal not null, \`col_bool\` boolean not null, \`col_date\` date not null, \`col_timestamp\` timestamp not null, \`col_json\` json not null, \`col_binary\` longblob not null, \`col_varchar\` varchar(255) not null)"`,
|
|
86
|
+
const sql = compileOne(operation);
|
|
87
|
+
expect(sql).toMatchInlineSnapshot(
|
|
88
|
+
`"create table \`test_types\` (\`col_int\` integer not null unique, \`col_bigint\` bigint not null, \`col_decimal\` decimal not null, \`col_bool\` boolean not null, \`col_date\` date not null, \`col_timestamp\` datetime not null, \`col_json\` json not null, \`col_binary\` longblob not null, \`col_varchar\` varchar(255) not null)"`,
|
|
92
89
|
);
|
|
93
90
|
});
|
|
94
91
|
|
|
@@ -103,14 +100,8 @@ describe("execute() - MySQL", () => {
|
|
|
103
100
|
],
|
|
104
101
|
};
|
|
105
102
|
|
|
106
|
-
const
|
|
107
|
-
|
|
108
|
-
});
|
|
109
|
-
|
|
110
|
-
assertSingleResult(result);
|
|
111
|
-
|
|
112
|
-
const compiled = result.compile();
|
|
113
|
-
expect(compiled.sql).toMatchInlineSnapshot(
|
|
103
|
+
const sql = compileOne(operation);
|
|
104
|
+
expect(sql).toMatchInlineSnapshot(
|
|
114
105
|
`"create table \`nullable_test\` (\`id\` integer not null unique, \`optional_name\` text, \`optional_age\` integer)"`,
|
|
115
106
|
);
|
|
116
107
|
});
|
|
@@ -145,14 +136,9 @@ describe("execute() - MySQL", () => {
|
|
|
145
136
|
],
|
|
146
137
|
};
|
|
147
138
|
|
|
148
|
-
const
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
assertSingleResult(result);
|
|
153
|
-
|
|
154
|
-
const compiled = result.compile();
|
|
155
|
-
expect(compiled.sql).toMatchInlineSnapshot(
|
|
139
|
+
const sql = compileOne(operation);
|
|
140
|
+
// Note: MySQL doesn't support defaults on TEXT columns, so 'status' won't have a default
|
|
141
|
+
expect(sql).toMatchInlineSnapshot(
|
|
156
142
|
`"create table \`defaults_test\` (\`id\` integer not null unique, \`status\` text not null, \`count\` integer default 0 not null, \`is_active\` boolean default true not null)"`,
|
|
157
143
|
);
|
|
158
144
|
});
|
|
@@ -173,15 +159,9 @@ describe("execute() - MySQL", () => {
|
|
|
173
159
|
],
|
|
174
160
|
};
|
|
175
161
|
|
|
176
|
-
const
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
assertSingleResult(result);
|
|
181
|
-
|
|
182
|
-
const compiled = result.compile();
|
|
183
|
-
expect(compiled.sql).toMatchInlineSnapshot(
|
|
184
|
-
`"create table \`timestamps_test\` (\`id\` integer not null unique, \`created_at\` timestamp default CURRENT_TIMESTAMP not null)"`,
|
|
162
|
+
const sql = compileOne(operation);
|
|
163
|
+
expect(sql).toMatchInlineSnapshot(
|
|
164
|
+
`"create table \`timestamps_test\` (\`id\` integer not null unique, \`created_at\` datetime default CURRENT_TIMESTAMP not null)"`,
|
|
185
165
|
);
|
|
186
166
|
});
|
|
187
167
|
|
|
@@ -196,15 +176,25 @@ describe("execute() - MySQL", () => {
|
|
|
196
176
|
],
|
|
197
177
|
};
|
|
198
178
|
|
|
199
|
-
const
|
|
200
|
-
|
|
201
|
-
|
|
179
|
+
const sql = compileOne(operation);
|
|
180
|
+
expect(sql).toMatchInlineSnapshot(
|
|
181
|
+
`"create table \`posts\` (\`id\` integer not null unique, \`user_id\` integer not null, \`title\` text not null)"`,
|
|
182
|
+
);
|
|
183
|
+
});
|
|
202
184
|
|
|
203
|
-
|
|
185
|
+
it("should generate SQL for table with internal-id column (auto_increment)", () => {
|
|
186
|
+
const operation: MigrationOperation = {
|
|
187
|
+
type: "create-table",
|
|
188
|
+
name: "users",
|
|
189
|
+
columns: [
|
|
190
|
+
{ name: "_internalId", type: "bigint", isNullable: false, role: "internal-id" },
|
|
191
|
+
{ name: "name", type: "string", isNullable: false, role: "regular" },
|
|
192
|
+
],
|
|
193
|
+
};
|
|
204
194
|
|
|
205
|
-
const
|
|
206
|
-
expect(
|
|
207
|
-
`"create table \`
|
|
195
|
+
const sql = compileOne(operation);
|
|
196
|
+
expect(sql).toMatchInlineSnapshot(
|
|
197
|
+
`"create table \`users\` (\`_internalId\` bigint not null primary key auto_increment, \`name\` text not null)"`,
|
|
208
198
|
);
|
|
209
199
|
});
|
|
210
200
|
});
|
|
@@ -217,16 +207,8 @@ describe("execute() - MySQL", () => {
|
|
|
217
207
|
to: "new_name",
|
|
218
208
|
};
|
|
219
209
|
|
|
220
|
-
const
|
|
221
|
-
|
|
222
|
-
});
|
|
223
|
-
|
|
224
|
-
assertSingleResult(result);
|
|
225
|
-
|
|
226
|
-
const compiled = result.compile();
|
|
227
|
-
expect(compiled.sql).toMatchInlineSnapshot(
|
|
228
|
-
`"alter table \`old_name\` rename to \`new_name\`"`,
|
|
229
|
-
);
|
|
210
|
+
const sql = compileOne(operation);
|
|
211
|
+
expect(sql).toMatchInlineSnapshot(`"alter table \`old_name\` rename to \`new_name\`"`);
|
|
230
212
|
});
|
|
231
213
|
});
|
|
232
214
|
|
|
@@ -237,14 +219,8 @@ describe("execute() - MySQL", () => {
|
|
|
237
219
|
name: "to_drop",
|
|
238
220
|
};
|
|
239
221
|
|
|
240
|
-
const
|
|
241
|
-
|
|
242
|
-
});
|
|
243
|
-
|
|
244
|
-
assertSingleResult(result);
|
|
245
|
-
|
|
246
|
-
const compiled = result.compile();
|
|
247
|
-
expect(compiled.sql).toMatchInlineSnapshot(`"drop table \`to_drop\`"`);
|
|
222
|
+
const sql = compileOne(operation);
|
|
223
|
+
expect(sql).toMatchInlineSnapshot(`"drop table \`to_drop\`"`);
|
|
248
224
|
});
|
|
249
225
|
});
|
|
250
226
|
|
|
@@ -266,17 +242,9 @@ describe("execute() - MySQL", () => {
|
|
|
266
242
|
],
|
|
267
243
|
};
|
|
268
244
|
|
|
269
|
-
const
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
if (!Array.isArray(results)) {
|
|
274
|
-
throw new Error("Expected array of results");
|
|
275
|
-
}
|
|
276
|
-
|
|
277
|
-
expect(results).toHaveLength(1);
|
|
278
|
-
const compiled = results[0].compile();
|
|
279
|
-
expect(compiled.sql).toMatchInlineSnapshot(
|
|
245
|
+
const statements = compileMany(operation);
|
|
246
|
+
expect(statements).toHaveLength(1);
|
|
247
|
+
expect(statements[0]).toMatchInlineSnapshot(
|
|
280
248
|
`"alter table \`test_table\` add column \`new_column\` text"`,
|
|
281
249
|
);
|
|
282
250
|
});
|
|
@@ -308,19 +276,12 @@ describe("execute() - MySQL", () => {
|
|
|
308
276
|
],
|
|
309
277
|
};
|
|
310
278
|
|
|
311
|
-
const
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
if (!Array.isArray(results)) {
|
|
316
|
-
throw new Error("Expected array of results");
|
|
317
|
-
}
|
|
318
|
-
|
|
319
|
-
expect(results).toHaveLength(2);
|
|
320
|
-
expect(results[0].compile().sql).toMatchInlineSnapshot(
|
|
279
|
+
const statements = compileMany(operation);
|
|
280
|
+
expect(statements).toHaveLength(2);
|
|
281
|
+
expect(statements[0]).toMatchInlineSnapshot(
|
|
321
282
|
`"alter table \`test_table\` add column \`col1\` text"`,
|
|
322
283
|
);
|
|
323
|
-
expect(
|
|
284
|
+
expect(statements[1]).toMatchInlineSnapshot(
|
|
324
285
|
`"alter table \`test_table\` add column \`col2\` integer default 0 not null"`,
|
|
325
286
|
);
|
|
326
287
|
});
|
|
@@ -340,17 +301,9 @@ describe("execute() - MySQL", () => {
|
|
|
340
301
|
],
|
|
341
302
|
};
|
|
342
303
|
|
|
343
|
-
const
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
if (!Array.isArray(results)) {
|
|
348
|
-
throw new Error("Expected array of results");
|
|
349
|
-
}
|
|
350
|
-
|
|
351
|
-
expect(results).toHaveLength(1);
|
|
352
|
-
const compiled = results[0].compile();
|
|
353
|
-
expect(compiled.sql).toMatchInlineSnapshot(
|
|
304
|
+
const statements = compileMany(operation);
|
|
305
|
+
expect(statements).toHaveLength(1);
|
|
306
|
+
expect(statements[0]).toMatchInlineSnapshot(
|
|
354
307
|
`"alter table \`test_table\` rename column \`old_name\` to \`new_name\`"`,
|
|
355
308
|
);
|
|
356
309
|
});
|
|
@@ -369,24 +322,16 @@ describe("execute() - MySQL", () => {
|
|
|
369
322
|
],
|
|
370
323
|
};
|
|
371
324
|
|
|
372
|
-
const
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
if (!Array.isArray(results)) {
|
|
377
|
-
throw new Error("Expected array of results");
|
|
378
|
-
}
|
|
379
|
-
|
|
380
|
-
expect(results).toHaveLength(1);
|
|
381
|
-
const compiled = results[0].compile();
|
|
382
|
-
expect(compiled.sql).toMatchInlineSnapshot(
|
|
325
|
+
const statements = compileMany(operation);
|
|
326
|
+
expect(statements).toHaveLength(1);
|
|
327
|
+
expect(statements[0]).toMatchInlineSnapshot(
|
|
383
328
|
`"alter table \`test_table\` drop column \`to_drop\`"`,
|
|
384
329
|
);
|
|
385
330
|
});
|
|
386
331
|
});
|
|
387
332
|
|
|
388
333
|
describe("alter-table - update-column", () => {
|
|
389
|
-
it("should generate SQL to update column data type (MySQL
|
|
334
|
+
it("should generate SQL to update column data type (MySQL uses MODIFY COLUMN)", () => {
|
|
390
335
|
const operation: MigrationOperation = {
|
|
391
336
|
type: "alter-table",
|
|
392
337
|
name: "test_table",
|
|
@@ -407,17 +352,9 @@ describe("execute() - MySQL", () => {
|
|
|
407
352
|
],
|
|
408
353
|
};
|
|
409
354
|
|
|
410
|
-
const
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
if (!Array.isArray(results)) {
|
|
415
|
-
throw new Error("Expected array of results");
|
|
416
|
-
}
|
|
417
|
-
|
|
418
|
-
expect(results).toHaveLength(1);
|
|
419
|
-
const compiled = results[0].compile();
|
|
420
|
-
expect(compiled.sql).toMatchInlineSnapshot(
|
|
355
|
+
const statements = compileMany(operation);
|
|
356
|
+
expect(statements).toHaveLength(1);
|
|
357
|
+
expect(statements[0]).toMatchInlineSnapshot(
|
|
421
358
|
`"alter table \`test_table\` modify column \`test_col\` integer"`,
|
|
422
359
|
);
|
|
423
360
|
});
|
|
@@ -443,17 +380,9 @@ describe("execute() - MySQL", () => {
|
|
|
443
380
|
],
|
|
444
381
|
};
|
|
445
382
|
|
|
446
|
-
const
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
if (!Array.isArray(results)) {
|
|
451
|
-
throw new Error("Expected array of results");
|
|
452
|
-
}
|
|
453
|
-
|
|
454
|
-
expect(results).toHaveLength(1);
|
|
455
|
-
const compiled = results[0].compile();
|
|
456
|
-
expect(compiled.sql).toMatchInlineSnapshot(
|
|
383
|
+
const statements = compileMany(operation);
|
|
384
|
+
expect(statements).toHaveLength(1);
|
|
385
|
+
expect(statements[0]).toMatchInlineSnapshot(
|
|
457
386
|
`"alter table \`test_table\` modify column \`test_col\` text not null"`,
|
|
458
387
|
);
|
|
459
388
|
});
|
|
@@ -479,17 +408,9 @@ describe("execute() - MySQL", () => {
|
|
|
479
408
|
],
|
|
480
409
|
};
|
|
481
410
|
|
|
482
|
-
const
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
if (!Array.isArray(results)) {
|
|
487
|
-
throw new Error("Expected array of results");
|
|
488
|
-
}
|
|
489
|
-
|
|
490
|
-
expect(results).toHaveLength(1);
|
|
491
|
-
const compiled = results[0].compile();
|
|
492
|
-
expect(compiled.sql).toMatchInlineSnapshot(
|
|
411
|
+
const statements = compileMany(operation);
|
|
412
|
+
expect(statements).toHaveLength(1);
|
|
413
|
+
expect(statements[0]).toMatchInlineSnapshot(
|
|
493
414
|
`"alter table \`test_table\` modify column \`test_col\` text"`,
|
|
494
415
|
);
|
|
495
416
|
});
|
|
@@ -516,17 +437,10 @@ describe("execute() - MySQL", () => {
|
|
|
516
437
|
],
|
|
517
438
|
};
|
|
518
439
|
|
|
519
|
-
const
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
if (!Array.isArray(results)) {
|
|
524
|
-
throw new Error("Expected array of results");
|
|
525
|
-
}
|
|
526
|
-
|
|
527
|
-
expect(results).toHaveLength(1);
|
|
528
|
-
const compiled = results[0].compile();
|
|
529
|
-
expect(compiled.sql).toMatchInlineSnapshot(
|
|
440
|
+
const statements = compileMany(operation);
|
|
441
|
+
expect(statements).toHaveLength(1);
|
|
442
|
+
// Note: MySQL doesn't support defaults on TEXT columns
|
|
443
|
+
expect(statements[0]).toMatchInlineSnapshot(
|
|
530
444
|
`"alter table \`test_table\` modify column \`test_col\` text not null"`,
|
|
531
445
|
);
|
|
532
446
|
});
|
|
@@ -552,17 +466,9 @@ describe("execute() - MySQL", () => {
|
|
|
552
466
|
],
|
|
553
467
|
};
|
|
554
468
|
|
|
555
|
-
const
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
if (!Array.isArray(results)) {
|
|
560
|
-
throw new Error("Expected array of results");
|
|
561
|
-
}
|
|
562
|
-
|
|
563
|
-
expect(results).toHaveLength(1);
|
|
564
|
-
const compiled = results[0].compile();
|
|
565
|
-
expect(compiled.sql).toMatchInlineSnapshot(
|
|
469
|
+
const statements = compileMany(operation);
|
|
470
|
+
expect(statements).toHaveLength(1);
|
|
471
|
+
expect(statements[0]).toMatchInlineSnapshot(
|
|
566
472
|
`"alter table \`test_table\` modify column \`test_col\` text"`,
|
|
567
473
|
);
|
|
568
474
|
});
|
|
@@ -589,16 +495,9 @@ describe("execute() - MySQL", () => {
|
|
|
589
495
|
],
|
|
590
496
|
};
|
|
591
497
|
|
|
592
|
-
const
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
if (!Array.isArray(results)) {
|
|
597
|
-
throw new Error("Expected array of results");
|
|
598
|
-
}
|
|
599
|
-
|
|
600
|
-
expect(results).toHaveLength(1);
|
|
601
|
-
expect(results[0].compile().sql).toMatchInlineSnapshot(
|
|
498
|
+
const statements = compileMany(operation);
|
|
499
|
+
expect(statements).toHaveLength(1);
|
|
500
|
+
expect(statements[0]).toMatchInlineSnapshot(
|
|
602
501
|
`"alter table \`test_table\` modify column \`test_col\` integer default 0 not null"`,
|
|
603
502
|
);
|
|
604
503
|
});
|
|
@@ -624,11 +523,7 @@ describe("execute() - MySQL", () => {
|
|
|
624
523
|
],
|
|
625
524
|
};
|
|
626
525
|
|
|
627
|
-
expect(() =>
|
|
628
|
-
execute(operation, config, () => {
|
|
629
|
-
throw new Error("No custom operations");
|
|
630
|
-
});
|
|
631
|
-
}).toThrow(
|
|
526
|
+
expect(() => generator.compile([operation])).toThrow(
|
|
632
527
|
"ID columns cannot be updated. Not every database supports updating primary keys and often requires workarounds.",
|
|
633
528
|
);
|
|
634
529
|
});
|
|
@@ -654,16 +549,9 @@ describe("execute() - MySQL", () => {
|
|
|
654
549
|
],
|
|
655
550
|
};
|
|
656
551
|
|
|
657
|
-
const
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
if (!Array.isArray(results)) {
|
|
662
|
-
throw new Error("Expected array of results");
|
|
663
|
-
}
|
|
664
|
-
|
|
665
|
-
// No-op should return empty array
|
|
666
|
-
expect(results).toHaveLength(0);
|
|
552
|
+
const statements = compileMany(operation);
|
|
553
|
+
// No-op should return empty array (only FK check statements remain)
|
|
554
|
+
expect(statements).toHaveLength(0);
|
|
667
555
|
});
|
|
668
556
|
|
|
669
557
|
it("should generate SQL for timestamp default", () => {
|
|
@@ -688,18 +576,10 @@ describe("execute() - MySQL", () => {
|
|
|
688
576
|
],
|
|
689
577
|
};
|
|
690
578
|
|
|
691
|
-
const
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
if (!Array.isArray(results)) {
|
|
696
|
-
throw new Error("Expected array of results");
|
|
697
|
-
}
|
|
698
|
-
|
|
699
|
-
expect(results).toHaveLength(1);
|
|
700
|
-
const compiled = results[0].compile();
|
|
701
|
-
expect(compiled.sql).toMatchInlineSnapshot(
|
|
702
|
-
`"alter table \`test_table\` modify column \`updated_at\` timestamp default CURRENT_TIMESTAMP not null"`,
|
|
579
|
+
const statements = compileMany(operation);
|
|
580
|
+
expect(statements).toHaveLength(1);
|
|
581
|
+
expect(statements[0]).toMatchInlineSnapshot(
|
|
582
|
+
`"alter table \`test_table\` modify column \`updated_at\` datetime default CURRENT_TIMESTAMP not null"`,
|
|
703
583
|
);
|
|
704
584
|
});
|
|
705
585
|
});
|
|
@@ -717,14 +597,8 @@ describe("execute() - MySQL", () => {
|
|
|
717
597
|
},
|
|
718
598
|
};
|
|
719
599
|
|
|
720
|
-
const
|
|
721
|
-
|
|
722
|
-
});
|
|
723
|
-
|
|
724
|
-
assertSingleResult(result);
|
|
725
|
-
|
|
726
|
-
const compiled = result.compile();
|
|
727
|
-
expect(compiled.sql).toMatchInlineSnapshot(
|
|
600
|
+
const sql = compileOne(operation);
|
|
601
|
+
expect(sql).toMatchInlineSnapshot(
|
|
728
602
|
`"alter table \`posts\` add constraint \`posts_user_id_fk\` foreign key (\`user_id\`) references \`users\` (\`id\`) on delete restrict on update restrict"`,
|
|
729
603
|
);
|
|
730
604
|
});
|
|
@@ -741,14 +615,8 @@ describe("execute() - MySQL", () => {
|
|
|
741
615
|
},
|
|
742
616
|
};
|
|
743
617
|
|
|
744
|
-
const
|
|
745
|
-
|
|
746
|
-
});
|
|
747
|
-
|
|
748
|
-
assertSingleResult(result);
|
|
749
|
-
|
|
750
|
-
const compiled = result.compile();
|
|
751
|
-
expect(compiled.sql).toMatchInlineSnapshot(
|
|
618
|
+
const sql = compileOne(operation);
|
|
619
|
+
expect(sql).toMatchInlineSnapshot(
|
|
752
620
|
`"alter table \`posts\` add constraint \`posts_user_fk\` foreign key (\`org_id\`, \`user_id\`) references \`users\` (\`org_id\`, \`user_id\`) on delete restrict on update restrict"`,
|
|
753
621
|
);
|
|
754
622
|
});
|
|
@@ -762,14 +630,8 @@ describe("execute() - MySQL", () => {
|
|
|
762
630
|
name: "posts_user_id_fk",
|
|
763
631
|
};
|
|
764
632
|
|
|
765
|
-
const
|
|
766
|
-
|
|
767
|
-
});
|
|
768
|
-
|
|
769
|
-
assertSingleResult(result);
|
|
770
|
-
|
|
771
|
-
const compiled = result.compile();
|
|
772
|
-
expect(compiled.sql).toMatchInlineSnapshot(
|
|
633
|
+
const sql = compileOne(operation);
|
|
634
|
+
expect(sql).toMatchInlineSnapshot(
|
|
773
635
|
`"alter table \`posts\` drop constraint \`posts_user_id_fk\`"`,
|
|
774
636
|
);
|
|
775
637
|
});
|
|
@@ -785,14 +647,8 @@ describe("execute() - MySQL", () => {
|
|
|
785
647
|
unique: false,
|
|
786
648
|
};
|
|
787
649
|
|
|
788
|
-
const
|
|
789
|
-
|
|
790
|
-
});
|
|
791
|
-
|
|
792
|
-
assertSingleResult(result);
|
|
793
|
-
|
|
794
|
-
const compiled = result.compile();
|
|
795
|
-
expect(compiled.sql).toMatchInlineSnapshot(
|
|
650
|
+
const sql = compileOne(operation);
|
|
651
|
+
expect(sql).toMatchInlineSnapshot(
|
|
796
652
|
`"create index \`idx_email\` on \`test_table\` (\`email\`)"`,
|
|
797
653
|
);
|
|
798
654
|
});
|
|
@@ -806,14 +662,8 @@ describe("execute() - MySQL", () => {
|
|
|
806
662
|
unique: true,
|
|
807
663
|
};
|
|
808
664
|
|
|
809
|
-
const
|
|
810
|
-
|
|
811
|
-
});
|
|
812
|
-
|
|
813
|
-
assertSingleResult(result);
|
|
814
|
-
|
|
815
|
-
const compiled = result.compile();
|
|
816
|
-
expect(compiled.sql).toMatchInlineSnapshot(
|
|
665
|
+
const sql = compileOne(operation);
|
|
666
|
+
expect(sql).toMatchInlineSnapshot(
|
|
817
667
|
`"create unique index \`idx_unique_email\` on \`test_table\` (\`email\`)"`,
|
|
818
668
|
);
|
|
819
669
|
});
|
|
@@ -827,14 +677,8 @@ describe("execute() - MySQL", () => {
|
|
|
827
677
|
unique: false,
|
|
828
678
|
};
|
|
829
679
|
|
|
830
|
-
const
|
|
831
|
-
|
|
832
|
-
});
|
|
833
|
-
|
|
834
|
-
assertSingleResult(result);
|
|
835
|
-
|
|
836
|
-
const compiled = result.compile();
|
|
837
|
-
expect(compiled.sql).toMatchInlineSnapshot(
|
|
680
|
+
const sql = compileOne(operation);
|
|
681
|
+
expect(sql).toMatchInlineSnapshot(
|
|
838
682
|
`"create index \`idx_email_name\` on \`test_table\` (\`email\`, \`name\`)"`,
|
|
839
683
|
);
|
|
840
684
|
});
|
|
@@ -848,14 +692,8 @@ describe("execute() - MySQL", () => {
|
|
|
848
692
|
unique: true,
|
|
849
693
|
};
|
|
850
694
|
|
|
851
|
-
const
|
|
852
|
-
|
|
853
|
-
});
|
|
854
|
-
|
|
855
|
-
assertSingleResult(result);
|
|
856
|
-
|
|
857
|
-
const compiled = result.compile();
|
|
858
|
-
expect(compiled.sql).toMatchInlineSnapshot(
|
|
695
|
+
const sql = compileOne(operation);
|
|
696
|
+
expect(sql).toMatchInlineSnapshot(
|
|
859
697
|
`"create unique index \`idx_unique_email_name\` on \`test_table\` (\`email\`, \`name\`)"`,
|
|
860
698
|
);
|
|
861
699
|
});
|
|
@@ -869,192 +707,99 @@ describe("execute() - MySQL", () => {
|
|
|
869
707
|
name: "idx_email",
|
|
870
708
|
};
|
|
871
709
|
|
|
872
|
-
const
|
|
873
|
-
|
|
874
|
-
});
|
|
875
|
-
|
|
876
|
-
assertSingleResult(result);
|
|
877
|
-
|
|
878
|
-
const compiled = result.compile();
|
|
879
|
-
expect(compiled.sql).toMatchInlineSnapshot(`"drop index if exists \`idx_email\`"`);
|
|
710
|
+
const sql = compileOne(operation);
|
|
711
|
+
expect(sql).toMatchInlineSnapshot(`"drop index if exists \`idx_email\` on \`test_table\`"`);
|
|
880
712
|
});
|
|
881
713
|
});
|
|
882
714
|
|
|
883
|
-
describe("
|
|
884
|
-
it("should
|
|
885
|
-
|
|
886
|
-
|
|
887
|
-
|
|
888
|
-
|
|
715
|
+
describe("complex migration scenarios", () => {
|
|
716
|
+
it("should generate correct SQL for full schema migration", () => {
|
|
717
|
+
// Create multiple operations in sequence
|
|
718
|
+
const createUsersOp: MigrationOperation = {
|
|
719
|
+
type: "create-table",
|
|
720
|
+
name: "users",
|
|
721
|
+
columns: [
|
|
722
|
+
{ name: "id", type: "integer", isNullable: false, role: "external-id" },
|
|
723
|
+
{ name: "email", type: "string", isNullable: false, role: "regular" },
|
|
724
|
+
{ name: "name", type: "string", isNullable: false, role: "regular" },
|
|
725
|
+
],
|
|
889
726
|
};
|
|
890
727
|
|
|
891
|
-
|
|
892
|
-
|
|
893
|
-
|
|
894
|
-
|
|
895
|
-
|
|
896
|
-
|
|
897
|
-
// Return a kysely query
|
|
898
|
-
return db.schema.createTable("custom_table").addColumn("id", "integer");
|
|
899
|
-
});
|
|
900
|
-
|
|
901
|
-
expect(customCallbackCalled).toBe(true);
|
|
902
|
-
|
|
903
|
-
assertSingleResult(result);
|
|
904
|
-
|
|
905
|
-
const compiled = result.compile();
|
|
906
|
-
expect(compiled.sql).toContain("create table");
|
|
907
|
-
expect(compiled.sql).toContain("custom_table");
|
|
908
|
-
});
|
|
909
|
-
|
|
910
|
-
it("should support custom operations returning array of nodes", () => {
|
|
911
|
-
const operation: MigrationOperation = {
|
|
912
|
-
type: "custom",
|
|
913
|
-
customType: "multi-operation",
|
|
728
|
+
const addIndexOp: MigrationOperation = {
|
|
729
|
+
type: "add-index",
|
|
730
|
+
table: "users",
|
|
731
|
+
columns: ["email"],
|
|
732
|
+
name: "idx_unique_email",
|
|
733
|
+
unique: true,
|
|
914
734
|
};
|
|
915
735
|
|
|
916
|
-
const
|
|
917
|
-
|
|
918
|
-
|
|
919
|
-
|
|
920
|
-
|
|
921
|
-
|
|
922
|
-
|
|
923
|
-
|
|
924
|
-
|
|
925
|
-
}
|
|
926
|
-
|
|
927
|
-
expect(results).toHaveLength(2);
|
|
928
|
-
expect(results[0].compile().sql).toContain("table1");
|
|
929
|
-
expect(results[1].compile().sql).toContain("table2");
|
|
930
|
-
});
|
|
931
|
-
});
|
|
736
|
+
const createPostsOp: MigrationOperation = {
|
|
737
|
+
type: "create-table",
|
|
738
|
+
name: "posts",
|
|
739
|
+
columns: [
|
|
740
|
+
{ name: "id", type: "integer", isNullable: false, role: "external-id" },
|
|
741
|
+
{ name: "user_id", type: "integer", isNullable: false, role: "reference" },
|
|
742
|
+
{ name: "title", type: "string", isNullable: false, role: "regular" },
|
|
743
|
+
{ name: "content", type: "string", isNullable: false, role: "regular" },
|
|
744
|
+
],
|
|
745
|
+
};
|
|
932
746
|
|
|
933
|
-
|
|
934
|
-
|
|
935
|
-
|
|
936
|
-
|
|
937
|
-
|
|
938
|
-
|
|
939
|
-
|
|
940
|
-
|
|
941
|
-
{ name: "id", type: "integer", isNullable: false, role: "external-id" },
|
|
942
|
-
{ name: "email", type: "string", isNullable: false, role: "regular" },
|
|
943
|
-
{ name: "name", type: "string", isNullable: false, role: "regular" },
|
|
944
|
-
],
|
|
945
|
-
},
|
|
946
|
-
config,
|
|
947
|
-
() => {
|
|
948
|
-
throw new Error("No custom operations");
|
|
747
|
+
const addFkOp: MigrationOperation = {
|
|
748
|
+
type: "add-foreign-key",
|
|
749
|
+
table: "posts",
|
|
750
|
+
value: {
|
|
751
|
+
name: "posts_user_id_fk",
|
|
752
|
+
columns: ["user_id"],
|
|
753
|
+
referencedTable: "users",
|
|
754
|
+
referencedColumns: ["id"],
|
|
949
755
|
},
|
|
950
|
-
|
|
756
|
+
};
|
|
951
757
|
|
|
952
|
-
|
|
758
|
+
const alterPostsOp: MigrationOperation = {
|
|
759
|
+
type: "alter-table",
|
|
760
|
+
name: "posts",
|
|
761
|
+
value: [
|
|
762
|
+
{
|
|
763
|
+
type: "create-column",
|
|
764
|
+
value: {
|
|
765
|
+
name: "published",
|
|
766
|
+
type: "bool",
|
|
767
|
+
isNullable: false,
|
|
768
|
+
role: "regular",
|
|
769
|
+
default: { value: false },
|
|
770
|
+
},
|
|
771
|
+
},
|
|
772
|
+
],
|
|
773
|
+
};
|
|
953
774
|
|
|
954
|
-
|
|
775
|
+
// Compile all operations together
|
|
776
|
+
const statements = generator.compile([
|
|
777
|
+
createUsersOp,
|
|
778
|
+
addIndexOp,
|
|
779
|
+
createPostsOp,
|
|
780
|
+
addFkOp,
|
|
781
|
+
alterPostsOp,
|
|
782
|
+
]);
|
|
783
|
+
|
|
784
|
+
// Should have FK check wrapper + 5 operations
|
|
785
|
+
expect(statements.length).toBe(7);
|
|
786
|
+
expect(statements[0].sql).toBe("SET FOREIGN_KEY_CHECKS = 0");
|
|
787
|
+
expect(statements[1].sql).toMatchInlineSnapshot(
|
|
955
788
|
`"create table \`users\` (\`id\` integer not null unique, \`email\` text not null, \`name\` text not null)"`,
|
|
956
789
|
);
|
|
957
|
-
|
|
958
|
-
// 2. Add unique index on email
|
|
959
|
-
const addIndex = execute(
|
|
960
|
-
{
|
|
961
|
-
type: "add-index",
|
|
962
|
-
table: "users",
|
|
963
|
-
columns: ["email"],
|
|
964
|
-
name: "idx_unique_email",
|
|
965
|
-
unique: true,
|
|
966
|
-
},
|
|
967
|
-
config,
|
|
968
|
-
() => {
|
|
969
|
-
throw new Error("No custom operations");
|
|
970
|
-
},
|
|
971
|
-
);
|
|
972
|
-
|
|
973
|
-
assertSingleResult(addIndex);
|
|
974
|
-
|
|
975
|
-
expect(addIndex.compile().sql).toMatchInlineSnapshot(
|
|
790
|
+
expect(statements[2].sql).toMatchInlineSnapshot(
|
|
976
791
|
`"create unique index \`idx_unique_email\` on \`users\` (\`email\`)"`,
|
|
977
792
|
);
|
|
978
|
-
|
|
979
|
-
// 3. Create posts table
|
|
980
|
-
const createPosts = execute(
|
|
981
|
-
{
|
|
982
|
-
type: "create-table",
|
|
983
|
-
name: "posts",
|
|
984
|
-
columns: [
|
|
985
|
-
{ name: "id", type: "integer", isNullable: false, role: "external-id" },
|
|
986
|
-
{ name: "user_id", type: "integer", isNullable: false, role: "reference" },
|
|
987
|
-
{ name: "title", type: "string", isNullable: false, role: "regular" },
|
|
988
|
-
{ name: "content", type: "string", isNullable: false, role: "regular" },
|
|
989
|
-
],
|
|
990
|
-
},
|
|
991
|
-
config,
|
|
992
|
-
() => {
|
|
993
|
-
throw new Error("No custom operations");
|
|
994
|
-
},
|
|
995
|
-
);
|
|
996
|
-
|
|
997
|
-
assertSingleResult(createPosts);
|
|
998
|
-
|
|
999
|
-
expect(createPosts.compile().sql).toMatchInlineSnapshot(
|
|
793
|
+
expect(statements[3].sql).toMatchInlineSnapshot(
|
|
1000
794
|
`"create table \`posts\` (\`id\` integer not null unique, \`user_id\` integer not null, \`title\` text not null, \`content\` text not null)"`,
|
|
1001
795
|
);
|
|
1002
|
-
|
|
1003
|
-
// 4. Add foreign key
|
|
1004
|
-
const addFk = execute(
|
|
1005
|
-
{
|
|
1006
|
-
type: "add-foreign-key",
|
|
1007
|
-
table: "posts",
|
|
1008
|
-
value: {
|
|
1009
|
-
name: "posts_user_id_fk",
|
|
1010
|
-
columns: ["user_id"],
|
|
1011
|
-
referencedTable: "users",
|
|
1012
|
-
referencedColumns: ["id"],
|
|
1013
|
-
},
|
|
1014
|
-
},
|
|
1015
|
-
config,
|
|
1016
|
-
() => {
|
|
1017
|
-
throw new Error("No custom operations");
|
|
1018
|
-
},
|
|
1019
|
-
);
|
|
1020
|
-
|
|
1021
|
-
assertSingleResult(addFk);
|
|
1022
|
-
|
|
1023
|
-
expect(addFk.compile().sql).toMatchInlineSnapshot(
|
|
796
|
+
expect(statements[4].sql).toMatchInlineSnapshot(
|
|
1024
797
|
`"alter table \`posts\` add constraint \`posts_user_id_fk\` foreign key (\`user_id\`) references \`users\` (\`id\`) on delete restrict on update restrict"`,
|
|
1025
798
|
);
|
|
1026
|
-
|
|
1027
|
-
// 5. Alter posts table to add a new column
|
|
1028
|
-
const alterResults = execute(
|
|
1029
|
-
{
|
|
1030
|
-
type: "alter-table",
|
|
1031
|
-
name: "posts",
|
|
1032
|
-
value: [
|
|
1033
|
-
{
|
|
1034
|
-
type: "create-column",
|
|
1035
|
-
value: {
|
|
1036
|
-
name: "published",
|
|
1037
|
-
type: "bool",
|
|
1038
|
-
isNullable: false,
|
|
1039
|
-
role: "regular",
|
|
1040
|
-
default: { value: false },
|
|
1041
|
-
},
|
|
1042
|
-
},
|
|
1043
|
-
],
|
|
1044
|
-
},
|
|
1045
|
-
config,
|
|
1046
|
-
() => {
|
|
1047
|
-
throw new Error("No custom operations");
|
|
1048
|
-
},
|
|
1049
|
-
);
|
|
1050
|
-
|
|
1051
|
-
if (!Array.isArray(alterResults)) {
|
|
1052
|
-
throw new Error("Expected array of results");
|
|
1053
|
-
}
|
|
1054
|
-
|
|
1055
|
-
expect(alterResults[0].compile().sql).toMatchInlineSnapshot(
|
|
799
|
+
expect(statements[5].sql).toMatchInlineSnapshot(
|
|
1056
800
|
`"alter table \`posts\` add column \`published\` boolean default false not null"`,
|
|
1057
801
|
);
|
|
802
|
+
expect(statements[6].sql).toBe("SET FOREIGN_KEY_CHECKS = 1");
|
|
1058
803
|
});
|
|
1059
804
|
|
|
1060
805
|
it("should handle multiple alter-table operations", () => {
|
|
@@ -1083,22 +828,15 @@ describe("execute() - MySQL", () => {
|
|
|
1083
828
|
],
|
|
1084
829
|
};
|
|
1085
830
|
|
|
1086
|
-
const
|
|
1087
|
-
|
|
1088
|
-
|
|
1089
|
-
|
|
1090
|
-
if (!Array.isArray(results)) {
|
|
1091
|
-
throw new Error("Expected array of results");
|
|
1092
|
-
}
|
|
1093
|
-
|
|
1094
|
-
expect(results).toHaveLength(3);
|
|
1095
|
-
expect(results[0].compile().sql).toMatchInlineSnapshot(
|
|
831
|
+
const statements = compileMany(operation);
|
|
832
|
+
expect(statements).toHaveLength(3);
|
|
833
|
+
expect(statements[0]).toMatchInlineSnapshot(
|
|
1096
834
|
`"alter table \`users\` add column \`age\` integer"`,
|
|
1097
835
|
);
|
|
1098
|
-
expect(
|
|
836
|
+
expect(statements[1]).toMatchInlineSnapshot(
|
|
1099
837
|
`"alter table \`users\` rename column \`name\` to \`full_name\`"`,
|
|
1100
838
|
);
|
|
1101
|
-
expect(
|
|
839
|
+
expect(statements[2]).toMatchInlineSnapshot(
|
|
1102
840
|
`"alter table \`users\` drop column \`old_field\`"`,
|
|
1103
841
|
);
|
|
1104
842
|
});
|
|
@@ -1112,14 +850,8 @@ describe("execute() - MySQL", () => {
|
|
|
1112
850
|
columns: [{ name: "id", type: "integer", isNullable: false, role: "external-id" }],
|
|
1113
851
|
};
|
|
1114
852
|
|
|
1115
|
-
const
|
|
1116
|
-
|
|
1117
|
-
});
|
|
1118
|
-
|
|
1119
|
-
assertSingleResult(result);
|
|
1120
|
-
|
|
1121
|
-
const compiled = result.compile();
|
|
1122
|
-
expect(compiled.sql).toContain("`user-profiles`");
|
|
853
|
+
const sql = compileOne(operation);
|
|
854
|
+
expect(sql).toContain("`user-profiles`");
|
|
1123
855
|
});
|
|
1124
856
|
|
|
1125
857
|
it("should handle column names with special characters", () => {
|
|
@@ -1132,17 +864,11 @@ describe("execute() - MySQL", () => {
|
|
|
1132
864
|
],
|
|
1133
865
|
};
|
|
1134
866
|
|
|
1135
|
-
const
|
|
1136
|
-
|
|
1137
|
-
});
|
|
1138
|
-
|
|
1139
|
-
assertSingleResult(result);
|
|
1140
|
-
|
|
1141
|
-
const compiled = result.compile();
|
|
1142
|
-
expect(compiled.sql).toContain("`user-name`");
|
|
867
|
+
const sql = compileOne(operation);
|
|
868
|
+
expect(sql).toContain("`user-name`");
|
|
1143
869
|
});
|
|
1144
870
|
|
|
1145
|
-
it("should properly
|
|
871
|
+
it("should properly handle string default values (not applied for TEXT columns)", () => {
|
|
1146
872
|
const operation: MigrationOperation = {
|
|
1147
873
|
type: "create-table",
|
|
1148
874
|
name: "test",
|
|
@@ -1158,16 +884,148 @@ describe("execute() - MySQL", () => {
|
|
|
1158
884
|
],
|
|
1159
885
|
};
|
|
1160
886
|
|
|
1161
|
-
const
|
|
1162
|
-
|
|
1163
|
-
|
|
887
|
+
const sql = compileOne(operation);
|
|
888
|
+
// MySQL doesn't support defaults on TEXT columns, so the default is not applied
|
|
889
|
+
expect(sql).toMatchInlineSnapshot(
|
|
890
|
+
`"create table \`test\` (\`id\` integer not null unique, \`status\` text not null)"`,
|
|
891
|
+
);
|
|
892
|
+
});
|
|
893
|
+
});
|
|
1164
894
|
|
|
1165
|
-
|
|
895
|
+
describe("table name mapping", () => {
|
|
896
|
+
const mapper = {
|
|
897
|
+
toPhysical: (name: string) => `prefix_${name}`,
|
|
898
|
+
toLogical: (name: string) => name.replace("prefix_", ""),
|
|
899
|
+
};
|
|
1166
900
|
|
|
1167
|
-
|
|
1168
|
-
|
|
1169
|
-
|
|
901
|
+
it("should apply table name mapping to create-table", () => {
|
|
902
|
+
const operation: MigrationOperation = {
|
|
903
|
+
type: "create-table",
|
|
904
|
+
name: "users",
|
|
905
|
+
columns: [{ name: "id", type: "integer", isNullable: false, role: "external-id" }],
|
|
906
|
+
};
|
|
907
|
+
|
|
908
|
+
const statements = generator.compile([operation], mapper);
|
|
909
|
+
expect(statements[1].sql).toMatchInlineSnapshot(
|
|
910
|
+
`"create table \`prefix_users\` (\`id\` integer not null unique)"`,
|
|
911
|
+
);
|
|
912
|
+
});
|
|
913
|
+
|
|
914
|
+
it("should apply table name mapping to foreign keys", () => {
|
|
915
|
+
const operation: MigrationOperation = {
|
|
916
|
+
type: "add-foreign-key",
|
|
917
|
+
table: "posts",
|
|
918
|
+
value: {
|
|
919
|
+
name: "posts_user_id_fk",
|
|
920
|
+
columns: ["user_id"],
|
|
921
|
+
referencedTable: "users",
|
|
922
|
+
referencedColumns: ["id"],
|
|
923
|
+
},
|
|
924
|
+
};
|
|
925
|
+
|
|
926
|
+
const statements = generator.compile([operation], mapper);
|
|
927
|
+
expect(statements[1].sql).toMatchInlineSnapshot(
|
|
928
|
+
`"alter table \`prefix_posts\` add constraint \`posts_user_id_fk\` foreign key (\`user_id\`) references \`prefix_users\` (\`id\`) on delete restrict on update restrict"`,
|
|
929
|
+
);
|
|
930
|
+
});
|
|
931
|
+
|
|
932
|
+
it("should apply table name mapping to indexes", () => {
|
|
933
|
+
const operation: MigrationOperation = {
|
|
934
|
+
type: "add-index",
|
|
935
|
+
table: "users",
|
|
936
|
+
columns: ["email"],
|
|
937
|
+
name: "idx_email",
|
|
938
|
+
unique: true,
|
|
939
|
+
};
|
|
940
|
+
|
|
941
|
+
const statements = generator.compile([operation], mapper);
|
|
942
|
+
expect(statements[1].sql).toMatchInlineSnapshot(
|
|
943
|
+
`"create unique index \`idx_email_prefix_users\` on \`prefix_users\` (\`email\`)"`,
|
|
1170
944
|
);
|
|
1171
945
|
});
|
|
1172
946
|
});
|
|
947
|
+
|
|
948
|
+
describe("preprocessing", () => {
|
|
949
|
+
it("should wrap operations with FK checks disabled", () => {
|
|
950
|
+
const operations: MigrationOperation[] = [
|
|
951
|
+
{
|
|
952
|
+
type: "create-table",
|
|
953
|
+
name: "users",
|
|
954
|
+
columns: [{ name: "id", type: "string", isNullable: false, role: "external-id" }],
|
|
955
|
+
},
|
|
956
|
+
];
|
|
957
|
+
|
|
958
|
+
const preprocessed = generator.preprocess(operations);
|
|
959
|
+
expect(preprocessed.length).toBe(3);
|
|
960
|
+
expect(preprocessed[0]).toEqual({ type: "custom", sql: "SET FOREIGN_KEY_CHECKS = 0" });
|
|
961
|
+
expect(preprocessed[1]).toEqual(operations[0]);
|
|
962
|
+
expect(preprocessed[2]).toEqual({ type: "custom", sql: "SET FOREIGN_KEY_CHECKS = 1" });
|
|
963
|
+
});
|
|
964
|
+
|
|
965
|
+
it("should return empty array for empty operations", () => {
|
|
966
|
+
const preprocessed = generator.preprocess([]);
|
|
967
|
+
expect(preprocessed).toHaveLength(0);
|
|
968
|
+
});
|
|
969
|
+
});
|
|
970
|
+
|
|
971
|
+
describe("getDefaultValue", () => {
|
|
972
|
+
it("should return undefined for TEXT column defaults", () => {
|
|
973
|
+
const defaultValue = generator.getDefaultValue({
|
|
974
|
+
name: "description",
|
|
975
|
+
type: "string",
|
|
976
|
+
isNullable: true,
|
|
977
|
+
role: "regular",
|
|
978
|
+
default: { value: "default text" },
|
|
979
|
+
});
|
|
980
|
+
|
|
981
|
+
expect(defaultValue).toBeUndefined();
|
|
982
|
+
});
|
|
983
|
+
|
|
984
|
+
it("should return literal value for non-TEXT columns", () => {
|
|
985
|
+
const defaultValue = generator.getDefaultValue({
|
|
986
|
+
name: "count",
|
|
987
|
+
type: "integer",
|
|
988
|
+
isNullable: false,
|
|
989
|
+
role: "regular",
|
|
990
|
+
default: { value: 42 },
|
|
991
|
+
});
|
|
992
|
+
|
|
993
|
+
expect(defaultValue).toBeDefined();
|
|
994
|
+
});
|
|
995
|
+
|
|
996
|
+
it("should return CURRENT_TIMESTAMP for dbSpecial: now", () => {
|
|
997
|
+
const defaultValue = generator.getDefaultValue({
|
|
998
|
+
name: "created_at",
|
|
999
|
+
type: "timestamp",
|
|
1000
|
+
isNullable: false,
|
|
1001
|
+
role: "regular",
|
|
1002
|
+
default: { dbSpecial: "now" },
|
|
1003
|
+
});
|
|
1004
|
+
|
|
1005
|
+
expect(defaultValue).toBeDefined();
|
|
1006
|
+
});
|
|
1007
|
+
|
|
1008
|
+
it("should return undefined for runtime defaults", () => {
|
|
1009
|
+
const defaultValue = generator.getDefaultValue({
|
|
1010
|
+
name: "id",
|
|
1011
|
+
type: "string",
|
|
1012
|
+
isNullable: false,
|
|
1013
|
+
role: "regular",
|
|
1014
|
+
default: { runtime: "cuid" },
|
|
1015
|
+
});
|
|
1016
|
+
|
|
1017
|
+
expect(defaultValue).toBeUndefined();
|
|
1018
|
+
});
|
|
1019
|
+
|
|
1020
|
+
it("should return undefined when no default is set", () => {
|
|
1021
|
+
const defaultValue = generator.getDefaultValue({
|
|
1022
|
+
name: "name",
|
|
1023
|
+
type: "string",
|
|
1024
|
+
isNullable: false,
|
|
1025
|
+
role: "regular",
|
|
1026
|
+
});
|
|
1027
|
+
|
|
1028
|
+
expect(defaultValue).toBeUndefined();
|
|
1029
|
+
});
|
|
1030
|
+
});
|
|
1173
1031
|
});
|