@fragno-dev/db 0.2.2 → 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 +202 -140
- package/CHANGELOG.md +35 -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 +39 -29
- 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 +18 -7
- package/dist/db-fragment-definition-builder.d.ts.map +1 -1
- package/dist/db-fragment-definition-builder.js +116 -54
- 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 +79 -2
- package/dist/fragments/internal-fragment.d.ts.map +1 -1
- package/dist/fragments/internal-fragment.js +150 -32
- 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 +42 -1
- package/dist/hooks/hooks.d.ts.map +1 -1
- package/dist/hooks/hooks.js +72 -6
- 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 +15 -8
- 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.map +1 -1
- package/dist/query/unit-of-work/execute-unit-of-work.js +11 -6
- 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 +50 -14
- package/dist/query/unit-of-work/unit-of-work.d.ts.map +1 -1
- package/dist/query/unit-of-work/unit-of-work.js +86 -5
- package/dist/query/unit-of-work/unit-of-work.js.map +1 -1
- package/dist/query/value-decoding.js +9 -6
- 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 +38 -14
- package/dist/schema/create.d.ts.map +1 -1
- package/dist/schema/create.js +81 -42
- package/dist/schema/create.js.map +1 -1
- package/dist/schema/generate-id.js +2 -2
- package/dist/schema/generate-id.js.map +1 -1
- 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} +10 -10
- package/src/adapters/{drizzle/drizzle-adapter-sqlite3.test.ts → generic-sql/sql-adapter-sqlite3-uow.test.ts} +7 -7
- 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 +30 -12
- package/src/db-fragment-definition-builder.ts +142 -73
- package/src/db-fragment-instantiator.test.ts +105 -13
- package/src/db-fragment-integration.test.ts +9 -7
- 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 +458 -8
- package/src/fragments/internal-fragment.ts +322 -63
- 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 +165 -5
- package/src/hooks/hooks.ts +197 -9
- 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 +64 -26
- 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 +25 -1
- package/src/query/unit-of-work/execute-unit-of-work.ts +25 -8
- package/src/query/unit-of-work/unit-of-work-coordinator.test.ts +12 -12
- 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 +168 -37
- package/src/query/unit-of-work/unit-of-work.ts +203 -18
- 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 +185 -47
- package/src/schema/generate-id.test.ts +2 -2
- package/src/schema/generate-id.ts +2 -2
- 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
|
@@ -11,7 +11,8 @@ import type { SqlBool } from "kysely";
|
|
|
11
11
|
import type { AnyColumn, AnyTable } from "../../../schema/create";
|
|
12
12
|
import type { Condition } from "../../../query/condition-builder";
|
|
13
13
|
import type { DriverConfig, SupportedDatabase } from "../driver-config";
|
|
14
|
-
import type {
|
|
14
|
+
import type { SQLiteStorageMode } from "../sqlite-storage";
|
|
15
|
+
import type { NamingResolver } from "../../../naming/sql-naming";
|
|
15
16
|
import { buildWhere, fullSQLName } from "./where-builder";
|
|
16
17
|
import { mapSelect, extendSelect } from "./select-builder";
|
|
17
18
|
import type { CompiledJoin } from "../../../query/orm/orm";
|
|
@@ -97,15 +98,22 @@ export abstract class SQLQueryCompiler {
|
|
|
97
98
|
protected readonly db: AnyKysely;
|
|
98
99
|
protected readonly driverConfig: DriverConfig;
|
|
99
100
|
protected readonly database: SupportedDatabase;
|
|
100
|
-
protected readonly
|
|
101
|
+
protected readonly resolver?: NamingResolver;
|
|
101
102
|
protected readonly encoder: UnitOfWorkEncoder;
|
|
102
|
-
|
|
103
|
-
|
|
103
|
+
protected readonly sqliteStorageMode?: SQLiteStorageMode;
|
|
104
|
+
|
|
105
|
+
constructor(
|
|
106
|
+
db: AnyKysely,
|
|
107
|
+
driverConfig: DriverConfig,
|
|
108
|
+
sqliteStorageMode?: SQLiteStorageMode,
|
|
109
|
+
resolver?: NamingResolver,
|
|
110
|
+
) {
|
|
104
111
|
this.db = db;
|
|
105
112
|
this.driverConfig = driverConfig;
|
|
106
113
|
this.database = driverConfig.databaseType;
|
|
107
|
-
this.
|
|
108
|
-
this.
|
|
114
|
+
this.resolver = resolver;
|
|
115
|
+
this.sqliteStorageMode = sqliteStorageMode;
|
|
116
|
+
this.encoder = new UnitOfWorkEncoder(driverConfig, db, sqliteStorageMode, resolver);
|
|
109
117
|
}
|
|
110
118
|
|
|
111
119
|
/**
|
|
@@ -133,14 +141,21 @@ export abstract class SQLQueryCompiler {
|
|
|
133
141
|
* Get the physical table name, applying namespace mapping if provided.
|
|
134
142
|
*/
|
|
135
143
|
protected getTableName(table: AnyTable): string {
|
|
136
|
-
return this.
|
|
144
|
+
return this.resolver ? this.resolver.getTableName(table.name) : table.name;
|
|
137
145
|
}
|
|
138
146
|
|
|
139
147
|
/**
|
|
140
148
|
* Build WHERE clause from a condition tree.
|
|
141
149
|
*/
|
|
142
150
|
protected buildWhereClause(condition: Condition, eb: AnyExpressionBuilder, table: AnyTable) {
|
|
143
|
-
return buildWhere(
|
|
151
|
+
return buildWhere(
|
|
152
|
+
condition,
|
|
153
|
+
eb,
|
|
154
|
+
this.driverConfig,
|
|
155
|
+
this.sqliteStorageMode,
|
|
156
|
+
this.resolver,
|
|
157
|
+
table,
|
|
158
|
+
);
|
|
144
159
|
}
|
|
145
160
|
|
|
146
161
|
/**
|
|
@@ -171,7 +186,7 @@ export abstract class SQLQueryCompiler {
|
|
|
171
186
|
|
|
172
187
|
// Update select
|
|
173
188
|
mappedSelect.push(
|
|
174
|
-
...mapSelect(joinOptions.select, targetTable, {
|
|
189
|
+
...mapSelect(joinOptions.select, targetTable, this.resolver, {
|
|
175
190
|
relation: fullPath, // Use full path with colons for column aliases
|
|
176
191
|
tableName: joinName, // Use underscore version for table name
|
|
177
192
|
}),
|
|
@@ -188,9 +203,22 @@ export abstract class SQLQueryCompiler {
|
|
|
188
203
|
|
|
189
204
|
conditions.push(
|
|
190
205
|
eb(
|
|
191
|
-
`${parentTableName}.${
|
|
206
|
+
`${parentTableName}.${
|
|
207
|
+
this.resolver
|
|
208
|
+
? this.resolver.getColumnName(parentTable.name, parentTable.columns[left].name)
|
|
209
|
+
: parentTable.columns[left].name
|
|
210
|
+
}`,
|
|
192
211
|
"=",
|
|
193
|
-
eb.ref(
|
|
212
|
+
eb.ref(
|
|
213
|
+
`${joinName}.${
|
|
214
|
+
this.resolver
|
|
215
|
+
? this.resolver.getColumnName(
|
|
216
|
+
targetTable.name,
|
|
217
|
+
targetTable.columns[actualRight].name,
|
|
218
|
+
)
|
|
219
|
+
: targetTable.columns[actualRight].name
|
|
220
|
+
}`,
|
|
221
|
+
),
|
|
194
222
|
),
|
|
195
223
|
);
|
|
196
224
|
}
|
|
@@ -259,7 +287,7 @@ export abstract class SQLQueryCompiler {
|
|
|
259
287
|
// Apply ORDER BY
|
|
260
288
|
if (options.orderBy) {
|
|
261
289
|
for (const [col, mode] of options.orderBy) {
|
|
262
|
-
query = query.orderBy(fullSQLName(col, this.
|
|
290
|
+
query = query.orderBy(fullSQLName(col, this.resolver), mode);
|
|
263
291
|
}
|
|
264
292
|
}
|
|
265
293
|
|
|
@@ -274,7 +302,9 @@ export abstract class SQLQueryCompiler {
|
|
|
274
302
|
|
|
275
303
|
const compiledSelect = selectBuilder.compile();
|
|
276
304
|
mappedSelect.push(
|
|
277
|
-
...mapSelect(compiledSelect.result, table,
|
|
305
|
+
...mapSelect(compiledSelect.result, table, this.resolver, {
|
|
306
|
+
tableName: this.getTableName(table),
|
|
307
|
+
}),
|
|
278
308
|
);
|
|
279
309
|
|
|
280
310
|
return query.select(mappedSelect).compile();
|
|
@@ -297,7 +327,9 @@ export abstract class SQLQueryCompiler {
|
|
|
297
327
|
|
|
298
328
|
// Apply RETURNING if supported
|
|
299
329
|
if (this.driverConfig.supportsReturning) {
|
|
300
|
-
const columns = mapSelect(true, table,
|
|
330
|
+
const columns = mapSelect(true, table, this.resolver, {
|
|
331
|
+
tableName: this.getTableName(table),
|
|
332
|
+
});
|
|
301
333
|
insert = this.applyReturning(insert, columns);
|
|
302
334
|
}
|
|
303
335
|
|
|
@@ -316,7 +348,10 @@ export abstract class SQLQueryCompiler {
|
|
|
316
348
|
|
|
317
349
|
// Add version increment (must be added after encoding, as a raw SQL expression)
|
|
318
350
|
const versionCol = table.getVersionColumn();
|
|
319
|
-
|
|
351
|
+
const versionColumnName = this.resolver
|
|
352
|
+
? this.resolver.getColumnName(table.name, versionCol.name)
|
|
353
|
+
: versionCol.name;
|
|
354
|
+
encoded[versionColumnName] = sql`coalesce(${sql.ref(versionColumnName)}, 0) + 1`;
|
|
320
355
|
|
|
321
356
|
let query = this.db.updateTable(this.getTableName(table)).set(encoded);
|
|
322
357
|
|
|
@@ -4,9 +4,11 @@ import { column, idColumn, referenceColumn, schema } from "../../../schema/creat
|
|
|
4
4
|
import { fullSQLName, buildWhere, processReferenceSubqueries } from "./where-builder";
|
|
5
5
|
import { ReferenceSubquery } from "../../../query/value-encoding";
|
|
6
6
|
import { BetterSQLite3DriverConfig, NodePostgresDriverConfig } from "../driver-config";
|
|
7
|
+
import { dbNow } from "../../../query/db-now";
|
|
8
|
+
import { createNamingResolver, type SqlNamingStrategy } from "../../../naming/sql-naming";
|
|
7
9
|
|
|
8
10
|
describe("where-builder", () => {
|
|
9
|
-
const testSchema = schema((s) => {
|
|
11
|
+
const testSchema = schema("test", (s) => {
|
|
10
12
|
return s
|
|
11
13
|
.addTable("users", (t) => {
|
|
12
14
|
return t
|
|
@@ -15,7 +17,8 @@ describe("where-builder", () => {
|
|
|
15
17
|
.addColumn("email", column("string"))
|
|
16
18
|
.addColumn("age", column("integer").nullable())
|
|
17
19
|
.addColumn("isActive", column("bool"))
|
|
18
|
-
.addColumn("createdAt", column("timestamp"))
|
|
20
|
+
.addColumn("createdAt", column("timestamp"))
|
|
21
|
+
.addColumn("birthDate", column("date").nullable());
|
|
19
22
|
})
|
|
20
23
|
.addTable("posts", (t) => {
|
|
21
24
|
return t
|
|
@@ -52,12 +55,18 @@ describe("where-builder", () => {
|
|
|
52
55
|
expect(result).toBe("users.id");
|
|
53
56
|
});
|
|
54
57
|
|
|
55
|
-
it("should work with
|
|
56
|
-
const
|
|
57
|
-
|
|
58
|
-
|
|
58
|
+
it("should work with naming resolver", () => {
|
|
59
|
+
const namingStrategy: SqlNamingStrategy = {
|
|
60
|
+
namespaceScope: "suffix",
|
|
61
|
+
namespaceToSchema: (namespace) => namespace,
|
|
62
|
+
tableName: (logicalTable) => `prefix_${logicalTable}`,
|
|
63
|
+
columnName: (logicalColumn) => logicalColumn,
|
|
64
|
+
indexName: (logicalIndex) => logicalIndex,
|
|
65
|
+
uniqueIndexName: (logicalIndex) => logicalIndex,
|
|
66
|
+
foreignKeyName: ({ referenceName }) => referenceName,
|
|
59
67
|
};
|
|
60
|
-
const
|
|
68
|
+
const resolver = createNamingResolver(testSchema, "namespace", namingStrategy);
|
|
69
|
+
const result = fullSQLName(usersTable.columns.name, resolver);
|
|
61
70
|
expect(result).toBe("prefix_users.name");
|
|
62
71
|
});
|
|
63
72
|
});
|
|
@@ -111,6 +120,56 @@ describe("where-builder", () => {
|
|
|
111
120
|
};
|
|
112
121
|
|
|
113
122
|
describe("comparison operators", () => {
|
|
123
|
+
it("should serialize dbNow to CURRENT_TIMESTAMP", () => {
|
|
124
|
+
const condition = {
|
|
125
|
+
type: "compare" as const,
|
|
126
|
+
a: usersTable.columns.createdAt,
|
|
127
|
+
operator: "<=" as const,
|
|
128
|
+
b: dbNow(),
|
|
129
|
+
};
|
|
130
|
+
|
|
131
|
+
type TestDB = { users: { id: string } };
|
|
132
|
+
const db = new Kysely<TestDB>({
|
|
133
|
+
dialect: new PostgresDialect({ pool: {} as any }), // eslint-disable-line @typescript-eslint/no-explicit-any
|
|
134
|
+
});
|
|
135
|
+
|
|
136
|
+
const query = db
|
|
137
|
+
.selectFrom("users")
|
|
138
|
+
.select("id")
|
|
139
|
+
.where((eb) => buildWhere(condition, eb, new NodePostgresDriverConfig()));
|
|
140
|
+
|
|
141
|
+
expect(query.compile().sql).toContain("CURRENT_TIMESTAMP");
|
|
142
|
+
});
|
|
143
|
+
|
|
144
|
+
it("should respect sqlite date storage for dbNow", () => {
|
|
145
|
+
const condition = {
|
|
146
|
+
type: "compare" as const,
|
|
147
|
+
a: usersTable.columns.birthDate,
|
|
148
|
+
operator: "<=" as const,
|
|
149
|
+
b: dbNow(),
|
|
150
|
+
};
|
|
151
|
+
|
|
152
|
+
type TestDB = { users: { id: string } };
|
|
153
|
+
const db = new Kysely<TestDB>({
|
|
154
|
+
dialect: new PostgresDialect({ pool: {} as any }), // eslint-disable-line @typescript-eslint/no-explicit-any
|
|
155
|
+
});
|
|
156
|
+
|
|
157
|
+
const query = db
|
|
158
|
+
.selectFrom("users")
|
|
159
|
+
.select("id")
|
|
160
|
+
.where((eb) =>
|
|
161
|
+
buildWhere(condition, eb, new BetterSQLite3DriverConfig(), {
|
|
162
|
+
timestampStorage: "epoch-ms",
|
|
163
|
+
dateStorage: "iso-text",
|
|
164
|
+
bigintStorage: "blob",
|
|
165
|
+
}),
|
|
166
|
+
);
|
|
167
|
+
|
|
168
|
+
const sqlText = query.compile().sql;
|
|
169
|
+
expect(sqlText).toContain("CURRENT_TIMESTAMP");
|
|
170
|
+
expect(sqlText).not.toContain("julianday");
|
|
171
|
+
});
|
|
172
|
+
|
|
114
173
|
it("should build simple equality comparison", () => {
|
|
115
174
|
const condition = {
|
|
116
175
|
type: "compare" as const,
|
|
@@ -532,6 +591,7 @@ describe("where-builder", () => {
|
|
|
532
591
|
eb,
|
|
533
592
|
new NodePostgresDriverConfig(),
|
|
534
593
|
undefined,
|
|
594
|
+
undefined,
|
|
535
595
|
postsTable,
|
|
536
596
|
);
|
|
537
597
|
|
|
@@ -561,6 +621,7 @@ describe("where-builder", () => {
|
|
|
561
621
|
createMockEB(),
|
|
562
622
|
new NodePostgresDriverConfig(),
|
|
563
623
|
undefined,
|
|
624
|
+
undefined,
|
|
564
625
|
postsTable,
|
|
565
626
|
);
|
|
566
627
|
|
|
@@ -573,11 +634,17 @@ describe("where-builder", () => {
|
|
|
573
634
|
});
|
|
574
635
|
});
|
|
575
636
|
|
|
576
|
-
it("should generate subquery with
|
|
577
|
-
const
|
|
578
|
-
|
|
579
|
-
|
|
637
|
+
it("should generate subquery with naming resolver", () => {
|
|
638
|
+
const namingStrategy: SqlNamingStrategy = {
|
|
639
|
+
namespaceScope: "suffix",
|
|
640
|
+
namespaceToSchema: (namespace) => namespace,
|
|
641
|
+
tableName: (logicalTable) => `prefix_${logicalTable}`,
|
|
642
|
+
columnName: (logicalColumn) => logicalColumn,
|
|
643
|
+
indexName: (logicalIndex) => logicalIndex,
|
|
644
|
+
uniqueIndexName: (logicalIndex) => logicalIndex,
|
|
645
|
+
foreignKeyName: ({ referenceName }) => referenceName,
|
|
580
646
|
};
|
|
647
|
+
const resolver = createNamingResolver(testSchema, "namespace", namingStrategy);
|
|
581
648
|
|
|
582
649
|
const condition = {
|
|
583
650
|
type: "compare" as const,
|
|
@@ -591,7 +658,8 @@ describe("where-builder", () => {
|
|
|
591
658
|
condition,
|
|
592
659
|
eb,
|
|
593
660
|
new NodePostgresDriverConfig(),
|
|
594
|
-
|
|
661
|
+
undefined,
|
|
662
|
+
resolver,
|
|
595
663
|
postsTable,
|
|
596
664
|
);
|
|
597
665
|
|
|
@@ -682,17 +750,23 @@ describe("where-builder", () => {
|
|
|
682
750
|
expect(processed).toEqual(values);
|
|
683
751
|
});
|
|
684
752
|
|
|
685
|
-
it("should use
|
|
686
|
-
const
|
|
687
|
-
|
|
688
|
-
|
|
753
|
+
it("should use naming resolver when provided", () => {
|
|
754
|
+
const namingStrategy: SqlNamingStrategy = {
|
|
755
|
+
namespaceScope: "suffix",
|
|
756
|
+
namespaceToSchema: (namespace) => namespace,
|
|
757
|
+
tableName: (logicalTable) => `prefix_${logicalTable}`,
|
|
758
|
+
columnName: (logicalColumn) => logicalColumn,
|
|
759
|
+
indexName: (logicalIndex) => logicalIndex,
|
|
760
|
+
uniqueIndexName: (logicalIndex) => logicalIndex,
|
|
761
|
+
foreignKeyName: ({ referenceName }) => referenceName,
|
|
689
762
|
};
|
|
763
|
+
const resolver = createNamingResolver(testSchema, "namespace", namingStrategy);
|
|
690
764
|
|
|
691
765
|
const values = {
|
|
692
766
|
userId: new ReferenceSubquery(usersTable, "user-123"),
|
|
693
767
|
};
|
|
694
768
|
|
|
695
|
-
const processed = processReferenceSubqueries(values, kysely,
|
|
769
|
+
const processed = processReferenceSubqueries(values, kysely, resolver);
|
|
696
770
|
|
|
697
771
|
// Compile the subquery to check it uses the mapped table name
|
|
698
772
|
const subquery = processed["userId"] as unknown as { compile: () => { sql: string } };
|
|
@@ -8,22 +8,25 @@ import {
|
|
|
8
8
|
} from "../../../schema/create";
|
|
9
9
|
import type { Condition } from "../../../query/condition-builder";
|
|
10
10
|
import { createSQLSerializer } from "../../../query/serialize/create-sql-serializer";
|
|
11
|
-
import type {
|
|
11
|
+
import type { NamingResolver } from "../../../naming/sql-naming";
|
|
12
12
|
import type { DriverConfig } from "../driver-config";
|
|
13
|
+
import { sqliteStorageDefault, type SQLiteStorageMode } from "../sqlite-storage";
|
|
13
14
|
import { ReferenceSubquery, resolveFragnoIdValue } from "../../../query/value-encoding";
|
|
15
|
+
import { isDbNow } from "../../../query/db-now";
|
|
14
16
|
import type { AnyKysely, AnyExpressionBuilder, AnyExpressionWrapper } from "./sql-query-compiler";
|
|
15
17
|
|
|
16
18
|
/**
|
|
17
19
|
* Returns the fully qualified SQL name for a column (table.column).
|
|
18
20
|
*
|
|
19
21
|
* @param column - The column to get the full name for
|
|
20
|
-
* @param
|
|
22
|
+
* @param resolver - Optional naming resolver for namespace prefixing
|
|
21
23
|
* @returns The fully qualified SQL name in the format "tableName.columnName"
|
|
22
24
|
* @internal
|
|
23
25
|
*/
|
|
24
|
-
export function fullSQLName(column: AnyColumn,
|
|
25
|
-
const tableName =
|
|
26
|
-
|
|
26
|
+
export function fullSQLName(column: AnyColumn, resolver?: NamingResolver): string {
|
|
27
|
+
const tableName = resolver ? resolver.getTableName(column.tableName) : column.tableName;
|
|
28
|
+
const columnName = resolver ? resolver.getColumnName(column.tableName, column.name) : column.name;
|
|
29
|
+
return `${tableName}.${columnName}`;
|
|
27
30
|
}
|
|
28
31
|
|
|
29
32
|
/**
|
|
@@ -36,7 +39,7 @@ export function fullSQLName(column: AnyColumn, mapper?: TableNameMapper): string
|
|
|
36
39
|
* @param condition - The condition tree to build the WHERE clause from
|
|
37
40
|
* @param eb - Kysely expression builder for constructing SQL expressions
|
|
38
41
|
* @param database - The database type (affects SQL generation)
|
|
39
|
-
* @param
|
|
42
|
+
* @param resolver - Optional naming resolver for namespace prefixing
|
|
40
43
|
* @param table - The table being queried (used for resolving reference columns)
|
|
41
44
|
* @returns A Kysely expression wrapper representing the WHERE clause
|
|
42
45
|
* @internal
|
|
@@ -45,10 +48,11 @@ export function buildWhere(
|
|
|
45
48
|
condition: Condition,
|
|
46
49
|
eb: AnyExpressionBuilder,
|
|
47
50
|
driverConfig: DriverConfig,
|
|
48
|
-
|
|
51
|
+
sqliteStorageMode?: SQLiteStorageMode,
|
|
52
|
+
resolver?: NamingResolver,
|
|
49
53
|
table?: AnyTable,
|
|
50
54
|
): AnyExpressionWrapper {
|
|
51
|
-
const serializer = createSQLSerializer(driverConfig);
|
|
55
|
+
const serializer = createSQLSerializer(driverConfig, sqliteStorageMode);
|
|
52
56
|
|
|
53
57
|
if (condition.type === "compare") {
|
|
54
58
|
const left = condition.a;
|
|
@@ -56,25 +60,46 @@ export function buildWhere(
|
|
|
56
60
|
let val = condition.b;
|
|
57
61
|
|
|
58
62
|
if (!(val instanceof Column)) {
|
|
59
|
-
|
|
60
|
-
|
|
63
|
+
if (isDbNow(val)) {
|
|
64
|
+
if (driverConfig.databaseType === "sqlite") {
|
|
65
|
+
const storageMode = sqliteStorageMode ?? sqliteStorageDefault;
|
|
66
|
+
const storage =
|
|
67
|
+
left.type === "date" ? storageMode.dateStorage : storageMode.timestampStorage;
|
|
68
|
+
if ((left.type === "timestamp" || left.type === "date") && storage === "epoch-ms") {
|
|
69
|
+
val = sql`(cast((julianday('now') - 2440587.5)*86400000 as integer))`;
|
|
70
|
+
} else {
|
|
71
|
+
val = sql`CURRENT_TIMESTAMP`;
|
|
72
|
+
}
|
|
73
|
+
} else {
|
|
74
|
+
val = sql`CURRENT_TIMESTAMP`;
|
|
75
|
+
}
|
|
76
|
+
} else if (left.role === "reference" && table) {
|
|
77
|
+
// Handle reference columns specially
|
|
61
78
|
if (typeof val === "string") {
|
|
62
79
|
// String external ID - create subquery to lookup internal ID
|
|
63
80
|
const relation = Object.values(table.relations).find((rel) =>
|
|
64
|
-
rel.on.some(([localCol]) => localCol === left.
|
|
81
|
+
rel.on.some(([localCol]) => localCol === left.name),
|
|
65
82
|
);
|
|
66
83
|
if (relation) {
|
|
67
84
|
const refTable = relation.table;
|
|
68
85
|
const internalIdCol = refTable.getInternalIdColumn();
|
|
69
86
|
const idCol = refTable.getIdColumn();
|
|
70
|
-
const physicalTableName =
|
|
71
|
-
?
|
|
72
|
-
: refTable.
|
|
87
|
+
const physicalTableName = resolver
|
|
88
|
+
? resolver.getTableName(refTable.name)
|
|
89
|
+
: refTable.name;
|
|
73
90
|
|
|
74
91
|
val = eb
|
|
75
92
|
.selectFrom(physicalTableName)
|
|
76
|
-
.select(
|
|
77
|
-
|
|
93
|
+
.select(
|
|
94
|
+
resolver
|
|
95
|
+
? resolver.getColumnName(refTable.name, internalIdCol.name)
|
|
96
|
+
: internalIdCol.name,
|
|
97
|
+
)
|
|
98
|
+
.where(
|
|
99
|
+
resolver ? resolver.getColumnName(refTable.name, idCol.name) : idCol.name,
|
|
100
|
+
"=",
|
|
101
|
+
val,
|
|
102
|
+
)
|
|
78
103
|
.limit(1);
|
|
79
104
|
}
|
|
80
105
|
} else if (val instanceof FragnoId && val.internalId !== undefined) {
|
|
@@ -83,20 +108,28 @@ export function buildWhere(
|
|
|
83
108
|
} else if (val instanceof FragnoId && val.internalId === undefined) {
|
|
84
109
|
// FragnoId without internal ID - create subquery using external ID
|
|
85
110
|
const relation = Object.values(table.relations).find((rel) =>
|
|
86
|
-
rel.on.some(([localCol]) => localCol === left.
|
|
111
|
+
rel.on.some(([localCol]) => localCol === left.name),
|
|
87
112
|
);
|
|
88
113
|
if (relation) {
|
|
89
114
|
const refTable = relation.table;
|
|
90
115
|
const internalIdCol = refTable.getInternalIdColumn();
|
|
91
116
|
const idCol = refTable.getIdColumn();
|
|
92
|
-
const physicalTableName =
|
|
93
|
-
?
|
|
94
|
-
: refTable.
|
|
117
|
+
const physicalTableName = resolver
|
|
118
|
+
? resolver.getTableName(refTable.name)
|
|
119
|
+
: refTable.name;
|
|
95
120
|
|
|
96
121
|
val = eb
|
|
97
122
|
.selectFrom(physicalTableName)
|
|
98
|
-
.select(
|
|
99
|
-
|
|
123
|
+
.select(
|
|
124
|
+
resolver
|
|
125
|
+
? resolver.getColumnName(refTable.name, internalIdCol.name)
|
|
126
|
+
: internalIdCol.name,
|
|
127
|
+
)
|
|
128
|
+
.where(
|
|
129
|
+
resolver ? resolver.getColumnName(refTable.name, idCol.name) : idCol.name,
|
|
130
|
+
"=",
|
|
131
|
+
val.externalId,
|
|
132
|
+
)
|
|
100
133
|
.limit(1);
|
|
101
134
|
}
|
|
102
135
|
} else if (val instanceof FragnoReference) {
|
|
@@ -122,54 +155,68 @@ export function buildWhere(
|
|
|
122
155
|
v = "like";
|
|
123
156
|
rhs =
|
|
124
157
|
val instanceof Column
|
|
125
|
-
? sql`concat('%', ${eb.ref(fullSQLName(val,
|
|
158
|
+
? sql`concat('%', ${eb.ref(fullSQLName(val, resolver))}, '%')`
|
|
126
159
|
: `%${val}%`;
|
|
127
160
|
break;
|
|
128
161
|
case "not contains":
|
|
129
162
|
v = "not like";
|
|
130
163
|
rhs =
|
|
131
164
|
val instanceof Column
|
|
132
|
-
? sql`concat('%', ${eb.ref(fullSQLName(val,
|
|
165
|
+
? sql`concat('%', ${eb.ref(fullSQLName(val, resolver))}, '%')`
|
|
133
166
|
: `%${val}%`;
|
|
134
167
|
break;
|
|
135
168
|
case "starts with":
|
|
136
169
|
v = "like";
|
|
137
170
|
rhs =
|
|
138
|
-
val instanceof Column
|
|
171
|
+
val instanceof Column
|
|
172
|
+
? sql`concat(${eb.ref(fullSQLName(val, resolver))}, '%')`
|
|
173
|
+
: `${val}%`;
|
|
139
174
|
break;
|
|
140
175
|
case "not starts with":
|
|
141
176
|
v = "not like";
|
|
142
177
|
rhs =
|
|
143
|
-
val instanceof Column
|
|
178
|
+
val instanceof Column
|
|
179
|
+
? sql`concat(${eb.ref(fullSQLName(val, resolver))}, '%')`
|
|
180
|
+
: `${val}%`;
|
|
144
181
|
break;
|
|
145
182
|
case "ends with":
|
|
146
183
|
v = "like";
|
|
147
184
|
rhs =
|
|
148
|
-
val instanceof Column
|
|
185
|
+
val instanceof Column
|
|
186
|
+
? sql`concat('%', ${eb.ref(fullSQLName(val, resolver))})`
|
|
187
|
+
: `%${val}`;
|
|
149
188
|
break;
|
|
150
189
|
case "not ends with":
|
|
151
190
|
v = "not like";
|
|
152
191
|
rhs =
|
|
153
|
-
val instanceof Column
|
|
192
|
+
val instanceof Column
|
|
193
|
+
? sql`concat('%', ${eb.ref(fullSQLName(val, resolver))})`
|
|
194
|
+
: `%${val}`;
|
|
154
195
|
break;
|
|
155
196
|
default:
|
|
156
197
|
v = op;
|
|
157
|
-
rhs = val instanceof Column ? eb.ref(fullSQLName(val,
|
|
198
|
+
rhs = val instanceof Column ? eb.ref(fullSQLName(val, resolver)) : val;
|
|
158
199
|
}
|
|
159
200
|
|
|
160
|
-
return eb(fullSQLName(left,
|
|
201
|
+
return eb(fullSQLName(left, resolver), v, rhs);
|
|
161
202
|
}
|
|
162
203
|
|
|
163
204
|
// Nested conditions
|
|
164
205
|
if (condition.type === "and") {
|
|
165
|
-
return eb.and(
|
|
206
|
+
return eb.and(
|
|
207
|
+
condition.items.map((v) =>
|
|
208
|
+
buildWhere(v, eb, driverConfig, sqliteStorageMode, resolver, table),
|
|
209
|
+
),
|
|
210
|
+
);
|
|
166
211
|
}
|
|
167
212
|
|
|
168
213
|
if (condition.type === "not") {
|
|
169
|
-
return eb.not(buildWhere(condition.item, eb, driverConfig,
|
|
214
|
+
return eb.not(buildWhere(condition.item, eb, driverConfig, sqliteStorageMode, resolver, table));
|
|
170
215
|
}
|
|
171
216
|
|
|
172
|
-
return eb.or(
|
|
217
|
+
return eb.or(
|
|
218
|
+
condition.items.map((v) => buildWhere(v, eb, driverConfig, sqliteStorageMode, resolver, table)),
|
|
219
|
+
);
|
|
173
220
|
}
|
|
174
221
|
|
|
175
222
|
/**
|
|
@@ -177,17 +224,18 @@ export function buildWhere(
|
|
|
177
224
|
*
|
|
178
225
|
* @param values - The encoded values that may contain ReferenceSubquery objects
|
|
179
226
|
* @param kysely - The Kysely database instance for building subqueries
|
|
180
|
-
* @param
|
|
227
|
+
* @param resolver - Optional naming resolver for namespace prefixing
|
|
181
228
|
* @returns Processed values with subqueries in place of ReferenceSubquery markers
|
|
182
229
|
* @internal
|
|
183
230
|
*/
|
|
184
231
|
export function processReferenceSubqueries(
|
|
185
232
|
values: Record<string, unknown>,
|
|
186
233
|
kysely: AnyKysely,
|
|
187
|
-
|
|
234
|
+
resolver?: NamingResolver,
|
|
188
235
|
): Record<string, unknown> {
|
|
189
236
|
const processed: Record<string, unknown> = {};
|
|
190
|
-
const getTableName = (table: AnyTable) =>
|
|
237
|
+
const getTableName = (table: AnyTable) =>
|
|
238
|
+
resolver ? resolver.getTableName(table.name) : table.name;
|
|
191
239
|
|
|
192
240
|
for (const [key, value] of Object.entries(values)) {
|
|
193
241
|
if (value instanceof ReferenceSubquery) {
|
|
@@ -196,11 +244,15 @@ export function processReferenceSubqueries(
|
|
|
196
244
|
const tableName = getTableName(refTable);
|
|
197
245
|
const internalIdCol = refTable.getInternalIdColumn().name;
|
|
198
246
|
const idCol = refTable.getIdColumn().name;
|
|
247
|
+
const internalIdColumnName = resolver
|
|
248
|
+
? resolver.getColumnName(refTable.name, internalIdCol)
|
|
249
|
+
: internalIdCol;
|
|
250
|
+
const idColumnName = resolver ? resolver.getColumnName(refTable.name, idCol) : idCol;
|
|
199
251
|
|
|
200
252
|
processed[key] = kysely
|
|
201
253
|
.selectFrom(tableName)
|
|
202
|
-
.select(
|
|
203
|
-
.where(
|
|
254
|
+
.select(internalIdColumnName)
|
|
255
|
+
.where(idColumnName, "=", externalId)
|
|
204
256
|
.limit(1);
|
|
205
257
|
} else {
|
|
206
258
|
processed[key] = value;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { KyselyPGlite } from "kysely-pglite";
|
|
2
2
|
import { beforeAll, describe, expect, expectTypeOf, it } from "vitest";
|
|
3
|
-
import {
|
|
3
|
+
import { SqlAdapter } from "./generic-sql-adapter";
|
|
4
4
|
import {
|
|
5
5
|
column,
|
|
6
6
|
idColumn,
|
|
@@ -10,11 +10,11 @@ import {
|
|
|
10
10
|
type FragnoReference,
|
|
11
11
|
} from "../../schema/create";
|
|
12
12
|
import { Cursor } from "../../query/cursor";
|
|
13
|
-
import { PGLiteDriverConfig } from "
|
|
13
|
+
import { PGLiteDriverConfig } from "./driver-config";
|
|
14
14
|
import { internalSchema } from "../../fragments/internal-fragment";
|
|
15
15
|
|
|
16
|
-
describe("
|
|
17
|
-
const testSchema = schema((s) => {
|
|
16
|
+
describe("SqlAdapter PGLite", () => {
|
|
17
|
+
const testSchema = schema("test", (s) => {
|
|
18
18
|
return s
|
|
19
19
|
.addTable("users", (t) => {
|
|
20
20
|
return t
|
|
@@ -96,12 +96,12 @@ describe("KyselyAdapter PGLite", () => {
|
|
|
96
96
|
});
|
|
97
97
|
});
|
|
98
98
|
|
|
99
|
-
let adapter:
|
|
99
|
+
let adapter: SqlAdapter;
|
|
100
100
|
|
|
101
101
|
beforeAll(async () => {
|
|
102
102
|
const { dialect } = await KyselyPGlite.create();
|
|
103
103
|
|
|
104
|
-
adapter = new
|
|
104
|
+
adapter = new SqlAdapter({
|
|
105
105
|
dialect,
|
|
106
106
|
driverConfig: new PGLiteDriverConfig(),
|
|
107
107
|
});
|