@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,179 @@
|
|
|
1
|
+
import type { RetryPolicy } from "../query/unit-of-work/retry-policy";
|
|
2
|
+
import { ExponentialBackoffRetryPolicy } from "../query/unit-of-work/retry-policy";
|
|
3
|
+
import type { IUnitOfWork } from "../query/unit-of-work/unit-of-work";
|
|
4
|
+
import type { InternalFragmentInstance } from "../fragments/internal-fragment";
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Context available in hook functions via `this`.
|
|
8
|
+
* Contains the nonce for idempotency and database access.
|
|
9
|
+
*/
|
|
10
|
+
export interface HookContext {
|
|
11
|
+
/**
|
|
12
|
+
* Unique nonce for this transaction.
|
|
13
|
+
* Use this for idempotency checks in your hook implementation.
|
|
14
|
+
*/
|
|
15
|
+
nonce: string;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* A hook function signature.
|
|
20
|
+
* Hooks receive a typed payload and access context via `this`.
|
|
21
|
+
*/
|
|
22
|
+
export type HookFn<TPayload = unknown> = (payload: TPayload) => void | Promise<void>;
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Map of hook names to hook functions.
|
|
26
|
+
* Used for type-safe hook definitions and triggering.
|
|
27
|
+
*/
|
|
28
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
29
|
+
export type HooksMap = Record<string, HookFn<any>>;
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Extract the payload type from a hook function.
|
|
33
|
+
*/
|
|
34
|
+
export type HookPayload<T> = T extends HookFn<infer P> ? P : never;
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Options for triggering a hook.
|
|
38
|
+
*/
|
|
39
|
+
export interface TriggerHookOptions {
|
|
40
|
+
/**
|
|
41
|
+
* Optional retry policy override for this specific hook trigger.
|
|
42
|
+
* If not provided, uses the default retry policy.
|
|
43
|
+
*/
|
|
44
|
+
retryPolicy?: RetryPolicy;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Internal representation of a triggered hook.
|
|
49
|
+
* Stored in the Unit of Work before execution.
|
|
50
|
+
*/
|
|
51
|
+
export interface TriggeredHook {
|
|
52
|
+
hookName: string;
|
|
53
|
+
payload: unknown;
|
|
54
|
+
options?: TriggerHookOptions;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Configuration for hook processing.
|
|
59
|
+
*/
|
|
60
|
+
export interface HookProcessorConfig {
|
|
61
|
+
hooks: HooksMap;
|
|
62
|
+
namespace: string;
|
|
63
|
+
internalFragment: InternalFragmentInstance;
|
|
64
|
+
defaultRetryPolicy?: RetryPolicy;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Add hook events as mutation operations to the UOW.
|
|
69
|
+
* This should be called before executeMutations() so hook records are created
|
|
70
|
+
* in the same transaction as the user's mutations.
|
|
71
|
+
*/
|
|
72
|
+
export function prepareHookMutations(uow: IUnitOfWork, config: HookProcessorConfig): void {
|
|
73
|
+
const { namespace, internalFragment, defaultRetryPolicy } = config;
|
|
74
|
+
const retryPolicy = defaultRetryPolicy ?? new ExponentialBackoffRetryPolicy({ maxRetries: 5 });
|
|
75
|
+
|
|
76
|
+
const triggeredHooks = uow.getTriggeredHooks();
|
|
77
|
+
|
|
78
|
+
if (triggeredHooks.length === 0) {
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
const internalSchema = internalFragment.$internal.deps.schema;
|
|
83
|
+
const internalUow = uow.forSchema(internalSchema);
|
|
84
|
+
|
|
85
|
+
for (const hook of triggeredHooks) {
|
|
86
|
+
const hookRetryPolicy = hook.options?.retryPolicy ?? retryPolicy;
|
|
87
|
+
const maxAttempts = hookRetryPolicy.shouldRetry(4) ? 5 : 1;
|
|
88
|
+
internalUow.create("fragno_hooks", {
|
|
89
|
+
namespace,
|
|
90
|
+
hookName: hook.hookName,
|
|
91
|
+
payload: hook.payload,
|
|
92
|
+
status: "pending",
|
|
93
|
+
attempts: 0,
|
|
94
|
+
maxAttempts,
|
|
95
|
+
lastAttemptAt: null,
|
|
96
|
+
nextRetryAt: null,
|
|
97
|
+
error: null,
|
|
98
|
+
nonce: uow.nonce,
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* Process pending hook events after the transaction has committed.
|
|
105
|
+
* This should be called in the onSuccess callback after executeMutations().
|
|
106
|
+
*/
|
|
107
|
+
export async function processHooks(config: HookProcessorConfig): Promise<void> {
|
|
108
|
+
const { hooks, namespace, internalFragment, defaultRetryPolicy } = config;
|
|
109
|
+
const retryPolicy = defaultRetryPolicy ?? new ExponentialBackoffRetryPolicy({ maxRetries: 5 });
|
|
110
|
+
|
|
111
|
+
await internalFragment.inContext(async function () {
|
|
112
|
+
return await this.uow(async ({ executeRetrieve, executeMutate }) => {
|
|
113
|
+
const pendingEventsPromise =
|
|
114
|
+
internalFragment.services.hookService.getPendingHookEvents(namespace);
|
|
115
|
+
await executeRetrieve();
|
|
116
|
+
|
|
117
|
+
const pendingEvents = await pendingEventsPromise;
|
|
118
|
+
|
|
119
|
+
if (pendingEvents.length === 0) {
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
const processedEvents = await Promise.allSettled(
|
|
124
|
+
pendingEvents.map(async (event) => {
|
|
125
|
+
const hookFn = hooks[event.hookName];
|
|
126
|
+
if (!hookFn) {
|
|
127
|
+
return {
|
|
128
|
+
eventId: event.id,
|
|
129
|
+
status: "failed" as const,
|
|
130
|
+
error: `Hook '${event.hookName}' not found in hooks map`,
|
|
131
|
+
attempts: event.attempts,
|
|
132
|
+
maxAttempts: event.maxAttempts,
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
try {
|
|
137
|
+
const hookContext: HookContext = { nonce: event.nonce };
|
|
138
|
+
await hookFn.call(hookContext, event.payload);
|
|
139
|
+
return {
|
|
140
|
+
eventId: event.id,
|
|
141
|
+
status: "completed" as const,
|
|
142
|
+
};
|
|
143
|
+
} catch (error) {
|
|
144
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
145
|
+
return {
|
|
146
|
+
eventId: event.id,
|
|
147
|
+
status: "failed" as const,
|
|
148
|
+
error: errorMessage,
|
|
149
|
+
attempts: event.attempts,
|
|
150
|
+
maxAttempts: event.maxAttempts,
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
}),
|
|
154
|
+
);
|
|
155
|
+
|
|
156
|
+
for (const processedEvent of processedEvents) {
|
|
157
|
+
if (processedEvent.status === "rejected") {
|
|
158
|
+
continue;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
const { eventId, status } = processedEvent.value;
|
|
162
|
+
|
|
163
|
+
if (status === "completed") {
|
|
164
|
+
internalFragment.services.hookService.markHookCompleted(eventId);
|
|
165
|
+
} else if (status === "failed") {
|
|
166
|
+
const { error, attempts } = processedEvent.value;
|
|
167
|
+
internalFragment.services.hookService.markHookFailed(
|
|
168
|
+
eventId,
|
|
169
|
+
error,
|
|
170
|
+
attempts,
|
|
171
|
+
retryPolicy,
|
|
172
|
+
);
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
await executeMutate();
|
|
177
|
+
});
|
|
178
|
+
});
|
|
179
|
+
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { describe, it, expect, beforeAll, beforeEach, vi, afterEach } from "vitest";
|
|
2
|
-
import {
|
|
2
|
+
import { DummyDriver, MysqlAdapter, PostgresAdapter, SqliteAdapter } from "kysely";
|
|
3
3
|
import {
|
|
4
4
|
postProcessMigrationFilenames,
|
|
5
5
|
type GenerationInternalResult,
|
|
@@ -8,32 +8,30 @@ import {
|
|
|
8
8
|
import { KyselyAdapter } from "../adapters/kysely/kysely-adapter";
|
|
9
9
|
import { column, idColumn, schema, type AnySchema } from "../schema/create";
|
|
10
10
|
import { FragnoDatabase } from "../mod";
|
|
11
|
+
import {
|
|
12
|
+
MySQL2DriverConfig,
|
|
13
|
+
NodePostgresDriverConfig,
|
|
14
|
+
SQLocalDriverConfig,
|
|
15
|
+
} from "../adapters/generic-sql/driver-config";
|
|
11
16
|
|
|
12
17
|
describe("generateMigrationsOrSchema - kysely", () => {
|
|
13
18
|
const mockDate = new Date("2025-10-24T12:00:00Z");
|
|
14
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
15
|
-
let db: Kysely<any>;
|
|
16
19
|
let adapter: KyselyAdapter;
|
|
17
20
|
|
|
18
21
|
beforeAll(() => {
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
executeQuery: async () => ({ rows: [] }),
|
|
30
|
-
};
|
|
31
|
-
return callback(mockTx);
|
|
22
|
+
adapter = new KyselyAdapter({
|
|
23
|
+
dialect: {
|
|
24
|
+
createAdapter: () => new PostgresAdapter(),
|
|
25
|
+
createDriver: () => new DummyDriver(),
|
|
26
|
+
createQueryCompiler: () => ({
|
|
27
|
+
compileQuery: () => ({
|
|
28
|
+
sql: "",
|
|
29
|
+
parameters: [],
|
|
30
|
+
}),
|
|
31
|
+
}),
|
|
32
32
|
},
|
|
33
|
-
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
adapter = new KyselyAdapter({ db, provider: "postgresql" });
|
|
33
|
+
driverConfig: new NodePostgresDriverConfig(),
|
|
34
|
+
});
|
|
37
35
|
|
|
38
36
|
// Mock the adapter methods
|
|
39
37
|
vi.spyOn(adapter, "isConnectionHealthy").mockResolvedValue(true);
|
|
@@ -66,7 +64,7 @@ describe("generateMigrationsOrSchema - kysely", () => {
|
|
|
66
64
|
|
|
67
65
|
expect(results).toHaveLength(2); // Settings + test-db
|
|
68
66
|
expect(results[0].namespace).toBe(""); // Empty namespace for settings table
|
|
69
|
-
expect(results[0].path).
|
|
67
|
+
expect(results[0].path).toMatch(/^20251024_001_f000_t00\d_fragno_db_settings.sql$/);
|
|
70
68
|
expect(results[0].schema).toContain("create table");
|
|
71
69
|
expect(results[0].schema).toContain("fragno_db_settings");
|
|
72
70
|
|
|
@@ -117,7 +115,7 @@ describe("generateMigrationsOrSchema - kysely", () => {
|
|
|
117
115
|
|
|
118
116
|
expect(results).toHaveLength(4); // Settings + 3 databases
|
|
119
117
|
expect(results[0].namespace).toBe(""); // Empty namespace for settings table
|
|
120
|
-
expect(results[0].path).
|
|
118
|
+
expect(results[0].path).toMatch(/^20251024_001_f000_t00\d_fragno_db_settings.sql$/);
|
|
121
119
|
|
|
122
120
|
expect(results[1].namespace).toBe("apple-db");
|
|
123
121
|
expect(results[1].path).toBe("20251024_002_f000_t001_apple-db.sql");
|
|
@@ -296,23 +294,19 @@ describe("generateMigrationsOrSchema - kysely", () => {
|
|
|
296
294
|
});
|
|
297
295
|
|
|
298
296
|
it("should include MySQL-specific foreign key checks in generated SQL", async () => {
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
};
|
|
310
|
-
return callback(mockTx);
|
|
297
|
+
const mysqlAdapter = new KyselyAdapter({
|
|
298
|
+
dialect: {
|
|
299
|
+
createAdapter: () => new MysqlAdapter(),
|
|
300
|
+
createDriver: () => new DummyDriver(),
|
|
301
|
+
createQueryCompiler: () => ({
|
|
302
|
+
compileQuery: () => ({
|
|
303
|
+
sql: "",
|
|
304
|
+
parameters: [],
|
|
305
|
+
}),
|
|
306
|
+
}),
|
|
311
307
|
},
|
|
312
|
-
|
|
313
|
-
}
|
|
314
|
-
|
|
315
|
-
const mysqlAdapter = new KyselyAdapter({ db: mysqlDb, provider: "mysql" });
|
|
308
|
+
driverConfig: new MySQL2DriverConfig(),
|
|
309
|
+
});
|
|
316
310
|
|
|
317
311
|
vi.spyOn(mysqlAdapter, "isConnectionHealthy").mockResolvedValue(true);
|
|
318
312
|
vi.spyOn(mysqlAdapter, "getSchemaVersion").mockResolvedValue(undefined);
|
|
@@ -345,23 +339,19 @@ describe("generateMigrationsOrSchema - kysely", () => {
|
|
|
345
339
|
});
|
|
346
340
|
|
|
347
341
|
it("should include SQLite-specific pragma in generated SQL", async () => {
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
};
|
|
359
|
-
return callback(mockTx);
|
|
342
|
+
const sqliteAdapter = new KyselyAdapter({
|
|
343
|
+
dialect: {
|
|
344
|
+
createAdapter: () => new SqliteAdapter(),
|
|
345
|
+
createDriver: () => new DummyDriver(),
|
|
346
|
+
createQueryCompiler: () => ({
|
|
347
|
+
compileQuery: () => ({
|
|
348
|
+
sql: "",
|
|
349
|
+
parameters: [],
|
|
350
|
+
}),
|
|
351
|
+
}),
|
|
360
352
|
},
|
|
361
|
-
|
|
362
|
-
}
|
|
363
|
-
|
|
364
|
-
const sqliteAdapter = new KyselyAdapter({ db: sqliteDb, provider: "sqlite" });
|
|
353
|
+
driverConfig: new SQLocalDriverConfig(),
|
|
354
|
+
});
|
|
365
355
|
|
|
366
356
|
vi.spyOn(sqliteAdapter, "isConnectionHealthy").mockResolvedValue(true);
|
|
367
357
|
vi.spyOn(sqliteAdapter, "getSchemaVersion").mockResolvedValue(undefined);
|
|
@@ -1,15 +1,14 @@
|
|
|
1
1
|
import type { FragnoDatabase } from "../mod";
|
|
2
2
|
import type { AnySchema } from "../schema/create";
|
|
3
|
-
import type { PreparedMigration } from "./create";
|
|
4
3
|
import {
|
|
5
4
|
fragnoDatabaseAdapterNameFakeSymbol,
|
|
6
5
|
fragnoDatabaseAdapterVersionFakeSymbol,
|
|
7
6
|
} from "../adapters/adapters";
|
|
8
7
|
import {
|
|
9
8
|
internalFragmentDef,
|
|
10
|
-
|
|
11
|
-
SETTINGS_TABLE_NAME,
|
|
9
|
+
internalSchema,
|
|
12
10
|
SETTINGS_NAMESPACE,
|
|
11
|
+
getSchemaVersionFromDatabase,
|
|
13
12
|
} from "../fragments/internal-fragment";
|
|
14
13
|
import { instantiate } from "@fragno-dev/core";
|
|
15
14
|
|
|
@@ -25,7 +24,6 @@ export interface GenerationInternalResult {
|
|
|
25
24
|
namespace: string;
|
|
26
25
|
fromVersion: number;
|
|
27
26
|
toVersion: number;
|
|
28
|
-
preparedMigration?: PreparedMigration;
|
|
29
27
|
}
|
|
30
28
|
|
|
31
29
|
export interface ExecuteMigrationResult {
|
|
@@ -68,7 +66,7 @@ export async function generateMigrationsOrSchema<
|
|
|
68
66
|
|
|
69
67
|
// Include internal fragment first with empty namespace (settings table has no prefix)
|
|
70
68
|
fragmentsMap.set("", {
|
|
71
|
-
schema:
|
|
69
|
+
schema: internalSchema,
|
|
72
70
|
namespace: "",
|
|
73
71
|
});
|
|
74
72
|
|
|
@@ -96,10 +94,10 @@ export async function generateMigrationsOrSchema<
|
|
|
96
94
|
];
|
|
97
95
|
}
|
|
98
96
|
|
|
99
|
-
// Otherwise, use migration engine for individual generation (e.g., Kysely)
|
|
100
|
-
if (!adapter.
|
|
97
|
+
// Otherwise, use migration engine for individual generation (e.g., Kysely, GenericSQL)
|
|
98
|
+
if (!adapter.prepareMigrations) {
|
|
101
99
|
throw new Error(
|
|
102
|
-
"Adapter does not support migration-based schema generation. Ensure your adapter implements
|
|
100
|
+
"Adapter does not support migration-based schema generation. Ensure your adapter implements prepareMigrations.",
|
|
103
101
|
);
|
|
104
102
|
}
|
|
105
103
|
|
|
@@ -115,45 +113,22 @@ export async function generateMigrationsOrSchema<
|
|
|
115
113
|
.withOptions({ databaseAdapter: adapter })
|
|
116
114
|
.build();
|
|
117
115
|
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
const v = internalFragment.services.settingsService.get("version");
|
|
123
|
-
await executeRetrieve();
|
|
124
|
-
|
|
125
|
-
return v;
|
|
126
|
-
});
|
|
127
|
-
});
|
|
128
|
-
|
|
129
|
-
if (!result) {
|
|
130
|
-
settingsSourceVersion = 0;
|
|
131
|
-
} else {
|
|
132
|
-
settingsSourceVersion = parseInt(result.value);
|
|
133
|
-
}
|
|
134
|
-
} catch {
|
|
135
|
-
// Settings table doesn't exist yet (first migration)
|
|
136
|
-
settingsSourceVersion = 0;
|
|
137
|
-
}
|
|
116
|
+
const settingsSourceVersion = await getSchemaVersionFromDatabase(
|
|
117
|
+
internalFragment,
|
|
118
|
+
SETTINGS_NAMESPACE,
|
|
119
|
+
);
|
|
138
120
|
|
|
139
121
|
const generatedFiles: GenerationInternalResult[] = [];
|
|
140
122
|
|
|
141
123
|
// Use empty namespace for settings (SETTINGS_NAMESPACE is for prefixing keys, not the database namespace)
|
|
142
|
-
const
|
|
143
|
-
const settingsTargetVersion =
|
|
124
|
+
const settingsPreparedMigrations = adapter.prepareMigrations(internalSchema, "");
|
|
125
|
+
const settingsTargetVersion = internalSchema.version;
|
|
144
126
|
|
|
145
127
|
// Generate settings table migration
|
|
146
|
-
const
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
if (!settingsMigration.getSQL) {
|
|
151
|
-
throw new Error(
|
|
152
|
-
"Migration engine does not support SQL generation. Ensure your adapter's migration engine provides getSQL().",
|
|
153
|
-
);
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
const settingsSql = settingsMigration.getSQL();
|
|
128
|
+
const settingsSql = settingsPreparedMigrations.getSQL(
|
|
129
|
+
settingsSourceVersion,
|
|
130
|
+
settingsTargetVersion,
|
|
131
|
+
);
|
|
157
132
|
|
|
158
133
|
if (settingsSql.trim()) {
|
|
159
134
|
generatedFiles.push({
|
|
@@ -162,7 +137,6 @@ export async function generateMigrationsOrSchema<
|
|
|
162
137
|
namespace: "", // Empty namespace for settings table
|
|
163
138
|
fromVersion: settingsSourceVersion,
|
|
164
139
|
toVersion: settingsTargetVersion,
|
|
165
|
-
preparedMigration: settingsMigration,
|
|
166
140
|
});
|
|
167
141
|
}
|
|
168
142
|
|
|
@@ -171,29 +145,19 @@ export async function generateMigrationsOrSchema<
|
|
|
171
145
|
const dbAdapter = db.adapter;
|
|
172
146
|
|
|
173
147
|
// Use migration engine
|
|
174
|
-
if (!dbAdapter.
|
|
148
|
+
if (!dbAdapter.prepareMigrations) {
|
|
175
149
|
throw new Error(
|
|
176
150
|
`Adapter for ${db.namespace} does not support schema generation. ` +
|
|
177
|
-
`Ensure your adapter implements either createSchemaGenerator or
|
|
151
|
+
`Ensure your adapter implements either createSchemaGenerator or prepareMigrations.`,
|
|
178
152
|
);
|
|
179
153
|
}
|
|
180
154
|
|
|
181
|
-
const
|
|
155
|
+
const preparedMigrations = dbAdapter.prepareMigrations(db.schema, db.namespace);
|
|
182
156
|
const targetVersion = options?.toVersion ?? db.schema.version;
|
|
183
157
|
const sourceVersion = options?.fromVersion ?? 0;
|
|
184
158
|
|
|
185
159
|
// Generate migration from source to target version
|
|
186
|
-
const
|
|
187
|
-
fromVersion: sourceVersion,
|
|
188
|
-
});
|
|
189
|
-
|
|
190
|
-
if (!preparedMigration.getSQL) {
|
|
191
|
-
throw new Error(
|
|
192
|
-
"Migration engine does not support SQL generation. Ensure your adapter's migration engine provides getSQL().",
|
|
193
|
-
);
|
|
194
|
-
}
|
|
195
|
-
|
|
196
|
-
const sql = preparedMigration.getSQL();
|
|
160
|
+
const sql = preparedMigrations.getSQL(sourceVersion, targetVersion);
|
|
197
161
|
|
|
198
162
|
// If no migrations needed, skip this fragment
|
|
199
163
|
if (sql.trim()) {
|
|
@@ -203,7 +167,6 @@ export async function generateMigrationsOrSchema<
|
|
|
203
167
|
namespace: db.namespace,
|
|
204
168
|
fromVersion: sourceVersion,
|
|
205
169
|
toVersion: targetVersion,
|
|
206
|
-
preparedMigration: preparedMigration,
|
|
207
170
|
});
|
|
208
171
|
}
|
|
209
172
|
}
|
|
@@ -230,7 +193,7 @@ export async function executeMigrations<const TDatabases extends FragnoDatabase<
|
|
|
230
193
|
const adapter = firstDb.adapter;
|
|
231
194
|
|
|
232
195
|
// Validate adapter supports migrations
|
|
233
|
-
if (!adapter.
|
|
196
|
+
if (!adapter.prepareMigrations) {
|
|
234
197
|
throw new Error(
|
|
235
198
|
"Adapter does not support running migrations. The adapter only supports schema generation.\n" +
|
|
236
199
|
"Try using 'generateMigrationsOrSchema' instead to generate schema files.",
|
|
@@ -264,7 +227,7 @@ export async function executeMigrations<const TDatabases extends FragnoDatabase<
|
|
|
264
227
|
namespace: string;
|
|
265
228
|
fromVersion: number;
|
|
266
229
|
toVersion: number;
|
|
267
|
-
|
|
230
|
+
execute: () => Promise<void>;
|
|
268
231
|
}> = [];
|
|
269
232
|
|
|
270
233
|
// 1. Prepare settings table migration
|
|
@@ -274,43 +237,31 @@ export async function executeMigrations<const TDatabases extends FragnoDatabase<
|
|
|
274
237
|
.withOptions({ databaseAdapter: adapter })
|
|
275
238
|
.build();
|
|
276
239
|
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
const uow = forSchema(settingsSchema);
|
|
282
|
-
const findOp = uow.find(SETTINGS_TABLE_NAME, (b) =>
|
|
283
|
-
b.whereIndex("unique_key", (eb) => eb("key", "=", `${SETTINGS_NAMESPACE}.version`)),
|
|
284
|
-
);
|
|
285
|
-
|
|
286
|
-
await executeRetrieve();
|
|
287
|
-
|
|
288
|
-
const [results] = await findOp.retrievalPhase;
|
|
289
|
-
return results?.[0];
|
|
290
|
-
});
|
|
291
|
-
});
|
|
292
|
-
settingsSourceVersion = result ? parseInt(result.value) : 0;
|
|
293
|
-
} catch {
|
|
294
|
-
// Settings table doesn't exist yet (first migration)
|
|
295
|
-
settingsSourceVersion = 0;
|
|
296
|
-
}
|
|
240
|
+
const settingsSourceVersion = await getSchemaVersionFromDatabase(
|
|
241
|
+
internalFragment,
|
|
242
|
+
SETTINGS_NAMESPACE,
|
|
243
|
+
);
|
|
297
244
|
|
|
298
245
|
// Use empty namespace for settings (SETTINGS_NAMESPACE is for prefixing keys, not the database namespace)
|
|
299
|
-
const
|
|
300
|
-
const settingsTargetVersion =
|
|
246
|
+
const settingsPreparedMigrations = adapter.prepareMigrations(internalSchema, "");
|
|
247
|
+
const settingsTargetVersion = internalSchema.version;
|
|
301
248
|
|
|
302
249
|
if (settingsSourceVersion < settingsTargetVersion) {
|
|
303
|
-
const
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
250
|
+
const compiledMigration = settingsPreparedMigrations.compile(
|
|
251
|
+
settingsSourceVersion,
|
|
252
|
+
settingsTargetVersion,
|
|
253
|
+
{ updateVersionInMigration: true },
|
|
254
|
+
);
|
|
307
255
|
|
|
308
|
-
if (
|
|
256
|
+
if (compiledMigration.statements.length > 0) {
|
|
309
257
|
migrationsToExecute.push({
|
|
310
258
|
namespace: "", // Empty namespace for settings table
|
|
311
259
|
fromVersion: settingsSourceVersion,
|
|
312
260
|
toVersion: settingsTargetVersion,
|
|
313
|
-
|
|
261
|
+
execute: () =>
|
|
262
|
+
settingsPreparedMigrations.execute(settingsSourceVersion, settingsTargetVersion, {
|
|
263
|
+
updateVersionInMigration: true,
|
|
264
|
+
}),
|
|
314
265
|
});
|
|
315
266
|
}
|
|
316
267
|
}
|
|
@@ -319,21 +270,24 @@ export async function executeMigrations<const TDatabases extends FragnoDatabase<
|
|
|
319
270
|
const sortedDatabases = [...databases].sort((a, b) => a.namespace.localeCompare(b.namespace));
|
|
320
271
|
|
|
321
272
|
for (const fragnoDb of sortedDatabases) {
|
|
322
|
-
const
|
|
323
|
-
const currentVersion = await
|
|
273
|
+
const preparedMigrations = adapter.prepareMigrations(fragnoDb.schema, fragnoDb.namespace);
|
|
274
|
+
const currentVersion = await getSchemaVersionFromDatabase(internalFragment, fragnoDb.namespace);
|
|
324
275
|
const targetVersion = fragnoDb.schema.version;
|
|
325
276
|
|
|
326
277
|
if (currentVersion < targetVersion) {
|
|
327
|
-
const
|
|
328
|
-
|
|
278
|
+
const compiledMigration = preparedMigrations.compile(currentVersion, targetVersion, {
|
|
279
|
+
updateVersionInMigration: true,
|
|
329
280
|
});
|
|
330
281
|
|
|
331
|
-
if (
|
|
282
|
+
if (compiledMigration.statements.length > 0) {
|
|
332
283
|
migrationsToExecute.push({
|
|
333
284
|
namespace: fragnoDb.namespace,
|
|
334
285
|
fromVersion: currentVersion,
|
|
335
286
|
toVersion: targetVersion,
|
|
336
|
-
|
|
287
|
+
execute: () =>
|
|
288
|
+
preparedMigrations.execute(currentVersion, targetVersion, {
|
|
289
|
+
updateVersionInMigration: true,
|
|
290
|
+
}),
|
|
337
291
|
});
|
|
338
292
|
}
|
|
339
293
|
}
|
|
@@ -341,7 +295,7 @@ export async function executeMigrations<const TDatabases extends FragnoDatabase<
|
|
|
341
295
|
|
|
342
296
|
// 3. Execute all migrations in order
|
|
343
297
|
for (const migration of migrationsToExecute) {
|
|
344
|
-
await migration.
|
|
298
|
+
await migration.execute();
|
|
345
299
|
results.push({
|
|
346
300
|
namespace: migration.namespace,
|
|
347
301
|
didMigrate: true,
|