@fragno-dev/db 0.1.15 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-build.log +242 -179
- package/CHANGELOG.md +23 -0
- package/README.md +123 -8
- package/dist/adapters/adapters.d.ts +5 -5
- package/dist/adapters/adapters.d.ts.map +1 -1
- package/dist/adapters/adapters.js.map +1 -1
- package/dist/adapters/drizzle/drizzle-adapter.d.ts +6 -21
- package/dist/adapters/drizzle/drizzle-adapter.d.ts.map +1 -1
- package/dist/adapters/drizzle/drizzle-adapter.js +7 -54
- package/dist/adapters/drizzle/drizzle-adapter.js.map +1 -1
- package/dist/adapters/drizzle/generate.d.ts +3 -0
- package/dist/adapters/drizzle/generate.d.ts.map +1 -1
- package/dist/adapters/drizzle/generate.js +36 -28
- package/dist/adapters/drizzle/generate.js.map +1 -1
- package/dist/adapters/generic-sql/driver-config.d.ts +74 -0
- package/dist/adapters/generic-sql/driver-config.d.ts.map +1 -0
- package/dist/adapters/generic-sql/driver-config.js +94 -0
- package/dist/adapters/generic-sql/driver-config.js.map +1 -0
- package/dist/adapters/generic-sql/generic-sql-adapter.d.ts +43 -0
- package/dist/adapters/generic-sql/generic-sql-adapter.d.ts.map +1 -0
- package/dist/adapters/generic-sql/generic-sql-adapter.js +87 -0
- package/dist/adapters/generic-sql/generic-sql-adapter.js.map +1 -0
- package/dist/adapters/generic-sql/generic-sql-uow-executor.js +67 -0
- package/dist/adapters/generic-sql/generic-sql-uow-executor.js.map +1 -0
- package/dist/adapters/generic-sql/migration/cold-kysely.js +33 -0
- package/dist/adapters/generic-sql/migration/cold-kysely.js.map +1 -0
- package/dist/adapters/generic-sql/migration/dialect/mysql.js +60 -0
- package/dist/adapters/generic-sql/migration/dialect/mysql.js.map +1 -0
- package/dist/adapters/generic-sql/migration/dialect/postgres.js +59 -0
- package/dist/adapters/generic-sql/migration/dialect/postgres.js.map +1 -0
- package/dist/adapters/generic-sql/migration/dialect/sqlite.js +96 -0
- package/dist/adapters/generic-sql/migration/dialect/sqlite.js.map +1 -0
- package/dist/adapters/generic-sql/migration/executor.d.ts +15 -0
- package/dist/adapters/generic-sql/migration/executor.d.ts.map +1 -0
- package/dist/adapters/generic-sql/migration/executor.js +18 -0
- package/dist/adapters/generic-sql/migration/executor.js.map +1 -0
- package/dist/adapters/generic-sql/migration/prepared-migrations.d.ts +66 -0
- package/dist/adapters/generic-sql/migration/prepared-migrations.d.ts.map +1 -0
- package/dist/adapters/generic-sql/migration/prepared-migrations.js +68 -0
- package/dist/adapters/generic-sql/migration/prepared-migrations.js.map +1 -0
- package/dist/adapters/generic-sql/migration/sql-generator.js +212 -0
- package/dist/adapters/generic-sql/migration/sql-generator.js.map +1 -0
- package/dist/adapters/generic-sql/query/create-sql-query-compiler.js +32 -0
- package/dist/adapters/generic-sql/query/create-sql-query-compiler.js.map +1 -0
- package/dist/adapters/generic-sql/query/cursor-utils.js +37 -0
- package/dist/adapters/generic-sql/query/cursor-utils.js.map +1 -0
- package/dist/adapters/generic-sql/query/dialect/mysql.js +33 -0
- package/dist/adapters/generic-sql/query/dialect/mysql.js.map +1 -0
- package/dist/adapters/generic-sql/query/dialect/postgres.js +32 -0
- package/dist/adapters/generic-sql/query/dialect/postgres.js.map +1 -0
- package/dist/adapters/generic-sql/query/dialect/sqlite.js +32 -0
- package/dist/adapters/generic-sql/query/dialect/sqlite.js.map +1 -0
- package/dist/adapters/generic-sql/query/generic-sql-uow-operation-compiler.js +152 -0
- package/dist/adapters/generic-sql/query/generic-sql-uow-operation-compiler.js.map +1 -0
- package/dist/adapters/generic-sql/query/select-builder.js +69 -0
- package/dist/adapters/generic-sql/query/select-builder.js.map +1 -0
- package/dist/adapters/generic-sql/query/sql-query-compiler.js +145 -0
- package/dist/adapters/generic-sql/query/sql-query-compiler.js.map +1 -0
- package/dist/adapters/generic-sql/query/where-builder.js +129 -0
- package/dist/adapters/generic-sql/query/where-builder.js.map +1 -0
- package/dist/adapters/generic-sql/result-interpreter.js +74 -0
- package/dist/adapters/generic-sql/result-interpreter.js.map +1 -0
- package/dist/adapters/generic-sql/uow-decoder.js +105 -0
- package/dist/adapters/generic-sql/uow-decoder.js.map +1 -0
- package/dist/adapters/generic-sql/uow-encoder.js +93 -0
- package/dist/adapters/generic-sql/uow-encoder.js.map +1 -0
- package/dist/adapters/kysely/kysely-adapter.d.ts +5 -18
- package/dist/adapters/kysely/kysely-adapter.d.ts.map +1 -1
- package/dist/adapters/kysely/kysely-adapter.js +6 -165
- package/dist/adapters/kysely/kysely-adapter.js.map +1 -1
- package/dist/adapters/{drizzle/drizzle-query.js → shared/from-unit-of-work-compiler.js} +47 -61
- package/dist/adapters/shared/from-unit-of-work-compiler.js.map +1 -0
- package/dist/adapters/{drizzle/shared.d.ts → shared/table-name-mapper.d.ts} +2 -4
- package/dist/adapters/shared/table-name-mapper.d.ts.map +1 -0
- package/dist/adapters/shared/table-name-mapper.js +43 -0
- package/dist/adapters/shared/table-name-mapper.js.map +1 -0
- package/dist/adapters/shared/uow-operation-compiler.js +105 -0
- package/dist/adapters/shared/uow-operation-compiler.js.map +1 -0
- package/dist/db-fragment-definition-builder.d.ts +53 -19
- package/dist/db-fragment-definition-builder.d.ts.map +1 -1
- package/dist/db-fragment-definition-builder.js +89 -19
- package/dist/db-fragment-definition-builder.js.map +1 -1
- package/dist/fragments/internal-fragment.d.ts +39 -5
- package/dist/fragments/internal-fragment.d.ts.map +1 -1
- package/dist/fragments/internal-fragment.js +82 -10
- package/dist/fragments/internal-fragment.js.map +1 -1
- package/dist/hooks/hooks.d.ts +51 -0
- package/dist/hooks/hooks.d.ts.map +1 -0
- package/dist/hooks/hooks.js +88 -0
- package/dist/hooks/hooks.js.map +1 -0
- package/dist/migration-engine/generation-engine.d.ts +0 -2
- package/dist/migration-engine/generation-engine.d.ts.map +1 -1
- package/dist/migration-engine/generation-engine.js +23 -61
- package/dist/migration-engine/generation-engine.js.map +1 -1
- package/dist/mod.d.ts +34 -10
- package/dist/mod.d.ts.map +1 -1
- package/dist/mod.js +47 -16
- package/dist/mod.js.map +1 -1
- package/dist/node_modules/.pnpm/{rou3@0.7.8 → rou3@0.7.10}/node_modules/rou3/dist/index.js +1 -1
- package/dist/node_modules/.pnpm/rou3@0.7.10/node_modules/rou3/dist/index.js.map +1 -0
- package/dist/packages/fragno/dist/api/fragment-instantiator.js +69 -31
- package/dist/packages/fragno/dist/api/fragment-instantiator.js.map +1 -1
- package/dist/query/column-defaults.js +27 -0
- package/dist/query/column-defaults.js.map +1 -0
- package/dist/query/cursor.d.ts +4 -4
- package/dist/query/cursor.d.ts.map +1 -1
- package/dist/query/cursor.js +8 -6
- package/dist/query/cursor.js.map +1 -1
- package/dist/query/orm/orm.d.ts +1 -1
- package/dist/query/orm/orm.js.map +1 -1
- package/dist/query/serialize/create-sql-serializer.js +30 -0
- package/dist/query/serialize/create-sql-serializer.js.map +1 -0
- package/dist/query/serialize/dialect/mysql-serializer.js +87 -0
- package/dist/query/serialize/dialect/mysql-serializer.js.map +1 -0
- package/dist/query/serialize/dialect/postgres-serializer.js +80 -0
- package/dist/query/serialize/dialect/postgres-serializer.js.map +1 -0
- package/dist/query/serialize/dialect/sqlite-serializer.js +93 -0
- package/dist/query/serialize/dialect/sqlite-serializer.js.map +1 -0
- package/dist/query/serialize/sql-serializer.js +67 -0
- package/dist/query/serialize/sql-serializer.js.map +1 -0
- package/dist/query/{query.d.ts → simple-query-interface.d.ts} +5 -5
- package/dist/query/simple-query-interface.d.ts.map +1 -0
- package/dist/query/{execute-unit-of-work.d.ts → unit-of-work/execute-unit-of-work.d.ts} +13 -3
- package/dist/query/unit-of-work/execute-unit-of-work.d.ts.map +1 -0
- package/dist/query/{execute-unit-of-work.js → unit-of-work/execute-unit-of-work.js} +17 -4
- package/dist/query/unit-of-work/execute-unit-of-work.js.map +1 -0
- package/dist/query/{retry-policy.d.ts → unit-of-work/retry-policy.d.ts} +1 -1
- package/dist/query/unit-of-work/retry-policy.d.ts.map +1 -0
- package/dist/query/{retry-policy.js → unit-of-work/retry-policy.js} +1 -1
- package/dist/query/unit-of-work/retry-policy.js.map +1 -0
- package/dist/query/{unit-of-work.d.ts → unit-of-work/unit-of-work.d.ts} +51 -18
- package/dist/query/unit-of-work/unit-of-work.d.ts.map +1 -0
- package/dist/query/{unit-of-work.js → unit-of-work/unit-of-work.js} +58 -11
- package/dist/query/unit-of-work/unit-of-work.js.map +1 -0
- package/dist/query/value-decoding.js +71 -0
- package/dist/query/value-decoding.js.map +1 -0
- package/dist/query/value-encoding.js +124 -0
- package/dist/query/value-encoding.js.map +1 -0
- package/dist/schema/create.d.ts +3 -0
- package/dist/schema/create.d.ts.map +1 -1
- package/dist/schema/create.js +4 -0
- package/dist/schema/create.js.map +1 -1
- package/dist/schema/type-conversion/create-sql-type-mapper.js +29 -0
- package/dist/schema/type-conversion/create-sql-type-mapper.js.map +1 -0
- package/dist/schema/type-conversion/dialect/mysql.js +57 -0
- package/dist/schema/type-conversion/dialect/mysql.js.map +1 -0
- package/dist/schema/type-conversion/dialect/postgres.js +56 -0
- package/dist/schema/type-conversion/dialect/postgres.js.map +1 -0
- package/dist/schema/type-conversion/dialect/sqlite.js +52 -0
- package/dist/schema/type-conversion/dialect/sqlite.js.map +1 -0
- package/dist/schema/type-conversion/type-mapping.js +63 -0
- package/dist/schema/type-conversion/type-mapping.js.map +1 -0
- package/dist/sql-driver/connection/connection-provider.d.ts +13 -0
- package/dist/sql-driver/connection/connection-provider.d.ts.map +1 -0
- package/dist/sql-driver/connection/connection-provider.js +19 -0
- package/dist/sql-driver/connection/connection-provider.js.map +1 -0
- package/dist/sql-driver/connection/single-connection-provider.js +23 -0
- package/dist/sql-driver/connection/single-connection-provider.js.map +1 -0
- package/dist/sql-driver/dialect-adapter/dialect-adapter.d.ts +7 -0
- package/dist/sql-driver/dialect-adapter/dialect-adapter.d.ts.map +1 -0
- package/dist/sql-driver/dialects/dialects.d.ts +2 -0
- package/dist/sql-driver/dialects/dialects.js +3 -0
- package/dist/sql-driver/dialects/durable-object-dialect.d.ts +72 -0
- package/dist/sql-driver/dialects/durable-object-dialect.d.ts.map +1 -0
- package/dist/sql-driver/dialects/durable-object-dialect.js +130 -0
- package/dist/sql-driver/dialects/durable-object-dialect.js.map +1 -0
- package/dist/sql-driver/driver/runtime-driver.d.ts +23 -0
- package/dist/sql-driver/driver/runtime-driver.d.ts.map +1 -0
- package/dist/sql-driver/driver/runtime-driver.js +56 -0
- package/dist/sql-driver/driver/runtime-driver.js.map +1 -0
- package/dist/sql-driver/query-executor/default-query-executor.js +26 -0
- package/dist/sql-driver/query-executor/default-query-executor.js.map +1 -0
- package/dist/sql-driver/query-executor/plugin.d.ts +17 -0
- package/dist/sql-driver/query-executor/plugin.d.ts.map +1 -0
- package/dist/sql-driver/query-executor/query-executor-base.js +25 -0
- package/dist/sql-driver/query-executor/query-executor-base.js.map +1 -0
- package/dist/sql-driver/query-executor/query-executor.d.ts +36 -0
- package/dist/sql-driver/query-executor/query-executor.d.ts.map +1 -0
- package/dist/sql-driver/sql-driver-adapter.d.ts +29 -0
- package/dist/sql-driver/sql-driver-adapter.d.ts.map +1 -0
- package/dist/sql-driver/sql-driver-adapter.js +68 -0
- package/dist/sql-driver/sql-driver-adapter.js.map +1 -0
- package/dist/sql-driver/sql-driver.d.ts +38 -0
- package/dist/sql-driver/sql-driver.d.ts.map +1 -0
- package/dist/sql-driver/sql-driver.js +1 -0
- package/dist/sql-driver/sql.js +50 -0
- package/dist/sql-driver/sql.js.map +1 -0
- package/dist/with-database.d.ts +6 -2
- package/dist/with-database.d.ts.map +1 -1
- package/dist/with-database.js +1 -1
- package/dist/with-database.js.map +1 -1
- package/package.json +37 -10
- package/src/adapters/adapters.ts +8 -5
- package/src/adapters/drizzle/drizzle-adapter-pglite.test.ts +60 -169
- package/src/adapters/drizzle/{drizzle-adapter-sqlite.test.ts → drizzle-adapter-sqlite3.test.ts} +31 -55
- package/src/adapters/drizzle/drizzle-adapter.ts +15 -107
- package/src/adapters/drizzle/generate.test.ts +2 -2
- package/src/adapters/drizzle/generate.ts +78 -34
- package/src/adapters/drizzle/migrate-drizzle.test.ts +19 -0
- package/src/adapters/drizzle/shared.ts +0 -34
- package/src/adapters/drizzle/test-utils.ts +3 -3
- package/src/adapters/generic-sql/README.md +14 -0
- package/src/adapters/generic-sql/driver-config.ts +144 -0
- package/src/adapters/generic-sql/generic-sql-adapter.test.ts +50 -0
- package/src/adapters/generic-sql/generic-sql-adapter.ts +146 -0
- package/src/adapters/generic-sql/generic-sql-uow-executor.ts +130 -0
- package/src/adapters/generic-sql/migration/cold-kysely.ts +55 -0
- package/src/adapters/{kysely/migration/execute-mysql.test.ts → generic-sql/migration/dialect/mysql.test.ts} +342 -484
- package/src/adapters/generic-sql/migration/dialect/mysql.ts +104 -0
- package/src/adapters/generic-sql/migration/dialect/postgres.test.ts +1008 -0
- package/src/adapters/generic-sql/migration/dialect/postgres.ts +113 -0
- package/src/adapters/{kysely/migration/execute-sqlite.test.ts → generic-sql/migration/dialect/sqlite.test.ts} +307 -510
- package/src/adapters/generic-sql/migration/dialect/sqlite.ts +189 -0
- package/src/adapters/generic-sql/migration/executor.ts +33 -0
- package/src/adapters/generic-sql/migration/prepared-migrations.test.ts +661 -0
- package/src/adapters/generic-sql/migration/prepared-migrations.ts +214 -0
- package/src/adapters/generic-sql/migration/sql-generator.ts +413 -0
- package/src/adapters/generic-sql/query/create-sql-query-compiler.ts +36 -0
- package/src/adapters/generic-sql/query/cursor-utils.ts +56 -0
- package/src/adapters/generic-sql/query/dialect/mysql.ts +34 -0
- package/src/adapters/generic-sql/query/dialect/postgres.ts +32 -0
- package/src/adapters/generic-sql/query/dialect/sqlite.ts +32 -0
- package/src/adapters/generic-sql/query/generic-sql-uow-operation-compiler.test.ts +1568 -0
- package/src/adapters/generic-sql/query/generic-sql-uow-operation-compiler.ts +314 -0
- package/src/adapters/generic-sql/query/select-builder.test.ts +256 -0
- package/src/adapters/generic-sql/query/select-builder.ts +137 -0
- package/src/adapters/generic-sql/query/sql-query-compiler.test.ts +195 -0
- package/src/adapters/generic-sql/query/sql-query-compiler.ts +367 -0
- package/src/adapters/generic-sql/query/where-builder.test.ts +744 -0
- package/src/adapters/generic-sql/query/where-builder.ts +211 -0
- package/src/adapters/generic-sql/result-interpreter.ts +102 -0
- package/src/adapters/generic-sql/test/generic-drizzle-adapter-sqlite3.test.ts +899 -0
- package/src/adapters/generic-sql/uow-decoder.test.ts +399 -0
- package/src/adapters/generic-sql/uow-decoder.ts +152 -0
- package/src/adapters/generic-sql/uow-encoder.test.ts +183 -0
- package/src/adapters/generic-sql/uow-encoder.ts +131 -0
- package/src/adapters/kysely/kysely-adapter-pglite.test.ts +26 -76
- package/src/adapters/kysely/{kysely-adapter-sqlite.test.ts → kysely-adapter-sqlocal.test.ts} +76 -17
- package/src/adapters/kysely/kysely-adapter.ts +10 -250
- package/src/adapters/{drizzle/drizzle-query.ts → shared/from-unit-of-work-compiler.ts} +110 -104
- package/src/adapters/shared/table-name-mapper.ts +50 -0
- package/src/adapters/shared/uow-operation-compiler.ts +211 -0
- package/src/db-fragment-definition-builder.test.ts +2 -2
- package/src/db-fragment-definition-builder.ts +281 -50
- package/src/db-fragment-instantiator.test.ts +78 -2
- package/src/db-fragment-integration.test.ts +14 -16
- package/src/fragments/internal-fragment.test.ts +434 -45
- package/src/fragments/internal-fragment.ts +184 -20
- package/src/hooks/hooks.test.ts +575 -0
- package/src/hooks/hooks.ts +179 -0
- package/src/migration-engine/generation-engine.test.ts +44 -54
- package/src/migration-engine/generation-engine.ts +48 -94
- package/src/mod.ts +117 -29
- package/src/query/column-defaults.ts +49 -0
- package/src/query/cursor.test.ts +31 -6
- package/src/query/cursor.ts +11 -7
- package/src/query/orm/orm.ts +1 -1
- package/src/query/query-type.test.ts +9 -9
- package/src/query/serialize/create-sql-serializer.ts +34 -0
- package/src/query/serialize/dialect/mysql-serializer.ts +142 -0
- package/src/query/serialize/dialect/postgres-serializer.ts +129 -0
- package/src/query/serialize/dialect/sqlite-serializer.test.ts +251 -0
- package/src/query/serialize/dialect/sqlite-serializer.ts +156 -0
- package/src/query/serialize/sql-serializer.ts +143 -0
- package/src/query/{query.ts → simple-query-interface.ts} +2 -2
- package/src/query/{execute-unit-of-work.test.ts → unit-of-work/execute-unit-of-work.test.ts} +16 -16
- package/src/query/{execute-unit-of-work.ts → unit-of-work/execute-unit-of-work.ts} +49 -8
- package/src/query/{unit-of-work-coordinator.test.ts → unit-of-work/unit-of-work-coordinator.test.ts} +41 -43
- package/src/query/{unit-of-work-types.test.ts → unit-of-work/unit-of-work-types.test.ts} +5 -3
- package/src/query/{unit-of-work.test.ts → unit-of-work/unit-of-work.test.ts} +100 -9
- package/src/query/{unit-of-work.ts → unit-of-work/unit-of-work.ts} +135 -32
- package/src/query/{result-transform.test.ts → value-decoding.test.ts} +45 -427
- package/src/query/value-decoding.ts +113 -0
- package/src/query/value-encoding.test.ts +390 -0
- package/src/query/value-encoding.ts +168 -0
- package/src/schema/create.test.ts +5 -1
- package/src/schema/create.ts +5 -0
- package/src/schema/serialize.test.ts +165 -407
- package/src/schema/type-conversion/create-sql-type-mapper.ts +28 -0
- package/src/schema/type-conversion/dialect/mysql.ts +64 -0
- package/src/schema/type-conversion/dialect/postgres.ts +62 -0
- package/src/schema/type-conversion/dialect/sqlite.ts +63 -0
- package/src/schema/type-conversion/type-mapping.test.ts +137 -0
- package/src/schema/type-conversion/type-mapping.ts +153 -0
- package/src/shared/connection-pool.ts +5 -5
- package/src/sql-driver/better-sqlite3.test.ts +126 -0
- package/src/sql-driver/connection/connection-provider.ts +27 -0
- package/src/sql-driver/connection/single-connection-provider.ts +42 -0
- package/src/sql-driver/dialect-adapter/dialect-adapter.ts +9 -0
- package/src/sql-driver/dialect-adapter/sqlite-dialect-adapter.ts +7 -0
- package/src/sql-driver/dialects/dialects.ts +1 -0
- package/src/sql-driver/dialects/durable-object-dialect.ts +260 -0
- package/src/sql-driver/driver/runtime-driver.ts +91 -0
- package/src/sql-driver/query-executor/default-query-executor.ts +38 -0
- package/src/sql-driver/query-executor/plugin.ts +22 -0
- package/src/sql-driver/query-executor/query-executor-base.ts +53 -0
- package/src/sql-driver/query-executor/query-executor.ts +44 -0
- package/src/sql-driver/sql-driver-adapter.ts +96 -0
- package/src/sql-driver/sql-driver.ts +53 -0
- package/src/sql-driver/sql.ts +57 -0
- package/src/sql-driver/sqlocal.test.ts +117 -0
- package/src/with-database.ts +35 -23
- package/tsdown.config.ts +7 -2
- package/dist/adapters/drizzle/drizzle-connection-pool.js +0 -40
- package/dist/adapters/drizzle/drizzle-connection-pool.js.map +0 -1
- package/dist/adapters/drizzle/drizzle-query.d.ts +0 -23
- package/dist/adapters/drizzle/drizzle-query.d.ts.map +0 -1
- package/dist/adapters/drizzle/drizzle-query.js.map +0 -1
- package/dist/adapters/drizzle/drizzle-uow-compiler.d.ts +0 -10
- package/dist/adapters/drizzle/drizzle-uow-compiler.d.ts.map +0 -1
- package/dist/adapters/drizzle/drizzle-uow-compiler.js +0 -334
- package/dist/adapters/drizzle/drizzle-uow-compiler.js.map +0 -1
- package/dist/adapters/drizzle/drizzle-uow-decoder.js +0 -123
- package/dist/adapters/drizzle/drizzle-uow-decoder.js.map +0 -1
- package/dist/adapters/drizzle/drizzle-uow-executor.js +0 -160
- package/dist/adapters/drizzle/drizzle-uow-executor.js.map +0 -1
- package/dist/adapters/drizzle/join-column-utils.js +0 -28
- package/dist/adapters/drizzle/join-column-utils.js.map +0 -1
- package/dist/adapters/drizzle/shared.d.ts.map +0 -1
- package/dist/adapters/drizzle/shared.js +0 -35
- package/dist/adapters/drizzle/shared.js.map +0 -1
- package/dist/adapters/kysely/kysely-connection-pool.js +0 -41
- package/dist/adapters/kysely/kysely-connection-pool.js.map +0 -1
- package/dist/adapters/kysely/kysely-query-builder.js +0 -321
- package/dist/adapters/kysely/kysely-query-builder.js.map +0 -1
- package/dist/adapters/kysely/kysely-query-compiler.js +0 -67
- package/dist/adapters/kysely/kysely-query-compiler.js.map +0 -1
- package/dist/adapters/kysely/kysely-query.d.ts +0 -23
- package/dist/adapters/kysely/kysely-query.d.ts.map +0 -1
- package/dist/adapters/kysely/kysely-query.js +0 -230
- package/dist/adapters/kysely/kysely-query.js.map +0 -1
- package/dist/adapters/kysely/kysely-shared.d.ts +0 -14
- package/dist/adapters/kysely/kysely-shared.d.ts.map +0 -1
- package/dist/adapters/kysely/kysely-shared.js +0 -33
- package/dist/adapters/kysely/kysely-shared.js.map +0 -1
- package/dist/adapters/kysely/kysely-uow-compiler.js +0 -193
- package/dist/adapters/kysely/kysely-uow-compiler.js.map +0 -1
- package/dist/adapters/kysely/kysely-uow-executor.js +0 -93
- package/dist/adapters/kysely/kysely-uow-executor.js.map +0 -1
- package/dist/adapters/kysely/migration/execute-base.js +0 -128
- package/dist/adapters/kysely/migration/execute-base.js.map +0 -1
- package/dist/adapters/kysely/migration/execute-factory.js +0 -34
- package/dist/adapters/kysely/migration/execute-factory.js.map +0 -1
- package/dist/adapters/kysely/migration/execute-mssql.js +0 -112
- package/dist/adapters/kysely/migration/execute-mssql.js.map +0 -1
- package/dist/adapters/kysely/migration/execute-mysql.js +0 -93
- package/dist/adapters/kysely/migration/execute-mysql.js.map +0 -1
- package/dist/adapters/kysely/migration/execute-postgres.js +0 -104
- package/dist/adapters/kysely/migration/execute-postgres.js.map +0 -1
- package/dist/adapters/kysely/migration/execute-sqlite.js +0 -123
- package/dist/adapters/kysely/migration/execute-sqlite.js.map +0 -1
- package/dist/adapters/kysely/migration/execute.js +0 -34
- package/dist/adapters/kysely/migration/execute.js.map +0 -1
- package/dist/migration-engine/create.d.ts +0 -37
- package/dist/migration-engine/create.d.ts.map +0 -1
- package/dist/migration-engine/create.js +0 -58
- package/dist/migration-engine/create.js.map +0 -1
- package/dist/migration-engine/shared.d.ts +0 -112
- package/dist/migration-engine/shared.d.ts.map +0 -1
- package/dist/node_modules/.pnpm/rou3@0.7.8/node_modules/rou3/dist/index.js.map +0 -1
- package/dist/query/execute-unit-of-work.d.ts.map +0 -1
- package/dist/query/execute-unit-of-work.js.map +0 -1
- package/dist/query/query.d.ts.map +0 -1
- package/dist/query/result-transform.js +0 -170
- package/dist/query/result-transform.js.map +0 -1
- package/dist/query/retry-policy.d.ts.map +0 -1
- package/dist/query/retry-policy.js.map +0 -1
- package/dist/query/unit-of-work.d.ts.map +0 -1
- package/dist/query/unit-of-work.js.map +0 -1
- package/dist/schema/serialize.js +0 -111
- package/dist/schema/serialize.js.map +0 -1
- package/src/adapters/drizzle/drizzle-adapter.test.ts +0 -122
- package/src/adapters/drizzle/drizzle-connection-pool.ts +0 -66
- package/src/adapters/drizzle/drizzle-query.test.ts +0 -499
- package/src/adapters/drizzle/drizzle-uow-compiler-mysql.test.ts +0 -1442
- package/src/adapters/drizzle/drizzle-uow-compiler-sqlite.test.ts +0 -1414
- package/src/adapters/drizzle/drizzle-uow-compiler.test.ts +0 -1400
- package/src/adapters/drizzle/drizzle-uow-compiler.ts +0 -677
- package/src/adapters/drizzle/drizzle-uow-decoder.ts +0 -228
- package/src/adapters/drizzle/drizzle-uow-executor.ts +0 -309
- package/src/adapters/drizzle/join-column-utils.test.ts +0 -79
- package/src/adapters/drizzle/join-column-utils.ts +0 -39
- package/src/adapters/kysely/kysely-connection-pool.ts +0 -70
- package/src/adapters/kysely/kysely-query-builder.test.ts +0 -1344
- package/src/adapters/kysely/kysely-query-builder.ts +0 -666
- package/src/adapters/kysely/kysely-query-compiler.ts +0 -127
- package/src/adapters/kysely/kysely-query.test.ts +0 -498
- package/src/adapters/kysely/kysely-query.ts +0 -399
- package/src/adapters/kysely/kysely-shared.ts +0 -57
- package/src/adapters/kysely/kysely-uow-compiler.test.ts +0 -986
- package/src/adapters/kysely/kysely-uow-compiler.ts +0 -350
- package/src/adapters/kysely/kysely-uow-executor.ts +0 -164
- package/src/adapters/kysely/kysely-uow-joins.test.ts +0 -794
- package/src/adapters/kysely/migration/execute-base.ts +0 -256
- package/src/adapters/kysely/migration/execute-factory.ts +0 -53
- package/src/adapters/kysely/migration/execute-mssql.ts +0 -250
- package/src/adapters/kysely/migration/execute-mysql.ts +0 -211
- package/src/adapters/kysely/migration/execute-postgres.test.ts +0 -2657
- package/src/adapters/kysely/migration/execute-postgres.ts +0 -234
- package/src/adapters/kysely/migration/execute-sqlite.ts +0 -247
- package/src/adapters/kysely/migration/execute.ts +0 -50
- package/src/adapters/kysely/migration/kysely-migrator.test.ts +0 -261
- package/src/query/result-transform.ts +0 -274
- package/src/schema/serialize.ts +0 -407
- /package/dist/query/{query.js → simple-query-interface.js} +0 -0
- /package/src/query/{retry-policy.test.ts → unit-of-work/retry-policy.test.ts} +0 -0
- /package/src/query/{retry-policy.ts → unit-of-work/retry-policy.ts} +0 -0
package/README.md
CHANGED
|
@@ -1,13 +1,128 @@
|
|
|
1
1
|
# @fragno-dev/db
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Optional, ORM-agnostic database layer for Fragno libraries.
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
|
|
5
|
+
Library authors define a type-safe schema; users plug in their existing Kysely or Drizzle setup so
|
|
6
|
+
data is written directly into their database.
|
|
7
7
|
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
- **License:** MIT
|
|
11
|
-
- **Source:** https://github.com/fuma-nama/fumadb
|
|
8
|
+
Full docs live at
|
|
9
|
+
[Database integration for library authors](https://fragno.dev/docs/fragno/for-library-authors/database-integration/overview).
|
|
12
10
|
|
|
13
|
-
|
|
11
|
+
## Who is this for?
|
|
12
|
+
|
|
13
|
+
- **Library authors** who want to ship a full-stack library that needs persistent storage, without
|
|
14
|
+
owning the user's database.
|
|
15
|
+
|
|
16
|
+
Your library defines the schema and queries; your users provide the database adapter.
|
|
17
|
+
|
|
18
|
+
## Quick start
|
|
19
|
+
|
|
20
|
+
### 1. Install
|
|
21
|
+
|
|
22
|
+
```bash
|
|
23
|
+
npm install @fragno-dev/db @fragno-dev/core
|
|
24
|
+
# or
|
|
25
|
+
pnpm add @fragno-dev/db @fragno-dev/core
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
And make sure to install the CLI to perform migrations / schema generation:
|
|
29
|
+
|
|
30
|
+
```bash
|
|
31
|
+
npm install --save-dev @fragno-dev/cli
|
|
32
|
+
# or
|
|
33
|
+
pnpm add --dev @fragno-dev/cli
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
### 2. Define a schema
|
|
37
|
+
|
|
38
|
+
```ts
|
|
39
|
+
// schema.ts
|
|
40
|
+
import { schema, idColumn, column } from "@fragno-dev/db/schema";
|
|
41
|
+
|
|
42
|
+
export const commentSchema = schema((s) => {
|
|
43
|
+
return s
|
|
44
|
+
.addTable("comment", (t) => {
|
|
45
|
+
return t
|
|
46
|
+
.addColumn("id", idColumn())
|
|
47
|
+
.addColumn("content", column("string"))
|
|
48
|
+
.addColumn("userId", column("string"))
|
|
49
|
+
.addColumn("postId", column("string"));
|
|
50
|
+
})
|
|
51
|
+
.addTable("user", (t) => {
|
|
52
|
+
return t.addColumn("id", idColumn()).addColumn("name", column("string"));
|
|
53
|
+
});
|
|
54
|
+
});
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
### 3. Attach it to your library
|
|
58
|
+
|
|
59
|
+
```ts
|
|
60
|
+
// index.ts
|
|
61
|
+
import { defineFragment, instantiate } from "@fragno-dev/core";
|
|
62
|
+
import { withDatabase, type FragnoPublicConfigWithDatabase } from "@fragno-dev/db";
|
|
63
|
+
import { commentSchema } from "./schema";
|
|
64
|
+
|
|
65
|
+
export interface CommentLibraryConfig {
|
|
66
|
+
maxCommentsPerPost?: number;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
const commentLibraryDef = defineFragment<CommentLibraryConfig>("comment-library")
|
|
70
|
+
// --> use .extend to add the database layer <--
|
|
71
|
+
.extend(withDatabase(commentSchema))
|
|
72
|
+
.providesBaseService(({ db }) => {
|
|
73
|
+
return {
|
|
74
|
+
createComment: async (data: { content: string; userId: string; postId: string }) => {
|
|
75
|
+
const id = await db.create("comment", data);
|
|
76
|
+
return { id: id.toJSON(), ...data };
|
|
77
|
+
},
|
|
78
|
+
};
|
|
79
|
+
})
|
|
80
|
+
.build();
|
|
81
|
+
|
|
82
|
+
export function createCommentLibrary(
|
|
83
|
+
config: CommentLibraryConfig = {},
|
|
84
|
+
options: FragnoPublicConfigWithDatabase,
|
|
85
|
+
) {
|
|
86
|
+
return instantiate(commentLibraryDef)
|
|
87
|
+
.withConfig(config)
|
|
88
|
+
.withRoutes([])
|
|
89
|
+
.withOptions(options)
|
|
90
|
+
.build();
|
|
91
|
+
}
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
Your users pass their own database adapter (Kysely or Drizzle) via `options`.
|
|
95
|
+
|
|
96
|
+
## Key features
|
|
97
|
+
|
|
98
|
+
- **Schema definition**: define tables, columns, indexes, and relations with a fluent, typed API.
|
|
99
|
+
- **Type-safe ORM**: full TypeScript inference for queries and results.
|
|
100
|
+
- **User-owned database**: your library never owns the database; users provide the adapter.
|
|
101
|
+
- **ORM agnostic**: works with Kysely or Drizzle (and more to come).
|
|
102
|
+
- **Namespaced tables**: avoids conflicts with user tables.
|
|
103
|
+
|
|
104
|
+
## ORM and database support
|
|
105
|
+
|
|
106
|
+
`@fragno-dev/db` works with:
|
|
107
|
+
|
|
108
|
+
- **Kysely**
|
|
109
|
+
- **Drizzle**
|
|
110
|
+
|
|
111
|
+
Backed by Postgres and SQLite, including PGLite and Cloudflare Durable Objects.
|
|
112
|
+
|
|
113
|
+
## Docs and examples
|
|
114
|
+
|
|
115
|
+
- **Overview**:
|
|
116
|
+
[Database integration for library authors](https://fragno.dev/docs/fragno/for-library-authors/database-integration/overview)
|
|
117
|
+
- **Schemas**:
|
|
118
|
+
[Defining schemas](https://fragno.dev/docs/fragno/for-library-authors/database-integration/defining-schemas)
|
|
119
|
+
- **Querying**:
|
|
120
|
+
[Querying API](https://fragno.dev/docs/fragno/for-library-authors/database-integration/querying)
|
|
121
|
+
- **Example library**:
|
|
122
|
+
[`example-fragments/fragno-db-library`](https://github.com/rejot-dev/fragno/tree/main/example-fragments/fragno-db-library)
|
|
123
|
+
|
|
124
|
+
## Attribution
|
|
125
|
+
|
|
126
|
+
**Important:** A portion of this package's codebase is adopted from
|
|
127
|
+
[fumadb](https://github.com/fuma-nama/fumadb), which is licensed under the MIT License. We are
|
|
128
|
+
grateful to Fuma Nama (and contributors) for their excellent work on the original implementation.
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { AnySchema } from "../schema/create.js";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import { AbstractQuery } from "../query/query.js";
|
|
2
|
+
import { IUnitOfWork } from "../query/unit-of-work/unit-of-work.js";
|
|
3
|
+
import { SimpleQueryInterface } from "../query/simple-query-interface.js";
|
|
5
4
|
import { SchemaGenerator } from "../schema-generator/schema-generator.js";
|
|
5
|
+
import { PreparedMigrations } from "./generic-sql/migration/prepared-migrations.js";
|
|
6
6
|
import { RequestContextStorage } from "@fragno-dev/core/internal/request-context-storage";
|
|
7
7
|
|
|
8
8
|
//#region src/adapters/adapters.d.ts
|
|
@@ -34,8 +34,8 @@ interface DatabaseAdapter<TUOWConfig = void> {
|
|
|
34
34
|
* Get current schema version, undefined if not initialized.
|
|
35
35
|
*/
|
|
36
36
|
getSchemaVersion(namespace: string): Promise<string | undefined>;
|
|
37
|
-
createQueryEngine: <const T extends AnySchema>(schema: T, namespace: string) =>
|
|
38
|
-
|
|
37
|
+
createQueryEngine: <const T extends AnySchema>(schema: T, namespace: string) => SimpleQueryInterface<T, TUOWConfig>;
|
|
38
|
+
prepareMigrations?: <const T extends AnySchema>(schema: T, namespace: string) => PreparedMigrations;
|
|
39
39
|
/**
|
|
40
40
|
* Generate a combined schema file from one or more fragments.
|
|
41
41
|
* If not implemented, schema generation is not supported for this adapter.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"adapters.d.ts","names":[],"sources":["../../src/adapters/adapters.ts"],"sourcesContent":[],"mappings":";;;;;;;;cAOa;cACA;AADb;AACA;AAMA;AAOA;AAKiB,KAZL,sBAAA,GAYoB;EAC7B,GAAA,EAZI,WAYJ;CACA;;;;AAamC,UApBrB,eAAA,CAoBqB;EAC1B,UAAA,CAAA,WAAA,EAAA,MAAA,CAAA,EAAA,MAAA;
|
|
1
|
+
{"version":3,"file":"adapters.d.ts","names":[],"sources":["../../src/adapters/adapters.ts"],"sourcesContent":[],"mappings":";;;;;;;;cAOa;cACA;AADb;AACA;AAMA;AAOA;AAKiB,KAZL,sBAAA,GAYoB;EAC7B,GAAA,EAZI,WAYJ;CACA;;;;AAamC,UApBrB,eAAA,CAoBqB;EAC1B,UAAA,CAAA,WAAA,EAAA,MAAA,CAAA,EAAA,MAAA;EAEgB,SAAA,CAAA,YAAA,EAAA,MAAA,CAAA,EAAA,MAAA;;AAArB,UAlBU,eAkBV,CAAA,aAAA,IAAA,CAAA,CAAA;EAEgC,CAnBpC,mCAAA,CAmBoC,EAAA,MAAA;EAC3B,CAnBT,sCAAA,CAmBS,EAAA,MAAA;EAEL;;;;EAiBsB,SAAA,cAAA,EAhCF,qBAgCE,CAhCoB,sBAgCpB,CAAA;EAEd;;;uCA7BwB;sCAED,mBAC1B,yBAEL,qBAAqB,GAAG;uCAEQ,mBAC3B,yBAEL;;;;;;YAOkB;;;;QAElB;;;;;gDAMyC;6BAEnB;eAEd"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"adapters.js","names":[],"sources":["../../src/adapters/adapters.ts"],"sourcesContent":["import type {
|
|
1
|
+
{"version":3,"file":"adapters.js","names":[],"sources":["../../src/adapters/adapters.ts"],"sourcesContent":["import type { SimpleQueryInterface } from \"../query/simple-query-interface\";\nimport type { SchemaGenerator } from \"../schema-generator/schema-generator\";\nimport type { AnySchema } from \"../schema/create\";\nimport type { RequestContextStorage } from \"@fragno-dev/core/internal/request-context-storage\";\nimport type { IUnitOfWork } from \"../query/unit-of-work/unit-of-work\";\nimport type { PreparedMigrations } from \"./generic-sql/migration/prepared-migrations\";\n\nexport const fragnoDatabaseAdapterNameFakeSymbol = \"$fragno-database-adapter-name\" as const;\nexport const fragnoDatabaseAdapterVersionFakeSymbol = \"$fragno-database-adapter-version\" as const;\n\n/**\n * Storage type for database context - stores the Unit of Work.\n * This is shared across all fragments using the same adapter.\n */\nexport type DatabaseContextStorage = {\n uow: IUnitOfWork;\n};\n\n/**\n * Maps logical table names (used by fragment authors) to physical table names (with namespace suffix)\n */\nexport interface TableNameMapper {\n toPhysical(logicalName: string): string;\n toLogical(physicalName: string): string;\n}\n\nexport interface DatabaseAdapter<TUOWConfig = void> {\n [fragnoDatabaseAdapterNameFakeSymbol]: string;\n [fragnoDatabaseAdapterVersionFakeSymbol]: number;\n\n /**\n * Request context storage shared across all fragments using this adapter.\n * This allows multiple fragments to participate in the same Unit of Work.\n */\n readonly contextStorage: RequestContextStorage<DatabaseContextStorage>;\n\n /**\n * Get current schema version, undefined if not initialized.\n */\n getSchemaVersion(namespace: string): Promise<string | undefined>;\n\n createQueryEngine: <const T extends AnySchema>(\n schema: T,\n namespace: string,\n ) => SimpleQueryInterface<T, TUOWConfig>;\n\n prepareMigrations?: <const T extends AnySchema>(\n schema: T,\n namespace: string,\n ) => PreparedMigrations;\n\n /**\n * Generate a combined schema file from one or more fragments.\n * If not implemented, schema generation is not supported for this adapter.\n */\n createSchemaGenerator?: (\n fragments: { schema: AnySchema; namespace: string }[],\n options?: { path?: string },\n ) => SchemaGenerator;\n\n /**\n * Creates a table name mapper for the given namespace.\n * Used to convert between logical table names and physical table names.\n */\n createTableNameMapper: (namespace: string) => TableNameMapper;\n\n isConnectionHealthy: () => Promise<boolean>;\n\n close: () => Promise<void>;\n}\n"],"mappings":";AAOA,MAAa,sCAAsC;AACnD,MAAa,yCAAyC"}
|
|
@@ -1,28 +1,13 @@
|
|
|
1
1
|
import { AnySchema } from "../../schema/create.js";
|
|
2
|
-
import { AbstractQuery } from "../../query/query.js";
|
|
3
2
|
import { SchemaGenerator } from "../../schema-generator/schema-generator.js";
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import { RequestContextStorage } from "@fragno-dev/core/internal/request-context-storage";
|
|
3
|
+
import { TableNameMapper } from "../shared/table-name-mapper.js";
|
|
4
|
+
import { DatabaseAdapter } from "../adapters.js";
|
|
5
|
+
import { GenericSQLAdapter, GenericSQLOptions, UnitOfWorkConfig } from "../generic-sql/generic-sql-adapter.js";
|
|
8
6
|
|
|
9
7
|
//#region src/adapters/drizzle/drizzle-adapter.d.ts
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
provider: "sqlite" | "mysql" | "postgresql";
|
|
13
|
-
}
|
|
14
|
-
declare class DrizzleAdapter implements DatabaseAdapter<DrizzleUOWConfig> {
|
|
15
|
-
#private;
|
|
16
|
-
constructor(config: DrizzleConfig);
|
|
17
|
-
get [fragnoDatabaseAdapterNameFakeSymbol](): string;
|
|
18
|
-
get [fragnoDatabaseAdapterVersionFakeSymbol](): number;
|
|
19
|
-
get contextStorage(): RequestContextStorage<DatabaseContextStorage>;
|
|
20
|
-
close(): Promise<void>;
|
|
8
|
+
declare class DrizzleAdapter extends GenericSQLAdapter implements DatabaseAdapter<UnitOfWorkConfig> {
|
|
9
|
+
constructor(options: GenericSQLOptions);
|
|
21
10
|
createTableNameMapper(namespace: string): TableNameMapper;
|
|
22
|
-
get provider(): "sqlite" | "mysql" | "postgresql";
|
|
23
|
-
isConnectionHealthy(): Promise<boolean>;
|
|
24
|
-
getSchemaVersion(namespace: string): Promise<string | undefined>;
|
|
25
|
-
createQueryEngine<TSchema extends AnySchema>(schema: TSchema, namespace: string): AbstractQuery<TSchema, DrizzleUOWConfig>;
|
|
26
11
|
createSchemaGenerator(fragments: {
|
|
27
12
|
schema: AnySchema;
|
|
28
13
|
namespace: string;
|
|
@@ -31,5 +16,5 @@ declare class DrizzleAdapter implements DatabaseAdapter<DrizzleUOWConfig> {
|
|
|
31
16
|
}): SchemaGenerator;
|
|
32
17
|
}
|
|
33
18
|
//#endregion
|
|
34
|
-
export { DrizzleAdapter
|
|
19
|
+
export { DrizzleAdapter };
|
|
35
20
|
//# sourceMappingURL=drizzle-adapter.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"drizzle-adapter.d.ts","names":[],"sources":["../../../src/adapters/drizzle/drizzle-adapter.ts"],"sourcesContent":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"drizzle-adapter.d.ts","names":[],"sources":["../../../src/adapters/drizzle/drizzle-adapter.ts"],"sourcesContent":[],"mappings":";;;;;;;cAYa,cAAA,SAAuB,iBAAA,YAA6B,gBAAgB;uBAC1D;4CAAiB;EAD3B,qBAAe,CAAA,SAAA,EAAA;IAAqD,MAAA,EAUxD,SAVwD;IAC1D,SAAA,EAAA,MAAA;EAAiB,CAAA,EAAA,EAAA,OAWnC,CAXmC,EAAA;IASf,IAAA,CAAA,EAAA,MAAA;EAEpB,CAAA,CAAA,EAAA,eAAA"}
|
|
@@ -1,68 +1,21 @@
|
|
|
1
1
|
import "../../schema/create.js";
|
|
2
|
-
import {
|
|
3
|
-
import { SETTINGS_TABLE_NAME, settingsSchema } from "../../fragments/internal-fragment.js";
|
|
4
|
-
import { fragnoDatabaseAdapterNameFakeSymbol, fragnoDatabaseAdapterVersionFakeSymbol } from "../adapters.js";
|
|
5
|
-
import { createTableNameMapper } from "./shared.js";
|
|
2
|
+
import { createTableNameMapper } from "../shared/table-name-mapper.js";
|
|
6
3
|
import { generateSchema } from "./generate.js";
|
|
7
|
-
import {
|
|
8
|
-
import { createDrizzleConnectionPool } from "./drizzle-connection-pool.js";
|
|
9
|
-
import { sql } from "drizzle-orm";
|
|
4
|
+
import { GenericSQLAdapter } from "../generic-sql/generic-sql-adapter.js";
|
|
10
5
|
|
|
11
6
|
//#region src/adapters/drizzle/drizzle-adapter.ts
|
|
12
|
-
var DrizzleAdapter = class {
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
#schemaNamespaceMap = /* @__PURE__ */ new WeakMap();
|
|
16
|
-
#contextStorage;
|
|
17
|
-
constructor(config) {
|
|
18
|
-
this.#connectionPool = createDrizzleConnectionPool(config.db);
|
|
19
|
-
this.#provider = config.provider;
|
|
20
|
-
this.#contextStorage = new RequestContextStorage();
|
|
21
|
-
}
|
|
22
|
-
get [fragnoDatabaseAdapterNameFakeSymbol]() {
|
|
23
|
-
return "drizzle";
|
|
24
|
-
}
|
|
25
|
-
get [fragnoDatabaseAdapterVersionFakeSymbol]() {
|
|
26
|
-
return 0;
|
|
27
|
-
}
|
|
28
|
-
get contextStorage() {
|
|
29
|
-
return this.#contextStorage;
|
|
30
|
-
}
|
|
31
|
-
async close() {
|
|
32
|
-
await this.#connectionPool.close();
|
|
7
|
+
var DrizzleAdapter = class extends GenericSQLAdapter {
|
|
8
|
+
constructor(options) {
|
|
9
|
+
super(options);
|
|
33
10
|
}
|
|
34
11
|
createTableNameMapper(namespace) {
|
|
35
|
-
return createTableNameMapper(namespace);
|
|
36
|
-
}
|
|
37
|
-
get provider() {
|
|
38
|
-
return this.#provider;
|
|
39
|
-
}
|
|
40
|
-
async isConnectionHealthy() {
|
|
41
|
-
const conn = await this.#connectionPool.connect();
|
|
42
|
-
try {
|
|
43
|
-
const result = await conn.db.execute(sql`SELECT 1 as healthy`);
|
|
44
|
-
if (Array.isArray(result)) return result.length > 0 && result[0]["healthy"] === 1;
|
|
45
|
-
else return result.rows[0]["healthy"] === 1;
|
|
46
|
-
} catch {
|
|
47
|
-
return false;
|
|
48
|
-
} finally {
|
|
49
|
-
await conn.release();
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
async getSchemaVersion(namespace) {
|
|
53
|
-
const [[result]] = await this.createQueryEngine(settingsSchema, "").createUnitOfWork().find(SETTINGS_TABLE_NAME, (b) => b.whereIndex("unique_key", (eb) => eb("key", "=", `${namespace}.schema_version`))).executeRetrieve();
|
|
54
|
-
return result?.value;
|
|
55
|
-
}
|
|
56
|
-
createQueryEngine(schema, namespace) {
|
|
57
|
-
this.#schemaNamespaceMap.set(schema, namespace);
|
|
58
|
-
const mapper = namespace ? createTableNameMapper(namespace) : void 0;
|
|
59
|
-
return fromDrizzle(schema, this.#connectionPool, this.#provider, mapper, void 0, this.#schemaNamespaceMap);
|
|
12
|
+
return createTableNameMapper(namespace, false);
|
|
60
13
|
}
|
|
61
14
|
createSchemaGenerator(fragments, options) {
|
|
62
15
|
return { generateSchema: (genOptions) => {
|
|
63
16
|
const path = genOptions?.path ?? options?.path ?? "fragno-schema.ts";
|
|
64
17
|
return {
|
|
65
|
-
schema: generateSchema(fragments, this
|
|
18
|
+
schema: generateSchema(fragments, this.driverConfig.databaseType, { mapperFactory: (ns) => ns ? this.createTableNameMapper(ns) : void 0 }),
|
|
66
19
|
path
|
|
67
20
|
};
|
|
68
21
|
} };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"drizzle-adapter.js","names":[
|
|
1
|
+
{"version":3,"file":"drizzle-adapter.js","names":[],"sources":["../../../src/adapters/drizzle/drizzle-adapter.ts"],"sourcesContent":["import type { DatabaseAdapter } from \"../adapters\";\nimport { type AnySchema } from \"../../schema/create\";\nimport type { SchemaGenerator } from \"../../schema-generator/schema-generator\";\nimport { generateSchema } from \"./generate\";\nimport { createTableNameMapper } from \"../shared/table-name-mapper\";\n\nimport {\n GenericSQLAdapter,\n type GenericSQLOptions,\n type UnitOfWorkConfig,\n} from \"../generic-sql/generic-sql-adapter\";\n\nexport class DrizzleAdapter extends GenericSQLAdapter implements DatabaseAdapter<UnitOfWorkConfig> {\n constructor(options: GenericSQLOptions) {\n super(options);\n }\n\n override createTableNameMapper(namespace: string) {\n return createTableNameMapper(namespace, false);\n }\n\n createSchemaGenerator(\n fragments: { schema: AnySchema; namespace: string }[],\n options?: { path?: string },\n ): SchemaGenerator {\n return {\n generateSchema: (genOptions) => {\n const path = genOptions?.path ?? options?.path ?? \"fragno-schema.ts\";\n\n return {\n schema: generateSchema(fragments, this.driverConfig.databaseType, {\n mapperFactory: (ns) => (ns ? this.createTableNameMapper(ns) : undefined),\n }),\n path,\n };\n },\n };\n }\n}\n"],"mappings":";;;;;;AAYA,IAAa,iBAAb,cAAoC,kBAA+D;CACjG,YAAY,SAA4B;AACtC,QAAM,QAAQ;;CAGhB,AAAS,sBAAsB,WAAmB;AAChD,SAAO,sBAAsB,WAAW,MAAM;;CAGhD,sBACE,WACA,SACiB;AACjB,SAAO,EACL,iBAAiB,eAAe;GAC9B,MAAM,OAAO,YAAY,QAAQ,SAAS,QAAQ;AAElD,UAAO;IACL,QAAQ,eAAe,WAAW,KAAK,aAAa,cAAc,EAChE,gBAAgB,OAAQ,KAAK,KAAK,sBAAsB,GAAG,GAAG,QAC/D,CAAC;IACF;IACD;KAEJ"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { AnySchema } from "../../schema/create.js";
|
|
2
|
+
import { TableNameMapper } from "../shared/table-name-mapper.js";
|
|
2
3
|
import { SQLProvider } from "../../shared/providers.js";
|
|
3
4
|
|
|
4
5
|
//#region src/adapters/drizzle/generate.d.ts
|
|
@@ -11,6 +12,8 @@ interface GenerateSchemaOptions {
|
|
|
11
12
|
/** Module to import from */
|
|
12
13
|
from: string;
|
|
13
14
|
};
|
|
15
|
+
/** Optional mapper factory for creating table name mappers with custom sanitization */
|
|
16
|
+
mapperFactory?: (namespace: string | undefined) => TableNameMapper | undefined;
|
|
14
17
|
}
|
|
15
18
|
/**
|
|
16
19
|
* Generate a settings table for storing fragment versions
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generate.d.ts","names":[],"sources":["../../../src/adapters/drizzle/generate.ts"],"sourcesContent":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"generate.d.ts","names":[],"sources":["../../../src/adapters/drizzle/generate.ts"],"sourcesContent":[],"mappings":";;;;;KAkCY,iBAAA,GAAoB,QAAQ;UAulBvB,qBAAA;EAvlBL;EAulBK,iBAAA,CAAA,EAAA;IAkBD;IAC0B,IAAA,EAAA,MAAA;IAC9B;IACA,IAAA,EAAA,MAAA;EAAqB,CAAA;;qDAZoB;;;;;;;;iBASrC,cAAA;;UAC0B;eAC9B,6BACA"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { InternalIdColumn } from "../../schema/create.js";
|
|
2
|
-
import { schemaToDBType } from "../../schema/serialize.js";
|
|
3
2
|
import { importGenerator } from "../../util/import-generator.js";
|
|
4
3
|
import { ident, parseVarchar } from "../../util/parse.js";
|
|
5
|
-
import { createTableNameMapper, sanitizeNamespace } from "
|
|
4
|
+
import { createTableNameMapper, sanitizeNamespace } from "../shared/table-name-mapper.js";
|
|
5
|
+
import { createSQLTypeMapper } from "../../schema/type-conversion/create-sql-type-mapper.js";
|
|
6
6
|
|
|
7
7
|
//#region src/adapters/drizzle/generate.ts
|
|
8
8
|
const PROVIDER_IMPORTS = {
|
|
@@ -50,7 +50,7 @@ function generateBinaryCustomType(ctx, customTypes) {
|
|
|
50
50
|
const code = generateCustomType(ctx, name, {
|
|
51
51
|
dataType: "Uint8Array",
|
|
52
52
|
driverDataType: "Buffer",
|
|
53
|
-
databaseDataType:
|
|
53
|
+
databaseDataType: createSQLTypeMapper(ctx.provider).getDatabaseType({ type: "binary" }),
|
|
54
54
|
fromDriverCode: "return new Uint8Array(value.buffer, value.byteOffset, value.byteLength)",
|
|
55
55
|
toDriverCode: `return value instanceof Buffer? value : Buffer.from(value)`
|
|
56
56
|
});
|
|
@@ -59,10 +59,10 @@ function generateBinaryCustomType(ctx, customTypes) {
|
|
|
59
59
|
}
|
|
60
60
|
/**
|
|
61
61
|
* Maps SQL database types to Drizzle function names and parameters.
|
|
62
|
-
* Uses
|
|
62
|
+
* Uses SQLTypeMapper as the source of truth for type conversion.
|
|
63
63
|
*/
|
|
64
64
|
function getColumnTypeFunction(ctx, column, customTypes) {
|
|
65
|
-
return mapDBTypeToDrizzleFunction(ctx,
|
|
65
|
+
return mapDBTypeToDrizzleFunction(ctx, createSQLTypeMapper(ctx.provider).getDatabaseType(column), column, customTypes);
|
|
66
66
|
}
|
|
67
67
|
/**
|
|
68
68
|
* Maps a database type string to a Drizzle function name and parameters.
|
|
@@ -142,6 +142,13 @@ function mapDBTypeToDrizzleFunction(ctx, dbType, column, customTypes) {
|
|
|
142
142
|
}
|
|
143
143
|
return { name: dbType };
|
|
144
144
|
}
|
|
145
|
+
/**
|
|
146
|
+
* Get the physical table name (with namespace suffix) using the mapper if available
|
|
147
|
+
*/
|
|
148
|
+
function getPhysicalTableName(logicalName, namespace, mapper) {
|
|
149
|
+
if (!namespace) return logicalName;
|
|
150
|
+
return mapper ? mapper.toPhysical(logicalName) : `${logicalName}_${sanitizeNamespace(namespace)}`;
|
|
151
|
+
}
|
|
145
152
|
function generateColumnDefinition(ctx, column, customTypes) {
|
|
146
153
|
const parts = [];
|
|
147
154
|
const typeFn = getColumnTypeFunction(ctx, column, customTypes);
|
|
@@ -180,8 +187,7 @@ function generateColumnDefinition(ctx, column, customTypes) {
|
|
|
180
187
|
function generateAllColumns(ctx, table, customTypes) {
|
|
181
188
|
return Object.values(table.columns).map((column) => generateColumnDefinition(ctx, column, customTypes));
|
|
182
189
|
}
|
|
183
|
-
function generateForeignKeys(ctx, table, namespace) {
|
|
184
|
-
const mapper = namespace ? createTableNameMapper(namespace) : void 0;
|
|
190
|
+
function generateForeignKeys(ctx, table, namespace, mapper) {
|
|
185
191
|
const keys = [];
|
|
186
192
|
for (const relation of Object.values(table.relations)) {
|
|
187
193
|
if (relation.type === "many") continue;
|
|
@@ -222,21 +228,21 @@ function generateIndexes(ctx, table, namespace) {
|
|
|
222
228
|
}
|
|
223
229
|
return indexes;
|
|
224
230
|
}
|
|
225
|
-
function generateTableConstraints(ctx, table, namespace) {
|
|
226
|
-
return [...generateForeignKeys(ctx, table, namespace), ...generateIndexes(ctx, table, namespace)];
|
|
231
|
+
function generateTableConstraints(ctx, table, namespace, mapper) {
|
|
232
|
+
return [...generateForeignKeys(ctx, table, namespace, mapper), ...generateIndexes(ctx, table, namespace)];
|
|
227
233
|
}
|
|
228
|
-
function generateTable(ctx, table, customTypes, namespace) {
|
|
234
|
+
function generateTable(ctx, table, customTypes, namespace, mapper) {
|
|
229
235
|
const tableFn = PROVIDER_TABLE_FUNCTIONS[ctx.provider];
|
|
230
236
|
ctx.imports.addImport(tableFn, ctx.importSource);
|
|
231
237
|
const columns = generateAllColumns(ctx, table, customTypes);
|
|
232
|
-
const constraints = generateTableConstraints(ctx, table, namespace);
|
|
233
|
-
const physicalTableName =
|
|
234
|
-
const exportName =
|
|
238
|
+
const constraints = generateTableConstraints(ctx, table, namespace, mapper);
|
|
239
|
+
const physicalTableName = getPhysicalTableName(table.ormName, namespace, mapper);
|
|
240
|
+
const exportName = namespace ? `${table.ormName}_${sanitizeNamespace(namespace)}` : table.ormName;
|
|
235
241
|
const args = [`"${physicalTableName}"`, `{\n${columns.join(",\n")}\n}`];
|
|
236
242
|
if (constraints.length > 0) args.push(`(table) => [\n${ident(constraints.join(",\n"))}\n]`);
|
|
237
243
|
return `export const ${exportName} = ${tableFn}(${args.join(", ")})`;
|
|
238
244
|
}
|
|
239
|
-
function generateRelation(ctx, table, namespace, inverseRelations) {
|
|
245
|
+
function generateRelation(ctx, table, namespace, inverseRelations, _mapper) {
|
|
240
246
|
const relations = [];
|
|
241
247
|
let hasOne = false;
|
|
242
248
|
let hasMany = false;
|
|
@@ -247,10 +253,10 @@ function generateRelation(ctx, table, namespace, inverseRelations) {
|
|
|
247
253
|
if (relation.type === "one") {
|
|
248
254
|
const fields = [];
|
|
249
255
|
const references = [];
|
|
250
|
-
const tableRef
|
|
256
|
+
const tableRef = namespace ? `${table.ormName}_${sanitizeNamespace(namespace)}` : table.ormName;
|
|
251
257
|
const relatedTableRef = namespace ? `${relation.table.ormName}_${sanitizeNamespace(namespace)}` : relation.table.ormName;
|
|
252
258
|
for (const [left, right] of relation.on) {
|
|
253
|
-
fields.push(`${tableRef
|
|
259
|
+
fields.push(`${tableRef}.${left}`);
|
|
254
260
|
const actualRight = right === "id" ? "_internalId" : right;
|
|
255
261
|
references.push(`${relatedTableRef}.${actualRight}`);
|
|
256
262
|
}
|
|
@@ -274,10 +280,10 @@ function generateRelation(ctx, table, namespace, inverseRelations) {
|
|
|
274
280
|
if (hasOne) params.push("one");
|
|
275
281
|
if (hasMany) params.push("many");
|
|
276
282
|
const relationParams = params.length > 0 ? `{ ${params.join(", ")} }` : "{}";
|
|
277
|
-
const
|
|
278
|
-
const relationsName = namespace ? `${
|
|
283
|
+
const exportTableRef = namespace ? `${table.ormName}_${sanitizeNamespace(namespace)}` : table.ormName;
|
|
284
|
+
const relationsName = namespace ? `${exportTableRef}Relations` : `${table.ormName}Relations`;
|
|
279
285
|
ctx.imports.addImport("relations", "drizzle-orm");
|
|
280
|
-
return `export const ${relationsName} = relations(${
|
|
286
|
+
return `export const ${relationsName} = relations(${exportTableRef}, (${relationParams}) => ({
|
|
281
287
|
${relations.join(",\n")}
|
|
282
288
|
}));`;
|
|
283
289
|
}
|
|
@@ -285,19 +291,19 @@ ${relations.join(",\n")}
|
|
|
285
291
|
* Generate a schema export object for a fragment
|
|
286
292
|
* This groups all tables by their logical names for easier access
|
|
287
293
|
*/
|
|
288
|
-
function generateFragmentSchemaExport(schema, namespace, tablesWithRelations) {
|
|
294
|
+
function generateFragmentSchemaExport(schema, namespace, tablesWithRelations, _mapper) {
|
|
289
295
|
const drizzleEntries = [];
|
|
290
296
|
for (const table of Object.values(schema.tables)) {
|
|
291
|
-
const
|
|
292
|
-
drizzleEntries.push(` ${
|
|
297
|
+
const exportName = namespace ? `${table.ormName}_${sanitizeNamespace(namespace)}` : table.ormName;
|
|
298
|
+
drizzleEntries.push(` ${exportName}: ${exportName}`);
|
|
293
299
|
if (tablesWithRelations?.has(table.name)) {
|
|
294
|
-
const relationsName = namespace ? `${
|
|
300
|
+
const relationsName = namespace ? `${exportName}Relations` : `${table.ormName}Relations`;
|
|
295
301
|
drizzleEntries.push(` ${relationsName}: ${relationsName}`);
|
|
296
302
|
}
|
|
297
303
|
if (namespace) {
|
|
298
|
-
drizzleEntries.push(` ${table.ormName}: ${
|
|
304
|
+
drizzleEntries.push(` ${table.ormName}: ${exportName}`);
|
|
299
305
|
if (tablesWithRelations?.has(table.name)) {
|
|
300
|
-
const physicalRelationsName = `${
|
|
306
|
+
const physicalRelationsName = `${exportName}Relations`;
|
|
301
307
|
const aliasRelationsName = `${table.ormName}Relations`;
|
|
302
308
|
drizzleEntries.push(` ${aliasRelationsName}: ${physicalRelationsName}`);
|
|
303
309
|
}
|
|
@@ -316,14 +322,16 @@ function generateSchema(fragments, provider, options) {
|
|
|
316
322
|
const ctx = createContext(provider, options?.idGeneratorImport);
|
|
317
323
|
const customTypes = [];
|
|
318
324
|
const sections = [];
|
|
325
|
+
const getMapper = options?.mapperFactory || ((ns) => ns ? createTableNameMapper(ns, true) : void 0);
|
|
319
326
|
for (const { schema, namespace } of fragments) {
|
|
320
327
|
const fragmentTables = [];
|
|
328
|
+
const mapper = getMapper(namespace);
|
|
321
329
|
fragmentTables.push("");
|
|
322
330
|
fragmentTables.push("// ============================================================================");
|
|
323
331
|
fragmentTables.push(`// Fragment: ${namespace}`);
|
|
324
332
|
fragmentTables.push("// ============================================================================");
|
|
325
333
|
for (const table of Object.values(schema.tables)) {
|
|
326
|
-
const tableCode = generateTable(ctx, table, customTypes, namespace);
|
|
334
|
+
const tableCode = generateTable(ctx, table, customTypes, namespace, mapper);
|
|
327
335
|
fragmentTables.push("");
|
|
328
336
|
fragmentTables.push(tableCode);
|
|
329
337
|
}
|
|
@@ -338,7 +346,7 @@ function generateSchema(fragments, provider, options) {
|
|
|
338
346
|
}
|
|
339
347
|
const tablesWithRelations = /* @__PURE__ */ new Set();
|
|
340
348
|
for (const table of Object.values(schema.tables)) {
|
|
341
|
-
const relationCode = generateRelation(ctx, table, namespace, inverseRelations.get(table.name));
|
|
349
|
+
const relationCode = generateRelation(ctx, table, namespace, inverseRelations.get(table.name), mapper);
|
|
342
350
|
if (relationCode) {
|
|
343
351
|
fragmentTables.push("");
|
|
344
352
|
fragmentTables.push(relationCode);
|
|
@@ -347,7 +355,7 @@ function generateSchema(fragments, provider, options) {
|
|
|
347
355
|
}
|
|
348
356
|
if (namespace !== "") {
|
|
349
357
|
fragmentTables.push("");
|
|
350
|
-
fragmentTables.push(generateFragmentSchemaExport(schema, namespace, tablesWithRelations));
|
|
358
|
+
fragmentTables.push(generateFragmentSchemaExport(schema, namespace, tablesWithRelations, mapper));
|
|
351
359
|
}
|
|
352
360
|
sections.push(...fragmentTables);
|
|
353
361
|
}
|