@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
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { SupportedDatabase } from "../../adapters/generic-sql/driver-config";
|
|
2
|
+
import { PostgreSQLTypeMapper } from "./dialect/postgres";
|
|
3
|
+
import { MySQLTypeMapper } from "./dialect/mysql";
|
|
4
|
+
import { SQLiteTypeMapper } from "./dialect/sqlite";
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Factory function to create a dialect-specific SQL type mapper.
|
|
8
|
+
*
|
|
9
|
+
* Based on the database type, returns the appropriate mapper implementation
|
|
10
|
+
* (PostgreSQL, MySQL, or SQLite).
|
|
11
|
+
*
|
|
12
|
+
* @param database - The database type (sqlite, postgresql, or mysql)
|
|
13
|
+
* @returns Dialect-specific SQLTypeMapper instance
|
|
14
|
+
*/
|
|
15
|
+
export function createSQLTypeMapper(database: SupportedDatabase) {
|
|
16
|
+
switch (database) {
|
|
17
|
+
case "postgresql":
|
|
18
|
+
return new PostgreSQLTypeMapper(database);
|
|
19
|
+
case "mysql":
|
|
20
|
+
return new MySQLTypeMapper(database);
|
|
21
|
+
case "sqlite":
|
|
22
|
+
return new SQLiteTypeMapper(database);
|
|
23
|
+
default: {
|
|
24
|
+
const exhaustiveCheck: never = database;
|
|
25
|
+
throw new Error(`Unsupported database type: ${exhaustiveCheck}`);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import type { AnyColumn } from "../../create";
|
|
2
|
+
import { SQLTypeMapper, type MySQLDatabaseType } from "../type-mapping";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* MySQL-specific type mapper.
|
|
6
|
+
*
|
|
7
|
+
* MySQL supports:
|
|
8
|
+
* - BIGINT for large integers (with AUTO_INCREMENT for internal IDs)
|
|
9
|
+
* - INTEGER for integers
|
|
10
|
+
* - BOOLEAN for booleans (alias for TINYINT(1))
|
|
11
|
+
* - JSON for JSON data (native support in MySQL 5.7+)
|
|
12
|
+
* - TEXT for strings
|
|
13
|
+
* - VARCHAR(n) for variable-length strings
|
|
14
|
+
* - LONGBLOB for binary data
|
|
15
|
+
* - DATETIME for timestamps without timezone
|
|
16
|
+
* - DATE for dates
|
|
17
|
+
* - DECIMAL for decimals
|
|
18
|
+
*/
|
|
19
|
+
export class MySQLTypeMapper extends SQLTypeMapper<MySQLDatabaseType> {
|
|
20
|
+
protected getInternalIdType(): MySQLDatabaseType {
|
|
21
|
+
// MySQL uses bigint with AUTO_INCREMENT applied separately
|
|
22
|
+
return "bigint";
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
protected mapInteger(_column: AnyColumn | Pick<AnyColumn, "type">): MySQLDatabaseType {
|
|
26
|
+
return "integer";
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
protected mapBigint(_column: AnyColumn | Pick<AnyColumn, "type">): MySQLDatabaseType {
|
|
30
|
+
return "bigint";
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
protected mapString(): MySQLDatabaseType {
|
|
34
|
+
return "text";
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
protected mapVarchar(length: number): MySQLDatabaseType {
|
|
38
|
+
return `varchar(${length})`;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
protected mapBinary(): MySQLDatabaseType {
|
|
42
|
+
return "longblob";
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
protected mapBool(): MySQLDatabaseType {
|
|
46
|
+
return "boolean";
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
protected mapDecimal(): MySQLDatabaseType {
|
|
50
|
+
return "decimal";
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
protected mapTimestamp(): MySQLDatabaseType {
|
|
54
|
+
return "datetime";
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
protected mapDate(): MySQLDatabaseType {
|
|
58
|
+
return "date";
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
protected mapJson(): MySQLDatabaseType {
|
|
62
|
+
return "json";
|
|
63
|
+
}
|
|
64
|
+
}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import type { AnyColumn } from "../../create";
|
|
2
|
+
import { SQLTypeMapper, type PostgreSQLDatabaseType } from "../type-mapping";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* PostgreSQL-specific type mapper.
|
|
6
|
+
*
|
|
7
|
+
* PostgreSQL supports:
|
|
8
|
+
* - BIGSERIAL for auto-increment
|
|
9
|
+
* - BOOLEAN for booleans
|
|
10
|
+
* - JSON for JSON data
|
|
11
|
+
* - TEXT for strings
|
|
12
|
+
* - VARCHAR(n) for variable-length strings
|
|
13
|
+
* - BYTEA for binary data
|
|
14
|
+
* - Full timestamp and date support
|
|
15
|
+
* - BIGINT and INTEGER for integers
|
|
16
|
+
* - DECIMAL for decimals
|
|
17
|
+
*/
|
|
18
|
+
export class PostgreSQLTypeMapper extends SQLTypeMapper<PostgreSQLDatabaseType> {
|
|
19
|
+
protected getInternalIdType(): PostgreSQLDatabaseType {
|
|
20
|
+
return "bigserial";
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
protected mapInteger(_column: AnyColumn | Pick<AnyColumn, "type">): PostgreSQLDatabaseType {
|
|
24
|
+
return "integer";
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
protected mapBigint(_column: AnyColumn | Pick<AnyColumn, "type">): PostgreSQLDatabaseType {
|
|
28
|
+
return "bigint";
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
protected mapString(): PostgreSQLDatabaseType {
|
|
32
|
+
return "text";
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
protected mapVarchar(length: number): PostgreSQLDatabaseType {
|
|
36
|
+
return `varchar(${length})`;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
protected mapBinary(): PostgreSQLDatabaseType {
|
|
40
|
+
return "bytea";
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
protected mapBool(): PostgreSQLDatabaseType {
|
|
44
|
+
return "boolean";
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
protected mapDecimal(): PostgreSQLDatabaseType {
|
|
48
|
+
return "decimal";
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
protected mapTimestamp(): PostgreSQLDatabaseType {
|
|
52
|
+
return "timestamp";
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
protected mapDate(): PostgreSQLDatabaseType {
|
|
56
|
+
return "date";
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
protected mapJson(): PostgreSQLDatabaseType {
|
|
60
|
+
return "json";
|
|
61
|
+
}
|
|
62
|
+
}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import type { AnyColumn } from "../../create";
|
|
2
|
+
import { SQLTypeMapper, type SQLiteDatabaseType } from "../type-mapping";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* SQLite-specific type mapper.
|
|
6
|
+
*
|
|
7
|
+
* SQLite has a limited type system with only 4 storage classes:
|
|
8
|
+
* - INTEGER for integers, booleans, timestamps, dates (and reference columns)
|
|
9
|
+
* - BLOB for binary data and bigints (except for reference columns)
|
|
10
|
+
* - TEXT for strings, JSON, and varchar
|
|
11
|
+
* - REAL for decimals
|
|
12
|
+
*/
|
|
13
|
+
export class SQLiteTypeMapper extends SQLTypeMapper<SQLiteDatabaseType> {
|
|
14
|
+
protected getInternalIdType(): SQLiteDatabaseType {
|
|
15
|
+
// SQLite uses INTEGER for auto-increment (INTEGER PRIMARY KEY)
|
|
16
|
+
return "integer";
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
protected mapInteger(_column: AnyColumn | Pick<AnyColumn, "type">): SQLiteDatabaseType {
|
|
20
|
+
return "integer";
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
protected mapBigint(column: AnyColumn | Pick<AnyColumn, "type">): SQLiteDatabaseType {
|
|
24
|
+
// SQLite special case: reference columns should use integer even if type is bigint
|
|
25
|
+
if ("role" in column && column.role === "reference") {
|
|
26
|
+
return "integer";
|
|
27
|
+
}
|
|
28
|
+
return "blob";
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
protected mapString(): SQLiteDatabaseType {
|
|
32
|
+
return "text";
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
protected mapVarchar(_length: number): SQLiteDatabaseType {
|
|
36
|
+
// SQLite doesn't support varchar - convert to text
|
|
37
|
+
return "text";
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
protected mapBinary(): SQLiteDatabaseType {
|
|
41
|
+
return "blob";
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
protected mapBool(): SQLiteDatabaseType {
|
|
45
|
+
return "integer";
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
protected mapDecimal(): SQLiteDatabaseType {
|
|
49
|
+
return "real";
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
protected mapTimestamp(): SQLiteDatabaseType {
|
|
53
|
+
return "integer";
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
protected mapDate(): SQLiteDatabaseType {
|
|
57
|
+
return "integer";
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
protected mapJson(): SQLiteDatabaseType {
|
|
61
|
+
return "text";
|
|
62
|
+
}
|
|
63
|
+
}
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
import { column } from "../create";
|
|
3
|
+
import { createSQLTypeMapper } from "./create-sql-type-mapper";
|
|
4
|
+
|
|
5
|
+
describe("SQLTypeMapper", () => {
|
|
6
|
+
describe("error handling", () => {
|
|
7
|
+
it("should throw error for varchar without length", () => {
|
|
8
|
+
const mapper = createSQLTypeMapper("postgresql");
|
|
9
|
+
// @ts-expect-error - Testing runtime error handling for invalid type
|
|
10
|
+
expect(() => mapper.getDatabaseType({ type: "varchar" })).toThrow(
|
|
11
|
+
'Invalid varchar format: "varchar". Expected format: varchar(number), e.g., varchar(255)',
|
|
12
|
+
);
|
|
13
|
+
});
|
|
14
|
+
|
|
15
|
+
it("should throw error for varchar with non-numeric length", () => {
|
|
16
|
+
const mapper = createSQLTypeMapper("mysql");
|
|
17
|
+
// @ts-expect-error - Testing runtime error handling for invalid type
|
|
18
|
+
expect(() => mapper.getDatabaseType({ type: "varchar(abc)" })).toThrow(
|
|
19
|
+
'Invalid varchar format: "varchar(abc)". Expected format: varchar(number), e.g., varchar(255)',
|
|
20
|
+
);
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
it("should throw error for malformed varchar", () => {
|
|
24
|
+
const mapper = createSQLTypeMapper("sqlite");
|
|
25
|
+
// @ts-expect-error - Testing runtime error handling for invalid type
|
|
26
|
+
expect(() => mapper.getDatabaseType({ type: "varchar(100" })).toThrow(
|
|
27
|
+
'Invalid varchar format: "varchar(100". Expected format: varchar(number), e.g., varchar(255)',
|
|
28
|
+
);
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
it("should throw error for completely unsupported type", () => {
|
|
32
|
+
const mapper = createSQLTypeMapper("postgresql");
|
|
33
|
+
// @ts-expect-error - Testing runtime error handling for invalid type
|
|
34
|
+
expect(() => mapper.getDatabaseType({ type: "unsupported" })).toThrow(
|
|
35
|
+
"Unsupported column type: unsupported",
|
|
36
|
+
);
|
|
37
|
+
});
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
describe("sqlite", () => {
|
|
41
|
+
const mapper = createSQLTypeMapper("sqlite");
|
|
42
|
+
|
|
43
|
+
it("should convert integer types to integer", () => {
|
|
44
|
+
expect(mapper.getDatabaseType(column("integer"))).toBe("integer");
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
it("should convert timestamp to integer", () => {
|
|
48
|
+
expect(mapper.getDatabaseType(column("timestamp"))).toBe("integer");
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
it("should convert date to integer", () => {
|
|
52
|
+
expect(mapper.getDatabaseType(column("date"))).toBe("integer");
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
it("should convert bool to integer", () => {
|
|
56
|
+
expect(mapper.getDatabaseType(column("bool"))).toBe("integer");
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
it("should convert binary to blob", () => {
|
|
60
|
+
expect(mapper.getDatabaseType(column("binary"))).toBe("blob");
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
it("should convert bigint to blob", () => {
|
|
64
|
+
expect(mapper.getDatabaseType(column("bigint"))).toBe("blob");
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
it("should convert json to text", () => {
|
|
68
|
+
expect(mapper.getDatabaseType(column("json"))).toBe("text");
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
it("should convert string to text", () => {
|
|
72
|
+
expect(mapper.getDatabaseType(column("string"))).toBe("text");
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
it("should convert varchar to text", () => {
|
|
76
|
+
expect(mapper.getDatabaseType({ type: "varchar(255)" })).toBe("text");
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
it("should convert decimal to real", () => {
|
|
80
|
+
expect(mapper.getDatabaseType(column("decimal"))).toBe("real");
|
|
81
|
+
});
|
|
82
|
+
});
|
|
83
|
+
|
|
84
|
+
describe("postgresql", () => {
|
|
85
|
+
const mapper = createSQLTypeMapper("postgresql");
|
|
86
|
+
|
|
87
|
+
it("should convert bool to boolean", () => {
|
|
88
|
+
expect(mapper.getDatabaseType(column("bool"))).toBe("boolean");
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
it("should convert json to json", () => {
|
|
92
|
+
expect(mapper.getDatabaseType(column("json"))).toBe("json");
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
it("should convert string to text", () => {
|
|
96
|
+
expect(mapper.getDatabaseType(column("string"))).toBe("text");
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
it("should convert binary to bytea", () => {
|
|
100
|
+
expect(mapper.getDatabaseType(column("binary"))).toBe("bytea");
|
|
101
|
+
});
|
|
102
|
+
|
|
103
|
+
it("should preserve varchar with length", () => {
|
|
104
|
+
expect(mapper.getDatabaseType({ type: "varchar(200)" })).toBe("varchar(200)");
|
|
105
|
+
});
|
|
106
|
+
|
|
107
|
+
it("should preserve other types", () => {
|
|
108
|
+
expect(mapper.getDatabaseType(column("timestamp"))).toBe("timestamp");
|
|
109
|
+
expect(mapper.getDatabaseType(column("integer"))).toBe("integer");
|
|
110
|
+
});
|
|
111
|
+
});
|
|
112
|
+
|
|
113
|
+
describe("mysql", () => {
|
|
114
|
+
const mapper = createSQLTypeMapper("mysql");
|
|
115
|
+
|
|
116
|
+
it("should convert bool to boolean", () => {
|
|
117
|
+
expect(mapper.getDatabaseType(column("bool"))).toBe("boolean");
|
|
118
|
+
});
|
|
119
|
+
|
|
120
|
+
it("should convert string to text", () => {
|
|
121
|
+
expect(mapper.getDatabaseType(column("string"))).toBe("text");
|
|
122
|
+
});
|
|
123
|
+
|
|
124
|
+
it("should convert binary to longblob", () => {
|
|
125
|
+
expect(mapper.getDatabaseType(column("binary"))).toBe("longblob");
|
|
126
|
+
});
|
|
127
|
+
|
|
128
|
+
it("should preserve varchar with length", () => {
|
|
129
|
+
expect(mapper.getDatabaseType({ type: "varchar(150)" })).toBe("varchar(150)");
|
|
130
|
+
});
|
|
131
|
+
|
|
132
|
+
it("should preserve other types", () => {
|
|
133
|
+
expect(mapper.getDatabaseType(column("integer"))).toBe("integer");
|
|
134
|
+
expect(mapper.getDatabaseType(column("json"))).toBe("json");
|
|
135
|
+
});
|
|
136
|
+
});
|
|
137
|
+
});
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
import type { SupportedDatabase } from "../../adapters/generic-sql/driver-config";
|
|
2
|
+
import type { AnyColumn } from "../create";
|
|
3
|
+
|
|
4
|
+
export interface AdditionalColumnMetadata {
|
|
5
|
+
length?: number;
|
|
6
|
+
precision?: number;
|
|
7
|
+
scale?: number;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* PostgreSQL-specific database types
|
|
12
|
+
*/
|
|
13
|
+
export type PostgreSQLDatabaseType =
|
|
14
|
+
| "bigserial"
|
|
15
|
+
| "serial"
|
|
16
|
+
| "boolean"
|
|
17
|
+
| "json"
|
|
18
|
+
| "text"
|
|
19
|
+
| "bytea"
|
|
20
|
+
| "timestamp"
|
|
21
|
+
| "timestamptz"
|
|
22
|
+
| "bigint"
|
|
23
|
+
| "integer"
|
|
24
|
+
| "decimal"
|
|
25
|
+
| "date"
|
|
26
|
+
| `varchar(${number})`;
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* MySQL-specific database types
|
|
30
|
+
*/
|
|
31
|
+
export type MySQLDatabaseType =
|
|
32
|
+
| "bigint"
|
|
33
|
+
| "boolean"
|
|
34
|
+
| "text"
|
|
35
|
+
| "longblob"
|
|
36
|
+
| "integer"
|
|
37
|
+
| "decimal"
|
|
38
|
+
| "date"
|
|
39
|
+
| "datetime"
|
|
40
|
+
| "json"
|
|
41
|
+
| "timestamp"
|
|
42
|
+
| `varchar(${number})`;
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* SQLite-specific database types
|
|
46
|
+
*/
|
|
47
|
+
export type SQLiteDatabaseType = "integer" | "blob" | "text" | "real";
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Union of all database-specific types
|
|
51
|
+
*/
|
|
52
|
+
export type DatabaseTypeLiteral = PostgreSQLDatabaseType | MySQLDatabaseType | SQLiteDatabaseType;
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Abstract base class for SQL type mapping.
|
|
56
|
+
*
|
|
57
|
+
* Similar to SQLQueryCompiler and SQLGenerator, this class provides a framework
|
|
58
|
+
* for mapping schema column types to database-specific column types.
|
|
59
|
+
*
|
|
60
|
+
* Each database dialect extends this class and implements abstract methods
|
|
61
|
+
* for each column type. The base class handles the switch statement logic.
|
|
62
|
+
*
|
|
63
|
+
* @template TDatabaseType - The specific database type union for this dialect
|
|
64
|
+
*/
|
|
65
|
+
export abstract class SQLTypeMapper<TDatabaseType extends DatabaseTypeLiteral> {
|
|
66
|
+
protected readonly database: SupportedDatabase;
|
|
67
|
+
|
|
68
|
+
constructor(database: SupportedDatabase) {
|
|
69
|
+
this.database = database;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* Get the database type for internal ID columns.
|
|
74
|
+
*/
|
|
75
|
+
protected abstract getInternalIdType(): TDatabaseType;
|
|
76
|
+
|
|
77
|
+
// Abstract methods for each column type that dialects must implement
|
|
78
|
+
protected abstract mapInteger(column: AnyColumn | Pick<AnyColumn, "type">): TDatabaseType;
|
|
79
|
+
protected abstract mapBigint(column: AnyColumn | Pick<AnyColumn, "type">): TDatabaseType;
|
|
80
|
+
protected abstract mapString(): TDatabaseType;
|
|
81
|
+
protected abstract mapVarchar(length: number): TDatabaseType;
|
|
82
|
+
protected abstract mapBinary(): TDatabaseType;
|
|
83
|
+
protected abstract mapBool(): TDatabaseType;
|
|
84
|
+
protected abstract mapDecimal(): TDatabaseType;
|
|
85
|
+
protected abstract mapTimestamp(): TDatabaseType;
|
|
86
|
+
protected abstract mapDate(): TDatabaseType;
|
|
87
|
+
protected abstract mapJson(): TDatabaseType;
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* Map a column type to a database-specific type.
|
|
91
|
+
* Contains the central switch statement that delegates to abstract methods.
|
|
92
|
+
*/
|
|
93
|
+
protected mapColumnType(column: AnyColumn | Pick<AnyColumn, "type">): TDatabaseType {
|
|
94
|
+
const { type } = column;
|
|
95
|
+
|
|
96
|
+
// Handle varchar with length parameter
|
|
97
|
+
if (typeof type === "string" && type.startsWith("varchar")) {
|
|
98
|
+
const match = type.match(/^varchar\((\d+)\)$/);
|
|
99
|
+
if (match) {
|
|
100
|
+
const length = parseInt(match[1], 10);
|
|
101
|
+
return this.mapVarchar(length);
|
|
102
|
+
}
|
|
103
|
+
throw new Error(
|
|
104
|
+
`Invalid varchar format: "${type}". Expected format: varchar(number), e.g., varchar(255)`,
|
|
105
|
+
);
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
switch (type) {
|
|
109
|
+
case "integer":
|
|
110
|
+
return this.mapInteger(column);
|
|
111
|
+
case "bigint":
|
|
112
|
+
return this.mapBigint(column);
|
|
113
|
+
case "string":
|
|
114
|
+
return this.mapString();
|
|
115
|
+
case "binary":
|
|
116
|
+
return this.mapBinary();
|
|
117
|
+
case "bool":
|
|
118
|
+
return this.mapBool();
|
|
119
|
+
case "decimal":
|
|
120
|
+
return this.mapDecimal();
|
|
121
|
+
case "timestamp":
|
|
122
|
+
return this.mapTimestamp();
|
|
123
|
+
case "date":
|
|
124
|
+
return this.mapDate();
|
|
125
|
+
case "json":
|
|
126
|
+
return this.mapJson();
|
|
127
|
+
default:
|
|
128
|
+
// TypeScript should ensure we never reach here
|
|
129
|
+
throw new Error(`Unsupported column type: ${type}`);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
/**
|
|
134
|
+
* Map a schema column type to the appropriate database column type.
|
|
135
|
+
* Used for generating CREATE TABLE statements and migrations.
|
|
136
|
+
*
|
|
137
|
+
* Handles common cases like internal-id columns,
|
|
138
|
+
* then delegates to mapColumnType for other types.
|
|
139
|
+
*
|
|
140
|
+
* @param column - The column schema definition
|
|
141
|
+
* @returns The database-specific column type
|
|
142
|
+
*/
|
|
143
|
+
getDatabaseType(column: AnyColumn | Pick<AnyColumn, "type">): TDatabaseType {
|
|
144
|
+
// Handle internal ID columns with auto-increment
|
|
145
|
+
if ("role" in column && column.role === "internal-id") {
|
|
146
|
+
return this.getInternalIdType();
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
// Delegate to type mapping logic
|
|
150
|
+
// This includes reference columns, which should use their specified type
|
|
151
|
+
return this.mapColumnType(column);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Represents an active database connection that can be released back to the pool.
|
|
3
3
|
*/
|
|
4
|
-
export interface Connection<
|
|
5
|
-
db:
|
|
4
|
+
export interface Connection<TDatabase> {
|
|
5
|
+
db: TDatabase;
|
|
6
6
|
release(): Promise<void>;
|
|
7
7
|
}
|
|
8
8
|
|
|
@@ -10,15 +10,15 @@ export interface Connection<TDb> {
|
|
|
10
10
|
* Connection pool interface for managing database connections.
|
|
11
11
|
* Adapter-specific implementations should be used (e.g., createKyselyConnectionPool, createDrizzleConnectionPool).
|
|
12
12
|
*/
|
|
13
|
-
export interface ConnectionPool<
|
|
13
|
+
export interface ConnectionPool<TDatabase> {
|
|
14
14
|
/** Acquire a connection from the pool */
|
|
15
|
-
connect(): Promise<Connection<
|
|
15
|
+
connect(): Promise<Connection<TDatabase>>;
|
|
16
16
|
/**
|
|
17
17
|
* Get the database instance synchronously. Only works if the pool has already been initialized
|
|
18
18
|
* via connect().
|
|
19
19
|
* @throws an error if called before the pool is initialized.
|
|
20
20
|
*/
|
|
21
|
-
getDatabaseSync():
|
|
21
|
+
getDatabaseSync(): TDatabase;
|
|
22
22
|
/** Close the pool and cleanup resources */
|
|
23
23
|
close(): Promise<void>;
|
|
24
24
|
}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
import SQLite from "better-sqlite3";
|
|
2
|
+
import { describe, expect, it } from "vitest";
|
|
3
|
+
import { SqlDriverAdapter } from "./sql-driver-adapter";
|
|
4
|
+
import type { GenericSQLPlugin } from "./query-executor/plugin";
|
|
5
|
+
import { sql } from "./sql";
|
|
6
|
+
import { SqliteDialect } from "kysely";
|
|
7
|
+
|
|
8
|
+
describe("better-sqlite3", () => {
|
|
9
|
+
it("Should be able to execute queries using better-sqlite3", async () => {
|
|
10
|
+
const dialect = new SqliteDialect({
|
|
11
|
+
database: new SQLite(":memory:"),
|
|
12
|
+
});
|
|
13
|
+
|
|
14
|
+
const adapter = new SqlDriverAdapter(dialect);
|
|
15
|
+
|
|
16
|
+
const query = sql`SELECT 5`.compile(dialect);
|
|
17
|
+
const result = await adapter.executeQuery(query);
|
|
18
|
+
expect(result.rows).toEqual([{ 5: 5 }]);
|
|
19
|
+
|
|
20
|
+
await adapter.destroy();
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
it("should execute queries in a transaction and commit", async () => {
|
|
24
|
+
const dialect = new SqliteDialect({
|
|
25
|
+
database: new SQLite(":memory:"),
|
|
26
|
+
});
|
|
27
|
+
const adapter = new SqlDriverAdapter(dialect);
|
|
28
|
+
|
|
29
|
+
// Create table outside transaction
|
|
30
|
+
await adapter.executeQuery(sql`CREATE TABLE test (id INTEGER, name TEXT)`.compile(dialect));
|
|
31
|
+
|
|
32
|
+
// Execute queries in transaction
|
|
33
|
+
await adapter.transaction(async (trx) => {
|
|
34
|
+
await trx.executeQuery(sql`INSERT INTO test VALUES (1, 'Alice')`.compile(dialect));
|
|
35
|
+
await trx.executeQuery(sql`INSERT INTO test VALUES (2, 'Bob')`.compile(dialect));
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
// Verify data persists after transaction
|
|
39
|
+
const result = await adapter.executeQuery(sql`SELECT * FROM test ORDER BY id`.compile(dialect));
|
|
40
|
+
expect(result.rows).toEqual([
|
|
41
|
+
{ id: 1, name: "Alice" },
|
|
42
|
+
{ id: 2, name: "Bob" },
|
|
43
|
+
]);
|
|
44
|
+
|
|
45
|
+
await adapter.destroy();
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
it("should rollback transaction on error", async () => {
|
|
49
|
+
const dialect = new SqliteDialect({
|
|
50
|
+
database: new SQLite(":memory:"),
|
|
51
|
+
});
|
|
52
|
+
const adapter = new SqlDriverAdapter(dialect);
|
|
53
|
+
|
|
54
|
+
// Create table outside transaction
|
|
55
|
+
await adapter.executeQuery(
|
|
56
|
+
sql`CREATE TABLE test (id INTEGER PRIMARY KEY, name TEXT)`.compile(dialect),
|
|
57
|
+
);
|
|
58
|
+
await adapter.executeQuery(sql`INSERT INTO test VALUES (1, 'Alice')`.compile(dialect));
|
|
59
|
+
|
|
60
|
+
// Try to execute queries in transaction with duplicate key error
|
|
61
|
+
await expect(
|
|
62
|
+
adapter.transaction(async (trx) => {
|
|
63
|
+
await trx.executeQuery(sql`INSERT INTO test VALUES (2, 'Bob')`.compile(dialect));
|
|
64
|
+
// This should cause a duplicate key error
|
|
65
|
+
await trx.executeQuery(sql`INSERT INTO test VALUES (1, 'Charlie')`.compile(dialect));
|
|
66
|
+
}),
|
|
67
|
+
).rejects.toThrow();
|
|
68
|
+
|
|
69
|
+
// Verify Bob was not inserted (transaction rolled back)
|
|
70
|
+
const result = await adapter.executeQuery(sql`SELECT * FROM test ORDER BY id`.compile(dialect));
|
|
71
|
+
expect(result.rows).toEqual([{ id: 1, name: "Alice" }]);
|
|
72
|
+
|
|
73
|
+
await adapter.destroy();
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
it("should support plugins that transform results", async () => {
|
|
77
|
+
const dialect = new SqliteDialect({
|
|
78
|
+
database: new SQLite(":memory:"),
|
|
79
|
+
});
|
|
80
|
+
const adapter = new SqlDriverAdapter(dialect);
|
|
81
|
+
|
|
82
|
+
// Create a plugin that adds metadata to results
|
|
83
|
+
const metadataPlugin: GenericSQLPlugin = {
|
|
84
|
+
async transformResult({ result }) {
|
|
85
|
+
return {
|
|
86
|
+
...result,
|
|
87
|
+
rows: result.rows.map((row) => ({
|
|
88
|
+
...(row as object),
|
|
89
|
+
__metadata: { transformed: true },
|
|
90
|
+
})),
|
|
91
|
+
};
|
|
92
|
+
},
|
|
93
|
+
};
|
|
94
|
+
|
|
95
|
+
const adapterWithPlugin = adapter.withPlugin(metadataPlugin);
|
|
96
|
+
|
|
97
|
+
await adapterWithPlugin.executeQuery(
|
|
98
|
+
sql`CREATE TABLE test (id INTEGER, name TEXT)`.compile(dialect),
|
|
99
|
+
);
|
|
100
|
+
await adapterWithPlugin.executeQuery(
|
|
101
|
+
sql`INSERT INTO test VALUES (1, 'Alice')`.compile(dialect),
|
|
102
|
+
);
|
|
103
|
+
|
|
104
|
+
const result = await adapterWithPlugin.executeQuery(sql`SELECT * FROM test`.compile(dialect));
|
|
105
|
+
|
|
106
|
+
expect(result.rows).toEqual([{ id: 1, name: "Alice", __metadata: { transformed: true } }]);
|
|
107
|
+
|
|
108
|
+
await adapter.destroy();
|
|
109
|
+
});
|
|
110
|
+
|
|
111
|
+
it("should properly destroy and release resources", async () => {
|
|
112
|
+
const dialect = new SqliteDialect({
|
|
113
|
+
database: new SQLite(":memory:"),
|
|
114
|
+
});
|
|
115
|
+
const adapter = new SqlDriverAdapter(dialect);
|
|
116
|
+
|
|
117
|
+
// Execute some queries
|
|
118
|
+
await adapter.executeQuery(sql`SELECT 1`.compile(dialect));
|
|
119
|
+
|
|
120
|
+
// Destroy should complete without error
|
|
121
|
+
await expect(adapter.destroy()).resolves.toBeUndefined();
|
|
122
|
+
|
|
123
|
+
// Multiple destroy calls should be safe
|
|
124
|
+
await expect(adapter.destroy()).resolves.toBeUndefined();
|
|
125
|
+
});
|
|
126
|
+
});
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { DatabaseConnection, Driver } from "../sql-driver";
|
|
2
|
+
|
|
3
|
+
export interface ConnectionProvider {
|
|
4
|
+
/**
|
|
5
|
+
* Provides a connection for the callback and takes care of disposing
|
|
6
|
+
* the connection after the callback has been run.
|
|
7
|
+
*/
|
|
8
|
+
provideConnection<T>(consumer: (connection: DatabaseConnection) => Promise<T>): Promise<T>;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export class DefaultConnectionProvider implements ConnectionProvider {
|
|
12
|
+
readonly #driver: Driver;
|
|
13
|
+
|
|
14
|
+
constructor(driver: Driver) {
|
|
15
|
+
this.#driver = driver;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
async provideConnection<T>(consumer: (connection: DatabaseConnection) => Promise<T>): Promise<T> {
|
|
19
|
+
const connection = await this.#driver.acquireConnection();
|
|
20
|
+
|
|
21
|
+
try {
|
|
22
|
+
return await consumer(connection);
|
|
23
|
+
} finally {
|
|
24
|
+
await this.#driver.releaseConnection(connection);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
}
|