@fragno-dev/db 0.1.15 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-build.log +242 -179
- package/CHANGELOG.md +23 -0
- package/README.md +123 -8
- package/dist/adapters/adapters.d.ts +5 -5
- package/dist/adapters/adapters.d.ts.map +1 -1
- package/dist/adapters/adapters.js.map +1 -1
- package/dist/adapters/drizzle/drizzle-adapter.d.ts +6 -21
- package/dist/adapters/drizzle/drizzle-adapter.d.ts.map +1 -1
- package/dist/adapters/drizzle/drizzle-adapter.js +7 -54
- package/dist/adapters/drizzle/drizzle-adapter.js.map +1 -1
- package/dist/adapters/drizzle/generate.d.ts +3 -0
- package/dist/adapters/drizzle/generate.d.ts.map +1 -1
- package/dist/adapters/drizzle/generate.js +36 -28
- package/dist/adapters/drizzle/generate.js.map +1 -1
- package/dist/adapters/generic-sql/driver-config.d.ts +74 -0
- package/dist/adapters/generic-sql/driver-config.d.ts.map +1 -0
- package/dist/adapters/generic-sql/driver-config.js +94 -0
- package/dist/adapters/generic-sql/driver-config.js.map +1 -0
- package/dist/adapters/generic-sql/generic-sql-adapter.d.ts +43 -0
- package/dist/adapters/generic-sql/generic-sql-adapter.d.ts.map +1 -0
- package/dist/adapters/generic-sql/generic-sql-adapter.js +87 -0
- package/dist/adapters/generic-sql/generic-sql-adapter.js.map +1 -0
- package/dist/adapters/generic-sql/generic-sql-uow-executor.js +67 -0
- package/dist/adapters/generic-sql/generic-sql-uow-executor.js.map +1 -0
- package/dist/adapters/generic-sql/migration/cold-kysely.js +33 -0
- package/dist/adapters/generic-sql/migration/cold-kysely.js.map +1 -0
- package/dist/adapters/generic-sql/migration/dialect/mysql.js +60 -0
- package/dist/adapters/generic-sql/migration/dialect/mysql.js.map +1 -0
- package/dist/adapters/generic-sql/migration/dialect/postgres.js +59 -0
- package/dist/adapters/generic-sql/migration/dialect/postgres.js.map +1 -0
- package/dist/adapters/generic-sql/migration/dialect/sqlite.js +96 -0
- package/dist/adapters/generic-sql/migration/dialect/sqlite.js.map +1 -0
- package/dist/adapters/generic-sql/migration/executor.d.ts +15 -0
- package/dist/adapters/generic-sql/migration/executor.d.ts.map +1 -0
- package/dist/adapters/generic-sql/migration/executor.js +18 -0
- package/dist/adapters/generic-sql/migration/executor.js.map +1 -0
- package/dist/adapters/generic-sql/migration/prepared-migrations.d.ts +66 -0
- package/dist/adapters/generic-sql/migration/prepared-migrations.d.ts.map +1 -0
- package/dist/adapters/generic-sql/migration/prepared-migrations.js +68 -0
- package/dist/adapters/generic-sql/migration/prepared-migrations.js.map +1 -0
- package/dist/adapters/generic-sql/migration/sql-generator.js +212 -0
- package/dist/adapters/generic-sql/migration/sql-generator.js.map +1 -0
- package/dist/adapters/generic-sql/query/create-sql-query-compiler.js +32 -0
- package/dist/adapters/generic-sql/query/create-sql-query-compiler.js.map +1 -0
- package/dist/adapters/generic-sql/query/cursor-utils.js +37 -0
- package/dist/adapters/generic-sql/query/cursor-utils.js.map +1 -0
- package/dist/adapters/generic-sql/query/dialect/mysql.js +33 -0
- package/dist/adapters/generic-sql/query/dialect/mysql.js.map +1 -0
- package/dist/adapters/generic-sql/query/dialect/postgres.js +32 -0
- package/dist/adapters/generic-sql/query/dialect/postgres.js.map +1 -0
- package/dist/adapters/generic-sql/query/dialect/sqlite.js +32 -0
- package/dist/adapters/generic-sql/query/dialect/sqlite.js.map +1 -0
- package/dist/adapters/generic-sql/query/generic-sql-uow-operation-compiler.js +152 -0
- package/dist/adapters/generic-sql/query/generic-sql-uow-operation-compiler.js.map +1 -0
- package/dist/adapters/generic-sql/query/select-builder.js +69 -0
- package/dist/adapters/generic-sql/query/select-builder.js.map +1 -0
- package/dist/adapters/generic-sql/query/sql-query-compiler.js +145 -0
- package/dist/adapters/generic-sql/query/sql-query-compiler.js.map +1 -0
- package/dist/adapters/generic-sql/query/where-builder.js +129 -0
- package/dist/adapters/generic-sql/query/where-builder.js.map +1 -0
- package/dist/adapters/generic-sql/result-interpreter.js +74 -0
- package/dist/adapters/generic-sql/result-interpreter.js.map +1 -0
- package/dist/adapters/generic-sql/uow-decoder.js +105 -0
- package/dist/adapters/generic-sql/uow-decoder.js.map +1 -0
- package/dist/adapters/generic-sql/uow-encoder.js +93 -0
- package/dist/adapters/generic-sql/uow-encoder.js.map +1 -0
- package/dist/adapters/kysely/kysely-adapter.d.ts +5 -18
- package/dist/adapters/kysely/kysely-adapter.d.ts.map +1 -1
- package/dist/adapters/kysely/kysely-adapter.js +6 -165
- package/dist/adapters/kysely/kysely-adapter.js.map +1 -1
- package/dist/adapters/{drizzle/drizzle-query.js → shared/from-unit-of-work-compiler.js} +47 -61
- package/dist/adapters/shared/from-unit-of-work-compiler.js.map +1 -0
- package/dist/adapters/{drizzle/shared.d.ts → shared/table-name-mapper.d.ts} +2 -4
- package/dist/adapters/shared/table-name-mapper.d.ts.map +1 -0
- package/dist/adapters/shared/table-name-mapper.js +43 -0
- package/dist/adapters/shared/table-name-mapper.js.map +1 -0
- package/dist/adapters/shared/uow-operation-compiler.js +105 -0
- package/dist/adapters/shared/uow-operation-compiler.js.map +1 -0
- package/dist/db-fragment-definition-builder.d.ts +53 -19
- package/dist/db-fragment-definition-builder.d.ts.map +1 -1
- package/dist/db-fragment-definition-builder.js +89 -19
- package/dist/db-fragment-definition-builder.js.map +1 -1
- package/dist/fragments/internal-fragment.d.ts +39 -5
- package/dist/fragments/internal-fragment.d.ts.map +1 -1
- package/dist/fragments/internal-fragment.js +82 -10
- package/dist/fragments/internal-fragment.js.map +1 -1
- package/dist/hooks/hooks.d.ts +51 -0
- package/dist/hooks/hooks.d.ts.map +1 -0
- package/dist/hooks/hooks.js +88 -0
- package/dist/hooks/hooks.js.map +1 -0
- package/dist/migration-engine/generation-engine.d.ts +0 -2
- package/dist/migration-engine/generation-engine.d.ts.map +1 -1
- package/dist/migration-engine/generation-engine.js +23 -61
- package/dist/migration-engine/generation-engine.js.map +1 -1
- package/dist/mod.d.ts +34 -10
- package/dist/mod.d.ts.map +1 -1
- package/dist/mod.js +47 -16
- package/dist/mod.js.map +1 -1
- package/dist/node_modules/.pnpm/{rou3@0.7.8 → rou3@0.7.10}/node_modules/rou3/dist/index.js +1 -1
- package/dist/node_modules/.pnpm/rou3@0.7.10/node_modules/rou3/dist/index.js.map +1 -0
- package/dist/packages/fragno/dist/api/fragment-instantiator.js +69 -31
- package/dist/packages/fragno/dist/api/fragment-instantiator.js.map +1 -1
- package/dist/query/column-defaults.js +27 -0
- package/dist/query/column-defaults.js.map +1 -0
- package/dist/query/cursor.d.ts +4 -4
- package/dist/query/cursor.d.ts.map +1 -1
- package/dist/query/cursor.js +8 -6
- package/dist/query/cursor.js.map +1 -1
- package/dist/query/orm/orm.d.ts +1 -1
- package/dist/query/orm/orm.js.map +1 -1
- package/dist/query/serialize/create-sql-serializer.js +30 -0
- package/dist/query/serialize/create-sql-serializer.js.map +1 -0
- package/dist/query/serialize/dialect/mysql-serializer.js +87 -0
- package/dist/query/serialize/dialect/mysql-serializer.js.map +1 -0
- package/dist/query/serialize/dialect/postgres-serializer.js +80 -0
- package/dist/query/serialize/dialect/postgres-serializer.js.map +1 -0
- package/dist/query/serialize/dialect/sqlite-serializer.js +93 -0
- package/dist/query/serialize/dialect/sqlite-serializer.js.map +1 -0
- package/dist/query/serialize/sql-serializer.js +67 -0
- package/dist/query/serialize/sql-serializer.js.map +1 -0
- package/dist/query/{query.d.ts → simple-query-interface.d.ts} +5 -5
- package/dist/query/simple-query-interface.d.ts.map +1 -0
- package/dist/query/{execute-unit-of-work.d.ts → unit-of-work/execute-unit-of-work.d.ts} +13 -3
- package/dist/query/unit-of-work/execute-unit-of-work.d.ts.map +1 -0
- package/dist/query/{execute-unit-of-work.js → unit-of-work/execute-unit-of-work.js} +17 -4
- package/dist/query/unit-of-work/execute-unit-of-work.js.map +1 -0
- package/dist/query/{retry-policy.d.ts → unit-of-work/retry-policy.d.ts} +1 -1
- package/dist/query/unit-of-work/retry-policy.d.ts.map +1 -0
- package/dist/query/{retry-policy.js → unit-of-work/retry-policy.js} +1 -1
- package/dist/query/unit-of-work/retry-policy.js.map +1 -0
- package/dist/query/{unit-of-work.d.ts → unit-of-work/unit-of-work.d.ts} +51 -18
- package/dist/query/unit-of-work/unit-of-work.d.ts.map +1 -0
- package/dist/query/{unit-of-work.js → unit-of-work/unit-of-work.js} +58 -11
- package/dist/query/unit-of-work/unit-of-work.js.map +1 -0
- package/dist/query/value-decoding.js +71 -0
- package/dist/query/value-decoding.js.map +1 -0
- package/dist/query/value-encoding.js +124 -0
- package/dist/query/value-encoding.js.map +1 -0
- package/dist/schema/create.d.ts +3 -0
- package/dist/schema/create.d.ts.map +1 -1
- package/dist/schema/create.js +4 -0
- package/dist/schema/create.js.map +1 -1
- package/dist/schema/type-conversion/create-sql-type-mapper.js +29 -0
- package/dist/schema/type-conversion/create-sql-type-mapper.js.map +1 -0
- package/dist/schema/type-conversion/dialect/mysql.js +57 -0
- package/dist/schema/type-conversion/dialect/mysql.js.map +1 -0
- package/dist/schema/type-conversion/dialect/postgres.js +56 -0
- package/dist/schema/type-conversion/dialect/postgres.js.map +1 -0
- package/dist/schema/type-conversion/dialect/sqlite.js +52 -0
- package/dist/schema/type-conversion/dialect/sqlite.js.map +1 -0
- package/dist/schema/type-conversion/type-mapping.js +63 -0
- package/dist/schema/type-conversion/type-mapping.js.map +1 -0
- package/dist/sql-driver/connection/connection-provider.d.ts +13 -0
- package/dist/sql-driver/connection/connection-provider.d.ts.map +1 -0
- package/dist/sql-driver/connection/connection-provider.js +19 -0
- package/dist/sql-driver/connection/connection-provider.js.map +1 -0
- package/dist/sql-driver/connection/single-connection-provider.js +23 -0
- package/dist/sql-driver/connection/single-connection-provider.js.map +1 -0
- package/dist/sql-driver/dialect-adapter/dialect-adapter.d.ts +7 -0
- package/dist/sql-driver/dialect-adapter/dialect-adapter.d.ts.map +1 -0
- package/dist/sql-driver/dialects/dialects.d.ts +2 -0
- package/dist/sql-driver/dialects/dialects.js +3 -0
- package/dist/sql-driver/dialects/durable-object-dialect.d.ts +72 -0
- package/dist/sql-driver/dialects/durable-object-dialect.d.ts.map +1 -0
- package/dist/sql-driver/dialects/durable-object-dialect.js +130 -0
- package/dist/sql-driver/dialects/durable-object-dialect.js.map +1 -0
- package/dist/sql-driver/driver/runtime-driver.d.ts +23 -0
- package/dist/sql-driver/driver/runtime-driver.d.ts.map +1 -0
- package/dist/sql-driver/driver/runtime-driver.js +56 -0
- package/dist/sql-driver/driver/runtime-driver.js.map +1 -0
- package/dist/sql-driver/query-executor/default-query-executor.js +26 -0
- package/dist/sql-driver/query-executor/default-query-executor.js.map +1 -0
- package/dist/sql-driver/query-executor/plugin.d.ts +17 -0
- package/dist/sql-driver/query-executor/plugin.d.ts.map +1 -0
- package/dist/sql-driver/query-executor/query-executor-base.js +25 -0
- package/dist/sql-driver/query-executor/query-executor-base.js.map +1 -0
- package/dist/sql-driver/query-executor/query-executor.d.ts +36 -0
- package/dist/sql-driver/query-executor/query-executor.d.ts.map +1 -0
- package/dist/sql-driver/sql-driver-adapter.d.ts +29 -0
- package/dist/sql-driver/sql-driver-adapter.d.ts.map +1 -0
- package/dist/sql-driver/sql-driver-adapter.js +68 -0
- package/dist/sql-driver/sql-driver-adapter.js.map +1 -0
- package/dist/sql-driver/sql-driver.d.ts +38 -0
- package/dist/sql-driver/sql-driver.d.ts.map +1 -0
- package/dist/sql-driver/sql-driver.js +1 -0
- package/dist/sql-driver/sql.js +50 -0
- package/dist/sql-driver/sql.js.map +1 -0
- package/dist/with-database.d.ts +6 -2
- package/dist/with-database.d.ts.map +1 -1
- package/dist/with-database.js +1 -1
- package/dist/with-database.js.map +1 -1
- package/package.json +37 -10
- package/src/adapters/adapters.ts +8 -5
- package/src/adapters/drizzle/drizzle-adapter-pglite.test.ts +60 -169
- package/src/adapters/drizzle/{drizzle-adapter-sqlite.test.ts → drizzle-adapter-sqlite3.test.ts} +31 -55
- package/src/adapters/drizzle/drizzle-adapter.ts +15 -107
- package/src/adapters/drizzle/generate.test.ts +2 -2
- package/src/adapters/drizzle/generate.ts +78 -34
- package/src/adapters/drizzle/migrate-drizzle.test.ts +19 -0
- package/src/adapters/drizzle/shared.ts +0 -34
- package/src/adapters/drizzle/test-utils.ts +3 -3
- package/src/adapters/generic-sql/README.md +14 -0
- package/src/adapters/generic-sql/driver-config.ts +144 -0
- package/src/adapters/generic-sql/generic-sql-adapter.test.ts +50 -0
- package/src/adapters/generic-sql/generic-sql-adapter.ts +146 -0
- package/src/adapters/generic-sql/generic-sql-uow-executor.ts +130 -0
- package/src/adapters/generic-sql/migration/cold-kysely.ts +55 -0
- package/src/adapters/{kysely/migration/execute-mysql.test.ts → generic-sql/migration/dialect/mysql.test.ts} +342 -484
- package/src/adapters/generic-sql/migration/dialect/mysql.ts +104 -0
- package/src/adapters/generic-sql/migration/dialect/postgres.test.ts +1008 -0
- package/src/adapters/generic-sql/migration/dialect/postgres.ts +113 -0
- package/src/adapters/{kysely/migration/execute-sqlite.test.ts → generic-sql/migration/dialect/sqlite.test.ts} +307 -510
- package/src/adapters/generic-sql/migration/dialect/sqlite.ts +189 -0
- package/src/adapters/generic-sql/migration/executor.ts +33 -0
- package/src/adapters/generic-sql/migration/prepared-migrations.test.ts +661 -0
- package/src/adapters/generic-sql/migration/prepared-migrations.ts +214 -0
- package/src/adapters/generic-sql/migration/sql-generator.ts +413 -0
- package/src/adapters/generic-sql/query/create-sql-query-compiler.ts +36 -0
- package/src/adapters/generic-sql/query/cursor-utils.ts +56 -0
- package/src/adapters/generic-sql/query/dialect/mysql.ts +34 -0
- package/src/adapters/generic-sql/query/dialect/postgres.ts +32 -0
- package/src/adapters/generic-sql/query/dialect/sqlite.ts +32 -0
- package/src/adapters/generic-sql/query/generic-sql-uow-operation-compiler.test.ts +1568 -0
- package/src/adapters/generic-sql/query/generic-sql-uow-operation-compiler.ts +314 -0
- package/src/adapters/generic-sql/query/select-builder.test.ts +256 -0
- package/src/adapters/generic-sql/query/select-builder.ts +137 -0
- package/src/adapters/generic-sql/query/sql-query-compiler.test.ts +195 -0
- package/src/adapters/generic-sql/query/sql-query-compiler.ts +367 -0
- package/src/adapters/generic-sql/query/where-builder.test.ts +744 -0
- package/src/adapters/generic-sql/query/where-builder.ts +211 -0
- package/src/adapters/generic-sql/result-interpreter.ts +102 -0
- package/src/adapters/generic-sql/test/generic-drizzle-adapter-sqlite3.test.ts +899 -0
- package/src/adapters/generic-sql/uow-decoder.test.ts +399 -0
- package/src/adapters/generic-sql/uow-decoder.ts +152 -0
- package/src/adapters/generic-sql/uow-encoder.test.ts +183 -0
- package/src/adapters/generic-sql/uow-encoder.ts +131 -0
- package/src/adapters/kysely/kysely-adapter-pglite.test.ts +26 -76
- package/src/adapters/kysely/{kysely-adapter-sqlite.test.ts → kysely-adapter-sqlocal.test.ts} +76 -17
- package/src/adapters/kysely/kysely-adapter.ts +10 -250
- package/src/adapters/{drizzle/drizzle-query.ts → shared/from-unit-of-work-compiler.ts} +110 -104
- package/src/adapters/shared/table-name-mapper.ts +50 -0
- package/src/adapters/shared/uow-operation-compiler.ts +211 -0
- package/src/db-fragment-definition-builder.test.ts +2 -2
- package/src/db-fragment-definition-builder.ts +281 -50
- package/src/db-fragment-instantiator.test.ts +78 -2
- package/src/db-fragment-integration.test.ts +14 -16
- package/src/fragments/internal-fragment.test.ts +434 -45
- package/src/fragments/internal-fragment.ts +184 -20
- package/src/hooks/hooks.test.ts +575 -0
- package/src/hooks/hooks.ts +179 -0
- package/src/migration-engine/generation-engine.test.ts +44 -54
- package/src/migration-engine/generation-engine.ts +48 -94
- package/src/mod.ts +117 -29
- package/src/query/column-defaults.ts +49 -0
- package/src/query/cursor.test.ts +31 -6
- package/src/query/cursor.ts +11 -7
- package/src/query/orm/orm.ts +1 -1
- package/src/query/query-type.test.ts +9 -9
- package/src/query/serialize/create-sql-serializer.ts +34 -0
- package/src/query/serialize/dialect/mysql-serializer.ts +142 -0
- package/src/query/serialize/dialect/postgres-serializer.ts +129 -0
- package/src/query/serialize/dialect/sqlite-serializer.test.ts +251 -0
- package/src/query/serialize/dialect/sqlite-serializer.ts +156 -0
- package/src/query/serialize/sql-serializer.ts +143 -0
- package/src/query/{query.ts → simple-query-interface.ts} +2 -2
- package/src/query/{execute-unit-of-work.test.ts → unit-of-work/execute-unit-of-work.test.ts} +16 -16
- package/src/query/{execute-unit-of-work.ts → unit-of-work/execute-unit-of-work.ts} +49 -8
- package/src/query/{unit-of-work-coordinator.test.ts → unit-of-work/unit-of-work-coordinator.test.ts} +41 -43
- package/src/query/{unit-of-work-types.test.ts → unit-of-work/unit-of-work-types.test.ts} +5 -3
- package/src/query/{unit-of-work.test.ts → unit-of-work/unit-of-work.test.ts} +100 -9
- package/src/query/{unit-of-work.ts → unit-of-work/unit-of-work.ts} +135 -32
- package/src/query/{result-transform.test.ts → value-decoding.test.ts} +45 -427
- package/src/query/value-decoding.ts +113 -0
- package/src/query/value-encoding.test.ts +390 -0
- package/src/query/value-encoding.ts +168 -0
- package/src/schema/create.test.ts +5 -1
- package/src/schema/create.ts +5 -0
- package/src/schema/serialize.test.ts +165 -407
- package/src/schema/type-conversion/create-sql-type-mapper.ts +28 -0
- package/src/schema/type-conversion/dialect/mysql.ts +64 -0
- package/src/schema/type-conversion/dialect/postgres.ts +62 -0
- package/src/schema/type-conversion/dialect/sqlite.ts +63 -0
- package/src/schema/type-conversion/type-mapping.test.ts +137 -0
- package/src/schema/type-conversion/type-mapping.ts +153 -0
- package/src/shared/connection-pool.ts +5 -5
- package/src/sql-driver/better-sqlite3.test.ts +126 -0
- package/src/sql-driver/connection/connection-provider.ts +27 -0
- package/src/sql-driver/connection/single-connection-provider.ts +42 -0
- package/src/sql-driver/dialect-adapter/dialect-adapter.ts +9 -0
- package/src/sql-driver/dialect-adapter/sqlite-dialect-adapter.ts +7 -0
- package/src/sql-driver/dialects/dialects.ts +1 -0
- package/src/sql-driver/dialects/durable-object-dialect.ts +260 -0
- package/src/sql-driver/driver/runtime-driver.ts +91 -0
- package/src/sql-driver/query-executor/default-query-executor.ts +38 -0
- package/src/sql-driver/query-executor/plugin.ts +22 -0
- package/src/sql-driver/query-executor/query-executor-base.ts +53 -0
- package/src/sql-driver/query-executor/query-executor.ts +44 -0
- package/src/sql-driver/sql-driver-adapter.ts +96 -0
- package/src/sql-driver/sql-driver.ts +53 -0
- package/src/sql-driver/sql.ts +57 -0
- package/src/sql-driver/sqlocal.test.ts +117 -0
- package/src/with-database.ts +35 -23
- package/tsdown.config.ts +7 -2
- package/dist/adapters/drizzle/drizzle-connection-pool.js +0 -40
- package/dist/adapters/drizzle/drizzle-connection-pool.js.map +0 -1
- package/dist/adapters/drizzle/drizzle-query.d.ts +0 -23
- package/dist/adapters/drizzle/drizzle-query.d.ts.map +0 -1
- package/dist/adapters/drizzle/drizzle-query.js.map +0 -1
- package/dist/adapters/drizzle/drizzle-uow-compiler.d.ts +0 -10
- package/dist/adapters/drizzle/drizzle-uow-compiler.d.ts.map +0 -1
- package/dist/adapters/drizzle/drizzle-uow-compiler.js +0 -334
- package/dist/adapters/drizzle/drizzle-uow-compiler.js.map +0 -1
- package/dist/adapters/drizzle/drizzle-uow-decoder.js +0 -123
- package/dist/adapters/drizzle/drizzle-uow-decoder.js.map +0 -1
- package/dist/adapters/drizzle/drizzle-uow-executor.js +0 -160
- package/dist/adapters/drizzle/drizzle-uow-executor.js.map +0 -1
- package/dist/adapters/drizzle/join-column-utils.js +0 -28
- package/dist/adapters/drizzle/join-column-utils.js.map +0 -1
- package/dist/adapters/drizzle/shared.d.ts.map +0 -1
- package/dist/adapters/drizzle/shared.js +0 -35
- package/dist/adapters/drizzle/shared.js.map +0 -1
- package/dist/adapters/kysely/kysely-connection-pool.js +0 -41
- package/dist/adapters/kysely/kysely-connection-pool.js.map +0 -1
- package/dist/adapters/kysely/kysely-query-builder.js +0 -321
- package/dist/adapters/kysely/kysely-query-builder.js.map +0 -1
- package/dist/adapters/kysely/kysely-query-compiler.js +0 -67
- package/dist/adapters/kysely/kysely-query-compiler.js.map +0 -1
- package/dist/adapters/kysely/kysely-query.d.ts +0 -23
- package/dist/adapters/kysely/kysely-query.d.ts.map +0 -1
- package/dist/adapters/kysely/kysely-query.js +0 -230
- package/dist/adapters/kysely/kysely-query.js.map +0 -1
- package/dist/adapters/kysely/kysely-shared.d.ts +0 -14
- package/dist/adapters/kysely/kysely-shared.d.ts.map +0 -1
- package/dist/adapters/kysely/kysely-shared.js +0 -33
- package/dist/adapters/kysely/kysely-shared.js.map +0 -1
- package/dist/adapters/kysely/kysely-uow-compiler.js +0 -193
- package/dist/adapters/kysely/kysely-uow-compiler.js.map +0 -1
- package/dist/adapters/kysely/kysely-uow-executor.js +0 -93
- package/dist/adapters/kysely/kysely-uow-executor.js.map +0 -1
- package/dist/adapters/kysely/migration/execute-base.js +0 -128
- package/dist/adapters/kysely/migration/execute-base.js.map +0 -1
- package/dist/adapters/kysely/migration/execute-factory.js +0 -34
- package/dist/adapters/kysely/migration/execute-factory.js.map +0 -1
- package/dist/adapters/kysely/migration/execute-mssql.js +0 -112
- package/dist/adapters/kysely/migration/execute-mssql.js.map +0 -1
- package/dist/adapters/kysely/migration/execute-mysql.js +0 -93
- package/dist/adapters/kysely/migration/execute-mysql.js.map +0 -1
- package/dist/adapters/kysely/migration/execute-postgres.js +0 -104
- package/dist/adapters/kysely/migration/execute-postgres.js.map +0 -1
- package/dist/adapters/kysely/migration/execute-sqlite.js +0 -123
- package/dist/adapters/kysely/migration/execute-sqlite.js.map +0 -1
- package/dist/adapters/kysely/migration/execute.js +0 -34
- package/dist/adapters/kysely/migration/execute.js.map +0 -1
- package/dist/migration-engine/create.d.ts +0 -37
- package/dist/migration-engine/create.d.ts.map +0 -1
- package/dist/migration-engine/create.js +0 -58
- package/dist/migration-engine/create.js.map +0 -1
- package/dist/migration-engine/shared.d.ts +0 -112
- package/dist/migration-engine/shared.d.ts.map +0 -1
- package/dist/node_modules/.pnpm/rou3@0.7.8/node_modules/rou3/dist/index.js.map +0 -1
- package/dist/query/execute-unit-of-work.d.ts.map +0 -1
- package/dist/query/execute-unit-of-work.js.map +0 -1
- package/dist/query/query.d.ts.map +0 -1
- package/dist/query/result-transform.js +0 -170
- package/dist/query/result-transform.js.map +0 -1
- package/dist/query/retry-policy.d.ts.map +0 -1
- package/dist/query/retry-policy.js.map +0 -1
- package/dist/query/unit-of-work.d.ts.map +0 -1
- package/dist/query/unit-of-work.js.map +0 -1
- package/dist/schema/serialize.js +0 -111
- package/dist/schema/serialize.js.map +0 -1
- package/src/adapters/drizzle/drizzle-adapter.test.ts +0 -122
- package/src/adapters/drizzle/drizzle-connection-pool.ts +0 -66
- package/src/adapters/drizzle/drizzle-query.test.ts +0 -499
- package/src/adapters/drizzle/drizzle-uow-compiler-mysql.test.ts +0 -1442
- package/src/adapters/drizzle/drizzle-uow-compiler-sqlite.test.ts +0 -1414
- package/src/adapters/drizzle/drizzle-uow-compiler.test.ts +0 -1400
- package/src/adapters/drizzle/drizzle-uow-compiler.ts +0 -677
- package/src/adapters/drizzle/drizzle-uow-decoder.ts +0 -228
- package/src/adapters/drizzle/drizzle-uow-executor.ts +0 -309
- package/src/adapters/drizzle/join-column-utils.test.ts +0 -79
- package/src/adapters/drizzle/join-column-utils.ts +0 -39
- package/src/adapters/kysely/kysely-connection-pool.ts +0 -70
- package/src/adapters/kysely/kysely-query-builder.test.ts +0 -1344
- package/src/adapters/kysely/kysely-query-builder.ts +0 -666
- package/src/adapters/kysely/kysely-query-compiler.ts +0 -127
- package/src/adapters/kysely/kysely-query.test.ts +0 -498
- package/src/adapters/kysely/kysely-query.ts +0 -399
- package/src/adapters/kysely/kysely-shared.ts +0 -57
- package/src/adapters/kysely/kysely-uow-compiler.test.ts +0 -986
- package/src/adapters/kysely/kysely-uow-compiler.ts +0 -350
- package/src/adapters/kysely/kysely-uow-executor.ts +0 -164
- package/src/adapters/kysely/kysely-uow-joins.test.ts +0 -794
- package/src/adapters/kysely/migration/execute-base.ts +0 -256
- package/src/adapters/kysely/migration/execute-factory.ts +0 -53
- package/src/adapters/kysely/migration/execute-mssql.ts +0 -250
- package/src/adapters/kysely/migration/execute-mysql.ts +0 -211
- package/src/adapters/kysely/migration/execute-postgres.test.ts +0 -2657
- package/src/adapters/kysely/migration/execute-postgres.ts +0 -234
- package/src/adapters/kysely/migration/execute-sqlite.ts +0 -247
- package/src/adapters/kysely/migration/execute.ts +0 -50
- package/src/adapters/kysely/migration/kysely-migrator.test.ts +0 -261
- package/src/query/result-transform.ts +0 -274
- package/src/schema/serialize.ts +0 -407
- /package/dist/query/{query.js → simple-query-interface.js} +0 -0
- /package/src/query/{retry-policy.test.ts → unit-of-work/retry-policy.test.ts} +0 -0
- /package/src/query/{retry-policy.ts → unit-of-work/retry-policy.ts} +0 -0
|
@@ -1,261 +0,0 @@
|
|
|
1
|
-
import { Kysely, PostgresDialect, SqliteDialect } from "kysely";
|
|
2
|
-
import { describe, expect, beforeAll, test } from "vitest";
|
|
3
|
-
import { KyselyAdapter } from "../kysely-adapter";
|
|
4
|
-
import { column, idColumn, referenceColumn, schema } from "../../../schema/create";
|
|
5
|
-
|
|
6
|
-
describe("KyselyMigrator", () => {
|
|
7
|
-
const testSchema = schema((s) => {
|
|
8
|
-
return s
|
|
9
|
-
.addTable("users", (t) => {
|
|
10
|
-
return t.addColumn("id", idColumn()).addColumn("name", column("string"));
|
|
11
|
-
})
|
|
12
|
-
.alterTable("users", (t) => {
|
|
13
|
-
return t
|
|
14
|
-
.addColumn("age", column("integer").nullable())
|
|
15
|
-
.createIndex("name_idx", ["name"])
|
|
16
|
-
.createIndex("age_idx", ["age"]);
|
|
17
|
-
})
|
|
18
|
-
.addTable("posts", (t) => {
|
|
19
|
-
return t
|
|
20
|
-
.addColumn("id", idColumn())
|
|
21
|
-
.addColumn("title", column("string"))
|
|
22
|
-
.addColumn("user_id", column("string"));
|
|
23
|
-
})
|
|
24
|
-
.addReference("author", {
|
|
25
|
-
type: "one",
|
|
26
|
-
from: { table: "posts", column: "user_id" },
|
|
27
|
-
to: { table: "users", column: "id" },
|
|
28
|
-
});
|
|
29
|
-
});
|
|
30
|
-
|
|
31
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
32
|
-
let db: Kysely<any>;
|
|
33
|
-
let adapter: KyselyAdapter;
|
|
34
|
-
|
|
35
|
-
beforeAll(async () => {
|
|
36
|
-
// Create a Kysely instance with a PostgresDialect, but not actually connected to a database
|
|
37
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
38
|
-
db = new Kysely({ dialect: new PostgresDialect({} as any) });
|
|
39
|
-
adapter = new KyselyAdapter({ db, provider: "postgresql" });
|
|
40
|
-
});
|
|
41
|
-
|
|
42
|
-
test("generate SQL for migration 0 -> 1 (create users table)", async () => {
|
|
43
|
-
const migrator = adapter.createMigrationEngine(testSchema, "test_namespace");
|
|
44
|
-
const preparedMigration = await migrator.prepareMigrationTo(1, {
|
|
45
|
-
updateSettings: true,
|
|
46
|
-
fromVersion: 0,
|
|
47
|
-
});
|
|
48
|
-
|
|
49
|
-
expect(preparedMigration.operations.length).toBeGreaterThan(0);
|
|
50
|
-
const sql = preparedMigration.getSQL?.();
|
|
51
|
-
expect(sql).toBeDefined();
|
|
52
|
-
expect(sql).toMatchInlineSnapshot(`
|
|
53
|
-
"create table "users_test_namespace" ("id" varchar(30) not null unique, "name" text not null, "_internalId" bigserial not null primary key, "_version" integer default 0 not null);
|
|
54
|
-
|
|
55
|
-
insert into "fragno_db_settings" ("id", "key", "value") values ('jprP_43K5uMwxAFiepbbrQ', 'test_namespace.schema_version', '1');"
|
|
56
|
-
`);
|
|
57
|
-
});
|
|
58
|
-
|
|
59
|
-
test("generate SQL for migration 0 -> 2 (create users table and add age)", async () => {
|
|
60
|
-
const migrator = adapter.createMigrationEngine(testSchema, "test_namespace");
|
|
61
|
-
const preparedMigration = await migrator.prepareMigrationTo(2, {
|
|
62
|
-
updateSettings: true,
|
|
63
|
-
fromVersion: 0,
|
|
64
|
-
});
|
|
65
|
-
|
|
66
|
-
expect(preparedMigration.operations.length).toBeGreaterThan(0);
|
|
67
|
-
const sql = preparedMigration.getSQL?.();
|
|
68
|
-
expect(sql).toBeDefined();
|
|
69
|
-
expect(sql).toMatchInlineSnapshot(`
|
|
70
|
-
"create table "users_test_namespace" ("id" varchar(30) not null unique, "name" text not null, "_internalId" bigserial not null primary key, "_version" integer default 0 not null);
|
|
71
|
-
|
|
72
|
-
alter table "users_test_namespace" add column "age" integer;
|
|
73
|
-
|
|
74
|
-
create index "name_idx" on "users_test_namespace" ("name");
|
|
75
|
-
|
|
76
|
-
create index "age_idx" on "users_test_namespace" ("age");
|
|
77
|
-
|
|
78
|
-
insert into "fragno_db_settings" ("id", "key", "value") values ('jprP_43K5uMwxAFiepbbrQ', 'test_namespace.schema_version', '2');"
|
|
79
|
-
`);
|
|
80
|
-
});
|
|
81
|
-
|
|
82
|
-
test("generate SQL for migration 1 -> 2 (add age column and indexes)", async () => {
|
|
83
|
-
const migrator = adapter.createMigrationEngine(testSchema, "test_namespace");
|
|
84
|
-
const preparedMigration = await migrator.prepareMigrationTo(2, {
|
|
85
|
-
updateSettings: true,
|
|
86
|
-
fromVersion: 1,
|
|
87
|
-
});
|
|
88
|
-
|
|
89
|
-
expect(preparedMigration.operations.length).toBeGreaterThan(0);
|
|
90
|
-
const sql = preparedMigration.getSQL?.();
|
|
91
|
-
expect(sql).toBeDefined();
|
|
92
|
-
expect(sql).toMatchInlineSnapshot(`
|
|
93
|
-
"alter table "users_test_namespace" add column "age" integer;
|
|
94
|
-
|
|
95
|
-
create index "name_idx" on "users_test_namespace" ("name");
|
|
96
|
-
|
|
97
|
-
create index "age_idx" on "users_test_namespace" ("age");
|
|
98
|
-
|
|
99
|
-
update "fragno_db_settings" set "value" = '2' where "key" = 'test_namespace.schema_version';"
|
|
100
|
-
`);
|
|
101
|
-
});
|
|
102
|
-
|
|
103
|
-
test("generate SQL for migration 0 -> 3 (full schema)", async () => {
|
|
104
|
-
const migrator = adapter.createMigrationEngine(testSchema, "test_namespace");
|
|
105
|
-
const preparedMigration = await migrator.prepareMigrationTo(3, {
|
|
106
|
-
updateSettings: true,
|
|
107
|
-
fromVersion: 0,
|
|
108
|
-
});
|
|
109
|
-
|
|
110
|
-
expect(preparedMigration.operations.length).toBeGreaterThan(0);
|
|
111
|
-
const sql = preparedMigration.getSQL?.();
|
|
112
|
-
expect(sql).toBeDefined();
|
|
113
|
-
expect(sql).toMatchInlineSnapshot(`
|
|
114
|
-
"create table "users_test_namespace" ("id" varchar(30) not null unique, "name" text not null, "_internalId" bigserial not null primary key, "_version" integer default 0 not null);
|
|
115
|
-
|
|
116
|
-
alter table "users_test_namespace" add column "age" integer;
|
|
117
|
-
|
|
118
|
-
create index "name_idx" on "users_test_namespace" ("name");
|
|
119
|
-
|
|
120
|
-
create index "age_idx" on "users_test_namespace" ("age");
|
|
121
|
-
|
|
122
|
-
create table "posts_test_namespace" ("id" varchar(30) not null unique, "title" text not null, "user_id" text not null, "_internalId" bigserial not null primary key, "_version" integer default 0 not null);
|
|
123
|
-
|
|
124
|
-
insert into "fragno_db_settings" ("id", "key", "value") values ('jprP_43K5uMwxAFiepbbrQ', 'test_namespace.schema_version', '3');"
|
|
125
|
-
`);
|
|
126
|
-
});
|
|
127
|
-
|
|
128
|
-
test("generate SQL for migration 2 -> 3 (add posts table)", async () => {
|
|
129
|
-
const migrator = adapter.createMigrationEngine(testSchema, "test_namespace");
|
|
130
|
-
const preparedMigration = await migrator.prepareMigrationTo(3, {
|
|
131
|
-
updateSettings: true,
|
|
132
|
-
fromVersion: 2,
|
|
133
|
-
});
|
|
134
|
-
|
|
135
|
-
expect(preparedMigration.operations.length).toBeGreaterThan(0);
|
|
136
|
-
const sql = preparedMigration.getSQL?.();
|
|
137
|
-
expect(sql).toBeDefined();
|
|
138
|
-
expect(sql).toMatchInlineSnapshot(`
|
|
139
|
-
"create table "posts_test_namespace" ("id" varchar(30) not null unique, "title" text not null, "user_id" text not null, "_internalId" bigserial not null primary key, "_version" integer default 0 not null);
|
|
140
|
-
|
|
141
|
-
update "fragno_db_settings" set "value" = '3' where "key" = 'test_namespace.schema_version';"
|
|
142
|
-
`);
|
|
143
|
-
});
|
|
144
|
-
|
|
145
|
-
test("generate empty SQL for migration 2 -> 2 (no changes)", async () => {
|
|
146
|
-
const migrator = adapter.createMigrationEngine(testSchema, "test_namespace");
|
|
147
|
-
const preparedMigration = await migrator.prepareMigrationTo(2, {
|
|
148
|
-
updateSettings: true,
|
|
149
|
-
fromVersion: 2,
|
|
150
|
-
});
|
|
151
|
-
|
|
152
|
-
expect(preparedMigration.operations.length).toBe(0);
|
|
153
|
-
const sql = preparedMigration.getSQL?.();
|
|
154
|
-
expect(sql).toBeDefined();
|
|
155
|
-
expect(sql).toBe("");
|
|
156
|
-
});
|
|
157
|
-
|
|
158
|
-
test("throw error for backward migration", async () => {
|
|
159
|
-
const migrator = adapter.createMigrationEngine(testSchema, "test_namespace");
|
|
160
|
-
|
|
161
|
-
await expect(
|
|
162
|
-
migrator.prepareMigrationTo(1, {
|
|
163
|
-
updateSettings: true,
|
|
164
|
-
fromVersion: 2,
|
|
165
|
-
}),
|
|
166
|
-
).rejects.toThrow("Cannot migrate backwards");
|
|
167
|
-
});
|
|
168
|
-
|
|
169
|
-
test("throw error for version beyond schema", async () => {
|
|
170
|
-
const migrator = adapter.createMigrationEngine(testSchema, "test_namespace");
|
|
171
|
-
|
|
172
|
-
await expect(
|
|
173
|
-
migrator.prepareMigrationTo(10, {
|
|
174
|
-
updateSettings: true,
|
|
175
|
-
fromVersion: 0,
|
|
176
|
-
}),
|
|
177
|
-
).rejects.toThrow("schema only has version 4");
|
|
178
|
-
});
|
|
179
|
-
});
|
|
180
|
-
|
|
181
|
-
describe("KyselyMigrator - SQLite Foreign Key Merging", () => {
|
|
182
|
-
// Test the user's exact example schema
|
|
183
|
-
const userExampleSchema = schema((s) => {
|
|
184
|
-
return s
|
|
185
|
-
.addTable("users", (t) => {
|
|
186
|
-
return t.addColumn("id", idColumn());
|
|
187
|
-
})
|
|
188
|
-
.addTable("posts", (t) => {
|
|
189
|
-
return t.addColumn("id", idColumn()).addColumn("authorId", referenceColumn());
|
|
190
|
-
})
|
|
191
|
-
.addReference("author", {
|
|
192
|
-
type: "one",
|
|
193
|
-
from: { table: "posts", column: "authorId" },
|
|
194
|
-
to: { table: "users", column: "id" },
|
|
195
|
-
});
|
|
196
|
-
});
|
|
197
|
-
|
|
198
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
199
|
-
let db: Kysely<any>;
|
|
200
|
-
let adapter: KyselyAdapter;
|
|
201
|
-
|
|
202
|
-
beforeAll(async () => {
|
|
203
|
-
// Create a Kysely instance with SQLite dialect
|
|
204
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
205
|
-
db = new Kysely({ dialect: new SqliteDialect({} as any) });
|
|
206
|
-
adapter = new KyselyAdapter({ db, provider: "sqlite" });
|
|
207
|
-
});
|
|
208
|
-
|
|
209
|
-
test("SQLite should merge foreign keys into create-table operations", async () => {
|
|
210
|
-
const migrator = adapter.createMigrationEngine(userExampleSchema, "test");
|
|
211
|
-
|
|
212
|
-
// Migrate from 0 -> 3 (all tables + FK in one batch)
|
|
213
|
-
const preparedMigration = await migrator.prepareMigrationTo(3, {
|
|
214
|
-
updateSettings: true,
|
|
215
|
-
fromVersion: 0,
|
|
216
|
-
});
|
|
217
|
-
|
|
218
|
-
expect(preparedMigration.operations.length).toBeGreaterThan(0);
|
|
219
|
-
const sql = preparedMigration.getSQL?.();
|
|
220
|
-
expect(sql).toBeDefined();
|
|
221
|
-
|
|
222
|
-
// The SQL should have PRAGMA defer_foreign_keys
|
|
223
|
-
expect(sql).toContain("PRAGMA defer_foreign_keys = ON");
|
|
224
|
-
|
|
225
|
-
// Should create users table
|
|
226
|
-
expect(sql).toContain('create table "users_test"');
|
|
227
|
-
|
|
228
|
-
// Should create posts table WITH inline foreign key constraint
|
|
229
|
-
expect(sql).toContain('create table "posts_test"');
|
|
230
|
-
expect(sql).toContain("foreign key");
|
|
231
|
-
expect(sql).toContain("authorId");
|
|
232
|
-
expect(sql).toContain('references "users_test"');
|
|
233
|
-
|
|
234
|
-
// Should NOT have a separate ALTER TABLE ADD FOREIGN KEY
|
|
235
|
-
// (SQLite doesn't support it, and we've merged it into create-table)
|
|
236
|
-
expect(sql).not.toMatch(/alter table.*add.*foreign key/i);
|
|
237
|
-
});
|
|
238
|
-
|
|
239
|
-
test("SQLite FK merging full schema verification", async () => {
|
|
240
|
-
const migrator = adapter.createMigrationEngine(userExampleSchema, "test");
|
|
241
|
-
|
|
242
|
-
const preparedMigration = await migrator.prepareMigrationTo(3, {
|
|
243
|
-
updateSettings: true,
|
|
244
|
-
fromVersion: 0,
|
|
245
|
-
});
|
|
246
|
-
|
|
247
|
-
const sql = preparedMigration.getSQL?.();
|
|
248
|
-
expect(sql).toBeDefined();
|
|
249
|
-
|
|
250
|
-
// Verify the complete SQL snapshot
|
|
251
|
-
expect(sql).toMatchInlineSnapshot(`
|
|
252
|
-
"PRAGMA defer_foreign_keys = ON;
|
|
253
|
-
|
|
254
|
-
create table "users_test" ("id" text not null unique, "_internalId" integer not null primary key autoincrement, "_version" integer default 0 not null);
|
|
255
|
-
|
|
256
|
-
create table "posts_test" ("id" text not null unique, "authorId" integer not null, "_internalId" integer not null primary key autoincrement, "_version" integer default 0 not null, constraint "posts_users_author_fk" foreign key ("authorId") references "users_test" ("_internalId") on delete restrict on update restrict);
|
|
257
|
-
|
|
258
|
-
insert into "fragno_db_settings" ("id", "key", "value") values ('BflimUWc1NbCMMDD9SM3gQ', 'test.schema_version', '3');"
|
|
259
|
-
`);
|
|
260
|
-
});
|
|
261
|
-
});
|
|
@@ -1,274 +0,0 @@
|
|
|
1
|
-
import type { AnyColumn, AnyTable } from "../schema/create";
|
|
2
|
-
import type { SQLProvider } from "../shared/providers";
|
|
3
|
-
import { deserialize, serialize } from "../schema/serialize";
|
|
4
|
-
import { FragnoId, FragnoReference } from "../schema/create";
|
|
5
|
-
import { createId } from "../id";
|
|
6
|
-
|
|
7
|
-
/**
|
|
8
|
-
* Marker class for reference column values that need subquery resolution.
|
|
9
|
-
* When a reference column receives a string (external ID), this marker tells
|
|
10
|
-
* the query builder to generate a subquery to look up the internal ID.
|
|
11
|
-
* @internal
|
|
12
|
-
*/
|
|
13
|
-
export class ReferenceSubquery {
|
|
14
|
-
#referencedTable: AnyTable;
|
|
15
|
-
#externalIdValue: string;
|
|
16
|
-
|
|
17
|
-
constructor(referencedTable: AnyTable, externalIdValue: string) {
|
|
18
|
-
this.#referencedTable = referencedTable;
|
|
19
|
-
this.#externalIdValue = externalIdValue;
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
get referencedTable() {
|
|
23
|
-
return this.#referencedTable;
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
get externalIdValue() {
|
|
27
|
-
return this.#externalIdValue;
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
/**
|
|
32
|
-
* Generate a runtime default value for a column that has defaultTo$()
|
|
33
|
-
*
|
|
34
|
-
* Only generates values for runtime defaults (defaultTo$), NOT static defaults (defaultTo).
|
|
35
|
-
* Static defaults should be handled by the database via DEFAULT constraints.
|
|
36
|
-
*
|
|
37
|
-
* @param column - The column with a default value configuration
|
|
38
|
-
* @returns The generated default value, or undefined if the column has no runtime default
|
|
39
|
-
*
|
|
40
|
-
* @internal
|
|
41
|
-
*/
|
|
42
|
-
export function generateRuntimeDefault(column: AnyColumn): unknown {
|
|
43
|
-
// Check if column has a default value configuration
|
|
44
|
-
if (!column.default) {
|
|
45
|
-
return undefined;
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
// If it's a static default value (defaultTo), return undefined
|
|
49
|
-
// as the database should handle this via DEFAULT constraint
|
|
50
|
-
if ("value" in column.default) {
|
|
51
|
-
return undefined;
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
// If it's a database-level special function (defaultTo(b => b.now())), return undefined
|
|
55
|
-
// as the database should handle this via DEFAULT NOW() or equivalent
|
|
56
|
-
if ("dbSpecial" in column.default) {
|
|
57
|
-
return undefined;
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
// Handle runtime defaults (defaultTo$)
|
|
61
|
-
const runtime = column.default.runtime;
|
|
62
|
-
|
|
63
|
-
if (runtime === "cuid") {
|
|
64
|
-
return createId();
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
if (runtime === "now") {
|
|
68
|
-
return new Date();
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
if (typeof runtime === "function") {
|
|
72
|
-
return runtime();
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
return undefined;
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
/**
|
|
79
|
-
* Encodes a record of values from the application format to database format.
|
|
80
|
-
*
|
|
81
|
-
* This function transforms object keys to match SQL column names and serializes
|
|
82
|
-
* values according to the database provider's requirements (e.g., converting
|
|
83
|
-
* JavaScript Date objects to numbers for SQLite).
|
|
84
|
-
*
|
|
85
|
-
* @param values - The record of values to encode in application format
|
|
86
|
-
* @param table - The table schema definition containing column information
|
|
87
|
-
* @param generateDefault - Whether to generate default values for undefined columns
|
|
88
|
-
* @param provider - The SQL provider (sqlite, postgresql, mysql, etc.)
|
|
89
|
-
* @param skipDriverConversions - Skip driver-level type conversions (Date->number, boolean->0/1, bigint->Buffer).
|
|
90
|
-
* Set to true when using ORMs like Drizzle that handle these conversions internally.
|
|
91
|
-
* @returns A record with database-compatible column names and serialized values
|
|
92
|
-
*
|
|
93
|
-
* @example
|
|
94
|
-
* ```ts
|
|
95
|
-
* const encoded = encodeValues(
|
|
96
|
-
* { userId: 123, createdAt: new Date() },
|
|
97
|
-
* userTable,
|
|
98
|
-
* true,
|
|
99
|
-
* 'sqlite'
|
|
100
|
-
* );
|
|
101
|
-
* // Returns: { user_id: 123, created_at: 1234567890 }
|
|
102
|
-
* ```
|
|
103
|
-
*/
|
|
104
|
-
export function encodeValues(
|
|
105
|
-
values: Record<string, unknown>,
|
|
106
|
-
table: AnyTable,
|
|
107
|
-
generateDefault: boolean,
|
|
108
|
-
provider: SQLProvider,
|
|
109
|
-
skipDriverConversions = false,
|
|
110
|
-
): Record<string, unknown> {
|
|
111
|
-
const result: Record<string, unknown> = {};
|
|
112
|
-
|
|
113
|
-
for (const k in table.columns) {
|
|
114
|
-
const col = table.columns[k];
|
|
115
|
-
|
|
116
|
-
// Skip internal ID - never provided by user, auto-generated by database
|
|
117
|
-
if (col.role === "internal-id") {
|
|
118
|
-
continue;
|
|
119
|
-
}
|
|
120
|
-
let value = values[k];
|
|
121
|
-
|
|
122
|
-
if (generateDefault && value === undefined) {
|
|
123
|
-
// Only generate runtime defaults (defaultTo$), not static defaults (defaultTo).
|
|
124
|
-
// Static defaults should be handled by the database via DEFAULT constraints.
|
|
125
|
-
value = generateRuntimeDefault(col);
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
if (value !== undefined) {
|
|
129
|
-
// Handle string references and FragnoId objects
|
|
130
|
-
if (col.role === "reference") {
|
|
131
|
-
if (typeof value === "string") {
|
|
132
|
-
// String external ID - generate subquery
|
|
133
|
-
const relation = Object.values(table.relations).find((rel) =>
|
|
134
|
-
rel.on.some(([localCol]) => localCol === k),
|
|
135
|
-
);
|
|
136
|
-
if (relation) {
|
|
137
|
-
result[col.name] = new ReferenceSubquery(relation.table, value);
|
|
138
|
-
continue;
|
|
139
|
-
}
|
|
140
|
-
throw new Error(`Reference column ${k} not found in table ${table.name}`);
|
|
141
|
-
} else if (value instanceof FragnoId) {
|
|
142
|
-
// FragnoId object
|
|
143
|
-
if (value.internalId !== undefined) {
|
|
144
|
-
// If internal ID is populated, use it directly (no subquery needed)
|
|
145
|
-
result[col.name] = value.internalId;
|
|
146
|
-
continue;
|
|
147
|
-
} else {
|
|
148
|
-
// If internal ID is not populated, use external ID via subquery
|
|
149
|
-
const relation = Object.values(table.relations).find((rel) =>
|
|
150
|
-
rel.on.some(([localCol]) => localCol === k),
|
|
151
|
-
);
|
|
152
|
-
if (relation) {
|
|
153
|
-
result[col.name] = new ReferenceSubquery(relation.table, value.externalId);
|
|
154
|
-
continue;
|
|
155
|
-
}
|
|
156
|
-
throw new Error(`Reference column ${k} not found in table ${table.name}`);
|
|
157
|
-
}
|
|
158
|
-
}
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
result[col.name] = serialize(value, col, provider, skipDriverConversions);
|
|
162
|
-
}
|
|
163
|
-
}
|
|
164
|
-
|
|
165
|
-
return result;
|
|
166
|
-
}
|
|
167
|
-
|
|
168
|
-
/**
|
|
169
|
-
* Decodes a database result record to application format.
|
|
170
|
-
*
|
|
171
|
-
* This function transforms database column names back to application property names
|
|
172
|
-
* and deserializes values according to the database provider's format (e.g., converting
|
|
173
|
-
* SQLite integers back to JavaScript Date objects).
|
|
174
|
-
*
|
|
175
|
-
* Supports relation data encoded with the pattern `relationName:columnName`.
|
|
176
|
-
*
|
|
177
|
-
* @param result - The raw database result record
|
|
178
|
-
* @param table - The table schema definition containing column and relation information
|
|
179
|
-
* @param provider - The SQL provider (sqlite, postgresql, mysql, etc.)
|
|
180
|
-
* @returns A record in application format with deserialized values
|
|
181
|
-
*
|
|
182
|
-
* @example
|
|
183
|
-
* ```ts
|
|
184
|
-
* const decoded = decodeResult(
|
|
185
|
-
* { user_id: 123, created_at: 1234567890, 'posts:title': 'Hello' },
|
|
186
|
-
* userTable,
|
|
187
|
-
* 'sqlite'
|
|
188
|
-
* );
|
|
189
|
-
* // Returns: { userId: 123, createdAt: Date, posts: { title: 'Hello' } }
|
|
190
|
-
* ```
|
|
191
|
-
*/
|
|
192
|
-
export function decodeResult(
|
|
193
|
-
result: Record<string, unknown>,
|
|
194
|
-
table: AnyTable,
|
|
195
|
-
provider: SQLProvider,
|
|
196
|
-
): Record<string, unknown> {
|
|
197
|
-
const output: Record<string, unknown> = {};
|
|
198
|
-
// First pass: collect all column values
|
|
199
|
-
const columnValues: Record<string, unknown> = {};
|
|
200
|
-
|
|
201
|
-
// Collect all relation data (including nested) keyed by relation name
|
|
202
|
-
const relationData: Record<string, Record<string, unknown>> = {};
|
|
203
|
-
|
|
204
|
-
for (const k in result) {
|
|
205
|
-
const colonIndex = k.indexOf(":");
|
|
206
|
-
const value = result[k];
|
|
207
|
-
|
|
208
|
-
// Direct column (no colon)
|
|
209
|
-
if (colonIndex === -1) {
|
|
210
|
-
const col = table.columns[k];
|
|
211
|
-
if (!col) {
|
|
212
|
-
continue;
|
|
213
|
-
}
|
|
214
|
-
|
|
215
|
-
// Store all column values (including hidden ones for FragnoId creation)
|
|
216
|
-
columnValues[k] = deserialize(value, col, provider);
|
|
217
|
-
continue;
|
|
218
|
-
}
|
|
219
|
-
|
|
220
|
-
// Relation column (has colon)
|
|
221
|
-
const relationName = k.slice(0, colonIndex);
|
|
222
|
-
const remainder = k.slice(colonIndex + 1);
|
|
223
|
-
|
|
224
|
-
const relation = table.relations[relationName];
|
|
225
|
-
if (relation === undefined) {
|
|
226
|
-
continue;
|
|
227
|
-
}
|
|
228
|
-
|
|
229
|
-
// Collect relation data with the remaining key path
|
|
230
|
-
relationData[relationName] ??= {};
|
|
231
|
-
relationData[relationName][remainder] = value;
|
|
232
|
-
}
|
|
233
|
-
|
|
234
|
-
// Process each relation's data recursively
|
|
235
|
-
for (const relationName in relationData) {
|
|
236
|
-
const relation = table.relations[relationName];
|
|
237
|
-
if (!relation) {
|
|
238
|
-
continue;
|
|
239
|
-
}
|
|
240
|
-
|
|
241
|
-
// Recursively decode the relation data
|
|
242
|
-
output[relationName] = decodeResult(relationData[relationName], relation.table, provider);
|
|
243
|
-
}
|
|
244
|
-
|
|
245
|
-
// Second pass: create output with FragnoId objects where appropriate
|
|
246
|
-
for (const k in columnValues) {
|
|
247
|
-
const col = table.columns[k];
|
|
248
|
-
if (!col) {
|
|
249
|
-
continue;
|
|
250
|
-
}
|
|
251
|
-
|
|
252
|
-
// Filter out hidden columns (like _internalId, _version) from results
|
|
253
|
-
if (col.isHidden) {
|
|
254
|
-
continue;
|
|
255
|
-
}
|
|
256
|
-
|
|
257
|
-
// For external ID columns, create FragnoId if we have both external and internal IDs
|
|
258
|
-
if (col.role === "external-id" && columnValues["_internalId"] !== undefined) {
|
|
259
|
-
output[k] = new FragnoId({
|
|
260
|
-
externalId: columnValues[k] as string,
|
|
261
|
-
internalId: columnValues["_internalId"] as bigint,
|
|
262
|
-
// _version is always selected as a hidden column, so it should always be present
|
|
263
|
-
version: columnValues["_version"] as number,
|
|
264
|
-
});
|
|
265
|
-
} else if (col.role === "reference") {
|
|
266
|
-
// For reference columns, create FragnoReference with internal ID
|
|
267
|
-
output[k] = FragnoReference.fromInternal(columnValues[k] as bigint);
|
|
268
|
-
} else {
|
|
269
|
-
output[k] = columnValues[k];
|
|
270
|
-
}
|
|
271
|
-
}
|
|
272
|
-
|
|
273
|
-
return output;
|
|
274
|
-
}
|