@fragno-dev/db 0.3.0 → 0.4.1
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 +327 -160
- package/CHANGELOG.md +74 -0
- package/README.md +24 -0
- package/dist/adapters/adapters.d.ts +1 -1
- package/dist/adapters/adapters.d.ts.map +1 -1
- package/dist/adapters/adapters.js.map +1 -1
- package/dist/adapters/generic-sql/generic-sql-adapter.d.ts +0 -3
- package/dist/adapters/generic-sql/generic-sql-adapter.d.ts.map +1 -1
- package/dist/adapters/generic-sql/generic-sql-adapter.js +11 -12
- package/dist/adapters/generic-sql/generic-sql-adapter.js.map +1 -1
- package/dist/adapters/generic-sql/generic-sql-uow-executor.js +46 -6
- package/dist/adapters/generic-sql/generic-sql-uow-executor.js.map +1 -1
- package/dist/adapters/generic-sql/migration/cold-kysely.js.map +1 -1
- package/dist/adapters/generic-sql/migration/dialect/mysql.js +1 -1
- package/dist/adapters/generic-sql/migration/dialect/mysql.js.map +1 -1
- package/dist/adapters/generic-sql/migration/dialect/postgres.js +1 -1
- package/dist/adapters/generic-sql/migration/dialect/postgres.js.map +1 -1
- package/dist/adapters/generic-sql/migration/dialect/sqlite.js +185 -19
- package/dist/adapters/generic-sql/migration/dialect/sqlite.js.map +1 -1
- package/dist/adapters/generic-sql/migration/executor.d.ts.map +1 -1
- package/dist/adapters/generic-sql/migration/executor.js +30 -3
- package/dist/adapters/generic-sql/migration/executor.js.map +1 -1
- package/dist/adapters/generic-sql/migration/prepared-migrations.d.ts.map +1 -1
- package/dist/adapters/generic-sql/migration/prepared-migrations.js +3 -3
- package/dist/adapters/generic-sql/migration/prepared-migrations.js.map +1 -1
- package/dist/adapters/generic-sql/migration/sql-generator.js +1 -1
- package/dist/adapters/generic-sql/migration/sql-generator.js.map +1 -1
- package/dist/adapters/generic-sql/query/create-sql-query-compiler.js +1 -1
- package/dist/adapters/generic-sql/query/create-sql-query-compiler.js.map +1 -1
- package/dist/adapters/generic-sql/query/cursor-utils.js.map +1 -1
- package/dist/adapters/generic-sql/query/db-now-sql.js +27 -0
- package/dist/adapters/generic-sql/query/db-now-sql.js.map +1 -0
- package/dist/adapters/generic-sql/query/generic-sql-uow-operation-compiler.js +9 -6
- package/dist/adapters/generic-sql/query/generic-sql-uow-operation-compiler.js.map +1 -1
- package/dist/adapters/generic-sql/query/select-builder.js.map +1 -1
- package/dist/adapters/generic-sql/query/sql-query-compiler.js +37 -9
- package/dist/adapters/generic-sql/query/sql-query-compiler.js.map +1 -1
- package/dist/adapters/generic-sql/query/where-builder.js +24 -20
- package/dist/adapters/generic-sql/query/where-builder.js.map +1 -1
- package/dist/adapters/generic-sql/uow-decoder.js +1 -1
- package/dist/adapters/generic-sql/uow-decoder.js.map +1 -1
- package/dist/adapters/generic-sql/uow-encoder.js +8 -9
- package/dist/adapters/generic-sql/uow-encoder.js.map +1 -1
- package/dist/adapters/in-memory/condition-evaluator.js +10 -6
- package/dist/adapters/in-memory/condition-evaluator.js.map +1 -1
- package/dist/adapters/in-memory/in-memory-adapter.d.ts.map +1 -1
- package/dist/adapters/in-memory/in-memory-adapter.js +45 -25
- package/dist/adapters/in-memory/in-memory-adapter.js.map +1 -1
- package/dist/adapters/in-memory/in-memory-uow.js +236 -13
- package/dist/adapters/in-memory/in-memory-uow.js.map +1 -1
- package/dist/adapters/in-memory/options.d.ts +2 -0
- package/dist/adapters/in-memory/options.d.ts.map +1 -1
- package/dist/adapters/in-memory/options.js +3 -2
- package/dist/adapters/in-memory/options.js.map +1 -1
- package/dist/adapters/in-memory/reference-resolution.js.map +1 -1
- package/dist/adapters/in-memory/store.js +1 -1
- package/dist/adapters/in-memory/store.js.map +1 -1
- package/dist/adapters/shared/from-unit-of-work-compiler.js +51 -24
- package/dist/adapters/shared/from-unit-of-work-compiler.js.map +1 -1
- package/dist/adapters/shared/uow-operation-compiler.js.map +1 -1
- package/dist/browser/adapters/adapters.d.ts +61 -0
- package/dist/browser/adapters/adapters.d.ts.map +1 -0
- package/dist/browser/adapters/generic-sql/migration/executor.d.ts +15 -0
- package/dist/browser/adapters/generic-sql/migration/executor.d.ts.map +1 -0
- package/dist/browser/adapters/generic-sql/migration/prepared-migrations.d.ts +66 -0
- package/dist/browser/adapters/generic-sql/migration/prepared-migrations.d.ts.map +1 -0
- package/dist/browser/adapters/generic-sql/sqlite-storage.d.ts +11 -0
- package/dist/browser/adapters/generic-sql/sqlite-storage.d.ts.map +1 -0
- package/dist/browser/adapters/in-memory/in-memory-adapter.d.ts +5 -0
- package/dist/browser/adapters/in-memory/index.d.ts +2 -0
- package/dist/browser/adapters/in-memory/options.d.ts +1 -0
- package/dist/browser/db-fragment-definition-builder.d.ts +237 -0
- package/dist/browser/db-fragment-definition-builder.d.ts.map +1 -0
- package/dist/browser/durable-hooks.d.ts +3 -0
- package/dist/browser/fragments/internal-fragment.d.ts +317 -0
- package/dist/browser/fragments/internal-fragment.d.ts.map +1 -0
- package/dist/browser/fragments/internal-fragment.schema.d.ts +1 -0
- package/dist/browser/hooks/durable-hooks-logger.d.ts +10 -0
- package/dist/browser/hooks/durable-hooks-logger.d.ts.map +1 -0
- package/dist/browser/hooks/hooks.d.ts +146 -0
- package/dist/browser/hooks/hooks.d.ts.map +1 -0
- package/dist/browser/id.js +1 -0
- package/dist/browser/internal/adapter-registry.d.ts +4 -0
- package/dist/browser/internal/outbox-state.d.ts +2 -0
- package/dist/browser/mod.d.ts +15 -0
- package/dist/browser/mod.d.ts.map +1 -0
- package/dist/browser/mod.js +17 -0
- package/dist/browser/mod.js.map +1 -0
- package/dist/browser/mod2.d.ts +48 -0
- package/dist/browser/mod2.d.ts.map +1 -0
- package/dist/browser/naming/sql-naming.d.ts +19 -0
- package/dist/browser/naming/sql-naming.d.ts.map +1 -0
- package/dist/browser/outbox/outbox.d.ts +21 -0
- package/dist/browser/outbox/outbox.d.ts.map +1 -0
- package/dist/browser/query/column-defaults.js +1 -0
- package/dist/browser/query/condition-builder.d.ts +44 -0
- package/dist/browser/query/condition-builder.d.ts.map +1 -0
- package/dist/browser/query/condition-builder.js +97 -0
- package/dist/browser/query/condition-builder.js.map +1 -0
- package/dist/browser/query/cursor.d.ts +105 -0
- package/dist/browser/query/cursor.d.ts.map +1 -0
- package/dist/browser/query/cursor.js +150 -0
- package/dist/browser/query/cursor.js.map +1 -0
- package/dist/browser/query/db-now.d.ts +22 -0
- package/dist/browser/query/db-now.d.ts.map +1 -0
- package/dist/browser/query/db-now.js +33 -0
- package/dist/browser/query/db-now.js.map +1 -0
- package/dist/browser/query/orm/orm.d.ts +18 -0
- package/dist/browser/query/orm/orm.d.ts.map +1 -0
- package/dist/browser/query/simple-query-interface.d.ts +108 -0
- package/dist/browser/query/simple-query-interface.d.ts.map +1 -0
- package/dist/browser/query/unit-of-work/execute-unit-of-work.d.ts +423 -0
- package/dist/browser/query/unit-of-work/execute-unit-of-work.d.ts.map +1 -0
- package/dist/browser/query/unit-of-work/execute-unit-of-work.js +507 -0
- package/dist/browser/query/unit-of-work/execute-unit-of-work.js.map +1 -0
- package/dist/browser/query/unit-of-work/retry-policy.d.ts +23 -0
- package/dist/browser/query/unit-of-work/retry-policy.d.ts.map +1 -0
- package/dist/browser/query/unit-of-work/retry-policy.js +40 -0
- package/dist/browser/query/unit-of-work/retry-policy.js.map +1 -0
- package/dist/browser/query/unit-of-work/unit-of-work.d.ts +703 -0
- package/dist/browser/query/unit-of-work/unit-of-work.d.ts.map +1 -0
- package/dist/browser/query/unit-of-work/unit-of-work.js +1206 -0
- package/dist/browser/query/unit-of-work/unit-of-work.js.map +1 -0
- package/dist/browser/query/value-encoding.js +38 -0
- package/dist/browser/query/value-encoding.js.map +1 -0
- package/dist/browser/schema/create.d.ts +326 -0
- package/dist/browser/schema/create.d.ts.map +1 -0
- package/dist/browser/schema/create.js +89 -0
- package/dist/browser/schema/create.js.map +1 -0
- package/dist/browser/schema/generate-id.js +28 -0
- package/dist/browser/schema/generate-id.js.map +1 -0
- package/dist/browser/shared/providers.d.ts +6 -0
- package/dist/browser/shared/providers.d.ts.map +1 -0
- package/dist/browser/sql-driver/connection/connection-provider.d.ts +13 -0
- package/dist/browser/sql-driver/connection/connection-provider.d.ts.map +1 -0
- package/dist/browser/sql-driver/dialect-adapter/dialect-adapter.d.ts +7 -0
- package/dist/browser/sql-driver/dialect-adapter/dialect-adapter.d.ts.map +1 -0
- package/dist/browser/sql-driver/driver/runtime-driver.d.ts +23 -0
- package/dist/browser/sql-driver/driver/runtime-driver.d.ts.map +1 -0
- package/dist/browser/sql-driver/query-executor/plugin.d.ts +17 -0
- package/dist/browser/sql-driver/query-executor/plugin.d.ts.map +1 -0
- package/dist/browser/sql-driver/query-executor/query-executor.d.ts +36 -0
- package/dist/browser/sql-driver/query-executor/query-executor.d.ts.map +1 -0
- package/dist/browser/sql-driver/sql-driver-adapter.d.ts +29 -0
- package/dist/browser/sql-driver/sql-driver-adapter.d.ts.map +1 -0
- package/dist/browser/sql-driver/sql-driver.d.ts +38 -0
- package/dist/browser/sql-driver/sql-driver.d.ts.map +1 -0
- package/dist/browser/sync/commands.d.ts +15 -0
- package/dist/browser/sync/commands.d.ts.map +1 -0
- package/dist/browser/sync/commands.js +27 -0
- package/dist/browser/sync/commands.js.map +1 -0
- package/dist/browser/sync/types.d.ts +63 -0
- package/dist/browser/sync/types.d.ts.map +1 -0
- package/dist/browser/util/types.d.ts +8 -0
- package/dist/browser/util/types.d.ts.map +1 -0
- package/dist/browser/with-database.d.ts +29 -0
- package/dist/browser/with-database.d.ts.map +1 -0
- package/dist/client.d.ts +4 -0
- package/dist/client.js +5 -0
- package/dist/db-fragment-definition-builder.d.ts +85 -28
- package/dist/db-fragment-definition-builder.d.ts.map +1 -1
- package/dist/db-fragment-definition-builder.js +374 -46
- package/dist/db-fragment-definition-builder.js.map +1 -1
- package/dist/dispatchers/cloudflare-do/dispatcher.d.ts +20 -0
- package/dist/dispatchers/cloudflare-do/dispatcher.d.ts.map +1 -0
- package/dist/dispatchers/cloudflare-do/dispatcher.js +147 -0
- package/dist/dispatchers/cloudflare-do/dispatcher.js.map +1 -0
- package/dist/dispatchers/cloudflare-do/index.d.ts +5 -20
- package/dist/dispatchers/cloudflare-do/index.d.ts.map +1 -1
- package/dist/dispatchers/cloudflare-do/index.js +23 -55
- package/dist/dispatchers/cloudflare-do/index.js.map +1 -1
- package/dist/dispatchers/node/dispatcher.d.ts +14 -0
- package/dist/dispatchers/node/dispatcher.d.ts.map +1 -0
- package/dist/dispatchers/node/dispatcher.js +80 -0
- package/dist/dispatchers/node/dispatcher.js.map +1 -0
- package/dist/dispatchers/node/index.d.ts +5 -10
- package/dist/dispatchers/node/index.d.ts.map +1 -1
- package/dist/dispatchers/node/index.js +21 -53
- package/dist/dispatchers/node/index.js.map +1 -1
- package/dist/durable-hooks.d.ts +31 -0
- package/dist/durable-hooks.d.ts.map +1 -0
- package/dist/durable-hooks.js +23 -0
- package/dist/durable-hooks.js.map +1 -0
- package/dist/fragments/internal-fragment.d.ts +128 -27
- package/dist/fragments/internal-fragment.d.ts.map +1 -1
- package/dist/fragments/internal-fragment.js +125 -78
- package/dist/fragments/internal-fragment.js.map +1 -1
- package/dist/fragments/internal-fragment.routes.js +138 -3
- package/dist/fragments/internal-fragment.routes.js.map +1 -1
- package/dist/fragments/internal-fragment.schema.d.ts +7 -1
- package/dist/fragments/internal-fragment.schema.d.ts.map +1 -1
- package/dist/fragments/internal-fragment.schema.js +18 -1
- package/dist/fragments/internal-fragment.schema.js.map +1 -1
- package/dist/hooks/durable-hooks-logger.d.ts +10 -0
- package/dist/hooks/durable-hooks-logger.d.ts.map +1 -0
- package/dist/hooks/durable-hooks-logger.js +75 -0
- package/dist/hooks/durable-hooks-logger.js.map +1 -0
- package/dist/hooks/durable-hooks-processor.d.ts +1 -14
- package/dist/hooks/durable-hooks-processor.js +58 -10
- package/dist/hooks/durable-hooks-processor.js.map +1 -1
- package/dist/hooks/durable-hooks-runtime.js +44 -0
- package/dist/hooks/durable-hooks-runtime.js.map +1 -0
- package/dist/hooks/hooks.d.ts +60 -2
- package/dist/hooks/hooks.d.ts.map +1 -1
- package/dist/hooks/hooks.js +214 -53
- package/dist/hooks/hooks.js.map +1 -1
- package/dist/id.d.ts +2 -2
- package/dist/id.js +2 -2
- package/dist/internal/adapter-registry.d.ts +11 -0
- package/dist/internal/adapter-registry.d.ts.map +1 -0
- package/dist/internal/adapter-registry.js +135 -0
- package/dist/internal/adapter-registry.js.map +1 -0
- package/dist/internal/outbox-state.d.ts +2 -0
- package/dist/internal/outbox-state.js +26 -0
- package/dist/internal/outbox-state.js.map +1 -0
- package/dist/migration-engine/auto-from-schema.d.ts +33 -0
- package/dist/migration-engine/auto-from-schema.d.ts.map +1 -0
- package/dist/migration-engine/auto-from-schema.js +210 -27
- package/dist/migration-engine/auto-from-schema.js.map +1 -1
- package/dist/migration-engine/generation-engine.d.ts.map +1 -1
- package/dist/migration-engine/generation-engine.js +17 -5
- package/dist/migration-engine/generation-engine.js.map +1 -1
- package/dist/migration-engine/shared.d.ts +113 -0
- package/dist/migration-engine/shared.d.ts.map +1 -0
- package/dist/migration-engine/shared.js.map +1 -1
- package/dist/mod.d.ts +12 -11
- package/dist/mod.d.ts.map +1 -1
- package/dist/mod.js +10 -10
- package/dist/mod.js.map +1 -1
- package/dist/naming/sql-naming.d.ts.map +1 -1
- package/dist/naming/sql-naming.js.map +1 -1
- package/dist/outbox/outbox-builder.js.map +1 -1
- package/dist/outbox/outbox.d.ts +3 -1
- package/dist/outbox/outbox.d.ts.map +1 -1
- package/dist/outbox/outbox.js.map +1 -1
- package/dist/query/column-defaults.js.map +1 -1
- package/dist/query/condition-builder.d.ts +7 -1
- package/dist/query/condition-builder.d.ts.map +1 -1
- package/dist/query/condition-builder.js +5 -1
- package/dist/query/condition-builder.js.map +1 -1
- package/dist/query/cursor-client.d.ts +105 -0
- package/dist/query/cursor-client.d.ts.map +1 -0
- package/dist/query/cursor-client.js +165 -0
- package/dist/query/cursor-client.js.map +1 -0
- package/dist/query/cursor.d.ts.map +1 -1
- package/dist/query/cursor.js +7 -1
- package/dist/query/cursor.js.map +1 -1
- package/dist/query/db-now.d.ts +15 -1
- package/dist/query/db-now.d.ts.map +1 -1
- package/dist/query/db-now.js +30 -2
- package/dist/query/db-now.js.map +1 -1
- package/dist/query/orm/orm.js.map +1 -1
- package/dist/query/serialize/create-sql-serializer.js +2 -2
- package/dist/query/serialize/create-sql-serializer.js.map +1 -1
- package/dist/query/serialize/dialect/mysql-serializer.js.map +1 -1
- package/dist/query/serialize/dialect/postgres-serializer.js.map +1 -1
- package/dist/query/serialize/dialect/sqlite-serializer.js +6 -2
- package/dist/query/serialize/dialect/sqlite-serializer.js.map +1 -1
- package/dist/query/simple-query-interface.d.ts +7 -3
- package/dist/query/simple-query-interface.d.ts.map +1 -1
- package/dist/query/unit-of-work/execute-unit-of-work.d.ts +37 -2
- package/dist/query/unit-of-work/execute-unit-of-work.d.ts.map +1 -1
- package/dist/query/unit-of-work/execute-unit-of-work.js +39 -18
- package/dist/query/unit-of-work/execute-unit-of-work.js.map +1 -1
- package/dist/query/unit-of-work/unit-of-work.d.ts +42 -16
- package/dist/query/unit-of-work/unit-of-work.d.ts.map +1 -1
- package/dist/query/unit-of-work/unit-of-work.js +50 -6
- package/dist/query/unit-of-work/unit-of-work.js.map +1 -1
- package/dist/query/value-decoding.js +8 -1
- package/dist/query/value-decoding.js.map +1 -1
- package/dist/query/value-encoding.js.map +1 -1
- package/dist/schema/create.d.ts +69 -25
- package/dist/schema/create.d.ts.map +1 -1
- package/dist/schema/create.js +91 -16
- package/dist/schema/create.js.map +1 -1
- package/dist/schema/type-conversion/create-sql-type-mapper.js +1 -1
- package/dist/schema/type-conversion/create-sql-type-mapper.js.map +1 -1
- package/dist/schema/type-conversion/dialect/sqlite.js.map +1 -1
- package/dist/schema/validator.d.ts.map +1 -1
- package/dist/schema/validator.js.map +1 -1
- package/dist/schema-output/drizzle.d.ts.map +1 -1
- package/dist/schema-output/drizzle.js +8 -6
- package/dist/schema-output/drizzle.js.map +1 -1
- package/dist/schema-output/prisma.d.ts.map +1 -1
- package/dist/schema-output/prisma.js +21 -10
- package/dist/schema-output/prisma.js.map +1 -1
- package/dist/sql-driver/dialects/durable-object-dialect.js +3 -9
- package/dist/sql-driver/dialects/durable-object-dialect.js.map +1 -1
- package/dist/sql-driver/query-executor/default-query-executor.js.map +1 -1
- package/dist/sql-driver/query-executor/query-executor-base.js.map +1 -1
- package/dist/sql-driver/sql-driver-adapter.js.map +1 -1
- package/dist/sql-driver/sql.js.map +1 -1
- package/dist/sync/commands.d.ts +15 -0
- package/dist/sync/commands.d.ts.map +1 -0
- package/dist/sync/commands.js +27 -0
- package/dist/sync/commands.js.map +1 -0
- package/dist/sync/index.d.ts +4 -0
- package/dist/sync/index.js +4 -0
- package/dist/sync/read-tracking.d.ts +25 -0
- package/dist/sync/read-tracking.d.ts.map +1 -0
- package/dist/sync/read-tracking.js +148 -0
- package/dist/sync/read-tracking.js.map +1 -0
- package/dist/sync/submit.js +213 -0
- package/dist/sync/submit.js.map +1 -0
- package/dist/sync/types.d.ts +63 -0
- package/dist/sync/types.d.ts.map +1 -0
- package/dist/util/default-database-adapter.js +6 -1
- package/dist/util/default-database-adapter.js.map +1 -1
- package/dist/with-database.d.ts +3 -6
- package/dist/with-database.d.ts.map +1 -1
- package/dist/with-database.js +7 -15
- package/dist/with-database.js.map +1 -1
- package/package.json +33 -41
- package/src/adapters/adapters.ts +5 -4
- package/src/adapters/drizzle/migrate-drizzle.test.ts +46 -9
- package/src/adapters/drizzle/migration-parity-drizzle-kit.test.ts +5 -3
- package/src/adapters/drizzle/test-utils.ts +2 -1
- package/src/adapters/generic-sql/generic-sql-adapter.test.ts +5 -3
- package/src/adapters/generic-sql/generic-sql-adapter.ts +21 -24
- package/src/adapters/generic-sql/generic-sql-uow-executor.test.ts +1 -0
- package/src/adapters/generic-sql/generic-sql-uow-executor.ts +81 -15
- package/src/adapters/generic-sql/migration/adapter-migration-parity.test.ts +4 -2
- package/src/adapters/generic-sql/migration/cold-kysely.ts +1 -0
- package/src/adapters/generic-sql/migration/dialect/mysql.test.ts +3 -2
- package/src/adapters/generic-sql/migration/dialect/mysql.ts +1 -0
- package/src/adapters/generic-sql/migration/dialect/postgres.test.ts +5 -4
- package/src/adapters/generic-sql/migration/dialect/postgres.ts +2 -1
- package/src/adapters/generic-sql/migration/dialect/sqlite.test.ts +795 -3
- package/src/adapters/generic-sql/migration/dialect/sqlite.ts +385 -57
- package/src/adapters/generic-sql/migration/executor.test.ts +52 -0
- package/src/adapters/generic-sql/migration/executor.ts +47 -4
- package/src/adapters/generic-sql/migration/prepared-migrations.test.ts +117 -14
- package/src/adapters/generic-sql/migration/prepared-migrations.ts +9 -8
- package/src/adapters/generic-sql/migration/sql-generator.ts +5 -3
- package/src/adapters/generic-sql/query/create-sql-query-compiler.ts +3 -3
- package/src/adapters/generic-sql/query/cursor-utils.test.ts +3 -2
- package/src/adapters/generic-sql/query/cursor-utils.ts +1 -1
- package/src/adapters/generic-sql/query/db-now-sql.ts +49 -0
- package/src/adapters/generic-sql/query/generic-sql-uow-operation-compiler.test.ts +144 -8
- package/src/adapters/generic-sql/query/generic-sql-uow-operation-compiler.ts +16 -17
- package/src/adapters/generic-sql/query/select-builder.test.ts +1 -0
- package/src/adapters/generic-sql/query/select-builder.ts +2 -2
- package/src/adapters/generic-sql/query/sql-query-compiler.test.ts +24 -5
- package/src/adapters/generic-sql/query/sql-query-compiler.ts +83 -13
- package/src/adapters/generic-sql/query/where-builder.test.ts +7 -5
- package/src/adapters/generic-sql/query/where-builder.ts +48 -29
- package/src/adapters/generic-sql/sql-adapter-pglite-migrations.test.ts +6 -15
- package/src/adapters/generic-sql/sql-adapter-pglite-pagination.test.ts +52 -7
- package/src/adapters/generic-sql/sql-adapter-pglite-queries.test.ts +9 -6
- package/src/adapters/generic-sql/sql-adapter-sqlite3-driver.test.ts +273 -5
- package/src/adapters/generic-sql/sql-adapter-sqlite3-uow.test.ts +123 -6
- package/src/adapters/generic-sql/sql-adapter-sqlocal.test.ts +4 -2
- package/src/adapters/generic-sql/uow-decoder.test.ts +4 -3
- package/src/adapters/generic-sql/uow-decoder.ts +3 -3
- package/src/adapters/generic-sql/uow-encoder.test.ts +4 -2
- package/src/adapters/generic-sql/uow-encoder.ts +14 -18
- package/src/adapters/in-memory/condition-evaluator.test.ts +2 -1
- package/src/adapters/in-memory/condition-evaluator.ts +9 -4
- package/src/adapters/in-memory/in-memory-adapter.ts +155 -44
- package/src/adapters/in-memory/in-memory-uow.mutations.test.ts +50 -2
- package/src/adapters/in-memory/in-memory-uow.retrieval.test.ts +158 -3
- package/src/adapters/in-memory/in-memory-uow.ts +402 -26
- package/src/adapters/in-memory/options.test.ts +1 -0
- package/src/adapters/in-memory/options.ts +5 -1
- package/src/adapters/in-memory/outbox.test.ts +361 -0
- package/src/adapters/in-memory/reference-resolution.test.ts +3 -2
- package/src/adapters/in-memory/reference-resolution.ts +2 -2
- package/src/adapters/in-memory/sorted-array-index.test.ts +1 -0
- package/src/adapters/in-memory/store.test.ts +1 -0
- package/src/adapters/in-memory/store.ts +3 -3
- package/src/adapters/in-memory/value-normalization.test.ts +1 -0
- package/src/adapters/prisma/prisma-adapter-sqlite3.test.ts +51 -7
- package/src/adapters/shared/from-unit-of-work-compiler.ts +156 -46
- package/src/adapters/shared/uow-operation-compiler.ts +3 -3
- package/src/browser/mod.ts +64 -0
- package/src/client.ts +19 -0
- package/src/db-fragment-definition-builder.test.ts +821 -47
- package/src/db-fragment-definition-builder.ts +857 -110
- package/src/db-fragment-instantiator.test.ts +114 -90
- package/src/db-fragment-integration.test.ts +9 -6
- package/src/dispatchers/cloudflare-do/dispatcher.ts +204 -0
- package/src/dispatchers/cloudflare-do/index.test.ts +145 -12
- package/src/dispatchers/cloudflare-do/index.ts +49 -90
- package/src/dispatchers/node/dispatcher.ts +112 -0
- package/src/dispatchers/node/index.test.ts +43 -14
- package/src/dispatchers/node/index.ts +38 -75
- package/src/durable-hooks.test.ts +80 -0
- package/src/durable-hooks.ts +67 -0
- package/src/fragments/internal-fragment.routes.test.ts +570 -0
- package/src/fragments/internal-fragment.routes.ts +297 -5
- package/src/fragments/internal-fragment.schema.ts +45 -1
- package/src/fragments/internal-fragment.test.ts +223 -251
- package/src/fragments/internal-fragment.ts +278 -154
- package/src/hooks/durable-hooks-logger.ts +126 -0
- package/src/hooks/durable-hooks-processor.pglite.test.ts +87 -0
- package/src/hooks/durable-hooks-processor.test.ts +179 -14
- package/src/hooks/durable-hooks-processor.ts +120 -14
- package/src/hooks/durable-hooks-runtime.test.ts +65 -0
- package/src/hooks/durable-hooks-runtime.ts +81 -0
- package/src/hooks/hooks.test.ts +314 -53
- package/src/hooks/hooks.ts +360 -81
- package/src/id.test.ts +34 -0
- package/src/id.ts +1 -3
- package/src/internal/adapter-registry.test.ts +93 -0
- package/src/internal/adapter-registry.ts +239 -0
- package/src/internal/outbox-state.ts +43 -0
- package/src/migration-engine/auto-from-schema.test.ts +93 -0
- package/src/migration-engine/auto-from-schema.ts +360 -42
- package/src/migration-engine/create.test.ts +2 -1
- package/src/migration-engine/create.ts +1 -1
- package/src/migration-engine/generation-engine.test.ts +66 -9
- package/src/migration-engine/generation-engine.ts +31 -10
- package/src/migration-engine/shared.ts +13 -0
- package/src/mod.ts +45 -27
- package/src/naming/sql-naming.ts +1 -0
- package/src/outbox/outbox-builder.ts +2 -2
- package/src/outbox/outbox.test.ts +216 -45
- package/src/outbox/outbox.ts +3 -1
- package/src/query/column-defaults.ts +1 -1
- package/src/query/condition-builder.test.ts +15 -0
- package/src/query/condition-builder.ts +7 -0
- package/src/query/cursor-client.test.ts +70 -0
- package/src/query/cursor-client.ts +263 -0
- package/src/query/cursor.test.ts +3 -2
- package/src/query/cursor.ts +15 -3
- package/src/query/db-now.ts +69 -2
- package/src/query/orm/orm.ts +2 -2
- package/src/query/query-type.test.ts +2 -1
- package/src/query/serialize/create-sql-serializer.ts +3 -3
- package/src/query/serialize/dialect/mysql-serializer.ts +1 -1
- package/src/query/serialize/dialect/postgres-serializer.ts +1 -1
- package/src/query/serialize/dialect/sqlite-serializer.test.ts +39 -2
- package/src/query/serialize/dialect/sqlite-serializer.ts +18 -5
- package/src/query/simple-query-interface.ts +10 -4
- package/src/query/unit-of-work/execute-unit-of-work.test.ts +347 -9
- package/src/query/unit-of-work/execute-unit-of-work.ts +63 -20
- package/src/query/unit-of-work/retry-policy.test.ts +1 -0
- package/src/query/unit-of-work/tx-builder.test.ts +73 -1
- package/src/query/unit-of-work/unit-of-work-coordinator.test.ts +5 -4
- package/src/query/unit-of-work/unit-of-work-types.test.ts +41 -11
- package/src/query/unit-of-work/unit-of-work.test.ts +28 -2
- package/src/query/unit-of-work/unit-of-work.ts +105 -19
- package/src/query/value-decoding.test.ts +50 -2
- package/src/query/value-decoding.ts +17 -4
- package/src/query/value-encoding.test.ts +1 -0
- package/src/query/value-encoding.ts +1 -1
- package/src/schema/create.test.ts +164 -5
- package/src/schema/create.ts +222 -24
- package/src/schema/generate-id.test.ts +1 -0
- package/src/schema/serialize.test.ts +4 -3
- package/src/schema/type-conversion/create-sql-type-mapper.ts +1 -1
- package/src/schema/type-conversion/dialect/sqlite.ts +2 -2
- package/src/schema/type-conversion/type-mapping.test.ts +2 -1
- package/src/schema/validator.test.ts +4 -2
- package/src/schema/validator.ts +1 -0
- package/src/schema-output/drizzle.test.ts +72 -19
- package/src/schema-output/drizzle.ts +24 -18
- package/src/schema-output/prisma.test.ts +172 -14
- package/src/schema-output/prisma.ts +34 -14
- package/src/sql-driver/better-sqlite3.test.ts +5 -3
- package/src/sql-driver/dialects/durable-object-dialect.ts +3 -8
- package/src/sql-driver/query-executor/default-query-executor.ts +1 -1
- package/src/sql-driver/query-executor/query-executor-base.ts +1 -1
- package/src/sql-driver/query-executor/query-executor.ts +1 -1
- package/src/sql-driver/sql-driver-adapter.ts +2 -2
- package/src/sql-driver/sql.ts +2 -1
- package/src/sql-driver/sqlocal.test.ts +4 -2
- package/src/sync/commands.test.ts +39 -0
- package/src/sync/commands.ts +51 -0
- package/src/sync/conflict-checker.test.ts +450 -0
- package/src/sync/conflict-checker.ts +248 -0
- package/src/sync/index.ts +14 -0
- package/src/sync/plan.ts +9 -0
- package/src/sync/read-tracking.test.ts +177 -0
- package/src/sync/read-tracking.ts +287 -0
- package/src/sync/submit.test.ts +205 -0
- package/src/sync/submit.ts +328 -0
- package/src/sync/types.ts +80 -0
- package/src/util/default-database-adapter.ts +15 -2
- package/src/with-database.ts +20 -50
- package/tsconfig.json +1 -1
- package/tsdown.config.ts +38 -26
- package/vitest.config.ts +1 -0
- package/dist/hooks/durable-hooks-processor.d.ts.map +0 -1
- package/dist/node_modules/.pnpm/rou3@0.7.12/node_modules/rou3/dist/index.js +0 -168
- package/dist/node_modules/.pnpm/rou3@0.7.12/node_modules/rou3/dist/index.js.map +0 -1
- package/dist/packages/fragno/dist/api/bind-services.js +0 -20
- package/dist/packages/fragno/dist/api/bind-services.js.map +0 -1
- package/dist/packages/fragno/dist/api/error.js +0 -48
- package/dist/packages/fragno/dist/api/error.js.map +0 -1
- package/dist/packages/fragno/dist/api/fragment-definition-builder.js +0 -321
- package/dist/packages/fragno/dist/api/fragment-definition-builder.js.map +0 -1
- package/dist/packages/fragno/dist/api/fragment-instantiator.js +0 -669
- package/dist/packages/fragno/dist/api/fragment-instantiator.js.map +0 -1
- package/dist/packages/fragno/dist/api/fragno-response.js +0 -73
- package/dist/packages/fragno/dist/api/fragno-response.js.map +0 -1
- package/dist/packages/fragno/dist/api/internal/response-stream.js +0 -81
- package/dist/packages/fragno/dist/api/internal/response-stream.js.map +0 -1
- package/dist/packages/fragno/dist/api/internal/route.js +0 -10
- package/dist/packages/fragno/dist/api/internal/route.js.map +0 -1
- package/dist/packages/fragno/dist/api/mutable-request-state.js +0 -97
- package/dist/packages/fragno/dist/api/mutable-request-state.js.map +0 -1
- package/dist/packages/fragno/dist/api/request-context-storage.js +0 -43
- package/dist/packages/fragno/dist/api/request-context-storage.js.map +0 -1
- package/dist/packages/fragno/dist/api/request-input-context.js +0 -185
- package/dist/packages/fragno/dist/api/request-input-context.js.map +0 -1
- package/dist/packages/fragno/dist/api/request-middleware.js +0 -83
- package/dist/packages/fragno/dist/api/request-middleware.js.map +0 -1
- package/dist/packages/fragno/dist/api/request-output-context.js +0 -119
- package/dist/packages/fragno/dist/api/request-output-context.js.map +0 -1
- package/dist/packages/fragno/dist/api/route.js +0 -30
- package/dist/packages/fragno/dist/api/route.js.map +0 -1
- package/dist/packages/fragno/dist/internal/symbols.js +0 -10
- package/dist/packages/fragno/dist/internal/symbols.js.map +0 -1
- package/dist/packages/fragno/dist/internal/trace-context.js +0 -12
- package/dist/packages/fragno/dist/internal/trace-context.js.map +0 -1
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { SQLGenerator } from "../sql-generator.js";
|
|
2
|
+
import { createHash } from "node:crypto";
|
|
2
3
|
import { sql } from "kysely";
|
|
3
4
|
|
|
4
5
|
//#region src/adapters/generic-sql/migration/dialect/sqlite.ts
|
|
@@ -7,6 +8,75 @@ const errors = {
|
|
|
7
8
|
SQLiteUpdateColumn: "SQLite doesn't support updating columns. Recreate the table instead.",
|
|
8
9
|
SQLiteUpdateForeignKeys: "SQLite doesn't support modifying foreign keys directly. Use `recreate-table` instead."
|
|
9
10
|
};
|
|
11
|
+
function normalizeCopyColumns(copyColumns) {
|
|
12
|
+
return copyColumns.map((column) => typeof column === "string" ? {
|
|
13
|
+
from: column,
|
|
14
|
+
to: column
|
|
15
|
+
} : {
|
|
16
|
+
from: column.from,
|
|
17
|
+
to: column.to
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
function applyRenameDropToColumns(columns, operations) {
|
|
21
|
+
let next = columns.map((column) => ({ ...column }));
|
|
22
|
+
for (const op of operations) if (op.type === "rename-column") {
|
|
23
|
+
const column = next.find((col) => col.name === op.from);
|
|
24
|
+
if (column) column.name = op.to;
|
|
25
|
+
} else if (op.type === "drop-column") next = next.filter((column) => column.name !== op.name);
|
|
26
|
+
return next;
|
|
27
|
+
}
|
|
28
|
+
function applyRenameDropToCopyColumns(copyColumns, operations) {
|
|
29
|
+
let next = copyColumns.map((column) => ({ ...column }));
|
|
30
|
+
for (const op of operations) if (op.type === "rename-column") {
|
|
31
|
+
for (const mapping of next) if (mapping.to === op.from) mapping.to = op.to;
|
|
32
|
+
} else if (op.type === "drop-column") next = next.filter((mapping) => mapping.to !== op.name);
|
|
33
|
+
return next;
|
|
34
|
+
}
|
|
35
|
+
function applyRenameDropToIndexes(indexes, operations) {
|
|
36
|
+
const next = [];
|
|
37
|
+
for (const index of indexes) {
|
|
38
|
+
let columns = [...index.columns];
|
|
39
|
+
let dropped = false;
|
|
40
|
+
for (const op of operations) if (op.type === "rename-column") columns = columns.map((column) => column === op.from ? op.to : column);
|
|
41
|
+
else if (columns.includes(op.name)) {
|
|
42
|
+
dropped = true;
|
|
43
|
+
break;
|
|
44
|
+
}
|
|
45
|
+
if (!dropped) next.push({
|
|
46
|
+
...index,
|
|
47
|
+
columns
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
return next;
|
|
51
|
+
}
|
|
52
|
+
function applyRenameDropToForeignKeys(foreignKeys, operations) {
|
|
53
|
+
const next = [];
|
|
54
|
+
for (const foreignKey of foreignKeys) {
|
|
55
|
+
let columns = [...foreignKey.columns];
|
|
56
|
+
let dropped = false;
|
|
57
|
+
for (const op of operations) if (op.type === "rename-column") columns = columns.map((column) => column === op.from ? op.to : column);
|
|
58
|
+
else if (columns.includes(op.name)) {
|
|
59
|
+
dropped = true;
|
|
60
|
+
break;
|
|
61
|
+
}
|
|
62
|
+
if (!dropped) next.push({
|
|
63
|
+
...foreignKey,
|
|
64
|
+
columns
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
return next;
|
|
68
|
+
}
|
|
69
|
+
function mergeRenameDropIntoRecreate(recreate, operations) {
|
|
70
|
+
const renameDropOps = operations.filter((op) => op.type === "rename-column" || op.type === "drop-column");
|
|
71
|
+
if (renameDropOps.length === 0) return recreate;
|
|
72
|
+
return {
|
|
73
|
+
...recreate,
|
|
74
|
+
columns: applyRenameDropToColumns(recreate.columns, renameDropOps),
|
|
75
|
+
copyColumns: applyRenameDropToCopyColumns(normalizeCopyColumns(recreate.copyColumns), renameDropOps),
|
|
76
|
+
indexes: applyRenameDropToIndexes(recreate.indexes, renameDropOps),
|
|
77
|
+
foreignKeys: applyRenameDropToForeignKeys(recreate.foreignKeys, renameDropOps)
|
|
78
|
+
};
|
|
79
|
+
}
|
|
10
80
|
/**
|
|
11
81
|
* SQLite-specific SQL generator.
|
|
12
82
|
* Handles SQLite's limitations around foreign keys and column updates.
|
|
@@ -22,20 +92,70 @@ var SQLiteSQLGenerator = class extends SQLGenerator {
|
|
|
22
92
|
if (operations.length === 0) return operations;
|
|
23
93
|
const result = [];
|
|
24
94
|
const createTableIndices = /* @__PURE__ */ new Map();
|
|
95
|
+
const alterTableIndices = /* @__PURE__ */ new Map();
|
|
25
96
|
const foreignKeysByTable = /* @__PURE__ */ new Map();
|
|
26
97
|
for (const op of operations) if (op.type === "create-table") {
|
|
27
98
|
createTableIndices.set(op.name, result.length);
|
|
28
99
|
result.push(op);
|
|
100
|
+
} else if (op.type === "alter-table") {
|
|
101
|
+
const index = result.length;
|
|
102
|
+
result.push(op);
|
|
103
|
+
const existing = alterTableIndices.get(op.name);
|
|
104
|
+
if (existing) existing.push(index);
|
|
105
|
+
else alterTableIndices.set(op.name, [index]);
|
|
29
106
|
} else if (op.type === "add-foreign-key") {
|
|
30
107
|
if (!foreignKeysByTable.has(op.table)) foreignKeysByTable.set(op.table, []);
|
|
31
108
|
foreignKeysByTable.get(op.table).push(op);
|
|
32
109
|
} else result.push(op);
|
|
110
|
+
const extractCreateColumn = (tableName, columnName) => {
|
|
111
|
+
const indices = alterTableIndices.get(tableName);
|
|
112
|
+
if (!indices) return;
|
|
113
|
+
for (const index of indices) {
|
|
114
|
+
const operation = result[index];
|
|
115
|
+
if (!operation || operation.type !== "alter-table") continue;
|
|
116
|
+
let extracted;
|
|
117
|
+
const nextValue = operation.value.filter((columnOp) => {
|
|
118
|
+
if (columnOp.type === "create-column" && columnOp.value.name === columnName) {
|
|
119
|
+
extracted = columnOp.value;
|
|
120
|
+
return false;
|
|
121
|
+
}
|
|
122
|
+
return true;
|
|
123
|
+
});
|
|
124
|
+
if (extracted) {
|
|
125
|
+
result[index] = {
|
|
126
|
+
...operation,
|
|
127
|
+
value: nextValue
|
|
128
|
+
};
|
|
129
|
+
return extracted;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
};
|
|
33
133
|
for (const [tableName, fkOps] of foreignKeysByTable.entries()) {
|
|
34
134
|
const createTableIdx = createTableIndices.get(tableName);
|
|
35
135
|
if (createTableIdx !== void 0) {
|
|
36
|
-
|
|
136
|
+
let createOp = result[createTableIdx];
|
|
37
137
|
if (createOp.type === "create-table") {
|
|
38
|
-
const
|
|
138
|
+
const columnNames = new Set(createOp.columns.map((column) => column.name));
|
|
139
|
+
const missingColumns = /* @__PURE__ */ new Set();
|
|
140
|
+
for (const fkOp of fkOps) for (const columnName of fkOp.value.columns) if (!columnNames.has(columnName)) missingColumns.add(columnName);
|
|
141
|
+
if (missingColumns.size > 0) for (const columnName of Array.from(missingColumns)) {
|
|
142
|
+
const column = extractCreateColumn(tableName, columnName);
|
|
143
|
+
if (column) {
|
|
144
|
+
createOp = {
|
|
145
|
+
...createOp,
|
|
146
|
+
columns: [...createOp.columns, column]
|
|
147
|
+
};
|
|
148
|
+
result[createTableIdx] = createOp;
|
|
149
|
+
columnNames.add(columnName);
|
|
150
|
+
missingColumns.delete(columnName);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
if (missingColumns.size > 0) throw new Error(`SQLite FK preprocessing failed for "${tableName}": missing column(s) ${Array.from(missingColumns).join(", ")} required by foreign keys.`);
|
|
154
|
+
const existingInline = createOp.metadata?.inlineForeignKeys;
|
|
155
|
+
const metadata = {
|
|
156
|
+
...createOp.metadata,
|
|
157
|
+
inlineForeignKeys: [...existingInline ?? [], ...fkOps.map((fkOp) => fkOp.value)]
|
|
158
|
+
};
|
|
39
159
|
result[createTableIdx] = {
|
|
40
160
|
...createOp,
|
|
41
161
|
metadata
|
|
@@ -46,7 +166,10 @@ var SQLiteSQLGenerator = class extends SQLGenerator {
|
|
|
46
166
|
return [{
|
|
47
167
|
type: "custom",
|
|
48
168
|
sql: "PRAGMA defer_foreign_keys = ON"
|
|
49
|
-
}, ...result
|
|
169
|
+
}, ...result.filter((op) => {
|
|
170
|
+
if (op.type !== "alter-table") return true;
|
|
171
|
+
return op.value.length > 0;
|
|
172
|
+
})];
|
|
50
173
|
}
|
|
51
174
|
applyAutoIncrement(builder) {
|
|
52
175
|
return builder.autoIncrement();
|
|
@@ -66,19 +189,8 @@ var SQLiteSQLGenerator = class extends SQLGenerator {
|
|
|
66
189
|
*/
|
|
67
190
|
compileCreateTable(operation, resolver) {
|
|
68
191
|
const tableName = this.getTableName(operation.name, resolver);
|
|
69
|
-
let builder = this.getSchemaBuilder(resolver).createTable(tableName);
|
|
70
|
-
for (const col of operation.columns) {
|
|
71
|
-
const columnName = this.getColumnName(col.name, operation.name, resolver);
|
|
72
|
-
builder = builder.addColumn(columnName, sql.raw(this.getDBType(col)), (b) => this.buildColumn(col, b));
|
|
73
|
-
}
|
|
74
192
|
const metadata = operation.metadata;
|
|
75
|
-
|
|
76
|
-
const compiled = builder.compile();
|
|
77
|
-
const sqlText = compiled.sql.replace(/\bconstraint\s+"[^"]+"\s+foreign key\b/gi, "foreign key");
|
|
78
|
-
return {
|
|
79
|
-
...compiled,
|
|
80
|
-
sql: sqlText
|
|
81
|
-
};
|
|
193
|
+
return this.compileCreateTableForName(tableName, operation.name, operation.columns, metadata, resolver);
|
|
82
194
|
}
|
|
83
195
|
/**
|
|
84
196
|
* SQLite doesn't support adding foreign keys to existing tables.
|
|
@@ -93,13 +205,67 @@ var SQLiteSQLGenerator = class extends SQLGenerator {
|
|
|
93
205
|
throw new Error(errors.SQLiteUpdateForeignKeys);
|
|
94
206
|
}
|
|
95
207
|
/**
|
|
96
|
-
* SQLite doesn't support updating columns.
|
|
208
|
+
* SQLite doesn't support updating columns directly. Use table recreation when metadata is provided.
|
|
97
209
|
*/
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
210
|
+
compileAlterTable(operation, resolver) {
|
|
211
|
+
if (!operation.value.some((columnOp) => columnOp.type === "update-column")) return super.compileAlterTable(operation, resolver);
|
|
212
|
+
for (const columnOp of operation.value) {
|
|
213
|
+
if (columnOp.type !== "update-column") continue;
|
|
214
|
+
const col = columnOp.value;
|
|
215
|
+
if (col.role === "external-id" || col.role === "internal-id") throw new Error(errors.IdColumnUpdate);
|
|
216
|
+
}
|
|
217
|
+
const recreate = operation.metadata?.recreateTable;
|
|
218
|
+
if (!recreate) throw new Error(errors.SQLiteUpdateColumn);
|
|
219
|
+
const mergedRecreate = mergeRenameDropIntoRecreate(recreate, operation.value);
|
|
220
|
+
return this.compileRecreateTable(operation.name, mergedRecreate, resolver);
|
|
221
|
+
}
|
|
222
|
+
compileUpdateColumn(_tableName, _logicalTableName, _operation, _resolver) {
|
|
101
223
|
throw new Error(errors.SQLiteUpdateColumn);
|
|
102
224
|
}
|
|
225
|
+
compileRecreateTable(logicalTableName, recreate, resolver) {
|
|
226
|
+
const queries = [];
|
|
227
|
+
const tableName = this.getTableName(logicalTableName, resolver);
|
|
228
|
+
const tempTableName = `${tableName}__fragno_tmp_${createHash("md5").update(tableName).digest("hex").slice(0, 6)}`;
|
|
229
|
+
queries.push(this.compileRaw(sql.raw("PRAGMA foreign_keys = OFF")));
|
|
230
|
+
queries.push(this.compileCreateTableForName(tempTableName, logicalTableName, recreate.columns, { inlineForeignKeys: recreate.foreignKeys }, resolver));
|
|
231
|
+
const copyColumns = normalizeCopyColumns(recreate.copyColumns);
|
|
232
|
+
if (copyColumns.length > 0) {
|
|
233
|
+
const targetRefs = copyColumns.map((column) => sql.ref(this.getColumnName(column.to, logicalTableName, resolver)));
|
|
234
|
+
const sourceRefs = copyColumns.map((column) => sql.ref(this.getColumnName(column.from, logicalTableName, resolver)));
|
|
235
|
+
const targetList = sql.join(targetRefs);
|
|
236
|
+
const sourceList = sql.join(sourceRefs);
|
|
237
|
+
queries.push(sql`insert into ${sql.ref(tempTableName)} (${targetList}) select ${sourceList} from ${sql.ref(tableName)}`.compile(this.db));
|
|
238
|
+
}
|
|
239
|
+
queries.push(this.getSchemaBuilder(resolver).dropTable(tableName).compile());
|
|
240
|
+
queries.push(this.getSchemaBuilder(resolver).alterTable(tempTableName).renameTo(tableName).compile());
|
|
241
|
+
for (const index of recreate.indexes) {
|
|
242
|
+
const compiled = this.compileAddIndex({
|
|
243
|
+
type: "add-index",
|
|
244
|
+
table: logicalTableName,
|
|
245
|
+
name: index.name,
|
|
246
|
+
columns: index.columns,
|
|
247
|
+
unique: index.unique
|
|
248
|
+
}, resolver);
|
|
249
|
+
if (Array.isArray(compiled)) queries.push(...compiled);
|
|
250
|
+
else queries.push(compiled);
|
|
251
|
+
}
|
|
252
|
+
queries.push(this.compileRaw(sql.raw("PRAGMA foreign_keys = ON")));
|
|
253
|
+
return queries;
|
|
254
|
+
}
|
|
255
|
+
compileCreateTableForName(physicalTableName, logicalTableName, columns, metadata, resolver) {
|
|
256
|
+
let builder = this.getSchemaBuilder(resolver).createTable(physicalTableName);
|
|
257
|
+
for (const col of columns) {
|
|
258
|
+
const columnName = this.getColumnName(col.name, logicalTableName, resolver);
|
|
259
|
+
builder = builder.addColumn(columnName, sql.raw(this.getDBType(col)), (b) => this.buildColumn(col, b));
|
|
260
|
+
}
|
|
261
|
+
if (metadata?.inlineForeignKeys) for (const fk of metadata.inlineForeignKeys) builder = builder.addForeignKeyConstraint(this.getForeignKeyName(fk.name, logicalTableName, fk.referencedTable, resolver), fk.columns.map((columnName) => this.getColumnName(columnName, logicalTableName, resolver)), this.getTableName(fk.referencedTable, resolver), fk.referencedColumns.map((columnName) => this.getColumnName(columnName, fk.referencedTable, resolver)), (cb) => cb.onUpdate("restrict").onDelete("restrict"));
|
|
262
|
+
const compiled = builder.compile();
|
|
263
|
+
const sqlText = compiled.sql.replace(/\bconstraint\s+"[^"]+"\s+foreign key\b/gi, "foreign key");
|
|
264
|
+
return {
|
|
265
|
+
...compiled,
|
|
266
|
+
sql: sqlText
|
|
267
|
+
};
|
|
268
|
+
}
|
|
103
269
|
};
|
|
104
270
|
|
|
105
271
|
//#endregion
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sqlite.js","names":["result: MigrationOperation[]","metadata: SqliteCreateTableMetadata","builder: CreateTableBuilderAny"],"sources":["../../../../../src/adapters/generic-sql/migration/dialect/sqlite.ts"],"sourcesContent":["import { type ColumnDefinitionBuilder, type CompiledQuery, type RawBuilder, sql } from \"kysely\";\nimport type {\n ColumnInfo,\n ColumnOperation,\n ForeignKeyInfo,\n MigrationOperation,\n} from \"../../../../migration-engine/shared\";\nimport type { NamingResolver } from \"../../../../naming/sql-naming\";\nimport { SQLGenerator } from \"../sql-generator\";\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype CreateTableBuilderAny = any;\n\n/**\n * Metadata attached to create-table operations for inline foreign keys.\n */\ninterface SqliteCreateTableMetadata {\n [key: string]: unknown;\n inlineForeignKeys?: ForeignKeyInfo[];\n}\n\nconst errors = {\n IdColumnUpdate:\n \"ID columns cannot be updated. Not every database supports updating primary keys and often requires workarounds.\",\n SQLiteUpdateColumn: \"SQLite doesn't support updating columns. Recreate the table instead.\",\n SQLiteUpdateForeignKeys:\n \"SQLite doesn't support modifying foreign keys directly. Use `recreate-table` instead.\",\n} as const;\n\n/**\n * SQLite-specific SQL generator.\n * Handles SQLite's limitations around foreign keys and column updates.\n */\nexport class SQLiteSQLGenerator extends SQLGenerator {\n /**\n * SQLite preprocessing: merge add-foreign-key operations into create-table operations\n * when both exist in the same batch, and add pragma for deferred foreign keys.\n *\n * SQLite requires foreign keys to be defined at table creation time.\n */\n override preprocess(operations: MigrationOperation[]): MigrationOperation[] {\n if (operations.length === 0) {\n return operations;\n }\n\n const result: MigrationOperation[] = [];\n const createTableIndices = new Map<string, number>();\n const foreignKeysByTable = new Map<\n string,\n Extract<MigrationOperation, { type: \"add-foreign-key\" }>[]\n >();\n\n // First pass: identify create-table operations and collect foreign keys\n for (const op of operations) {\n if (op.type === \"create-table\") {\n createTableIndices.set(op.name, result.length);\n result.push(op);\n } else if (op.type === \"add-foreign-key\") {\n if (!foreignKeysByTable.has(op.table)) {\n foreignKeysByTable.set(op.table, []);\n }\n foreignKeysByTable.get(op.table)!.push(op);\n } else {\n result.push(op);\n }\n }\n\n // Second pass: attach foreign keys as metadata to create-table ops\n for (const [tableName, fkOps] of foreignKeysByTable.entries()) {\n const createTableIdx = createTableIndices.get(tableName);\n\n if (createTableIdx !== undefined) {\n const createOp = result[createTableIdx];\n if (createOp.type === \"create-table\") {\n const metadata: SqliteCreateTableMetadata = {\n inlineForeignKeys: fkOps.map((fkOp) => fkOp.value),\n };\n result[createTableIdx] = {\n ...createOp,\n metadata,\n };\n }\n } else {\n // Table already exists - keep add-foreign-key operations (will throw error during compile)\n result.push(...fkOps);\n }\n }\n\n // Add pragma at the beginning for deferred foreign key checking\n return [{ type: \"custom\", sql: \"PRAGMA defer_foreign_keys = ON\" }, ...result];\n }\n\n override applyAutoIncrement(builder: ColumnDefinitionBuilder): ColumnDefinitionBuilder {\n return builder.autoIncrement();\n }\n\n override getDefaultValue(column: ColumnInfo): RawBuilder<unknown> | undefined {\n const value = column.default;\n if (!value) {\n return undefined;\n }\n\n if (\"value\" in value && value.value !== undefined) {\n return sql.lit(value.value);\n }\n\n if (\"dbSpecial\" in value && value.dbSpecial === \"now\") {\n const dbType = this.typeMapper.getDatabaseType(column);\n if (dbType === \"integer\" && (column.type === \"timestamp\" || column.type === \"date\")) {\n return sql`(cast((julianday('now') - 2440587.5)*86400000 as integer))`;\n }\n return sql`CURRENT_TIMESTAMP`;\n }\n\n // Runtime defaults are handled in application code, not SQL\n if (\"runtime\" in value) {\n return undefined;\n }\n\n return undefined;\n }\n\n /**\n * Override create-table to add inline foreign keys from metadata.\n */\n protected override compileCreateTable(\n operation: Extract<MigrationOperation, { type: \"create-table\" }>,\n resolver?: NamingResolver,\n ): CompiledQuery {\n const tableName = this.getTableName(operation.name, resolver);\n let builder: CreateTableBuilderAny = this.getSchemaBuilder(resolver).createTable(tableName);\n\n // Add columns\n for (const col of operation.columns) {\n const columnName = this.getColumnName(col.name, operation.name, resolver);\n builder = builder.addColumn(\n columnName,\n sql.raw(this.getDBType(col)),\n (b: ColumnDefinitionBuilder) => this.buildColumn(col, b),\n );\n }\n\n // Add inline foreign keys from metadata\n const metadata = operation.metadata as SqliteCreateTableMetadata | undefined;\n if (metadata?.inlineForeignKeys) {\n for (const fk of metadata.inlineForeignKeys) {\n builder = builder.addForeignKeyConstraint(\n this.getForeignKeyName(fk.name, operation.name, fk.referencedTable, resolver),\n fk.columns.map((columnName) => this.getColumnName(columnName, operation.name, resolver)),\n this.getTableName(fk.referencedTable, resolver),\n fk.referencedColumns.map((columnName) =>\n this.getColumnName(columnName, fk.referencedTable, resolver),\n ),\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (cb: any) => cb.onUpdate(\"restrict\").onDelete(\"restrict\"),\n );\n }\n }\n\n const compiled = builder.compile();\n // SQLite constraint names are ignored by Drizzle migrations; strip them for parity.\n const sqlText = compiled.sql.replace(/\\bconstraint\\s+\"[^\"]+\"\\s+foreign key\\b/gi, \"foreign key\");\n return {\n ...compiled,\n sql: sqlText,\n };\n }\n\n /**\n * SQLite doesn't support adding foreign keys to existing tables.\n */\n protected override compileAddForeignKey(\n _operation: Extract<MigrationOperation, { type: \"add-foreign-key\" }>,\n _resolver?: NamingResolver,\n ): CompiledQuery {\n throw new Error(errors.SQLiteUpdateForeignKeys);\n }\n\n /**\n * SQLite doesn't support dropping foreign keys.\n */\n protected override compileDropForeignKey(\n _operation: Extract<MigrationOperation, { type: \"drop-foreign-key\" }>,\n _resolver?: NamingResolver,\n ): CompiledQuery {\n throw new Error(errors.SQLiteUpdateForeignKeys);\n }\n\n /**\n * SQLite doesn't support updating columns.\n */\n protected override compileUpdateColumn(\n _tableName: string,\n _logicalTableName: string,\n operation: Extract<ColumnOperation, { type: \"update-column\" }>,\n _resolver?: NamingResolver,\n ): CompiledQuery | CompiledQuery[] {\n const col = operation.value;\n if (col.role === \"external-id\" || col.role === \"internal-id\") {\n throw new Error(errors.IdColumnUpdate);\n }\n throw new Error(errors.SQLiteUpdateColumn);\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"sqlite.js","names":["next: SqliteRecreateIndex[]","next: SqliteRecreateForeignKey[]","result: MigrationOperation[]","extracted: ColumnInfo | undefined","metadata: SqliteCreateTableMetadata","queries: CompiledQuery[]","builder: CreateTableBuilderAny"],"sources":["../../../../../src/adapters/generic-sql/migration/dialect/sqlite.ts"],"sourcesContent":["import { createHash } from \"node:crypto\";\n\nimport { type ColumnDefinitionBuilder, type CompiledQuery, type RawBuilder, sql } from \"kysely\";\n\nimport type {\n ColumnInfo,\n ColumnOperation,\n MigrationOperation,\n SqliteAlterTableMetadata,\n SqliteCopyColumn,\n SqliteCreateTableMetadata,\n} from \"../../../../migration-engine/shared\";\nimport type { NamingResolver } from \"../../../../naming/sql-naming\";\nimport { SQLGenerator } from \"../sql-generator\";\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype CreateTableBuilderAny = any;\n\nconst errors = {\n IdColumnUpdate:\n \"ID columns cannot be updated. Not every database supports updating primary keys and often requires workarounds.\",\n SQLiteUpdateColumn: \"SQLite doesn't support updating columns. Recreate the table instead.\",\n SQLiteUpdateForeignKeys:\n \"SQLite doesn't support modifying foreign keys directly. Use `recreate-table` instead.\",\n} as const;\n\ntype RenameOrDropColumnOperation = Extract<\n ColumnOperation,\n { type: \"rename-column\" } | { type: \"drop-column\" }\n>;\n\ntype CopyColumnMapping = { from: string; to: string };\ntype SqliteRecreateTable = NonNullable<SqliteAlterTableMetadata[\"recreateTable\"]>;\ntype SqliteRecreateIndex = SqliteRecreateTable[\"indexes\"][number];\ntype SqliteRecreateForeignKey = SqliteRecreateTable[\"foreignKeys\"][number];\n\nfunction normalizeCopyColumns(copyColumns: SqliteCopyColumn[]): CopyColumnMapping[] {\n return copyColumns.map((column) =>\n typeof column === \"string\"\n ? { from: column, to: column }\n : { from: column.from, to: column.to },\n );\n}\n\nfunction applyRenameDropToColumns(\n columns: ColumnInfo[],\n operations: RenameOrDropColumnOperation[],\n): ColumnInfo[] {\n let next = columns.map((column) => ({ ...column }));\n\n for (const op of operations) {\n if (op.type === \"rename-column\") {\n const column = next.find((col) => col.name === op.from);\n if (column) {\n column.name = op.to;\n }\n } else if (op.type === \"drop-column\") {\n next = next.filter((column) => column.name !== op.name);\n }\n }\n\n return next;\n}\n\nfunction applyRenameDropToCopyColumns(\n copyColumns: CopyColumnMapping[],\n operations: RenameOrDropColumnOperation[],\n): CopyColumnMapping[] {\n let next = copyColumns.map((column) => ({ ...column }));\n\n for (const op of operations) {\n if (op.type === \"rename-column\") {\n for (const mapping of next) {\n if (mapping.to === op.from) {\n mapping.to = op.to;\n }\n }\n } else if (op.type === \"drop-column\") {\n next = next.filter((mapping) => mapping.to !== op.name);\n }\n }\n\n return next;\n}\n\nfunction applyRenameDropToIndexes(\n indexes: SqliteRecreateIndex[],\n operations: RenameOrDropColumnOperation[],\n): SqliteRecreateIndex[] {\n const next: SqliteRecreateIndex[] = [];\n\n for (const index of indexes) {\n let columns = [...index.columns];\n let dropped = false;\n\n for (const op of operations) {\n if (op.type === \"rename-column\") {\n columns = columns.map((column) => (column === op.from ? op.to : column));\n } else if (columns.includes(op.name)) {\n dropped = true;\n break;\n }\n }\n\n if (!dropped) {\n next.push({ ...index, columns });\n }\n }\n\n return next;\n}\n\nfunction applyRenameDropToForeignKeys(\n foreignKeys: SqliteRecreateForeignKey[],\n operations: RenameOrDropColumnOperation[],\n): SqliteRecreateForeignKey[] {\n const next: SqliteRecreateForeignKey[] = [];\n\n for (const foreignKey of foreignKeys) {\n let columns = [...foreignKey.columns];\n let dropped = false;\n\n for (const op of operations) {\n if (op.type === \"rename-column\") {\n columns = columns.map((column) => (column === op.from ? op.to : column));\n } else if (columns.includes(op.name)) {\n dropped = true;\n break;\n }\n }\n\n if (!dropped) {\n next.push({\n ...foreignKey,\n columns,\n });\n }\n }\n\n return next;\n}\n\nfunction mergeRenameDropIntoRecreate(\n recreate: SqliteRecreateTable,\n operations: ColumnOperation[],\n): SqliteRecreateTable {\n const renameDropOps = operations.filter(\n (op): op is RenameOrDropColumnOperation =>\n op.type === \"rename-column\" || op.type === \"drop-column\",\n );\n\n if (renameDropOps.length === 0) {\n return recreate;\n }\n\n return {\n ...recreate,\n columns: applyRenameDropToColumns(recreate.columns, renameDropOps),\n copyColumns: applyRenameDropToCopyColumns(\n normalizeCopyColumns(recreate.copyColumns),\n renameDropOps,\n ),\n indexes: applyRenameDropToIndexes(recreate.indexes, renameDropOps),\n foreignKeys: applyRenameDropToForeignKeys(recreate.foreignKeys, renameDropOps),\n };\n}\n\n/**\n * SQLite-specific SQL generator.\n * Handles SQLite's limitations around foreign keys and column updates.\n */\nexport class SQLiteSQLGenerator extends SQLGenerator {\n /**\n * SQLite preprocessing: merge add-foreign-key operations into create-table operations\n * when both exist in the same batch, and add pragma for deferred foreign keys.\n *\n * SQLite requires foreign keys to be defined at table creation time.\n */\n override preprocess(operations: MigrationOperation[]): MigrationOperation[] {\n if (operations.length === 0) {\n return operations;\n }\n\n const result: MigrationOperation[] = [];\n const createTableIndices = new Map<string, number>();\n const alterTableIndices = new Map<string, number[]>();\n const foreignKeysByTable = new Map<\n string,\n Extract<MigrationOperation, { type: \"add-foreign-key\" }>[]\n >();\n\n // First pass: identify create-table operations and collect foreign keys\n for (const op of operations) {\n if (op.type === \"create-table\") {\n createTableIndices.set(op.name, result.length);\n result.push(op);\n } else if (op.type === \"alter-table\") {\n const index = result.length;\n result.push(op);\n const existing = alterTableIndices.get(op.name);\n if (existing) {\n existing.push(index);\n } else {\n alterTableIndices.set(op.name, [index]);\n }\n } else if (op.type === \"add-foreign-key\") {\n if (!foreignKeysByTable.has(op.table)) {\n foreignKeysByTable.set(op.table, []);\n }\n foreignKeysByTable.get(op.table)!.push(op);\n } else {\n result.push(op);\n }\n }\n\n const extractCreateColumn = (tableName: string, columnName: string): ColumnInfo | undefined => {\n const indices = alterTableIndices.get(tableName);\n if (!indices) {\n return undefined;\n }\n\n for (const index of indices) {\n const operation = result[index];\n if (!operation || operation.type !== \"alter-table\") {\n continue;\n }\n\n let extracted: ColumnInfo | undefined;\n const nextValue = operation.value.filter((columnOp) => {\n if (columnOp.type === \"create-column\" && columnOp.value.name === columnName) {\n extracted = columnOp.value;\n return false;\n }\n return true;\n });\n\n if (extracted) {\n result[index] = { ...operation, value: nextValue };\n return extracted;\n }\n }\n\n return undefined;\n };\n\n // Second pass: attach foreign keys as metadata to create-table ops\n for (const [tableName, fkOps] of foreignKeysByTable.entries()) {\n const createTableIdx = createTableIndices.get(tableName);\n\n if (createTableIdx !== undefined) {\n let createOp = result[createTableIdx];\n if (createOp.type === \"create-table\") {\n const columnNames = new Set(createOp.columns.map((column) => column.name));\n const missingColumns = new Set<string>();\n\n for (const fkOp of fkOps) {\n for (const columnName of fkOp.value.columns) {\n if (!columnNames.has(columnName)) {\n missingColumns.add(columnName);\n }\n }\n }\n\n if (missingColumns.size > 0) {\n for (const columnName of Array.from(missingColumns)) {\n const column = extractCreateColumn(tableName, columnName);\n if (column) {\n createOp = { ...createOp, columns: [...createOp.columns, column] };\n result[createTableIdx] = createOp;\n columnNames.add(columnName);\n missingColumns.delete(columnName);\n }\n }\n }\n\n if (missingColumns.size > 0) {\n throw new Error(\n `SQLite FK preprocessing failed for \"${tableName}\": missing column(s) ${Array.from(\n missingColumns,\n ).join(\", \")} required by foreign keys.`,\n );\n }\n\n const existingInline = (createOp.metadata as SqliteCreateTableMetadata | undefined)\n ?.inlineForeignKeys;\n const metadata: SqliteCreateTableMetadata = {\n ...createOp.metadata,\n inlineForeignKeys: [...(existingInline ?? []), ...fkOps.map((fkOp) => fkOp.value)],\n };\n result[createTableIdx] = { ...createOp, metadata };\n }\n } else {\n // Table already exists - keep add-foreign-key operations (will throw error during compile)\n result.push(...fkOps);\n }\n }\n\n // Add pragma at the beginning for deferred foreign key checking\n const pruned = result.filter((op) => {\n if (op.type !== \"alter-table\") {\n return true;\n }\n return op.value.length > 0;\n });\n return [{ type: \"custom\", sql: \"PRAGMA defer_foreign_keys = ON\" }, ...pruned];\n }\n\n override applyAutoIncrement(builder: ColumnDefinitionBuilder): ColumnDefinitionBuilder {\n return builder.autoIncrement();\n }\n\n override getDefaultValue(column: ColumnInfo): RawBuilder<unknown> | undefined {\n const value = column.default;\n if (!value) {\n return undefined;\n }\n\n if (\"value\" in value && value.value !== undefined) {\n return sql.lit(value.value);\n }\n\n if (\"dbSpecial\" in value && value.dbSpecial === \"now\") {\n const dbType = this.typeMapper.getDatabaseType(column);\n if (dbType === \"integer\" && (column.type === \"timestamp\" || column.type === \"date\")) {\n return sql`(cast((julianday('now') - 2440587.5)*86400000 as integer))`;\n }\n return sql`CURRENT_TIMESTAMP`;\n }\n\n // Runtime defaults are handled in application code, not SQL\n if (\"runtime\" in value) {\n return undefined;\n }\n\n return undefined;\n }\n\n /**\n * Override create-table to add inline foreign keys from metadata.\n */\n protected override compileCreateTable(\n operation: Extract<MigrationOperation, { type: \"create-table\" }>,\n resolver?: NamingResolver,\n ): CompiledQuery {\n const tableName = this.getTableName(operation.name, resolver);\n const metadata = operation.metadata as SqliteCreateTableMetadata | undefined;\n return this.compileCreateTableForName(\n tableName,\n operation.name,\n operation.columns,\n metadata,\n resolver,\n );\n }\n\n /**\n * SQLite doesn't support adding foreign keys to existing tables.\n */\n protected override compileAddForeignKey(\n _operation: Extract<MigrationOperation, { type: \"add-foreign-key\" }>,\n _resolver?: NamingResolver,\n ): CompiledQuery {\n throw new Error(errors.SQLiteUpdateForeignKeys);\n }\n\n /**\n * SQLite doesn't support dropping foreign keys.\n */\n protected override compileDropForeignKey(\n _operation: Extract<MigrationOperation, { type: \"drop-foreign-key\" }>,\n _resolver?: NamingResolver,\n ): CompiledQuery {\n throw new Error(errors.SQLiteUpdateForeignKeys);\n }\n\n /**\n * SQLite doesn't support updating columns directly. Use table recreation when metadata is provided.\n */\n protected override compileAlterTable(\n operation: Extract<MigrationOperation, { type: \"alter-table\" }>,\n resolver?: NamingResolver,\n ): CompiledQuery[] {\n const hasUpdateColumn = operation.value.some((columnOp) => columnOp.type === \"update-column\");\n\n if (!hasUpdateColumn) {\n return super.compileAlterTable(operation, resolver);\n }\n\n for (const columnOp of operation.value) {\n if (columnOp.type !== \"update-column\") {\n continue;\n }\n const col = columnOp.value;\n if (col.role === \"external-id\" || col.role === \"internal-id\") {\n throw new Error(errors.IdColumnUpdate);\n }\n }\n\n const metadata = operation.metadata as SqliteAlterTableMetadata | undefined;\n const recreate = metadata?.recreateTable;\n if (!recreate) {\n throw new Error(errors.SQLiteUpdateColumn);\n }\n\n const mergedRecreate = mergeRenameDropIntoRecreate(recreate, operation.value);\n return this.compileRecreateTable(operation.name, mergedRecreate, resolver);\n }\n\n protected override compileUpdateColumn(\n _tableName: string,\n _logicalTableName: string,\n _operation: Extract<ColumnOperation, { type: \"update-column\" }>,\n _resolver?: NamingResolver,\n ): CompiledQuery | CompiledQuery[] {\n throw new Error(errors.SQLiteUpdateColumn);\n }\n\n private compileRecreateTable(\n logicalTableName: string,\n recreate: NonNullable<SqliteAlterTableMetadata[\"recreateTable\"]>,\n resolver?: NamingResolver,\n ): CompiledQuery[] {\n const queries: CompiledQuery[] = [];\n const tableName = this.getTableName(logicalTableName, resolver);\n const tempTableName = `${tableName}__fragno_tmp_${createHash(\"md5\")\n .update(tableName)\n .digest(\"hex\")\n .slice(0, 6)}`;\n\n queries.push(this.compileRaw(sql.raw(\"PRAGMA foreign_keys = OFF\")));\n\n queries.push(\n this.compileCreateTableForName(\n tempTableName,\n logicalTableName,\n recreate.columns,\n {\n inlineForeignKeys: recreate.foreignKeys,\n },\n resolver,\n ),\n );\n\n const copyColumns = normalizeCopyColumns(recreate.copyColumns);\n if (copyColumns.length > 0) {\n const targetRefs = copyColumns.map((column) =>\n sql.ref(this.getColumnName(column.to, logicalTableName, resolver)),\n );\n const sourceRefs = copyColumns.map((column) =>\n sql.ref(this.getColumnName(column.from, logicalTableName, resolver)),\n );\n const targetList = sql.join(targetRefs);\n const sourceList = sql.join(sourceRefs);\n queries.push(\n sql`insert into ${sql.ref(tempTableName)} (${targetList}) select ${sourceList} from ${sql.ref(\n tableName,\n )}`.compile(this.db),\n );\n }\n\n queries.push(this.getSchemaBuilder(resolver).dropTable(tableName).compile());\n queries.push(\n this.getSchemaBuilder(resolver).alterTable(tempTableName).renameTo(tableName).compile(),\n );\n\n for (const index of recreate.indexes) {\n const compiled = this.compileAddIndex(\n {\n type: \"add-index\",\n table: logicalTableName,\n name: index.name,\n columns: index.columns,\n unique: index.unique,\n },\n resolver,\n );\n if (Array.isArray(compiled)) {\n queries.push(...compiled);\n } else {\n queries.push(compiled);\n }\n }\n\n queries.push(this.compileRaw(sql.raw(\"PRAGMA foreign_keys = ON\")));\n\n return queries;\n }\n\n private compileCreateTableForName(\n physicalTableName: string,\n logicalTableName: string,\n columns: ColumnInfo[],\n metadata: SqliteCreateTableMetadata | undefined,\n resolver?: NamingResolver,\n ): CompiledQuery {\n let builder: CreateTableBuilderAny =\n this.getSchemaBuilder(resolver).createTable(physicalTableName);\n\n for (const col of columns) {\n const columnName = this.getColumnName(col.name, logicalTableName, resolver);\n builder = builder.addColumn(\n columnName,\n sql.raw(this.getDBType(col)),\n (b: ColumnDefinitionBuilder) => this.buildColumn(col, b),\n );\n }\n\n if (metadata?.inlineForeignKeys) {\n for (const fk of metadata.inlineForeignKeys) {\n builder = builder.addForeignKeyConstraint(\n this.getForeignKeyName(fk.name, logicalTableName, fk.referencedTable, resolver),\n fk.columns.map((columnName) =>\n this.getColumnName(columnName, logicalTableName, resolver),\n ),\n this.getTableName(fk.referencedTable, resolver),\n fk.referencedColumns.map((columnName) =>\n this.getColumnName(columnName, fk.referencedTable, resolver),\n ),\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (cb: any) => cb.onUpdate(\"restrict\").onDelete(\"restrict\"),\n );\n }\n }\n\n const compiled = builder.compile();\n const sqlText = compiled.sql.replace(/\\bconstraint\\s+\"[^\"]+\"\\s+foreign key\\b/gi, \"foreign key\");\n return {\n ...compiled,\n sql: sqlText,\n };\n }\n}\n"],"mappings":";;;;;AAkBA,MAAM,SAAS;CACb,gBACE;CACF,oBAAoB;CACpB,yBACE;CACH;AAYD,SAAS,qBAAqB,aAAsD;AAClF,QAAO,YAAY,KAAK,WACtB,OAAO,WAAW,WACd;EAAE,MAAM;EAAQ,IAAI;EAAQ,GAC5B;EAAE,MAAM,OAAO;EAAM,IAAI,OAAO;EAAI,CACzC;;AAGH,SAAS,yBACP,SACA,YACc;CACd,IAAI,OAAO,QAAQ,KAAK,YAAY,EAAE,GAAG,QAAQ,EAAE;AAEnD,MAAK,MAAM,MAAM,WACf,KAAI,GAAG,SAAS,iBAAiB;EAC/B,MAAM,SAAS,KAAK,MAAM,QAAQ,IAAI,SAAS,GAAG,KAAK;AACvD,MAAI,OACF,QAAO,OAAO,GAAG;YAEV,GAAG,SAAS,cACrB,QAAO,KAAK,QAAQ,WAAW,OAAO,SAAS,GAAG,KAAK;AAI3D,QAAO;;AAGT,SAAS,6BACP,aACA,YACqB;CACrB,IAAI,OAAO,YAAY,KAAK,YAAY,EAAE,GAAG,QAAQ,EAAE;AAEvD,MAAK,MAAM,MAAM,WACf,KAAI,GAAG,SAAS,iBACd;OAAK,MAAM,WAAW,KACpB,KAAI,QAAQ,OAAO,GAAG,KACpB,SAAQ,KAAK,GAAG;YAGX,GAAG,SAAS,cACrB,QAAO,KAAK,QAAQ,YAAY,QAAQ,OAAO,GAAG,KAAK;AAI3D,QAAO;;AAGT,SAAS,yBACP,SACA,YACuB;CACvB,MAAMA,OAA8B,EAAE;AAEtC,MAAK,MAAM,SAAS,SAAS;EAC3B,IAAI,UAAU,CAAC,GAAG,MAAM,QAAQ;EAChC,IAAI,UAAU;AAEd,OAAK,MAAM,MAAM,WACf,KAAI,GAAG,SAAS,gBACd,WAAU,QAAQ,KAAK,WAAY,WAAW,GAAG,OAAO,GAAG,KAAK,OAAQ;WAC/D,QAAQ,SAAS,GAAG,KAAK,EAAE;AACpC,aAAU;AACV;;AAIJ,MAAI,CAAC,QACH,MAAK,KAAK;GAAE,GAAG;GAAO;GAAS,CAAC;;AAIpC,QAAO;;AAGT,SAAS,6BACP,aACA,YAC4B;CAC5B,MAAMC,OAAmC,EAAE;AAE3C,MAAK,MAAM,cAAc,aAAa;EACpC,IAAI,UAAU,CAAC,GAAG,WAAW,QAAQ;EACrC,IAAI,UAAU;AAEd,OAAK,MAAM,MAAM,WACf,KAAI,GAAG,SAAS,gBACd,WAAU,QAAQ,KAAK,WAAY,WAAW,GAAG,OAAO,GAAG,KAAK,OAAQ;WAC/D,QAAQ,SAAS,GAAG,KAAK,EAAE;AACpC,aAAU;AACV;;AAIJ,MAAI,CAAC,QACH,MAAK,KAAK;GACR,GAAG;GACH;GACD,CAAC;;AAIN,QAAO;;AAGT,SAAS,4BACP,UACA,YACqB;CACrB,MAAM,gBAAgB,WAAW,QAC9B,OACC,GAAG,SAAS,mBAAmB,GAAG,SAAS,cAC9C;AAED,KAAI,cAAc,WAAW,EAC3B,QAAO;AAGT,QAAO;EACL,GAAG;EACH,SAAS,yBAAyB,SAAS,SAAS,cAAc;EAClE,aAAa,6BACX,qBAAqB,SAAS,YAAY,EAC1C,cACD;EACD,SAAS,yBAAyB,SAAS,SAAS,cAAc;EAClE,aAAa,6BAA6B,SAAS,aAAa,cAAc;EAC/E;;;;;;AAOH,IAAa,qBAAb,cAAwC,aAAa;;;;;;;CAOnD,AAAS,WAAW,YAAwD;AAC1E,MAAI,WAAW,WAAW,EACxB,QAAO;EAGT,MAAMC,SAA+B,EAAE;EACvC,MAAM,qCAAqB,IAAI,KAAqB;EACpD,MAAM,oCAAoB,IAAI,KAAuB;EACrD,MAAM,qCAAqB,IAAI,KAG5B;AAGH,OAAK,MAAM,MAAM,WACf,KAAI,GAAG,SAAS,gBAAgB;AAC9B,sBAAmB,IAAI,GAAG,MAAM,OAAO,OAAO;AAC9C,UAAO,KAAK,GAAG;aACN,GAAG,SAAS,eAAe;GACpC,MAAM,QAAQ,OAAO;AACrB,UAAO,KAAK,GAAG;GACf,MAAM,WAAW,kBAAkB,IAAI,GAAG,KAAK;AAC/C,OAAI,SACF,UAAS,KAAK,MAAM;OAEpB,mBAAkB,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC;aAEhC,GAAG,SAAS,mBAAmB;AACxC,OAAI,CAAC,mBAAmB,IAAI,GAAG,MAAM,CACnC,oBAAmB,IAAI,GAAG,OAAO,EAAE,CAAC;AAEtC,sBAAmB,IAAI,GAAG,MAAM,CAAE,KAAK,GAAG;QAE1C,QAAO,KAAK,GAAG;EAInB,MAAM,uBAAuB,WAAmB,eAA+C;GAC7F,MAAM,UAAU,kBAAkB,IAAI,UAAU;AAChD,OAAI,CAAC,QACH;AAGF,QAAK,MAAM,SAAS,SAAS;IAC3B,MAAM,YAAY,OAAO;AACzB,QAAI,CAAC,aAAa,UAAU,SAAS,cACnC;IAGF,IAAIC;IACJ,MAAM,YAAY,UAAU,MAAM,QAAQ,aAAa;AACrD,SAAI,SAAS,SAAS,mBAAmB,SAAS,MAAM,SAAS,YAAY;AAC3E,kBAAY,SAAS;AACrB,aAAO;;AAET,YAAO;MACP;AAEF,QAAI,WAAW;AACb,YAAO,SAAS;MAAE,GAAG;MAAW,OAAO;MAAW;AAClD,YAAO;;;;AAQb,OAAK,MAAM,CAAC,WAAW,UAAU,mBAAmB,SAAS,EAAE;GAC7D,MAAM,iBAAiB,mBAAmB,IAAI,UAAU;AAExD,OAAI,mBAAmB,QAAW;IAChC,IAAI,WAAW,OAAO;AACtB,QAAI,SAAS,SAAS,gBAAgB;KACpC,MAAM,cAAc,IAAI,IAAI,SAAS,QAAQ,KAAK,WAAW,OAAO,KAAK,CAAC;KAC1E,MAAM,iCAAiB,IAAI,KAAa;AAExC,UAAK,MAAM,QAAQ,MACjB,MAAK,MAAM,cAAc,KAAK,MAAM,QAClC,KAAI,CAAC,YAAY,IAAI,WAAW,CAC9B,gBAAe,IAAI,WAAW;AAKpC,SAAI,eAAe,OAAO,EACxB,MAAK,MAAM,cAAc,MAAM,KAAK,eAAe,EAAE;MACnD,MAAM,SAAS,oBAAoB,WAAW,WAAW;AACzD,UAAI,QAAQ;AACV,kBAAW;QAAE,GAAG;QAAU,SAAS,CAAC,GAAG,SAAS,SAAS,OAAO;QAAE;AAClE,cAAO,kBAAkB;AACzB,mBAAY,IAAI,WAAW;AAC3B,sBAAe,OAAO,WAAW;;;AAKvC,SAAI,eAAe,OAAO,EACxB,OAAM,IAAI,MACR,uCAAuC,UAAU,uBAAuB,MAAM,KAC5E,eACD,CAAC,KAAK,KAAK,CAAC,4BACd;KAGH,MAAM,iBAAkB,SAAS,UAC7B;KACJ,MAAMC,WAAsC;MAC1C,GAAG,SAAS;MACZ,mBAAmB,CAAC,GAAI,kBAAkB,EAAE,EAAG,GAAG,MAAM,KAAK,SAAS,KAAK,MAAM,CAAC;MACnF;AACD,YAAO,kBAAkB;MAAE,GAAG;MAAU;MAAU;;SAIpD,QAAO,KAAK,GAAG,MAAM;;AAWzB,SAAO,CAAC;GAAE,MAAM;GAAU,KAAK;GAAkC,EAAE,GANpD,OAAO,QAAQ,OAAO;AACnC,OAAI,GAAG,SAAS,cACd,QAAO;AAET,UAAO,GAAG,MAAM,SAAS;IACzB,CAC2E;;CAG/E,AAAS,mBAAmB,SAA2D;AACrF,SAAO,QAAQ,eAAe;;CAGhC,AAAS,gBAAgB,QAAqD;EAC5E,MAAM,QAAQ,OAAO;AACrB,MAAI,CAAC,MACH;AAGF,MAAI,WAAW,SAAS,MAAM,UAAU,OACtC,QAAO,IAAI,IAAI,MAAM,MAAM;AAG7B,MAAI,eAAe,SAAS,MAAM,cAAc,OAAO;AAErD,OADe,KAAK,WAAW,gBAAgB,OAAO,KACvC,cAAc,OAAO,SAAS,eAAe,OAAO,SAAS,QAC1E,QAAO,GAAG;AAEZ,UAAO,GAAG;;AAIZ,MAAI,aAAa,MACf;;;;;CASJ,AAAmB,mBACjB,WACA,UACe;EACf,MAAM,YAAY,KAAK,aAAa,UAAU,MAAM,SAAS;EAC7D,MAAM,WAAW,UAAU;AAC3B,SAAO,KAAK,0BACV,WACA,UAAU,MACV,UAAU,SACV,UACA,SACD;;;;;CAMH,AAAmB,qBACjB,YACA,WACe;AACf,QAAM,IAAI,MAAM,OAAO,wBAAwB;;;;;CAMjD,AAAmB,sBACjB,YACA,WACe;AACf,QAAM,IAAI,MAAM,OAAO,wBAAwB;;;;;CAMjD,AAAmB,kBACjB,WACA,UACiB;AAGjB,MAAI,CAFoB,UAAU,MAAM,MAAM,aAAa,SAAS,SAAS,gBAAgB,CAG3F,QAAO,MAAM,kBAAkB,WAAW,SAAS;AAGrD,OAAK,MAAM,YAAY,UAAU,OAAO;AACtC,OAAI,SAAS,SAAS,gBACpB;GAEF,MAAM,MAAM,SAAS;AACrB,OAAI,IAAI,SAAS,iBAAiB,IAAI,SAAS,cAC7C,OAAM,IAAI,MAAM,OAAO,eAAe;;EAK1C,MAAM,WADW,UAAU,UACA;AAC3B,MAAI,CAAC,SACH,OAAM,IAAI,MAAM,OAAO,mBAAmB;EAG5C,MAAM,iBAAiB,4BAA4B,UAAU,UAAU,MAAM;AAC7E,SAAO,KAAK,qBAAqB,UAAU,MAAM,gBAAgB,SAAS;;CAG5E,AAAmB,oBACjB,YACA,mBACA,YACA,WACiC;AACjC,QAAM,IAAI,MAAM,OAAO,mBAAmB;;CAG5C,AAAQ,qBACN,kBACA,UACA,UACiB;EACjB,MAAMC,UAA2B,EAAE;EACnC,MAAM,YAAY,KAAK,aAAa,kBAAkB,SAAS;EAC/D,MAAM,gBAAgB,GAAG,UAAU,eAAe,WAAW,MAAM,CAChE,OAAO,UAAU,CACjB,OAAO,MAAM,CACb,MAAM,GAAG,EAAE;AAEd,UAAQ,KAAK,KAAK,WAAW,IAAI,IAAI,4BAA4B,CAAC,CAAC;AAEnE,UAAQ,KACN,KAAK,0BACH,eACA,kBACA,SAAS,SACT,EACE,mBAAmB,SAAS,aAC7B,EACD,SACD,CACF;EAED,MAAM,cAAc,qBAAqB,SAAS,YAAY;AAC9D,MAAI,YAAY,SAAS,GAAG;GAC1B,MAAM,aAAa,YAAY,KAAK,WAClC,IAAI,IAAI,KAAK,cAAc,OAAO,IAAI,kBAAkB,SAAS,CAAC,CACnE;GACD,MAAM,aAAa,YAAY,KAAK,WAClC,IAAI,IAAI,KAAK,cAAc,OAAO,MAAM,kBAAkB,SAAS,CAAC,CACrE;GACD,MAAM,aAAa,IAAI,KAAK,WAAW;GACvC,MAAM,aAAa,IAAI,KAAK,WAAW;AACvC,WAAQ,KACN,GAAG,eAAe,IAAI,IAAI,cAAc,CAAC,IAAI,WAAW,WAAW,WAAW,QAAQ,IAAI,IACxF,UACD,GAAG,QAAQ,KAAK,GAAG,CACrB;;AAGH,UAAQ,KAAK,KAAK,iBAAiB,SAAS,CAAC,UAAU,UAAU,CAAC,SAAS,CAAC;AAC5E,UAAQ,KACN,KAAK,iBAAiB,SAAS,CAAC,WAAW,cAAc,CAAC,SAAS,UAAU,CAAC,SAAS,CACxF;AAED,OAAK,MAAM,SAAS,SAAS,SAAS;GACpC,MAAM,WAAW,KAAK,gBACpB;IACE,MAAM;IACN,OAAO;IACP,MAAM,MAAM;IACZ,SAAS,MAAM;IACf,QAAQ,MAAM;IACf,EACD,SACD;AACD,OAAI,MAAM,QAAQ,SAAS,CACzB,SAAQ,KAAK,GAAG,SAAS;OAEzB,SAAQ,KAAK,SAAS;;AAI1B,UAAQ,KAAK,KAAK,WAAW,IAAI,IAAI,2BAA2B,CAAC,CAAC;AAElE,SAAO;;CAGT,AAAQ,0BACN,mBACA,kBACA,SACA,UACA,UACe;EACf,IAAIC,UACF,KAAK,iBAAiB,SAAS,CAAC,YAAY,kBAAkB;AAEhE,OAAK,MAAM,OAAO,SAAS;GACzB,MAAM,aAAa,KAAK,cAAc,IAAI,MAAM,kBAAkB,SAAS;AAC3E,aAAU,QAAQ,UAChB,YACA,IAAI,IAAI,KAAK,UAAU,IAAI,CAAC,GAC3B,MAA+B,KAAK,YAAY,KAAK,EAAE,CACzD;;AAGH,MAAI,UAAU,kBACZ,MAAK,MAAM,MAAM,SAAS,kBACxB,WAAU,QAAQ,wBAChB,KAAK,kBAAkB,GAAG,MAAM,kBAAkB,GAAG,iBAAiB,SAAS,EAC/E,GAAG,QAAQ,KAAK,eACd,KAAK,cAAc,YAAY,kBAAkB,SAAS,CAC3D,EACD,KAAK,aAAa,GAAG,iBAAiB,SAAS,EAC/C,GAAG,kBAAkB,KAAK,eACxB,KAAK,cAAc,YAAY,GAAG,iBAAiB,SAAS,CAC7D,GAEA,OAAY,GAAG,SAAS,WAAW,CAAC,SAAS,WAAW,CAC1D;EAIL,MAAM,WAAW,QAAQ,SAAS;EAClC,MAAM,UAAU,SAAS,IAAI,QAAQ,4CAA4C,cAAc;AAC/F,SAAO;GACL,GAAG;GACH,KAAK;GACN"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"executor.d.ts","names":[],"sources":["../../../../src/adapters/generic-sql/migration/executor.ts"],"sourcesContent":[],"mappings":";;;;;
|
|
1
|
+
{"version":3,"file":"executor.d.ts","names":[],"sources":["../../../../src/adapters/generic-sql/migration/executor.ts"],"sourcesContent":[],"mappings":";;;;;AAOA;;UAAiB,iBAAA;cACH"}
|
|
@@ -8,9 +8,36 @@
|
|
|
8
8
|
*/
|
|
9
9
|
async function executeMigration(driver, migration) {
|
|
10
10
|
if (migration.statements.length === 0) return;
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
11
|
+
const isForeignKeysOff = (statement) => /^\s*pragma\s+foreign_keys\s*=\s*off\s*;?\s*$/i.test(statement.sql.trim());
|
|
12
|
+
const isForeignKeysOn = (statement) => /^\s*pragma\s+foreign_keys\s*=\s*on\s*;?\s*$/i.test(statement.sql.trim());
|
|
13
|
+
const preStatements = [];
|
|
14
|
+
const postStatements = [];
|
|
15
|
+
const transactionalStatements = [];
|
|
16
|
+
for (const statement of migration.statements) {
|
|
17
|
+
if (isForeignKeysOff(statement)) {
|
|
18
|
+
preStatements.push(statement);
|
|
19
|
+
continue;
|
|
20
|
+
}
|
|
21
|
+
if (isForeignKeysOn(statement)) {
|
|
22
|
+
postStatements.push(statement);
|
|
23
|
+
continue;
|
|
24
|
+
}
|
|
25
|
+
transactionalStatements.push(statement);
|
|
26
|
+
}
|
|
27
|
+
if (preStatements.length === 0 && postStatements.length === 0) {
|
|
28
|
+
await driver.transaction(async (tx) => {
|
|
29
|
+
for (const statement of migration.statements) await tx.executeQuery(statement);
|
|
30
|
+
});
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
for (const statement of preStatements) await driver.executeQuery(statement);
|
|
34
|
+
try {
|
|
35
|
+
if (transactionalStatements.length > 0) await driver.transaction(async (tx) => {
|
|
36
|
+
for (const statement of transactionalStatements) await tx.executeQuery(statement);
|
|
37
|
+
});
|
|
38
|
+
} finally {
|
|
39
|
+
for (const statement of postStatements) await driver.executeQuery(statement);
|
|
40
|
+
}
|
|
14
41
|
}
|
|
15
42
|
|
|
16
43
|
//#endregion
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"executor.js","names":[],"sources":["../../../../src/adapters/generic-sql/migration/executor.ts"],"sourcesContent":["import type { CompiledQuery } from \"kysely\";\nimport type { SqlDriverAdapter } from \"../../../sql-driver/sql-driver-adapter\";\n\n/**\n * Compiled migration containing all SQL statements to execute.\n */\nexport interface CompiledMigration {\n statements: CompiledQuery[];\n fromVersion: number;\n toVersion: number;\n}\n\n/**\n * Execute a compiled migration using the provided driver adapter.\n * All statements are executed within a single transaction.\n *\n * @param driver - The SQL driver adapter to execute queries\n * @param migration - The compiled migration containing SQL statements\n */\nexport async function executeMigration(\n driver: SqlDriverAdapter,\n migration: CompiledMigration,\n): Promise<void> {\n if (migration.statements.length === 0) {\n return;\n }\n\n await driver.transaction(async (tx) => {\n
|
|
1
|
+
{"version":3,"file":"executor.js","names":["preStatements: CompiledQuery[]","postStatements: CompiledQuery[]","transactionalStatements: CompiledQuery[]"],"sources":["../../../../src/adapters/generic-sql/migration/executor.ts"],"sourcesContent":["import type { CompiledQuery } from \"kysely\";\n\nimport type { SqlDriverAdapter } from \"../../../sql-driver/sql-driver-adapter\";\n\n/**\n * Compiled migration containing all SQL statements to execute.\n */\nexport interface CompiledMigration {\n statements: CompiledQuery[];\n fromVersion: number;\n toVersion: number;\n}\n\n/**\n * Execute a compiled migration using the provided driver adapter.\n * All statements are executed within a single transaction.\n *\n * @param driver - The SQL driver adapter to execute queries\n * @param migration - The compiled migration containing SQL statements\n */\nexport async function executeMigration(\n driver: SqlDriverAdapter,\n migration: CompiledMigration,\n): Promise<void> {\n if (migration.statements.length === 0) {\n return;\n }\n\n const isForeignKeysOff = (statement: CompiledQuery) =>\n /^\\s*pragma\\s+foreign_keys\\s*=\\s*off\\s*;?\\s*$/i.test(statement.sql.trim());\n const isForeignKeysOn = (statement: CompiledQuery) =>\n /^\\s*pragma\\s+foreign_keys\\s*=\\s*on\\s*;?\\s*$/i.test(statement.sql.trim());\n\n const preStatements: CompiledQuery[] = [];\n const postStatements: CompiledQuery[] = [];\n const transactionalStatements: CompiledQuery[] = [];\n\n for (const statement of migration.statements) {\n if (isForeignKeysOff(statement)) {\n preStatements.push(statement);\n continue;\n }\n if (isForeignKeysOn(statement)) {\n postStatements.push(statement);\n continue;\n }\n transactionalStatements.push(statement);\n }\n\n if (preStatements.length === 0 && postStatements.length === 0) {\n await driver.transaction(async (tx) => {\n for (const statement of migration.statements) {\n await tx.executeQuery(statement);\n }\n });\n return;\n }\n\n for (const statement of preStatements) {\n await driver.executeQuery(statement);\n }\n\n try {\n if (transactionalStatements.length > 0) {\n await driver.transaction(async (tx) => {\n for (const statement of transactionalStatements) {\n await tx.executeQuery(statement);\n }\n });\n }\n } finally {\n for (const statement of postStatements) {\n await driver.executeQuery(statement);\n }\n }\n}\n"],"mappings":";;;;;;;;AAoBA,eAAsB,iBACpB,QACA,WACe;AACf,KAAI,UAAU,WAAW,WAAW,EAClC;CAGF,MAAM,oBAAoB,cACxB,gDAAgD,KAAK,UAAU,IAAI,MAAM,CAAC;CAC5E,MAAM,mBAAmB,cACvB,+CAA+C,KAAK,UAAU,IAAI,MAAM,CAAC;CAE3E,MAAMA,gBAAiC,EAAE;CACzC,MAAMC,iBAAkC,EAAE;CAC1C,MAAMC,0BAA2C,EAAE;AAEnD,MAAK,MAAM,aAAa,UAAU,YAAY;AAC5C,MAAI,iBAAiB,UAAU,EAAE;AAC/B,iBAAc,KAAK,UAAU;AAC7B;;AAEF,MAAI,gBAAgB,UAAU,EAAE;AAC9B,kBAAe,KAAK,UAAU;AAC9B;;AAEF,0BAAwB,KAAK,UAAU;;AAGzC,KAAI,cAAc,WAAW,KAAK,eAAe,WAAW,GAAG;AAC7D,QAAM,OAAO,YAAY,OAAO,OAAO;AACrC,QAAK,MAAM,aAAa,UAAU,WAChC,OAAM,GAAG,aAAa,UAAU;IAElC;AACF;;AAGF,MAAK,MAAM,aAAa,cACtB,OAAM,OAAO,aAAa,UAAU;AAGtC,KAAI;AACF,MAAI,wBAAwB,SAAS,EACnC,OAAM,OAAO,YAAY,OAAO,OAAO;AACrC,QAAK,MAAM,aAAa,wBACtB,OAAM,GAAG,aAAa,UAAU;IAElC;WAEI;AACR,OAAK,MAAM,aAAa,eACtB,OAAM,OAAO,aAAa,UAAU"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prepared-migrations.d.ts","names":[],"sources":["../../../../src/adapters/generic-sql/migration/prepared-migrations.ts"],"sourcesContent":[],"mappings":";;;;;;;;
|
|
1
|
+
{"version":3,"file":"prepared-migrations.d.ts","names":[],"sources":["../../../../src/adapters/generic-sql/migration/prepared-migrations.ts"],"sourcesContent":[],"mappings":";;;;;;;;AAwDc,UAvCG,cAAA,CAuCH;EACT;;;;EAsB0F,wBAAA,CAAA,EAAA,OAAA;;;;;;UAlD9E,kBAAA;;;;;;;;;;;;6DAY4C,iBAAiB;;;;;;;;;;4BAYlE,qEAGE,iBACT;;;;;;;;;;4DAWuD;;;;;;;;;;6DAWC,iBAAiB"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { createColdKysely } from "./cold-kysely.js";
|
|
2
1
|
import { generateMigrationFromSchema } from "../../../migration-engine/auto-from-schema.js";
|
|
2
|
+
import { createColdKysely } from "./cold-kysely.js";
|
|
3
3
|
import "./sql-generator.js";
|
|
4
|
-
import { SQLiteSQLGenerator } from "./dialect/sqlite.js";
|
|
5
|
-
import { PostgresSQLGenerator } from "./dialect/postgres.js";
|
|
6
4
|
import { MySQLSQLGenerator } from "./dialect/mysql.js";
|
|
5
|
+
import { PostgresSQLGenerator } from "./dialect/postgres.js";
|
|
6
|
+
import { SQLiteSQLGenerator } from "./dialect/sqlite.js";
|
|
7
7
|
import { executeMigration } from "./executor.js";
|
|
8
8
|
|
|
9
9
|
//#region src/adapters/generic-sql/migration/prepared-migrations.ts
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prepared-migrations.js","names":[],"sources":["../../../../src/adapters/generic-sql/migration/prepared-migrations.ts"],"sourcesContent":["import type {
|
|
1
|
+
{"version":3,"file":"prepared-migrations.js","names":[],"sources":["../../../../src/adapters/generic-sql/migration/prepared-migrations.ts"],"sourcesContent":["import type { Kysely } from \"kysely\";\n\nimport { generateMigrationFromSchema } from \"../../../migration-engine/auto-from-schema\";\nimport type { NamingResolver } from \"../../../naming/sql-naming\";\nimport type { AnySchema } from \"../../../schema/create\";\nimport type { SqlDriverAdapter } from \"../../../sql-driver/sql-driver-adapter\";\nimport type { DriverConfig, SupportedDatabase } from \"../driver-config\";\nimport type { SQLiteStorageMode } from \"../sqlite-storage\";\nimport { createColdKysely } from \"./cold-kysely\";\nimport { MySQLSQLGenerator } from \"./dialect/mysql\";\nimport { PostgresSQLGenerator } from \"./dialect/postgres\";\nimport { SQLiteSQLGenerator } from \"./dialect/sqlite\";\nimport { executeMigration, type CompiledMigration } from \"./executor\";\nimport { type SQLGenerator } from \"./sql-generator\";\n/**\n * Options for executing a migration.\n */\nexport interface ExecuteOptions {\n /**\n * Whether to automatically update the schema version in the database after migration.\n * If not specified, uses the value from PreparedMigrationsConfig.\n */\n updateVersionInMigration?: boolean;\n}\n\n/**\n * Interface for preparing and executing migrations.\n * Provides a clean separation between compilation (SQL generation) and execution.\n */\nexport interface PreparedMigrations {\n /**\n * Execute migration from one version to another.\n * This performs all three phases:\n * - Phase 1: schema → operations\n * - Phase 2: operations → SQL\n * - Phase 3: SQL → database\n *\n * @param fromVersion - Current database version (0 for new database)\n * @param toVersion - Target schema version (defaults to schema.version)\n * @param options - Optional execution options (overrides config defaults)\n */\n execute(fromVersion: number, toVersion?: number, options?: ExecuteOptions): Promise<void>;\n\n /**\n * Execute migration using a specific driver.\n * Useful for testing or when you need to use a different driver than the one provided in config.\n *\n * @param driver - SQL driver to use for execution\n * @param fromVersion - Current database version (0 for new database)\n * @param toVersion - Target schema version (defaults to schema.version)\n * @param options - Optional execution options (overrides config defaults)\n */\n executeWithDriver(\n driver: SqlDriverAdapter,\n fromVersion: number,\n toVersion?: number,\n options?: ExecuteOptions,\n ): Promise<void>;\n\n /**\n * Get the SQL for a migration from one version to another without executing it.\n * Useful for generating migration files or previewing changes.\n *\n * @param fromVersion - Current database version (0 for new database)\n * @param toVersion - Target schema version (defaults to schema.version)\n * @param options - Optional execution options (affects version update SQL)\n * @returns SQL string for the migration\n */\n getSQL(fromVersion: number, toVersion?: number, options?: ExecuteOptions): string;\n\n /**\n * Get the compiled migration for a version range.\n * Returns both the SQL statements and the version information.\n *\n * @param fromVersion - Current database version (0 for new database)\n * @param toVersion - Target schema version (defaults to schema.version)\n * @param options - Optional execution options (affects version update SQL)\n * @returns Compiled migration with statements and version info\n */\n compile(fromVersion: number, toVersion?: number, options?: ExecuteOptions): CompiledMigration;\n}\n\n/**\n * Configuration for creating a PreparedMigrations instance.\n */\nexport interface PreparedMigrationsConfig {\n schema: AnySchema;\n namespace: string;\n database: SupportedDatabase;\n driverConfig?: DriverConfig;\n sqliteStorageMode?: SQLiteStorageMode;\n resolver?: NamingResolver;\n driver?: SqlDriverAdapter;\n /**\n * Whether to automatically update the schema version in the database after migration.\n * Defaults to true. Can be overridden per execution via ExecuteOptions.\n */\n updateVersionInMigration?: boolean;\n}\n\n/**\n * Create a PreparedMigrations instance for a schema and namespace.\n */\nexport function createPreparedMigrations(config: PreparedMigrationsConfig): PreparedMigrations {\n const {\n schema,\n namespace,\n database,\n driverConfig,\n sqliteStorageMode,\n driver,\n updateVersionInMigration: defaultUpdateVersion = true,\n } = config;\n\n // Create the cold Kysely instance for SQL generation\n const coldKysely = createColdKysely(database);\n\n // Create the appropriate SQL generator for the database\n const generator = createSQLGenerator(database, coldKysely, driverConfig, sqliteStorageMode);\n\n /**\n * Internal method to compile a migration for a given version range.\n */\n function compile(\n fromVersion: number,\n toVersion: number,\n updateVersionInMigration: boolean,\n ): CompiledMigration {\n // Validate version numbers\n if (fromVersion < 0) {\n throw new Error(`fromVersion cannot be negative: ${fromVersion}`);\n }\n if (toVersion < 0) {\n throw new Error(`toVersion cannot be negative: ${toVersion}`);\n }\n if (toVersion < fromVersion) {\n throw new Error(\n `Cannot migrate backwards: fromVersion (${fromVersion}) > toVersion (${toVersion})`,\n );\n }\n if (toVersion > schema.version) {\n throw new Error(`toVersion (${toVersion}) exceeds schema version (${schema.version})`);\n }\n\n // Phase 1: Generate migration operations from schema\n const operations = generateMigrationFromSchema(schema, fromVersion, toVersion);\n\n // Phase 2: Compile operations to SQL\n const statements = generator.compile(operations, config.resolver);\n\n // Add version update SQL if requested\n if (updateVersionInMigration && toVersion !== fromVersion) {\n const versionUpdate = generator.generateVersionUpdateSQL(namespace, fromVersion, toVersion);\n statements.push(versionUpdate);\n }\n\n return {\n statements,\n fromVersion,\n toVersion,\n };\n }\n\n return {\n async execute(fromVersion, toVersion, options) {\n if (!driver) {\n throw new Error(\n \"Driver not provided. Cannot execute migration. Use `executeWithDriver` instead.\",\n );\n }\n\n return this.executeWithDriver(driver, fromVersion, toVersion, options);\n },\n\n async executeWithDriver(driverToUse, fromVersion, toVersion, options) {\n // Use option if provided, otherwise use config default\n const updateVersionInMigration = options?.updateVersionInMigration ?? defaultUpdateVersion;\n const targetVersion = toVersion ?? schema.version;\n\n // Compile the migration (this will validate the version numbers)\n const migration = compile(fromVersion, targetVersion, updateVersionInMigration);\n\n // Execute the migration\n await executeMigration(driverToUse, migration);\n },\n\n getSQL(fromVersion, toVersion, options) {\n const updateVersionInMigration = options?.updateVersionInMigration ?? defaultUpdateVersion;\n const targetVersion = toVersion ?? schema.version;\n\n const migration = compile(fromVersion, targetVersion, updateVersionInMigration);\n return migration.statements.map((stmt) => stmt.sql + \";\").join(\"\\n\\n\");\n },\n\n compile(fromVersion, toVersion, options) {\n const updateVersionInMigration = options?.updateVersionInMigration ?? defaultUpdateVersion;\n const targetVersion = toVersion ?? schema.version;\n\n return compile(fromVersion, targetVersion, updateVersionInMigration);\n },\n };\n}\n\n/**\n * Create the appropriate SQL generator for a database type.\n */\nfunction createSQLGenerator(\n database: SupportedDatabase,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n coldKysely: Kysely<any>,\n driverConfig?: DriverConfig,\n sqliteStorageMode?: SQLiteStorageMode,\n): SQLGenerator {\n switch (database) {\n case \"sqlite\":\n return new SQLiteSQLGenerator(coldKysely, database, driverConfig, sqliteStorageMode);\n case \"postgresql\":\n return new PostgresSQLGenerator(coldKysely, database, driverConfig, sqliteStorageMode);\n case \"mysql\":\n return new MySQLSQLGenerator(coldKysely, database, driverConfig, sqliteStorageMode);\n }\n}\n"],"mappings":";;;;;;;;;;;;AAuGA,SAAgB,yBAAyB,QAAsD;CAC7F,MAAM,EACJ,QACA,WACA,UACA,cACA,mBACA,QACA,0BAA0B,uBAAuB,SAC/C;CAMJ,MAAM,YAAY,mBAAmB,UAHlB,iBAAiB,SAAS,EAGc,cAAc,kBAAkB;;;;CAK3F,SAAS,QACP,aACA,WACA,0BACmB;AAEnB,MAAI,cAAc,EAChB,OAAM,IAAI,MAAM,mCAAmC,cAAc;AAEnE,MAAI,YAAY,EACd,OAAM,IAAI,MAAM,iCAAiC,YAAY;AAE/D,MAAI,YAAY,YACd,OAAM,IAAI,MACR,0CAA0C,YAAY,iBAAiB,UAAU,GAClF;AAEH,MAAI,YAAY,OAAO,QACrB,OAAM,IAAI,MAAM,cAAc,UAAU,4BAA4B,OAAO,QAAQ,GAAG;EAIxF,MAAM,aAAa,4BAA4B,QAAQ,aAAa,UAAU;EAG9E,MAAM,aAAa,UAAU,QAAQ,YAAY,OAAO,SAAS;AAGjE,MAAI,4BAA4B,cAAc,aAAa;GACzD,MAAM,gBAAgB,UAAU,yBAAyB,WAAW,aAAa,UAAU;AAC3F,cAAW,KAAK,cAAc;;AAGhC,SAAO;GACL;GACA;GACA;GACD;;AAGH,QAAO;EACL,MAAM,QAAQ,aAAa,WAAW,SAAS;AAC7C,OAAI,CAAC,OACH,OAAM,IAAI,MACR,kFACD;AAGH,UAAO,KAAK,kBAAkB,QAAQ,aAAa,WAAW,QAAQ;;EAGxE,MAAM,kBAAkB,aAAa,aAAa,WAAW,SAAS;GAEpE,MAAM,2BAA2B,SAAS,4BAA4B;AAOtE,SAAM,iBAAiB,aAHL,QAAQ,aAHJ,aAAa,OAAO,SAGY,yBAAyB,CAGjC;;EAGhD,OAAO,aAAa,WAAW,SAAS;GACtC,MAAM,2BAA2B,SAAS,4BAA4B;AAItE,UADkB,QAAQ,aAFJ,aAAa,OAAO,SAEY,yBAAyB,CAC9D,WAAW,KAAK,SAAS,KAAK,MAAM,IAAI,CAAC,KAAK,OAAO;;EAGxE,QAAQ,aAAa,WAAW,SAAS;GACvC,MAAM,2BAA2B,SAAS,4BAA4B;AAGtE,UAAO,QAAQ,aAFO,aAAa,OAAO,SAEC,yBAAyB;;EAEvE;;;;;AAMH,SAAS,mBACP,UAEA,YACA,cACA,mBACc;AACd,SAAQ,UAAR;EACE,KAAK,SACH,QAAO,IAAI,mBAAmB,YAAY,UAAU,cAAc,kBAAkB;EACtF,KAAK,aACH,QAAO,IAAI,qBAAqB,YAAY,UAAU,cAAc,kBAAkB;EACxF,KAAK,QACH,QAAO,IAAI,kBAAkB,YAAY,UAAU,cAAc,kBAAkB"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { SETTINGS_TABLE_NAME } from "../../../fragments/internal-fragment.schema.js";
|
|
2
2
|
import { createSQLTypeMapper } from "../../../schema/type-conversion/create-sql-type-mapper.js";
|
|
3
|
-
import { sql } from "kysely";
|
|
4
3
|
import { createHash } from "node:crypto";
|
|
4
|
+
import { sql } from "kysely";
|
|
5
5
|
|
|
6
6
|
//#region src/adapters/generic-sql/migration/sql-generator.ts
|
|
7
7
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sql-generator.js","names":["queries: CompiledQuery[]","builder: CreateTableBuilderAny"],"sources":["../../../../src/adapters/generic-sql/migration/sql-generator.ts"],"sourcesContent":["import {\n type ColumnDefinitionBuilder,\n type CompiledQuery,\n type CreateTableBuilder,\n type Kysely,\n type RawBuilder,\n sql,\n} from \"kysely\";\nimport { createHash } from \"node:crypto\";\nimport type {\n ColumnInfo,\n ColumnOperation,\n MigrationOperation,\n} from \"../../../migration-engine/shared\";\nimport { SETTINGS_TABLE_NAME } from \"../../../fragments/internal-fragment.schema\";\nimport type { NamingResolver } from \"../../../naming/sql-naming\";\nimport type { DriverConfig, SupportedDatabase } from \"../driver-config\";\nimport type { SQLiteStorageMode } from \"../sqlite-storage\";\nimport { createSQLTypeMapper } from \"../../../schema/type-conversion/create-sql-type-mapper\";\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype KyselyAny = Kysely<any>;\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype CreateTableBuilderAny = CreateTableBuilder<any, any>;\n\n/**\n * Interface for compiling migration operations to SQL.\n */\nexport interface CompilableQuery {\n compile(): CompiledQuery;\n}\n\n/**\n * Abstract base class for SQL generation from migration operations.\n * Each database dialect extends this class and implements the abstract methods.\n */\nexport abstract class SQLGenerator {\n protected readonly db: KyselyAny;\n protected readonly database: SupportedDatabase;\n protected readonly typeMapper: ReturnType<typeof createSQLTypeMapper>;\n protected readonly driverConfig?: DriverConfig;\n\n constructor(\n db: KyselyAny,\n database: SupportedDatabase,\n driverConfig?: DriverConfig,\n sqliteStorageMode?: SQLiteStorageMode,\n ) {\n this.db = db;\n this.database = database;\n this.typeMapper = createSQLTypeMapper(database, sqliteStorageMode);\n this.driverConfig = driverConfig;\n }\n\n /**\n * Preprocess operations before SQL generation.\n * Dialects can override to transform operations based on database capabilities.\n * For example, SQLite merges FK operations into create-table operations.\n */\n abstract preprocess(operations: MigrationOperation[]): MigrationOperation[];\n\n /**\n * Apply auto-increment to a column builder.\n * PostgreSQL uses SERIAL types so this is a no-op there.\n */\n abstract applyAutoIncrement(builder: ColumnDefinitionBuilder): ColumnDefinitionBuilder;\n\n /**\n * Get the default value for a column, or undefined if not supported.\n * MySQL returns undefined for TEXT columns since it doesn't support defaults there.\n */\n abstract getDefaultValue(column: ColumnInfo): RawBuilder<unknown> | undefined;\n\n /**\n * Generate SQL for updating the schema version in the settings table.\n * This is the same across all databases.\n */\n generateVersionUpdateSQL(\n namespace: string,\n fromVersion: number,\n toVersion: number,\n ): CompiledQuery {\n const key = `${namespace}.schema_version`;\n\n if (fromVersion === 0) {\n // Insert new version record\n const id = createHash(\"md5\").update(key).digest(\"base64url\").replace(/=/g, \"\");\n return this.db\n .insertInto(SETTINGS_TABLE_NAME)\n .values({\n id: sql.lit(id),\n key: sql.lit(key),\n value: sql.lit(toVersion.toString()),\n })\n .compile();\n } else {\n // Update existing version record\n return this.db\n .updateTable(SETTINGS_TABLE_NAME)\n .set({\n value: sql.lit(toVersion.toString()),\n })\n .where(\"key\", \"=\", sql.lit(key))\n .compile();\n }\n }\n\n /**\n * Compile migration operations to SQL statements.\n * This is the main entry point for SQL generation.\n */\n compile(operations: MigrationOperation[], resolver?: NamingResolver): CompiledQuery[] {\n const preprocessed = this.preprocess(operations);\n const queries: CompiledQuery[] = [];\n\n const schemaName = resolver?.getSchemaName();\n if (schemaName && this.database === \"postgresql\") {\n queries.push(sql`CREATE SCHEMA IF NOT EXISTS ${sql.id(schemaName)}`.compile(this.db));\n }\n\n for (const operation of preprocessed) {\n const compiled = this.compileOperation(operation, resolver);\n if (Array.isArray(compiled)) {\n queries.push(...compiled);\n } else {\n queries.push(compiled);\n }\n }\n\n return queries;\n }\n\n /**\n * Compile a single migration operation to SQL.\n */\n protected compileOperation(\n operation: MigrationOperation,\n resolver?: NamingResolver,\n ): CompiledQuery | CompiledQuery[] {\n switch (operation.type) {\n case \"create-table\":\n return this.compileCreateTable(operation, resolver);\n case \"rename-table\":\n return this.compileRenameTable(operation, resolver);\n case \"alter-table\":\n return this.compileAlterTable(operation, resolver);\n case \"drop-table\":\n return this.compileDropTable(operation, resolver);\n case \"add-foreign-key\":\n return this.compileAddForeignKey(operation, resolver);\n case \"drop-foreign-key\":\n return this.compileDropForeignKey(operation, resolver);\n case \"add-index\":\n return this.compileAddIndex(operation, resolver);\n case \"drop-index\":\n return this.compileDropIndex(operation, resolver);\n case \"custom\":\n return this.compileCustom(operation);\n }\n }\n\n /**\n * Compile a create-table operation.\n * Subclasses can override to add FK constraints inline (e.g., SQLite).\n */\n protected compileCreateTable(\n operation: Extract<MigrationOperation, { type: \"create-table\" }>,\n resolver?: NamingResolver,\n ): CompiledQuery {\n const tableName = this.getTableName(operation.name, resolver);\n let builder: CreateTableBuilderAny = this.getSchemaBuilder(resolver).createTable(tableName);\n\n for (const col of operation.columns) {\n const columnName = this.getColumnName(col.name, operation.name, resolver);\n builder = builder.addColumn(columnName, sql.raw(this.getDBType(col)), (b) =>\n this.buildColumn(col, b),\n );\n }\n\n // Allow subclasses to add inline foreign keys\n builder = this.addInlineForeignKeys(builder, operation, resolver);\n\n return builder.compile();\n }\n\n /**\n * Hook for subclasses to add inline foreign keys to create-table.\n * SQLite overrides this to add FKs at table creation time.\n */\n protected addInlineForeignKeys(\n builder: CreateTableBuilderAny,\n _operation: Extract<MigrationOperation, { type: \"create-table\" }>,\n _resolver?: NamingResolver,\n ): CreateTableBuilderAny {\n return builder;\n }\n\n /**\n * Compile a rename-table operation.\n */\n protected compileRenameTable(\n operation: Extract<MigrationOperation, { type: \"rename-table\" }>,\n resolver?: NamingResolver,\n ): CompiledQuery {\n return this.getSchemaBuilder(resolver)\n .alterTable(this.getTableName(operation.from, resolver))\n .renameTo(this.getTableName(operation.to, resolver))\n .compile();\n }\n\n /**\n * Compile an alter-table operation.\n */\n protected compileAlterTable(\n operation: Extract<MigrationOperation, { type: \"alter-table\" }>,\n resolver?: NamingResolver,\n ): CompiledQuery[] {\n const queries: CompiledQuery[] = [];\n const tableName = this.getTableName(operation.name, resolver);\n\n for (const columnOp of operation.value) {\n const compiled = this.compileColumnOperation(tableName, operation.name, columnOp, resolver);\n if (Array.isArray(compiled)) {\n queries.push(...compiled);\n } else {\n queries.push(compiled);\n }\n }\n\n return queries;\n }\n\n /**\n * Compile a column operation within an alter-table.\n * Subclasses override for database-specific handling (e.g., MySQL's modifyColumn).\n */\n protected compileColumnOperation(\n tableName: string,\n logicalTableName: string,\n operation: ColumnOperation,\n resolver?: NamingResolver,\n ): CompiledQuery | CompiledQuery[] {\n const alter = () => this.getSchemaBuilder(resolver).alterTable(tableName);\n\n switch (operation.type) {\n case \"rename-column\":\n return alter()\n .renameColumn(\n this.getColumnName(operation.from, logicalTableName, resolver),\n this.getColumnName(operation.to, logicalTableName, resolver),\n )\n .compile();\n\n case \"drop-column\":\n return alter()\n .dropColumn(this.getColumnName(operation.name, logicalTableName, resolver))\n .compile();\n\n case \"create-column\": {\n const col = operation.value;\n return alter()\n .addColumn(\n this.getColumnName(col.name, logicalTableName, resolver),\n sql.raw(this.getDBType(col)),\n (b) => this.buildColumn(col, b),\n )\n .compile();\n }\n\n case \"update-column\":\n return this.compileUpdateColumn(tableName, logicalTableName, operation, resolver);\n }\n }\n\n /**\n * Compile an update-column operation.\n * Must be implemented by subclasses since each database handles this differently.\n */\n protected abstract compileUpdateColumn(\n tableName: string,\n logicalTableName: string,\n operation: Extract<ColumnOperation, { type: \"update-column\" }>,\n resolver?: NamingResolver,\n ): CompiledQuery | CompiledQuery[];\n\n /**\n * Compile a drop-table operation.\n */\n protected compileDropTable(\n operation: Extract<MigrationOperation, { type: \"drop-table\" }>,\n resolver?: NamingResolver,\n ): CompiledQuery {\n return this.getSchemaBuilder(resolver)\n .dropTable(this.getTableName(operation.name, resolver))\n .compile();\n }\n\n /**\n * Compile an add-foreign-key operation.\n * Subclasses can throw if not supported (e.g., SQLite).\n */\n protected compileAddForeignKey(\n operation: Extract<MigrationOperation, { type: \"add-foreign-key\" }>,\n resolver?: NamingResolver,\n ): CompiledQuery {\n const { table, value } = operation;\n return this.getSchemaBuilder(resolver)\n .alterTable(this.getTableName(table, resolver))\n .addForeignKeyConstraint(\n this.getForeignKeyName(value.name, table, value.referencedTable, resolver),\n value.columns.map((columnName) => this.getColumnName(columnName, table, resolver)),\n this.getTableName(value.referencedTable, resolver),\n value.referencedColumns.map((columnName) =>\n this.getColumnName(columnName, value.referencedTable, resolver),\n ),\n (b) => b.onUpdate(\"restrict\").onDelete(\"restrict\"),\n )\n .compile();\n }\n\n /**\n * Compile a drop-foreign-key operation.\n * Subclasses can throw if not supported (e.g., SQLite).\n */\n protected compileDropForeignKey(\n operation: Extract<MigrationOperation, { type: \"drop-foreign-key\" }>,\n resolver?: NamingResolver,\n ): CompiledQuery {\n const { table, name, referencedTable } = operation;\n return this.getSchemaBuilder(resolver)\n .alterTable(this.getTableName(table, resolver))\n .dropConstraint(this.getForeignKeyName(name, table, referencedTable, resolver))\n .ifExists()\n .compile();\n }\n\n /**\n * Compile an add-index operation.\n */\n protected compileAddIndex(\n operation: Extract<MigrationOperation, { type: \"add-index\" }>,\n resolver?: NamingResolver,\n ): CompiledQuery {\n const tableName = this.getTableName(operation.table, resolver);\n const indexName = this.getIndexName(\n operation.name,\n operation.table,\n resolver,\n operation.unique,\n );\n const columnNames = operation.columns.map((columnName) =>\n this.getColumnName(columnName, operation.table, resolver),\n );\n let builder = this.getSchemaBuilder(resolver)\n .createIndex(indexName)\n .on(tableName)\n .columns(columnNames);\n\n if (operation.unique) {\n builder = builder.unique();\n }\n\n return builder.compile();\n }\n\n /**\n * Compile a drop-index operation.\n */\n protected compileDropIndex(\n operation: Extract<MigrationOperation, { type: \"drop-index\" }>,\n resolver?: NamingResolver,\n ): CompiledQuery {\n const tableName = this.getTableName(operation.table, resolver);\n const indexName = this.getIndexName(operation.name, operation.table, resolver);\n return this.getSchemaBuilder(resolver).dropIndex(indexName).ifExists().on(tableName).compile();\n }\n\n /**\n * Compile a custom SQL operation.\n */\n protected compileCustom(\n operation: Extract<MigrationOperation, { type: \"custom\" }>,\n ): CompiledQuery {\n // Custom operations have a 'sql' property with raw SQL\n const rawSql = operation[\"sql\"] as string;\n return sql.raw(rawSql).compile(this.db);\n }\n\n /**\n * Build a column with all its constraints.\n */\n protected buildColumn(\n col: ColumnInfo,\n builder: ColumnDefinitionBuilder,\n ): ColumnDefinitionBuilder {\n if (!col.isNullable) {\n builder = builder.notNull();\n }\n\n if (col.role === \"internal-id\") {\n builder = builder.primaryKey();\n builder = this.applyAutoIncrement(builder);\n }\n\n if (col.role === \"external-id\") {\n builder = builder.unique();\n }\n\n const defaultValue = this.getDefaultValue(col);\n if (defaultValue) {\n builder = builder.defaultTo(defaultValue);\n }\n\n return builder;\n }\n\n /**\n * Get table name, applying namespace mapping if provided.\n * Settings table is never namespaced.\n */\n protected getTableName(tableName: string, resolver?: NamingResolver): string {\n if (tableName === SETTINGS_TABLE_NAME) {\n return tableName;\n }\n return resolver ? resolver.getTableName(tableName) : tableName;\n }\n\n /**\n * Get the physical index name, applying namespace if a mapper is provided.\n * Index names must be globally unique in most databases, so we namespace them\n * to avoid collisions when multiple fragments use the same logical index names.\n */\n protected getIndexName(\n indexName: string,\n tableName: string,\n resolver?: NamingResolver,\n unique?: boolean,\n ): string {\n if (!resolver) {\n return indexName;\n }\n return unique\n ? resolver.getUniqueIndexName(indexName, tableName)\n : resolver.getIndexName(indexName, tableName);\n }\n\n protected getForeignKeyName(\n name: string,\n tableName: string,\n referencedTable: string,\n resolver?: NamingResolver,\n ): string {\n if (!resolver) {\n return name;\n }\n return resolver.getForeignKeyName({\n logicalTable: tableName,\n logicalReferencedTable: referencedTable || tableName,\n referenceName: name,\n });\n }\n\n protected getColumnName(\n columnName: string,\n tableName: string,\n resolver?: NamingResolver,\n ): string {\n return resolver ? resolver.getColumnName(tableName, columnName) : columnName;\n }\n\n protected getSchemaBuilder(resolver?: NamingResolver) {\n const schemaName = resolver?.getSchemaName();\n return schemaName ? this.db.schema.withSchema(schemaName) : this.db.schema;\n }\n\n /**\n * Get the database type string for a column.\n */\n protected getDBType(col: ColumnInfo): string {\n return this.typeMapper.getDatabaseType(col);\n }\n\n /**\n * Compile raw SQL to a CompiledQuery.\n */\n protected compileRaw(raw: RawBuilder<unknown>): CompiledQuery {\n return raw.compile(this.db);\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"sql-generator.js","names":["queries: CompiledQuery[]","builder: CreateTableBuilderAny"],"sources":["../../../../src/adapters/generic-sql/migration/sql-generator.ts"],"sourcesContent":["import { createHash } from \"node:crypto\";\n\nimport {\n type ColumnDefinitionBuilder,\n type CompiledQuery,\n type CreateTableBuilder,\n type Kysely,\n type RawBuilder,\n sql,\n} from \"kysely\";\n\nimport { SETTINGS_TABLE_NAME } from \"../../../fragments/internal-fragment.schema\";\nimport type {\n ColumnInfo,\n ColumnOperation,\n MigrationOperation,\n} from \"../../../migration-engine/shared\";\nimport type { NamingResolver } from \"../../../naming/sql-naming\";\nimport { createSQLTypeMapper } from \"../../../schema/type-conversion/create-sql-type-mapper\";\nimport type { DriverConfig, SupportedDatabase } from \"../driver-config\";\nimport type { SQLiteStorageMode } from \"../sqlite-storage\";\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype KyselyAny = Kysely<any>;\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype CreateTableBuilderAny = CreateTableBuilder<any, any>;\n\n/**\n * Interface for compiling migration operations to SQL.\n */\nexport interface CompilableQuery {\n compile(): CompiledQuery;\n}\n\n/**\n * Abstract base class for SQL generation from migration operations.\n * Each database dialect extends this class and implements the abstract methods.\n */\nexport abstract class SQLGenerator {\n protected readonly db: KyselyAny;\n protected readonly database: SupportedDatabase;\n protected readonly typeMapper: ReturnType<typeof createSQLTypeMapper>;\n protected readonly driverConfig?: DriverConfig;\n\n constructor(\n db: KyselyAny,\n database: SupportedDatabase,\n driverConfig?: DriverConfig,\n sqliteStorageMode?: SQLiteStorageMode,\n ) {\n this.db = db;\n this.database = database;\n this.typeMapper = createSQLTypeMapper(database, sqliteStorageMode);\n this.driverConfig = driverConfig;\n }\n\n /**\n * Preprocess operations before SQL generation.\n * Dialects can override to transform operations based on database capabilities.\n * For example, SQLite merges FK operations into create-table operations.\n */\n abstract preprocess(operations: MigrationOperation[]): MigrationOperation[];\n\n /**\n * Apply auto-increment to a column builder.\n * PostgreSQL uses SERIAL types so this is a no-op there.\n */\n abstract applyAutoIncrement(builder: ColumnDefinitionBuilder): ColumnDefinitionBuilder;\n\n /**\n * Get the default value for a column, or undefined if not supported.\n * MySQL returns undefined for TEXT columns since it doesn't support defaults there.\n */\n abstract getDefaultValue(column: ColumnInfo): RawBuilder<unknown> | undefined;\n\n /**\n * Generate SQL for updating the schema version in the settings table.\n * This is the same across all databases.\n */\n generateVersionUpdateSQL(\n namespace: string,\n fromVersion: number,\n toVersion: number,\n ): CompiledQuery {\n const key = `${namespace}.schema_version`;\n\n if (fromVersion === 0) {\n // Insert new version record\n const id = createHash(\"md5\").update(key).digest(\"base64url\").replace(/=/g, \"\");\n return this.db\n .insertInto(SETTINGS_TABLE_NAME)\n .values({\n id: sql.lit(id),\n key: sql.lit(key),\n value: sql.lit(toVersion.toString()),\n })\n .compile();\n } else {\n // Update existing version record\n return this.db\n .updateTable(SETTINGS_TABLE_NAME)\n .set({\n value: sql.lit(toVersion.toString()),\n })\n .where(\"key\", \"=\", sql.lit(key))\n .compile();\n }\n }\n\n /**\n * Compile migration operations to SQL statements.\n * This is the main entry point for SQL generation.\n */\n compile(operations: MigrationOperation[], resolver?: NamingResolver): CompiledQuery[] {\n const preprocessed = this.preprocess(operations);\n const queries: CompiledQuery[] = [];\n\n const schemaName = resolver?.getSchemaName();\n if (schemaName && this.database === \"postgresql\") {\n queries.push(sql`CREATE SCHEMA IF NOT EXISTS ${sql.id(schemaName)}`.compile(this.db));\n }\n\n for (const operation of preprocessed) {\n const compiled = this.compileOperation(operation, resolver);\n if (Array.isArray(compiled)) {\n queries.push(...compiled);\n } else {\n queries.push(compiled);\n }\n }\n\n return queries;\n }\n\n /**\n * Compile a single migration operation to SQL.\n */\n protected compileOperation(\n operation: MigrationOperation,\n resolver?: NamingResolver,\n ): CompiledQuery | CompiledQuery[] {\n switch (operation.type) {\n case \"create-table\":\n return this.compileCreateTable(operation, resolver);\n case \"rename-table\":\n return this.compileRenameTable(operation, resolver);\n case \"alter-table\":\n return this.compileAlterTable(operation, resolver);\n case \"drop-table\":\n return this.compileDropTable(operation, resolver);\n case \"add-foreign-key\":\n return this.compileAddForeignKey(operation, resolver);\n case \"drop-foreign-key\":\n return this.compileDropForeignKey(operation, resolver);\n case \"add-index\":\n return this.compileAddIndex(operation, resolver);\n case \"drop-index\":\n return this.compileDropIndex(operation, resolver);\n case \"custom\":\n return this.compileCustom(operation);\n }\n }\n\n /**\n * Compile a create-table operation.\n * Subclasses can override to add FK constraints inline (e.g., SQLite).\n */\n protected compileCreateTable(\n operation: Extract<MigrationOperation, { type: \"create-table\" }>,\n resolver?: NamingResolver,\n ): CompiledQuery {\n const tableName = this.getTableName(operation.name, resolver);\n let builder: CreateTableBuilderAny = this.getSchemaBuilder(resolver).createTable(tableName);\n\n for (const col of operation.columns) {\n const columnName = this.getColumnName(col.name, operation.name, resolver);\n builder = builder.addColumn(columnName, sql.raw(this.getDBType(col)), (b) =>\n this.buildColumn(col, b),\n );\n }\n\n // Allow subclasses to add inline foreign keys\n builder = this.addInlineForeignKeys(builder, operation, resolver);\n\n return builder.compile();\n }\n\n /**\n * Hook for subclasses to add inline foreign keys to create-table.\n * SQLite overrides this to add FKs at table creation time.\n */\n protected addInlineForeignKeys(\n builder: CreateTableBuilderAny,\n _operation: Extract<MigrationOperation, { type: \"create-table\" }>,\n _resolver?: NamingResolver,\n ): CreateTableBuilderAny {\n return builder;\n }\n\n /**\n * Compile a rename-table operation.\n */\n protected compileRenameTable(\n operation: Extract<MigrationOperation, { type: \"rename-table\" }>,\n resolver?: NamingResolver,\n ): CompiledQuery {\n return this.getSchemaBuilder(resolver)\n .alterTable(this.getTableName(operation.from, resolver))\n .renameTo(this.getTableName(operation.to, resolver))\n .compile();\n }\n\n /**\n * Compile an alter-table operation.\n */\n protected compileAlterTable(\n operation: Extract<MigrationOperation, { type: \"alter-table\" }>,\n resolver?: NamingResolver,\n ): CompiledQuery[] {\n const queries: CompiledQuery[] = [];\n const tableName = this.getTableName(operation.name, resolver);\n\n for (const columnOp of operation.value) {\n const compiled = this.compileColumnOperation(tableName, operation.name, columnOp, resolver);\n if (Array.isArray(compiled)) {\n queries.push(...compiled);\n } else {\n queries.push(compiled);\n }\n }\n\n return queries;\n }\n\n /**\n * Compile a column operation within an alter-table.\n * Subclasses override for database-specific handling (e.g., MySQL's modifyColumn).\n */\n protected compileColumnOperation(\n tableName: string,\n logicalTableName: string,\n operation: ColumnOperation,\n resolver?: NamingResolver,\n ): CompiledQuery | CompiledQuery[] {\n const alter = () => this.getSchemaBuilder(resolver).alterTable(tableName);\n\n switch (operation.type) {\n case \"rename-column\":\n return alter()\n .renameColumn(\n this.getColumnName(operation.from, logicalTableName, resolver),\n this.getColumnName(operation.to, logicalTableName, resolver),\n )\n .compile();\n\n case \"drop-column\":\n return alter()\n .dropColumn(this.getColumnName(operation.name, logicalTableName, resolver))\n .compile();\n\n case \"create-column\": {\n const col = operation.value;\n return alter()\n .addColumn(\n this.getColumnName(col.name, logicalTableName, resolver),\n sql.raw(this.getDBType(col)),\n (b) => this.buildColumn(col, b),\n )\n .compile();\n }\n\n case \"update-column\":\n return this.compileUpdateColumn(tableName, logicalTableName, operation, resolver);\n }\n }\n\n /**\n * Compile an update-column operation.\n * Must be implemented by subclasses since each database handles this differently.\n */\n protected abstract compileUpdateColumn(\n tableName: string,\n logicalTableName: string,\n operation: Extract<ColumnOperation, { type: \"update-column\" }>,\n resolver?: NamingResolver,\n ): CompiledQuery | CompiledQuery[];\n\n /**\n * Compile a drop-table operation.\n */\n protected compileDropTable(\n operation: Extract<MigrationOperation, { type: \"drop-table\" }>,\n resolver?: NamingResolver,\n ): CompiledQuery {\n return this.getSchemaBuilder(resolver)\n .dropTable(this.getTableName(operation.name, resolver))\n .compile();\n }\n\n /**\n * Compile an add-foreign-key operation.\n * Subclasses can throw if not supported (e.g., SQLite).\n */\n protected compileAddForeignKey(\n operation: Extract<MigrationOperation, { type: \"add-foreign-key\" }>,\n resolver?: NamingResolver,\n ): CompiledQuery {\n const { table, value } = operation;\n return this.getSchemaBuilder(resolver)\n .alterTable(this.getTableName(table, resolver))\n .addForeignKeyConstraint(\n this.getForeignKeyName(value.name, table, value.referencedTable, resolver),\n value.columns.map((columnName) => this.getColumnName(columnName, table, resolver)),\n this.getTableName(value.referencedTable, resolver),\n value.referencedColumns.map((columnName) =>\n this.getColumnName(columnName, value.referencedTable, resolver),\n ),\n (b) => b.onUpdate(\"restrict\").onDelete(\"restrict\"),\n )\n .compile();\n }\n\n /**\n * Compile a drop-foreign-key operation.\n * Subclasses can throw if not supported (e.g., SQLite).\n */\n protected compileDropForeignKey(\n operation: Extract<MigrationOperation, { type: \"drop-foreign-key\" }>,\n resolver?: NamingResolver,\n ): CompiledQuery {\n const { table, name, referencedTable } = operation;\n return this.getSchemaBuilder(resolver)\n .alterTable(this.getTableName(table, resolver))\n .dropConstraint(this.getForeignKeyName(name, table, referencedTable, resolver))\n .ifExists()\n .compile();\n }\n\n /**\n * Compile an add-index operation.\n */\n protected compileAddIndex(\n operation: Extract<MigrationOperation, { type: \"add-index\" }>,\n resolver?: NamingResolver,\n ): CompiledQuery {\n const tableName = this.getTableName(operation.table, resolver);\n const indexName = this.getIndexName(\n operation.name,\n operation.table,\n resolver,\n operation.unique,\n );\n const columnNames = operation.columns.map((columnName) =>\n this.getColumnName(columnName, operation.table, resolver),\n );\n let builder = this.getSchemaBuilder(resolver)\n .createIndex(indexName)\n .on(tableName)\n .columns(columnNames);\n\n if (operation.unique) {\n builder = builder.unique();\n }\n\n return builder.compile();\n }\n\n /**\n * Compile a drop-index operation.\n */\n protected compileDropIndex(\n operation: Extract<MigrationOperation, { type: \"drop-index\" }>,\n resolver?: NamingResolver,\n ): CompiledQuery {\n const tableName = this.getTableName(operation.table, resolver);\n const indexName = this.getIndexName(operation.name, operation.table, resolver);\n return this.getSchemaBuilder(resolver).dropIndex(indexName).ifExists().on(tableName).compile();\n }\n\n /**\n * Compile a custom SQL operation.\n */\n protected compileCustom(\n operation: Extract<MigrationOperation, { type: \"custom\" }>,\n ): CompiledQuery {\n // Custom operations have a 'sql' property with raw SQL\n const rawSql = operation[\"sql\"] as string;\n return sql.raw(rawSql).compile(this.db);\n }\n\n /**\n * Build a column with all its constraints.\n */\n protected buildColumn(\n col: ColumnInfo,\n builder: ColumnDefinitionBuilder,\n ): ColumnDefinitionBuilder {\n if (!col.isNullable) {\n builder = builder.notNull();\n }\n\n if (col.role === \"internal-id\") {\n builder = builder.primaryKey();\n builder = this.applyAutoIncrement(builder);\n }\n\n if (col.role === \"external-id\") {\n builder = builder.unique();\n }\n\n const defaultValue = this.getDefaultValue(col);\n if (defaultValue) {\n builder = builder.defaultTo(defaultValue);\n }\n\n return builder;\n }\n\n /**\n * Get table name, applying namespace mapping if provided.\n * Settings table is never namespaced.\n */\n protected getTableName(tableName: string, resolver?: NamingResolver): string {\n if (tableName === SETTINGS_TABLE_NAME) {\n return tableName;\n }\n return resolver ? resolver.getTableName(tableName) : tableName;\n }\n\n /**\n * Get the physical index name, applying namespace if a mapper is provided.\n * Index names must be globally unique in most databases, so we namespace them\n * to avoid collisions when multiple fragments use the same logical index names.\n */\n protected getIndexName(\n indexName: string,\n tableName: string,\n resolver?: NamingResolver,\n unique?: boolean,\n ): string {\n if (!resolver) {\n return indexName;\n }\n return unique\n ? resolver.getUniqueIndexName(indexName, tableName)\n : resolver.getIndexName(indexName, tableName);\n }\n\n protected getForeignKeyName(\n name: string,\n tableName: string,\n referencedTable: string,\n resolver?: NamingResolver,\n ): string {\n if (!resolver) {\n return name;\n }\n return resolver.getForeignKeyName({\n logicalTable: tableName,\n logicalReferencedTable: referencedTable || tableName,\n referenceName: name,\n });\n }\n\n protected getColumnName(\n columnName: string,\n tableName: string,\n resolver?: NamingResolver,\n ): string {\n return resolver ? resolver.getColumnName(tableName, columnName) : columnName;\n }\n\n protected getSchemaBuilder(resolver?: NamingResolver) {\n const schemaName = resolver?.getSchemaName();\n return schemaName ? this.db.schema.withSchema(schemaName) : this.db.schema;\n }\n\n /**\n * Get the database type string for a column.\n */\n protected getDBType(col: ColumnInfo): string {\n return this.typeMapper.getDatabaseType(col);\n }\n\n /**\n * Compile raw SQL to a CompiledQuery.\n */\n protected compileRaw(raw: RawBuilder<unknown>): CompiledQuery {\n return raw.compile(this.db);\n }\n}\n"],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import "./sql-query-compiler.js";
|
|
2
|
-
import { PostgreSQLQueryCompiler } from "./dialect/postgres.js";
|
|
3
2
|
import { MySQLQueryCompiler } from "./dialect/mysql.js";
|
|
3
|
+
import { PostgreSQLQueryCompiler } from "./dialect/postgres.js";
|
|
4
4
|
import { SQLiteQueryCompiler } from "./dialect/sqlite.js";
|
|
5
5
|
|
|
6
6
|
//#region src/adapters/generic-sql/query/create-sql-query-compiler.ts
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-sql-query-compiler.js","names":["exhaustiveCheck: never"],"sources":["../../../../src/adapters/generic-sql/query/create-sql-query-compiler.ts"],"sourcesContent":["import type {
|
|
1
|
+
{"version":3,"file":"create-sql-query-compiler.js","names":["exhaustiveCheck: never"],"sources":["../../../../src/adapters/generic-sql/query/create-sql-query-compiler.ts"],"sourcesContent":["import type { NamingResolver } from \"../../../naming/sql-naming\";\nimport type { DriverConfig } from \"../driver-config\";\nimport type { SQLiteStorageMode } from \"../sqlite-storage\";\nimport { MySQLQueryCompiler } from \"./dialect/mysql\";\nimport { PostgreSQLQueryCompiler } from \"./dialect/postgres\";\nimport { SQLiteQueryCompiler } from \"./dialect/sqlite\";\nimport { SQLQueryCompiler, type AnyKysely } from \"./sql-query-compiler\";\n\n/**\n * Factory function to create a dialect-specific SQL query compiler.\n *\n * Based on the database type in DriverConfig, returns the appropriate\n * compiler implementation (PostgreSQL, MySQL, or SQLite).\n *\n * @param db - Kysely database instance\n * @param driverConfig - Driver configuration with database type and capabilities\n * @param sqliteStorageMode - Optional SQLite storage mode override\n * @param resolver - Optional naming resolver for namespace prefixing\n * @returns Dialect-specific SQLQueryCompiler instance\n */\nexport function createSQLQueryCompiler(\n db: AnyKysely,\n driverConfig: DriverConfig,\n sqliteStorageMode?: SQLiteStorageMode,\n resolver?: NamingResolver,\n): SQLQueryCompiler {\n switch (driverConfig.databaseType) {\n case \"postgresql\":\n return new PostgreSQLQueryCompiler(db, driverConfig, sqliteStorageMode, resolver);\n case \"mysql\":\n return new MySQLQueryCompiler(db, driverConfig, sqliteStorageMode, resolver);\n case \"sqlite\":\n return new SQLiteQueryCompiler(db, driverConfig, sqliteStorageMode, resolver);\n default: {\n const exhaustiveCheck: never = driverConfig.databaseType;\n throw new Error(`Unsupported database type: ${exhaustiveCheck}`);\n }\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAoBA,SAAgB,uBACd,IACA,cACA,mBACA,UACkB;AAClB,SAAQ,aAAa,cAArB;EACE,KAAK,aACH,QAAO,IAAI,wBAAwB,IAAI,cAAc,mBAAmB,SAAS;EACnF,KAAK,QACH,QAAO,IAAI,mBAAmB,IAAI,cAAc,mBAAmB,SAAS;EAC9E,KAAK,SACH,QAAO,IAAI,oBAAoB,IAAI,cAAc,mBAAmB,SAAS;EAC/E,SAAS;GACP,MAAMA,kBAAyB,aAAa;AAC5C,SAAM,IAAI,MAAM,8BAA8B,kBAAkB"}
|