@fragno-dev/db 0.2.1 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-build.log +206 -140
- package/CHANGELOG.md +67 -0
- package/README.md +30 -9
- package/dist/adapters/adapters.d.ts +23 -21
- package/dist/adapters/adapters.d.ts.map +1 -1
- package/dist/adapters/adapters.js.map +1 -1
- package/dist/adapters/generic-sql/driver-config.d.ts +16 -1
- package/dist/adapters/generic-sql/driver-config.d.ts.map +1 -1
- package/dist/adapters/generic-sql/driver-config.js +23 -1
- package/dist/adapters/generic-sql/driver-config.js.map +1 -1
- package/dist/adapters/generic-sql/generic-sql-adapter.d.ts +27 -9
- package/dist/adapters/generic-sql/generic-sql-adapter.d.ts.map +1 -1
- package/dist/adapters/generic-sql/generic-sql-adapter.js +55 -16
- package/dist/adapters/generic-sql/generic-sql-adapter.js.map +1 -1
- package/dist/adapters/generic-sql/generic-sql-uow-executor.js +129 -3
- package/dist/adapters/generic-sql/generic-sql-uow-executor.js.map +1 -1
- package/dist/adapters/generic-sql/migration/dialect/mysql.js +24 -5
- package/dist/adapters/generic-sql/migration/dialect/mysql.js.map +1 -1
- package/dist/adapters/generic-sql/migration/dialect/postgres.js +6 -5
- package/dist/adapters/generic-sql/migration/dialect/postgres.js.map +1 -1
- package/dist/adapters/generic-sql/migration/dialect/sqlite.js +21 -10
- package/dist/adapters/generic-sql/migration/dialect/sqlite.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 +8 -8
- package/dist/adapters/generic-sql/migration/prepared-migrations.js.map +1 -1
- package/dist/adapters/generic-sql/migration/sql-generator.js +74 -51
- package/dist/adapters/generic-sql/migration/sql-generator.js.map +1 -1
- package/dist/adapters/generic-sql/query/create-sql-query-compiler.js +6 -5
- package/dist/adapters/generic-sql/query/create-sql-query-compiler.js.map +1 -1
- package/dist/adapters/generic-sql/query/cursor-utils.js +42 -4
- package/dist/adapters/generic-sql/query/cursor-utils.js.map +1 -1
- package/dist/adapters/generic-sql/query/generic-sql-uow-operation-compiler.js +25 -17
- package/dist/adapters/generic-sql/query/generic-sql-uow-operation-compiler.js.map +1 -1
- package/dist/adapters/generic-sql/query/select-builder.js +5 -3
- package/dist/adapters/generic-sql/query/select-builder.js.map +1 -1
- package/dist/adapters/generic-sql/query/sql-query-compiler.js +15 -12
- package/dist/adapters/generic-sql/query/sql-query-compiler.js.map +1 -1
- package/dist/adapters/generic-sql/query/where-builder.js +38 -28
- package/dist/adapters/generic-sql/query/where-builder.js.map +1 -1
- package/dist/adapters/generic-sql/sqlite-storage.d.ts +13 -0
- package/dist/adapters/generic-sql/sqlite-storage.d.ts.map +1 -0
- package/dist/adapters/generic-sql/sqlite-storage.js +15 -0
- package/dist/adapters/generic-sql/sqlite-storage.js.map +1 -0
- package/dist/adapters/generic-sql/uow-decoder.js +7 -3
- package/dist/adapters/generic-sql/uow-decoder.js.map +1 -1
- package/dist/adapters/generic-sql/uow-encoder.js +28 -8
- package/dist/adapters/generic-sql/uow-encoder.js.map +1 -1
- package/dist/adapters/in-memory/condition-evaluator.js +131 -0
- package/dist/adapters/in-memory/condition-evaluator.js.map +1 -0
- package/dist/adapters/in-memory/errors.d.ts +13 -0
- package/dist/adapters/in-memory/errors.d.ts.map +1 -0
- package/dist/adapters/in-memory/errors.js +23 -0
- package/dist/adapters/in-memory/errors.js.map +1 -0
- package/dist/adapters/in-memory/in-memory-adapter.d.ts +27 -0
- package/dist/adapters/in-memory/in-memory-adapter.d.ts.map +1 -0
- package/dist/adapters/in-memory/in-memory-adapter.js +176 -0
- package/dist/adapters/in-memory/in-memory-adapter.js.map +1 -0
- package/dist/adapters/in-memory/in-memory-uow.js +648 -0
- package/dist/adapters/in-memory/in-memory-uow.js.map +1 -0
- package/dist/adapters/in-memory/index.d.ts +4 -0
- package/dist/adapters/in-memory/index.js +4 -0
- package/dist/adapters/in-memory/options.d.ts +28 -0
- package/dist/adapters/in-memory/options.d.ts.map +1 -0
- package/dist/adapters/in-memory/options.js +61 -0
- package/dist/adapters/in-memory/options.js.map +1 -0
- package/dist/adapters/in-memory/reference-resolution.js +26 -0
- package/dist/adapters/in-memory/reference-resolution.js.map +1 -0
- package/dist/adapters/in-memory/sorted-array-index.js +129 -0
- package/dist/adapters/in-memory/sorted-array-index.js.map +1 -0
- package/dist/adapters/in-memory/store.js +71 -0
- package/dist/adapters/in-memory/store.js.map +1 -0
- package/dist/adapters/in-memory/value-comparison.js +28 -0
- package/dist/adapters/in-memory/value-comparison.js.map +1 -0
- package/dist/adapters/shared/from-unit-of-work-compiler.js.map +1 -1
- package/dist/adapters/shared/uow-operation-compiler.js +11 -11
- package/dist/adapters/shared/uow-operation-compiler.js.map +1 -1
- package/dist/adapters/sql/index.d.ts +5 -0
- package/dist/adapters/sql/index.js +4 -0
- package/dist/db-fragment-definition-builder.d.ts +45 -96
- package/dist/db-fragment-definition-builder.d.ts.map +1 -1
- package/dist/db-fragment-definition-builder.js +121 -99
- package/dist/db-fragment-definition-builder.js.map +1 -1
- package/dist/dispatchers/cloudflare-do/index.d.ts +26 -0
- package/dist/dispatchers/cloudflare-do/index.d.ts.map +1 -0
- package/dist/dispatchers/cloudflare-do/index.js +63 -0
- package/dist/dispatchers/cloudflare-do/index.js.map +1 -0
- package/dist/dispatchers/node/index.d.ts +17 -0
- package/dist/dispatchers/node/index.d.ts.map +1 -0
- package/dist/dispatchers/node/index.js +59 -0
- package/dist/dispatchers/node/index.js.map +1 -0
- package/dist/fragments/internal-fragment.d.ts +172 -9
- package/dist/fragments/internal-fragment.d.ts.map +1 -1
- package/dist/fragments/internal-fragment.js +193 -74
- package/dist/fragments/internal-fragment.js.map +1 -1
- package/dist/fragments/internal-fragment.routes.js +29 -0
- package/dist/fragments/internal-fragment.routes.js.map +1 -0
- package/dist/fragments/internal-fragment.schema.d.ts +9 -0
- package/dist/fragments/internal-fragment.schema.d.ts.map +1 -0
- package/dist/fragments/internal-fragment.schema.js +22 -0
- package/dist/fragments/internal-fragment.schema.js.map +1 -0
- package/dist/hooks/durable-hooks-processor.d.ts +14 -0
- package/dist/hooks/durable-hooks-processor.d.ts.map +1 -0
- package/dist/hooks/durable-hooks-processor.js +32 -0
- package/dist/hooks/durable-hooks-processor.js.map +1 -0
- package/dist/hooks/hooks.d.ts +47 -4
- package/dist/hooks/hooks.d.ts.map +1 -1
- package/dist/hooks/hooks.js +106 -39
- package/dist/hooks/hooks.js.map +1 -1
- package/dist/migration-engine/auto-from-schema.js +14 -11
- package/dist/migration-engine/auto-from-schema.js.map +1 -1
- package/dist/migration-engine/generation-engine.d.ts +16 -10
- package/dist/migration-engine/generation-engine.d.ts.map +1 -1
- package/dist/migration-engine/generation-engine.js +72 -33
- package/dist/migration-engine/generation-engine.js.map +1 -1
- package/dist/migration-engine/shared.js.map +1 -1
- package/dist/mod.d.ts +17 -10
- package/dist/mod.d.ts.map +1 -1
- package/dist/mod.js +14 -8
- package/dist/mod.js.map +1 -1
- package/dist/naming/sql-naming.d.ts +19 -0
- package/dist/naming/sql-naming.d.ts.map +1 -0
- package/dist/naming/sql-naming.js +116 -0
- package/dist/naming/sql-naming.js.map +1 -0
- package/dist/node_modules/.pnpm/{rou3@0.7.10 → rou3@0.7.12}/node_modules/rou3/dist/index.js +8 -5
- package/dist/node_modules/.pnpm/rou3@0.7.12/node_modules/rou3/dist/index.js.map +1 -0
- package/dist/outbox/outbox-builder.js +156 -0
- package/dist/outbox/outbox-builder.js.map +1 -0
- package/dist/outbox/outbox.d.ts +52 -0
- package/dist/outbox/outbox.d.ts.map +1 -0
- package/dist/outbox/outbox.js +37 -0
- package/dist/outbox/outbox.js.map +1 -0
- package/dist/packages/fragno/dist/api/fragment-definition-builder.js +3 -2
- package/dist/packages/fragno/dist/api/fragment-definition-builder.js.map +1 -1
- package/dist/packages/fragno/dist/api/fragment-instantiator.js +164 -20
- package/dist/packages/fragno/dist/api/fragment-instantiator.js.map +1 -1
- package/dist/packages/fragno/dist/api/request-input-context.js +67 -0
- package/dist/packages/fragno/dist/api/request-input-context.js.map +1 -1
- package/dist/packages/fragno/dist/api/route.js +14 -1
- package/dist/packages/fragno/dist/api/route.js.map +1 -1
- package/dist/packages/fragno/dist/internal/trace-context.js +12 -0
- package/dist/packages/fragno/dist/internal/trace-context.js.map +1 -0
- package/dist/query/column-defaults.js +20 -4
- package/dist/query/column-defaults.js.map +1 -1
- package/dist/query/cursor.d.ts +3 -1
- package/dist/query/cursor.d.ts.map +1 -1
- package/dist/query/cursor.js +45 -14
- package/dist/query/cursor.js.map +1 -1
- package/dist/query/db-now.d.ts +8 -0
- package/dist/query/db-now.d.ts.map +1 -0
- package/dist/query/db-now.js +7 -0
- package/dist/query/db-now.js.map +1 -0
- package/dist/query/serialize/create-sql-serializer.js +3 -2
- package/dist/query/serialize/create-sql-serializer.js.map +1 -1
- package/dist/query/serialize/dialect/mysql-serializer.js +12 -6
- package/dist/query/serialize/dialect/mysql-serializer.js.map +1 -1
- package/dist/query/serialize/dialect/postgres-serializer.js +25 -7
- package/dist/query/serialize/dialect/postgres-serializer.js.map +1 -1
- package/dist/query/serialize/dialect/sqlite-serializer.js +55 -11
- package/dist/query/serialize/dialect/sqlite-serializer.js.map +1 -1
- package/dist/query/serialize/sql-serializer.js +2 -2
- package/dist/query/serialize/sql-serializer.js.map +1 -1
- package/dist/query/simple-query-interface.d.ts +6 -1
- package/dist/query/simple-query-interface.d.ts.map +1 -1
- package/dist/query/unit-of-work/execute-unit-of-work.d.ts +351 -100
- 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 +440 -267
- 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 +67 -22
- package/dist/query/unit-of-work/unit-of-work.d.ts.map +1 -1
- package/dist/query/unit-of-work/unit-of-work.js +110 -13
- package/dist/query/unit-of-work/unit-of-work.js.map +1 -1
- package/dist/query/value-decoding.js +8 -5
- package/dist/query/value-decoding.js.map +1 -1
- package/dist/query/value-encoding.js +29 -9
- package/dist/query/value-encoding.js.map +1 -1
- package/dist/schema/create.d.ts +40 -14
- package/dist/schema/create.d.ts.map +1 -1
- package/dist/schema/create.js +82 -42
- package/dist/schema/create.js.map +1 -1
- package/dist/schema/generate-id.d.ts +20 -0
- package/dist/schema/generate-id.d.ts.map +1 -0
- package/dist/schema/generate-id.js +28 -0
- package/dist/schema/generate-id.js.map +1 -0
- package/dist/schema/type-conversion/create-sql-type-mapper.js +3 -2
- package/dist/schema/type-conversion/create-sql-type-mapper.js.map +1 -1
- package/dist/schema/type-conversion/dialect/sqlite.js +9 -0
- package/dist/schema/type-conversion/dialect/sqlite.js.map +1 -1
- package/dist/schema/validator.d.ts +10 -0
- package/dist/schema/validator.d.ts.map +1 -0
- package/dist/schema/validator.js +123 -0
- package/dist/schema/validator.js.map +1 -0
- package/dist/schema-output/drizzle.d.ts +30 -0
- package/dist/schema-output/drizzle.d.ts.map +1 -0
- package/dist/{adapters/drizzle/generate.js → schema-output/drizzle.js} +82 -56
- package/dist/schema-output/drizzle.js.map +1 -0
- package/dist/schema-output/prisma.d.ts +17 -0
- package/dist/schema-output/prisma.d.ts.map +1 -0
- package/dist/schema-output/prisma.js +296 -0
- package/dist/schema-output/prisma.js.map +1 -0
- package/dist/util/default-database-adapter.js +61 -0
- package/dist/util/default-database-adapter.js.map +1 -0
- package/dist/with-database.d.ts +1 -1
- package/dist/with-database.d.ts.map +1 -1
- package/dist/with-database.js +12 -3
- package/dist/with-database.js.map +1 -1
- package/package.json +43 -28
- package/src/adapters/adapters.ts +30 -24
- package/src/adapters/drizzle/migrate-drizzle.test.ts +54 -33
- package/src/adapters/drizzle/migration-parity-drizzle-kit.test.ts +599 -0
- package/src/adapters/drizzle/test-utils.ts +12 -8
- package/src/adapters/generic-sql/driver-config.ts +38 -0
- package/src/adapters/generic-sql/generic-sql-adapter.test.ts +5 -5
- package/src/adapters/generic-sql/generic-sql-adapter.ts +110 -24
- package/src/adapters/generic-sql/generic-sql-uow-executor.test.ts +54 -0
- package/src/adapters/generic-sql/generic-sql-uow-executor.ts +231 -3
- package/src/adapters/generic-sql/migration/adapter-migration-parity.test.ts +118 -0
- package/src/adapters/generic-sql/migration/dialect/mysql.test.ts +26 -8
- package/src/adapters/generic-sql/migration/dialect/mysql.ts +46 -8
- package/src/adapters/generic-sql/migration/dialect/postgres.test.ts +25 -7
- package/src/adapters/generic-sql/migration/dialect/postgres.ts +8 -4
- package/src/adapters/generic-sql/migration/dialect/sqlite.test.ts +47 -8
- package/src/adapters/generic-sql/migration/dialect/sqlite.ts +27 -12
- package/src/adapters/generic-sql/migration/prepared-migrations.test.ts +128 -39
- package/src/adapters/generic-sql/migration/prepared-migrations.ts +15 -8
- package/src/adapters/generic-sql/migration/sql-generator.ts +142 -65
- package/src/adapters/generic-sql/query/create-sql-query-compiler.ts +9 -6
- package/src/adapters/generic-sql/query/cursor-utils.test.ts +271 -0
- package/src/adapters/generic-sql/query/cursor-utils.ts +41 -6
- package/src/adapters/generic-sql/query/generic-sql-uow-operation-compiler.test.ts +27 -27
- package/src/adapters/generic-sql/query/generic-sql-uow-operation-compiler.ts +38 -24
- package/src/adapters/generic-sql/query/select-builder.test.ts +15 -11
- package/src/adapters/generic-sql/query/select-builder.ts +6 -2
- package/src/adapters/generic-sql/query/sql-query-compiler.test.ts +52 -2
- package/src/adapters/generic-sql/query/sql-query-compiler.ts +50 -15
- package/src/adapters/generic-sql/query/where-builder.test.ts +91 -17
- package/src/adapters/generic-sql/query/where-builder.ts +90 -38
- package/src/adapters/{kysely/kysely-adapter-pglite.test.ts → generic-sql/sql-adapter-pglite-migrations.test.ts} +6 -6
- package/src/adapters/generic-sql/sql-adapter-pglite-pagination.test.ts +806 -0
- package/src/adapters/{drizzle/drizzle-adapter-pglite.test.ts → generic-sql/sql-adapter-pglite-queries.test.ts} +11 -11
- package/src/adapters/generic-sql/{test/generic-drizzle-adapter-sqlite3.test.ts → sql-adapter-sqlite3-driver.test.ts} +49 -35
- package/src/adapters/{drizzle/drizzle-adapter-sqlite3.test.ts → generic-sql/sql-adapter-sqlite3-uow.test.ts} +48 -32
- package/src/adapters/{kysely/kysely-adapter-sqlocal.test.ts → generic-sql/sql-adapter-sqlocal.test.ts} +6 -6
- package/src/adapters/generic-sql/sqlite-storage.ts +20 -0
- package/src/adapters/generic-sql/uow-decoder.test.ts +1 -1
- package/src/adapters/generic-sql/uow-decoder.ts +21 -3
- package/src/adapters/generic-sql/uow-encoder.test.ts +33 -2
- package/src/adapters/generic-sql/uow-encoder.ts +50 -11
- package/src/adapters/in-memory/condition-evaluator.test.ts +193 -0
- package/src/adapters/in-memory/condition-evaluator.ts +275 -0
- package/src/adapters/in-memory/errors.ts +20 -0
- package/src/adapters/in-memory/in-memory-adapter.ts +277 -0
- package/src/adapters/in-memory/in-memory-uow.mutations.test.ts +296 -0
- package/src/adapters/in-memory/in-memory-uow.retrieval.test.ts +100 -0
- package/src/adapters/in-memory/in-memory-uow.ts +1348 -0
- package/src/adapters/in-memory/index.ts +3 -0
- package/src/adapters/in-memory/options.test.ts +41 -0
- package/src/adapters/in-memory/options.ts +87 -0
- package/src/adapters/in-memory/reference-resolution.test.ts +50 -0
- package/src/adapters/in-memory/reference-resolution.ts +67 -0
- package/src/adapters/in-memory/sorted-array-index.test.ts +123 -0
- package/src/adapters/in-memory/sorted-array-index.ts +228 -0
- package/src/adapters/in-memory/store.test.ts +68 -0
- package/src/adapters/in-memory/store.ts +145 -0
- package/src/adapters/in-memory/value-comparison.ts +53 -0
- package/src/adapters/in-memory/value-normalization.test.ts +57 -0
- package/src/adapters/prisma/prisma-adapter-sqlite3.test.ts +1163 -0
- package/src/adapters/shared/from-unit-of-work-compiler.ts +3 -1
- package/src/adapters/shared/uow-operation-compiler.ts +26 -16
- package/src/adapters/sql/index.ts +12 -0
- package/src/db-fragment-definition-builder.test.ts +88 -54
- package/src/db-fragment-definition-builder.ts +201 -322
- package/src/db-fragment-instantiator.test.ts +169 -101
- package/src/db-fragment-integration.test.ts +301 -149
- package/src/dispatchers/cloudflare-do/index.test.ts +73 -0
- package/src/dispatchers/cloudflare-do/index.ts +104 -0
- package/src/dispatchers/node/index.test.ts +91 -0
- package/src/dispatchers/node/index.ts +87 -0
- package/src/fragments/internal-fragment.routes.ts +42 -0
- package/src/fragments/internal-fragment.schema.ts +51 -0
- package/src/fragments/internal-fragment.test.ts +730 -274
- package/src/fragments/internal-fragment.ts +447 -154
- package/src/hooks/durable-hooks-processor.test.ts +117 -0
- package/src/hooks/durable-hooks-processor.ts +67 -0
- package/src/hooks/hooks.test.ts +411 -259
- package/src/hooks/hooks.ts +265 -66
- package/src/migration-engine/auto-from-schema.test.ts +14 -14
- package/src/migration-engine/auto-from-schema.ts +5 -2
- package/src/migration-engine/create.test.ts +2 -2
- package/src/migration-engine/generation-engine.test.ts +229 -104
- package/src/migration-engine/generation-engine.ts +94 -64
- package/src/migration-engine/shared.ts +1 -0
- package/src/mod.ts +78 -30
- package/src/naming/sql-naming.ts +180 -0
- package/src/outbox/outbox-builder.ts +241 -0
- package/src/outbox/outbox.test.ts +253 -0
- package/src/outbox/outbox.ts +137 -0
- package/src/query/column-defaults.ts +41 -3
- package/src/query/condition-builder.test.ts +3 -3
- package/src/query/cursor.test.ts +116 -18
- package/src/query/cursor.ts +75 -26
- package/src/query/db-now.ts +6 -0
- package/src/query/query-type.test.ts +2 -2
- package/src/query/serialize/create-sql-serializer.ts +7 -2
- package/src/query/serialize/dialect/mysql-serializer.ts +12 -4
- package/src/query/serialize/dialect/postgres-serializer.ts +34 -4
- package/src/query/serialize/dialect/sqlite-serializer.test.ts +51 -1
- package/src/query/serialize/dialect/sqlite-serializer.ts +92 -9
- package/src/query/serialize/sql-serializer.ts +4 -4
- package/src/query/simple-query-interface.ts +5 -0
- package/src/query/unit-of-work/execute-unit-of-work.test.ts +1512 -1458
- package/src/query/unit-of-work/execute-unit-of-work.ts +1708 -596
- package/src/query/unit-of-work/tx-builder.test.ts +1041 -0
- package/src/query/unit-of-work/unit-of-work-coordinator.test.ts +32 -32
- package/src/query/unit-of-work/unit-of-work-types.test.ts +1 -1
- package/src/query/unit-of-work/unit-of-work.test.ts +231 -36
- package/src/query/unit-of-work/unit-of-work.ts +229 -31
- package/src/query/value-decoding.test.ts +13 -2
- package/src/query/value-decoding.ts +17 -4
- package/src/query/value-encoding.test.ts +85 -2
- package/src/query/value-encoding.ts +56 -6
- package/src/schema/create.test.ts +129 -42
- package/src/schema/create.ts +187 -47
- package/src/schema/generate-id.test.ts +57 -0
- package/src/schema/generate-id.ts +38 -0
- package/src/schema/serialize.test.ts +14 -2
- package/src/schema/type-conversion/create-sql-type-mapper.ts +7 -2
- package/src/schema/type-conversion/dialect/sqlite.ts +18 -0
- package/src/schema/type-conversion/type-mapping.test.ts +25 -1
- package/src/schema/validator.test.ts +197 -0
- package/src/schema/validator.ts +231 -0
- package/src/{adapters/drizzle/generate.test.ts → schema-output/drizzle.test.ts} +179 -129
- package/src/{adapters/drizzle/generate.ts → schema-output/drizzle.ts} +143 -93
- package/src/schema-output/prisma.test.ts +536 -0
- package/src/schema-output/prisma.ts +573 -0
- package/src/util/default-database-adapter.ts +106 -0
- package/src/with-database.ts +22 -3
- package/tsdown.config.ts +6 -4
- package/dist/adapters/drizzle/drizzle-adapter.d.ts +0 -20
- package/dist/adapters/drizzle/drizzle-adapter.d.ts.map +0 -1
- package/dist/adapters/drizzle/drizzle-adapter.js +0 -27
- package/dist/adapters/drizzle/drizzle-adapter.js.map +0 -1
- package/dist/adapters/drizzle/generate.d.ts +0 -30
- package/dist/adapters/drizzle/generate.d.ts.map +0 -1
- package/dist/adapters/drizzle/generate.js.map +0 -1
- package/dist/adapters/kysely/kysely-adapter.d.ts +0 -19
- package/dist/adapters/kysely/kysely-adapter.d.ts.map +0 -1
- package/dist/adapters/kysely/kysely-adapter.js +0 -17
- package/dist/adapters/kysely/kysely-adapter.js.map +0 -1
- package/dist/adapters/shared/table-name-mapper.d.ts +0 -12
- package/dist/adapters/shared/table-name-mapper.d.ts.map +0 -1
- package/dist/adapters/shared/table-name-mapper.js +0 -43
- package/dist/adapters/shared/table-name-mapper.js.map +0 -1
- package/dist/node_modules/.pnpm/rou3@0.7.10/node_modules/rou3/dist/index.js.map +0 -1
- package/dist/schema-generator/schema-generator.d.ts +0 -15
- package/dist/schema-generator/schema-generator.d.ts.map +0 -1
- package/src/adapters/drizzle/drizzle-adapter.ts +0 -39
- package/src/adapters/kysely/kysely-adapter.ts +0 -27
- package/src/adapters/shared/table-name-mapper.ts +0 -50
- package/src/schema-generator/schema-generator.ts +0 -12
- package/src/shared/config.ts +0 -10
- package/src/shared/connection-pool.ts +0 -24
- package/src/shared/prisma.ts +0 -45
|
@@ -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 {
|
|
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 +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":";;;;;;;;AAuDc,UAvCG,cAAA,CAuCH;EACT;;;;EAsB0F,wBAAA,CAAA,EAAA,OAAA;;;;;;UAlD9E,kBAAA;;;;;;;;;;;;6DAY4C,iBAAiB;;;;;;;;;;4BAYlE,qEAGE,iBACT;;;;;;;;;;4DAWuD;;;;;;;;;;6DAWC,iBAAiB"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { generateMigrationFromSchema } from "../../../migration-engine/auto-from-schema.js";
|
|
2
1
|
import { createColdKysely } from "./cold-kysely.js";
|
|
2
|
+
import { generateMigrationFromSchema } from "../../../migration-engine/auto-from-schema.js";
|
|
3
3
|
import "./sql-generator.js";
|
|
4
4
|
import { SQLiteSQLGenerator } from "./dialect/sqlite.js";
|
|
5
5
|
import { PostgresSQLGenerator } from "./dialect/postgres.js";
|
|
@@ -11,8 +11,8 @@ import { executeMigration } from "./executor.js";
|
|
|
11
11
|
* Create a PreparedMigrations instance for a schema and namespace.
|
|
12
12
|
*/
|
|
13
13
|
function createPreparedMigrations(config) {
|
|
14
|
-
const { schema, namespace, database, driver, updateVersionInMigration: defaultUpdateVersion = true } = config;
|
|
15
|
-
const generator = createSQLGenerator(database, createColdKysely(database));
|
|
14
|
+
const { schema, namespace, database, driverConfig, sqliteStorageMode, driver, updateVersionInMigration: defaultUpdateVersion = true } = config;
|
|
15
|
+
const generator = createSQLGenerator(database, createColdKysely(database), driverConfig, sqliteStorageMode);
|
|
16
16
|
/**
|
|
17
17
|
* Internal method to compile a migration for a given version range.
|
|
18
18
|
*/
|
|
@@ -22,7 +22,7 @@ function createPreparedMigrations(config) {
|
|
|
22
22
|
if (toVersion < fromVersion) throw new Error(`Cannot migrate backwards: fromVersion (${fromVersion}) > toVersion (${toVersion})`);
|
|
23
23
|
if (toVersion > schema.version) throw new Error(`toVersion (${toVersion}) exceeds schema version (${schema.version})`);
|
|
24
24
|
const operations = generateMigrationFromSchema(schema, fromVersion, toVersion);
|
|
25
|
-
const statements = generator.compile(operations, config.
|
|
25
|
+
const statements = generator.compile(operations, config.resolver);
|
|
26
26
|
if (updateVersionInMigration && toVersion !== fromVersion) {
|
|
27
27
|
const versionUpdate = generator.generateVersionUpdateSQL(namespace, fromVersion, toVersion);
|
|
28
28
|
statements.push(versionUpdate);
|
|
@@ -55,11 +55,11 @@ function createPreparedMigrations(config) {
|
|
|
55
55
|
/**
|
|
56
56
|
* Create the appropriate SQL generator for a database type.
|
|
57
57
|
*/
|
|
58
|
-
function createSQLGenerator(database, coldKysely) {
|
|
58
|
+
function createSQLGenerator(database, coldKysely, driverConfig, sqliteStorageMode) {
|
|
59
59
|
switch (database) {
|
|
60
|
-
case "sqlite": return new SQLiteSQLGenerator(coldKysely, database);
|
|
61
|
-
case "postgresql": return new PostgresSQLGenerator(coldKysely, database);
|
|
62
|
-
case "mysql": return new MySQLSQLGenerator(coldKysely, database);
|
|
60
|
+
case "sqlite": return new SQLiteSQLGenerator(coldKysely, database, driverConfig, sqliteStorageMode);
|
|
61
|
+
case "postgresql": return new PostgresSQLGenerator(coldKysely, database, driverConfig, sqliteStorageMode);
|
|
62
|
+
case "mysql": return new MySQLSQLGenerator(coldKysely, database, driverConfig, sqliteStorageMode);
|
|
63
63
|
}
|
|
64
64
|
}
|
|
65
65
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prepared-migrations.js","names":[],"sources":["../../../../src/adapters/generic-sql/migration/prepared-migrations.ts"],"sourcesContent":["import type { AnySchema } from \"../../../schema/create\";\nimport type { SqlDriverAdapter } from \"../../../sql-driver/sql-driver-adapter\";\nimport type {
|
|
1
|
+
{"version":3,"file":"prepared-migrations.js","names":[],"sources":["../../../../src/adapters/generic-sql/migration/prepared-migrations.ts"],"sourcesContent":["import type { AnySchema } from \"../../../schema/create\";\nimport type { SqlDriverAdapter } from \"../../../sql-driver/sql-driver-adapter\";\nimport type { NamingResolver } from \"../../../naming/sql-naming\";\nimport { generateMigrationFromSchema } from \"../../../migration-engine/auto-from-schema\";\nimport { createColdKysely } from \"./cold-kysely\";\nimport { type SQLGenerator } from \"./sql-generator\";\nimport { SQLiteSQLGenerator } from \"./dialect/sqlite\";\nimport { PostgresSQLGenerator } from \"./dialect/postgres\";\nimport { MySQLSQLGenerator } from \"./dialect/mysql\";\nimport { executeMigration, type CompiledMigration } from \"./executor\";\nimport type { DriverConfig, SupportedDatabase } from \"../driver-config\";\nimport type { Kysely } from \"kysely\";\nimport type { SQLiteStorageMode } from \"../sqlite-storage\";\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":";;;;;;;;;;;;AAsGA,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,4 +1,4 @@
|
|
|
1
|
-
import { SETTINGS_TABLE_NAME } from "../../../fragments/internal-fragment.js";
|
|
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
3
|
import { sql } from "kysely";
|
|
4
4
|
import { createHash } from "node:crypto";
|
|
@@ -12,10 +12,12 @@ var SQLGenerator = class {
|
|
|
12
12
|
db;
|
|
13
13
|
database;
|
|
14
14
|
typeMapper;
|
|
15
|
-
|
|
15
|
+
driverConfig;
|
|
16
|
+
constructor(db, database, driverConfig, sqliteStorageMode) {
|
|
16
17
|
this.db = db;
|
|
17
18
|
this.database = database;
|
|
18
|
-
this.typeMapper = createSQLTypeMapper(database);
|
|
19
|
+
this.typeMapper = createSQLTypeMapper(database, sqliteStorageMode);
|
|
20
|
+
this.driverConfig = driverConfig;
|
|
19
21
|
}
|
|
20
22
|
/**
|
|
21
23
|
* Generate SQL for updating the schema version in the settings table.
|
|
@@ -36,11 +38,13 @@ var SQLGenerator = class {
|
|
|
36
38
|
* Compile migration operations to SQL statements.
|
|
37
39
|
* This is the main entry point for SQL generation.
|
|
38
40
|
*/
|
|
39
|
-
compile(operations,
|
|
41
|
+
compile(operations, resolver) {
|
|
40
42
|
const preprocessed = this.preprocess(operations);
|
|
41
43
|
const queries = [];
|
|
44
|
+
const schemaName = resolver?.getSchemaName();
|
|
45
|
+
if (schemaName && this.database === "postgresql") queries.push(sql`CREATE SCHEMA IF NOT EXISTS ${sql.id(schemaName)}`.compile(this.db));
|
|
42
46
|
for (const operation of preprocessed) {
|
|
43
|
-
const compiled = this.compileOperation(operation,
|
|
47
|
+
const compiled = this.compileOperation(operation, resolver);
|
|
44
48
|
if (Array.isArray(compiled)) queries.push(...compiled);
|
|
45
49
|
else queries.push(compiled);
|
|
46
50
|
}
|
|
@@ -49,16 +53,16 @@ var SQLGenerator = class {
|
|
|
49
53
|
/**
|
|
50
54
|
* Compile a single migration operation to SQL.
|
|
51
55
|
*/
|
|
52
|
-
compileOperation(operation,
|
|
56
|
+
compileOperation(operation, resolver) {
|
|
53
57
|
switch (operation.type) {
|
|
54
|
-
case "create-table": return this.compileCreateTable(operation,
|
|
55
|
-
case "rename-table": return this.compileRenameTable(operation,
|
|
56
|
-
case "alter-table": return this.compileAlterTable(operation,
|
|
57
|
-
case "drop-table": return this.compileDropTable(operation,
|
|
58
|
-
case "add-foreign-key": return this.compileAddForeignKey(operation,
|
|
59
|
-
case "drop-foreign-key": return this.compileDropForeignKey(operation,
|
|
60
|
-
case "add-index": return this.compileAddIndex(operation,
|
|
61
|
-
case "drop-index": return this.compileDropIndex(operation,
|
|
58
|
+
case "create-table": return this.compileCreateTable(operation, resolver);
|
|
59
|
+
case "rename-table": return this.compileRenameTable(operation, resolver);
|
|
60
|
+
case "alter-table": return this.compileAlterTable(operation, resolver);
|
|
61
|
+
case "drop-table": return this.compileDropTable(operation, resolver);
|
|
62
|
+
case "add-foreign-key": return this.compileAddForeignKey(operation, resolver);
|
|
63
|
+
case "drop-foreign-key": return this.compileDropForeignKey(operation, resolver);
|
|
64
|
+
case "add-index": return this.compileAddIndex(operation, resolver);
|
|
65
|
+
case "drop-index": return this.compileDropIndex(operation, resolver);
|
|
62
66
|
case "custom": return this.compileCustom(operation);
|
|
63
67
|
}
|
|
64
68
|
}
|
|
@@ -66,34 +70,37 @@ var SQLGenerator = class {
|
|
|
66
70
|
* Compile a create-table operation.
|
|
67
71
|
* Subclasses can override to add FK constraints inline (e.g., SQLite).
|
|
68
72
|
*/
|
|
69
|
-
compileCreateTable(operation,
|
|
70
|
-
const tableName = this.getTableName(operation.name,
|
|
71
|
-
let builder = this.
|
|
72
|
-
for (const col of operation.columns)
|
|
73
|
-
|
|
73
|
+
compileCreateTable(operation, resolver) {
|
|
74
|
+
const tableName = this.getTableName(operation.name, resolver);
|
|
75
|
+
let builder = this.getSchemaBuilder(resolver).createTable(tableName);
|
|
76
|
+
for (const col of operation.columns) {
|
|
77
|
+
const columnName = this.getColumnName(col.name, operation.name, resolver);
|
|
78
|
+
builder = builder.addColumn(columnName, sql.raw(this.getDBType(col)), (b) => this.buildColumn(col, b));
|
|
79
|
+
}
|
|
80
|
+
builder = this.addInlineForeignKeys(builder, operation, resolver);
|
|
74
81
|
return builder.compile();
|
|
75
82
|
}
|
|
76
83
|
/**
|
|
77
84
|
* Hook for subclasses to add inline foreign keys to create-table.
|
|
78
85
|
* SQLite overrides this to add FKs at table creation time.
|
|
79
86
|
*/
|
|
80
|
-
addInlineForeignKeys(builder, _operation,
|
|
87
|
+
addInlineForeignKeys(builder, _operation, _resolver) {
|
|
81
88
|
return builder;
|
|
82
89
|
}
|
|
83
90
|
/**
|
|
84
91
|
* Compile a rename-table operation.
|
|
85
92
|
*/
|
|
86
|
-
compileRenameTable(operation,
|
|
87
|
-
return this.
|
|
93
|
+
compileRenameTable(operation, resolver) {
|
|
94
|
+
return this.getSchemaBuilder(resolver).alterTable(this.getTableName(operation.from, resolver)).renameTo(this.getTableName(operation.to, resolver)).compile();
|
|
88
95
|
}
|
|
89
96
|
/**
|
|
90
97
|
* Compile an alter-table operation.
|
|
91
98
|
*/
|
|
92
|
-
compileAlterTable(operation,
|
|
99
|
+
compileAlterTable(operation, resolver) {
|
|
93
100
|
const queries = [];
|
|
94
|
-
const tableName = this.getTableName(operation.name,
|
|
101
|
+
const tableName = this.getTableName(operation.name, resolver);
|
|
95
102
|
for (const columnOp of operation.value) {
|
|
96
|
-
const compiled = this.compileColumnOperation(tableName, columnOp);
|
|
103
|
+
const compiled = this.compileColumnOperation(tableName, operation.name, columnOp, resolver);
|
|
97
104
|
if (Array.isArray(compiled)) queries.push(...compiled);
|
|
98
105
|
else queries.push(compiled);
|
|
99
106
|
}
|
|
@@ -103,57 +110,58 @@ var SQLGenerator = class {
|
|
|
103
110
|
* Compile a column operation within an alter-table.
|
|
104
111
|
* Subclasses override for database-specific handling (e.g., MySQL's modifyColumn).
|
|
105
112
|
*/
|
|
106
|
-
compileColumnOperation(tableName, operation) {
|
|
107
|
-
const alter = () => this.
|
|
113
|
+
compileColumnOperation(tableName, logicalTableName, operation, resolver) {
|
|
114
|
+
const alter = () => this.getSchemaBuilder(resolver).alterTable(tableName);
|
|
108
115
|
switch (operation.type) {
|
|
109
|
-
case "rename-column": return alter().renameColumn(operation.from, operation.to).compile();
|
|
110
|
-
case "drop-column": return alter().dropColumn(operation.name).compile();
|
|
116
|
+
case "rename-column": return alter().renameColumn(this.getColumnName(operation.from, logicalTableName, resolver), this.getColumnName(operation.to, logicalTableName, resolver)).compile();
|
|
117
|
+
case "drop-column": return alter().dropColumn(this.getColumnName(operation.name, logicalTableName, resolver)).compile();
|
|
111
118
|
case "create-column": {
|
|
112
119
|
const col = operation.value;
|
|
113
|
-
return alter().addColumn(col.name, sql.raw(this.getDBType(col)), (b) => this.buildColumn(col, b)).compile();
|
|
120
|
+
return alter().addColumn(this.getColumnName(col.name, logicalTableName, resolver), sql.raw(this.getDBType(col)), (b) => this.buildColumn(col, b)).compile();
|
|
114
121
|
}
|
|
115
|
-
case "update-column": return this.compileUpdateColumn(tableName, operation);
|
|
122
|
+
case "update-column": return this.compileUpdateColumn(tableName, logicalTableName, operation, resolver);
|
|
116
123
|
}
|
|
117
124
|
}
|
|
118
125
|
/**
|
|
119
126
|
* Compile a drop-table operation.
|
|
120
127
|
*/
|
|
121
|
-
compileDropTable(operation,
|
|
122
|
-
return this.
|
|
128
|
+
compileDropTable(operation, resolver) {
|
|
129
|
+
return this.getSchemaBuilder(resolver).dropTable(this.getTableName(operation.name, resolver)).compile();
|
|
123
130
|
}
|
|
124
131
|
/**
|
|
125
132
|
* Compile an add-foreign-key operation.
|
|
126
133
|
* Subclasses can throw if not supported (e.g., SQLite).
|
|
127
134
|
*/
|
|
128
|
-
compileAddForeignKey(operation,
|
|
135
|
+
compileAddForeignKey(operation, resolver) {
|
|
129
136
|
const { table, value } = operation;
|
|
130
|
-
return this.
|
|
137
|
+
return this.getSchemaBuilder(resolver).alterTable(this.getTableName(table, resolver)).addForeignKeyConstraint(this.getForeignKeyName(value.name, table, value.referencedTable, resolver), value.columns.map((columnName) => this.getColumnName(columnName, table, resolver)), this.getTableName(value.referencedTable, resolver), value.referencedColumns.map((columnName) => this.getColumnName(columnName, value.referencedTable, resolver)), (b) => b.onUpdate("restrict").onDelete("restrict")).compile();
|
|
131
138
|
}
|
|
132
139
|
/**
|
|
133
140
|
* Compile a drop-foreign-key operation.
|
|
134
141
|
* Subclasses can throw if not supported (e.g., SQLite).
|
|
135
142
|
*/
|
|
136
|
-
compileDropForeignKey(operation,
|
|
137
|
-
const { table, name } = operation;
|
|
138
|
-
return this.
|
|
143
|
+
compileDropForeignKey(operation, resolver) {
|
|
144
|
+
const { table, name, referencedTable } = operation;
|
|
145
|
+
return this.getSchemaBuilder(resolver).alterTable(this.getTableName(table, resolver)).dropConstraint(this.getForeignKeyName(name, table, referencedTable, resolver)).ifExists().compile();
|
|
139
146
|
}
|
|
140
147
|
/**
|
|
141
148
|
* Compile an add-index operation.
|
|
142
149
|
*/
|
|
143
|
-
compileAddIndex(operation,
|
|
144
|
-
const tableName = this.getTableName(operation.table,
|
|
145
|
-
const indexName = this.getIndexName(operation.name, operation.table,
|
|
146
|
-
|
|
150
|
+
compileAddIndex(operation, resolver) {
|
|
151
|
+
const tableName = this.getTableName(operation.table, resolver);
|
|
152
|
+
const indexName = this.getIndexName(operation.name, operation.table, resolver, operation.unique);
|
|
153
|
+
const columnNames = operation.columns.map((columnName) => this.getColumnName(columnName, operation.table, resolver));
|
|
154
|
+
let builder = this.getSchemaBuilder(resolver).createIndex(indexName).on(tableName).columns(columnNames);
|
|
147
155
|
if (operation.unique) builder = builder.unique();
|
|
148
156
|
return builder.compile();
|
|
149
157
|
}
|
|
150
158
|
/**
|
|
151
159
|
* Compile a drop-index operation.
|
|
152
160
|
*/
|
|
153
|
-
compileDropIndex(operation,
|
|
154
|
-
const tableName = this.getTableName(operation.table,
|
|
155
|
-
const indexName = this.getIndexName(operation.name, operation.table,
|
|
156
|
-
return this.
|
|
161
|
+
compileDropIndex(operation, resolver) {
|
|
162
|
+
const tableName = this.getTableName(operation.table, resolver);
|
|
163
|
+
const indexName = this.getIndexName(operation.name, operation.table, resolver);
|
|
164
|
+
return this.getSchemaBuilder(resolver).dropIndex(indexName).ifExists().on(tableName).compile();
|
|
157
165
|
}
|
|
158
166
|
/**
|
|
159
167
|
* Compile a custom SQL operation.
|
|
@@ -180,18 +188,33 @@ var SQLGenerator = class {
|
|
|
180
188
|
* Get table name, applying namespace mapping if provided.
|
|
181
189
|
* Settings table is never namespaced.
|
|
182
190
|
*/
|
|
183
|
-
getTableName(tableName,
|
|
191
|
+
getTableName(tableName, resolver) {
|
|
184
192
|
if (tableName === SETTINGS_TABLE_NAME) return tableName;
|
|
185
|
-
return
|
|
193
|
+
return resolver ? resolver.getTableName(tableName) : tableName;
|
|
186
194
|
}
|
|
187
195
|
/**
|
|
188
196
|
* Get the physical index name, applying namespace if a mapper is provided.
|
|
189
197
|
* Index names must be globally unique in most databases, so we namespace them
|
|
190
198
|
* to avoid collisions when multiple fragments use the same logical index names.
|
|
191
199
|
*/
|
|
192
|
-
getIndexName(indexName, tableName,
|
|
193
|
-
if (!
|
|
194
|
-
return
|
|
200
|
+
getIndexName(indexName, tableName, resolver, unique) {
|
|
201
|
+
if (!resolver) return indexName;
|
|
202
|
+
return unique ? resolver.getUniqueIndexName(indexName, tableName) : resolver.getIndexName(indexName, tableName);
|
|
203
|
+
}
|
|
204
|
+
getForeignKeyName(name, tableName, referencedTable, resolver) {
|
|
205
|
+
if (!resolver) return name;
|
|
206
|
+
return resolver.getForeignKeyName({
|
|
207
|
+
logicalTable: tableName,
|
|
208
|
+
logicalReferencedTable: referencedTable || tableName,
|
|
209
|
+
referenceName: name
|
|
210
|
+
});
|
|
211
|
+
}
|
|
212
|
+
getColumnName(columnName, tableName, resolver) {
|
|
213
|
+
return resolver ? resolver.getColumnName(tableName, columnName) : columnName;
|
|
214
|
+
}
|
|
215
|
+
getSchemaBuilder(resolver) {
|
|
216
|
+
const schemaName = resolver?.getSchemaName();
|
|
217
|
+
return schemaName ? this.db.schema.withSchema(schemaName) : this.db.schema;
|
|
195
218
|
}
|
|
196
219
|
/**
|
|
197
220
|
* Get the database type string for a column.
|
|
@@ -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\";\nimport type { TableNameMapper } from \"../../shared/table-name-mapper\";\nimport type { SupportedDatabase } from \"../driver-config\";\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\n constructor(db: KyselyAny, database: SupportedDatabase) {\n this.db = db;\n this.database = database;\n this.typeMapper = createSQLTypeMapper(database);\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[], mapper?: TableNameMapper): CompiledQuery[] {\n const preprocessed = this.preprocess(operations);\n const queries: CompiledQuery[] = [];\n\n for (const operation of preprocessed) {\n const compiled = this.compileOperation(operation, mapper);\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 mapper?: TableNameMapper,\n ): CompiledQuery | CompiledQuery[] {\n switch (operation.type) {\n case \"create-table\":\n return this.compileCreateTable(operation, mapper);\n case \"rename-table\":\n return this.compileRenameTable(operation, mapper);\n case \"alter-table\":\n return this.compileAlterTable(operation, mapper);\n case \"drop-table\":\n return this.compileDropTable(operation, mapper);\n case \"add-foreign-key\":\n return this.compileAddForeignKey(operation, mapper);\n case \"drop-foreign-key\":\n return this.compileDropForeignKey(operation, mapper);\n case \"add-index\":\n return this.compileAddIndex(operation, mapper);\n case \"drop-index\":\n return this.compileDropIndex(operation, mapper);\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 mapper?: TableNameMapper,\n ): CompiledQuery {\n const tableName = this.getTableName(operation.name, mapper);\n let builder: CreateTableBuilderAny = this.db.schema.createTable(tableName);\n\n for (const col of operation.columns) {\n builder = builder.addColumn(col.name, 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, mapper);\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 _mapper?: TableNameMapper,\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 mapper?: TableNameMapper,\n ): CompiledQuery {\n return this.db.schema\n .alterTable(this.getTableName(operation.from, mapper))\n .renameTo(this.getTableName(operation.to, mapper))\n .compile();\n }\n\n /**\n * Compile an alter-table operation.\n */\n protected compileAlterTable(\n operation: Extract<MigrationOperation, { type: \"alter-table\" }>,\n mapper?: TableNameMapper,\n ): CompiledQuery[] {\n const queries: CompiledQuery[] = [];\n const tableName = this.getTableName(operation.name, mapper);\n\n for (const columnOp of operation.value) {\n const compiled = this.compileColumnOperation(tableName, columnOp);\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 operation: ColumnOperation,\n ): CompiledQuery | CompiledQuery[] {\n const alter = () => this.db.schema.alterTable(tableName);\n\n switch (operation.type) {\n case \"rename-column\":\n return alter().renameColumn(operation.from, operation.to).compile();\n\n case \"drop-column\":\n return alter().dropColumn(operation.name).compile();\n\n case \"create-column\": {\n const col = operation.value;\n return alter()\n .addColumn(col.name, sql.raw(this.getDBType(col)), (b) => this.buildColumn(col, b))\n .compile();\n }\n\n case \"update-column\":\n return this.compileUpdateColumn(tableName, operation);\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 operation: Extract<ColumnOperation, { type: \"update-column\" }>,\n ): CompiledQuery | CompiledQuery[];\n\n /**\n * Compile a drop-table operation.\n */\n protected compileDropTable(\n operation: Extract<MigrationOperation, { type: \"drop-table\" }>,\n mapper?: TableNameMapper,\n ): CompiledQuery {\n return this.db.schema.dropTable(this.getTableName(operation.name, mapper)).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 mapper?: TableNameMapper,\n ): CompiledQuery {\n const { table, value } = operation;\n return this.db.schema\n .alterTable(this.getTableName(table, mapper))\n .addForeignKeyConstraint(\n value.name,\n value.columns,\n this.getTableName(value.referencedTable, mapper),\n value.referencedColumns,\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 mapper?: TableNameMapper,\n ): CompiledQuery {\n const { table, name } = operation;\n return this.db.schema\n .alterTable(this.getTableName(table, mapper))\n .dropConstraint(name)\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 mapper?: TableNameMapper,\n ): CompiledQuery {\n const tableName = this.getTableName(operation.table, mapper);\n const indexName = this.getIndexName(operation.name, operation.table, mapper);\n let builder = this.db.schema.createIndex(indexName).on(tableName).columns(operation.columns);\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 mapper?: TableNameMapper,\n ): CompiledQuery {\n const tableName = this.getTableName(operation.table, mapper);\n const indexName = this.getIndexName(operation.name, operation.table, mapper);\n return this.db.schema.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, mapper?: TableNameMapper): string {\n if (tableName === SETTINGS_TABLE_NAME) {\n return tableName;\n }\n return mapper ? mapper.toPhysical(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(indexName: string, tableName: string, mapper?: TableNameMapper): string {\n if (!mapper) {\n return indexName;\n }\n // Create a unique index name by including the physical table name\n // This ensures index names are unique across namespaces\n const physicalTable = mapper.toPhysical(tableName);\n return `${indexName}_${physicalTable}`;\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 {\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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"}
|
|
@@ -12,14 +12,15 @@ import { SQLiteQueryCompiler } from "./dialect/sqlite.js";
|
|
|
12
12
|
*
|
|
13
13
|
* @param db - Kysely database instance
|
|
14
14
|
* @param driverConfig - Driver configuration with database type and capabilities
|
|
15
|
-
* @param
|
|
15
|
+
* @param sqliteStorageMode - Optional SQLite storage mode override
|
|
16
|
+
* @param resolver - Optional naming resolver for namespace prefixing
|
|
16
17
|
* @returns Dialect-specific SQLQueryCompiler instance
|
|
17
18
|
*/
|
|
18
|
-
function createSQLQueryCompiler(db, driverConfig,
|
|
19
|
+
function createSQLQueryCompiler(db, driverConfig, sqliteStorageMode, resolver) {
|
|
19
20
|
switch (driverConfig.databaseType) {
|
|
20
|
-
case "postgresql": return new PostgreSQLQueryCompiler(db, driverConfig,
|
|
21
|
-
case "mysql": return new MySQLQueryCompiler(db, driverConfig,
|
|
22
|
-
case "sqlite": return new SQLiteQueryCompiler(db, driverConfig,
|
|
21
|
+
case "postgresql": return new PostgreSQLQueryCompiler(db, driverConfig, sqliteStorageMode, resolver);
|
|
22
|
+
case "mysql": return new MySQLQueryCompiler(db, driverConfig, sqliteStorageMode, resolver);
|
|
23
|
+
case "sqlite": return new SQLiteQueryCompiler(db, driverConfig, sqliteStorageMode, resolver);
|
|
23
24
|
default: {
|
|
24
25
|
const exhaustiveCheck = driverConfig.databaseType;
|
|
25
26
|
throw new Error(`Unsupported database type: ${exhaustiveCheck}`);
|
|
@@ -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 { DriverConfig } from \"../driver-config\";\nimport 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 { DriverConfig } from \"../driver-config\";\nimport type { NamingResolver } from \"../../../naming/sql-naming\";\nimport type { SQLiteStorageMode } from \"../sqlite-storage\";\nimport { SQLQueryCompiler, type AnyKysely } from \"./sql-query-compiler\";\nimport { PostgreSQLQueryCompiler } from \"./dialect/postgres\";\nimport { MySQLQueryCompiler } from \"./dialect/mysql\";\nimport { SQLiteQueryCompiler } from \"./dialect/sqlite\";\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"}
|
|
@@ -13,23 +13,61 @@ import { decodeCursor, serializeCursorValues } from "../../../query/cursor.js";
|
|
|
13
13
|
* @param orderDirection - Direction of ordering (asc/desc)
|
|
14
14
|
* @param isAfter - True for "after" cursor (forward pagination), false for "before" (backward)
|
|
15
15
|
* @param driverConfig - The driver configuration for value serialization
|
|
16
|
+
* @param sqliteStorageMode - Optional SQLite storage mode for date/bigint serialization
|
|
16
17
|
* @returns A Condition object for the cursor, or undefined if no cursor
|
|
17
18
|
* @throws Error if multi-column cursors are not supported by the implementation
|
|
18
19
|
*/
|
|
19
|
-
function buildCursorCondition(cursor, indexColumns, orderDirection, isAfter, driverConfig) {
|
|
20
|
+
function buildCursorCondition(cursor, indexColumns, orderDirection, isAfter, driverConfig, sqliteStorageMode) {
|
|
20
21
|
if (!cursor || indexColumns.length === 0) return;
|
|
21
|
-
const serializedValues = serializeCursorValues(typeof cursor === "string" ? decodeCursor(cursor) : cursor, indexColumns, driverConfig);
|
|
22
|
+
const serializedValues = serializeCursorValues(typeof cursor === "string" ? decodeCursor(cursor) : cursor, indexColumns, driverConfig, sqliteStorageMode);
|
|
22
23
|
const useGreaterThan = isAfter && orderDirection === "asc" || !isAfter && orderDirection === "desc";
|
|
23
24
|
if (indexColumns.length === 1) {
|
|
24
25
|
const col = indexColumns[0];
|
|
25
|
-
const val = serializedValues[col.
|
|
26
|
+
const val = serializedValues[col.name];
|
|
26
27
|
return {
|
|
27
28
|
type: "compare",
|
|
28
29
|
a: col,
|
|
29
30
|
operator: useGreaterThan ? ">" : "<",
|
|
30
31
|
b: val
|
|
31
32
|
};
|
|
32
|
-
}
|
|
33
|
+
}
|
|
34
|
+
const operator = useGreaterThan ? ">" : "<";
|
|
35
|
+
const orConditions = [];
|
|
36
|
+
const isNullish = (value) => value === null || value === void 0;
|
|
37
|
+
const buildEqualityCondition = (column, value) => isNullish(value) ? {
|
|
38
|
+
type: "compare",
|
|
39
|
+
a: column,
|
|
40
|
+
operator: "is",
|
|
41
|
+
b: null
|
|
42
|
+
} : {
|
|
43
|
+
type: "compare",
|
|
44
|
+
a: column,
|
|
45
|
+
operator: "=",
|
|
46
|
+
b: value
|
|
47
|
+
};
|
|
48
|
+
for (let i = 0; i < indexColumns.length; i += 1) {
|
|
49
|
+
const col = indexColumns[i];
|
|
50
|
+
const val = serializedValues[col.name];
|
|
51
|
+
const andItems = [];
|
|
52
|
+
for (let j = 0; j < i; j += 1) {
|
|
53
|
+
const prevCol = indexColumns[j];
|
|
54
|
+
andItems.push(buildEqualityCondition(prevCol, serializedValues[prevCol.name]));
|
|
55
|
+
}
|
|
56
|
+
andItems.push({
|
|
57
|
+
type: "compare",
|
|
58
|
+
a: col,
|
|
59
|
+
operator,
|
|
60
|
+
b: val
|
|
61
|
+
});
|
|
62
|
+
orConditions.push(andItems.length === 1 ? andItems[0] : {
|
|
63
|
+
type: "and",
|
|
64
|
+
items: andItems
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
return {
|
|
68
|
+
type: "or",
|
|
69
|
+
items: orConditions
|
|
70
|
+
};
|
|
33
71
|
}
|
|
34
72
|
|
|
35
73
|
//#endregion
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cursor-utils.js","names":[],"sources":["../../../../src/adapters/generic-sql/query/cursor-utils.ts"],"sourcesContent":["import type { AnyColumn } from \"../../../schema/create\";\nimport type { Condition } from \"../../../query/condition-builder\";\nimport { decodeCursor, serializeCursorValues, type Cursor } from \"../../../query/cursor\";\nimport type { DriverConfig } from \"../driver-config\";\n\n/**\n * Build a cursor condition for pagination.\n *\n * Handles both single-column and multi-column cursor comparisons.\n * For single columns: uses simple comparison (col > value)\n * For multi-columns: builds tuple comparison ((col1, col2) > (val1, val2))\n *\n * @param cursor - The cursor string or object\n * @param indexColumns - Columns used in the index for ordering\n * @param orderDirection - Direction of ordering (asc/desc)\n * @param isAfter - True for \"after\" cursor (forward pagination), false for \"before\" (backward)\n * @param driverConfig - The driver configuration for value serialization\n * @returns A Condition object for the cursor, or undefined if no cursor\n * @throws Error if multi-column cursors are not supported by the implementation\n */\nexport function buildCursorCondition(\n cursor: string | Cursor | undefined,\n indexColumns: AnyColumn[],\n orderDirection: \"asc\" | \"desc\",\n isAfter: boolean,\n driverConfig: DriverConfig,\n): Condition | undefined {\n if (!cursor || indexColumns.length === 0) {\n return undefined;\n }\n\n // Decode cursor if it's a string, otherwise use it as-is\n const cursorObj = typeof cursor === \"string\" ? decodeCursor(cursor) : cursor;\n const serializedValues = serializeCursorValues(cursorObj
|
|
1
|
+
{"version":3,"file":"cursor-utils.js","names":["orConditions: Condition[]","andItems: Condition[]"],"sources":["../../../../src/adapters/generic-sql/query/cursor-utils.ts"],"sourcesContent":["import type { AnyColumn } from \"../../../schema/create\";\nimport type { Condition } from \"../../../query/condition-builder\";\nimport { decodeCursor, serializeCursorValues, type Cursor } from \"../../../query/cursor\";\nimport type { DriverConfig } from \"../driver-config\";\nimport type { SQLiteStorageMode } from \"../sqlite-storage\";\n\n/**\n * Build a cursor condition for pagination.\n *\n * Handles both single-column and multi-column cursor comparisons.\n * For single columns: uses simple comparison (col > value)\n * For multi-columns: builds tuple comparison ((col1, col2) > (val1, val2))\n *\n * @param cursor - The cursor string or object\n * @param indexColumns - Columns used in the index for ordering\n * @param orderDirection - Direction of ordering (asc/desc)\n * @param isAfter - True for \"after\" cursor (forward pagination), false for \"before\" (backward)\n * @param driverConfig - The driver configuration for value serialization\n * @param sqliteStorageMode - Optional SQLite storage mode for date/bigint serialization\n * @returns A Condition object for the cursor, or undefined if no cursor\n * @throws Error if multi-column cursors are not supported by the implementation\n */\nexport function buildCursorCondition(\n cursor: string | Cursor | undefined,\n indexColumns: AnyColumn[],\n orderDirection: \"asc\" | \"desc\",\n isAfter: boolean,\n driverConfig: DriverConfig,\n sqliteStorageMode?: SQLiteStorageMode,\n): Condition | undefined {\n if (!cursor || indexColumns.length === 0) {\n return undefined;\n }\n\n // Decode cursor if it's a string, otherwise use it as-is\n const cursorObj = typeof cursor === \"string\" ? decodeCursor(cursor) : cursor;\n const serializedValues = serializeCursorValues(\n cursorObj,\n indexColumns,\n driverConfig,\n sqliteStorageMode,\n );\n\n // Determine comparison operator based on direction and after/before\n const useGreaterThan =\n (isAfter && orderDirection === \"asc\") || (!isAfter && orderDirection === \"desc\");\n\n if (indexColumns.length === 1) {\n // Simple single-column case\n const col = indexColumns[0]!;\n const val = serializedValues[col.name];\n const operator = useGreaterThan ? \">\" : \"<\";\n return {\n type: \"compare\",\n a: col,\n operator,\n b: val,\n };\n }\n\n const operator = useGreaterThan ? \">\" : \"<\";\n const orConditions: Condition[] = [];\n const isNullish = (value: unknown): value is null | undefined =>\n value === null || value === undefined;\n const buildEqualityCondition = (column: AnyColumn, value: unknown): Condition =>\n isNullish(value)\n ? { type: \"compare\", a: column, operator: \"is\", b: null }\n : { type: \"compare\", a: column, operator: \"=\", b: value };\n\n for (let i = 0; i < indexColumns.length; i += 1) {\n const col = indexColumns[i]!;\n const val = serializedValues[col.name];\n const andItems: Condition[] = [];\n\n for (let j = 0; j < i; j += 1) {\n const prevCol = indexColumns[j]!;\n andItems.push(buildEqualityCondition(prevCol, serializedValues[prevCol.name]));\n }\n\n andItems.push({\n type: \"compare\",\n a: col,\n operator,\n b: val,\n });\n\n orConditions.push(andItems.length === 1 ? andItems[0]! : { type: \"and\", items: andItems });\n }\n\n return { type: \"or\", items: orConditions };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAsBA,SAAgB,qBACd,QACA,cACA,gBACA,SACA,cACA,mBACuB;AACvB,KAAI,CAAC,UAAU,aAAa,WAAW,EACrC;CAKF,MAAM,mBAAmB,sBADP,OAAO,WAAW,WAAW,aAAa,OAAO,GAAG,QAGpE,cACA,cACA,kBACD;CAGD,MAAM,iBACH,WAAW,mBAAmB,SAAW,CAAC,WAAW,mBAAmB;AAE3E,KAAI,aAAa,WAAW,GAAG;EAE7B,MAAM,MAAM,aAAa;EACzB,MAAM,MAAM,iBAAiB,IAAI;AAEjC,SAAO;GACL,MAAM;GACN,GAAG;GACH,UAJe,iBAAiB,MAAM;GAKtC,GAAG;GACJ;;CAGH,MAAM,WAAW,iBAAiB,MAAM;CACxC,MAAMA,eAA4B,EAAE;CACpC,MAAM,aAAa,UACjB,UAAU,QAAQ,UAAU;CAC9B,MAAM,0BAA0B,QAAmB,UACjD,UAAU,MAAM,GACZ;EAAE,MAAM;EAAW,GAAG;EAAQ,UAAU;EAAM,GAAG;EAAM,GACvD;EAAE,MAAM;EAAW,GAAG;EAAQ,UAAU;EAAK,GAAG;EAAO;AAE7D,MAAK,IAAI,IAAI,GAAG,IAAI,aAAa,QAAQ,KAAK,GAAG;EAC/C,MAAM,MAAM,aAAa;EACzB,MAAM,MAAM,iBAAiB,IAAI;EACjC,MAAMC,WAAwB,EAAE;AAEhC,OAAK,IAAI,IAAI,GAAG,IAAI,GAAG,KAAK,GAAG;GAC7B,MAAM,UAAU,aAAa;AAC7B,YAAS,KAAK,uBAAuB,SAAS,iBAAiB,QAAQ,MAAM,CAAC;;AAGhF,WAAS,KAAK;GACZ,MAAM;GACN,GAAG;GACH;GACA,GAAG;GACJ,CAAC;AAEF,eAAa,KAAK,SAAS,WAAW,IAAI,SAAS,KAAM;GAAE,MAAM;GAAO,OAAO;GAAU,CAAC;;AAG5F,QAAO;EAAE,MAAM;EAAM,OAAO;EAAc"}
|