@fragno-dev/db 0.1.15 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-build.log +242 -179
- package/CHANGELOG.md +23 -0
- package/README.md +123 -8
- package/dist/adapters/adapters.d.ts +5 -5
- package/dist/adapters/adapters.d.ts.map +1 -1
- package/dist/adapters/adapters.js.map +1 -1
- package/dist/adapters/drizzle/drizzle-adapter.d.ts +6 -21
- package/dist/adapters/drizzle/drizzle-adapter.d.ts.map +1 -1
- package/dist/adapters/drizzle/drizzle-adapter.js +7 -54
- package/dist/adapters/drizzle/drizzle-adapter.js.map +1 -1
- package/dist/adapters/drizzle/generate.d.ts +3 -0
- package/dist/adapters/drizzle/generate.d.ts.map +1 -1
- package/dist/adapters/drizzle/generate.js +36 -28
- package/dist/adapters/drizzle/generate.js.map +1 -1
- package/dist/adapters/generic-sql/driver-config.d.ts +74 -0
- package/dist/adapters/generic-sql/driver-config.d.ts.map +1 -0
- package/dist/adapters/generic-sql/driver-config.js +94 -0
- package/dist/adapters/generic-sql/driver-config.js.map +1 -0
- package/dist/adapters/generic-sql/generic-sql-adapter.d.ts +43 -0
- package/dist/adapters/generic-sql/generic-sql-adapter.d.ts.map +1 -0
- package/dist/adapters/generic-sql/generic-sql-adapter.js +87 -0
- package/dist/adapters/generic-sql/generic-sql-adapter.js.map +1 -0
- package/dist/adapters/generic-sql/generic-sql-uow-executor.js +67 -0
- package/dist/adapters/generic-sql/generic-sql-uow-executor.js.map +1 -0
- package/dist/adapters/generic-sql/migration/cold-kysely.js +33 -0
- package/dist/adapters/generic-sql/migration/cold-kysely.js.map +1 -0
- package/dist/adapters/generic-sql/migration/dialect/mysql.js +60 -0
- package/dist/adapters/generic-sql/migration/dialect/mysql.js.map +1 -0
- package/dist/adapters/generic-sql/migration/dialect/postgres.js +59 -0
- package/dist/adapters/generic-sql/migration/dialect/postgres.js.map +1 -0
- package/dist/adapters/generic-sql/migration/dialect/sqlite.js +96 -0
- package/dist/adapters/generic-sql/migration/dialect/sqlite.js.map +1 -0
- package/dist/adapters/generic-sql/migration/executor.d.ts +15 -0
- package/dist/adapters/generic-sql/migration/executor.d.ts.map +1 -0
- package/dist/adapters/generic-sql/migration/executor.js +18 -0
- package/dist/adapters/generic-sql/migration/executor.js.map +1 -0
- package/dist/adapters/generic-sql/migration/prepared-migrations.d.ts +66 -0
- package/dist/adapters/generic-sql/migration/prepared-migrations.d.ts.map +1 -0
- package/dist/adapters/generic-sql/migration/prepared-migrations.js +68 -0
- package/dist/adapters/generic-sql/migration/prepared-migrations.js.map +1 -0
- package/dist/adapters/generic-sql/migration/sql-generator.js +212 -0
- package/dist/adapters/generic-sql/migration/sql-generator.js.map +1 -0
- package/dist/adapters/generic-sql/query/create-sql-query-compiler.js +32 -0
- package/dist/adapters/generic-sql/query/create-sql-query-compiler.js.map +1 -0
- package/dist/adapters/generic-sql/query/cursor-utils.js +37 -0
- package/dist/adapters/generic-sql/query/cursor-utils.js.map +1 -0
- package/dist/adapters/generic-sql/query/dialect/mysql.js +33 -0
- package/dist/adapters/generic-sql/query/dialect/mysql.js.map +1 -0
- package/dist/adapters/generic-sql/query/dialect/postgres.js +32 -0
- package/dist/adapters/generic-sql/query/dialect/postgres.js.map +1 -0
- package/dist/adapters/generic-sql/query/dialect/sqlite.js +32 -0
- package/dist/adapters/generic-sql/query/dialect/sqlite.js.map +1 -0
- package/dist/adapters/generic-sql/query/generic-sql-uow-operation-compiler.js +152 -0
- package/dist/adapters/generic-sql/query/generic-sql-uow-operation-compiler.js.map +1 -0
- package/dist/adapters/generic-sql/query/select-builder.js +69 -0
- package/dist/adapters/generic-sql/query/select-builder.js.map +1 -0
- package/dist/adapters/generic-sql/query/sql-query-compiler.js +145 -0
- package/dist/adapters/generic-sql/query/sql-query-compiler.js.map +1 -0
- package/dist/adapters/generic-sql/query/where-builder.js +129 -0
- package/dist/adapters/generic-sql/query/where-builder.js.map +1 -0
- package/dist/adapters/generic-sql/result-interpreter.js +74 -0
- package/dist/adapters/generic-sql/result-interpreter.js.map +1 -0
- package/dist/adapters/generic-sql/uow-decoder.js +105 -0
- package/dist/adapters/generic-sql/uow-decoder.js.map +1 -0
- package/dist/adapters/generic-sql/uow-encoder.js +93 -0
- package/dist/adapters/generic-sql/uow-encoder.js.map +1 -0
- package/dist/adapters/kysely/kysely-adapter.d.ts +5 -18
- package/dist/adapters/kysely/kysely-adapter.d.ts.map +1 -1
- package/dist/adapters/kysely/kysely-adapter.js +6 -165
- package/dist/adapters/kysely/kysely-adapter.js.map +1 -1
- package/dist/adapters/{drizzle/drizzle-query.js → shared/from-unit-of-work-compiler.js} +47 -61
- package/dist/adapters/shared/from-unit-of-work-compiler.js.map +1 -0
- package/dist/adapters/{drizzle/shared.d.ts → shared/table-name-mapper.d.ts} +2 -4
- package/dist/adapters/shared/table-name-mapper.d.ts.map +1 -0
- package/dist/adapters/shared/table-name-mapper.js +43 -0
- package/dist/adapters/shared/table-name-mapper.js.map +1 -0
- package/dist/adapters/shared/uow-operation-compiler.js +105 -0
- package/dist/adapters/shared/uow-operation-compiler.js.map +1 -0
- package/dist/db-fragment-definition-builder.d.ts +53 -19
- package/dist/db-fragment-definition-builder.d.ts.map +1 -1
- package/dist/db-fragment-definition-builder.js +89 -19
- package/dist/db-fragment-definition-builder.js.map +1 -1
- package/dist/fragments/internal-fragment.d.ts +39 -5
- package/dist/fragments/internal-fragment.d.ts.map +1 -1
- package/dist/fragments/internal-fragment.js +82 -10
- package/dist/fragments/internal-fragment.js.map +1 -1
- package/dist/hooks/hooks.d.ts +51 -0
- package/dist/hooks/hooks.d.ts.map +1 -0
- package/dist/hooks/hooks.js +88 -0
- package/dist/hooks/hooks.js.map +1 -0
- package/dist/migration-engine/generation-engine.d.ts +0 -2
- package/dist/migration-engine/generation-engine.d.ts.map +1 -1
- package/dist/migration-engine/generation-engine.js +23 -61
- package/dist/migration-engine/generation-engine.js.map +1 -1
- package/dist/mod.d.ts +34 -10
- package/dist/mod.d.ts.map +1 -1
- package/dist/mod.js +47 -16
- package/dist/mod.js.map +1 -1
- package/dist/node_modules/.pnpm/{rou3@0.7.8 → rou3@0.7.10}/node_modules/rou3/dist/index.js +1 -1
- package/dist/node_modules/.pnpm/rou3@0.7.10/node_modules/rou3/dist/index.js.map +1 -0
- package/dist/packages/fragno/dist/api/fragment-instantiator.js +69 -31
- package/dist/packages/fragno/dist/api/fragment-instantiator.js.map +1 -1
- package/dist/query/column-defaults.js +27 -0
- package/dist/query/column-defaults.js.map +1 -0
- package/dist/query/cursor.d.ts +4 -4
- package/dist/query/cursor.d.ts.map +1 -1
- package/dist/query/cursor.js +8 -6
- package/dist/query/cursor.js.map +1 -1
- package/dist/query/orm/orm.d.ts +1 -1
- package/dist/query/orm/orm.js.map +1 -1
- package/dist/query/serialize/create-sql-serializer.js +30 -0
- package/dist/query/serialize/create-sql-serializer.js.map +1 -0
- package/dist/query/serialize/dialect/mysql-serializer.js +87 -0
- package/dist/query/serialize/dialect/mysql-serializer.js.map +1 -0
- package/dist/query/serialize/dialect/postgres-serializer.js +80 -0
- package/dist/query/serialize/dialect/postgres-serializer.js.map +1 -0
- package/dist/query/serialize/dialect/sqlite-serializer.js +93 -0
- package/dist/query/serialize/dialect/sqlite-serializer.js.map +1 -0
- package/dist/query/serialize/sql-serializer.js +67 -0
- package/dist/query/serialize/sql-serializer.js.map +1 -0
- package/dist/query/{query.d.ts → simple-query-interface.d.ts} +5 -5
- package/dist/query/simple-query-interface.d.ts.map +1 -0
- package/dist/query/{execute-unit-of-work.d.ts → unit-of-work/execute-unit-of-work.d.ts} +13 -3
- package/dist/query/unit-of-work/execute-unit-of-work.d.ts.map +1 -0
- package/dist/query/{execute-unit-of-work.js → unit-of-work/execute-unit-of-work.js} +17 -4
- package/dist/query/unit-of-work/execute-unit-of-work.js.map +1 -0
- package/dist/query/{retry-policy.d.ts → unit-of-work/retry-policy.d.ts} +1 -1
- package/dist/query/unit-of-work/retry-policy.d.ts.map +1 -0
- package/dist/query/{retry-policy.js → unit-of-work/retry-policy.js} +1 -1
- package/dist/query/unit-of-work/retry-policy.js.map +1 -0
- package/dist/query/{unit-of-work.d.ts → unit-of-work/unit-of-work.d.ts} +51 -18
- package/dist/query/unit-of-work/unit-of-work.d.ts.map +1 -0
- package/dist/query/{unit-of-work.js → unit-of-work/unit-of-work.js} +58 -11
- package/dist/query/unit-of-work/unit-of-work.js.map +1 -0
- package/dist/query/value-decoding.js +71 -0
- package/dist/query/value-decoding.js.map +1 -0
- package/dist/query/value-encoding.js +124 -0
- package/dist/query/value-encoding.js.map +1 -0
- package/dist/schema/create.d.ts +3 -0
- package/dist/schema/create.d.ts.map +1 -1
- package/dist/schema/create.js +4 -0
- package/dist/schema/create.js.map +1 -1
- package/dist/schema/type-conversion/create-sql-type-mapper.js +29 -0
- package/dist/schema/type-conversion/create-sql-type-mapper.js.map +1 -0
- package/dist/schema/type-conversion/dialect/mysql.js +57 -0
- package/dist/schema/type-conversion/dialect/mysql.js.map +1 -0
- package/dist/schema/type-conversion/dialect/postgres.js +56 -0
- package/dist/schema/type-conversion/dialect/postgres.js.map +1 -0
- package/dist/schema/type-conversion/dialect/sqlite.js +52 -0
- package/dist/schema/type-conversion/dialect/sqlite.js.map +1 -0
- package/dist/schema/type-conversion/type-mapping.js +63 -0
- package/dist/schema/type-conversion/type-mapping.js.map +1 -0
- package/dist/sql-driver/connection/connection-provider.d.ts +13 -0
- package/dist/sql-driver/connection/connection-provider.d.ts.map +1 -0
- package/dist/sql-driver/connection/connection-provider.js +19 -0
- package/dist/sql-driver/connection/connection-provider.js.map +1 -0
- package/dist/sql-driver/connection/single-connection-provider.js +23 -0
- package/dist/sql-driver/connection/single-connection-provider.js.map +1 -0
- package/dist/sql-driver/dialect-adapter/dialect-adapter.d.ts +7 -0
- package/dist/sql-driver/dialect-adapter/dialect-adapter.d.ts.map +1 -0
- package/dist/sql-driver/dialects/dialects.d.ts +2 -0
- package/dist/sql-driver/dialects/dialects.js +3 -0
- package/dist/sql-driver/dialects/durable-object-dialect.d.ts +72 -0
- package/dist/sql-driver/dialects/durable-object-dialect.d.ts.map +1 -0
- package/dist/sql-driver/dialects/durable-object-dialect.js +130 -0
- package/dist/sql-driver/dialects/durable-object-dialect.js.map +1 -0
- package/dist/sql-driver/driver/runtime-driver.d.ts +23 -0
- package/dist/sql-driver/driver/runtime-driver.d.ts.map +1 -0
- package/dist/sql-driver/driver/runtime-driver.js +56 -0
- package/dist/sql-driver/driver/runtime-driver.js.map +1 -0
- package/dist/sql-driver/query-executor/default-query-executor.js +26 -0
- package/dist/sql-driver/query-executor/default-query-executor.js.map +1 -0
- package/dist/sql-driver/query-executor/plugin.d.ts +17 -0
- package/dist/sql-driver/query-executor/plugin.d.ts.map +1 -0
- package/dist/sql-driver/query-executor/query-executor-base.js +25 -0
- package/dist/sql-driver/query-executor/query-executor-base.js.map +1 -0
- package/dist/sql-driver/query-executor/query-executor.d.ts +36 -0
- package/dist/sql-driver/query-executor/query-executor.d.ts.map +1 -0
- package/dist/sql-driver/sql-driver-adapter.d.ts +29 -0
- package/dist/sql-driver/sql-driver-adapter.d.ts.map +1 -0
- package/dist/sql-driver/sql-driver-adapter.js +68 -0
- package/dist/sql-driver/sql-driver-adapter.js.map +1 -0
- package/dist/sql-driver/sql-driver.d.ts +38 -0
- package/dist/sql-driver/sql-driver.d.ts.map +1 -0
- package/dist/sql-driver/sql-driver.js +1 -0
- package/dist/sql-driver/sql.js +50 -0
- package/dist/sql-driver/sql.js.map +1 -0
- package/dist/with-database.d.ts +6 -2
- package/dist/with-database.d.ts.map +1 -1
- package/dist/with-database.js +1 -1
- package/dist/with-database.js.map +1 -1
- package/package.json +37 -10
- package/src/adapters/adapters.ts +8 -5
- package/src/adapters/drizzle/drizzle-adapter-pglite.test.ts +60 -169
- package/src/adapters/drizzle/{drizzle-adapter-sqlite.test.ts → drizzle-adapter-sqlite3.test.ts} +31 -55
- package/src/adapters/drizzle/drizzle-adapter.ts +15 -107
- package/src/adapters/drizzle/generate.test.ts +2 -2
- package/src/adapters/drizzle/generate.ts +78 -34
- package/src/adapters/drizzle/migrate-drizzle.test.ts +19 -0
- package/src/adapters/drizzle/shared.ts +0 -34
- package/src/adapters/drizzle/test-utils.ts +3 -3
- package/src/adapters/generic-sql/README.md +14 -0
- package/src/adapters/generic-sql/driver-config.ts +144 -0
- package/src/adapters/generic-sql/generic-sql-adapter.test.ts +50 -0
- package/src/adapters/generic-sql/generic-sql-adapter.ts +146 -0
- package/src/adapters/generic-sql/generic-sql-uow-executor.ts +130 -0
- package/src/adapters/generic-sql/migration/cold-kysely.ts +55 -0
- package/src/adapters/{kysely/migration/execute-mysql.test.ts → generic-sql/migration/dialect/mysql.test.ts} +342 -484
- package/src/adapters/generic-sql/migration/dialect/mysql.ts +104 -0
- package/src/adapters/generic-sql/migration/dialect/postgres.test.ts +1008 -0
- package/src/adapters/generic-sql/migration/dialect/postgres.ts +113 -0
- package/src/adapters/{kysely/migration/execute-sqlite.test.ts → generic-sql/migration/dialect/sqlite.test.ts} +307 -510
- package/src/adapters/generic-sql/migration/dialect/sqlite.ts +189 -0
- package/src/adapters/generic-sql/migration/executor.ts +33 -0
- package/src/adapters/generic-sql/migration/prepared-migrations.test.ts +661 -0
- package/src/adapters/generic-sql/migration/prepared-migrations.ts +214 -0
- package/src/adapters/generic-sql/migration/sql-generator.ts +413 -0
- package/src/adapters/generic-sql/query/create-sql-query-compiler.ts +36 -0
- package/src/adapters/generic-sql/query/cursor-utils.ts +56 -0
- package/src/adapters/generic-sql/query/dialect/mysql.ts +34 -0
- package/src/adapters/generic-sql/query/dialect/postgres.ts +32 -0
- package/src/adapters/generic-sql/query/dialect/sqlite.ts +32 -0
- package/src/adapters/generic-sql/query/generic-sql-uow-operation-compiler.test.ts +1568 -0
- package/src/adapters/generic-sql/query/generic-sql-uow-operation-compiler.ts +314 -0
- package/src/adapters/generic-sql/query/select-builder.test.ts +256 -0
- package/src/adapters/generic-sql/query/select-builder.ts +137 -0
- package/src/adapters/generic-sql/query/sql-query-compiler.test.ts +195 -0
- package/src/adapters/generic-sql/query/sql-query-compiler.ts +367 -0
- package/src/adapters/generic-sql/query/where-builder.test.ts +744 -0
- package/src/adapters/generic-sql/query/where-builder.ts +211 -0
- package/src/adapters/generic-sql/result-interpreter.ts +102 -0
- package/src/adapters/generic-sql/test/generic-drizzle-adapter-sqlite3.test.ts +899 -0
- package/src/adapters/generic-sql/uow-decoder.test.ts +399 -0
- package/src/adapters/generic-sql/uow-decoder.ts +152 -0
- package/src/adapters/generic-sql/uow-encoder.test.ts +183 -0
- package/src/adapters/generic-sql/uow-encoder.ts +131 -0
- package/src/adapters/kysely/kysely-adapter-pglite.test.ts +26 -76
- package/src/adapters/kysely/{kysely-adapter-sqlite.test.ts → kysely-adapter-sqlocal.test.ts} +76 -17
- package/src/adapters/kysely/kysely-adapter.ts +10 -250
- package/src/adapters/{drizzle/drizzle-query.ts → shared/from-unit-of-work-compiler.ts} +110 -104
- package/src/adapters/shared/table-name-mapper.ts +50 -0
- package/src/adapters/shared/uow-operation-compiler.ts +211 -0
- package/src/db-fragment-definition-builder.test.ts +2 -2
- package/src/db-fragment-definition-builder.ts +281 -50
- package/src/db-fragment-instantiator.test.ts +78 -2
- package/src/db-fragment-integration.test.ts +14 -16
- package/src/fragments/internal-fragment.test.ts +434 -45
- package/src/fragments/internal-fragment.ts +184 -20
- package/src/hooks/hooks.test.ts +575 -0
- package/src/hooks/hooks.ts +179 -0
- package/src/migration-engine/generation-engine.test.ts +44 -54
- package/src/migration-engine/generation-engine.ts +48 -94
- package/src/mod.ts +117 -29
- package/src/query/column-defaults.ts +49 -0
- package/src/query/cursor.test.ts +31 -6
- package/src/query/cursor.ts +11 -7
- package/src/query/orm/orm.ts +1 -1
- package/src/query/query-type.test.ts +9 -9
- package/src/query/serialize/create-sql-serializer.ts +34 -0
- package/src/query/serialize/dialect/mysql-serializer.ts +142 -0
- package/src/query/serialize/dialect/postgres-serializer.ts +129 -0
- package/src/query/serialize/dialect/sqlite-serializer.test.ts +251 -0
- package/src/query/serialize/dialect/sqlite-serializer.ts +156 -0
- package/src/query/serialize/sql-serializer.ts +143 -0
- package/src/query/{query.ts → simple-query-interface.ts} +2 -2
- package/src/query/{execute-unit-of-work.test.ts → unit-of-work/execute-unit-of-work.test.ts} +16 -16
- package/src/query/{execute-unit-of-work.ts → unit-of-work/execute-unit-of-work.ts} +49 -8
- package/src/query/{unit-of-work-coordinator.test.ts → unit-of-work/unit-of-work-coordinator.test.ts} +41 -43
- package/src/query/{unit-of-work-types.test.ts → unit-of-work/unit-of-work-types.test.ts} +5 -3
- package/src/query/{unit-of-work.test.ts → unit-of-work/unit-of-work.test.ts} +100 -9
- package/src/query/{unit-of-work.ts → unit-of-work/unit-of-work.ts} +135 -32
- package/src/query/{result-transform.test.ts → value-decoding.test.ts} +45 -427
- package/src/query/value-decoding.ts +113 -0
- package/src/query/value-encoding.test.ts +390 -0
- package/src/query/value-encoding.ts +168 -0
- package/src/schema/create.test.ts +5 -1
- package/src/schema/create.ts +5 -0
- package/src/schema/serialize.test.ts +165 -407
- package/src/schema/type-conversion/create-sql-type-mapper.ts +28 -0
- package/src/schema/type-conversion/dialect/mysql.ts +64 -0
- package/src/schema/type-conversion/dialect/postgres.ts +62 -0
- package/src/schema/type-conversion/dialect/sqlite.ts +63 -0
- package/src/schema/type-conversion/type-mapping.test.ts +137 -0
- package/src/schema/type-conversion/type-mapping.ts +153 -0
- package/src/shared/connection-pool.ts +5 -5
- package/src/sql-driver/better-sqlite3.test.ts +126 -0
- package/src/sql-driver/connection/connection-provider.ts +27 -0
- package/src/sql-driver/connection/single-connection-provider.ts +42 -0
- package/src/sql-driver/dialect-adapter/dialect-adapter.ts +9 -0
- package/src/sql-driver/dialect-adapter/sqlite-dialect-adapter.ts +7 -0
- package/src/sql-driver/dialects/dialects.ts +1 -0
- package/src/sql-driver/dialects/durable-object-dialect.ts +260 -0
- package/src/sql-driver/driver/runtime-driver.ts +91 -0
- package/src/sql-driver/query-executor/default-query-executor.ts +38 -0
- package/src/sql-driver/query-executor/plugin.ts +22 -0
- package/src/sql-driver/query-executor/query-executor-base.ts +53 -0
- package/src/sql-driver/query-executor/query-executor.ts +44 -0
- package/src/sql-driver/sql-driver-adapter.ts +96 -0
- package/src/sql-driver/sql-driver.ts +53 -0
- package/src/sql-driver/sql.ts +57 -0
- package/src/sql-driver/sqlocal.test.ts +117 -0
- package/src/with-database.ts +35 -23
- package/tsdown.config.ts +7 -2
- package/dist/adapters/drizzle/drizzle-connection-pool.js +0 -40
- package/dist/adapters/drizzle/drizzle-connection-pool.js.map +0 -1
- package/dist/adapters/drizzle/drizzle-query.d.ts +0 -23
- package/dist/adapters/drizzle/drizzle-query.d.ts.map +0 -1
- package/dist/adapters/drizzle/drizzle-query.js.map +0 -1
- package/dist/adapters/drizzle/drizzle-uow-compiler.d.ts +0 -10
- package/dist/adapters/drizzle/drizzle-uow-compiler.d.ts.map +0 -1
- package/dist/adapters/drizzle/drizzle-uow-compiler.js +0 -334
- package/dist/adapters/drizzle/drizzle-uow-compiler.js.map +0 -1
- package/dist/adapters/drizzle/drizzle-uow-decoder.js +0 -123
- package/dist/adapters/drizzle/drizzle-uow-decoder.js.map +0 -1
- package/dist/adapters/drizzle/drizzle-uow-executor.js +0 -160
- package/dist/adapters/drizzle/drizzle-uow-executor.js.map +0 -1
- package/dist/adapters/drizzle/join-column-utils.js +0 -28
- package/dist/adapters/drizzle/join-column-utils.js.map +0 -1
- package/dist/adapters/drizzle/shared.d.ts.map +0 -1
- package/dist/adapters/drizzle/shared.js +0 -35
- package/dist/adapters/drizzle/shared.js.map +0 -1
- package/dist/adapters/kysely/kysely-connection-pool.js +0 -41
- package/dist/adapters/kysely/kysely-connection-pool.js.map +0 -1
- package/dist/adapters/kysely/kysely-query-builder.js +0 -321
- package/dist/adapters/kysely/kysely-query-builder.js.map +0 -1
- package/dist/adapters/kysely/kysely-query-compiler.js +0 -67
- package/dist/adapters/kysely/kysely-query-compiler.js.map +0 -1
- package/dist/adapters/kysely/kysely-query.d.ts +0 -23
- package/dist/adapters/kysely/kysely-query.d.ts.map +0 -1
- package/dist/adapters/kysely/kysely-query.js +0 -230
- package/dist/adapters/kysely/kysely-query.js.map +0 -1
- package/dist/adapters/kysely/kysely-shared.d.ts +0 -14
- package/dist/adapters/kysely/kysely-shared.d.ts.map +0 -1
- package/dist/adapters/kysely/kysely-shared.js +0 -33
- package/dist/adapters/kysely/kysely-shared.js.map +0 -1
- package/dist/adapters/kysely/kysely-uow-compiler.js +0 -193
- package/dist/adapters/kysely/kysely-uow-compiler.js.map +0 -1
- package/dist/adapters/kysely/kysely-uow-executor.js +0 -93
- package/dist/adapters/kysely/kysely-uow-executor.js.map +0 -1
- package/dist/adapters/kysely/migration/execute-base.js +0 -128
- package/dist/adapters/kysely/migration/execute-base.js.map +0 -1
- package/dist/adapters/kysely/migration/execute-factory.js +0 -34
- package/dist/adapters/kysely/migration/execute-factory.js.map +0 -1
- package/dist/adapters/kysely/migration/execute-mssql.js +0 -112
- package/dist/adapters/kysely/migration/execute-mssql.js.map +0 -1
- package/dist/adapters/kysely/migration/execute-mysql.js +0 -93
- package/dist/adapters/kysely/migration/execute-mysql.js.map +0 -1
- package/dist/adapters/kysely/migration/execute-postgres.js +0 -104
- package/dist/adapters/kysely/migration/execute-postgres.js.map +0 -1
- package/dist/adapters/kysely/migration/execute-sqlite.js +0 -123
- package/dist/adapters/kysely/migration/execute-sqlite.js.map +0 -1
- package/dist/adapters/kysely/migration/execute.js +0 -34
- package/dist/adapters/kysely/migration/execute.js.map +0 -1
- package/dist/migration-engine/create.d.ts +0 -37
- package/dist/migration-engine/create.d.ts.map +0 -1
- package/dist/migration-engine/create.js +0 -58
- package/dist/migration-engine/create.js.map +0 -1
- package/dist/migration-engine/shared.d.ts +0 -112
- package/dist/migration-engine/shared.d.ts.map +0 -1
- package/dist/node_modules/.pnpm/rou3@0.7.8/node_modules/rou3/dist/index.js.map +0 -1
- package/dist/query/execute-unit-of-work.d.ts.map +0 -1
- package/dist/query/execute-unit-of-work.js.map +0 -1
- package/dist/query/query.d.ts.map +0 -1
- package/dist/query/result-transform.js +0 -170
- package/dist/query/result-transform.js.map +0 -1
- package/dist/query/retry-policy.d.ts.map +0 -1
- package/dist/query/retry-policy.js.map +0 -1
- package/dist/query/unit-of-work.d.ts.map +0 -1
- package/dist/query/unit-of-work.js.map +0 -1
- package/dist/schema/serialize.js +0 -111
- package/dist/schema/serialize.js.map +0 -1
- package/src/adapters/drizzle/drizzle-adapter.test.ts +0 -122
- package/src/adapters/drizzle/drizzle-connection-pool.ts +0 -66
- package/src/adapters/drizzle/drizzle-query.test.ts +0 -499
- package/src/adapters/drizzle/drizzle-uow-compiler-mysql.test.ts +0 -1442
- package/src/adapters/drizzle/drizzle-uow-compiler-sqlite.test.ts +0 -1414
- package/src/adapters/drizzle/drizzle-uow-compiler.test.ts +0 -1400
- package/src/adapters/drizzle/drizzle-uow-compiler.ts +0 -677
- package/src/adapters/drizzle/drizzle-uow-decoder.ts +0 -228
- package/src/adapters/drizzle/drizzle-uow-executor.ts +0 -309
- package/src/adapters/drizzle/join-column-utils.test.ts +0 -79
- package/src/adapters/drizzle/join-column-utils.ts +0 -39
- package/src/adapters/kysely/kysely-connection-pool.ts +0 -70
- package/src/adapters/kysely/kysely-query-builder.test.ts +0 -1344
- package/src/adapters/kysely/kysely-query-builder.ts +0 -666
- package/src/adapters/kysely/kysely-query-compiler.ts +0 -127
- package/src/adapters/kysely/kysely-query.test.ts +0 -498
- package/src/adapters/kysely/kysely-query.ts +0 -399
- package/src/adapters/kysely/kysely-shared.ts +0 -57
- package/src/adapters/kysely/kysely-uow-compiler.test.ts +0 -986
- package/src/adapters/kysely/kysely-uow-compiler.ts +0 -350
- package/src/adapters/kysely/kysely-uow-executor.ts +0 -164
- package/src/adapters/kysely/kysely-uow-joins.test.ts +0 -794
- package/src/adapters/kysely/migration/execute-base.ts +0 -256
- package/src/adapters/kysely/migration/execute-factory.ts +0 -53
- package/src/adapters/kysely/migration/execute-mssql.ts +0 -250
- package/src/adapters/kysely/migration/execute-mysql.ts +0 -211
- package/src/adapters/kysely/migration/execute-postgres.test.ts +0 -2657
- package/src/adapters/kysely/migration/execute-postgres.ts +0 -234
- package/src/adapters/kysely/migration/execute-sqlite.ts +0 -247
- package/src/adapters/kysely/migration/execute.ts +0 -50
- package/src/adapters/kysely/migration/kysely-migrator.test.ts +0 -261
- package/src/query/result-transform.ts +0 -274
- package/src/schema/serialize.ts +0 -407
- /package/dist/query/{query.js → simple-query-interface.js} +0 -0
- /package/src/query/{retry-policy.test.ts → unit-of-work/retry-policy.test.ts} +0 -0
- /package/src/query/{retry-policy.ts → unit-of-work/retry-policy.ts} +0 -0
package/src/adapters/drizzle/{drizzle-adapter-sqlite.test.ts → drizzle-adapter-sqlite3.test.ts}
RENAMED
|
@@ -1,19 +1,13 @@
|
|
|
1
|
-
import
|
|
2
|
-
import {
|
|
1
|
+
import SQLite from "better-sqlite3";
|
|
2
|
+
import { SqliteDialect } from "kysely";
|
|
3
3
|
import { DrizzleAdapter } from "./drizzle-adapter";
|
|
4
4
|
import { beforeAll, describe, expect, expectTypeOf, it, assert } from "vitest";
|
|
5
5
|
import { column, idColumn, referenceColumn, schema, type FragnoId } from "../../schema/create";
|
|
6
|
-
import type { DBType } from "./shared";
|
|
7
|
-
import { createRequire } from "node:module";
|
|
8
|
-
import { writeAndLoadSchema } from "./test-utils";
|
|
9
6
|
import { Cursor } from "../../query/cursor";
|
|
10
|
-
import { executeUnitOfWork } from "../../query/execute-unit-of-work";
|
|
11
|
-
import { ExponentialBackoffRetryPolicy } from "../../query/retry-policy";
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
const require = createRequire(import.meta.url);
|
|
15
|
-
const { generateSQLiteDrizzleJson, generateSQLiteMigration } =
|
|
16
|
-
require("drizzle-kit/api") as typeof import("drizzle-kit/api");
|
|
7
|
+
import { executeUnitOfWork } from "../../query/unit-of-work/execute-unit-of-work";
|
|
8
|
+
import { ExponentialBackoffRetryPolicy } from "../../query/unit-of-work/retry-policy";
|
|
9
|
+
import { BetterSQLite3DriverConfig } from "../generic-sql/driver-config";
|
|
10
|
+
import { internalSchema } from "../../fragments/internal-fragment";
|
|
17
11
|
|
|
18
12
|
describe("DrizzleAdapter SQLite", () => {
|
|
19
13
|
const testSchema = schema((s) => {
|
|
@@ -98,56 +92,38 @@ describe("DrizzleAdapter SQLite", () => {
|
|
|
98
92
|
});
|
|
99
93
|
|
|
100
94
|
let adapter: DrizzleAdapter;
|
|
101
|
-
let
|
|
102
|
-
// let sqliteDb: Database.Database;
|
|
95
|
+
let sqliteDatabase: InstanceType<typeof SQLite>;
|
|
103
96
|
|
|
104
97
|
beforeAll(async () => {
|
|
105
|
-
|
|
106
|
-
const { schemaModule, cleanup } = await writeAndLoadSchema(
|
|
107
|
-
"drizzle-adapter-sqlite",
|
|
108
|
-
testSchema,
|
|
109
|
-
"sqlite",
|
|
110
|
-
"namespace",
|
|
111
|
-
);
|
|
112
|
-
|
|
113
|
-
// Write second schema to file and dynamically import it
|
|
114
|
-
const { schemaModule: schemaModule2, cleanup: cleanup2 } = await writeAndLoadSchema(
|
|
115
|
-
"drizzle-adapter-sqlite-schema2",
|
|
116
|
-
schema2,
|
|
117
|
-
"sqlite",
|
|
118
|
-
"namespace2",
|
|
119
|
-
);
|
|
98
|
+
sqliteDatabase = new SQLite(":memory:");
|
|
120
99
|
|
|
121
|
-
const
|
|
122
|
-
|
|
100
|
+
const dialect = new SqliteDialect({
|
|
101
|
+
database: sqliteDatabase,
|
|
123
102
|
});
|
|
124
103
|
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
schema: mergedSchema,
|
|
130
|
-
}) as unknown as DBType;
|
|
131
|
-
|
|
132
|
-
// Generate and run migrations for both schemas
|
|
133
|
-
const emptyJson = await generateSQLiteDrizzleJson({});
|
|
134
|
-
const targetJson = await generateSQLiteDrizzleJson(mergedSchema);
|
|
104
|
+
adapter = new DrizzleAdapter({
|
|
105
|
+
dialect,
|
|
106
|
+
driverConfig: new BetterSQLite3DriverConfig(),
|
|
107
|
+
});
|
|
135
108
|
|
|
136
|
-
|
|
109
|
+
// Create settings table first (needed for version tracking)
|
|
110
|
+
{
|
|
111
|
+
const migrations = adapter.prepareMigrations(internalSchema, "");
|
|
112
|
+
await migrations.executeWithDriver(adapter.driver, 0);
|
|
113
|
+
}
|
|
137
114
|
|
|
138
|
-
|
|
139
|
-
|
|
115
|
+
{
|
|
116
|
+
const migrations = adapter.prepareMigrations(testSchema, "namespace");
|
|
117
|
+
await migrations.executeWithDriver(adapter.driver, 0);
|
|
140
118
|
}
|
|
141
119
|
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
}
|
|
120
|
+
{
|
|
121
|
+
const migrations = adapter.prepareMigrations(schema2, "namespace2");
|
|
122
|
+
await migrations.executeWithDriver(adapter.driver, 0);
|
|
123
|
+
}
|
|
146
124
|
|
|
147
125
|
return async () => {
|
|
148
|
-
|
|
149
|
-
await cleanup();
|
|
150
|
-
await cleanup2();
|
|
126
|
+
await adapter.close();
|
|
151
127
|
};
|
|
152
128
|
}, 12000);
|
|
153
129
|
|
|
@@ -383,17 +359,17 @@ describe("DrizzleAdapter SQLite", () => {
|
|
|
383
359
|
expect(email).toMatchObject({
|
|
384
360
|
id: expect.objectContaining({
|
|
385
361
|
externalId: expect.stringMatching(/^[a-z0-9]{20,}$/),
|
|
386
|
-
internalId: expect.any(
|
|
362
|
+
internalId: expect.any(BigInt),
|
|
387
363
|
}),
|
|
388
364
|
user_id: expect.objectContaining({
|
|
389
|
-
internalId: expect.any(
|
|
365
|
+
internalId: expect.any(BigInt),
|
|
390
366
|
}),
|
|
391
367
|
email: "test@example.com",
|
|
392
368
|
is_primary: true,
|
|
393
369
|
user: {
|
|
394
370
|
id: expect.objectContaining({
|
|
395
371
|
externalId: expect.stringMatching(/^[a-z0-9]{20,}$/),
|
|
396
|
-
internalId: expect.any(
|
|
372
|
+
internalId: expect.any(BigInt),
|
|
397
373
|
}),
|
|
398
374
|
name: "Email User",
|
|
399
375
|
age: 20,
|
|
@@ -476,7 +452,7 @@ describe("DrizzleAdapter SQLite", () => {
|
|
|
476
452
|
expect(comment).toMatchObject({
|
|
477
453
|
id: expect.objectContaining({
|
|
478
454
|
externalId: expect.stringMatching(/^[a-z0-9]{20,}$/),
|
|
479
|
-
internalId: expect.any(
|
|
455
|
+
internalId: expect.any(BigInt),
|
|
480
456
|
}),
|
|
481
457
|
text: "Great post!",
|
|
482
458
|
// Post join (first level)
|
|
@@ -1,116 +1,22 @@
|
|
|
1
|
-
import type { DatabaseAdapter
|
|
1
|
+
import type { DatabaseAdapter } from "../adapters";
|
|
2
2
|
import { type AnySchema } from "../../schema/create";
|
|
3
|
-
import type { AbstractQuery } from "../../query/query";
|
|
4
3
|
import type { SchemaGenerator } from "../../schema-generator/schema-generator";
|
|
5
4
|
import { generateSchema } from "./generate";
|
|
6
|
-
import {
|
|
7
|
-
import { createTableNameMapper, type DBType, type DrizzleResult } from "./shared";
|
|
8
|
-
import { sql } from "drizzle-orm";
|
|
9
|
-
import { settingsSchema, SETTINGS_TABLE_NAME } from "../../fragments/internal-fragment";
|
|
10
|
-
import {
|
|
11
|
-
fragnoDatabaseAdapterNameFakeSymbol,
|
|
12
|
-
fragnoDatabaseAdapterVersionFakeSymbol,
|
|
13
|
-
} from "../adapters";
|
|
14
|
-
import type { ConnectionPool } from "../../shared/connection-pool";
|
|
15
|
-
import { createDrizzleConnectionPool } from "./drizzle-connection-pool";
|
|
16
|
-
import { RequestContextStorage } from "@fragno-dev/core/internal/request-context-storage";
|
|
17
|
-
|
|
18
|
-
export interface DrizzleConfig {
|
|
19
|
-
db: unknown | (() => unknown | Promise<unknown>);
|
|
20
|
-
provider: "sqlite" | "mysql" | "postgresql";
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
export class DrizzleAdapter implements DatabaseAdapter<DrizzleUOWConfig> {
|
|
24
|
-
#connectionPool: ConnectionPool<DBType>;
|
|
25
|
-
#provider: "sqlite" | "mysql" | "postgresql";
|
|
26
|
-
#schemaNamespaceMap = new WeakMap<AnySchema, string>();
|
|
27
|
-
#contextStorage: RequestContextStorage<DatabaseContextStorage>;
|
|
28
|
-
|
|
29
|
-
constructor(config: DrizzleConfig) {
|
|
30
|
-
this.#connectionPool = createDrizzleConnectionPool(
|
|
31
|
-
config.db as DBType | (() => DBType | Promise<DBType>),
|
|
32
|
-
);
|
|
33
|
-
this.#provider = config.provider;
|
|
34
|
-
this.#contextStorage = new RequestContextStorage();
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
get [fragnoDatabaseAdapterNameFakeSymbol](): string {
|
|
38
|
-
return "drizzle";
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
get [fragnoDatabaseAdapterVersionFakeSymbol](): number {
|
|
42
|
-
return 0;
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
get contextStorage(): RequestContextStorage<DatabaseContextStorage> {
|
|
46
|
-
return this.#contextStorage;
|
|
47
|
-
}
|
|
5
|
+
import { createTableNameMapper } from "../shared/table-name-mapper";
|
|
48
6
|
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
return createTableNameMapper(namespace);
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
get provider(): "sqlite" | "mysql" | "postgresql" {
|
|
58
|
-
return this.#provider;
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
async isConnectionHealthy(): Promise<boolean> {
|
|
62
|
-
const conn = await this.#connectionPool.connect();
|
|
63
|
-
try {
|
|
64
|
-
const result = await conn.db.execute(sql`SELECT 1 as healthy`);
|
|
65
|
-
|
|
66
|
-
// Handle different result formats across providers
|
|
67
|
-
// PostgreSQL/MySQL: { rows: [...] }
|
|
68
|
-
// SQLite: array directly or { rows: [...] }
|
|
69
|
-
if (Array.isArray(result)) {
|
|
70
|
-
return result.length > 0 && result[0]["healthy"] === 1;
|
|
71
|
-
} else {
|
|
72
|
-
const drizzleResult = result as DrizzleResult;
|
|
73
|
-
return drizzleResult.rows[0]["healthy"] === 1;
|
|
74
|
-
}
|
|
75
|
-
} catch {
|
|
76
|
-
return false;
|
|
77
|
-
} finally {
|
|
78
|
-
await conn.release();
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
async getSchemaVersion(namespace: string): Promise<string | undefined> {
|
|
83
|
-
// Note: This looks up arbitrary fragment schema versions (e.g., "my-fragment.schema_version")
|
|
84
|
-
// which are different from Fragno's internal settings (prefixed with SETTINGS_NAMESPACE)
|
|
85
|
-
// So we can't use the internal fragment here, we need direct query engine access
|
|
86
|
-
const queryEngine = this.createQueryEngine(settingsSchema, "");
|
|
7
|
+
import {
|
|
8
|
+
GenericSQLAdapter,
|
|
9
|
+
type GenericSQLOptions,
|
|
10
|
+
type UnitOfWorkConfig,
|
|
11
|
+
} from "../generic-sql/generic-sql-adapter";
|
|
87
12
|
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
b.whereIndex("unique_key", (eb) => eb("key", "=", `${namespace}.schema_version`)),
|
|
92
|
-
);
|
|
93
|
-
const [[result]] = await uow.executeRetrieve();
|
|
94
|
-
return result?.value;
|
|
13
|
+
export class DrizzleAdapter extends GenericSQLAdapter implements DatabaseAdapter<UnitOfWorkConfig> {
|
|
14
|
+
constructor(options: GenericSQLOptions) {
|
|
15
|
+
super(options);
|
|
95
16
|
}
|
|
96
17
|
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
namespace: string,
|
|
100
|
-
): AbstractQuery<TSchema, DrizzleUOWConfig> {
|
|
101
|
-
// Register schema-namespace mapping
|
|
102
|
-
this.#schemaNamespaceMap.set(schema, namespace);
|
|
103
|
-
|
|
104
|
-
// Only create mapper if namespace is non-empty
|
|
105
|
-
const mapper = namespace ? createTableNameMapper(namespace) : undefined;
|
|
106
|
-
return fromDrizzle(
|
|
107
|
-
schema,
|
|
108
|
-
this.#connectionPool,
|
|
109
|
-
this.#provider,
|
|
110
|
-
mapper,
|
|
111
|
-
undefined,
|
|
112
|
-
this.#schemaNamespaceMap,
|
|
113
|
-
);
|
|
18
|
+
override createTableNameMapper(namespace: string) {
|
|
19
|
+
return createTableNameMapper(namespace, false);
|
|
114
20
|
}
|
|
115
21
|
|
|
116
22
|
createSchemaGenerator(
|
|
@@ -122,7 +28,9 @@ export class DrizzleAdapter implements DatabaseAdapter<DrizzleUOWConfig> {
|
|
|
122
28
|
const path = genOptions?.path ?? options?.path ?? "fragno-schema.ts";
|
|
123
29
|
|
|
124
30
|
return {
|
|
125
|
-
schema: generateSchema(fragments, this
|
|
31
|
+
schema: generateSchema(fragments, this.driverConfig.databaseType, {
|
|
32
|
+
mapperFactory: (ns) => (ns ? this.createTableNameMapper(ns) : undefined),
|
|
33
|
+
}),
|
|
126
34
|
path,
|
|
127
35
|
};
|
|
128
36
|
},
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { describe, expect, it } from "vitest";
|
|
2
2
|
import { column, idColumn, referenceColumn, schema } from "../../schema/create";
|
|
3
3
|
import { generateSchema } from "./generate";
|
|
4
|
-
import {
|
|
4
|
+
import { internalSchema } from "../../fragments/internal-fragment";
|
|
5
5
|
|
|
6
6
|
describe("generateSchema", () => {
|
|
7
7
|
const testSchema = schema((s) => {
|
|
@@ -1072,7 +1072,7 @@ describe("generateSchema", () => {
|
|
|
1072
1072
|
// This test verifies generateSchema works correctly with already-deduplicated inputs
|
|
1073
1073
|
const generated = generateSchema(
|
|
1074
1074
|
[
|
|
1075
|
-
{ namespace: "", schema:
|
|
1075
|
+
{ namespace: "", schema: internalSchema }, // Internal fragment (namespace: "")
|
|
1076
1076
|
{ namespace: "fragment1", schema: fragment1Schema },
|
|
1077
1077
|
{ namespace: "fragment2", schema: fragment2Schema },
|
|
1078
1078
|
],
|
|
@@ -8,8 +8,13 @@ import {
|
|
|
8
8
|
InternalIdColumn,
|
|
9
9
|
} from "../../schema/create";
|
|
10
10
|
import type { SQLProvider } from "../../shared/providers";
|
|
11
|
-
import {
|
|
12
|
-
|
|
11
|
+
import {
|
|
12
|
+
createTableNameMapper,
|
|
13
|
+
sanitizeNamespace,
|
|
14
|
+
type TableNameMapper,
|
|
15
|
+
} from "../shared/table-name-mapper";
|
|
16
|
+
import { type DatabaseTypeLiteral } from "../../schema/type-conversion/type-mapping";
|
|
17
|
+
import { createSQLTypeMapper } from "../../schema/type-conversion/create-sql-type-mapper";
|
|
13
18
|
|
|
14
19
|
// ============================================================================
|
|
15
20
|
// PROVIDER CONFIGURATION
|
|
@@ -98,10 +103,11 @@ function generateCustomType(
|
|
|
98
103
|
|
|
99
104
|
function generateBinaryCustomType(ctx: GeneratorContext, customTypes: string[]): string {
|
|
100
105
|
const name = "customBinary";
|
|
106
|
+
const typeMapper = createSQLTypeMapper(ctx.provider);
|
|
101
107
|
const code = generateCustomType(ctx, name, {
|
|
102
108
|
dataType: "Uint8Array",
|
|
103
109
|
driverDataType: "Buffer",
|
|
104
|
-
databaseDataType:
|
|
110
|
+
databaseDataType: typeMapper.getDatabaseType({ type: "binary" }),
|
|
105
111
|
fromDriverCode: "return new Uint8Array(value.buffer, value.byteOffset, value.byteLength)",
|
|
106
112
|
toDriverCode: `return value instanceof Buffer? value : Buffer.from(value)`,
|
|
107
113
|
});
|
|
@@ -124,15 +130,16 @@ interface ColumnTypeFunction {
|
|
|
124
130
|
|
|
125
131
|
/**
|
|
126
132
|
* Maps SQL database types to Drizzle function names and parameters.
|
|
127
|
-
* Uses
|
|
133
|
+
* Uses SQLTypeMapper as the source of truth for type conversion.
|
|
128
134
|
*/
|
|
129
135
|
function getColumnTypeFunction(
|
|
130
136
|
ctx: GeneratorContext,
|
|
131
137
|
column: AnyColumn,
|
|
132
138
|
customTypes: string[],
|
|
133
139
|
): ColumnTypeFunction {
|
|
134
|
-
// Get the canonical database type from
|
|
135
|
-
const
|
|
140
|
+
// Get the canonical database type from type mapper
|
|
141
|
+
const typeMapper = createSQLTypeMapper(ctx.provider);
|
|
142
|
+
const dbType = typeMapper.getDatabaseType(column);
|
|
136
143
|
|
|
137
144
|
// Map database types to Drizzle function names
|
|
138
145
|
return mapDBTypeToDrizzleFunction(ctx, dbType, column, customTypes);
|
|
@@ -143,7 +150,7 @@ function getColumnTypeFunction(
|
|
|
143
150
|
*/
|
|
144
151
|
function mapDBTypeToDrizzleFunction(
|
|
145
152
|
ctx: GeneratorContext,
|
|
146
|
-
dbType:
|
|
153
|
+
dbType: DatabaseTypeLiteral,
|
|
147
154
|
column: AnyColumn,
|
|
148
155
|
customTypes: string[],
|
|
149
156
|
): ColumnTypeFunction {
|
|
@@ -231,6 +238,24 @@ function mapDBTypeToDrizzleFunction(
|
|
|
231
238
|
return { name: dbType };
|
|
232
239
|
}
|
|
233
240
|
|
|
241
|
+
// ============================================================================
|
|
242
|
+
// TABLE NAME HELPERS
|
|
243
|
+
// ============================================================================
|
|
244
|
+
|
|
245
|
+
/**
|
|
246
|
+
* Get the physical table name (with namespace suffix) using the mapper if available
|
|
247
|
+
*/
|
|
248
|
+
function getPhysicalTableName(
|
|
249
|
+
logicalName: string,
|
|
250
|
+
namespace: string | undefined,
|
|
251
|
+
mapper: TableNameMapper | undefined,
|
|
252
|
+
): string {
|
|
253
|
+
if (!namespace) {
|
|
254
|
+
return logicalName;
|
|
255
|
+
}
|
|
256
|
+
return mapper ? mapper.toPhysical(logicalName) : `${logicalName}_${sanitizeNamespace(namespace)}`;
|
|
257
|
+
}
|
|
258
|
+
|
|
234
259
|
// ============================================================================
|
|
235
260
|
// COLUMN GENERATION
|
|
236
261
|
// ============================================================================
|
|
@@ -318,8 +343,12 @@ function generateAllColumns(
|
|
|
318
343
|
// CONSTRAINT GENERATION
|
|
319
344
|
// ============================================================================
|
|
320
345
|
|
|
321
|
-
function generateForeignKeys(
|
|
322
|
-
|
|
346
|
+
function generateForeignKeys(
|
|
347
|
+
ctx: GeneratorContext,
|
|
348
|
+
table: AnyTable,
|
|
349
|
+
namespace?: string,
|
|
350
|
+
mapper?: TableNameMapper,
|
|
351
|
+
): string[] {
|
|
323
352
|
const keys: string[] = [];
|
|
324
353
|
|
|
325
354
|
for (const relation of Object.values(table.relations)) {
|
|
@@ -341,7 +370,7 @@ function generateForeignKeys(ctx: GeneratorContext, table: AnyTable, namespace?:
|
|
|
341
370
|
if (isSelfReference) {
|
|
342
371
|
foreignColumns.push(`table.${actualRefCol}`);
|
|
343
372
|
} else {
|
|
344
|
-
//
|
|
373
|
+
// Use sanitized TypeScript export name for identifier reference
|
|
345
374
|
const foreignTableRef = namespace
|
|
346
375
|
? `${relation.table.ormName}_${sanitizeNamespace(namespace)}`
|
|
347
376
|
: relation.table.ormName;
|
|
@@ -391,8 +420,12 @@ function generateTableConstraints(
|
|
|
391
420
|
ctx: GeneratorContext,
|
|
392
421
|
table: AnyTable,
|
|
393
422
|
namespace?: string,
|
|
423
|
+
mapper?: TableNameMapper,
|
|
394
424
|
): string[] {
|
|
395
|
-
return [
|
|
425
|
+
return [
|
|
426
|
+
...generateForeignKeys(ctx, table, namespace, mapper),
|
|
427
|
+
...generateIndexes(ctx, table, namespace),
|
|
428
|
+
];
|
|
396
429
|
}
|
|
397
430
|
|
|
398
431
|
// ============================================================================
|
|
@@ -404,20 +437,18 @@ function generateTable(
|
|
|
404
437
|
table: AnyTable,
|
|
405
438
|
customTypes: string[],
|
|
406
439
|
namespace?: string,
|
|
440
|
+
mapper?: TableNameMapper,
|
|
407
441
|
): string {
|
|
408
442
|
const tableFn = PROVIDER_TABLE_FUNCTIONS[ctx.provider];
|
|
409
443
|
ctx.imports.addImport(tableFn, ctx.importSource);
|
|
410
444
|
|
|
411
445
|
const columns = generateAllColumns(ctx, table, customTypes);
|
|
412
|
-
const constraints = generateTableConstraints(ctx, table, namespace);
|
|
446
|
+
const constraints = generateTableConstraints(ctx, table, namespace, mapper);
|
|
413
447
|
|
|
414
|
-
//
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
: table.ormName;
|
|
419
|
-
// Same sanitized name for TypeScript export
|
|
420
|
-
const exportName = physicalTableName;
|
|
448
|
+
// Physical table name in the database (respects mapper configuration)
|
|
449
|
+
const physicalTableName = getPhysicalTableName(table.ormName, namespace, mapper);
|
|
450
|
+
// TypeScript export name must always be sanitized to be a valid JavaScript identifier
|
|
451
|
+
const exportName = namespace ? `${table.ormName}_${sanitizeNamespace(namespace)}` : table.ormName;
|
|
421
452
|
|
|
422
453
|
const args: string[] = [`"${physicalTableName}"`, `{\n${columns.join(",\n")}\n}`];
|
|
423
454
|
|
|
@@ -437,6 +468,7 @@ function generateRelation(
|
|
|
437
468
|
table: AnyTable,
|
|
438
469
|
namespace?: string,
|
|
439
470
|
inverseRelations?: Array<{ fromTable: AnyTable; relation: Relation }>,
|
|
471
|
+
_mapper?: TableNameMapper,
|
|
440
472
|
): string | undefined {
|
|
441
473
|
const relations: string[] = [];
|
|
442
474
|
let hasOne = false;
|
|
@@ -458,7 +490,7 @@ function generateRelation(
|
|
|
458
490
|
const fields: string[] = [];
|
|
459
491
|
const references: string[] = [];
|
|
460
492
|
|
|
461
|
-
// Use sanitized
|
|
493
|
+
// Use sanitized TypeScript export names for identifier references
|
|
462
494
|
const tableRef = namespace
|
|
463
495
|
? `${table.ormName}_${sanitizeNamespace(namespace)}`
|
|
464
496
|
: table.ormName;
|
|
@@ -496,6 +528,7 @@ function generateRelation(
|
|
|
496
528
|
if (relation.type === "one") {
|
|
497
529
|
hasMany = true;
|
|
498
530
|
|
|
531
|
+
// Use sanitized TypeScript export name for identifier reference
|
|
499
532
|
const fromTableRef = namespace
|
|
500
533
|
? `${fromTable.ormName}_${sanitizeNamespace(namespace)}`
|
|
501
534
|
: fromTable.ormName;
|
|
@@ -526,13 +559,14 @@ function generateRelation(
|
|
|
526
559
|
}
|
|
527
560
|
const relationParams = params.length > 0 ? `{ ${params.join(", ")} }` : "{}";
|
|
528
561
|
|
|
529
|
-
|
|
530
|
-
const
|
|
531
|
-
? `${table.ormName}_${sanitizeNamespace(namespace)}
|
|
532
|
-
:
|
|
562
|
+
// Use sanitized names for TypeScript export identifiers
|
|
563
|
+
const exportTableRef = namespace
|
|
564
|
+
? `${table.ormName}_${sanitizeNamespace(namespace)}`
|
|
565
|
+
: table.ormName;
|
|
566
|
+
const relationsName = namespace ? `${exportTableRef}Relations` : `${table.ormName}Relations`;
|
|
533
567
|
|
|
534
568
|
ctx.imports.addImport("relations", "drizzle-orm");
|
|
535
|
-
return `export const ${relationsName} = relations(${
|
|
569
|
+
return `export const ${relationsName} = relations(${exportTableRef}, (${relationParams}) => ({
|
|
536
570
|
${relations.join(",\n")}
|
|
537
571
|
}));`;
|
|
538
572
|
}
|
|
@@ -549,22 +583,22 @@ function generateFragmentSchemaExport(
|
|
|
549
583
|
schema: AnySchema,
|
|
550
584
|
namespace: string,
|
|
551
585
|
tablesWithRelations?: Set<string>,
|
|
586
|
+
_mapper?: TableNameMapper,
|
|
552
587
|
): string {
|
|
553
588
|
const drizzleEntries: string[] = [];
|
|
554
589
|
|
|
555
590
|
for (const table of Object.values(schema.tables)) {
|
|
556
|
-
|
|
591
|
+
// TypeScript export name (always sanitized for valid JS identifiers)
|
|
592
|
+
const exportName = namespace
|
|
557
593
|
? `${table.ormName}_${sanitizeNamespace(namespace)}`
|
|
558
594
|
: table.ormName;
|
|
559
595
|
|
|
560
596
|
// Add physical table name to drizzle schema
|
|
561
|
-
drizzleEntries.push(` ${
|
|
597
|
+
drizzleEntries.push(` ${exportName}: ${exportName}`);
|
|
562
598
|
|
|
563
599
|
// Include relations for this table if they exist (either explicit or inverse)
|
|
564
600
|
if (tablesWithRelations?.has(table.name)) {
|
|
565
|
-
const relationsName = namespace
|
|
566
|
-
? `${table.ormName}_${sanitizeNamespace(namespace)}Relations`
|
|
567
|
-
: `${table.ormName}Relations`;
|
|
601
|
+
const relationsName = namespace ? `${exportName}Relations` : `${table.ormName}Relations`;
|
|
568
602
|
|
|
569
603
|
drizzleEntries.push(` ${relationsName}: ${relationsName}`);
|
|
570
604
|
}
|
|
@@ -573,11 +607,11 @@ function generateFragmentSchemaExport(
|
|
|
573
607
|
// The key insight: Drizzle needs BOTH the table alias AND its relations alias
|
|
574
608
|
// in the same schema object for relational queries to work
|
|
575
609
|
if (namespace) {
|
|
576
|
-
drizzleEntries.push(` ${table.ormName}: ${
|
|
610
|
+
drizzleEntries.push(` ${table.ormName}: ${exportName}`);
|
|
577
611
|
|
|
578
612
|
// Also add the relations under the aliased name if they exist
|
|
579
613
|
if (tablesWithRelations?.has(table.name)) {
|
|
580
|
-
const physicalRelationsName = `${
|
|
614
|
+
const physicalRelationsName = `${exportName}Relations`;
|
|
581
615
|
const aliasRelationsName = `${table.ormName}Relations`;
|
|
582
616
|
drizzleEntries.push(` ${aliasRelationsName}: ${physicalRelationsName}`);
|
|
583
617
|
}
|
|
@@ -587,6 +621,7 @@ function generateFragmentSchemaExport(
|
|
|
587
621
|
// Add schema version as a number
|
|
588
622
|
drizzleEntries.push(` schemaVersion: ${schema.version}`);
|
|
589
623
|
|
|
624
|
+
// Use logical name (not physical) for the schema export variable name, sanitized for valid JS identifier
|
|
590
625
|
const exportName = namespace ? `${sanitizeNamespace(namespace)}_schema` : "_schema";
|
|
591
626
|
|
|
592
627
|
return `export const ${exportName} = {\n${drizzleEntries.join(",\n")}\n}`;
|
|
@@ -604,6 +639,8 @@ export interface GenerateSchemaOptions {
|
|
|
604
639
|
/** Module to import from */
|
|
605
640
|
from: string;
|
|
606
641
|
};
|
|
642
|
+
/** Optional mapper factory for creating table name mappers with custom sanitization */
|
|
643
|
+
mapperFactory?: (namespace: string | undefined) => TableNameMapper | undefined;
|
|
607
644
|
}
|
|
608
645
|
|
|
609
646
|
/**
|
|
@@ -620,9 +657,13 @@ export function generateSchema(
|
|
|
620
657
|
const ctx = createContext(provider, options?.idGeneratorImport);
|
|
621
658
|
const customTypes: string[] = [];
|
|
622
659
|
const sections: string[] = [];
|
|
660
|
+
const getMapper =
|
|
661
|
+
options?.mapperFactory ||
|
|
662
|
+
((ns: string | undefined) => (ns ? createTableNameMapper(ns, true) : undefined));
|
|
623
663
|
|
|
624
664
|
for (const { schema, namespace } of fragments) {
|
|
625
665
|
const fragmentTables: string[] = [];
|
|
666
|
+
const mapper = getMapper(namespace);
|
|
626
667
|
|
|
627
668
|
// Add section header
|
|
628
669
|
fragmentTables.push("");
|
|
@@ -636,7 +677,7 @@ export function generateSchema(
|
|
|
636
677
|
|
|
637
678
|
// Generate tables for this fragment
|
|
638
679
|
for (const table of Object.values(schema.tables)) {
|
|
639
|
-
const tableCode = generateTable(ctx, table, customTypes, namespace);
|
|
680
|
+
const tableCode = generateTable(ctx, table, customTypes, namespace, mapper);
|
|
640
681
|
fragmentTables.push("");
|
|
641
682
|
fragmentTables.push(tableCode);
|
|
642
683
|
}
|
|
@@ -663,6 +704,7 @@ export function generateSchema(
|
|
|
663
704
|
table,
|
|
664
705
|
namespace,
|
|
665
706
|
inverseRelations.get(table.name),
|
|
707
|
+
mapper,
|
|
666
708
|
);
|
|
667
709
|
if (relationCode) {
|
|
668
710
|
fragmentTables.push("");
|
|
@@ -674,7 +716,9 @@ export function generateSchema(
|
|
|
674
716
|
// Generate schema export object (skip for empty namespace to avoid duplicate _schema exports)
|
|
675
717
|
if (namespace !== "") {
|
|
676
718
|
fragmentTables.push("");
|
|
677
|
-
fragmentTables.push(
|
|
719
|
+
fragmentTables.push(
|
|
720
|
+
generateFragmentSchemaExport(schema, namespace, tablesWithRelations, mapper),
|
|
721
|
+
);
|
|
678
722
|
}
|
|
679
723
|
|
|
680
724
|
sections.push(...fragmentTables);
|
|
@@ -158,6 +158,23 @@ describe("generateSchema and migrate", () => {
|
|
|
158
158
|
"_version" integer DEFAULT 0 NOT NULL
|
|
159
159
|
);
|
|
160
160
|
|
|
161
|
+
CREATE TABLE "fragno_hooks" (
|
|
162
|
+
"id" varchar(30) NOT NULL,
|
|
163
|
+
"namespace" text NOT NULL,
|
|
164
|
+
"hookName" text NOT NULL,
|
|
165
|
+
"payload" json NOT NULL,
|
|
166
|
+
"status" text NOT NULL,
|
|
167
|
+
"attempts" integer DEFAULT 0 NOT NULL,
|
|
168
|
+
"maxAttempts" integer DEFAULT 5 NOT NULL,
|
|
169
|
+
"lastAttemptAt" timestamp,
|
|
170
|
+
"nextRetryAt" timestamp,
|
|
171
|
+
"error" text,
|
|
172
|
+
"createdAt" timestamp DEFAULT now() NOT NULL,
|
|
173
|
+
"nonce" text NOT NULL,
|
|
174
|
+
"_internalId" bigserial PRIMARY KEY NOT NULL,
|
|
175
|
+
"_version" integer DEFAULT 0 NOT NULL
|
|
176
|
+
);
|
|
177
|
+
|
|
161
178
|
CREATE TABLE "users" (
|
|
162
179
|
"id" varchar(30) NOT NULL,
|
|
163
180
|
"name" text NOT NULL,
|
|
@@ -231,6 +248,8 @@ describe("generateSchema and migrate", () => {
|
|
|
231
248
|
ALTER TABLE "postTags" ADD CONSTRAINT "postTags_posts_post_fk" FOREIGN KEY ("postId") REFERENCES "public"."posts"("_internalId") ON DELETE no action ON UPDATE no action;
|
|
232
249
|
ALTER TABLE "postTags" ADD CONSTRAINT "postTags_tags_tag_fk" FOREIGN KEY ("tagId") REFERENCES "public"."tags"("_internalId") ON DELETE no action ON UPDATE no action;
|
|
233
250
|
CREATE UNIQUE INDEX "unique_key" ON "fragno_db_settings" USING btree ("key");
|
|
251
|
+
CREATE INDEX "idx_namespace_status_retry" ON "fragno_hooks" USING btree ("namespace","status","nextRetryAt");
|
|
252
|
+
CREATE INDEX "idx_nonce" ON "fragno_hooks" USING btree ("nonce");
|
|
234
253
|
CREATE UNIQUE INDEX "idx_users_email" ON "users" USING btree ("email");
|
|
235
254
|
CREATE INDEX "idx_users_name" ON "users" USING btree ("name");
|
|
236
255
|
CREATE INDEX "idx_users_active" ON "users" USING btree ("isActive");
|
|
@@ -22,40 +22,6 @@ export function parseDrizzle(drizzle: unknown) {
|
|
|
22
22
|
return [db, drizzleTables] as const;
|
|
23
23
|
}
|
|
24
24
|
|
|
25
|
-
/**
|
|
26
|
-
* Maps logical table names (used by fragment authors) to physical table names (with namespace suffix)
|
|
27
|
-
*/
|
|
28
|
-
export interface TableNameMapper {
|
|
29
|
-
toPhysical(logicalName: string): string;
|
|
30
|
-
toLogical(physicalName: string): string;
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
/**
|
|
34
|
-
* Sanitize a namespace to be a valid JavaScript identifier
|
|
35
|
-
* Replaces hyphens and other invalid characters with underscores
|
|
36
|
-
*/
|
|
37
|
-
export function sanitizeNamespace(namespace: string): string {
|
|
38
|
-
return namespace.replace(/[^a-zA-Z0-9_]/g, "_");
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
/**
|
|
42
|
-
* Creates a table name mapper for a given namespace.
|
|
43
|
-
* Physical names have format: {logicalName}_{sanitizedNamespace}
|
|
44
|
-
* The namespace is sanitized to match TypeScript export names used in the schema
|
|
45
|
-
*/
|
|
46
|
-
export function createTableNameMapper(namespace: string): TableNameMapper {
|
|
47
|
-
const sanitized = sanitizeNamespace(namespace);
|
|
48
|
-
return {
|
|
49
|
-
toPhysical: (logicalName: string) => `${logicalName}_${sanitized}`,
|
|
50
|
-
toLogical: (physicalName: string) => {
|
|
51
|
-
if (physicalName.endsWith(`_${sanitized}`)) {
|
|
52
|
-
return physicalName.slice(0, -(sanitized.length + 1));
|
|
53
|
-
}
|
|
54
|
-
return physicalName;
|
|
55
|
-
},
|
|
56
|
-
};
|
|
57
|
-
}
|
|
58
|
-
|
|
59
25
|
export interface DrizzleResult {
|
|
60
26
|
rows: Record<string, unknown>[];
|
|
61
27
|
affectedRows: number;
|