@fragno-dev/db 0.1.15 → 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 -179
- package/CHANGELOG.md +23 -0
- package/README.md +123 -8
- package/dist/adapters/adapters.d.ts +5 -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 -21
- package/dist/adapters/drizzle/drizzle-adapter.d.ts.map +1 -1
- package/dist/adapters/drizzle/drizzle-adapter.js +7 -54
- package/dist/adapters/drizzle/drizzle-adapter.js.map +1 -1
- package/dist/adapters/drizzle/generate.d.ts +3 -0
- package/dist/adapters/drizzle/generate.d.ts.map +1 -1
- package/dist/adapters/drizzle/generate.js +36 -28
- 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 -18
- package/dist/adapters/kysely/kysely-adapter.d.ts.map +1 -1
- package/dist/adapters/kysely/kysely-adapter.js +6 -165
- package/dist/adapters/kysely/kysely-adapter.js.map +1 -1
- package/dist/adapters/{drizzle/drizzle-query.js → shared/from-unit-of-work-compiler.js} +47 -61
- package/dist/adapters/shared/from-unit-of-work-compiler.js.map +1 -0
- package/dist/adapters/{drizzle/shared.d.ts → shared/table-name-mapper.d.ts} +2 -4
- 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 +53 -19
- package/dist/db-fragment-definition-builder.d.ts.map +1 -1
- package/dist/db-fragment-definition-builder.js +89 -19
- package/dist/db-fragment-definition-builder.js.map +1 -1
- package/dist/fragments/internal-fragment.d.ts +39 -5
- package/dist/fragments/internal-fragment.d.ts.map +1 -1
- package/dist/fragments/internal-fragment.js +82 -10
- package/dist/fragments/internal-fragment.js.map +1 -1
- 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 +23 -61
- package/dist/migration-engine/generation-engine.js.map +1 -1
- package/dist/mod.d.ts +34 -10
- package/dist/mod.d.ts.map +1 -1
- package/dist/mod.js +47 -16
- package/dist/mod.js.map +1 -1
- package/dist/node_modules/.pnpm/{rou3@0.7.8 → rou3@0.7.10}/node_modules/rou3/dist/index.js +1 -1
- package/dist/node_modules/.pnpm/rou3@0.7.10/node_modules/rou3/dist/index.js.map +1 -0
- package/dist/packages/fragno/dist/api/fragment-instantiator.js +69 -31
- package/dist/packages/fragno/dist/api/fragment-instantiator.js.map +1 -1
- package/dist/query/column-defaults.js +27 -0
- package/dist/query/column-defaults.js.map +1 -0
- package/dist/query/cursor.d.ts +4 -4
- package/dist/query/cursor.d.ts.map +1 -1
- package/dist/query/cursor.js +8 -6
- 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} +5 -5
- package/dist/query/simple-query-interface.d.ts.map +1 -0
- package/dist/query/{execute-unit-of-work.d.ts → unit-of-work/execute-unit-of-work.d.ts} +13 -3
- package/dist/query/unit-of-work/execute-unit-of-work.d.ts.map +1 -0
- package/dist/query/{execute-unit-of-work.js → unit-of-work/execute-unit-of-work.js} +17 -4
- package/dist/query/unit-of-work/execute-unit-of-work.js.map +1 -0
- package/dist/query/{retry-policy.d.ts → unit-of-work/retry-policy.d.ts} +1 -1
- package/dist/query/unit-of-work/retry-policy.d.ts.map +1 -0
- package/dist/query/{retry-policy.js → unit-of-work/retry-policy.js} +1 -1
- 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} +51 -18
- 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} +58 -11
- 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 +6 -2
- package/dist/with-database.d.ts.map +1 -1
- package/dist/with-database.js +1 -1
- package/dist/with-database.js.map +1 -1
- package/package.json +37 -10
- package/src/adapters/adapters.ts +8 -5
- package/src/adapters/drizzle/drizzle-adapter-pglite.test.ts +60 -169
- package/src/adapters/drizzle/{drizzle-adapter-sqlite.test.ts → drizzle-adapter-sqlite3.test.ts} +31 -55
- package/src/adapters/drizzle/drizzle-adapter.ts +15 -107
- package/src/adapters/drizzle/generate.test.ts +2 -2
- package/src/adapters/drizzle/generate.ts +78 -34
- 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 +3 -3
- 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 +26 -76
- package/src/adapters/kysely/{kysely-adapter-sqlite.test.ts → kysely-adapter-sqlocal.test.ts} +76 -17
- package/src/adapters/kysely/kysely-adapter.ts +10 -250
- package/src/adapters/{drizzle/drizzle-query.ts → shared/from-unit-of-work-compiler.ts} +110 -104
- 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 +2 -2
- package/src/db-fragment-definition-builder.ts +281 -50
- package/src/db-fragment-instantiator.test.ts +78 -2
- package/src/db-fragment-integration.test.ts +14 -16
- package/src/fragments/internal-fragment.test.ts +434 -45
- package/src/fragments/internal-fragment.ts +184 -20
- package/src/hooks/hooks.test.ts +575 -0
- package/src/hooks/hooks.ts +179 -0
- package/src/migration-engine/generation-engine.test.ts +44 -54
- package/src/migration-engine/generation-engine.ts +48 -94
- package/src/mod.ts +117 -29
- package/src/query/column-defaults.ts +49 -0
- package/src/query/cursor.test.ts +31 -6
- package/src/query/cursor.ts +11 -7
- 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} +2 -2
- package/src/query/{execute-unit-of-work.test.ts → unit-of-work/execute-unit-of-work.test.ts} +16 -16
- package/src/query/{execute-unit-of-work.ts → unit-of-work/execute-unit-of-work.ts} +49 -8
- package/src/query/{unit-of-work-coordinator.test.ts → unit-of-work/unit-of-work-coordinator.test.ts} +41 -43
- package/src/query/{unit-of-work-types.test.ts → unit-of-work/unit-of-work-types.test.ts} +5 -3
- package/src/query/{unit-of-work.test.ts → unit-of-work/unit-of-work.test.ts} +100 -9
- package/src/query/{unit-of-work.ts → unit-of-work/unit-of-work.ts} +135 -32
- package/src/query/{result-transform.test.ts → value-decoding.test.ts} +45 -427
- 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 +35 -23
- package/tsdown.config.ts +7 -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 -334
- package/dist/adapters/drizzle/drizzle-uow-compiler.js.map +0 -1
- package/dist/adapters/drizzle/drizzle-uow-decoder.js +0 -123
- package/dist/adapters/drizzle/drizzle-uow-decoder.js.map +0 -1
- package/dist/adapters/drizzle/drizzle-uow-executor.js +0 -160
- 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.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 -67
- package/dist/adapters/kysely/kysely-query-compiler.js.map +0 -1
- package/dist/adapters/kysely/kysely-query.d.ts +0 -23
- package/dist/adapters/kysely/kysely-query.d.ts.map +0 -1
- package/dist/adapters/kysely/kysely-query.js +0 -230
- package/dist/adapters/kysely/kysely-query.js.map +0 -1
- package/dist/adapters/kysely/kysely-shared.d.ts +0 -14
- package/dist/adapters/kysely/kysely-shared.d.ts.map +0 -1
- package/dist/adapters/kysely/kysely-shared.js +0 -33
- package/dist/adapters/kysely/kysely-shared.js.map +0 -1
- package/dist/adapters/kysely/kysely-uow-compiler.js +0 -193
- package/dist/adapters/kysely/kysely-uow-compiler.js.map +0 -1
- package/dist/adapters/kysely/kysely-uow-executor.js +0 -93
- 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/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/node_modules/.pnpm/rou3@0.7.8/node_modules/rou3/dist/index.js.map +0 -1
- package/dist/query/execute-unit-of-work.d.ts.map +0 -1
- package/dist/query/execute-unit-of-work.js.map +0 -1
- package/dist/query/query.d.ts.map +0 -1
- package/dist/query/result-transform.js +0 -170
- package/dist/query/result-transform.js.map +0 -1
- package/dist/query/retry-policy.d.ts.map +0 -1
- package/dist/query/retry-policy.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 -111
- package/dist/schema/serialize.js.map +0 -1
- package/src/adapters/drizzle/drizzle-adapter.test.ts +0 -122
- 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-mysql.test.ts +0 -1442
- package/src/adapters/drizzle/drizzle-uow-compiler-sqlite.test.ts +0 -1414
- package/src/adapters/drizzle/drizzle-uow-compiler.test.ts +0 -1400
- package/src/adapters/drizzle/drizzle-uow-compiler.ts +0 -677
- package/src/adapters/drizzle/drizzle-uow-decoder.ts +0 -228
- package/src/adapters/drizzle/drizzle-uow-executor.ts +0 -309
- 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 -127
- package/src/adapters/kysely/kysely-query.test.ts +0 -498
- package/src/adapters/kysely/kysely-query.ts +0 -399
- package/src/adapters/kysely/kysely-shared.ts +0 -57
- package/src/adapters/kysely/kysely-uow-compiler.test.ts +0 -986
- package/src/adapters/kysely/kysely-uow-compiler.ts +0 -350
- package/src/adapters/kysely/kysely-uow-executor.ts +0 -164
- package/src/adapters/kysely/kysely-uow-joins.test.ts +0 -794
- 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/query/result-transform.ts +0 -274
- package/src/schema/serialize.ts +0 -407
- /package/dist/query/{query.js → simple-query-interface.js} +0 -0
- /package/src/query/{retry-policy.test.ts → unit-of-work/retry-policy.test.ts} +0 -0
- /package/src/query/{retry-policy.ts → unit-of-work/retry-policy.ts} +0 -0
|
@@ -0,0 +1,661 @@
|
|
|
1
|
+
import { describe, expect, test } from "vitest";
|
|
2
|
+
import { column, idColumn, referenceColumn, schema } from "../../../schema/create";
|
|
3
|
+
import { createColdKysely } from "./cold-kysely";
|
|
4
|
+
import { SQLiteSQLGenerator } from "./dialect/sqlite";
|
|
5
|
+
import { PostgresSQLGenerator } from "./dialect/postgres";
|
|
6
|
+
import { MySQLSQLGenerator } from "./dialect/mysql";
|
|
7
|
+
import { createPreparedMigrations } from "./prepared-migrations";
|
|
8
|
+
import { createTableNameMapper } from "../../shared/table-name-mapper";
|
|
9
|
+
|
|
10
|
+
const testSchema = schema((s) => {
|
|
11
|
+
return s
|
|
12
|
+
.addTable("users", (t) => {
|
|
13
|
+
return t.addColumn("id", idColumn()).addColumn("name", column("string"));
|
|
14
|
+
})
|
|
15
|
+
.alterTable("users", (t) => {
|
|
16
|
+
return t
|
|
17
|
+
.addColumn("age", column("integer").nullable())
|
|
18
|
+
.createIndex("name_idx", ["name"])
|
|
19
|
+
.createIndex("age_idx", ["age"]);
|
|
20
|
+
})
|
|
21
|
+
.addTable("posts", (t) => {
|
|
22
|
+
return t
|
|
23
|
+
.addColumn("id", idColumn())
|
|
24
|
+
.addColumn("title", column("string"))
|
|
25
|
+
.addColumn("authorId", referenceColumn());
|
|
26
|
+
})
|
|
27
|
+
.addReference("author", {
|
|
28
|
+
type: "one",
|
|
29
|
+
from: { table: "posts", column: "authorId" },
|
|
30
|
+
to: { table: "users", column: "id" },
|
|
31
|
+
});
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
describe("PreparedMigrations - PostgreSQL", () => {
|
|
35
|
+
const coldKysely = createColdKysely("postgresql");
|
|
36
|
+
const generator = new PostgresSQLGenerator(coldKysely, "postgresql");
|
|
37
|
+
|
|
38
|
+
test("compile migration 0 -> 1 (create users table)", () => {
|
|
39
|
+
const statements = generator.compile(
|
|
40
|
+
[
|
|
41
|
+
{
|
|
42
|
+
type: "create-table",
|
|
43
|
+
name: "users",
|
|
44
|
+
columns: [
|
|
45
|
+
{ name: "id", type: "string", isNullable: false, role: "external-id" },
|
|
46
|
+
{ name: "name", type: "string", isNullable: false, role: "regular" },
|
|
47
|
+
{ name: "_internalId", type: "bigint", isNullable: false, role: "internal-id" },
|
|
48
|
+
{
|
|
49
|
+
name: "_version",
|
|
50
|
+
type: "integer",
|
|
51
|
+
isNullable: false,
|
|
52
|
+
role: "version",
|
|
53
|
+
default: { value: 0 },
|
|
54
|
+
},
|
|
55
|
+
],
|
|
56
|
+
},
|
|
57
|
+
],
|
|
58
|
+
{ toPhysical: (n) => `${n}_test`, toLogical: (n) => n.replace("_test", "") },
|
|
59
|
+
);
|
|
60
|
+
|
|
61
|
+
expect(statements.length).toBe(1);
|
|
62
|
+
expect(statements[0].sql).toMatchInlineSnapshot(
|
|
63
|
+
`"create table "users_test" ("id" text not null unique, "name" text not null, "_internalId" bigserial not null primary key, "_version" integer default 0 not null)"`,
|
|
64
|
+
);
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
test("compile alter table with add column", () => {
|
|
68
|
+
const statements = generator.compile(
|
|
69
|
+
[
|
|
70
|
+
{
|
|
71
|
+
type: "alter-table",
|
|
72
|
+
name: "users",
|
|
73
|
+
value: [
|
|
74
|
+
{
|
|
75
|
+
type: "create-column",
|
|
76
|
+
value: { name: "age", type: "integer", isNullable: true, role: "regular" },
|
|
77
|
+
},
|
|
78
|
+
],
|
|
79
|
+
},
|
|
80
|
+
],
|
|
81
|
+
{ toPhysical: (n) => `${n}_test`, toLogical: (n) => n.replace("_test", "") },
|
|
82
|
+
);
|
|
83
|
+
|
|
84
|
+
expect(statements.length).toBe(1);
|
|
85
|
+
expect(statements[0].sql).toMatchInlineSnapshot(
|
|
86
|
+
`"alter table "users_test" add column "age" integer"`,
|
|
87
|
+
);
|
|
88
|
+
});
|
|
89
|
+
|
|
90
|
+
test("compile add index", () => {
|
|
91
|
+
const statements = generator.compile(
|
|
92
|
+
[
|
|
93
|
+
{
|
|
94
|
+
type: "add-index",
|
|
95
|
+
table: "users",
|
|
96
|
+
name: "name_idx",
|
|
97
|
+
columns: ["name"],
|
|
98
|
+
unique: false,
|
|
99
|
+
},
|
|
100
|
+
],
|
|
101
|
+
{ toPhysical: (n) => `${n}_test`, toLogical: (n) => n.replace("_test", "") },
|
|
102
|
+
);
|
|
103
|
+
|
|
104
|
+
expect(statements.length).toBe(1);
|
|
105
|
+
expect(statements[0].sql).toMatchInlineSnapshot(
|
|
106
|
+
`"create index "name_idx_users_test" on "users_test" ("name")"`,
|
|
107
|
+
);
|
|
108
|
+
});
|
|
109
|
+
|
|
110
|
+
test("generate version update SQL for new migration", () => {
|
|
111
|
+
const sql = generator.generateVersionUpdateSQL("test_namespace", 0, 1);
|
|
112
|
+
|
|
113
|
+
expect(sql.sql).toMatchInlineSnapshot(
|
|
114
|
+
`"insert into "fragno_db_settings" ("id", "key", "value") values ('jprP_43K5uMwxAFiepbbrQ', 'test_namespace.schema_version', '1')"`,
|
|
115
|
+
);
|
|
116
|
+
});
|
|
117
|
+
|
|
118
|
+
test("generate version update SQL for existing migration", () => {
|
|
119
|
+
const sql = generator.generateVersionUpdateSQL("test_namespace", 1, 2);
|
|
120
|
+
|
|
121
|
+
expect(sql.sql).toMatchInlineSnapshot(
|
|
122
|
+
`"update "fragno_db_settings" set "value" = '2' where "key" = 'test_namespace.schema_version'"`,
|
|
123
|
+
);
|
|
124
|
+
});
|
|
125
|
+
});
|
|
126
|
+
|
|
127
|
+
describe("PreparedMigrations - SQLite FK Merging", () => {
|
|
128
|
+
const coldKysely = createColdKysely("sqlite");
|
|
129
|
+
const generator = new SQLiteSQLGenerator(coldKysely, "sqlite");
|
|
130
|
+
|
|
131
|
+
test("preprocess merges FK into create-table", () => {
|
|
132
|
+
const operations = generator.preprocess([
|
|
133
|
+
{
|
|
134
|
+
type: "create-table",
|
|
135
|
+
name: "users",
|
|
136
|
+
columns: [{ name: "id", type: "string", isNullable: false, role: "external-id" }],
|
|
137
|
+
},
|
|
138
|
+
{
|
|
139
|
+
type: "create-table",
|
|
140
|
+
name: "posts",
|
|
141
|
+
columns: [
|
|
142
|
+
{ name: "id", type: "string", isNullable: false, role: "external-id" },
|
|
143
|
+
{ name: "authorId", type: "bigint", isNullable: false, role: "reference" },
|
|
144
|
+
],
|
|
145
|
+
},
|
|
146
|
+
{
|
|
147
|
+
type: "add-foreign-key",
|
|
148
|
+
table: "posts",
|
|
149
|
+
value: {
|
|
150
|
+
name: "posts_users_author_fk",
|
|
151
|
+
columns: ["authorId"],
|
|
152
|
+
referencedTable: "users",
|
|
153
|
+
referencedColumns: ["_internalId"],
|
|
154
|
+
},
|
|
155
|
+
},
|
|
156
|
+
]);
|
|
157
|
+
|
|
158
|
+
// FK should be merged into posts create-table, plus pragma statement
|
|
159
|
+
expect(operations.length).toBe(3);
|
|
160
|
+
expect(operations[0]).toEqual({ type: "custom", sql: "PRAGMA defer_foreign_keys = ON" });
|
|
161
|
+
const postsOp = operations.find((op) => op.type === "create-table" && op.name === "posts");
|
|
162
|
+
expect(postsOp).toBeDefined();
|
|
163
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
164
|
+
expect((postsOp as any).metadata?.inlineForeignKeys).toHaveLength(1);
|
|
165
|
+
});
|
|
166
|
+
|
|
167
|
+
test("compile creates table with inline FK constraint", () => {
|
|
168
|
+
const statements = generator.compile(
|
|
169
|
+
[
|
|
170
|
+
{
|
|
171
|
+
type: "create-table",
|
|
172
|
+
name: "users",
|
|
173
|
+
columns: [{ name: "id", type: "string", isNullable: false, role: "external-id" }],
|
|
174
|
+
},
|
|
175
|
+
{
|
|
176
|
+
type: "create-table",
|
|
177
|
+
name: "posts",
|
|
178
|
+
columns: [
|
|
179
|
+
{ name: "id", type: "string", isNullable: false, role: "external-id" },
|
|
180
|
+
{ name: "authorId", type: "bigint", isNullable: false, role: "reference" },
|
|
181
|
+
],
|
|
182
|
+
},
|
|
183
|
+
{
|
|
184
|
+
type: "add-foreign-key",
|
|
185
|
+
table: "posts",
|
|
186
|
+
value: {
|
|
187
|
+
name: "posts_users_author_fk",
|
|
188
|
+
columns: ["authorId"],
|
|
189
|
+
referencedTable: "users",
|
|
190
|
+
referencedColumns: ["_internalId"],
|
|
191
|
+
},
|
|
192
|
+
},
|
|
193
|
+
],
|
|
194
|
+
{ toPhysical: (n) => `${n}_test`, toLogical: (n) => n.replace("_test", "") },
|
|
195
|
+
);
|
|
196
|
+
|
|
197
|
+
expect(statements.length).toBe(3);
|
|
198
|
+
expect(statements[0].sql).toMatchInlineSnapshot(`"PRAGMA defer_foreign_keys = ON"`);
|
|
199
|
+
expect(statements[1].sql).toMatchInlineSnapshot(
|
|
200
|
+
`"create table "users_test" ("id" text not null unique)"`,
|
|
201
|
+
);
|
|
202
|
+
expect(statements[2].sql).toMatchInlineSnapshot(
|
|
203
|
+
`"create table "posts_test" ("id" text not null unique, "authorId" integer not null, constraint "posts_users_author_fk" foreign key ("authorId") references "users_test" ("_internalId") on delete restrict on update restrict)"`,
|
|
204
|
+
);
|
|
205
|
+
});
|
|
206
|
+
|
|
207
|
+
test("throws error for add-foreign-key on existing table", () => {
|
|
208
|
+
expect(() =>
|
|
209
|
+
generator.compile(
|
|
210
|
+
[
|
|
211
|
+
{
|
|
212
|
+
type: "add-foreign-key",
|
|
213
|
+
table: "posts",
|
|
214
|
+
value: {
|
|
215
|
+
name: "posts_users_fk",
|
|
216
|
+
columns: ["authorId"],
|
|
217
|
+
referencedTable: "users",
|
|
218
|
+
referencedColumns: ["_internalId"],
|
|
219
|
+
},
|
|
220
|
+
},
|
|
221
|
+
],
|
|
222
|
+
undefined,
|
|
223
|
+
),
|
|
224
|
+
).toThrow("SQLite doesn't support modifying foreign keys");
|
|
225
|
+
});
|
|
226
|
+
|
|
227
|
+
test("uses autoIncrement for internal-id columns", () => {
|
|
228
|
+
const statements = generator.compile(
|
|
229
|
+
[
|
|
230
|
+
{
|
|
231
|
+
type: "create-table",
|
|
232
|
+
name: "users",
|
|
233
|
+
columns: [
|
|
234
|
+
{ name: "_internalId", type: "integer", isNullable: false, role: "internal-id" },
|
|
235
|
+
],
|
|
236
|
+
},
|
|
237
|
+
],
|
|
238
|
+
undefined,
|
|
239
|
+
);
|
|
240
|
+
|
|
241
|
+
expect(statements[0].sql).toMatchInlineSnapshot(`"PRAGMA defer_foreign_keys = ON"`);
|
|
242
|
+
expect(statements[1].sql).toMatchInlineSnapshot(
|
|
243
|
+
`"create table "users" ("_internalId" integer not null primary key autoincrement)"`,
|
|
244
|
+
);
|
|
245
|
+
});
|
|
246
|
+
});
|
|
247
|
+
|
|
248
|
+
describe("PreparedMigrations - MySQL", () => {
|
|
249
|
+
const coldKysely = createColdKysely("mysql");
|
|
250
|
+
const generator = new MySQLSQLGenerator(coldKysely, "mysql");
|
|
251
|
+
|
|
252
|
+
test("preprocess wraps with FK checks disabled", () => {
|
|
253
|
+
const operations = generator.preprocess([
|
|
254
|
+
{
|
|
255
|
+
type: "create-table",
|
|
256
|
+
name: "users",
|
|
257
|
+
columns: [{ name: "id", type: "string", isNullable: false, role: "external-id" }],
|
|
258
|
+
},
|
|
259
|
+
]);
|
|
260
|
+
|
|
261
|
+
expect(operations.length).toBe(3);
|
|
262
|
+
expect(operations[0].type).toBe("custom");
|
|
263
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
264
|
+
expect((operations[0] as any).sql).toBe("SET FOREIGN_KEY_CHECKS = 0");
|
|
265
|
+
expect(operations[1].type).toBe("create-table");
|
|
266
|
+
expect(operations[2].type).toBe("custom");
|
|
267
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
268
|
+
expect((operations[2] as any).sql).toBe("SET FOREIGN_KEY_CHECKS = 1");
|
|
269
|
+
});
|
|
270
|
+
|
|
271
|
+
test("uses autoIncrement for internal-id columns", () => {
|
|
272
|
+
const statements = generator.compile(
|
|
273
|
+
[
|
|
274
|
+
{
|
|
275
|
+
type: "create-table",
|
|
276
|
+
name: "users",
|
|
277
|
+
columns: [
|
|
278
|
+
{ name: "_internalId", type: "bigint", isNullable: false, role: "internal-id" },
|
|
279
|
+
],
|
|
280
|
+
},
|
|
281
|
+
],
|
|
282
|
+
undefined,
|
|
283
|
+
);
|
|
284
|
+
|
|
285
|
+
// MySQL wraps with FK checks, so we have 3 statements
|
|
286
|
+
expect(statements.length).toBe(3);
|
|
287
|
+
expect(statements[0].sql).toMatchInlineSnapshot(`"SET FOREIGN_KEY_CHECKS = 0"`);
|
|
288
|
+
expect(statements[1].sql).toMatchInlineSnapshot(
|
|
289
|
+
`"create table \`users\` (\`_internalId\` bigint not null primary key auto_increment)"`,
|
|
290
|
+
);
|
|
291
|
+
expect(statements[2].sql).toMatchInlineSnapshot(`"SET FOREIGN_KEY_CHECKS = 1"`);
|
|
292
|
+
});
|
|
293
|
+
|
|
294
|
+
test("returns undefined for TEXT column defaults", () => {
|
|
295
|
+
const defaultValue = generator.getDefaultValue({
|
|
296
|
+
name: "description",
|
|
297
|
+
type: "string",
|
|
298
|
+
isNullable: true,
|
|
299
|
+
role: "regular",
|
|
300
|
+
default: { value: "default text" },
|
|
301
|
+
});
|
|
302
|
+
|
|
303
|
+
expect(defaultValue).toBeUndefined();
|
|
304
|
+
});
|
|
305
|
+
});
|
|
306
|
+
|
|
307
|
+
describe("PreparedMigrations - Integration", () => {
|
|
308
|
+
test("createPreparedMigrations - execute with version tracking", async () => {
|
|
309
|
+
const executedStatements: string[] = [];
|
|
310
|
+
let transactionStarted = false;
|
|
311
|
+
|
|
312
|
+
// Create a mock driver that captures SQL statements
|
|
313
|
+
const mockDriver = {
|
|
314
|
+
async executeQuery(query: { sql: string }) {
|
|
315
|
+
executedStatements.push(query.sql);
|
|
316
|
+
return { rows: [] };
|
|
317
|
+
},
|
|
318
|
+
async transaction(
|
|
319
|
+
callback: (tx: {
|
|
320
|
+
executeQuery: (q: { sql: string }) => Promise<{ rows: [] }>;
|
|
321
|
+
}) => Promise<void>,
|
|
322
|
+
) {
|
|
323
|
+
transactionStarted = true;
|
|
324
|
+
await callback({
|
|
325
|
+
async executeQuery(query: { sql: string }) {
|
|
326
|
+
executedStatements.push(query.sql);
|
|
327
|
+
return { rows: [] };
|
|
328
|
+
},
|
|
329
|
+
});
|
|
330
|
+
},
|
|
331
|
+
async destroy() {},
|
|
332
|
+
};
|
|
333
|
+
|
|
334
|
+
const prepared = createPreparedMigrations({
|
|
335
|
+
schema: testSchema,
|
|
336
|
+
namespace: "test",
|
|
337
|
+
database: "postgresql",
|
|
338
|
+
mapper: createTableNameMapper("test"),
|
|
339
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
340
|
+
driver: mockDriver as any,
|
|
341
|
+
});
|
|
342
|
+
|
|
343
|
+
await prepared.execute(0, 1);
|
|
344
|
+
|
|
345
|
+
expect(transactionStarted).toBe(true);
|
|
346
|
+
expect(executedStatements.length).toBe(2);
|
|
347
|
+
expect(executedStatements[0]).toMatchInlineSnapshot(
|
|
348
|
+
`"create table "users_test" ("id" varchar(30) not null unique, "name" text not null, "_internalId" bigserial not null primary key, "_version" integer default 0 not null)"`,
|
|
349
|
+
);
|
|
350
|
+
expect(executedStatements[1]).toMatchInlineSnapshot(
|
|
351
|
+
`"insert into "fragno_db_settings" ("id", "key", "value") values ('BflimUWc1NbCMMDD9SM3gQ', 'test.schema_version', '1')"`,
|
|
352
|
+
);
|
|
353
|
+
});
|
|
354
|
+
|
|
355
|
+
test("execute with updateVersionInMigration=false skips version update", async () => {
|
|
356
|
+
const executedStatements: string[] = [];
|
|
357
|
+
|
|
358
|
+
const mockDriver = {
|
|
359
|
+
async executeQuery(query: { sql: string }) {
|
|
360
|
+
executedStatements.push(query.sql);
|
|
361
|
+
return { rows: [] };
|
|
362
|
+
},
|
|
363
|
+
async transaction(
|
|
364
|
+
callback: (tx: {
|
|
365
|
+
executeQuery: (q: { sql: string }) => Promise<{ rows: [] }>;
|
|
366
|
+
}) => Promise<void>,
|
|
367
|
+
) {
|
|
368
|
+
await callback({
|
|
369
|
+
async executeQuery(query: { sql: string }) {
|
|
370
|
+
executedStatements.push(query.sql);
|
|
371
|
+
return { rows: [] };
|
|
372
|
+
},
|
|
373
|
+
});
|
|
374
|
+
},
|
|
375
|
+
async destroy() {},
|
|
376
|
+
};
|
|
377
|
+
|
|
378
|
+
const prepared = createPreparedMigrations({
|
|
379
|
+
schema: testSchema,
|
|
380
|
+
namespace: "test",
|
|
381
|
+
database: "postgresql",
|
|
382
|
+
mapper: createTableNameMapper("test"),
|
|
383
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
384
|
+
driver: mockDriver as any,
|
|
385
|
+
});
|
|
386
|
+
|
|
387
|
+
await prepared.execute(0, 1, { updateVersionInMigration: false });
|
|
388
|
+
|
|
389
|
+
// Should only have the create table statement, no version update
|
|
390
|
+
expect(executedStatements.length).toBe(1);
|
|
391
|
+
expect(executedStatements[0]).toContain('create table "users_test"');
|
|
392
|
+
});
|
|
393
|
+
|
|
394
|
+
test("throws error for backward migration", async () => {
|
|
395
|
+
const mockDriver = {
|
|
396
|
+
async executeQuery() {
|
|
397
|
+
return { rows: [] };
|
|
398
|
+
},
|
|
399
|
+
async transaction() {},
|
|
400
|
+
async destroy() {},
|
|
401
|
+
};
|
|
402
|
+
|
|
403
|
+
const prepared = createPreparedMigrations({
|
|
404
|
+
schema: testSchema,
|
|
405
|
+
namespace: "test",
|
|
406
|
+
database: "postgresql",
|
|
407
|
+
mapper: createTableNameMapper("test"),
|
|
408
|
+
});
|
|
409
|
+
|
|
410
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
411
|
+
await expect(() => prepared.executeWithDriver(mockDriver as any, 2, 1)).rejects.toThrow(
|
|
412
|
+
"Cannot migrate backwards",
|
|
413
|
+
);
|
|
414
|
+
});
|
|
415
|
+
|
|
416
|
+
test("throws error for version beyond schema", async () => {
|
|
417
|
+
const mockDriver = {
|
|
418
|
+
async executeQuery() {
|
|
419
|
+
return { rows: [] };
|
|
420
|
+
},
|
|
421
|
+
async transaction() {},
|
|
422
|
+
async destroy() {},
|
|
423
|
+
};
|
|
424
|
+
|
|
425
|
+
const prepared = createPreparedMigrations({
|
|
426
|
+
schema: testSchema,
|
|
427
|
+
namespace: "test",
|
|
428
|
+
database: "postgresql",
|
|
429
|
+
mapper: createTableNameMapper("test"),
|
|
430
|
+
});
|
|
431
|
+
|
|
432
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
433
|
+
await expect(() => prepared.executeWithDriver(mockDriver as any, 0, 100)).rejects.toThrow(
|
|
434
|
+
"exceeds schema version",
|
|
435
|
+
);
|
|
436
|
+
});
|
|
437
|
+
|
|
438
|
+
test("returns early for same version (no statements executed)", async () => {
|
|
439
|
+
const executedStatements: string[] = [];
|
|
440
|
+
|
|
441
|
+
const mockDriver = {
|
|
442
|
+
async executeQuery(query: { sql: string }) {
|
|
443
|
+
executedStatements.push(query.sql);
|
|
444
|
+
return { rows: [] };
|
|
445
|
+
},
|
|
446
|
+
async transaction(
|
|
447
|
+
callback: (tx: {
|
|
448
|
+
executeQuery: (q: { sql: string }) => Promise<{ rows: [] }>;
|
|
449
|
+
}) => Promise<void>,
|
|
450
|
+
) {
|
|
451
|
+
await callback({
|
|
452
|
+
async executeQuery(query: { sql: string }) {
|
|
453
|
+
executedStatements.push(query.sql);
|
|
454
|
+
return { rows: [] };
|
|
455
|
+
},
|
|
456
|
+
});
|
|
457
|
+
},
|
|
458
|
+
async destroy() {},
|
|
459
|
+
};
|
|
460
|
+
|
|
461
|
+
const prepared = createPreparedMigrations({
|
|
462
|
+
schema: testSchema,
|
|
463
|
+
namespace: "test",
|
|
464
|
+
database: "postgresql",
|
|
465
|
+
mapper: createTableNameMapper("test"),
|
|
466
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
467
|
+
driver: mockDriver as any,
|
|
468
|
+
});
|
|
469
|
+
|
|
470
|
+
await prepared.execute(2, 2);
|
|
471
|
+
|
|
472
|
+
// No statements should be executed
|
|
473
|
+
expect(executedStatements.length).toBe(0);
|
|
474
|
+
});
|
|
475
|
+
|
|
476
|
+
test("throws error when execute is called without driver", async () => {
|
|
477
|
+
const prepared = createPreparedMigrations({
|
|
478
|
+
schema: testSchema,
|
|
479
|
+
namespace: "test",
|
|
480
|
+
database: "postgresql",
|
|
481
|
+
mapper: createTableNameMapper("test"),
|
|
482
|
+
// No driver provided
|
|
483
|
+
});
|
|
484
|
+
|
|
485
|
+
await expect(() => prepared.execute(0, 1)).rejects.toThrow(
|
|
486
|
+
"Driver not provided. Cannot execute migration. Use `executeWithDriver` instead.",
|
|
487
|
+
);
|
|
488
|
+
});
|
|
489
|
+
});
|
|
490
|
+
|
|
491
|
+
describe("PreparedMigrations - Multi-step Migration Scenarios", () => {
|
|
492
|
+
test("PostgreSQL: migration 0 -> 2 (create users table and add age + indexes)", () => {
|
|
493
|
+
const prepared = createPreparedMigrations({
|
|
494
|
+
schema: testSchema,
|
|
495
|
+
namespace: "test",
|
|
496
|
+
database: "postgresql",
|
|
497
|
+
mapper: createTableNameMapper("test"),
|
|
498
|
+
});
|
|
499
|
+
|
|
500
|
+
const sql = prepared.getSQL(0, 2, { updateVersionInMigration: true });
|
|
501
|
+
expect(sql).toMatchInlineSnapshot(`
|
|
502
|
+
"create table "users_test" ("id" varchar(30) not null unique, "name" text not null, "_internalId" bigserial not null primary key, "_version" integer default 0 not null);
|
|
503
|
+
|
|
504
|
+
alter table "users_test" add column "age" integer;
|
|
505
|
+
|
|
506
|
+
create index "name_idx_users_test" on "users_test" ("name");
|
|
507
|
+
|
|
508
|
+
create index "age_idx_users_test" on "users_test" ("age");
|
|
509
|
+
|
|
510
|
+
insert into "fragno_db_settings" ("id", "key", "value") values ('BflimUWc1NbCMMDD9SM3gQ', 'test.schema_version', '2');"
|
|
511
|
+
`);
|
|
512
|
+
});
|
|
513
|
+
|
|
514
|
+
test("PostgreSQL: migration 0 -> 4 (full schema with posts and FK)", () => {
|
|
515
|
+
const prepared = createPreparedMigrations({
|
|
516
|
+
schema: testSchema,
|
|
517
|
+
namespace: "test",
|
|
518
|
+
database: "postgresql",
|
|
519
|
+
mapper: createTableNameMapper("test"),
|
|
520
|
+
});
|
|
521
|
+
|
|
522
|
+
const sql = prepared.getSQL(0, 4, { updateVersionInMigration: true });
|
|
523
|
+
expect(sql).toMatchInlineSnapshot(`
|
|
524
|
+
"create table "users_test" ("id" varchar(30) not null unique, "name" text not null, "_internalId" bigserial not null primary key, "_version" integer default 0 not null);
|
|
525
|
+
|
|
526
|
+
alter table "users_test" add column "age" integer;
|
|
527
|
+
|
|
528
|
+
create index "name_idx_users_test" on "users_test" ("name");
|
|
529
|
+
|
|
530
|
+
create index "age_idx_users_test" on "users_test" ("age");
|
|
531
|
+
|
|
532
|
+
create table "posts_test" ("id" varchar(30) not null unique, "title" text not null, "authorId" bigint not null, "_internalId" bigserial not null primary key, "_version" integer default 0 not null);
|
|
533
|
+
|
|
534
|
+
alter table "posts_test" add constraint "posts_users_author_fk" foreign key ("authorId") references "users_test" ("_internalId") on delete restrict on update restrict;
|
|
535
|
+
|
|
536
|
+
insert into "fragno_db_settings" ("id", "key", "value") values ('BflimUWc1NbCMMDD9SM3gQ', 'test.schema_version', '4');"
|
|
537
|
+
`);
|
|
538
|
+
});
|
|
539
|
+
|
|
540
|
+
test("PostgreSQL: migration 1 -> 2 (add age column and indexes only)", () => {
|
|
541
|
+
const prepared = createPreparedMigrations({
|
|
542
|
+
schema: testSchema,
|
|
543
|
+
namespace: "test",
|
|
544
|
+
database: "postgresql",
|
|
545
|
+
mapper: createTableNameMapper("test"),
|
|
546
|
+
});
|
|
547
|
+
|
|
548
|
+
const sql = prepared.getSQL(1, 2, { updateVersionInMigration: true });
|
|
549
|
+
expect(sql).toMatchInlineSnapshot(`
|
|
550
|
+
"alter table "users_test" add column "age" integer;
|
|
551
|
+
|
|
552
|
+
create index "name_idx_users_test" on "users_test" ("name");
|
|
553
|
+
|
|
554
|
+
create index "age_idx_users_test" on "users_test" ("age");
|
|
555
|
+
|
|
556
|
+
update "fragno_db_settings" set "value" = '2' where "key" = 'test.schema_version';"
|
|
557
|
+
`);
|
|
558
|
+
});
|
|
559
|
+
|
|
560
|
+
test("PostgreSQL: migration 2 -> 3 (add posts table)", () => {
|
|
561
|
+
const prepared = createPreparedMigrations({
|
|
562
|
+
schema: testSchema,
|
|
563
|
+
namespace: "test",
|
|
564
|
+
database: "postgresql",
|
|
565
|
+
mapper: createTableNameMapper("test"),
|
|
566
|
+
});
|
|
567
|
+
|
|
568
|
+
const sql = prepared.getSQL(2, 3, { updateVersionInMigration: true });
|
|
569
|
+
expect(sql).toMatchInlineSnapshot(`
|
|
570
|
+
"create table "posts_test" ("id" varchar(30) not null unique, "title" text not null, "authorId" bigint not null, "_internalId" bigserial not null primary key, "_version" integer default 0 not null);
|
|
571
|
+
|
|
572
|
+
update "fragno_db_settings" set "value" = '3' where "key" = 'test.schema_version';"
|
|
573
|
+
`);
|
|
574
|
+
});
|
|
575
|
+
|
|
576
|
+
test("SQLite: migration 0 -> 4 with FK merging", () => {
|
|
577
|
+
const prepared = createPreparedMigrations({
|
|
578
|
+
schema: testSchema,
|
|
579
|
+
namespace: "test",
|
|
580
|
+
database: "sqlite",
|
|
581
|
+
mapper: createTableNameMapper("test"),
|
|
582
|
+
});
|
|
583
|
+
|
|
584
|
+
const sql = prepared.getSQL(0, 4, { updateVersionInMigration: true });
|
|
585
|
+
expect(sql).toMatchInlineSnapshot(`
|
|
586
|
+
"PRAGMA defer_foreign_keys = ON;
|
|
587
|
+
|
|
588
|
+
create table "users_test" ("id" text not null unique, "name" text not null, "_internalId" integer not null primary key autoincrement, "_version" integer default 0 not null);
|
|
589
|
+
|
|
590
|
+
alter table "users_test" add column "age" integer;
|
|
591
|
+
|
|
592
|
+
create index "name_idx_users_test" on "users_test" ("name");
|
|
593
|
+
|
|
594
|
+
create index "age_idx_users_test" on "users_test" ("age");
|
|
595
|
+
|
|
596
|
+
create table "posts_test" ("id" text not null unique, "title" text not null, "authorId" integer not null, "_internalId" integer not null primary key autoincrement, "_version" integer default 0 not null, constraint "posts_users_author_fk" foreign key ("authorId") references "users_test" ("_internalId") on delete restrict on update restrict);
|
|
597
|
+
|
|
598
|
+
insert into "fragno_db_settings" ("id", "key", "value") values ('BflimUWc1NbCMMDD9SM3gQ', 'test.schema_version', '4');"
|
|
599
|
+
`);
|
|
600
|
+
});
|
|
601
|
+
|
|
602
|
+
test("MySQL: migration 0 -> 4 with FK checks disabled", () => {
|
|
603
|
+
const prepared = createPreparedMigrations({
|
|
604
|
+
schema: testSchema,
|
|
605
|
+
namespace: "test",
|
|
606
|
+
database: "mysql",
|
|
607
|
+
mapper: createTableNameMapper("test"),
|
|
608
|
+
});
|
|
609
|
+
|
|
610
|
+
const sql = prepared.getSQL(0, 4, { updateVersionInMigration: true });
|
|
611
|
+
expect(sql).toMatchInlineSnapshot(`
|
|
612
|
+
"SET FOREIGN_KEY_CHECKS = 0;
|
|
613
|
+
|
|
614
|
+
create table \`users_test\` (\`id\` varchar(30) not null unique, \`name\` text not null, \`_internalId\` bigint not null primary key auto_increment, \`_version\` integer default 0 not null);
|
|
615
|
+
|
|
616
|
+
alter table \`users_test\` add column \`age\` integer;
|
|
617
|
+
|
|
618
|
+
create index \`name_idx_users_test\` on \`users_test\` (\`name\`);
|
|
619
|
+
|
|
620
|
+
create index \`age_idx_users_test\` on \`users_test\` (\`age\`);
|
|
621
|
+
|
|
622
|
+
create table \`posts_test\` (\`id\` varchar(30) not null unique, \`title\` text not null, \`authorId\` bigint not null, \`_internalId\` bigint not null primary key auto_increment, \`_version\` integer default 0 not null);
|
|
623
|
+
|
|
624
|
+
alter table \`posts_test\` add constraint \`posts_users_author_fk\` foreign key (\`authorId\`) references \`users_test\` (\`_internalId\`) on delete restrict on update restrict;
|
|
625
|
+
|
|
626
|
+
SET FOREIGN_KEY_CHECKS = 1;
|
|
627
|
+
|
|
628
|
+
insert into \`fragno_db_settings\` (\`id\`, \`key\`, \`value\`) values ('BflimUWc1NbCMMDD9SM3gQ', 'test.schema_version', '4');"
|
|
629
|
+
`);
|
|
630
|
+
});
|
|
631
|
+
|
|
632
|
+
test("compile returns CompiledMigration with statements array", () => {
|
|
633
|
+
const prepared = createPreparedMigrations({
|
|
634
|
+
schema: testSchema,
|
|
635
|
+
namespace: "test",
|
|
636
|
+
database: "postgresql",
|
|
637
|
+
mapper: createTableNameMapper("test"),
|
|
638
|
+
});
|
|
639
|
+
|
|
640
|
+
const compiled = prepared.compile(0, 2, { updateVersionInMigration: true });
|
|
641
|
+
expect(compiled.statements).toBeDefined();
|
|
642
|
+
expect(compiled.statements.length).toBeGreaterThan(0);
|
|
643
|
+
// Should have: create table, add column, 2 indexes, version insert
|
|
644
|
+
expect(compiled.statements.length).toBe(5);
|
|
645
|
+
});
|
|
646
|
+
|
|
647
|
+
test("getSQL with updateVersionInMigration=false excludes version statement", () => {
|
|
648
|
+
const prepared = createPreparedMigrations({
|
|
649
|
+
schema: testSchema,
|
|
650
|
+
namespace: "test",
|
|
651
|
+
database: "postgresql",
|
|
652
|
+
mapper: createTableNameMapper("test"),
|
|
653
|
+
});
|
|
654
|
+
|
|
655
|
+
const sql = prepared.getSQL(0, 1, { updateVersionInMigration: false });
|
|
656
|
+
expect(sql).not.toContain("fragno_db_settings");
|
|
657
|
+
expect(sql).toMatchInlineSnapshot(
|
|
658
|
+
`"create table "users_test" ("id" varchar(30) not null unique, "name" text not null, "_internalId" bigserial not null primary key, "_version" integer default 0 not null);"`,
|
|
659
|
+
);
|
|
660
|
+
});
|
|
661
|
+
});
|