@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,251 @@
|
|
|
1
|
+
import { describe, it, expect } from "vitest";
|
|
2
|
+
import { SQLiteSerializer } from "./sqlite-serializer";
|
|
3
|
+
import type { AnyColumn } from "../../../schema/create";
|
|
4
|
+
import { BetterSQLite3DriverConfig } from "../../../adapters/generic-sql/driver-config";
|
|
5
|
+
|
|
6
|
+
describe("SQLiteSerializer", () => {
|
|
7
|
+
const mockDriverConfig = new BetterSQLite3DriverConfig();
|
|
8
|
+
const serializer = new SQLiteSerializer(mockDriverConfig);
|
|
9
|
+
|
|
10
|
+
describe("serializeBigInt", () => {
|
|
11
|
+
describe("for internal-id and reference columns", () => {
|
|
12
|
+
it("should convert safe bigint to number for reference column", () => {
|
|
13
|
+
const col: AnyColumn = {
|
|
14
|
+
name: "userId",
|
|
15
|
+
type: "bigint",
|
|
16
|
+
role: "reference",
|
|
17
|
+
isNullable: false,
|
|
18
|
+
} as AnyColumn;
|
|
19
|
+
|
|
20
|
+
const result = serializer["serializeBigInt"](BigInt(123), col);
|
|
21
|
+
expect(result).toBe(123);
|
|
22
|
+
expect(typeof result).toBe("number");
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
it("should convert safe bigint to number for internal-id column", () => {
|
|
26
|
+
const col: AnyColumn = {
|
|
27
|
+
name: "_internalId",
|
|
28
|
+
type: "bigint",
|
|
29
|
+
role: "internal-id",
|
|
30
|
+
isNullable: false,
|
|
31
|
+
} as AnyColumn;
|
|
32
|
+
|
|
33
|
+
const result = serializer["serializeBigInt"](BigInt(456), col);
|
|
34
|
+
expect(result).toBe(456);
|
|
35
|
+
expect(typeof result).toBe("number");
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
it("should convert MAX_SAFE_INTEGER successfully", () => {
|
|
39
|
+
const col: AnyColumn = {
|
|
40
|
+
name: "userId",
|
|
41
|
+
type: "bigint",
|
|
42
|
+
role: "reference",
|
|
43
|
+
isNullable: false,
|
|
44
|
+
} as AnyColumn;
|
|
45
|
+
|
|
46
|
+
const maxSafe = BigInt(Number.MAX_SAFE_INTEGER);
|
|
47
|
+
const result = serializer["serializeBigInt"](maxSafe, col);
|
|
48
|
+
expect(result).toBe(Number.MAX_SAFE_INTEGER);
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
it("should convert negative MAX_SAFE_INTEGER successfully", () => {
|
|
52
|
+
const col: AnyColumn = {
|
|
53
|
+
name: "userId",
|
|
54
|
+
type: "bigint",
|
|
55
|
+
role: "reference",
|
|
56
|
+
isNullable: false,
|
|
57
|
+
} as AnyColumn;
|
|
58
|
+
|
|
59
|
+
const minSafe = BigInt(-Number.MAX_SAFE_INTEGER);
|
|
60
|
+
const result = serializer["serializeBigInt"](minSafe, col);
|
|
61
|
+
expect(result).toBe(-Number.MAX_SAFE_INTEGER);
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
it("should throw RangeError when bigint exceeds MAX_SAFE_INTEGER for reference column", () => {
|
|
65
|
+
const col: AnyColumn = {
|
|
66
|
+
name: "userId",
|
|
67
|
+
type: "bigint",
|
|
68
|
+
role: "reference",
|
|
69
|
+
isNullable: false,
|
|
70
|
+
} as AnyColumn;
|
|
71
|
+
|
|
72
|
+
const tooBig = BigInt(Number.MAX_SAFE_INTEGER) + BigInt(1);
|
|
73
|
+
|
|
74
|
+
expect(() => serializer["serializeBigInt"](tooBig, col)).toThrow(RangeError);
|
|
75
|
+
expect(() => serializer["serializeBigInt"](tooBig, col)).toThrow(
|
|
76
|
+
/Cannot serialize bigint value.*exceeds Number\.MAX_SAFE_INTEGER/,
|
|
77
|
+
);
|
|
78
|
+
expect(() => serializer["serializeBigInt"](tooBig, col)).toThrow(/userId/);
|
|
79
|
+
});
|
|
80
|
+
|
|
81
|
+
it("should throw RangeError when bigint is less than -MAX_SAFE_INTEGER for internal-id column", () => {
|
|
82
|
+
const col: AnyColumn = {
|
|
83
|
+
name: "_internalId",
|
|
84
|
+
type: "bigint",
|
|
85
|
+
role: "internal-id",
|
|
86
|
+
isNullable: false,
|
|
87
|
+
} as AnyColumn;
|
|
88
|
+
|
|
89
|
+
const tooSmall = BigInt(-Number.MAX_SAFE_INTEGER) - BigInt(1);
|
|
90
|
+
|
|
91
|
+
expect(() => serializer["serializeBigInt"](tooSmall, col)).toThrow(RangeError);
|
|
92
|
+
expect(() => serializer["serializeBigInt"](tooSmall, col)).toThrow(
|
|
93
|
+
/Cannot serialize bigint value.*exceeds Number\.MAX_SAFE_INTEGER/,
|
|
94
|
+
);
|
|
95
|
+
expect(() => serializer["serializeBigInt"](tooSmall, col)).toThrow(/_internalId/);
|
|
96
|
+
});
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
describe("for regular bigint columns", () => {
|
|
100
|
+
it("should convert to Buffer for regular bigint column", () => {
|
|
101
|
+
const col: AnyColumn = {
|
|
102
|
+
name: "largeNumber",
|
|
103
|
+
type: "bigint",
|
|
104
|
+
role: "regular",
|
|
105
|
+
isNullable: false,
|
|
106
|
+
} as AnyColumn;
|
|
107
|
+
|
|
108
|
+
const result = serializer["serializeBigInt"](BigInt(789), col);
|
|
109
|
+
expect(result).toBeInstanceOf(Buffer);
|
|
110
|
+
expect((result as Buffer).length).toBe(8);
|
|
111
|
+
});
|
|
112
|
+
|
|
113
|
+
it("should handle large values outside safe integer range as Buffer", () => {
|
|
114
|
+
const col: AnyColumn = {
|
|
115
|
+
name: "largeNumber",
|
|
116
|
+
type: "bigint",
|
|
117
|
+
role: "regular",
|
|
118
|
+
isNullable: false,
|
|
119
|
+
} as AnyColumn;
|
|
120
|
+
|
|
121
|
+
const veryLarge = BigInt(Number.MAX_SAFE_INTEGER) + BigInt(1000);
|
|
122
|
+
const result = serializer["serializeBigInt"](veryLarge, col);
|
|
123
|
+
|
|
124
|
+
expect(result).toBeInstanceOf(Buffer);
|
|
125
|
+
// Verify round-trip
|
|
126
|
+
const deserialized = (result as Buffer).readBigInt64BE(0);
|
|
127
|
+
expect(deserialized).toBe(veryLarge);
|
|
128
|
+
});
|
|
129
|
+
});
|
|
130
|
+
});
|
|
131
|
+
|
|
132
|
+
describe("other serialization methods", () => {
|
|
133
|
+
it("should serialize Date to timestamp number", () => {
|
|
134
|
+
const date = new Date("2024-01-01T00:00:00Z");
|
|
135
|
+
const result = serializer["serializeDate"](date);
|
|
136
|
+
expect(result).toBe(date.getTime());
|
|
137
|
+
expect(typeof result).toBe("number");
|
|
138
|
+
});
|
|
139
|
+
|
|
140
|
+
it("should serialize boolean to 0/1", () => {
|
|
141
|
+
expect(serializer["serializeBoolean"](true)).toBe(1);
|
|
142
|
+
expect(serializer["serializeBoolean"](false)).toBe(0);
|
|
143
|
+
});
|
|
144
|
+
|
|
145
|
+
it("should serialize JSON to string", () => {
|
|
146
|
+
const obj = { foo: "bar", num: 42 };
|
|
147
|
+
const result = serializer["serializeJson"](obj);
|
|
148
|
+
expect(result).toBe(JSON.stringify(obj));
|
|
149
|
+
expect(typeof result).toBe("string");
|
|
150
|
+
});
|
|
151
|
+
});
|
|
152
|
+
|
|
153
|
+
describe("deserializeBinary", () => {
|
|
154
|
+
it("should deserialize Buffer to Uint8Array", () => {
|
|
155
|
+
const buffer = Buffer.from([1, 2, 3, 4]);
|
|
156
|
+
const result = serializer["deserializeBinary"](buffer);
|
|
157
|
+
expect(result).toBeInstanceOf(Uint8Array);
|
|
158
|
+
expect(Array.from(result)).toEqual([1, 2, 3, 4]);
|
|
159
|
+
});
|
|
160
|
+
|
|
161
|
+
it("should deserialize Uint8Array directly", () => {
|
|
162
|
+
const uint8 = new Uint8Array([5, 6, 7, 8]);
|
|
163
|
+
const result = serializer["deserializeBinary"](uint8);
|
|
164
|
+
expect(result).toBeInstanceOf(Uint8Array);
|
|
165
|
+
expect(result).toBe(uint8);
|
|
166
|
+
});
|
|
167
|
+
|
|
168
|
+
it("should deserialize ArrayBuffer to Uint8Array", () => {
|
|
169
|
+
const arrayBuffer = new ArrayBuffer(4);
|
|
170
|
+
const view = new Uint8Array(arrayBuffer);
|
|
171
|
+
view.set([9, 10, 11, 12]);
|
|
172
|
+
const result = serializer["deserializeBinary"](arrayBuffer);
|
|
173
|
+
expect(result).toBeInstanceOf(Uint8Array);
|
|
174
|
+
expect(Array.from(result)).toEqual([9, 10, 11, 12]);
|
|
175
|
+
});
|
|
176
|
+
|
|
177
|
+
it("should throw error for invalid binary value", () => {
|
|
178
|
+
expect(() => serializer["deserializeBinary"]("not binary")).toThrow(
|
|
179
|
+
/Cannot deserialize binary/,
|
|
180
|
+
);
|
|
181
|
+
});
|
|
182
|
+
});
|
|
183
|
+
|
|
184
|
+
describe("deserializeInteger", () => {
|
|
185
|
+
it("should deserialize number directly", () => {
|
|
186
|
+
expect(serializer["deserializeInteger"](42)).toBe(42);
|
|
187
|
+
});
|
|
188
|
+
|
|
189
|
+
it("should deserialize string to number", () => {
|
|
190
|
+
expect(serializer["deserializeInteger"]("123")).toBe(123);
|
|
191
|
+
});
|
|
192
|
+
|
|
193
|
+
it("should deserialize bigint to number when safe", () => {
|
|
194
|
+
expect(serializer["deserializeInteger"](BigInt(456))).toBe(456);
|
|
195
|
+
});
|
|
196
|
+
|
|
197
|
+
it("should throw error when bigint exceeds safe range", () => {
|
|
198
|
+
const tooBig = BigInt(Number.MAX_SAFE_INTEGER) + BigInt(1);
|
|
199
|
+
expect(() => serializer["deserializeInteger"](tooBig)).toThrow(RangeError);
|
|
200
|
+
expect(() => serializer["deserializeInteger"](tooBig)).toThrow(/exceeds safe integer range/);
|
|
201
|
+
});
|
|
202
|
+
|
|
203
|
+
it("should throw error for invalid string", () => {
|
|
204
|
+
expect(() => serializer["deserializeInteger"]("not a number")).toThrow(
|
|
205
|
+
/Cannot deserialize integer from invalid string/,
|
|
206
|
+
);
|
|
207
|
+
});
|
|
208
|
+
|
|
209
|
+
it("should throw error for invalid type", () => {
|
|
210
|
+
expect(() => serializer["deserializeInteger"](null)).toThrow(
|
|
211
|
+
/Cannot deserialize integer from value/,
|
|
212
|
+
);
|
|
213
|
+
});
|
|
214
|
+
});
|
|
215
|
+
|
|
216
|
+
describe("deserializeDecimal", () => {
|
|
217
|
+
it("should deserialize number directly", () => {
|
|
218
|
+
expect(serializer["deserializeDecimal"](3.14)).toBe(3.14);
|
|
219
|
+
});
|
|
220
|
+
|
|
221
|
+
it("should deserialize string to number", () => {
|
|
222
|
+
expect(serializer["deserializeDecimal"]("3.14")).toBe(3.14);
|
|
223
|
+
expect(serializer["deserializeDecimal"]("123.456")).toBe(123.456);
|
|
224
|
+
expect(serializer["deserializeDecimal"]("-99.99")).toBe(-99.99);
|
|
225
|
+
});
|
|
226
|
+
|
|
227
|
+
it("should throw error for invalid string", () => {
|
|
228
|
+
expect(() => serializer["deserializeDecimal"]("not a number")).toThrow(
|
|
229
|
+
/Cannot deserialize decimal from invalid string/,
|
|
230
|
+
);
|
|
231
|
+
});
|
|
232
|
+
|
|
233
|
+
it("should throw error for invalid type", () => {
|
|
234
|
+
expect(() => serializer["deserializeDecimal"](null)).toThrow(
|
|
235
|
+
/Cannot deserialize decimal from value/,
|
|
236
|
+
);
|
|
237
|
+
});
|
|
238
|
+
});
|
|
239
|
+
|
|
240
|
+
describe("deserializeString", () => {
|
|
241
|
+
it("should deserialize string directly", () => {
|
|
242
|
+
expect(serializer["deserializeString"]("hello")).toBe("hello");
|
|
243
|
+
});
|
|
244
|
+
|
|
245
|
+
it("should throw error for non-string", () => {
|
|
246
|
+
expect(() => serializer["deserializeString"](123)).toThrow(
|
|
247
|
+
/Cannot deserialize string from value/,
|
|
248
|
+
);
|
|
249
|
+
});
|
|
250
|
+
});
|
|
251
|
+
});
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
import type { AnyColumn } from "../../../schema/create";
|
|
2
|
+
import { SQLSerializer } from "../sql-serializer";
|
|
3
|
+
import type { DriverConfig } from "../../../adapters/generic-sql/driver-config";
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* SQLite-specific serializer.
|
|
7
|
+
*
|
|
8
|
+
* SQLite has limited native type support and requires conversions:
|
|
9
|
+
* - JSON → strings (no native JSON support)
|
|
10
|
+
* - Dates → numbers (timestamps)
|
|
11
|
+
* - Booleans → 0/1
|
|
12
|
+
* - BigInts → Buffer (except for internal-id and reference columns → number)
|
|
13
|
+
* - Numbers/strings → Date for timestamps/dates
|
|
14
|
+
*/
|
|
15
|
+
export class SQLiteSerializer extends SQLSerializer {
|
|
16
|
+
constructor(driverConfig: DriverConfig) {
|
|
17
|
+
super(driverConfig);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
protected serializeDate(value: Date): number {
|
|
21
|
+
return value.getTime();
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
protected serializeBoolean(value: boolean): number {
|
|
25
|
+
return value ? 1 : 0;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
protected serializeBigInt(value: bigint, col: AnyColumn): number | Buffer {
|
|
29
|
+
// SQLite special case: internal-id and reference columns use integer, not blob
|
|
30
|
+
// These should be converted to numbers for SQLite
|
|
31
|
+
if (col.role === "reference" || col.role === "internal-id") {
|
|
32
|
+
// Check if the bigint is within the safe integer range to avoid precision loss
|
|
33
|
+
if (Math.abs(Number(value)) > Number.MAX_SAFE_INTEGER) {
|
|
34
|
+
throw new RangeError(
|
|
35
|
+
`Cannot serialize bigint value ${value} for column "${col.name}": ` +
|
|
36
|
+
`value exceeds Number.MAX_SAFE_INTEGER (${Number.MAX_SAFE_INTEGER}). ` +
|
|
37
|
+
`SQLite reference and internal-id columns use INTEGER type which requires values ` +
|
|
38
|
+
`to fit within JavaScript's safe integer range.`,
|
|
39
|
+
);
|
|
40
|
+
}
|
|
41
|
+
return Number(value);
|
|
42
|
+
}
|
|
43
|
+
const buf = Buffer.alloc(8);
|
|
44
|
+
buf.writeBigInt64BE(value);
|
|
45
|
+
return buf;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
protected deserializeDate(value: unknown): Date {
|
|
49
|
+
if (value instanceof Date) {
|
|
50
|
+
return value;
|
|
51
|
+
}
|
|
52
|
+
if (typeof value === "number" || typeof value === "string") {
|
|
53
|
+
return new Date(value);
|
|
54
|
+
}
|
|
55
|
+
throw new Error(`Cannot deserialize date from value: ${value}`);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
protected deserializeBoolean(value: unknown): boolean {
|
|
59
|
+
if (typeof value === "boolean") {
|
|
60
|
+
return value;
|
|
61
|
+
}
|
|
62
|
+
if (typeof value === "number") {
|
|
63
|
+
return value === 1;
|
|
64
|
+
}
|
|
65
|
+
throw new Error(`Cannot deserialize boolean from value: ${value}`);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
protected deserializeBigInt(value: unknown): bigint {
|
|
69
|
+
if (typeof value === "bigint") {
|
|
70
|
+
return value;
|
|
71
|
+
}
|
|
72
|
+
if (value instanceof Buffer) {
|
|
73
|
+
return value.readBigInt64BE(0);
|
|
74
|
+
}
|
|
75
|
+
if (typeof value === "string") {
|
|
76
|
+
return BigInt(value);
|
|
77
|
+
}
|
|
78
|
+
if (typeof value === "number") {
|
|
79
|
+
return BigInt(value);
|
|
80
|
+
}
|
|
81
|
+
throw new Error(`Cannot deserialize bigint from value: ${value}`);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
protected serializeJson(value: unknown): string {
|
|
85
|
+
// SQLite doesn't support native JSON, so we stringify
|
|
86
|
+
return JSON.stringify(value);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
protected deserializeJson(value: unknown): unknown {
|
|
90
|
+
// SQLite stores JSON as strings, so we need to parse
|
|
91
|
+
if (typeof value !== "string") {
|
|
92
|
+
throw new Error(`Expected JSON string but got ${typeof value}`);
|
|
93
|
+
}
|
|
94
|
+
return JSON.parse(value);
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
protected deserializeBinary(value: unknown): Uint8Array {
|
|
98
|
+
// SQLite can return Buffer or Uint8Array for BLOB columns
|
|
99
|
+
if (value instanceof Buffer) {
|
|
100
|
+
return new Uint8Array(value.buffer, value.byteOffset, value.byteLength);
|
|
101
|
+
}
|
|
102
|
+
if (value instanceof Uint8Array) {
|
|
103
|
+
return value;
|
|
104
|
+
}
|
|
105
|
+
if (value instanceof ArrayBuffer) {
|
|
106
|
+
return new Uint8Array(value);
|
|
107
|
+
}
|
|
108
|
+
throw new Error(`Cannot deserialize binary from value: ${typeof value}`);
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
protected deserializeInteger(value: unknown): number {
|
|
112
|
+
if (typeof value === "number") {
|
|
113
|
+
return value;
|
|
114
|
+
}
|
|
115
|
+
// SQLite may return integers as strings for large values
|
|
116
|
+
if (typeof value === "string") {
|
|
117
|
+
const num = Number(value);
|
|
118
|
+
if (isNaN(num)) {
|
|
119
|
+
throw new Error(`Cannot deserialize integer from invalid string: ${value}`);
|
|
120
|
+
}
|
|
121
|
+
return num;
|
|
122
|
+
}
|
|
123
|
+
// SQLite may return bigint for large integers
|
|
124
|
+
if (typeof value === "bigint") {
|
|
125
|
+
if (value > Number.MAX_SAFE_INTEGER || value < Number.MIN_SAFE_INTEGER) {
|
|
126
|
+
throw new RangeError(
|
|
127
|
+
`Cannot deserialize integer value ${value}: exceeds safe integer range`,
|
|
128
|
+
);
|
|
129
|
+
}
|
|
130
|
+
return Number(value);
|
|
131
|
+
}
|
|
132
|
+
throw new Error(`Cannot deserialize integer from value: ${typeof value}`);
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
protected deserializeDecimal(value: unknown): number {
|
|
136
|
+
// SQLite stores decimals as REAL (floating point) or TEXT
|
|
137
|
+
if (typeof value === "number") {
|
|
138
|
+
return value;
|
|
139
|
+
}
|
|
140
|
+
if (typeof value === "string") {
|
|
141
|
+
const num = parseFloat(value);
|
|
142
|
+
if (isNaN(num)) {
|
|
143
|
+
throw new Error(`Cannot deserialize decimal from invalid string: ${value}`);
|
|
144
|
+
}
|
|
145
|
+
return num;
|
|
146
|
+
}
|
|
147
|
+
throw new Error(`Cannot deserialize decimal from value: ${typeof value}`);
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
protected deserializeString(value: unknown): string {
|
|
151
|
+
if (typeof value === "string") {
|
|
152
|
+
return value;
|
|
153
|
+
}
|
|
154
|
+
throw new Error(`Cannot deserialize string from value: ${typeof value}`);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
import type { DriverConfig } from "../../adapters/generic-sql/driver-config";
|
|
2
|
+
import type { AnyColumn } from "../../schema/create";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Abstract base class for SQL value serialization/deserialization.
|
|
6
|
+
*
|
|
7
|
+
* Similar to SQLTypeMapper, this class provides a framework for converting values
|
|
8
|
+
* between application format and database format. Each database dialect extends
|
|
9
|
+
* this class and implements abstract methods for dialect-specific conversions.
|
|
10
|
+
*
|
|
11
|
+
* Handles:
|
|
12
|
+
* - Type conversions (Date, boolean, BigInt, etc.)
|
|
13
|
+
* - JSON handling (delegated to dialect-specific implementations)
|
|
14
|
+
* - Binary data conversion (Uint8Array ↔ Buffer)
|
|
15
|
+
*/
|
|
16
|
+
export abstract class SQLSerializer {
|
|
17
|
+
protected readonly driverConfig: DriverConfig;
|
|
18
|
+
|
|
19
|
+
constructor(driverConfig: DriverConfig) {
|
|
20
|
+
this.driverConfig = driverConfig;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Deserialize a value from database format to application format.
|
|
25
|
+
*
|
|
26
|
+
* @param value - The raw database value
|
|
27
|
+
* @param col - The column schema definition
|
|
28
|
+
* @returns The deserialized value in application format
|
|
29
|
+
* @throws Error if value cannot be deserialized to the expected type
|
|
30
|
+
*/
|
|
31
|
+
deserialize(value: unknown, col: AnyColumn): unknown {
|
|
32
|
+
if (value === null) {
|
|
33
|
+
return null;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
// Handle JSON deserialization (delegated to subclass)
|
|
37
|
+
if (col.type === "json") {
|
|
38
|
+
return this.deserializeJson(value);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
// Handle date/timestamp deserialization
|
|
42
|
+
if (col.type === "timestamp" || col.type === "date") {
|
|
43
|
+
return this.deserializeDate(value);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
// Handle boolean deserialization
|
|
47
|
+
if (col.type === "bool") {
|
|
48
|
+
return this.deserializeBoolean(value);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
// Handle bigint deserialization
|
|
52
|
+
if (col.type === "bigint") {
|
|
53
|
+
return this.deserializeBigInt(value);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// Handle binary deserialization (delegated to subclass for driver flexibility)
|
|
57
|
+
if (col.type === "binary") {
|
|
58
|
+
return this.deserializeBinary(value);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// Handle integer deserialization (delegated to subclass - drivers may return string/bigint)
|
|
62
|
+
if (col.type === "integer") {
|
|
63
|
+
return this.deserializeInteger(value);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
// Handle decimal deserialization (delegated to subclass for driver flexibility)
|
|
67
|
+
if (col.type === "decimal") {
|
|
68
|
+
return this.deserializeDecimal(value);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
// Handle string/varchar deserialization (delegated to subclass for consistency)
|
|
72
|
+
if (col.type === "string" || (typeof col.type === "string" && col.type.startsWith("varchar"))) {
|
|
73
|
+
return this.deserializeString(value);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
throw new Error(`Unsupported column type for deserialization: ${col.type}`);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* Serialize a value from application format to database format.
|
|
81
|
+
*
|
|
82
|
+
* Note: This method expects FragnoId/FragnoReference objects to be resolved
|
|
83
|
+
* to primitive values before calling. Use resolveFragnoIdValue() from
|
|
84
|
+
* value-encoding.ts for this purpose.
|
|
85
|
+
*
|
|
86
|
+
* @param value - The application value to serialize (should not be FragnoId/FragnoReference)
|
|
87
|
+
* @param col - The column schema definition
|
|
88
|
+
* @param skipDriverConversions - Skip driver-level type conversions (Date->number, boolean->0/1, bigint->Buffer).
|
|
89
|
+
* Set to true when using ORMs like Drizzle that handle these conversions internally.
|
|
90
|
+
* @returns The serialized value in database format
|
|
91
|
+
*/
|
|
92
|
+
serialize(value: unknown, col: AnyColumn, skipDriverConversions = false): unknown {
|
|
93
|
+
if (value === null) {
|
|
94
|
+
return null;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
// Handle JSON serialization (delegated to subclass)
|
|
98
|
+
if (col.type === "json") {
|
|
99
|
+
return this.serializeJson(value);
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
// Skip driver-specific type conversions when using ORMs that handle them internally
|
|
103
|
+
if (!skipDriverConversions) {
|
|
104
|
+
// Handle date/timestamp serialization
|
|
105
|
+
if (value instanceof Date) {
|
|
106
|
+
return this.serializeDate(value);
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
// Handle boolean serialization
|
|
110
|
+
if (typeof value === "boolean") {
|
|
111
|
+
return this.serializeBoolean(value);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
// Handle bigint serialization
|
|
115
|
+
if (typeof value === "bigint") {
|
|
116
|
+
return this.serializeBigInt(value, col);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
// Handle binary serialization (most drivers accept Buffer)
|
|
121
|
+
if (col.type === "binary" && value instanceof Uint8Array) {
|
|
122
|
+
return Buffer.from(value);
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
return value;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
// Abstract methods for dialect-specific serialization
|
|
129
|
+
protected abstract serializeDate(value: Date): Date | number;
|
|
130
|
+
protected abstract serializeBoolean(value: boolean): boolean | number;
|
|
131
|
+
protected abstract serializeBigInt(value: bigint, col: AnyColumn): bigint | number | Buffer;
|
|
132
|
+
protected abstract serializeJson(value: unknown): unknown;
|
|
133
|
+
|
|
134
|
+
// Abstract methods for dialect-specific deserialization
|
|
135
|
+
protected abstract deserializeDate(value: unknown): Date;
|
|
136
|
+
protected abstract deserializeBoolean(value: unknown): boolean;
|
|
137
|
+
protected abstract deserializeBigInt(value: unknown): bigint;
|
|
138
|
+
protected abstract deserializeJson(value: unknown): unknown;
|
|
139
|
+
protected abstract deserializeBinary(value: unknown): Uint8Array;
|
|
140
|
+
protected abstract deserializeInteger(value: unknown): number;
|
|
141
|
+
protected abstract deserializeDecimal(value: unknown): number;
|
|
142
|
+
protected abstract deserializeString(value: unknown): string;
|
|
143
|
+
}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import type { IdColumn, AnySchema, AnyTable, Relation, FragnoId } from "../schema/create";
|
|
2
2
|
import type { Condition, ConditionBuilder } from "./condition-builder";
|
|
3
3
|
import type {
|
|
4
|
-
|
|
4
|
+
TypedUnitOfWork,
|
|
5
5
|
FindBuilder,
|
|
6
6
|
UpdateBuilder,
|
|
7
7
|
DeleteBuilder,
|
|
8
8
|
UpdateManyBuilder,
|
|
9
|
-
} from "./unit-of-work";
|
|
9
|
+
} from "./unit-of-work/unit-of-work";
|
|
10
10
|
import type { Prettify } from "../util/types";
|
|
11
11
|
import type { CursorResult } from "./cursor";
|
|
12
12
|
|
|
@@ -132,7 +132,7 @@ export type FindManyOptions<
|
|
|
132
132
|
}
|
|
133
133
|
: {});
|
|
134
134
|
|
|
135
|
-
export interface
|
|
135
|
+
export interface SimpleQueryInterface<TSchema extends AnySchema, TUOWConfig = void> {
|
|
136
136
|
/**
|
|
137
137
|
* Find multiple records using a builder pattern
|
|
138
138
|
*/
|
|
@@ -258,5 +258,5 @@ export interface AbstractQuery<TSchema extends AnySchema, TUOWConfig = void> {
|
|
|
258
258
|
/**
|
|
259
259
|
* Create a Unit of Work bound to this query engine
|
|
260
260
|
*/
|
|
261
|
-
createUnitOfWork: (name?: string, config?: TUOWConfig) =>
|
|
261
|
+
createUnitOfWork: (name?: string, config?: TUOWConfig) => TypedUnitOfWork<TSchema, [], unknown>;
|
|
262
262
|
}
|