@fragno-dev/db 0.1.14 → 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 -139
- package/CHANGELOG.md +47 -0
- package/README.md +123 -8
- package/dist/adapters/adapters.d.ts +19 -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 -19
- package/dist/adapters/drizzle/drizzle-adapter.d.ts.map +1 -1
- package/dist/adapters/drizzle/drizzle-adapter.js +7 -47
- package/dist/adapters/drizzle/drizzle-adapter.js.map +1 -1
- package/dist/adapters/drizzle/generate.d.ts +7 -1
- package/dist/adapters/drizzle/generate.d.ts.map +1 -1
- package/dist/adapters/drizzle/generate.js +46 -45
- 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 -16
- package/dist/adapters/kysely/kysely-adapter.d.ts.map +1 -1
- package/dist/adapters/kysely/kysely-adapter.js +6 -159
- package/dist/adapters/kysely/kysely-adapter.js.map +1 -1
- package/dist/adapters/{drizzle/drizzle-query.js → shared/from-unit-of-work-compiler.js} +48 -62
- package/dist/adapters/shared/from-unit-of-work-compiler.js.map +1 -0
- package/dist/adapters/{kysely/kysely-shared.d.ts → shared/table-name-mapper.d.ts} +3 -2
- 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 +186 -0
- package/dist/db-fragment-definition-builder.d.ts.map +1 -0
- package/dist/db-fragment-definition-builder.js +207 -0
- package/dist/db-fragment-definition-builder.js.map +1 -0
- package/dist/fragments/internal-fragment.d.ts +53 -0
- package/dist/fragments/internal-fragment.d.ts.map +1 -0
- package/dist/fragments/internal-fragment.js +111 -0
- package/dist/fragments/internal-fragment.js.map +1 -0
- 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 +38 -56
- package/dist/migration-engine/generation-engine.js.map +1 -1
- package/dist/mod.d.ts +35 -23
- package/dist/mod.d.ts.map +1 -1
- package/dist/mod.js +48 -45
- package/dist/mod.js.map +1 -1
- package/dist/node_modules/.pnpm/rou3@0.7.10/node_modules/rou3/dist/index.js +165 -0
- package/dist/node_modules/.pnpm/rou3@0.7.10/node_modules/rou3/dist/index.js.map +1 -0
- package/dist/packages/fragno/dist/api/bind-services.js +20 -0
- package/dist/packages/fragno/dist/api/bind-services.js.map +1 -0
- package/dist/packages/fragno/dist/api/error.js +48 -0
- package/dist/packages/fragno/dist/api/error.js.map +1 -0
- package/dist/packages/fragno/dist/api/fragment-definition-builder.js +320 -0
- package/dist/packages/fragno/dist/api/fragment-definition-builder.js.map +1 -0
- package/dist/packages/fragno/dist/api/fragment-instantiator.js +525 -0
- package/dist/packages/fragno/dist/api/fragment-instantiator.js.map +1 -0
- package/dist/packages/fragno/dist/api/fragno-response.js +73 -0
- package/dist/packages/fragno/dist/api/fragno-response.js.map +1 -0
- package/dist/packages/fragno/dist/api/internal/response-stream.js +81 -0
- package/dist/packages/fragno/dist/api/internal/response-stream.js.map +1 -0
- package/dist/packages/fragno/dist/api/internal/route.js +10 -0
- package/dist/packages/fragno/dist/api/internal/route.js.map +1 -0
- package/dist/packages/fragno/dist/api/mutable-request-state.js +97 -0
- package/dist/packages/fragno/dist/api/mutable-request-state.js.map +1 -0
- package/dist/packages/fragno/dist/api/request-context-storage.js +43 -0
- package/dist/packages/fragno/dist/api/request-context-storage.js.map +1 -0
- package/dist/packages/fragno/dist/api/request-input-context.js +118 -0
- package/dist/packages/fragno/dist/api/request-input-context.js.map +1 -0
- package/dist/packages/fragno/dist/api/request-middleware.js +83 -0
- package/dist/packages/fragno/dist/api/request-middleware.js.map +1 -0
- package/dist/packages/fragno/dist/api/request-output-context.js +119 -0
- package/dist/packages/fragno/dist/api/request-output-context.js.map +1 -0
- package/dist/packages/fragno/dist/api/route.js +17 -0
- package/dist/packages/fragno/dist/api/route.js.map +1 -0
- package/dist/packages/fragno/dist/internal/symbols.js +10 -0
- package/dist/packages/fragno/dist/internal/symbols.js.map +1 -0
- package/dist/query/column-defaults.js +27 -0
- package/dist/query/column-defaults.js.map +1 -0
- package/dist/query/cursor.d.ts +14 -6
- package/dist/query/cursor.d.ts.map +1 -1
- package/dist/query/cursor.js +16 -7
- 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} +6 -6
- package/dist/query/simple-query-interface.d.ts.map +1 -0
- package/dist/query/unit-of-work/execute-unit-of-work.d.ts +133 -0
- package/dist/query/unit-of-work/execute-unit-of-work.d.ts.map +1 -0
- package/dist/query/unit-of-work/execute-unit-of-work.js +197 -0
- package/dist/query/unit-of-work/execute-unit-of-work.js.map +1 -0
- package/dist/query/unit-of-work/retry-policy.d.ts +88 -0
- package/dist/query/unit-of-work/retry-policy.d.ts.map +1 -0
- package/dist/query/unit-of-work/retry-policy.js +61 -0
- 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} +145 -58
- 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} +435 -198
- 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 +32 -0
- package/dist/with-database.d.ts.map +1 -0
- package/dist/with-database.js +34 -0
- package/dist/with-database.js.map +1 -0
- package/package.json +43 -9
- package/src/adapters/adapters.ts +23 -4
- package/src/adapters/drizzle/drizzle-adapter-pglite.test.ts +140 -185
- package/src/adapters/drizzle/{drizzle-adapter-sqlite.test.ts → drizzle-adapter-sqlite3.test.ts} +187 -55
- package/src/adapters/drizzle/drizzle-adapter.ts +14 -93
- package/src/adapters/drizzle/generate.test.ts +102 -269
- package/src/adapters/drizzle/generate.ts +89 -63
- 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 +36 -5
- 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 +90 -96
- package/src/adapters/kysely/kysely-adapter-sqlocal.test.ts +215 -0
- package/src/adapters/kysely/kysely-adapter.ts +10 -242
- package/src/adapters/{drizzle/drizzle-query.ts → shared/from-unit-of-work-compiler.ts} +111 -106
- 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 +887 -0
- package/src/db-fragment-definition-builder.ts +737 -0
- package/src/db-fragment-instantiator.test.ts +543 -0
- package/src/db-fragment-integration.test.ts +406 -0
- package/src/fragments/internal-fragment.test.ts +549 -0
- package/src/fragments/internal-fragment.ts +249 -0
- package/src/hooks/hooks.test.ts +575 -0
- package/src/hooks/hooks.ts +179 -0
- package/src/migration-engine/generation-engine.test.ts +60 -27
- package/src/migration-engine/generation-engine.ts +99 -92
- package/src/mod.ts +139 -78
- package/src/query/column-defaults.ts +49 -0
- package/src/query/cursor.test.ts +147 -3
- package/src/query/cursor.ts +25 -8
- 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} +4 -4
- package/src/query/unit-of-work/execute-unit-of-work.test.ts +1310 -0
- package/src/query/unit-of-work/execute-unit-of-work.ts +504 -0
- package/src/query/unit-of-work/retry-policy.test.ts +217 -0
- package/src/query/unit-of-work/retry-policy.ts +141 -0
- package/src/query/unit-of-work/unit-of-work-coordinator.test.ts +831 -0
- package/src/query/{unit-of-work-types.test.ts → unit-of-work/unit-of-work-types.test.ts} +7 -5
- package/src/query/unit-of-work/unit-of-work.test.ts +1716 -0
- package/src/query/{unit-of-work.ts → unit-of-work/unit-of-work.ts} +716 -420
- package/src/query/{result-transform.test.ts → value-decoding.test.ts} +45 -298
- 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 +152 -0
- package/tsdown.config.ts +8 -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 -315
- package/dist/adapters/drizzle/drizzle-uow-compiler.js.map +0 -1
- package/dist/adapters/drizzle/drizzle-uow-decoder.js +0 -116
- package/dist/adapters/drizzle/drizzle-uow-decoder.js.map +0 -1
- package/dist/adapters/drizzle/drizzle-uow-executor.js +0 -149
- 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 +0 -14
- 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 -66
- package/dist/adapters/kysely/kysely-query-compiler.js.map +0 -1
- package/dist/adapters/kysely/kysely-query.d.ts +0 -22
- package/dist/adapters/kysely/kysely-query.d.ts.map +0 -1
- package/dist/adapters/kysely/kysely-query.js +0 -223
- package/dist/adapters/kysely/kysely-query.js.map +0 -1
- package/dist/adapters/kysely/kysely-shared.d.ts.map +0 -1
- package/dist/adapters/kysely/kysely-shared.js +0 -18
- package/dist/adapters/kysely/kysely-shared.js.map +0 -1
- package/dist/adapters/kysely/kysely-uow-compiler.js +0 -170
- package/dist/adapters/kysely/kysely-uow-compiler.js.map +0 -1
- package/dist/adapters/kysely/kysely-uow-executor.js +0 -89
- 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/bind-services.d.ts +0 -7
- package/dist/bind-services.d.ts.map +0 -1
- package/dist/bind-services.js +0 -14
- package/dist/bind-services.js.map +0 -1
- package/dist/fragment.d.ts +0 -173
- package/dist/fragment.d.ts.map +0 -1
- package/dist/fragment.js +0 -191
- package/dist/fragment.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/query/query.d.ts.map +0 -1
- package/dist/query/result-transform.js +0 -168
- package/dist/query/result-transform.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 -106
- package/dist/schema/serialize.js.map +0 -1
- package/dist/shared/settings-schema.js +0 -36
- package/dist/shared/settings-schema.js.map +0 -1
- package/src/adapters/drizzle/drizzle-adapter.test.ts +0 -170
- 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.test.ts +0 -1383
- package/src/adapters/drizzle/drizzle-uow-compiler.ts +0 -636
- package/src/adapters/drizzle/drizzle-uow-decoder.ts +0 -218
- package/src/adapters/drizzle/drizzle-uow-executor.ts +0 -276
- 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 -132
- package/src/adapters/kysely/kysely-query.test.ts +0 -498
- package/src/adapters/kysely/kysely-query.ts +0 -390
- package/src/adapters/kysely/kysely-shared.ts +0 -23
- package/src/adapters/kysely/kysely-uow-compiler.test.ts +0 -998
- package/src/adapters/kysely/kysely-uow-compiler.ts +0 -318
- package/src/adapters/kysely/kysely-uow-executor.ts +0 -145
- package/src/adapters/kysely/kysely-uow-joins.test.ts +0 -811
- 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/bind-services.test.ts +0 -214
- package/src/bind-services.ts +0 -37
- package/src/db-fragment.test.ts +0 -800
- package/src/fragment.ts +0 -727
- package/src/query/result-transform.ts +0 -271
- package/src/query/unit-of-work-multi-schema.test.ts +0 -64
- package/src/query/unit-of-work.test.ts +0 -943
- package/src/schema/serialize.ts +0 -396
- package/src/shared/settings-schema.ts +0 -61
- package/src/uow-context-integration.test.ts +0 -102
- package/src/uow-context.test.ts +0 -182
- /package/dist/query/{query.js → simple-query-interface.js} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generate.js","names":["parts: string[]","params: string[]","value: string","keys: string[]","columns: string[]","foreignColumns: string[]","indexes: string[]","args: string[]","relations: string[]","options: string[]","fields: string[]","references: string[]","tableRef","drizzleEntries: string[]","customTypes: string[]","sections: string[]","fragmentTables: string[]"],"sources":["../../../src/adapters/drizzle/generate.ts"],"sourcesContent":["import { importGenerator } from \"../../util/import-generator\";\nimport { ident, parseVarchar } from \"../../util/parse\";\nimport {\n type AnyColumn,\n type AnySchema,\n type AnyTable,\n type Relation,\n InternalIdColumn,\n} from \"../../schema/create\";\nimport type { SQLProvider } from \"../../shared/providers\";\nimport { schemaToDBType, type DBTypeLiteral } from \"../../schema/serialize\";\nimport { createTableNameMapper, sanitizeNamespace } from \"./shared\";\nimport { settingsSchema, SETTINGS_TABLE_NAME } from \"../../shared/settings-schema\";\n\n// ============================================================================\n// PROVIDER CONFIGURATION\n// ============================================================================\n\nconst PROVIDER_IMPORTS = {\n mysql: \"drizzle-orm/mysql-core\",\n postgresql: \"drizzle-orm/pg-core\",\n sqlite: \"drizzle-orm/sqlite-core\",\n} as const;\n\nconst PROVIDER_TABLE_FUNCTIONS = {\n mysql: \"mysqlTable\",\n postgresql: \"pgTable\",\n sqlite: \"sqliteTable\",\n} as const;\n\nexport type SupportedProvider = Exclude<SQLProvider, \"cockroachdb\" | \"mssql\">;\n\n// ============================================================================\n// CONTEXT\n// ============================================================================\n\ninterface GeneratorContext {\n provider: SupportedProvider;\n imports: ReturnType<typeof importGenerator>;\n importSource: string;\n generatedCustomTypes: Set<string>;\n idGeneratorImport?: { name: string; from: string };\n}\n\nfunction createContext(\n provider: SupportedProvider,\n idGeneratorImport?: { name: string; from: string },\n): GeneratorContext {\n return {\n provider,\n imports: importGenerator(),\n importSource: PROVIDER_IMPORTS[provider],\n generatedCustomTypes: new Set<string>(),\n idGeneratorImport,\n };\n}\n\n// ============================================================================\n// CUSTOM TYPE GENERATION\n// ============================================================================\n\ninterface CustomTypeOptions {\n dataType: string;\n driverDataType: string;\n databaseDataType: string;\n fromDriverCode: string;\n toDriverCode: string;\n}\n\nfunction generateCustomType(\n ctx: GeneratorContext,\n name: string,\n options: CustomTypeOptions,\n): string | undefined {\n if (ctx.generatedCustomTypes.has(name)) {\n return undefined;\n }\n\n ctx.imports.addImport(\"customType\", ctx.importSource);\n ctx.generatedCustomTypes.add(name);\n\n return `const ${name} = customType<\n {\n data: ${options.dataType};\n driverData: ${options.driverDataType};\n }\n>({\n dataType() {\n return \"${options.databaseDataType}\";\n },\n fromDriver(value) {\n ${options.fromDriverCode}\n },\n toDriver(value) {\n ${options.toDriverCode}\n }\n});`;\n}\n\nfunction generateBinaryCustomType(ctx: GeneratorContext, customTypes: string[]): string {\n const name = \"customBinary\";\n const code = generateCustomType(ctx, name, {\n dataType: \"Uint8Array\",\n driverDataType: \"Buffer\",\n databaseDataType: schemaToDBType({ type: \"binary\" }, ctx.provider),\n fromDriverCode: \"return new Uint8Array(value.buffer, value.byteOffset, value.byteLength)\",\n toDriverCode: `return value instanceof Buffer? value : Buffer.from(value)`,\n });\n\n if (code) {\n customTypes.push(code);\n }\n return name;\n}\n\n// ============================================================================\n// COLUMN TYPE MAPPING\n// ============================================================================\n\ninterface ColumnTypeFunction {\n name: string;\n isCustomType?: boolean;\n params?: string[];\n}\n\n/**\n * Maps SQL database types to Drizzle function names and parameters.\n * Uses schemaToDBType as the source of truth for type conversion.\n */\nfunction getColumnTypeFunction(\n ctx: GeneratorContext,\n column: AnyColumn,\n customTypes: string[],\n): ColumnTypeFunction {\n // Get the canonical database type from schemaToDBType\n const dbType = schemaToDBType(column, ctx.provider);\n\n // Map database types to Drizzle function names\n return mapDBTypeToDrizzleFunction(ctx, dbType, column, customTypes);\n}\n\n/**\n * Maps a database type string to a Drizzle function name and parameters.\n */\nfunction mapDBTypeToDrizzleFunction(\n ctx: GeneratorContext,\n dbType: DBTypeLiteral,\n column: AnyColumn,\n customTypes: string[],\n): ColumnTypeFunction {\n // Handle provider-specific types\n if (ctx.provider === \"postgresql\") {\n switch (dbType) {\n case \"bigserial\":\n // bigserial requires a mode parameter in Drizzle\n return { name: \"bigserial\", params: [`{ mode: \"number\" }`] };\n case \"serial\":\n return { name: \"serial\" };\n case \"boolean\":\n return { name: \"boolean\" };\n case \"bytea\":\n return { name: generateBinaryCustomType(ctx, customTypes), isCustomType: true };\n case \"json\":\n return { name: \"json\" };\n case \"text\":\n return { name: \"text\" };\n case \"bigint\":\n return { name: \"bigint\", params: [`{ mode: \"number\" }`] };\n default:\n if (dbType.startsWith(\"varchar(\")) {\n const length = parseVarchar(dbType);\n return { name: \"varchar\", params: [`{ length: ${length} }`] };\n }\n return { name: dbType };\n }\n }\n\n if (ctx.provider === \"mysql\") {\n switch (dbType) {\n case \"boolean\":\n return { name: \"boolean\" };\n case \"text\":\n return { name: \"text\" };\n case \"longblob\":\n return { name: generateBinaryCustomType(ctx, customTypes), isCustomType: true };\n case \"bigint\":\n return { name: \"bigint\" };\n default:\n if (dbType.startsWith(\"varchar(\")) {\n const length = parseVarchar(dbType);\n return { name: \"varchar\", params: [`{ length: ${length} }`] };\n }\n return { name: dbType };\n }\n }\n\n if (ctx.provider === \"sqlite\") {\n switch (dbType) {\n case \"integer\":\n // Need to determine the mode based on the original column type\n if (column.type === \"bool\") {\n return { name: \"integer\", params: [`{ mode: \"boolean\" }`] };\n }\n if (column.type === \"timestamp\" || column.type === \"date\") {\n return { name: \"integer\", params: [`{ mode: \"timestamp\" }`] };\n }\n return { name: \"integer\" };\n case \"blob\":\n // Need to determine the mode based on the original column type\n if (column.type === \"bigint\") {\n return { name: \"blob\", params: [`{ mode: \"bigint\" }`] };\n }\n return { name: generateBinaryCustomType(ctx, customTypes), isCustomType: true };\n case \"text\":\n // Check if it's JSON\n if (column.type === \"json\") {\n return { name: \"blob\", params: [`{ mode: \"json\" }`] };\n }\n return { name: \"text\" };\n case \"real\":\n return { name: \"real\" };\n default:\n return { name: dbType };\n }\n }\n\n // Fallback for other providers\n return { name: dbType };\n}\n\n// ============================================================================\n// COLUMN GENERATION\n// ============================================================================\n\nfunction generateColumnDefinition(\n ctx: GeneratorContext,\n column: AnyColumn,\n customTypes: string[],\n): string {\n const parts: string[] = [];\n const typeFn = getColumnTypeFunction(ctx, column, customTypes);\n\n // Column type with parameters\n const params: string[] = [`\"${column.name}\"`, ...(typeFn.params ?? [])];\n if (!typeFn.isCustomType) {\n ctx.imports.addImport(typeFn.name, ctx.importSource);\n }\n parts.push(`${typeFn.name}(${params.join(\", \")})`);\n\n // Primary key for internal ID\n if (column instanceof InternalIdColumn || column.role === \"internal-id\") {\n if (ctx.provider === \"sqlite\") {\n // SQLite uses primaryKey({ autoIncrement: true })\n parts.push(\"primaryKey({ autoIncrement: true })\");\n } else if (ctx.provider === \"mysql\") {\n // MySQL uses primaryKey().autoincrement()\n parts.push(\"primaryKey()\");\n parts.push(\"autoincrement()\");\n } else {\n // PostgreSQL just uses primaryKey()\n parts.push(\"primaryKey()\");\n }\n }\n\n // Nullability\n if (!column.isNullable) {\n parts.push(\"notNull()\");\n }\n\n // Default values\n if (column.default) {\n if (\"value\" in column.default) {\n // Static defaults: defaultTo(value)\n let value: string;\n if (typeof column.default.value === \"bigint\") {\n ctx.imports.addImport(\"sql\", \"drizzle-orm\");\n value = `sql\\`${column.default.value.toString()}\\``;\n } else {\n value = JSON.stringify(column.default.value);\n }\n parts.push(`default(${value})`);\n } else if (\"dbSpecial\" in column.default) {\n // Database-level special functions: defaultTo(b => b.now())\n if (column.default.dbSpecial === \"now\") {\n parts.push(\"defaultNow()\");\n }\n } else if (\"runtime\" in column.default) {\n // Runtime defaults: defaultTo$()\n if (column.default.runtime === \"cuid\") {\n const idGen = ctx.idGeneratorImport ?? { name: \"createId\", from: \"@fragno-dev/db/id\" };\n ctx.imports.addImport(idGen.name, idGen.from);\n parts.push(`$defaultFn(() => ${idGen.name}())`);\n } else if (column.default.runtime === \"now\") {\n // Runtime-generated timestamp (not database-level)\n parts.push(\"$defaultFn(() => new Date())\");\n }\n // Note: Custom functions in defaultTo$(() => ...) are not supported in schema generation\n }\n }\n\n return ` ${column.ormName}: ${parts.join(\".\")}`;\n}\n\nfunction generateAllColumns(\n ctx: GeneratorContext,\n table: AnyTable,\n customTypes: string[],\n): string[] {\n return Object.values(table.columns).map((column) =>\n generateColumnDefinition(ctx, column, customTypes),\n );\n}\n\n// ============================================================================\n// CONSTRAINT GENERATION\n// ============================================================================\n\nfunction generateForeignKeys(ctx: GeneratorContext, table: AnyTable, namespace?: string): string[] {\n const mapper = namespace ? createTableNameMapper(namespace) : undefined;\n const keys: string[] = [];\n\n for (const relation of Object.values(table.relations)) {\n // Only \"one\" relations generate foreign keys\n // \"many\" relations don't have foreign keys (they're on the other side)\n if (relation.type === \"many\") {\n continue;\n }\n\n const columns: string[] = [];\n const foreignColumns: string[] = [];\n const isSelfReference = relation.table.ormName === table.ormName;\n\n for (const [localCol, refCol] of relation.on) {\n columns.push(`table.${localCol}`);\n // Foreign keys always reference internal IDs\n const actualRefCol = refCol === \"id\" ? \"_internalId\" : refCol;\n // For self-referencing foreign keys, use table parameter instead of table constant\n if (isSelfReference) {\n foreignColumns.push(`table.${actualRefCol}`);\n } else {\n // Suffix the foreign table reference with namespace if provided\n const foreignTableRef = namespace\n ? `${relation.table.ormName}_${sanitizeNamespace(namespace)}`\n : relation.table.ormName;\n foreignColumns.push(`${foreignTableRef}.${actualRefCol}`);\n }\n }\n\n ctx.imports.addImport(\"foreignKey\", ctx.importSource);\n // Include namespace in FK name to avoid collisions\n const fkName =\n namespace && mapper\n ? \"fk_\" + mapper.toPhysical(`${table.ormName}_${relation.table.ormName}_${relation.name}`)\n : `${table.ormName}_${relation.table.ormName}_${relation.name}_fk`;\n\n keys.push(`foreignKey({\n columns: [${columns.join(\", \")}],\n foreignColumns: [${foreignColumns.join(\", \")}],\n name: \"${fkName}\"\n})`);\n }\n\n return keys;\n}\n\nfunction generateIndexes(ctx: GeneratorContext, table: AnyTable, namespace?: string): string[] {\n const indexes: string[] = [];\n\n for (const idx of Object.values(table.indexes)) {\n const columns = idx.columns.map((col) => `table.${col.ormName}`).join(\", \");\n\n // Include namespace in index name to avoid collisions\n const indexName = namespace ? `${idx.name}_${namespace}` : idx.name;\n\n if (idx.unique) {\n ctx.imports.addImport(\"uniqueIndex\", ctx.importSource);\n indexes.push(`uniqueIndex(\"${indexName}\").on(${columns})`);\n } else {\n ctx.imports.addImport(\"index\", ctx.importSource);\n indexes.push(`index(\"${indexName}\").on(${columns})`);\n }\n }\n\n return indexes;\n}\n\nfunction generateTableConstraints(\n ctx: GeneratorContext,\n table: AnyTable,\n namespace?: string,\n): string[] {\n return [...generateForeignKeys(ctx, table, namespace), ...generateIndexes(ctx, table, namespace)];\n}\n\n// ============================================================================\n// TABLE GENERATION\n// ============================================================================\n\nfunction generateTable(\n ctx: GeneratorContext,\n table: AnyTable,\n customTypes: string[],\n namespace?: string,\n): string {\n const tableFn = PROVIDER_TABLE_FUNCTIONS[ctx.provider];\n ctx.imports.addImport(tableFn, ctx.importSource);\n\n const columns = generateAllColumns(ctx, table, customTypes);\n const constraints = generateTableConstraints(ctx, table, namespace);\n\n // Suffix table name with namespace if provided, and sanitize for use as database table name\n // Database table names must also be valid identifiers to work with Drizzle's relational query system\n const physicalTableName = namespace\n ? `${table.ormName}_${sanitizeNamespace(namespace)}`\n : table.ormName;\n // Same sanitized name for TypeScript export\n const exportName = physicalTableName;\n\n const args: string[] = [`\"${physicalTableName}\"`, `{\\n${columns.join(\",\\n\")}\\n}`];\n\n if (constraints.length > 0) {\n args.push(`(table) => [\\n${ident(constraints.join(\",\\n\"))}\\n]`);\n }\n\n return `export const ${exportName} = ${tableFn}(${args.join(\", \")})`;\n}\n\n// ============================================================================\n// RELATION GENERATION\n// ============================================================================\n\nfunction generateRelation(\n ctx: GeneratorContext,\n table: AnyTable,\n namespace?: string,\n inverseRelations?: Array<{ fromTable: AnyTable; relation: Relation }>,\n): string | undefined {\n const relations: string[] = [];\n let hasOne = false;\n let hasMany = false;\n\n // Generate explicit relations defined on this table\n for (const relation of Object.values(table.relations)) {\n const options: string[] = [`relationName: \"${relation.id}\"`];\n\n // Track which relation types are used\n if (relation.type === \"one\") {\n hasOne = true;\n } else if (relation.type === \"many\") {\n hasMany = true;\n }\n\n // For \"one\" relations, specify fields and references\n if (relation.type === \"one\") {\n const fields: string[] = [];\n const references: string[] = [];\n\n // Use sanitized namespace for identifier references\n const tableRef = namespace\n ? `${table.ormName}_${sanitizeNamespace(namespace)}`\n : table.ormName;\n const relatedTableRef = namespace\n ? `${relation.table.ormName}_${sanitizeNamespace(namespace)}`\n : relation.table.ormName;\n\n for (const [left, right] of relation.on) {\n fields.push(`${tableRef}.${left}`);\n // Relations reference internal IDs\n const actualRight = right === \"id\" ? \"_internalId\" : right;\n references.push(`${relatedTableRef}.${actualRight}`);\n }\n\n options.push(`fields: [${fields.join(\", \")}]`, `references: [${references.join(\", \")}]`);\n }\n\n const relatedTableRef = namespace\n ? `${relation.table.ormName}_${sanitizeNamespace(namespace)}`\n : relation.table.ormName;\n\n const args: string[] = [relatedTableRef];\n if (options.length > 0) {\n args.push(`{\\n${ident(options.join(\",\\n\"))}\\n}`);\n }\n\n relations.push(ident(`${relation.name}: ${relation.type}(${args.join(\", \")})`));\n }\n\n // Generate inverse relations for tables that reference this table\n // Drizzle requires both sides of a relation to be defined\n if (inverseRelations && inverseRelations.length > 0) {\n for (const { fromTable, relation } of inverseRelations) {\n // Only generate inverse for \"one\" relations (they become \"many\" on this side)\n if (relation.type === \"one\") {\n hasMany = true;\n\n const fromTableRef = namespace\n ? `${fromTable.ormName}_${sanitizeNamespace(namespace)}`\n : fromTable.ormName;\n\n // Generate inverse relation name with consistent suffix\n // e.g., if session has \"sessionOwner\" relation to user, user gets \"sessionList\" inverse relation\n const inverseRelationName = `${fromTable.ormName}List`;\n\n const options: string[] = [`relationName: \"${relation.id}\"`];\n const args: string[] = [fromTableRef, `{\\n${ident(options.join(\",\\n\"))}\\n}`];\n\n relations.push(ident(`${inverseRelationName}: many(${args.join(\", \")})`));\n }\n }\n }\n\n if (relations.length === 0) {\n return undefined;\n }\n\n // Only include the relation types that are actually used\n const params: string[] = [];\n if (hasOne) {\n params.push(\"one\");\n }\n if (hasMany) {\n params.push(\"many\");\n }\n const relationParams = params.length > 0 ? `{ ${params.join(\", \")} }` : \"{}\";\n\n const tableRef = namespace ? `${table.ormName}_${sanitizeNamespace(namespace)}` : table.ormName;\n const relationsName = namespace\n ? `${table.ormName}_${sanitizeNamespace(namespace)}Relations`\n : `${table.ormName}Relations`;\n\n ctx.imports.addImport(\"relations\", \"drizzle-orm\");\n return `export const ${relationsName} = relations(${tableRef}, (${relationParams}) => ({\n${relations.join(\",\\n\")}\n}));`;\n}\n\n// ============================================================================\n// UTILITIES\n// ============================================================================\n\n/**\n * Generate a schema export object for a fragment\n * This groups all tables by their logical names for easier access\n */\nfunction generateFragmentSchemaExport(\n schema: AnySchema,\n namespace: string,\n tablesWithRelations?: Set<string>,\n): string {\n const drizzleEntries: string[] = [];\n\n for (const table of Object.values(schema.tables)) {\n const physicalExportName = namespace\n ? `${table.ormName}_${sanitizeNamespace(namespace)}`\n : table.ormName;\n\n // Add physical table name to drizzle schema\n drizzleEntries.push(` ${physicalExportName}: ${physicalExportName}`);\n\n // Include relations for this table if they exist (either explicit or inverse)\n if (tablesWithRelations?.has(table.name)) {\n const relationsName = namespace\n ? `${table.ormName}_${sanitizeNamespace(namespace)}Relations`\n : `${table.ormName}Relations`;\n\n drizzleEntries.push(` ${relationsName}: ${relationsName}`);\n }\n\n // Add convenience aliases WITH their relations to work around Drizzle bug\n // The key insight: Drizzle needs BOTH the table alias AND its relations alias\n // in the same schema object for relational queries to work\n if (namespace) {\n drizzleEntries.push(` ${table.ormName}: ${physicalExportName}`);\n\n // Also add the relations under the aliased name if they exist\n if (tablesWithRelations?.has(table.name)) {\n const physicalRelationsName = `${table.ormName}_${sanitizeNamespace(namespace)}Relations`;\n const aliasRelationsName = `${table.ormName}Relations`;\n drizzleEntries.push(` ${aliasRelationsName}: ${physicalRelationsName}`);\n }\n }\n }\n\n // Add schema version as a number\n drizzleEntries.push(` schemaVersion: ${schema.version}`);\n\n const exportName = namespace ? `${sanitizeNamespace(namespace)}_schema` : \"_schema\";\n\n return `export const ${exportName} = {\\n${drizzleEntries.join(\",\\n\")}\\n}`;\n}\n\n// ============================================================================\n// MAIN GENERATION\n// ============================================================================\n\nexport interface GenerateSchemaOptions {\n /** Custom ID generator import configuration */\n idGeneratorImport?: {\n /** Function name to import */\n name: string;\n /** Module to import from */\n from: string;\n };\n}\n\n/**\n * Generate a settings table for storing fragment versions\n */\nfunction generateSettingsTable(ctx: GeneratorContext): string {\n // Use centralized settings schema\n\n // Extract the table from the schema\n const settingsTable =\n settingsSchema.tables[SETTINGS_TABLE_NAME as keyof typeof settingsSchema.tables];\n\n // Generate the table using the existing generateTable function\n const customTypes: string[] = [];\n return generateTable(ctx, settingsTable, customTypes);\n}\n\n/**\n * Generate a schema file from one or more fragments with a shared settings table\n */\nexport function generateSchema(\n fragments: { namespace: string; schema: AnySchema }[],\n provider: SupportedProvider,\n options?: GenerateSchemaOptions,\n): string {\n const ctx = createContext(provider, options?.idGeneratorImport);\n const customTypes: string[] = [];\n const sections: string[] = [];\n\n // Generate settings table first\n sections.push(\"\");\n sections.push(\"// ============================================================================\");\n sections.push(\"// Settings Table (shared across all fragments)\");\n sections.push(\"// ============================================================================\");\n sections.push(\"\");\n sections.push(generateSettingsTable(ctx));\n sections.push(\"\");\n sections.push(`export const fragnoDbSettingSchemaVersion = ${settingsSchema.version};`);\n\n // Generate each fragment's tables\n for (const { namespace, schema } of fragments) {\n const fragmentTables: string[] = [];\n\n // Add section header\n fragmentTables.push(\"\");\n fragmentTables.push(\n \"// ============================================================================\",\n );\n fragmentTables.push(`// Fragment: ${namespace}`);\n fragmentTables.push(\n \"// ============================================================================\",\n );\n\n // Generate tables for this fragment\n for (const table of Object.values(schema.tables)) {\n const tableCode = generateTable(ctx, table, customTypes, namespace);\n fragmentTables.push(\"\");\n fragmentTables.push(tableCode);\n }\n\n // Build a map of inverse relations for tables that are referenced but don't have their own relations\n // This is needed for Drizzle's relational query API to work correctly\n const inverseRelations = new Map<string, Array<{ fromTable: AnyTable; relation: Relation }>>();\n for (const table of Object.values(schema.tables)) {\n for (const relation of Object.values(table.relations)) {\n // Track this relation as an inverse on the target table\n const targetTableName = relation.table.name;\n if (!inverseRelations.has(targetTableName)) {\n inverseRelations.set(targetTableName, []);\n }\n inverseRelations.get(targetTableName)!.push({ fromTable: table, relation });\n }\n }\n\n // Generate relations for all tables (both explicit and inverse)\n const tablesWithRelations = new Set<string>();\n for (const table of Object.values(schema.tables)) {\n const relationCode = generateRelation(\n ctx,\n table,\n namespace,\n inverseRelations.get(table.name),\n );\n if (relationCode) {\n fragmentTables.push(\"\");\n fragmentTables.push(relationCode);\n tablesWithRelations.add(table.name);\n }\n }\n\n // Generate schema export object\n fragmentTables.push(\"\");\n fragmentTables.push(generateFragmentSchemaExport(schema, namespace, tablesWithRelations));\n\n sections.push(...fragmentTables);\n }\n\n // Assemble final output\n const lines: string[] = [ctx.imports.format(), ...customTypes, ...sections];\n return lines.join(\"\\n\");\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"generate.js","names":["parts: string[]","params: string[]","value: string","keys: string[]","columns: string[]","foreignColumns: string[]","indexes: string[]","args: string[]","relations: string[]","options: string[]","fields: string[]","references: string[]","drizzleEntries: string[]","customTypes: string[]","sections: string[]","fragmentTables: string[]"],"sources":["../../../src/adapters/drizzle/generate.ts"],"sourcesContent":["import { importGenerator } from \"../../util/import-generator\";\nimport { ident, parseVarchar } from \"../../util/parse\";\nimport {\n type AnyColumn,\n type AnySchema,\n type AnyTable,\n type Relation,\n InternalIdColumn,\n} from \"../../schema/create\";\nimport type { SQLProvider } from \"../../shared/providers\";\nimport {\n createTableNameMapper,\n sanitizeNamespace,\n type TableNameMapper,\n} from \"../shared/table-name-mapper\";\nimport { type DatabaseTypeLiteral } from \"../../schema/type-conversion/type-mapping\";\nimport { createSQLTypeMapper } from \"../../schema/type-conversion/create-sql-type-mapper\";\n\n// ============================================================================\n// PROVIDER CONFIGURATION\n// ============================================================================\n\nconst PROVIDER_IMPORTS = {\n mysql: \"drizzle-orm/mysql-core\",\n postgresql: \"drizzle-orm/pg-core\",\n sqlite: \"drizzle-orm/sqlite-core\",\n} as const;\n\nconst PROVIDER_TABLE_FUNCTIONS = {\n mysql: \"mysqlTable\",\n postgresql: \"pgTable\",\n sqlite: \"sqliteTable\",\n} as const;\n\nexport type SupportedProvider = Exclude<SQLProvider, \"cockroachdb\" | \"mssql\">;\n\n// ============================================================================\n// CONTEXT\n// ============================================================================\n\ninterface GeneratorContext {\n provider: SupportedProvider;\n imports: ReturnType<typeof importGenerator>;\n importSource: string;\n generatedCustomTypes: Set<string>;\n idGeneratorImport?: { name: string; from: string };\n}\n\nfunction createContext(\n provider: SupportedProvider,\n idGeneratorImport?: { name: string; from: string },\n): GeneratorContext {\n return {\n provider,\n imports: importGenerator(),\n importSource: PROVIDER_IMPORTS[provider],\n generatedCustomTypes: new Set<string>(),\n idGeneratorImport,\n };\n}\n\n// ============================================================================\n// CUSTOM TYPE GENERATION\n// ============================================================================\n\ninterface CustomTypeOptions {\n dataType: string;\n driverDataType: string;\n databaseDataType: string;\n fromDriverCode: string;\n toDriverCode: string;\n}\n\nfunction generateCustomType(\n ctx: GeneratorContext,\n name: string,\n options: CustomTypeOptions,\n): string | undefined {\n if (ctx.generatedCustomTypes.has(name)) {\n return undefined;\n }\n\n ctx.imports.addImport(\"customType\", ctx.importSource);\n ctx.generatedCustomTypes.add(name);\n\n return `const ${name} = customType<\n {\n data: ${options.dataType};\n driverData: ${options.driverDataType};\n }\n>({\n dataType() {\n return \"${options.databaseDataType}\";\n },\n fromDriver(value) {\n ${options.fromDriverCode}\n },\n toDriver(value) {\n ${options.toDriverCode}\n }\n});`;\n}\n\nfunction generateBinaryCustomType(ctx: GeneratorContext, customTypes: string[]): string {\n const name = \"customBinary\";\n const typeMapper = createSQLTypeMapper(ctx.provider);\n const code = generateCustomType(ctx, name, {\n dataType: \"Uint8Array\",\n driverDataType: \"Buffer\",\n databaseDataType: typeMapper.getDatabaseType({ type: \"binary\" }),\n fromDriverCode: \"return new Uint8Array(value.buffer, value.byteOffset, value.byteLength)\",\n toDriverCode: `return value instanceof Buffer? value : Buffer.from(value)`,\n });\n\n if (code) {\n customTypes.push(code);\n }\n return name;\n}\n\n// ============================================================================\n// COLUMN TYPE MAPPING\n// ============================================================================\n\ninterface ColumnTypeFunction {\n name: string;\n isCustomType?: boolean;\n params?: string[];\n}\n\n/**\n * Maps SQL database types to Drizzle function names and parameters.\n * Uses SQLTypeMapper as the source of truth for type conversion.\n */\nfunction getColumnTypeFunction(\n ctx: GeneratorContext,\n column: AnyColumn,\n customTypes: string[],\n): ColumnTypeFunction {\n // Get the canonical database type from type mapper\n const typeMapper = createSQLTypeMapper(ctx.provider);\n const dbType = typeMapper.getDatabaseType(column);\n\n // Map database types to Drizzle function names\n return mapDBTypeToDrizzleFunction(ctx, dbType, column, customTypes);\n}\n\n/**\n * Maps a database type string to a Drizzle function name and parameters.\n */\nfunction mapDBTypeToDrizzleFunction(\n ctx: GeneratorContext,\n dbType: DatabaseTypeLiteral,\n column: AnyColumn,\n customTypes: string[],\n): ColumnTypeFunction {\n // Handle provider-specific types\n if (ctx.provider === \"postgresql\") {\n switch (dbType) {\n case \"bigserial\":\n // bigserial requires a mode parameter in Drizzle\n return { name: \"bigserial\", params: [`{ mode: \"number\" }`] };\n case \"serial\":\n return { name: \"serial\" };\n case \"boolean\":\n return { name: \"boolean\" };\n case \"bytea\":\n return { name: generateBinaryCustomType(ctx, customTypes), isCustomType: true };\n case \"json\":\n return { name: \"json\" };\n case \"text\":\n return { name: \"text\" };\n case \"bigint\":\n return { name: \"bigint\", params: [`{ mode: \"number\" }`] };\n default:\n if (dbType.startsWith(\"varchar(\")) {\n const length = parseVarchar(dbType);\n return { name: \"varchar\", params: [`{ length: ${length} }`] };\n }\n return { name: dbType };\n }\n }\n\n if (ctx.provider === \"mysql\") {\n switch (dbType) {\n case \"boolean\":\n return { name: \"boolean\" };\n case \"text\":\n return { name: \"text\" };\n case \"longblob\":\n return { name: generateBinaryCustomType(ctx, customTypes), isCustomType: true };\n case \"bigint\":\n // MySQL bigint requires mode parameter\n return { name: \"bigint\", params: [`{ mode: \"number\" }`] };\n case \"integer\":\n // MySQL uses \"int\" not \"integer\" in Drizzle ORM\n return { name: \"int\" };\n default:\n if (dbType.startsWith(\"varchar(\")) {\n const length = parseVarchar(dbType);\n return { name: \"varchar\", params: [`{ length: ${length} }`] };\n }\n return { name: dbType };\n }\n }\n\n if (ctx.provider === \"sqlite\") {\n switch (dbType) {\n case \"integer\":\n // Need to determine the mode based on the original column type\n if (column.type === \"bool\") {\n return { name: \"integer\", params: [`{ mode: \"boolean\" }`] };\n }\n if (column.type === \"timestamp\" || column.type === \"date\") {\n return { name: \"integer\", params: [`{ mode: \"timestamp\" }`] };\n }\n return { name: \"integer\" };\n case \"blob\":\n // Need to determine the mode based on the original column type\n if (column.type === \"bigint\") {\n return { name: \"blob\", params: [`{ mode: \"bigint\" }`] };\n }\n return { name: generateBinaryCustomType(ctx, customTypes), isCustomType: true };\n case \"text\":\n // Check if it's JSON\n if (column.type === \"json\") {\n return { name: \"blob\", params: [`{ mode: \"json\" }`] };\n }\n return { name: \"text\" };\n case \"real\":\n return { name: \"real\" };\n default:\n return { name: dbType };\n }\n }\n\n // Fallback for other providers\n return { name: dbType };\n}\n\n// ============================================================================\n// TABLE NAME HELPERS\n// ============================================================================\n\n/**\n * Get the physical table name (with namespace suffix) using the mapper if available\n */\nfunction getPhysicalTableName(\n logicalName: string,\n namespace: string | undefined,\n mapper: TableNameMapper | undefined,\n): string {\n if (!namespace) {\n return logicalName;\n }\n return mapper ? mapper.toPhysical(logicalName) : `${logicalName}_${sanitizeNamespace(namespace)}`;\n}\n\n// ============================================================================\n// COLUMN GENERATION\n// ============================================================================\n\nfunction generateColumnDefinition(\n ctx: GeneratorContext,\n column: AnyColumn,\n customTypes: string[],\n): string {\n const parts: string[] = [];\n const typeFn = getColumnTypeFunction(ctx, column, customTypes);\n\n // Column type with parameters\n const params: string[] = [`\"${column.name}\"`, ...(typeFn.params ?? [])];\n if (!typeFn.isCustomType) {\n ctx.imports.addImport(typeFn.name, ctx.importSource);\n }\n parts.push(`${typeFn.name}(${params.join(\", \")})`);\n\n // Primary key for internal ID\n if (column instanceof InternalIdColumn || column.role === \"internal-id\") {\n if (ctx.provider === \"sqlite\") {\n // SQLite uses primaryKey({ autoIncrement: true })\n parts.push(\"primaryKey({ autoIncrement: true })\");\n } else if (ctx.provider === \"mysql\") {\n // MySQL uses primaryKey().autoincrement()\n parts.push(\"primaryKey()\");\n parts.push(\"autoincrement()\");\n } else {\n // PostgreSQL just uses primaryKey()\n parts.push(\"primaryKey()\");\n }\n }\n\n // Nullability\n if (!column.isNullable) {\n parts.push(\"notNull()\");\n }\n\n // Default values\n if (column.default) {\n if (\"value\" in column.default) {\n // Static defaults: defaultTo(value)\n let value: string;\n if (typeof column.default.value === \"bigint\") {\n ctx.imports.addImport(\"sql\", \"drizzle-orm\");\n value = `sql\\`${column.default.value.toString()}\\``;\n } else {\n value = JSON.stringify(column.default.value);\n }\n parts.push(`default(${value})`);\n } else if (\"dbSpecial\" in column.default) {\n // Database-level special functions: defaultTo(b => b.now())\n if (column.default.dbSpecial === \"now\") {\n parts.push(\"defaultNow()\");\n }\n } else if (\"runtime\" in column.default) {\n // Runtime defaults: defaultTo$()\n if (column.default.runtime === \"cuid\") {\n const idGen = ctx.idGeneratorImport ?? { name: \"createId\", from: \"@fragno-dev/db/id\" };\n ctx.imports.addImport(idGen.name, idGen.from);\n parts.push(`$defaultFn(() => ${idGen.name}())`);\n } else if (column.default.runtime === \"now\") {\n // Runtime-generated timestamp (not database-level)\n parts.push(\"$defaultFn(() => new Date())\");\n }\n // Note: Custom functions in defaultTo$(() => ...) are not supported in schema generation\n }\n }\n\n return ` ${column.ormName}: ${parts.join(\".\")}`;\n}\n\nfunction generateAllColumns(\n ctx: GeneratorContext,\n table: AnyTable,\n customTypes: string[],\n): string[] {\n return Object.values(table.columns).map((column) =>\n generateColumnDefinition(ctx, column, customTypes),\n );\n}\n\n// ============================================================================\n// CONSTRAINT GENERATION\n// ============================================================================\n\nfunction generateForeignKeys(\n ctx: GeneratorContext,\n table: AnyTable,\n namespace?: string,\n mapper?: TableNameMapper,\n): string[] {\n const keys: string[] = [];\n\n for (const relation of Object.values(table.relations)) {\n // Only \"one\" relations generate foreign keys\n // \"many\" relations don't have foreign keys (they're on the other side)\n if (relation.type === \"many\") {\n continue;\n }\n\n const columns: string[] = [];\n const foreignColumns: string[] = [];\n const isSelfReference = relation.table.ormName === table.ormName;\n\n for (const [localCol, refCol] of relation.on) {\n columns.push(`table.${localCol}`);\n // Foreign keys always reference internal IDs\n const actualRefCol = refCol === \"id\" ? \"_internalId\" : refCol;\n // For self-referencing foreign keys, use table parameter instead of table constant\n if (isSelfReference) {\n foreignColumns.push(`table.${actualRefCol}`);\n } else {\n // Use sanitized TypeScript export name for identifier reference\n const foreignTableRef = namespace\n ? `${relation.table.ormName}_${sanitizeNamespace(namespace)}`\n : relation.table.ormName;\n foreignColumns.push(`${foreignTableRef}.${actualRefCol}`);\n }\n }\n\n ctx.imports.addImport(\"foreignKey\", ctx.importSource);\n // Include namespace in FK name to avoid collisions\n const fkName =\n namespace && mapper\n ? \"fk_\" + mapper.toPhysical(`${table.ormName}_${relation.table.ormName}_${relation.name}`)\n : `${table.ormName}_${relation.table.ormName}_${relation.name}_fk`;\n\n keys.push(`foreignKey({\n columns: [${columns.join(\", \")}],\n foreignColumns: [${foreignColumns.join(\", \")}],\n name: \"${fkName}\"\n})`);\n }\n\n return keys;\n}\n\nfunction generateIndexes(ctx: GeneratorContext, table: AnyTable, namespace?: string): string[] {\n const indexes: string[] = [];\n\n for (const idx of Object.values(table.indexes)) {\n const columns = idx.columns.map((col) => `table.${col.ormName}`).join(\", \");\n\n // Include namespace in index name to avoid collisions\n const indexName = namespace ? `${idx.name}_${namespace}` : idx.name;\n\n if (idx.unique) {\n ctx.imports.addImport(\"uniqueIndex\", ctx.importSource);\n indexes.push(`uniqueIndex(\"${indexName}\").on(${columns})`);\n } else {\n ctx.imports.addImport(\"index\", ctx.importSource);\n indexes.push(`index(\"${indexName}\").on(${columns})`);\n }\n }\n\n return indexes;\n}\n\nfunction generateTableConstraints(\n ctx: GeneratorContext,\n table: AnyTable,\n namespace?: string,\n mapper?: TableNameMapper,\n): string[] {\n return [\n ...generateForeignKeys(ctx, table, namespace, mapper),\n ...generateIndexes(ctx, table, namespace),\n ];\n}\n\n// ============================================================================\n// TABLE GENERATION\n// ============================================================================\n\nfunction generateTable(\n ctx: GeneratorContext,\n table: AnyTable,\n customTypes: string[],\n namespace?: string,\n mapper?: TableNameMapper,\n): string {\n const tableFn = PROVIDER_TABLE_FUNCTIONS[ctx.provider];\n ctx.imports.addImport(tableFn, ctx.importSource);\n\n const columns = generateAllColumns(ctx, table, customTypes);\n const constraints = generateTableConstraints(ctx, table, namespace, mapper);\n\n // Physical table name in the database (respects mapper configuration)\n const physicalTableName = getPhysicalTableName(table.ormName, namespace, mapper);\n // TypeScript export name must always be sanitized to be a valid JavaScript identifier\n const exportName = namespace ? `${table.ormName}_${sanitizeNamespace(namespace)}` : table.ormName;\n\n const args: string[] = [`\"${physicalTableName}\"`, `{\\n${columns.join(\",\\n\")}\\n}`];\n\n if (constraints.length > 0) {\n args.push(`(table) => [\\n${ident(constraints.join(\",\\n\"))}\\n]`);\n }\n\n return `export const ${exportName} = ${tableFn}(${args.join(\", \")})`;\n}\n\n// ============================================================================\n// RELATION GENERATION\n// ============================================================================\n\nfunction generateRelation(\n ctx: GeneratorContext,\n table: AnyTable,\n namespace?: string,\n inverseRelations?: Array<{ fromTable: AnyTable; relation: Relation }>,\n _mapper?: TableNameMapper,\n): string | undefined {\n const relations: string[] = [];\n let hasOne = false;\n let hasMany = false;\n\n // Generate explicit relations defined on this table\n for (const relation of Object.values(table.relations)) {\n const options: string[] = [`relationName: \"${relation.id}\"`];\n\n // Track which relation types are used\n if (relation.type === \"one\") {\n hasOne = true;\n } else if (relation.type === \"many\") {\n hasMany = true;\n }\n\n // For \"one\" relations, specify fields and references\n if (relation.type === \"one\") {\n const fields: string[] = [];\n const references: string[] = [];\n\n // Use sanitized TypeScript export names for identifier references\n const tableRef = namespace\n ? `${table.ormName}_${sanitizeNamespace(namespace)}`\n : table.ormName;\n const relatedTableRef = namespace\n ? `${relation.table.ormName}_${sanitizeNamespace(namespace)}`\n : relation.table.ormName;\n\n for (const [left, right] of relation.on) {\n fields.push(`${tableRef}.${left}`);\n // Relations reference internal IDs\n const actualRight = right === \"id\" ? \"_internalId\" : right;\n references.push(`${relatedTableRef}.${actualRight}`);\n }\n\n options.push(`fields: [${fields.join(\", \")}]`, `references: [${references.join(\", \")}]`);\n }\n\n const relatedTableRef = namespace\n ? `${relation.table.ormName}_${sanitizeNamespace(namespace)}`\n : relation.table.ormName;\n\n const args: string[] = [relatedTableRef];\n if (options.length > 0) {\n args.push(`{\\n${ident(options.join(\",\\n\"))}\\n}`);\n }\n\n relations.push(ident(`${relation.name}: ${relation.type}(${args.join(\", \")})`));\n }\n\n // Generate inverse relations for tables that reference this table\n // Drizzle requires both sides of a relation to be defined\n if (inverseRelations && inverseRelations.length > 0) {\n for (const { fromTable, relation } of inverseRelations) {\n // Only generate inverse for \"one\" relations (they become \"many\" on this side)\n if (relation.type === \"one\") {\n hasMany = true;\n\n // Use sanitized TypeScript export name for identifier reference\n const fromTableRef = namespace\n ? `${fromTable.ormName}_${sanitizeNamespace(namespace)}`\n : fromTable.ormName;\n\n // Generate inverse relation name with consistent suffix\n // e.g., if session has \"sessionOwner\" relation to user, user gets \"sessionList\" inverse relation\n const inverseRelationName = `${fromTable.ormName}List`;\n\n const options: string[] = [`relationName: \"${relation.id}\"`];\n const args: string[] = [fromTableRef, `{\\n${ident(options.join(\",\\n\"))}\\n}`];\n\n relations.push(ident(`${inverseRelationName}: many(${args.join(\", \")})`));\n }\n }\n }\n\n if (relations.length === 0) {\n return undefined;\n }\n\n // Only include the relation types that are actually used\n const params: string[] = [];\n if (hasOne) {\n params.push(\"one\");\n }\n if (hasMany) {\n params.push(\"many\");\n }\n const relationParams = params.length > 0 ? `{ ${params.join(\", \")} }` : \"{}\";\n\n // Use sanitized names for TypeScript export identifiers\n const exportTableRef = namespace\n ? `${table.ormName}_${sanitizeNamespace(namespace)}`\n : table.ormName;\n const relationsName = namespace ? `${exportTableRef}Relations` : `${table.ormName}Relations`;\n\n ctx.imports.addImport(\"relations\", \"drizzle-orm\");\n return `export const ${relationsName} = relations(${exportTableRef}, (${relationParams}) => ({\n${relations.join(\",\\n\")}\n}));`;\n}\n\n// ============================================================================\n// UTILITIES\n// ============================================================================\n\n/**\n * Generate a schema export object for a fragment\n * This groups all tables by their logical names for easier access\n */\nfunction generateFragmentSchemaExport(\n schema: AnySchema,\n namespace: string,\n tablesWithRelations?: Set<string>,\n _mapper?: TableNameMapper,\n): string {\n const drizzleEntries: string[] = [];\n\n for (const table of Object.values(schema.tables)) {\n // TypeScript export name (always sanitized for valid JS identifiers)\n const exportName = namespace\n ? `${table.ormName}_${sanitizeNamespace(namespace)}`\n : table.ormName;\n\n // Add physical table name to drizzle schema\n drizzleEntries.push(` ${exportName}: ${exportName}`);\n\n // Include relations for this table if they exist (either explicit or inverse)\n if (tablesWithRelations?.has(table.name)) {\n const relationsName = namespace ? `${exportName}Relations` : `${table.ormName}Relations`;\n\n drizzleEntries.push(` ${relationsName}: ${relationsName}`);\n }\n\n // Add convenience aliases WITH their relations to work around Drizzle bug\n // The key insight: Drizzle needs BOTH the table alias AND its relations alias\n // in the same schema object for relational queries to work\n if (namespace) {\n drizzleEntries.push(` ${table.ormName}: ${exportName}`);\n\n // Also add the relations under the aliased name if they exist\n if (tablesWithRelations?.has(table.name)) {\n const physicalRelationsName = `${exportName}Relations`;\n const aliasRelationsName = `${table.ormName}Relations`;\n drizzleEntries.push(` ${aliasRelationsName}: ${physicalRelationsName}`);\n }\n }\n }\n\n // Add schema version as a number\n drizzleEntries.push(` schemaVersion: ${schema.version}`);\n\n // Use logical name (not physical) for the schema export variable name, sanitized for valid JS identifier\n const exportName = namespace ? `${sanitizeNamespace(namespace)}_schema` : \"_schema\";\n\n return `export const ${exportName} = {\\n${drizzleEntries.join(\",\\n\")}\\n}`;\n}\n\n// ============================================================================\n// MAIN GENERATION\n// ============================================================================\n\nexport interface GenerateSchemaOptions {\n /** Custom ID generator import configuration */\n idGeneratorImport?: {\n /** Function name to import */\n name: string;\n /** Module to import from */\n from: string;\n };\n /** Optional mapper factory for creating table name mappers with custom sanitization */\n mapperFactory?: (namespace: string | undefined) => TableNameMapper | undefined;\n}\n\n/**\n * Generate a settings table for storing fragment versions\n */\n/**\n * Generate a schema file from one or more fragments with automatic de-duplication\n */\nexport function generateSchema(\n fragments: { namespace: string; schema: AnySchema }[],\n provider: SupportedProvider,\n options?: GenerateSchemaOptions,\n): string {\n const ctx = createContext(provider, options?.idGeneratorImport);\n const customTypes: string[] = [];\n const sections: string[] = [];\n const getMapper =\n options?.mapperFactory ||\n ((ns: string | undefined) => (ns ? createTableNameMapper(ns, true) : undefined));\n\n for (const { schema, namespace } of fragments) {\n const fragmentTables: string[] = [];\n const mapper = getMapper(namespace);\n\n // Add section header\n fragmentTables.push(\"\");\n fragmentTables.push(\n \"// ============================================================================\",\n );\n fragmentTables.push(`// Fragment: ${namespace}`);\n fragmentTables.push(\n \"// ============================================================================\",\n );\n\n // Generate tables for this fragment\n for (const table of Object.values(schema.tables)) {\n const tableCode = generateTable(ctx, table, customTypes, namespace, mapper);\n fragmentTables.push(\"\");\n fragmentTables.push(tableCode);\n }\n\n // Build a map of inverse relations for tables that are referenced but don't have their own relations\n // This is needed for Drizzle's relational query API to work correctly\n const inverseRelations = new Map<string, Array<{ fromTable: AnyTable; relation: Relation }>>();\n for (const table of Object.values(schema.tables)) {\n for (const relation of Object.values(table.relations)) {\n // Track this relation as an inverse on the target table\n const targetTableName = relation.table.name;\n if (!inverseRelations.has(targetTableName)) {\n inverseRelations.set(targetTableName, []);\n }\n inverseRelations.get(targetTableName)!.push({ fromTable: table, relation });\n }\n }\n\n // Generate relations for all tables (both explicit and inverse)\n const tablesWithRelations = new Set<string>();\n for (const table of Object.values(schema.tables)) {\n const relationCode = generateRelation(\n ctx,\n table,\n namespace,\n inverseRelations.get(table.name),\n mapper,\n );\n if (relationCode) {\n fragmentTables.push(\"\");\n fragmentTables.push(relationCode);\n tablesWithRelations.add(table.name);\n }\n }\n\n // Generate schema export object (skip for empty namespace to avoid duplicate _schema exports)\n if (namespace !== \"\") {\n fragmentTables.push(\"\");\n fragmentTables.push(\n generateFragmentSchemaExport(schema, namespace, tablesWithRelations, mapper),\n );\n }\n\n sections.push(...fragmentTables);\n }\n\n // Assemble final output\n const lines: string[] = [ctx.imports.format(), ...customTypes, ...sections];\n return lines.join(\"\\n\");\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
//#region src/adapters/generic-sql/driver-config.d.ts
|
|
2
|
+
declare const supportedDatabases: readonly ["sqlite", "postgresql", "mysql"];
|
|
3
|
+
type SupportedDatabase = (typeof supportedDatabases)[number];
|
|
4
|
+
declare const supportedDriverTypes: readonly ["sqlocal", "cloudflare_durable_objects", "better-sqlite3", "pg", "pglite", "mysql2"];
|
|
5
|
+
type SupportedDriverType = (typeof supportedDriverTypes)[number];
|
|
6
|
+
declare abstract class DriverConfig<T extends SupportedDriverType = SupportedDriverType> {
|
|
7
|
+
abstract readonly driverType: T;
|
|
8
|
+
abstract readonly databaseType: SupportedDatabase;
|
|
9
|
+
abstract readonly supportsReturning: boolean;
|
|
10
|
+
abstract readonly supportsJson: boolean;
|
|
11
|
+
/**
|
|
12
|
+
* Column name for internal ID in RETURNING results.
|
|
13
|
+
* Only defined if supportsReturning is true.
|
|
14
|
+
*/
|
|
15
|
+
abstract readonly internalIdColumn: string | undefined;
|
|
16
|
+
get supportsRowsAffected(): boolean;
|
|
17
|
+
/**
|
|
18
|
+
* Extract the number of affected rows from a query result.
|
|
19
|
+
* Only implemented for drivers that support affected rows reporting.
|
|
20
|
+
*
|
|
21
|
+
* @param result - The query result from the SQL driver
|
|
22
|
+
* @returns The number of affected rows as bigint
|
|
23
|
+
* @throws Error if affected rows information is not found in the result
|
|
24
|
+
*/
|
|
25
|
+
extractAffectedRows?(result: Record<string, unknown>): bigint;
|
|
26
|
+
}
|
|
27
|
+
declare class SQLocalDriverConfig extends DriverConfig<"sqlocal"> {
|
|
28
|
+
readonly driverType = "sqlocal";
|
|
29
|
+
readonly databaseType = "sqlite";
|
|
30
|
+
readonly supportsReturning = true;
|
|
31
|
+
readonly supportsJson = false;
|
|
32
|
+
readonly internalIdColumn = "_internalId";
|
|
33
|
+
}
|
|
34
|
+
declare class CloudflareDurableObjectsDriverConfig extends DriverConfig<"cloudflare_durable_objects"> {
|
|
35
|
+
readonly driverType = "cloudflare_durable_objects";
|
|
36
|
+
readonly databaseType = "sqlite";
|
|
37
|
+
readonly supportsReturning = true;
|
|
38
|
+
readonly supportsJson = false;
|
|
39
|
+
readonly internalIdColumn = "_internalId";
|
|
40
|
+
}
|
|
41
|
+
declare class BetterSQLite3DriverConfig extends DriverConfig<"better-sqlite3"> {
|
|
42
|
+
readonly driverType = "better-sqlite3";
|
|
43
|
+
readonly databaseType = "sqlite";
|
|
44
|
+
readonly supportsReturning = true;
|
|
45
|
+
readonly supportsJson = false;
|
|
46
|
+
readonly internalIdColumn = "_internalId";
|
|
47
|
+
extractAffectedRows(result: Record<string, unknown>): bigint;
|
|
48
|
+
}
|
|
49
|
+
declare class NodePostgresDriverConfig extends DriverConfig<"pg"> {
|
|
50
|
+
readonly driverType = "pg";
|
|
51
|
+
readonly databaseType = "postgresql";
|
|
52
|
+
readonly supportsReturning = true;
|
|
53
|
+
readonly supportsJson = true;
|
|
54
|
+
readonly internalIdColumn = "_internalId";
|
|
55
|
+
extractAffectedRows(result: Record<string, unknown>): bigint;
|
|
56
|
+
}
|
|
57
|
+
declare class PGLiteDriverConfig extends DriverConfig<"pglite"> {
|
|
58
|
+
readonly driverType = "pglite";
|
|
59
|
+
readonly databaseType = "postgresql";
|
|
60
|
+
readonly supportsReturning = true;
|
|
61
|
+
readonly supportsJson = true;
|
|
62
|
+
readonly internalIdColumn = "_internalId";
|
|
63
|
+
extractAffectedRows(result: Record<string, unknown>): bigint;
|
|
64
|
+
}
|
|
65
|
+
declare class MySQL2DriverConfig extends DriverConfig<"mysql2"> {
|
|
66
|
+
readonly driverType = "mysql2";
|
|
67
|
+
readonly databaseType = "mysql";
|
|
68
|
+
readonly supportsReturning = false;
|
|
69
|
+
readonly supportsJson = true;
|
|
70
|
+
readonly internalIdColumn: undefined;
|
|
71
|
+
}
|
|
72
|
+
//#endregion
|
|
73
|
+
export { BetterSQLite3DriverConfig, CloudflareDurableObjectsDriverConfig, DriverConfig, MySQL2DriverConfig, NodePostgresDriverConfig, PGLiteDriverConfig, SQLocalDriverConfig, SupportedDatabase, SupportedDriverType, supportedDatabases, supportedDriverTypes };
|
|
74
|
+
//# sourceMappingURL=driver-config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"driver-config.d.ts","names":[],"sources":["../../../src/adapters/generic-sql/driver-config.ts"],"sourcesContent":[],"mappings":";cAAa;AAAA,KACD,iBAAA,GADgE,CAAA,OACpC,kBADoC,CAAA,CAAA,MAAA,CAAA;AAChE,cAEC,oBAF2B,EAAA,SAAA,CAAA,SAAkB,EAAA,4BAAA,EAAA,gBAAA,EAAA,IAAA,EAAA,QAAA,EAAA,QAAA,CAAA;AAE7C,KASD,mBAAA,GAFF,CAAA,OAEgC,oBAFhC,CAAA,CAAA,MAAA,CAAA;AAEE,uBAEU,YAFoB,CAAA,UAEG,mBAFiB,GAEK,mBAFL,CAAA,CAAA;EAExC,kBAAY,UAAA,EACF,CADE;EAAW,kBAAA,YAAA,EAEX,iBAFW;EAAsB,kBAAA,iBAAA,EAAA,OAAA;EACnC,kBAAA,YAAA,EAAA,OAAA;EACE;;;AA0BlC;EAQa,kBAAA,gBAAA,EAAA,MAAqC,GAAA,SAAQ;EAQ7C,IAAA,oBAAA,CAAA,CAAA,EAA0B,OAAA;EAwB1B;AAgCb;AAuBA;;;;;;+BAlG+B;;cAGlB,mBAAA,SAA4B;;;;;;;cAQ5B,oCAAA,SAA6C;;;;;;;cAQ7C,yBAAA,SAAkC;;;;;;8BAOR;;cAiB1B,wBAAA,SAAiC;;;;;;8BAOP;;cAyB1B,kBAAA,SAA2B;;;;;;8BAOD;;cAgB1B,kBAAA,SAA2B"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
//#region src/adapters/generic-sql/driver-config.ts
|
|
2
|
+
const supportedDatabases = [
|
|
3
|
+
"sqlite",
|
|
4
|
+
"postgresql",
|
|
5
|
+
"mysql"
|
|
6
|
+
];
|
|
7
|
+
const supportedDriverTypes = [
|
|
8
|
+
"sqlocal",
|
|
9
|
+
"cloudflare_durable_objects",
|
|
10
|
+
"better-sqlite3",
|
|
11
|
+
"pg",
|
|
12
|
+
"pglite",
|
|
13
|
+
"mysql2"
|
|
14
|
+
];
|
|
15
|
+
var DriverConfig = class {
|
|
16
|
+
get supportsRowsAffected() {
|
|
17
|
+
return !!this.extractAffectedRows;
|
|
18
|
+
}
|
|
19
|
+
};
|
|
20
|
+
var SQLocalDriverConfig = class extends DriverConfig {
|
|
21
|
+
driverType = "sqlocal";
|
|
22
|
+
databaseType = "sqlite";
|
|
23
|
+
supportsReturning = true;
|
|
24
|
+
supportsJson = false;
|
|
25
|
+
internalIdColumn = "_internalId";
|
|
26
|
+
};
|
|
27
|
+
var CloudflareDurableObjectsDriverConfig = class extends DriverConfig {
|
|
28
|
+
driverType = "cloudflare_durable_objects";
|
|
29
|
+
databaseType = "sqlite";
|
|
30
|
+
supportsReturning = true;
|
|
31
|
+
supportsJson = false;
|
|
32
|
+
internalIdColumn = "_internalId";
|
|
33
|
+
};
|
|
34
|
+
var BetterSQLite3DriverConfig = class extends DriverConfig {
|
|
35
|
+
driverType = "better-sqlite3";
|
|
36
|
+
databaseType = "sqlite";
|
|
37
|
+
supportsReturning = true;
|
|
38
|
+
supportsJson = false;
|
|
39
|
+
internalIdColumn = "_internalId";
|
|
40
|
+
extractAffectedRows(result) {
|
|
41
|
+
if ("numAffectedRows" in result) {
|
|
42
|
+
const value = result["numAffectedRows"];
|
|
43
|
+
if (typeof value === "bigint") return value;
|
|
44
|
+
if (typeof value === "number") return BigInt(value);
|
|
45
|
+
}
|
|
46
|
+
throw new Error(`No affected rows found in result: ${JSON.stringify(result)}. Driver ${this.driverType} is expected to support affected rows.`);
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
var NodePostgresDriverConfig = class extends DriverConfig {
|
|
50
|
+
driverType = "pg";
|
|
51
|
+
databaseType = "postgresql";
|
|
52
|
+
supportsReturning = true;
|
|
53
|
+
supportsJson = true;
|
|
54
|
+
internalIdColumn = "_internalId";
|
|
55
|
+
extractAffectedRows(result) {
|
|
56
|
+
if ("numAffectedRows" in result) {
|
|
57
|
+
const value = result["numAffectedRows"];
|
|
58
|
+
if (typeof value === "bigint") return value;
|
|
59
|
+
if (typeof value === "number") return BigInt(value);
|
|
60
|
+
}
|
|
61
|
+
if ("numChangedRows" in result) {
|
|
62
|
+
const value = result["numChangedRows"];
|
|
63
|
+
if (typeof value === "bigint") return value;
|
|
64
|
+
if (typeof value === "number") return BigInt(value);
|
|
65
|
+
}
|
|
66
|
+
throw new Error(`No affected rows found in result: ${JSON.stringify(result)}. Driver ${this.driverType} is expected to support affected rows.`);
|
|
67
|
+
}
|
|
68
|
+
};
|
|
69
|
+
var PGLiteDriverConfig = class extends DriverConfig {
|
|
70
|
+
driverType = "pglite";
|
|
71
|
+
databaseType = "postgresql";
|
|
72
|
+
supportsReturning = true;
|
|
73
|
+
supportsJson = true;
|
|
74
|
+
internalIdColumn = "_internalId";
|
|
75
|
+
extractAffectedRows(result) {
|
|
76
|
+
if ("affectedRows" in result) {
|
|
77
|
+
const value = result["affectedRows"];
|
|
78
|
+
if (typeof value === "bigint") return value;
|
|
79
|
+
if (typeof value === "number") return BigInt(value);
|
|
80
|
+
}
|
|
81
|
+
throw new Error(`No affected rows found in result: ${JSON.stringify(result)}. Driver ${this.driverType} is expected to support affected rows.`);
|
|
82
|
+
}
|
|
83
|
+
};
|
|
84
|
+
var MySQL2DriverConfig = class extends DriverConfig {
|
|
85
|
+
driverType = "mysql2";
|
|
86
|
+
databaseType = "mysql";
|
|
87
|
+
supportsReturning = false;
|
|
88
|
+
supportsJson = true;
|
|
89
|
+
internalIdColumn = void 0;
|
|
90
|
+
};
|
|
91
|
+
|
|
92
|
+
//#endregion
|
|
93
|
+
export { BetterSQLite3DriverConfig, CloudflareDurableObjectsDriverConfig, DriverConfig, MySQL2DriverConfig, NodePostgresDriverConfig, PGLiteDriverConfig, SQLocalDriverConfig, supportedDatabases, supportedDriverTypes };
|
|
94
|
+
//# sourceMappingURL=driver-config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"driver-config.js","names":[],"sources":["../../../src/adapters/generic-sql/driver-config.ts"],"sourcesContent":["export const supportedDatabases = [\"sqlite\", \"postgresql\", \"mysql\"] as const;\nexport type SupportedDatabase = (typeof supportedDatabases)[number];\n\nexport const supportedDriverTypes = [\n \"sqlocal\",\n \"cloudflare_durable_objects\",\n \"better-sqlite3\",\n \"pg\",\n \"pglite\",\n \"mysql2\",\n] as const;\n\nexport type SupportedDriverType = (typeof supportedDriverTypes)[number];\n\nexport abstract class DriverConfig<T extends SupportedDriverType = SupportedDriverType> {\n abstract readonly driverType: T;\n abstract readonly databaseType: SupportedDatabase;\n\n abstract readonly supportsReturning: boolean;\n abstract readonly supportsJson: boolean;\n\n /**\n * Column name for internal ID in RETURNING results.\n * Only defined if supportsReturning is true.\n */\n abstract readonly internalIdColumn: string | undefined;\n\n get supportsRowsAffected(): boolean {\n return !!this.extractAffectedRows;\n }\n\n /**\n * Extract the number of affected rows from a query result.\n * Only implemented for drivers that support affected rows reporting.\n *\n * @param result - The query result from the SQL driver\n * @returns The number of affected rows as bigint\n * @throws Error if affected rows information is not found in the result\n */\n extractAffectedRows?(result: Record<string, unknown>): bigint;\n}\n\nexport class SQLocalDriverConfig extends DriverConfig<\"sqlocal\"> {\n override readonly driverType = \"sqlocal\";\n override readonly databaseType = \"sqlite\";\n override readonly supportsReturning = true;\n override readonly supportsJson = false;\n override readonly internalIdColumn = \"_internalId\";\n}\n\nexport class CloudflareDurableObjectsDriverConfig extends DriverConfig<\"cloudflare_durable_objects\"> {\n override readonly driverType = \"cloudflare_durable_objects\";\n override readonly databaseType = \"sqlite\";\n override readonly supportsReturning = true;\n override readonly supportsJson = false;\n override readonly internalIdColumn = \"_internalId\";\n}\n\nexport class BetterSQLite3DriverConfig extends DriverConfig<\"better-sqlite3\"> {\n override readonly driverType = \"better-sqlite3\";\n override readonly databaseType = \"sqlite\";\n override readonly supportsReturning = true;\n override readonly supportsJson = false;\n override readonly internalIdColumn = \"_internalId\";\n\n override extractAffectedRows(result: Record<string, unknown>): bigint {\n if (\"numAffectedRows\" in result) {\n const value = result[\"numAffectedRows\"];\n if (typeof value === \"bigint\") {\n return value;\n }\n if (typeof value === \"number\") {\n return BigInt(value);\n }\n }\n\n throw new Error(\n `No affected rows found in result: ${JSON.stringify(result)}. Driver ${this.driverType} is expected to support affected rows.`,\n );\n }\n}\n\nexport class NodePostgresDriverConfig extends DriverConfig<\"pg\"> {\n override readonly driverType = \"pg\";\n override readonly databaseType = \"postgresql\";\n override readonly supportsReturning = true;\n override readonly supportsJson = true;\n override readonly internalIdColumn = \"_internalId\";\n\n override extractAffectedRows(result: Record<string, unknown>): bigint {\n if (\"numAffectedRows\" in result) {\n const value = result[\"numAffectedRows\"];\n if (typeof value === \"bigint\") {\n return value;\n }\n if (typeof value === \"number\") {\n return BigInt(value);\n }\n }\n if (\"numChangedRows\" in result) {\n const value = result[\"numChangedRows\"];\n if (typeof value === \"bigint\") {\n return value;\n }\n if (typeof value === \"number\") {\n return BigInt(value);\n }\n }\n throw new Error(\n `No affected rows found in result: ${JSON.stringify(result)}. Driver ${this.driverType} is expected to support affected rows.`,\n );\n }\n}\n\nexport class PGLiteDriverConfig extends DriverConfig<\"pglite\"> {\n override readonly driverType = \"pglite\";\n override readonly databaseType = \"postgresql\";\n override readonly supportsReturning = true;\n override readonly supportsJson = true;\n override readonly internalIdColumn = \"_internalId\";\n\n override extractAffectedRows(result: Record<string, unknown>): bigint {\n if (\"affectedRows\" in result) {\n const value = result[\"affectedRows\"];\n if (typeof value === \"bigint\") {\n return value;\n }\n if (typeof value === \"number\") {\n return BigInt(value);\n }\n }\n throw new Error(\n `No affected rows found in result: ${JSON.stringify(result)}. Driver ${this.driverType} is expected to support affected rows.`,\n );\n }\n}\n\nexport class MySQL2DriverConfig extends DriverConfig<\"mysql2\"> {\n override readonly driverType = \"mysql2\";\n override readonly databaseType = \"mysql\";\n override readonly supportsReturning = false;\n override readonly supportsJson = true;\n override readonly internalIdColumn = undefined;\n}\n"],"mappings":";AAAA,MAAa,qBAAqB;CAAC;CAAU;CAAc;CAAQ;AAGnE,MAAa,uBAAuB;CAClC;CACA;CACA;CACA;CACA;CACA;CACD;AAID,IAAsB,eAAtB,MAAwF;CAatF,IAAI,uBAAgC;AAClC,SAAO,CAAC,CAAC,KAAK;;;AAclB,IAAa,sBAAb,cAAyC,aAAwB;CAC/D,AAAkB,aAAa;CAC/B,AAAkB,eAAe;CACjC,AAAkB,oBAAoB;CACtC,AAAkB,eAAe;CACjC,AAAkB,mBAAmB;;AAGvC,IAAa,uCAAb,cAA0D,aAA2C;CACnG,AAAkB,aAAa;CAC/B,AAAkB,eAAe;CACjC,AAAkB,oBAAoB;CACtC,AAAkB,eAAe;CACjC,AAAkB,mBAAmB;;AAGvC,IAAa,4BAAb,cAA+C,aAA+B;CAC5E,AAAkB,aAAa;CAC/B,AAAkB,eAAe;CACjC,AAAkB,oBAAoB;CACtC,AAAkB,eAAe;CACjC,AAAkB,mBAAmB;CAErC,AAAS,oBAAoB,QAAyC;AACpE,MAAI,qBAAqB,QAAQ;GAC/B,MAAM,QAAQ,OAAO;AACrB,OAAI,OAAO,UAAU,SACnB,QAAO;AAET,OAAI,OAAO,UAAU,SACnB,QAAO,OAAO,MAAM;;AAIxB,QAAM,IAAI,MACR,qCAAqC,KAAK,UAAU,OAAO,CAAC,WAAW,KAAK,WAAW,wCACxF;;;AAIL,IAAa,2BAAb,cAA8C,aAAmB;CAC/D,AAAkB,aAAa;CAC/B,AAAkB,eAAe;CACjC,AAAkB,oBAAoB;CACtC,AAAkB,eAAe;CACjC,AAAkB,mBAAmB;CAErC,AAAS,oBAAoB,QAAyC;AACpE,MAAI,qBAAqB,QAAQ;GAC/B,MAAM,QAAQ,OAAO;AACrB,OAAI,OAAO,UAAU,SACnB,QAAO;AAET,OAAI,OAAO,UAAU,SACnB,QAAO,OAAO,MAAM;;AAGxB,MAAI,oBAAoB,QAAQ;GAC9B,MAAM,QAAQ,OAAO;AACrB,OAAI,OAAO,UAAU,SACnB,QAAO;AAET,OAAI,OAAO,UAAU,SACnB,QAAO,OAAO,MAAM;;AAGxB,QAAM,IAAI,MACR,qCAAqC,KAAK,UAAU,OAAO,CAAC,WAAW,KAAK,WAAW,wCACxF;;;AAIL,IAAa,qBAAb,cAAwC,aAAuB;CAC7D,AAAkB,aAAa;CAC/B,AAAkB,eAAe;CACjC,AAAkB,oBAAoB;CACtC,AAAkB,eAAe;CACjC,AAAkB,mBAAmB;CAErC,AAAS,oBAAoB,QAAyC;AACpE,MAAI,kBAAkB,QAAQ;GAC5B,MAAM,QAAQ,OAAO;AACrB,OAAI,OAAO,UAAU,SACnB,QAAO;AAET,OAAI,OAAO,UAAU,SACnB,QAAO,OAAO,MAAM;;AAGxB,QAAM,IAAI,MACR,qCAAqC,KAAK,UAAU,OAAO,CAAC,WAAW,KAAK,WAAW,wCACxF;;;AAIL,IAAa,qBAAb,cAAwC,aAAuB;CAC7D,AAAkB,aAAa;CAC/B,AAAkB,eAAe;CACjC,AAAkB,oBAAoB;CACtC,AAAkB,eAAe;CACjC,AAAkB,mBAAmB"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { AnySchema } from "../../schema/create.js";
|
|
2
|
+
import { DriverConfig } from "./driver-config.js";
|
|
3
|
+
import { SimpleQueryInterface } from "../../query/simple-query-interface.js";
|
|
4
|
+
import { CompiledQuery, Dialect } from "../../sql-driver/sql-driver.js";
|
|
5
|
+
import { SqlDriverAdapter } from "../../sql-driver/sql-driver-adapter.js";
|
|
6
|
+
import { PreparedMigrations } from "./migration/prepared-migrations.js";
|
|
7
|
+
import { DatabaseAdapter, DatabaseContextStorage, TableNameMapper, fragnoDatabaseAdapterNameFakeSymbol, fragnoDatabaseAdapterVersionFakeSymbol } from "../adapters.js";
|
|
8
|
+
import { RequestContextStorage } from "@fragno-dev/core/internal/request-context-storage";
|
|
9
|
+
|
|
10
|
+
//#region src/adapters/generic-sql/generic-sql-adapter.d.ts
|
|
11
|
+
interface UnitOfWorkConfig {
|
|
12
|
+
onQuery?: (query: CompiledQuery) => void;
|
|
13
|
+
dryRun?: boolean;
|
|
14
|
+
}
|
|
15
|
+
interface GenericSQLOptions {
|
|
16
|
+
dialect: Dialect;
|
|
17
|
+
driverConfig: DriverConfig;
|
|
18
|
+
uowConfig?: UnitOfWorkConfig;
|
|
19
|
+
}
|
|
20
|
+
declare class GenericSQLAdapter implements DatabaseAdapter<UnitOfWorkConfig> {
|
|
21
|
+
#private;
|
|
22
|
+
readonly dialect: Dialect;
|
|
23
|
+
readonly driverConfig: DriverConfig;
|
|
24
|
+
readonly uowConfig?: UnitOfWorkConfig;
|
|
25
|
+
constructor({
|
|
26
|
+
dialect,
|
|
27
|
+
driverConfig,
|
|
28
|
+
uowConfig
|
|
29
|
+
}: GenericSQLOptions);
|
|
30
|
+
get driver(): SqlDriverAdapter;
|
|
31
|
+
get [fragnoDatabaseAdapterNameFakeSymbol](): string;
|
|
32
|
+
get [fragnoDatabaseAdapterVersionFakeSymbol](): number;
|
|
33
|
+
get contextStorage(): RequestContextStorage<DatabaseContextStorage>;
|
|
34
|
+
close(): Promise<void>;
|
|
35
|
+
isConnectionHealthy(): Promise<boolean>;
|
|
36
|
+
prepareMigrations<T extends AnySchema>(schema: T, namespace: string): PreparedMigrations;
|
|
37
|
+
createTableNameMapper(namespace: string): TableNameMapper;
|
|
38
|
+
getSchemaVersion(namespace: string): Promise<string | undefined>;
|
|
39
|
+
createQueryEngine<T extends AnySchema>(schema: T, namespace: string): SimpleQueryInterface<T, UnitOfWorkConfig>;
|
|
40
|
+
}
|
|
41
|
+
//#endregion
|
|
42
|
+
export { GenericSQLAdapter, GenericSQLOptions, UnitOfWorkConfig };
|
|
43
|
+
//# sourceMappingURL=generic-sql-adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generic-sql-adapter.d.ts","names":[],"sources":["../../../src/adapters/generic-sql/generic-sql-adapter.ts"],"sourcesContent":[],"mappings":";;;;;;;;;;UAyBiB,gBAAA;oBACG;EADH,MAAA,CAAA,EAAA,OAAA;AAKjB;AACW,UADM,iBAAA,CACN;EACK,OAAA,EADL,OACK;EACF,YAAA,EADE,YACF;EAAgB,SAAA,CAAA,EAAhB,gBAAgB;AAG9B;AAA0D,cAA7C,iBAAA,YAA6B,eAAgB,CAAA,gBAAA,CAAA,CAAA;EACtC,CAAA,OAAA;EACK,SAAA,OAAA,EADL,OACK;EACF,SAAA,YAAA,EADE,YACF;EAOP,SAAA,SAAA,CAAA,EAPO,gBAOP;EAAS,WAAA,CAAA;IAAA,OAAA;IAAA,YAAA;IAAA;EAAA,CAAA,EAA2B,iBAA3B;EAAc,IAAA,MAAA,CAAA,CAAA,EAWvB,gBAXuB;EAAa,KAe7C,mCAAA,GAf6C,EAAA,MAAA;EAWpC,KAQT,sCAAA,GARS,EAAA,MAAA;EAIT,IAAA,cAAA,CAAA,CAAA,EAQiB,qBARjB,CAQuC,sBARvC,CAAA;EAIA,KAAA,CAAA,CAAA,EAQI,OARJ,CAAA,IAAA,CAAA;EAIuC,mBAAA,CAAA,CAAA,EAQf,OARe,CAAA,OAAA,CAAA;EAAtB,iBAAA,CAAA,UAaM,SAbN,CAAA,CAAA,MAAA,EAayB,CAbzB,EAAA,SAAA,EAAA,MAAA,CAAA,EAagD,kBAbhD;EAIb,qBAAA,CAAA,SAAA,EAAA,MAAA,CAAA,EAmBiC,eAnBjC;EAIoB,gBAAA,CAAA,SAAA,EAAA,MAAA,CAAA,EAmBc,OAnBd,CAAA,MAAA,GAAA,SAAA,CAAA;EAKD,iBAAA,CAAA,UA2CA,SA3CA,CAAA,CAAA,MAAA,EA4ClB,CA5CkB,EAAA,SAAA,EAAA,MAAA,CAAA,EA8CzB,oBA9CyB,CA8CJ,CA9CI,EA8CD,gBA9CC,CAAA"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { RequestContextStorage } from "../../packages/fragno/dist/api/request-context-storage.js";
|
|
2
|
+
import { fragnoDatabaseAdapterNameFakeSymbol, fragnoDatabaseAdapterVersionFakeSymbol } from "../adapters.js";
|
|
3
|
+
import { createTableNameMapper } from "../shared/table-name-mapper.js";
|
|
4
|
+
import { SqlDriverAdapter } from "../../sql-driver/sql-driver-adapter.js";
|
|
5
|
+
import { sql } from "../../sql-driver/sql.js";
|
|
6
|
+
import { createExecutor } from "./generic-sql-uow-executor.js";
|
|
7
|
+
import { UnitOfWorkDecoder } from "./uow-decoder.js";
|
|
8
|
+
import { createPreparedMigrations } from "./migration/prepared-migrations.js";
|
|
9
|
+
import { createUOWCompilerFromOperationCompiler } from "../shared/uow-operation-compiler.js";
|
|
10
|
+
import { GenericSQLUOWOperationCompiler } from "./query/generic-sql-uow-operation-compiler.js";
|
|
11
|
+
import { fromUnitOfWorkCompiler } from "../shared/from-unit-of-work-compiler.js";
|
|
12
|
+
|
|
13
|
+
//#region src/adapters/generic-sql/generic-sql-adapter.ts
|
|
14
|
+
var GenericSQLAdapter = class {
|
|
15
|
+
dialect;
|
|
16
|
+
driverConfig;
|
|
17
|
+
uowConfig;
|
|
18
|
+
#schemaNamespaceMap = /* @__PURE__ */ new WeakMap();
|
|
19
|
+
#contextStorage;
|
|
20
|
+
#driver;
|
|
21
|
+
constructor({ dialect, driverConfig, uowConfig }) {
|
|
22
|
+
this.dialect = dialect;
|
|
23
|
+
this.driverConfig = driverConfig;
|
|
24
|
+
this.uowConfig = uowConfig;
|
|
25
|
+
this.#schemaNamespaceMap = /* @__PURE__ */ new WeakMap();
|
|
26
|
+
this.#contextStorage = new RequestContextStorage();
|
|
27
|
+
this.#driver = new SqlDriverAdapter(dialect);
|
|
28
|
+
}
|
|
29
|
+
get driver() {
|
|
30
|
+
return this.#driver;
|
|
31
|
+
}
|
|
32
|
+
get [fragnoDatabaseAdapterNameFakeSymbol]() {
|
|
33
|
+
return "generic-sql";
|
|
34
|
+
}
|
|
35
|
+
get [fragnoDatabaseAdapterVersionFakeSymbol]() {
|
|
36
|
+
return 0;
|
|
37
|
+
}
|
|
38
|
+
get contextStorage() {
|
|
39
|
+
return this.#contextStorage;
|
|
40
|
+
}
|
|
41
|
+
close() {
|
|
42
|
+
return this.#driver.destroy();
|
|
43
|
+
}
|
|
44
|
+
async isConnectionHealthy() {
|
|
45
|
+
return (await this.#driver.executeQuery(sql`SELECT 1 as healthy`.compile(this.dialect))).rows[0]["healthy"] === 1;
|
|
46
|
+
}
|
|
47
|
+
prepareMigrations(schema, namespace) {
|
|
48
|
+
return createPreparedMigrations({
|
|
49
|
+
schema,
|
|
50
|
+
namespace,
|
|
51
|
+
database: this.driverConfig.databaseType,
|
|
52
|
+
mapper: namespace ? this.createTableNameMapper(namespace) : void 0,
|
|
53
|
+
driver: this.#driver
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
createTableNameMapper(namespace) {
|
|
57
|
+
return createTableNameMapper(namespace, false);
|
|
58
|
+
}
|
|
59
|
+
async getSchemaVersion(namespace) {
|
|
60
|
+
const query = sql`SELECT value FROM fragno_db_settings WHERE key = ${`${namespace}.schema_version`};`.compile(this.dialect);
|
|
61
|
+
let result;
|
|
62
|
+
try {
|
|
63
|
+
result = await this.#driver.executeQuery(query);
|
|
64
|
+
} catch (error) {
|
|
65
|
+
if (error instanceof Error && error.message.includes("fragno_db_settings")) return;
|
|
66
|
+
throw error;
|
|
67
|
+
}
|
|
68
|
+
const value = result.rows[0]["value"];
|
|
69
|
+
if (!value) return;
|
|
70
|
+
if (typeof value !== "string") throw new Error(`Schema version for namespace ${namespace} is not a string`);
|
|
71
|
+
return value;
|
|
72
|
+
}
|
|
73
|
+
createQueryEngine(schema, namespace) {
|
|
74
|
+
this.#schemaNamespaceMap.set(schema, namespace);
|
|
75
|
+
return fromUnitOfWorkCompiler(schema, {
|
|
76
|
+
compiler: createUOWCompilerFromOperationCompiler(new GenericSQLUOWOperationCompiler(this.driverConfig, (ns) => ns ? this.createTableNameMapper(ns) : void 0)),
|
|
77
|
+
executor: createExecutor(this.#driver, this.driverConfig, false),
|
|
78
|
+
decoder: new UnitOfWorkDecoder(this.driverConfig),
|
|
79
|
+
uowConfig: this.uowConfig,
|
|
80
|
+
schemaNamespaceMap: this.#schemaNamespaceMap
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
};
|
|
84
|
+
|
|
85
|
+
//#endregion
|
|
86
|
+
export { GenericSQLAdapter };
|
|
87
|
+
//# sourceMappingURL=generic-sql-adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generic-sql-adapter.js","names":["#schemaNamespaceMap","#contextStorage","#driver","result: QueryResult<Record<string, unknown>>"],"sources":["../../../src/adapters/generic-sql/generic-sql-adapter.ts"],"sourcesContent":["import { RequestContextStorage } from \"@fragno-dev/core/internal/request-context-storage\";\nimport {\n fragnoDatabaseAdapterNameFakeSymbol,\n fragnoDatabaseAdapterVersionFakeSymbol,\n type DatabaseAdapter,\n type DatabaseContextStorage,\n type TableNameMapper,\n} from \"../adapters\";\nimport type { CompiledQuery, Dialect, QueryResult } from \"../../sql-driver/sql-driver\";\nimport { SqlDriverAdapter } from \"../../sql-driver/sql-driver-adapter\";\nimport { sql } from \"../../sql-driver/sql\";\nimport type { AnySchema } from \"../../schema/create\";\nimport { createTableNameMapper } from \"../shared/table-name-mapper\";\nimport type { SimpleQueryInterface } from \"../../query/simple-query-interface\";\nimport { createExecutor } from \"./generic-sql-uow-executor\";\nimport { UnitOfWorkDecoder } from \"./uow-decoder\";\nimport { createPreparedMigrations, type PreparedMigrations } from \"./migration/prepared-migrations\";\nimport type { DriverConfig } from \"./driver-config\";\nimport { GenericSQLUOWOperationCompiler } from \"./query/generic-sql-uow-operation-compiler\";\nimport { createUOWCompilerFromOperationCompiler } from \"../shared/uow-operation-compiler\";\nimport {\n fromUnitOfWorkCompiler,\n type UnitOfWorkFactory,\n} from \"../shared/from-unit-of-work-compiler\";\n\nexport interface UnitOfWorkConfig {\n onQuery?: (query: CompiledQuery) => void;\n dryRun?: boolean;\n}\n\nexport interface GenericSQLOptions {\n dialect: Dialect;\n driverConfig: DriverConfig;\n uowConfig?: UnitOfWorkConfig;\n}\n\nexport class GenericSQLAdapter implements DatabaseAdapter<UnitOfWorkConfig> {\n readonly dialect: Dialect;\n readonly driverConfig: DriverConfig;\n readonly uowConfig?: UnitOfWorkConfig;\n\n #schemaNamespaceMap = new WeakMap<AnySchema, string>();\n #contextStorage: RequestContextStorage<DatabaseContextStorage>;\n\n #driver: SqlDriverAdapter;\n\n constructor({ dialect, driverConfig, uowConfig }: GenericSQLOptions) {\n this.dialect = dialect;\n this.driverConfig = driverConfig;\n this.uowConfig = uowConfig;\n\n this.#schemaNamespaceMap = new WeakMap<AnySchema, string>();\n this.#contextStorage = new RequestContextStorage();\n\n this.#driver = new SqlDriverAdapter(dialect);\n }\n\n get driver(): SqlDriverAdapter {\n return this.#driver;\n }\n\n get [fragnoDatabaseAdapterNameFakeSymbol](): string {\n return \"generic-sql\";\n }\n\n get [fragnoDatabaseAdapterVersionFakeSymbol](): number {\n return 0;\n }\n\n get contextStorage(): RequestContextStorage<DatabaseContextStorage> {\n return this.#contextStorage;\n }\n\n close(): Promise<void> {\n return this.#driver.destroy();\n }\n\n async isConnectionHealthy(): Promise<boolean> {\n const result = await this.#driver.executeQuery(sql`SELECT 1 as healthy`.compile(this.dialect));\n return result.rows[0][\"healthy\"] === 1;\n }\n\n prepareMigrations<T extends AnySchema>(schema: T, namespace: string): PreparedMigrations {\n return createPreparedMigrations({\n schema,\n namespace,\n database: this.driverConfig.databaseType,\n mapper: namespace ? this.createTableNameMapper(namespace) : undefined,\n driver: this.#driver,\n });\n }\n\n createTableNameMapper(namespace: string): TableNameMapper {\n return createTableNameMapper(namespace, false);\n }\n\n async getSchemaVersion(namespace: string): Promise<string | undefined> {\n const key = `${namespace}.schema_version`;\n const query = sql`SELECT value FROM fragno_db_settings WHERE key = ${key};`.compile(\n this.dialect,\n );\n\n let result: QueryResult<Record<string, unknown>>;\n try {\n result = await this.#driver.executeQuery(query);\n } catch (error) {\n if (error instanceof Error && error.message.includes(\"fragno_db_settings\")) {\n return undefined;\n }\n throw error;\n }\n\n const value = result.rows[0][\"value\"];\n\n if (!value) {\n return undefined;\n }\n\n if (typeof value !== \"string\") {\n throw new Error(`Schema version for namespace ${namespace} is not a string`);\n }\n\n return value;\n }\n\n createQueryEngine<T extends AnySchema>(\n schema: T,\n namespace: string,\n ): SimpleQueryInterface<T, UnitOfWorkConfig> {\n this.#schemaNamespaceMap.set(schema, namespace);\n\n const operationCompiler = new GenericSQLUOWOperationCompiler(this.driverConfig, (ns) =>\n ns ? this.createTableNameMapper(ns) : undefined,\n );\n\n const factory: UnitOfWorkFactory = {\n compiler: createUOWCompilerFromOperationCompiler(operationCompiler),\n executor: createExecutor(this.#driver, this.driverConfig, false),\n decoder: new UnitOfWorkDecoder(this.driverConfig),\n uowConfig: this.uowConfig,\n schemaNamespaceMap: this.#schemaNamespaceMap,\n };\n\n return fromUnitOfWorkCompiler(schema, factory);\n }\n}\n"],"mappings":";;;;;;;;;;;;;AAoCA,IAAa,oBAAb,MAA4E;CAC1E,AAAS;CACT,AAAS;CACT,AAAS;CAET,sCAAsB,IAAI,SAA4B;CACtD;CAEA;CAEA,YAAY,EAAE,SAAS,cAAc,aAAgC;AACnE,OAAK,UAAU;AACf,OAAK,eAAe;AACpB,OAAK,YAAY;AAEjB,QAAKA,qCAAsB,IAAI,SAA4B;AAC3D,QAAKC,iBAAkB,IAAI,uBAAuB;AAElD,QAAKC,SAAU,IAAI,iBAAiB,QAAQ;;CAG9C,IAAI,SAA2B;AAC7B,SAAO,MAAKA;;CAGd,KAAK,uCAA+C;AAClD,SAAO;;CAGT,KAAK,0CAAkD;AACrD,SAAO;;CAGT,IAAI,iBAAgE;AAClE,SAAO,MAAKD;;CAGd,QAAuB;AACrB,SAAO,MAAKC,OAAQ,SAAS;;CAG/B,MAAM,sBAAwC;AAE5C,UADe,MAAM,MAAKA,OAAQ,aAAa,GAAG,sBAAsB,QAAQ,KAAK,QAAQ,CAAC,EAChF,KAAK,GAAG,eAAe;;CAGvC,kBAAuC,QAAW,WAAuC;AACvF,SAAO,yBAAyB;GAC9B;GACA;GACA,UAAU,KAAK,aAAa;GAC5B,QAAQ,YAAY,KAAK,sBAAsB,UAAU,GAAG;GAC5D,QAAQ,MAAKA;GACd,CAAC;;CAGJ,sBAAsB,WAAoC;AACxD,SAAO,sBAAsB,WAAW,MAAM;;CAGhD,MAAM,iBAAiB,WAAgD;EAErE,MAAM,QAAQ,GAAG,oDADL,GAAG,UAAU,iBACgD,GAAG,QAC1E,KAAK,QACN;EAED,IAAIC;AACJ,MAAI;AACF,YAAS,MAAM,MAAKD,OAAQ,aAAa,MAAM;WACxC,OAAO;AACd,OAAI,iBAAiB,SAAS,MAAM,QAAQ,SAAS,qBAAqB,CACxE;AAEF,SAAM;;EAGR,MAAM,QAAQ,OAAO,KAAK,GAAG;AAE7B,MAAI,CAAC,MACH;AAGF,MAAI,OAAO,UAAU,SACnB,OAAM,IAAI,MAAM,gCAAgC,UAAU,kBAAkB;AAG9E,SAAO;;CAGT,kBACE,QACA,WAC2C;AAC3C,QAAKF,mBAAoB,IAAI,QAAQ,UAAU;AAc/C,SAAO,uBAAuB,QARK;GACjC,UAAU,uCALc,IAAI,+BAA+B,KAAK,eAAe,OAC/E,KAAK,KAAK,sBAAsB,GAAG,GAAG,OACvC,CAGoE;GACnE,UAAU,eAAe,MAAKE,QAAS,KAAK,cAAc,MAAM;GAChE,SAAS,IAAI,kBAAkB,KAAK,aAAa;GACjD,WAAW,KAAK;GAChB,oBAAoB,MAAKF;GAC1B,CAE6C"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { ResultInterpreter } from "./result-interpreter.js";
|
|
2
|
+
|
|
3
|
+
//#region src/adapters/generic-sql/generic-sql-uow-executor.ts
|
|
4
|
+
async function executeRetrieval(adapter, retrievalBatch) {
|
|
5
|
+
if (retrievalBatch.length === 0) return [];
|
|
6
|
+
const retrievalResults = [];
|
|
7
|
+
await adapter.transaction(async (tx) => {
|
|
8
|
+
for (const compiledQuery of retrievalBatch) {
|
|
9
|
+
const result = await tx.executeQuery(compiledQuery);
|
|
10
|
+
retrievalResults.push(result.rows);
|
|
11
|
+
}
|
|
12
|
+
});
|
|
13
|
+
return retrievalResults;
|
|
14
|
+
}
|
|
15
|
+
async function executeMutation(adapter, driverConfig, mutationBatch) {
|
|
16
|
+
if (mutationBatch.length === 0) return {
|
|
17
|
+
success: true,
|
|
18
|
+
createdInternalIds: []
|
|
19
|
+
};
|
|
20
|
+
const createdInternalIds = [];
|
|
21
|
+
const resultInterpreter = new ResultInterpreter(driverConfig);
|
|
22
|
+
try {
|
|
23
|
+
await adapter.transaction(async (tx) => {
|
|
24
|
+
for (const compiledMutation of mutationBatch) {
|
|
25
|
+
const result = await tx.executeQuery(compiledMutation.query);
|
|
26
|
+
if (compiledMutation.op === "create") if (driverConfig.supportsReturning && driverConfig.internalIdColumn) {
|
|
27
|
+
const internalId = resultInterpreter.getCreatedInternalId(result);
|
|
28
|
+
createdInternalIds.push(internalId);
|
|
29
|
+
} else createdInternalIds.push(null);
|
|
30
|
+
else if ((compiledMutation.op === "update" || compiledMutation.op === "delete") && compiledMutation.expectedAffectedRows !== null) {
|
|
31
|
+
const affectedRows = resultInterpreter.getAffectedRows(result);
|
|
32
|
+
if (affectedRows !== compiledMutation.expectedAffectedRows) throw new Error(`Version conflict: expected ${compiledMutation.expectedAffectedRows} rows affected, but got ${affectedRows}`);
|
|
33
|
+
}
|
|
34
|
+
if (compiledMutation.expectedReturnedRows !== null) {
|
|
35
|
+
const returnedRowCount = resultInterpreter.getReturnedRowCount(result);
|
|
36
|
+
if (returnedRowCount !== BigInt(compiledMutation.expectedReturnedRows)) throw new Error(`Version conflict: expected ${compiledMutation.expectedReturnedRows} rows returned, but got ${returnedRowCount}`);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
});
|
|
40
|
+
return {
|
|
41
|
+
success: true,
|
|
42
|
+
createdInternalIds
|
|
43
|
+
};
|
|
44
|
+
} catch (error) {
|
|
45
|
+
if (error instanceof Error && error.message.includes("Version conflict")) return { success: false };
|
|
46
|
+
throw error;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
function createExecutor(adapter, driverConfig, dryRun) {
|
|
50
|
+
return {
|
|
51
|
+
async executeRetrievalPhase(retrievalBatch) {
|
|
52
|
+
if (dryRun) return retrievalBatch.map(() => []);
|
|
53
|
+
return executeRetrieval(adapter, retrievalBatch);
|
|
54
|
+
},
|
|
55
|
+
async executeMutationPhase(mutationBatch) {
|
|
56
|
+
if (dryRun) return {
|
|
57
|
+
success: true,
|
|
58
|
+
createdInternalIds: mutationBatch.map(() => null)
|
|
59
|
+
};
|
|
60
|
+
return executeMutation(adapter, driverConfig, mutationBatch);
|
|
61
|
+
}
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
//#endregion
|
|
66
|
+
export { createExecutor };
|
|
67
|
+
//# sourceMappingURL=generic-sql-uow-executor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generic-sql-uow-executor.js","names":["retrievalResults: unknown[]","createdInternalIds: (bigint | null)[]"],"sources":["../../../src/adapters/generic-sql/generic-sql-uow-executor.ts"],"sourcesContent":["import type {\n CompiledMutation,\n MutationResult,\n UOWExecutor,\n} from \"../../query/unit-of-work/unit-of-work\";\nimport type { CompiledQuery } from \"../../sql-driver/sql-driver\";\nimport type { SqlDriverAdapter } from \"../../sql-driver/sql-driver-adapter\";\nimport type { DriverConfig } from \"./driver-config\";\nimport { ResultInterpreter } from \"./result-interpreter\";\n\nexport async function executeRetrieval(\n adapter: SqlDriverAdapter,\n retrievalBatch: CompiledQuery[],\n): Promise<unknown[]> {\n if (retrievalBatch.length === 0) {\n return [];\n }\n\n const retrievalResults: unknown[] = [];\n\n await adapter.transaction(async (tx) => {\n for (const compiledQuery of retrievalBatch) {\n const result = await tx.executeQuery(compiledQuery);\n retrievalResults.push(result.rows);\n }\n });\n\n return retrievalResults;\n}\n\nexport async function executeMutation(\n adapter: SqlDriverAdapter,\n driverConfig: DriverConfig,\n mutationBatch: CompiledMutation<CompiledQuery>[],\n): Promise<MutationResult> {\n if (mutationBatch.length === 0) {\n return { success: true, createdInternalIds: [] };\n }\n\n const createdInternalIds: (bigint | null)[] = [];\n const resultInterpreter = new ResultInterpreter(driverConfig);\n\n try {\n await adapter.transaction(async (tx) => {\n for (const compiledMutation of mutationBatch) {\n const result = await tx.executeQuery(compiledMutation.query);\n\n // Extract internal ID for INSERT operations\n if (compiledMutation.op === \"create\") {\n // Only try to extract internal ID if driver supports RETURNING\n // If not supported, push null (expected case - system falls back to subqueries)\n if (driverConfig.supportsReturning && driverConfig.internalIdColumn) {\n const internalId = resultInterpreter.getCreatedInternalId(result);\n createdInternalIds.push(internalId);\n } else {\n // Driver doesn't support RETURNING - this is expected, push null\n createdInternalIds.push(null);\n }\n } else if (\n (compiledMutation.op === \"update\" || compiledMutation.op === \"delete\") &&\n compiledMutation.expectedAffectedRows !== null\n ) {\n // Check affected rows for updates/deletes\n const affectedRows = resultInterpreter.getAffectedRows(result);\n\n if (affectedRows !== compiledMutation.expectedAffectedRows) {\n // Version conflict detected - the UPDATE/DELETE didn't affect the expected number of rows\n // This means either the row doesn't exist or the version has changed\n throw new Error(\n `Version conflict: expected ${compiledMutation.expectedAffectedRows} rows affected, but got ${affectedRows}`,\n );\n }\n }\n // \"check\" operations are handled below via expectedReturnedRows\n\n if (compiledMutation.expectedReturnedRows !== null) {\n // For SELECT queries (check operations), verify row count\n const returnedRowCount = resultInterpreter.getReturnedRowCount(result);\n\n if (returnedRowCount !== BigInt(compiledMutation.expectedReturnedRows)) {\n // Version conflict detected - the SELECT didn't return the expected number of rows\n // This means either the row doesn't exist or the version has changed\n throw new Error(\n `Version conflict: expected ${compiledMutation.expectedReturnedRows} rows returned, but got ${returnedRowCount}`,\n );\n }\n }\n }\n });\n\n return { success: true, createdInternalIds };\n } catch (error) {\n // Transaction failed - could be version conflict or other constraint violation\n // Return success=false to indicate the UOW should be retried\n if (error instanceof Error && error.message.includes(\"Version conflict\")) {\n return { success: false };\n }\n\n // Other database errors should be thrown\n throw error;\n }\n}\n\nexport function createExecutor(\n adapter: SqlDriverAdapter,\n driverConfig: DriverConfig,\n dryRun?: boolean,\n): UOWExecutor<CompiledQuery, unknown> {\n return {\n async executeRetrievalPhase(retrievalBatch: CompiledQuery[]) {\n // In dryRun mode, skip execution and return empty results\n if (dryRun) {\n return retrievalBatch.map(() => []);\n }\n\n return executeRetrieval(adapter, retrievalBatch);\n },\n async executeMutationPhase(mutationBatch: CompiledMutation<CompiledQuery>[]) {\n // In dryRun mode, skip execution and return success with mock internal IDs\n if (dryRun) {\n return {\n success: true,\n createdInternalIds: mutationBatch.map(() => null),\n };\n }\n\n return executeMutation(adapter, driverConfig, mutationBatch);\n },\n };\n}\n"],"mappings":";;;AAUA,eAAsB,iBACpB,SACA,gBACoB;AACpB,KAAI,eAAe,WAAW,EAC5B,QAAO,EAAE;CAGX,MAAMA,mBAA8B,EAAE;AAEtC,OAAM,QAAQ,YAAY,OAAO,OAAO;AACtC,OAAK,MAAM,iBAAiB,gBAAgB;GAC1C,MAAM,SAAS,MAAM,GAAG,aAAa,cAAc;AACnD,oBAAiB,KAAK,OAAO,KAAK;;GAEpC;AAEF,QAAO;;AAGT,eAAsB,gBACpB,SACA,cACA,eACyB;AACzB,KAAI,cAAc,WAAW,EAC3B,QAAO;EAAE,SAAS;EAAM,oBAAoB,EAAE;EAAE;CAGlD,MAAMC,qBAAwC,EAAE;CAChD,MAAM,oBAAoB,IAAI,kBAAkB,aAAa;AAE7D,KAAI;AACF,QAAM,QAAQ,YAAY,OAAO,OAAO;AACtC,QAAK,MAAM,oBAAoB,eAAe;IAC5C,MAAM,SAAS,MAAM,GAAG,aAAa,iBAAiB,MAAM;AAG5D,QAAI,iBAAiB,OAAO,SAG1B,KAAI,aAAa,qBAAqB,aAAa,kBAAkB;KACnE,MAAM,aAAa,kBAAkB,qBAAqB,OAAO;AACjE,wBAAmB,KAAK,WAAW;UAGnC,oBAAmB,KAAK,KAAK;cAG9B,iBAAiB,OAAO,YAAY,iBAAiB,OAAO,aAC7D,iBAAiB,yBAAyB,MAC1C;KAEA,MAAM,eAAe,kBAAkB,gBAAgB,OAAO;AAE9D,SAAI,iBAAiB,iBAAiB,qBAGpC,OAAM,IAAI,MACR,8BAA8B,iBAAiB,qBAAqB,0BAA0B,eAC/F;;AAKL,QAAI,iBAAiB,yBAAyB,MAAM;KAElD,MAAM,mBAAmB,kBAAkB,oBAAoB,OAAO;AAEtE,SAAI,qBAAqB,OAAO,iBAAiB,qBAAqB,CAGpE,OAAM,IAAI,MACR,8BAA8B,iBAAiB,qBAAqB,0BAA0B,mBAC/F;;;IAIP;AAEF,SAAO;GAAE,SAAS;GAAM;GAAoB;UACrC,OAAO;AAGd,MAAI,iBAAiB,SAAS,MAAM,QAAQ,SAAS,mBAAmB,CACtE,QAAO,EAAE,SAAS,OAAO;AAI3B,QAAM;;;AAIV,SAAgB,eACd,SACA,cACA,QACqC;AACrC,QAAO;EACL,MAAM,sBAAsB,gBAAiC;AAE3D,OAAI,OACF,QAAO,eAAe,UAAU,EAAE,CAAC;AAGrC,UAAO,iBAAiB,SAAS,eAAe;;EAElD,MAAM,qBAAqB,eAAkD;AAE3E,OAAI,OACF,QAAO;IACL,SAAS;IACT,oBAAoB,cAAc,UAAU,KAAK;IAClD;AAGH,UAAO,gBAAgB,SAAS,cAAc,cAAc;;EAE/D"}
|