@fragno-dev/db 0.1.14 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-build.log +242 -139
- package/CHANGELOG.md +47 -0
- package/README.md +123 -8
- package/dist/adapters/adapters.d.ts +19 -5
- package/dist/adapters/adapters.d.ts.map +1 -1
- package/dist/adapters/adapters.js.map +1 -1
- package/dist/adapters/drizzle/drizzle-adapter.d.ts +6 -19
- package/dist/adapters/drizzle/drizzle-adapter.d.ts.map +1 -1
- package/dist/adapters/drizzle/drizzle-adapter.js +7 -47
- package/dist/adapters/drizzle/drizzle-adapter.js.map +1 -1
- package/dist/adapters/drizzle/generate.d.ts +7 -1
- package/dist/adapters/drizzle/generate.d.ts.map +1 -1
- package/dist/adapters/drizzle/generate.js +46 -45
- package/dist/adapters/drizzle/generate.js.map +1 -1
- package/dist/adapters/generic-sql/driver-config.d.ts +74 -0
- package/dist/adapters/generic-sql/driver-config.d.ts.map +1 -0
- package/dist/adapters/generic-sql/driver-config.js +94 -0
- package/dist/adapters/generic-sql/driver-config.js.map +1 -0
- package/dist/adapters/generic-sql/generic-sql-adapter.d.ts +43 -0
- package/dist/adapters/generic-sql/generic-sql-adapter.d.ts.map +1 -0
- package/dist/adapters/generic-sql/generic-sql-adapter.js +87 -0
- package/dist/adapters/generic-sql/generic-sql-adapter.js.map +1 -0
- package/dist/adapters/generic-sql/generic-sql-uow-executor.js +67 -0
- package/dist/adapters/generic-sql/generic-sql-uow-executor.js.map +1 -0
- package/dist/adapters/generic-sql/migration/cold-kysely.js +33 -0
- package/dist/adapters/generic-sql/migration/cold-kysely.js.map +1 -0
- package/dist/adapters/generic-sql/migration/dialect/mysql.js +60 -0
- package/dist/adapters/generic-sql/migration/dialect/mysql.js.map +1 -0
- package/dist/adapters/generic-sql/migration/dialect/postgres.js +59 -0
- package/dist/adapters/generic-sql/migration/dialect/postgres.js.map +1 -0
- package/dist/adapters/generic-sql/migration/dialect/sqlite.js +96 -0
- package/dist/adapters/generic-sql/migration/dialect/sqlite.js.map +1 -0
- package/dist/adapters/generic-sql/migration/executor.d.ts +15 -0
- package/dist/adapters/generic-sql/migration/executor.d.ts.map +1 -0
- package/dist/adapters/generic-sql/migration/executor.js +18 -0
- package/dist/adapters/generic-sql/migration/executor.js.map +1 -0
- package/dist/adapters/generic-sql/migration/prepared-migrations.d.ts +66 -0
- package/dist/adapters/generic-sql/migration/prepared-migrations.d.ts.map +1 -0
- package/dist/adapters/generic-sql/migration/prepared-migrations.js +68 -0
- package/dist/adapters/generic-sql/migration/prepared-migrations.js.map +1 -0
- package/dist/adapters/generic-sql/migration/sql-generator.js +212 -0
- package/dist/adapters/generic-sql/migration/sql-generator.js.map +1 -0
- package/dist/adapters/generic-sql/query/create-sql-query-compiler.js +32 -0
- package/dist/adapters/generic-sql/query/create-sql-query-compiler.js.map +1 -0
- package/dist/adapters/generic-sql/query/cursor-utils.js +37 -0
- package/dist/adapters/generic-sql/query/cursor-utils.js.map +1 -0
- package/dist/adapters/generic-sql/query/dialect/mysql.js +33 -0
- package/dist/adapters/generic-sql/query/dialect/mysql.js.map +1 -0
- package/dist/adapters/generic-sql/query/dialect/postgres.js +32 -0
- package/dist/adapters/generic-sql/query/dialect/postgres.js.map +1 -0
- package/dist/adapters/generic-sql/query/dialect/sqlite.js +32 -0
- package/dist/adapters/generic-sql/query/dialect/sqlite.js.map +1 -0
- package/dist/adapters/generic-sql/query/generic-sql-uow-operation-compiler.js +152 -0
- package/dist/adapters/generic-sql/query/generic-sql-uow-operation-compiler.js.map +1 -0
- package/dist/adapters/generic-sql/query/select-builder.js +69 -0
- package/dist/adapters/generic-sql/query/select-builder.js.map +1 -0
- package/dist/adapters/generic-sql/query/sql-query-compiler.js +145 -0
- package/dist/adapters/generic-sql/query/sql-query-compiler.js.map +1 -0
- package/dist/adapters/generic-sql/query/where-builder.js +129 -0
- package/dist/adapters/generic-sql/query/where-builder.js.map +1 -0
- package/dist/adapters/generic-sql/result-interpreter.js +74 -0
- package/dist/adapters/generic-sql/result-interpreter.js.map +1 -0
- package/dist/adapters/generic-sql/uow-decoder.js +105 -0
- package/dist/adapters/generic-sql/uow-decoder.js.map +1 -0
- package/dist/adapters/generic-sql/uow-encoder.js +93 -0
- package/dist/adapters/generic-sql/uow-encoder.js.map +1 -0
- package/dist/adapters/kysely/kysely-adapter.d.ts +5 -16
- package/dist/adapters/kysely/kysely-adapter.d.ts.map +1 -1
- package/dist/adapters/kysely/kysely-adapter.js +6 -159
- package/dist/adapters/kysely/kysely-adapter.js.map +1 -1
- package/dist/adapters/{drizzle/drizzle-query.js → shared/from-unit-of-work-compiler.js} +48 -62
- package/dist/adapters/shared/from-unit-of-work-compiler.js.map +1 -0
- package/dist/adapters/{kysely/kysely-shared.d.ts → shared/table-name-mapper.d.ts} +3 -2
- package/dist/adapters/shared/table-name-mapper.d.ts.map +1 -0
- package/dist/adapters/shared/table-name-mapper.js +43 -0
- package/dist/adapters/shared/table-name-mapper.js.map +1 -0
- package/dist/adapters/shared/uow-operation-compiler.js +105 -0
- package/dist/adapters/shared/uow-operation-compiler.js.map +1 -0
- package/dist/db-fragment-definition-builder.d.ts +186 -0
- package/dist/db-fragment-definition-builder.d.ts.map +1 -0
- package/dist/db-fragment-definition-builder.js +207 -0
- package/dist/db-fragment-definition-builder.js.map +1 -0
- package/dist/fragments/internal-fragment.d.ts +53 -0
- package/dist/fragments/internal-fragment.d.ts.map +1 -0
- package/dist/fragments/internal-fragment.js +111 -0
- package/dist/fragments/internal-fragment.js.map +1 -0
- package/dist/hooks/hooks.d.ts +51 -0
- package/dist/hooks/hooks.d.ts.map +1 -0
- package/dist/hooks/hooks.js +88 -0
- package/dist/hooks/hooks.js.map +1 -0
- package/dist/migration-engine/generation-engine.d.ts +0 -2
- package/dist/migration-engine/generation-engine.d.ts.map +1 -1
- package/dist/migration-engine/generation-engine.js +38 -56
- package/dist/migration-engine/generation-engine.js.map +1 -1
- package/dist/mod.d.ts +35 -23
- package/dist/mod.d.ts.map +1 -1
- package/dist/mod.js +48 -45
- package/dist/mod.js.map +1 -1
- package/dist/node_modules/.pnpm/rou3@0.7.10/node_modules/rou3/dist/index.js +165 -0
- package/dist/node_modules/.pnpm/rou3@0.7.10/node_modules/rou3/dist/index.js.map +1 -0
- package/dist/packages/fragno/dist/api/bind-services.js +20 -0
- package/dist/packages/fragno/dist/api/bind-services.js.map +1 -0
- package/dist/packages/fragno/dist/api/error.js +48 -0
- package/dist/packages/fragno/dist/api/error.js.map +1 -0
- package/dist/packages/fragno/dist/api/fragment-definition-builder.js +320 -0
- package/dist/packages/fragno/dist/api/fragment-definition-builder.js.map +1 -0
- package/dist/packages/fragno/dist/api/fragment-instantiator.js +525 -0
- package/dist/packages/fragno/dist/api/fragment-instantiator.js.map +1 -0
- package/dist/packages/fragno/dist/api/fragno-response.js +73 -0
- package/dist/packages/fragno/dist/api/fragno-response.js.map +1 -0
- package/dist/packages/fragno/dist/api/internal/response-stream.js +81 -0
- package/dist/packages/fragno/dist/api/internal/response-stream.js.map +1 -0
- package/dist/packages/fragno/dist/api/internal/route.js +10 -0
- package/dist/packages/fragno/dist/api/internal/route.js.map +1 -0
- package/dist/packages/fragno/dist/api/mutable-request-state.js +97 -0
- package/dist/packages/fragno/dist/api/mutable-request-state.js.map +1 -0
- package/dist/packages/fragno/dist/api/request-context-storage.js +43 -0
- package/dist/packages/fragno/dist/api/request-context-storage.js.map +1 -0
- package/dist/packages/fragno/dist/api/request-input-context.js +118 -0
- package/dist/packages/fragno/dist/api/request-input-context.js.map +1 -0
- package/dist/packages/fragno/dist/api/request-middleware.js +83 -0
- package/dist/packages/fragno/dist/api/request-middleware.js.map +1 -0
- package/dist/packages/fragno/dist/api/request-output-context.js +119 -0
- package/dist/packages/fragno/dist/api/request-output-context.js.map +1 -0
- package/dist/packages/fragno/dist/api/route.js +17 -0
- package/dist/packages/fragno/dist/api/route.js.map +1 -0
- package/dist/packages/fragno/dist/internal/symbols.js +10 -0
- package/dist/packages/fragno/dist/internal/symbols.js.map +1 -0
- package/dist/query/column-defaults.js +27 -0
- package/dist/query/column-defaults.js.map +1 -0
- package/dist/query/cursor.d.ts +14 -6
- package/dist/query/cursor.d.ts.map +1 -1
- package/dist/query/cursor.js +16 -7
- package/dist/query/cursor.js.map +1 -1
- package/dist/query/orm/orm.d.ts +1 -1
- package/dist/query/orm/orm.js.map +1 -1
- package/dist/query/serialize/create-sql-serializer.js +30 -0
- package/dist/query/serialize/create-sql-serializer.js.map +1 -0
- package/dist/query/serialize/dialect/mysql-serializer.js +87 -0
- package/dist/query/serialize/dialect/mysql-serializer.js.map +1 -0
- package/dist/query/serialize/dialect/postgres-serializer.js +80 -0
- package/dist/query/serialize/dialect/postgres-serializer.js.map +1 -0
- package/dist/query/serialize/dialect/sqlite-serializer.js +93 -0
- package/dist/query/serialize/dialect/sqlite-serializer.js.map +1 -0
- package/dist/query/serialize/sql-serializer.js +67 -0
- package/dist/query/serialize/sql-serializer.js.map +1 -0
- package/dist/query/{query.d.ts → simple-query-interface.d.ts} +6 -6
- package/dist/query/simple-query-interface.d.ts.map +1 -0
- package/dist/query/unit-of-work/execute-unit-of-work.d.ts +133 -0
- package/dist/query/unit-of-work/execute-unit-of-work.d.ts.map +1 -0
- package/dist/query/unit-of-work/execute-unit-of-work.js +197 -0
- package/dist/query/unit-of-work/execute-unit-of-work.js.map +1 -0
- package/dist/query/unit-of-work/retry-policy.d.ts +88 -0
- package/dist/query/unit-of-work/retry-policy.d.ts.map +1 -0
- package/dist/query/unit-of-work/retry-policy.js +61 -0
- package/dist/query/unit-of-work/retry-policy.js.map +1 -0
- package/dist/query/{unit-of-work.d.ts → unit-of-work/unit-of-work.d.ts} +145 -58
- package/dist/query/unit-of-work/unit-of-work.d.ts.map +1 -0
- package/dist/query/{unit-of-work.js → unit-of-work/unit-of-work.js} +435 -198
- package/dist/query/unit-of-work/unit-of-work.js.map +1 -0
- package/dist/query/value-decoding.js +71 -0
- package/dist/query/value-decoding.js.map +1 -0
- package/dist/query/value-encoding.js +124 -0
- package/dist/query/value-encoding.js.map +1 -0
- package/dist/schema/create.d.ts +3 -0
- package/dist/schema/create.d.ts.map +1 -1
- package/dist/schema/create.js +4 -0
- package/dist/schema/create.js.map +1 -1
- package/dist/schema/type-conversion/create-sql-type-mapper.js +29 -0
- package/dist/schema/type-conversion/create-sql-type-mapper.js.map +1 -0
- package/dist/schema/type-conversion/dialect/mysql.js +57 -0
- package/dist/schema/type-conversion/dialect/mysql.js.map +1 -0
- package/dist/schema/type-conversion/dialect/postgres.js +56 -0
- package/dist/schema/type-conversion/dialect/postgres.js.map +1 -0
- package/dist/schema/type-conversion/dialect/sqlite.js +52 -0
- package/dist/schema/type-conversion/dialect/sqlite.js.map +1 -0
- package/dist/schema/type-conversion/type-mapping.js +63 -0
- package/dist/schema/type-conversion/type-mapping.js.map +1 -0
- package/dist/sql-driver/connection/connection-provider.d.ts +13 -0
- package/dist/sql-driver/connection/connection-provider.d.ts.map +1 -0
- package/dist/sql-driver/connection/connection-provider.js +19 -0
- package/dist/sql-driver/connection/connection-provider.js.map +1 -0
- package/dist/sql-driver/connection/single-connection-provider.js +23 -0
- package/dist/sql-driver/connection/single-connection-provider.js.map +1 -0
- package/dist/sql-driver/dialect-adapter/dialect-adapter.d.ts +7 -0
- package/dist/sql-driver/dialect-adapter/dialect-adapter.d.ts.map +1 -0
- package/dist/sql-driver/dialects/dialects.d.ts +2 -0
- package/dist/sql-driver/dialects/dialects.js +3 -0
- package/dist/sql-driver/dialects/durable-object-dialect.d.ts +72 -0
- package/dist/sql-driver/dialects/durable-object-dialect.d.ts.map +1 -0
- package/dist/sql-driver/dialects/durable-object-dialect.js +130 -0
- package/dist/sql-driver/dialects/durable-object-dialect.js.map +1 -0
- package/dist/sql-driver/driver/runtime-driver.d.ts +23 -0
- package/dist/sql-driver/driver/runtime-driver.d.ts.map +1 -0
- package/dist/sql-driver/driver/runtime-driver.js +56 -0
- package/dist/sql-driver/driver/runtime-driver.js.map +1 -0
- package/dist/sql-driver/query-executor/default-query-executor.js +26 -0
- package/dist/sql-driver/query-executor/default-query-executor.js.map +1 -0
- package/dist/sql-driver/query-executor/plugin.d.ts +17 -0
- package/dist/sql-driver/query-executor/plugin.d.ts.map +1 -0
- package/dist/sql-driver/query-executor/query-executor-base.js +25 -0
- package/dist/sql-driver/query-executor/query-executor-base.js.map +1 -0
- package/dist/sql-driver/query-executor/query-executor.d.ts +36 -0
- package/dist/sql-driver/query-executor/query-executor.d.ts.map +1 -0
- package/dist/sql-driver/sql-driver-adapter.d.ts +29 -0
- package/dist/sql-driver/sql-driver-adapter.d.ts.map +1 -0
- package/dist/sql-driver/sql-driver-adapter.js +68 -0
- package/dist/sql-driver/sql-driver-adapter.js.map +1 -0
- package/dist/sql-driver/sql-driver.d.ts +38 -0
- package/dist/sql-driver/sql-driver.d.ts.map +1 -0
- package/dist/sql-driver/sql-driver.js +1 -0
- package/dist/sql-driver/sql.js +50 -0
- package/dist/sql-driver/sql.js.map +1 -0
- package/dist/with-database.d.ts +32 -0
- package/dist/with-database.d.ts.map +1 -0
- package/dist/with-database.js +34 -0
- package/dist/with-database.js.map +1 -0
- package/package.json +43 -9
- package/src/adapters/adapters.ts +23 -4
- package/src/adapters/drizzle/drizzle-adapter-pglite.test.ts +140 -185
- package/src/adapters/drizzle/{drizzle-adapter-sqlite.test.ts → drizzle-adapter-sqlite3.test.ts} +187 -55
- package/src/adapters/drizzle/drizzle-adapter.ts +14 -93
- package/src/adapters/drizzle/generate.test.ts +102 -269
- package/src/adapters/drizzle/generate.ts +89 -63
- package/src/adapters/drizzle/migrate-drizzle.test.ts +19 -0
- package/src/adapters/drizzle/shared.ts +0 -34
- package/src/adapters/drizzle/test-utils.ts +36 -5
- package/src/adapters/generic-sql/README.md +14 -0
- package/src/adapters/generic-sql/driver-config.ts +144 -0
- package/src/adapters/generic-sql/generic-sql-adapter.test.ts +50 -0
- package/src/adapters/generic-sql/generic-sql-adapter.ts +146 -0
- package/src/adapters/generic-sql/generic-sql-uow-executor.ts +130 -0
- package/src/adapters/generic-sql/migration/cold-kysely.ts +55 -0
- package/src/adapters/{kysely/migration/execute-mysql.test.ts → generic-sql/migration/dialect/mysql.test.ts} +342 -484
- package/src/adapters/generic-sql/migration/dialect/mysql.ts +104 -0
- package/src/adapters/generic-sql/migration/dialect/postgres.test.ts +1008 -0
- package/src/adapters/generic-sql/migration/dialect/postgres.ts +113 -0
- package/src/adapters/{kysely/migration/execute-sqlite.test.ts → generic-sql/migration/dialect/sqlite.test.ts} +307 -510
- package/src/adapters/generic-sql/migration/dialect/sqlite.ts +189 -0
- package/src/adapters/generic-sql/migration/executor.ts +33 -0
- package/src/adapters/generic-sql/migration/prepared-migrations.test.ts +661 -0
- package/src/adapters/generic-sql/migration/prepared-migrations.ts +214 -0
- package/src/adapters/generic-sql/migration/sql-generator.ts +413 -0
- package/src/adapters/generic-sql/query/create-sql-query-compiler.ts +36 -0
- package/src/adapters/generic-sql/query/cursor-utils.ts +56 -0
- package/src/adapters/generic-sql/query/dialect/mysql.ts +34 -0
- package/src/adapters/generic-sql/query/dialect/postgres.ts +32 -0
- package/src/adapters/generic-sql/query/dialect/sqlite.ts +32 -0
- package/src/adapters/generic-sql/query/generic-sql-uow-operation-compiler.test.ts +1568 -0
- package/src/adapters/generic-sql/query/generic-sql-uow-operation-compiler.ts +314 -0
- package/src/adapters/generic-sql/query/select-builder.test.ts +256 -0
- package/src/adapters/generic-sql/query/select-builder.ts +137 -0
- package/src/adapters/generic-sql/query/sql-query-compiler.test.ts +195 -0
- package/src/adapters/generic-sql/query/sql-query-compiler.ts +367 -0
- package/src/adapters/generic-sql/query/where-builder.test.ts +744 -0
- package/src/adapters/generic-sql/query/where-builder.ts +211 -0
- package/src/adapters/generic-sql/result-interpreter.ts +102 -0
- package/src/adapters/generic-sql/test/generic-drizzle-adapter-sqlite3.test.ts +899 -0
- package/src/adapters/generic-sql/uow-decoder.test.ts +399 -0
- package/src/adapters/generic-sql/uow-decoder.ts +152 -0
- package/src/adapters/generic-sql/uow-encoder.test.ts +183 -0
- package/src/adapters/generic-sql/uow-encoder.ts +131 -0
- package/src/adapters/kysely/kysely-adapter-pglite.test.ts +90 -96
- package/src/adapters/kysely/kysely-adapter-sqlocal.test.ts +215 -0
- package/src/adapters/kysely/kysely-adapter.ts +10 -242
- package/src/adapters/{drizzle/drizzle-query.ts → shared/from-unit-of-work-compiler.ts} +111 -106
- package/src/adapters/shared/table-name-mapper.ts +50 -0
- package/src/adapters/shared/uow-operation-compiler.ts +211 -0
- package/src/db-fragment-definition-builder.test.ts +887 -0
- package/src/db-fragment-definition-builder.ts +737 -0
- package/src/db-fragment-instantiator.test.ts +543 -0
- package/src/db-fragment-integration.test.ts +406 -0
- package/src/fragments/internal-fragment.test.ts +549 -0
- package/src/fragments/internal-fragment.ts +249 -0
- package/src/hooks/hooks.test.ts +575 -0
- package/src/hooks/hooks.ts +179 -0
- package/src/migration-engine/generation-engine.test.ts +60 -27
- package/src/migration-engine/generation-engine.ts +99 -92
- package/src/mod.ts +139 -78
- package/src/query/column-defaults.ts +49 -0
- package/src/query/cursor.test.ts +147 -3
- package/src/query/cursor.ts +25 -8
- package/src/query/orm/orm.ts +1 -1
- package/src/query/query-type.test.ts +9 -9
- package/src/query/serialize/create-sql-serializer.ts +34 -0
- package/src/query/serialize/dialect/mysql-serializer.ts +142 -0
- package/src/query/serialize/dialect/postgres-serializer.ts +129 -0
- package/src/query/serialize/dialect/sqlite-serializer.test.ts +251 -0
- package/src/query/serialize/dialect/sqlite-serializer.ts +156 -0
- package/src/query/serialize/sql-serializer.ts +143 -0
- package/src/query/{query.ts → simple-query-interface.ts} +4 -4
- package/src/query/unit-of-work/execute-unit-of-work.test.ts +1310 -0
- package/src/query/unit-of-work/execute-unit-of-work.ts +504 -0
- package/src/query/unit-of-work/retry-policy.test.ts +217 -0
- package/src/query/unit-of-work/retry-policy.ts +141 -0
- package/src/query/unit-of-work/unit-of-work-coordinator.test.ts +831 -0
- package/src/query/{unit-of-work-types.test.ts → unit-of-work/unit-of-work-types.test.ts} +7 -5
- package/src/query/unit-of-work/unit-of-work.test.ts +1716 -0
- package/src/query/{unit-of-work.ts → unit-of-work/unit-of-work.ts} +716 -420
- package/src/query/{result-transform.test.ts → value-decoding.test.ts} +45 -298
- package/src/query/value-decoding.ts +113 -0
- package/src/query/value-encoding.test.ts +390 -0
- package/src/query/value-encoding.ts +168 -0
- package/src/schema/create.test.ts +5 -1
- package/src/schema/create.ts +5 -0
- package/src/schema/serialize.test.ts +165 -407
- package/src/schema/type-conversion/create-sql-type-mapper.ts +28 -0
- package/src/schema/type-conversion/dialect/mysql.ts +64 -0
- package/src/schema/type-conversion/dialect/postgres.ts +62 -0
- package/src/schema/type-conversion/dialect/sqlite.ts +63 -0
- package/src/schema/type-conversion/type-mapping.test.ts +137 -0
- package/src/schema/type-conversion/type-mapping.ts +153 -0
- package/src/shared/connection-pool.ts +5 -5
- package/src/sql-driver/better-sqlite3.test.ts +126 -0
- package/src/sql-driver/connection/connection-provider.ts +27 -0
- package/src/sql-driver/connection/single-connection-provider.ts +42 -0
- package/src/sql-driver/dialect-adapter/dialect-adapter.ts +9 -0
- package/src/sql-driver/dialect-adapter/sqlite-dialect-adapter.ts +7 -0
- package/src/sql-driver/dialects/dialects.ts +1 -0
- package/src/sql-driver/dialects/durable-object-dialect.ts +260 -0
- package/src/sql-driver/driver/runtime-driver.ts +91 -0
- package/src/sql-driver/query-executor/default-query-executor.ts +38 -0
- package/src/sql-driver/query-executor/plugin.ts +22 -0
- package/src/sql-driver/query-executor/query-executor-base.ts +53 -0
- package/src/sql-driver/query-executor/query-executor.ts +44 -0
- package/src/sql-driver/sql-driver-adapter.ts +96 -0
- package/src/sql-driver/sql-driver.ts +53 -0
- package/src/sql-driver/sql.ts +57 -0
- package/src/sql-driver/sqlocal.test.ts +117 -0
- package/src/with-database.ts +152 -0
- package/tsdown.config.ts +8 -2
- package/dist/adapters/drizzle/drizzle-connection-pool.js +0 -40
- package/dist/adapters/drizzle/drizzle-connection-pool.js.map +0 -1
- package/dist/adapters/drizzle/drizzle-query.d.ts +0 -23
- package/dist/adapters/drizzle/drizzle-query.d.ts.map +0 -1
- package/dist/adapters/drizzle/drizzle-query.js.map +0 -1
- package/dist/adapters/drizzle/drizzle-uow-compiler.d.ts +0 -10
- package/dist/adapters/drizzle/drizzle-uow-compiler.d.ts.map +0 -1
- package/dist/adapters/drizzle/drizzle-uow-compiler.js +0 -315
- package/dist/adapters/drizzle/drizzle-uow-compiler.js.map +0 -1
- package/dist/adapters/drizzle/drizzle-uow-decoder.js +0 -116
- package/dist/adapters/drizzle/drizzle-uow-decoder.js.map +0 -1
- package/dist/adapters/drizzle/drizzle-uow-executor.js +0 -149
- package/dist/adapters/drizzle/drizzle-uow-executor.js.map +0 -1
- package/dist/adapters/drizzle/join-column-utils.js +0 -28
- package/dist/adapters/drizzle/join-column-utils.js.map +0 -1
- package/dist/adapters/drizzle/shared.d.ts +0 -14
- package/dist/adapters/drizzle/shared.d.ts.map +0 -1
- package/dist/adapters/drizzle/shared.js +0 -35
- package/dist/adapters/drizzle/shared.js.map +0 -1
- package/dist/adapters/kysely/kysely-connection-pool.js +0 -41
- package/dist/adapters/kysely/kysely-connection-pool.js.map +0 -1
- package/dist/adapters/kysely/kysely-query-builder.js +0 -321
- package/dist/adapters/kysely/kysely-query-builder.js.map +0 -1
- package/dist/adapters/kysely/kysely-query-compiler.js +0 -66
- package/dist/adapters/kysely/kysely-query-compiler.js.map +0 -1
- package/dist/adapters/kysely/kysely-query.d.ts +0 -22
- package/dist/adapters/kysely/kysely-query.d.ts.map +0 -1
- package/dist/adapters/kysely/kysely-query.js +0 -223
- package/dist/adapters/kysely/kysely-query.js.map +0 -1
- package/dist/adapters/kysely/kysely-shared.d.ts.map +0 -1
- package/dist/adapters/kysely/kysely-shared.js +0 -18
- package/dist/adapters/kysely/kysely-shared.js.map +0 -1
- package/dist/adapters/kysely/kysely-uow-compiler.js +0 -170
- package/dist/adapters/kysely/kysely-uow-compiler.js.map +0 -1
- package/dist/adapters/kysely/kysely-uow-executor.js +0 -89
- package/dist/adapters/kysely/kysely-uow-executor.js.map +0 -1
- package/dist/adapters/kysely/migration/execute-base.js +0 -128
- package/dist/adapters/kysely/migration/execute-base.js.map +0 -1
- package/dist/adapters/kysely/migration/execute-factory.js +0 -34
- package/dist/adapters/kysely/migration/execute-factory.js.map +0 -1
- package/dist/adapters/kysely/migration/execute-mssql.js +0 -112
- package/dist/adapters/kysely/migration/execute-mssql.js.map +0 -1
- package/dist/adapters/kysely/migration/execute-mysql.js +0 -93
- package/dist/adapters/kysely/migration/execute-mysql.js.map +0 -1
- package/dist/adapters/kysely/migration/execute-postgres.js +0 -104
- package/dist/adapters/kysely/migration/execute-postgres.js.map +0 -1
- package/dist/adapters/kysely/migration/execute-sqlite.js +0 -123
- package/dist/adapters/kysely/migration/execute-sqlite.js.map +0 -1
- package/dist/adapters/kysely/migration/execute.js +0 -34
- package/dist/adapters/kysely/migration/execute.js.map +0 -1
- package/dist/bind-services.d.ts +0 -7
- package/dist/bind-services.d.ts.map +0 -1
- package/dist/bind-services.js +0 -14
- package/dist/bind-services.js.map +0 -1
- package/dist/fragment.d.ts +0 -173
- package/dist/fragment.d.ts.map +0 -1
- package/dist/fragment.js +0 -191
- package/dist/fragment.js.map +0 -1
- package/dist/migration-engine/create.d.ts +0 -37
- package/dist/migration-engine/create.d.ts.map +0 -1
- package/dist/migration-engine/create.js +0 -58
- package/dist/migration-engine/create.js.map +0 -1
- package/dist/migration-engine/shared.d.ts +0 -112
- package/dist/migration-engine/shared.d.ts.map +0 -1
- package/dist/query/query.d.ts.map +0 -1
- package/dist/query/result-transform.js +0 -168
- package/dist/query/result-transform.js.map +0 -1
- package/dist/query/unit-of-work.d.ts.map +0 -1
- package/dist/query/unit-of-work.js.map +0 -1
- package/dist/schema/serialize.js +0 -106
- package/dist/schema/serialize.js.map +0 -1
- package/dist/shared/settings-schema.js +0 -36
- package/dist/shared/settings-schema.js.map +0 -1
- package/src/adapters/drizzle/drizzle-adapter.test.ts +0 -170
- package/src/adapters/drizzle/drizzle-connection-pool.ts +0 -66
- package/src/adapters/drizzle/drizzle-query.test.ts +0 -499
- package/src/adapters/drizzle/drizzle-uow-compiler.test.ts +0 -1383
- package/src/adapters/drizzle/drizzle-uow-compiler.ts +0 -636
- package/src/adapters/drizzle/drizzle-uow-decoder.ts +0 -218
- package/src/adapters/drizzle/drizzle-uow-executor.ts +0 -276
- package/src/adapters/drizzle/join-column-utils.test.ts +0 -79
- package/src/adapters/drizzle/join-column-utils.ts +0 -39
- package/src/adapters/kysely/kysely-connection-pool.ts +0 -70
- package/src/adapters/kysely/kysely-query-builder.test.ts +0 -1344
- package/src/adapters/kysely/kysely-query-builder.ts +0 -666
- package/src/adapters/kysely/kysely-query-compiler.ts +0 -132
- package/src/adapters/kysely/kysely-query.test.ts +0 -498
- package/src/adapters/kysely/kysely-query.ts +0 -390
- package/src/adapters/kysely/kysely-shared.ts +0 -23
- package/src/adapters/kysely/kysely-uow-compiler.test.ts +0 -998
- package/src/adapters/kysely/kysely-uow-compiler.ts +0 -318
- package/src/adapters/kysely/kysely-uow-executor.ts +0 -145
- package/src/adapters/kysely/kysely-uow-joins.test.ts +0 -811
- package/src/adapters/kysely/migration/execute-base.ts +0 -256
- package/src/adapters/kysely/migration/execute-factory.ts +0 -53
- package/src/adapters/kysely/migration/execute-mssql.ts +0 -250
- package/src/adapters/kysely/migration/execute-mysql.ts +0 -211
- package/src/adapters/kysely/migration/execute-postgres.test.ts +0 -2657
- package/src/adapters/kysely/migration/execute-postgres.ts +0 -234
- package/src/adapters/kysely/migration/execute-sqlite.ts +0 -247
- package/src/adapters/kysely/migration/execute.ts +0 -50
- package/src/adapters/kysely/migration/kysely-migrator.test.ts +0 -261
- package/src/bind-services.test.ts +0 -214
- package/src/bind-services.ts +0 -37
- package/src/db-fragment.test.ts +0 -800
- package/src/fragment.ts +0 -727
- package/src/query/result-transform.ts +0 -271
- package/src/query/unit-of-work-multi-schema.test.ts +0 -64
- package/src/query/unit-of-work.test.ts +0 -943
- package/src/schema/serialize.ts +0 -396
- package/src/shared/settings-schema.ts +0 -61
- package/src/uow-context-integration.test.ts +0 -102
- package/src/uow-context.test.ts +0 -182
- /package/dist/query/{query.js → simple-query-interface.js} +0 -0
|
@@ -1,168 +0,0 @@
|
|
|
1
|
-
import { createId } from "../id.js";
|
|
2
|
-
import { FragnoId, FragnoReference } from "../schema/create.js";
|
|
3
|
-
import { deserialize, serialize } from "../schema/serialize.js";
|
|
4
|
-
|
|
5
|
-
//#region src/query/result-transform.ts
|
|
6
|
-
/**
|
|
7
|
-
* Marker class for reference column values that need subquery resolution.
|
|
8
|
-
* When a reference column receives a string (external ID), this marker tells
|
|
9
|
-
* the query builder to generate a subquery to look up the internal ID.
|
|
10
|
-
* @internal
|
|
11
|
-
*/
|
|
12
|
-
var ReferenceSubquery = class {
|
|
13
|
-
#referencedTable;
|
|
14
|
-
#externalIdValue;
|
|
15
|
-
constructor(referencedTable, externalIdValue) {
|
|
16
|
-
this.#referencedTable = referencedTable;
|
|
17
|
-
this.#externalIdValue = externalIdValue;
|
|
18
|
-
}
|
|
19
|
-
get referencedTable() {
|
|
20
|
-
return this.#referencedTable;
|
|
21
|
-
}
|
|
22
|
-
get externalIdValue() {
|
|
23
|
-
return this.#externalIdValue;
|
|
24
|
-
}
|
|
25
|
-
};
|
|
26
|
-
/**
|
|
27
|
-
* Generate a runtime default value for a column that has defaultTo$()
|
|
28
|
-
*
|
|
29
|
-
* Only generates values for runtime defaults (defaultTo$), NOT static defaults (defaultTo).
|
|
30
|
-
* Static defaults should be handled by the database via DEFAULT constraints.
|
|
31
|
-
*
|
|
32
|
-
* @param column - The column with a default value configuration
|
|
33
|
-
* @returns The generated default value, or undefined if the column has no runtime default
|
|
34
|
-
*
|
|
35
|
-
* @internal
|
|
36
|
-
*/
|
|
37
|
-
function generateRuntimeDefault(column) {
|
|
38
|
-
if (!column.default) return;
|
|
39
|
-
if ("value" in column.default) return;
|
|
40
|
-
if ("dbSpecial" in column.default) return;
|
|
41
|
-
const runtime = column.default.runtime;
|
|
42
|
-
if (runtime === "cuid") return createId();
|
|
43
|
-
if (runtime === "now") return /* @__PURE__ */ new Date();
|
|
44
|
-
if (typeof runtime === "function") return runtime();
|
|
45
|
-
}
|
|
46
|
-
/**
|
|
47
|
-
* Encodes a record of values from the application format to database format.
|
|
48
|
-
*
|
|
49
|
-
* This function transforms object keys to match SQL column names and serializes
|
|
50
|
-
* values according to the database provider's requirements (e.g., converting
|
|
51
|
-
* JavaScript Date objects to numbers for SQLite).
|
|
52
|
-
*
|
|
53
|
-
* @param values - The record of values to encode in application format
|
|
54
|
-
* @param table - The table schema definition containing column information
|
|
55
|
-
* @param generateDefault - Whether to generate default values for undefined columns
|
|
56
|
-
* @param provider - The SQL provider (sqlite, postgresql, mysql, etc.)
|
|
57
|
-
* @returns A record with database-compatible column names and serialized values
|
|
58
|
-
*
|
|
59
|
-
* @example
|
|
60
|
-
* ```ts
|
|
61
|
-
* const encoded = encodeValues(
|
|
62
|
-
* { userId: 123, createdAt: new Date() },
|
|
63
|
-
* userTable,
|
|
64
|
-
* true,
|
|
65
|
-
* 'sqlite'
|
|
66
|
-
* );
|
|
67
|
-
* // Returns: { user_id: 123, created_at: 1234567890 }
|
|
68
|
-
* ```
|
|
69
|
-
*/
|
|
70
|
-
function encodeValues(values, table, generateDefault, provider) {
|
|
71
|
-
const result = {};
|
|
72
|
-
for (const k in table.columns) {
|
|
73
|
-
const col = table.columns[k];
|
|
74
|
-
if (col.role === "internal-id") continue;
|
|
75
|
-
let value = values[k];
|
|
76
|
-
if (generateDefault && value === void 0) value = generateRuntimeDefault(col);
|
|
77
|
-
if (value !== void 0) {
|
|
78
|
-
if (col.role === "reference") {
|
|
79
|
-
if (typeof value === "string") {
|
|
80
|
-
const relation = Object.values(table.relations).find((rel) => rel.on.some(([localCol]) => localCol === k));
|
|
81
|
-
if (relation) {
|
|
82
|
-
result[col.name] = new ReferenceSubquery(relation.table, value);
|
|
83
|
-
continue;
|
|
84
|
-
}
|
|
85
|
-
throw new Error(`Reference column ${k} not found in table ${table.name}`);
|
|
86
|
-
} else if (value instanceof FragnoId) if (value.internalId !== void 0) {
|
|
87
|
-
result[col.name] = value.internalId;
|
|
88
|
-
continue;
|
|
89
|
-
} else {
|
|
90
|
-
const relation = Object.values(table.relations).find((rel) => rel.on.some(([localCol]) => localCol === k));
|
|
91
|
-
if (relation) {
|
|
92
|
-
result[col.name] = new ReferenceSubquery(relation.table, value.externalId);
|
|
93
|
-
continue;
|
|
94
|
-
}
|
|
95
|
-
throw new Error(`Reference column ${k} not found in table ${table.name}`);
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
result[col.name] = serialize(value, col, provider);
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
return result;
|
|
102
|
-
}
|
|
103
|
-
/**
|
|
104
|
-
* Decodes a database result record to application format.
|
|
105
|
-
*
|
|
106
|
-
* This function transforms database column names back to application property names
|
|
107
|
-
* and deserializes values according to the database provider's format (e.g., converting
|
|
108
|
-
* SQLite integers back to JavaScript Date objects).
|
|
109
|
-
*
|
|
110
|
-
* Supports relation data encoded with the pattern `relationName:columnName`.
|
|
111
|
-
*
|
|
112
|
-
* @param result - The raw database result record
|
|
113
|
-
* @param table - The table schema definition containing column and relation information
|
|
114
|
-
* @param provider - The SQL provider (sqlite, postgresql, mysql, etc.)
|
|
115
|
-
* @returns A record in application format with deserialized values
|
|
116
|
-
*
|
|
117
|
-
* @example
|
|
118
|
-
* ```ts
|
|
119
|
-
* const decoded = decodeResult(
|
|
120
|
-
* { user_id: 123, created_at: 1234567890, 'posts:title': 'Hello' },
|
|
121
|
-
* userTable,
|
|
122
|
-
* 'sqlite'
|
|
123
|
-
* );
|
|
124
|
-
* // Returns: { userId: 123, createdAt: Date, posts: { title: 'Hello' } }
|
|
125
|
-
* ```
|
|
126
|
-
*/
|
|
127
|
-
function decodeResult(result, table, provider) {
|
|
128
|
-
const output = {};
|
|
129
|
-
const columnValues = {};
|
|
130
|
-
const relationData = {};
|
|
131
|
-
for (const k in result) {
|
|
132
|
-
const colonIndex = k.indexOf(":");
|
|
133
|
-
const value = result[k];
|
|
134
|
-
if (colonIndex === -1) {
|
|
135
|
-
const col = table.columns[k];
|
|
136
|
-
if (!col) continue;
|
|
137
|
-
columnValues[k] = deserialize(value, col, provider);
|
|
138
|
-
continue;
|
|
139
|
-
}
|
|
140
|
-
const relationName = k.slice(0, colonIndex);
|
|
141
|
-
const remainder = k.slice(colonIndex + 1);
|
|
142
|
-
if (table.relations[relationName] === void 0) continue;
|
|
143
|
-
relationData[relationName] ??= {};
|
|
144
|
-
relationData[relationName][remainder] = value;
|
|
145
|
-
}
|
|
146
|
-
for (const relationName in relationData) {
|
|
147
|
-
const relation = table.relations[relationName];
|
|
148
|
-
if (!relation) continue;
|
|
149
|
-
output[relationName] = decodeResult(relationData[relationName], relation.table, provider);
|
|
150
|
-
}
|
|
151
|
-
for (const k in columnValues) {
|
|
152
|
-
const col = table.columns[k];
|
|
153
|
-
if (!col) continue;
|
|
154
|
-
if (col.isHidden) continue;
|
|
155
|
-
if (col.role === "external-id" && columnValues["_internalId"] !== void 0) output[k] = new FragnoId({
|
|
156
|
-
externalId: columnValues[k],
|
|
157
|
-
internalId: columnValues["_internalId"],
|
|
158
|
-
version: columnValues["_version"]
|
|
159
|
-
});
|
|
160
|
-
else if (col.role === "reference") output[k] = FragnoReference.fromInternal(columnValues[k]);
|
|
161
|
-
else output[k] = columnValues[k];
|
|
162
|
-
}
|
|
163
|
-
return output;
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
//#endregion
|
|
167
|
-
export { ReferenceSubquery, decodeResult, encodeValues };
|
|
168
|
-
//# sourceMappingURL=result-transform.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"result-transform.js","names":["#referencedTable","#externalIdValue","result: Record<string, unknown>","output: Record<string, unknown>","columnValues: Record<string, unknown>","relationData: Record<string, Record<string, unknown>>"],"sources":["../../src/query/result-transform.ts"],"sourcesContent":["import type { AnyColumn, AnyTable } from \"../schema/create\";\nimport type { SQLProvider } from \"../shared/providers\";\nimport { deserialize, serialize } from \"../schema/serialize\";\nimport { FragnoId, FragnoReference } from \"../schema/create\";\nimport { createId } from \"../id\";\n\n/**\n * Marker class for reference column values that need subquery resolution.\n * When a reference column receives a string (external ID), this marker tells\n * the query builder to generate a subquery to look up the internal ID.\n * @internal\n */\nexport class ReferenceSubquery {\n #referencedTable: AnyTable;\n #externalIdValue: string;\n\n constructor(referencedTable: AnyTable, externalIdValue: string) {\n this.#referencedTable = referencedTable;\n this.#externalIdValue = externalIdValue;\n }\n\n get referencedTable() {\n return this.#referencedTable;\n }\n\n get externalIdValue() {\n return this.#externalIdValue;\n }\n}\n\n/**\n * Generate a runtime default value for a column that has defaultTo$()\n *\n * Only generates values for runtime defaults (defaultTo$), NOT static defaults (defaultTo).\n * Static defaults should be handled by the database via DEFAULT constraints.\n *\n * @param column - The column with a default value configuration\n * @returns The generated default value, or undefined if the column has no runtime default\n *\n * @internal\n */\nexport function generateRuntimeDefault(column: AnyColumn): unknown {\n // Check if column has a default value configuration\n if (!column.default) {\n return undefined;\n }\n\n // If it's a static default value (defaultTo), return undefined\n // as the database should handle this via DEFAULT constraint\n if (\"value\" in column.default) {\n return undefined;\n }\n\n // If it's a database-level special function (defaultTo(b => b.now())), return undefined\n // as the database should handle this via DEFAULT NOW() or equivalent\n if (\"dbSpecial\" in column.default) {\n return undefined;\n }\n\n // Handle runtime defaults (defaultTo$)\n const runtime = column.default.runtime;\n\n if (runtime === \"cuid\") {\n return createId();\n }\n\n if (runtime === \"now\") {\n return new Date();\n }\n\n if (typeof runtime === \"function\") {\n return runtime();\n }\n\n return undefined;\n}\n\n/**\n * Encodes a record of values from the application format to database format.\n *\n * This function transforms object keys to match SQL column names and serializes\n * values according to the database provider's requirements (e.g., converting\n * JavaScript Date objects to numbers for SQLite).\n *\n * @param values - The record of values to encode in application format\n * @param table - The table schema definition containing column information\n * @param generateDefault - Whether to generate default values for undefined columns\n * @param provider - The SQL provider (sqlite, postgresql, mysql, etc.)\n * @returns A record with database-compatible column names and serialized values\n *\n * @example\n * ```ts\n * const encoded = encodeValues(\n * { userId: 123, createdAt: new Date() },\n * userTable,\n * true,\n * 'sqlite'\n * );\n * // Returns: { user_id: 123, created_at: 1234567890 }\n * ```\n */\nexport function encodeValues(\n values: Record<string, unknown>,\n table: AnyTable,\n generateDefault: boolean,\n provider: SQLProvider,\n): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n\n for (const k in table.columns) {\n const col = table.columns[k];\n\n // Skip internal ID - never provided by user, auto-generated by database\n if (col.role === \"internal-id\") {\n continue;\n }\n let value = values[k];\n\n if (generateDefault && value === undefined) {\n // Only generate runtime defaults (defaultTo$), not static defaults (defaultTo).\n // Static defaults should be handled by the database via DEFAULT constraints.\n value = generateRuntimeDefault(col);\n }\n\n if (value !== undefined) {\n // Handle string references and FragnoId objects\n if (col.role === \"reference\") {\n if (typeof value === \"string\") {\n // String external ID - generate subquery\n const relation = Object.values(table.relations).find((rel) =>\n rel.on.some(([localCol]) => localCol === k),\n );\n if (relation) {\n result[col.name] = new ReferenceSubquery(relation.table, value);\n continue;\n }\n throw new Error(`Reference column ${k} not found in table ${table.name}`);\n } else if (value instanceof FragnoId) {\n // FragnoId object\n if (value.internalId !== undefined) {\n // If internal ID is populated, use it directly (no subquery needed)\n result[col.name] = value.internalId;\n continue;\n } else {\n // If internal ID is not populated, use external ID via subquery\n const relation = Object.values(table.relations).find((rel) =>\n rel.on.some(([localCol]) => localCol === k),\n );\n if (relation) {\n result[col.name] = new ReferenceSubquery(relation.table, value.externalId);\n continue;\n }\n throw new Error(`Reference column ${k} not found in table ${table.name}`);\n }\n }\n }\n\n result[col.name] = serialize(value, col, provider);\n }\n }\n\n return result;\n}\n\n/**\n * Decodes a database result record to application format.\n *\n * This function transforms database column names back to application property names\n * and deserializes values according to the database provider's format (e.g., converting\n * SQLite integers back to JavaScript Date objects).\n *\n * Supports relation data encoded with the pattern `relationName:columnName`.\n *\n * @param result - The raw database result record\n * @param table - The table schema definition containing column and relation information\n * @param provider - The SQL provider (sqlite, postgresql, mysql, etc.)\n * @returns A record in application format with deserialized values\n *\n * @example\n * ```ts\n * const decoded = decodeResult(\n * { user_id: 123, created_at: 1234567890, 'posts:title': 'Hello' },\n * userTable,\n * 'sqlite'\n * );\n * // Returns: { userId: 123, createdAt: Date, posts: { title: 'Hello' } }\n * ```\n */\nexport function decodeResult(\n result: Record<string, unknown>,\n table: AnyTable,\n provider: SQLProvider,\n): Record<string, unknown> {\n const output: Record<string, unknown> = {};\n // First pass: collect all column values\n const columnValues: Record<string, unknown> = {};\n\n // Collect all relation data (including nested) keyed by relation name\n const relationData: Record<string, Record<string, unknown>> = {};\n\n for (const k in result) {\n const colonIndex = k.indexOf(\":\");\n const value = result[k];\n\n // Direct column (no colon)\n if (colonIndex === -1) {\n const col = table.columns[k];\n if (!col) {\n continue;\n }\n\n // Store all column values (including hidden ones for FragnoId creation)\n columnValues[k] = deserialize(value, col, provider);\n continue;\n }\n\n // Relation column (has colon)\n const relationName = k.slice(0, colonIndex);\n const remainder = k.slice(colonIndex + 1);\n\n const relation = table.relations[relationName];\n if (relation === undefined) {\n continue;\n }\n\n // Collect relation data with the remaining key path\n relationData[relationName] ??= {};\n relationData[relationName][remainder] = value;\n }\n\n // Process each relation's data recursively\n for (const relationName in relationData) {\n const relation = table.relations[relationName];\n if (!relation) {\n continue;\n }\n\n // Recursively decode the relation data\n output[relationName] = decodeResult(relationData[relationName], relation.table, provider);\n }\n\n // Second pass: create output with FragnoId objects where appropriate\n for (const k in columnValues) {\n const col = table.columns[k];\n if (!col) {\n continue;\n }\n\n // Filter out hidden columns (like _internalId, _version) from results\n if (col.isHidden) {\n continue;\n }\n\n // For external ID columns, create FragnoId if we have both external and internal IDs\n if (col.role === \"external-id\" && columnValues[\"_internalId\"] !== undefined) {\n output[k] = new FragnoId({\n externalId: columnValues[k] as string,\n internalId: columnValues[\"_internalId\"] as bigint,\n // _version is always selected as a hidden column, so it should always be present\n version: columnValues[\"_version\"] as number,\n });\n } else if (col.role === \"reference\") {\n // For reference columns, create FragnoReference with internal ID\n output[k] = FragnoReference.fromInternal(columnValues[k] as bigint);\n } else {\n output[k] = columnValues[k];\n }\n }\n\n return output;\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"unit-of-work.d.ts","names":[],"sources":["../../src/query/unit-of-work.ts"],"sourcesContent":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"unit-of-work.js","names":["#table","#tableName","#indexName","#whereClause","#countMode","#selectClause","#orderByIndexClause","#afterCursor","#cursorMetadata","#beforeCursor","#pageSizeValue","#joinClause","compiledJoins: CompiledJoin[] | undefined","options: FindOptions<TTable, TSelect>","#id","#setValues","#checkVersion","compiled: CompiledJoin[]","builder: Record<string, unknown>","conditions: Condition | undefined","orderBy: [AnyColumn, \"asc\" | \"desc\"][] | undefined","#schema","#compiler","#executor","#decoder","#name","#config","#schemaNamespaceMap","#retrievalPhasePromise","#retrievalPhaseResolve","#mutationPhasePromise","#mutationPhaseResolve","#state","#retrievalOps","retrievalBatch: unknown[]","#retrievalResults","externalId: string","#mutationOps","mutationBatch: CompiledMutation<unknown>[]","#createdInternalIds","createdIds: FragnoId[]","retrievalBatch: TOutput[]","mutationBatch: CompiledMutation<TOutput>[]","#namespace","#parent","#operationIndices"],"sources":["../../src/query/unit-of-work.ts"],"sourcesContent":["import type { AnySchema, AnyTable, Index, IdColumn, AnyColumn, Relation } from \"../schema/create\";\nimport { FragnoId } from \"../schema/create\";\nimport type { Condition, ConditionBuilder } from \"./condition-builder\";\nimport type {\n SelectClause,\n TableToInsertValues,\n TableToUpdateValues,\n SelectResult,\n ExtractSelect,\n ExtractJoinOut,\n} from \"./query\";\nimport { buildCondition } from \"./condition-builder\";\nimport type { CompiledJoin } from \"./orm/orm\";\nimport type { CursorResult } from \"./cursor\";\nimport { Cursor } from \"./cursor\";\nimport type { Prettify } from \"../util/types\";\n\n/**\n * Builder for updateMany operations that supports both whereIndex and set chaining\n */\nexport interface UpdateManyBuilder<TTable extends AnyTable> {\n whereIndex<TIndexName extends ValidIndexName<TTable>>(\n indexName: TIndexName,\n condition?: (eb: IndexSpecificConditionBuilder<TTable, TIndexName>) => Condition | boolean,\n ): this;\n set(values: TableToUpdateValues<TTable>): this;\n}\n\n/**\n * Extract column names from a single index\n */\nexport type IndexColumns<TIndex extends Index> = TIndex[\"columnNames\"][number];\n\ntype RemoveEmptyObject<T> = T extends object ? (keyof T extends never ? never : T) : never;\n\n/**\n * Extract all indexed column names from a table's indexes\n */\ntype IndexedColumns<TIndexes extends Record<string, Index>> = TIndexes[keyof TIndexes] extends Index\n ? IndexColumns<TIndexes[keyof TIndexes]>\n : never;\n\ntype OmitNever<T> = { [K in keyof T as T[K] extends never ? never : K]: T[K] };\n\n/**\n * Extract the name of the ID column from a table\n * Checks if column has 'id' property set to true (which IdColumn class has)\n */\nexport type InferIdColumnName<TTable extends AnyTable> = keyof OmitNever<{\n [K in keyof TTable[\"columns\"]]: TTable[\"columns\"][K] extends IdColumn<\n infer _,\n infer __,\n infer ___\n >\n ? K\n : never;\n}>;\n\n/**\n * Get the columns for a specific index name.\n * For \"primary\", returns only the ID column.\n * For named indexes, returns the columns defined in that index.\n */\ntype ColumnsForIndex<\n TTable extends AnyTable,\n TIndexName extends ValidIndexName<TTable>,\n> = TIndexName extends \"primary\"\n ? Pick<TTable[\"columns\"], InferIdColumnName<TTable>>\n : TIndexName extends keyof TTable[\"indexes\"]\n ? Pick<TTable[\"columns\"], IndexColumns<TTable[\"indexes\"][TIndexName]>>\n : never;\n\n/**\n * ConditionBuilder restricted to indexed columns only.\n * Used throughout Unit of Work to ensure all queries can leverage indexes for optimal performance.\n */\nexport type IndexedConditionBuilder<TTable extends AnyTable> = ConditionBuilder<\n Pick<TTable[\"columns\"], IndexedColumns<TTable[\"indexes\"]>>\n>;\n\n/**\n * ConditionBuilder restricted to columns in a specific index.\n */\ntype IndexSpecificConditionBuilder<\n TTable extends AnyTable,\n TIndexName extends ValidIndexName<TTable>,\n> = ConditionBuilder<ColumnsForIndex<TTable, TIndexName>>;\n\n/**\n * Valid index names for a table, including the static \"primary\" index\n */\nexport type ValidIndexName<TTable extends AnyTable> =\n | \"primary\"\n | (string & keyof TTable[\"indexes\"]);\n\n/**\n * Find options for Unit of Work (internal, used after builder finalization)\n */\ntype FindOptions<\n TTable extends AnyTable = AnyTable,\n TSelect extends SelectClause<TTable> = SelectClause<TTable>,\n> = {\n /**\n * Which index to use for this query (required)\n */\n useIndex: string;\n /**\n * Select clause - which columns to return\n */\n select?: TSelect;\n /**\n * Where clause - filtering restricted to indexed columns only\n */\n where?: (eb: IndexedConditionBuilder<TTable>) => Condition | boolean;\n /**\n * Order by index - specify which index to order by and direction\n */\n orderByIndex?: {\n indexName: string;\n direction: \"asc\" | \"desc\";\n };\n /**\n * Cursor for pagination - continue after this cursor\n */\n after?: Cursor | string;\n /**\n * Cursor for pagination - continue before this cursor\n */\n before?: Cursor | string;\n /**\n * Number of results per page\n */\n pageSize?: number;\n /**\n * Join operations to include related data\n */\n joins?: CompiledJoin[];\n};\n\n/**\n * Unit of Work state machine\n */\nexport type UOWState = \"building-retrieval\" | \"building-mutation\" | \"executed\";\n\n/**\n * Retrieval operation - read operations in the first phase\n */\nexport type RetrievalOperation<\n TSchema extends AnySchema,\n TTable extends AnyTable = TSchema[\"tables\"][keyof TSchema[\"tables\"]],\n> =\n | {\n type: \"find\";\n schema: TSchema;\n namespace?: string;\n table: TTable;\n indexName: string;\n options: FindOptions<TTable, SelectClause<TTable>>;\n withCursor?: boolean;\n }\n | {\n type: \"count\";\n schema: TSchema;\n namespace?: string;\n table: TTable;\n indexName: string;\n options: Pick<FindOptions<TTable>, \"where\" | \"useIndex\">;\n };\n\n/**\n * Mutation operations - write operations in the second phase\n */\nexport type MutationOperation<\n TSchema extends AnySchema,\n TTable extends AnyTable = TSchema[\"tables\"][keyof TSchema[\"tables\"]],\n> =\n | {\n type: \"update\";\n schema: TSchema;\n namespace?: string;\n table: TTable[\"name\"];\n id: FragnoId | string;\n checkVersion: boolean;\n set: TableToUpdateValues<TTable>;\n }\n | {\n type: \"create\";\n schema: TSchema;\n namespace?: string;\n table: TTable[\"name\"];\n values: TableToInsertValues<TTable>;\n generatedExternalId: string;\n }\n | {\n type: \"delete\";\n schema: TSchema;\n namespace?: string;\n table: TTable[\"name\"];\n id: FragnoId | string;\n checkVersion: boolean;\n };\n\n/**\n * Compiled mutation with metadata for execution\n */\nexport interface CompiledMutation<TOutput> {\n query: TOutput;\n /**\n * Number of rows this operation must affect for the transaction to succeed.\n * If actual affected rows doesn't match, it indicates a version conflict.\n * null means don't check affected rows (e.g., for create operations).\n */\n expectedAffectedRows: number | null;\n}\n\n/**\n * Compiler interface for Unit of Work operations\n */\nexport interface UOWCompiler<TOutput> {\n /**\n * Compile a retrieval operation to the adapter's query format\n */\n compileRetrievalOperation(op: RetrievalOperation<AnySchema>): TOutput | null;\n\n /**\n * Compile a mutation operation to the adapter's query format\n */\n compileMutationOperation(op: MutationOperation<AnySchema>): CompiledMutation<TOutput> | null;\n}\n\nexport type MutationResult =\n | { success: true; createdInternalIds: (bigint | null)[] }\n | { success: false };\n\n/**\n * Executor interface for Unit of Work operations\n */\nexport interface UOWExecutor<TOutput, TRawResult = unknown> {\n /**\n * Execute the retrieval phase - all queries run in a single transaction for snapshot isolation\n */\n executeRetrievalPhase(retrievalBatch: TOutput[]): Promise<TRawResult[]>;\n\n /**\n * Execute the mutation phase - all queries run in a transaction with version checks\n * Returns success status indicating if mutations completed without conflicts,\n * and internal IDs for create operations (null if database doesn't support RETURNING)\n */\n executeMutationPhase(mutationBatch: CompiledMutation<TOutput>[]): Promise<MutationResult>;\n}\n\n/**\n * Decoder interface for Unit of Work retrieval results\n *\n * Transforms raw database results into application format (e.g., converting raw columns\n * into FragnoId objects with external ID, internal ID, and version).\n */\nexport interface UOWDecoder<TRawInput = unknown> {\n /**\n * Decode raw database results from the retrieval phase\n *\n * @param rawResults - Array of raw result sets from database queries\n * @param operations - Array of retrieval operations that produced these results\n * @returns Decoded results in application format\n */\n (rawResults: TRawInput[], operations: RetrievalOperation<AnySchema>[]): unknown[];\n}\n\n/**\n * Builder for find operations in Unit of Work\n */\nexport class FindBuilder<\n TTable extends AnyTable,\n TSelect extends SelectClause<TTable> = true,\n TJoinOut = {},\n> {\n readonly #table: TTable;\n readonly #tableName: string;\n\n #indexName?: string;\n #whereClause?: (eb: IndexedConditionBuilder<TTable>) => Condition | boolean;\n #orderByIndexClause?: {\n indexName: string;\n direction: \"asc\" | \"desc\";\n };\n #afterCursor?: Cursor | string;\n #beforeCursor?: Cursor | string;\n #pageSizeValue?: number;\n #selectClause?: TSelect;\n #joinClause?: (jb: IndexedJoinBuilder<TTable, {}>) => IndexedJoinBuilder<TTable, TJoinOut>;\n #countMode = false;\n #cursorMetadata?: Cursor;\n\n constructor(tableName: string, table: TTable) {\n this.#tableName = tableName;\n this.#table = table;\n }\n\n /**\n * Specify which index to use and optionally filter the results\n */\n whereIndex<TIndexName extends ValidIndexName<TTable>>(\n indexName: TIndexName,\n condition?: (eb: IndexSpecificConditionBuilder<TTable, TIndexName>) => Condition | boolean,\n ): this {\n // Validate index exists (primary is always valid)\n if (indexName !== \"primary\" && !(indexName in this.#table.indexes)) {\n throw new Error(\n `Index \"${String(indexName)}\" not found on table \"${this.#tableName}\". ` +\n `Available indexes: primary, ${Object.keys(this.#table.indexes).join(\", \")}`,\n );\n }\n\n this.#indexName = indexName === \"primary\" ? \"_primary\" : indexName;\n if (condition) {\n // Safe: IndexSpecificConditionBuilder is a subset of IndexedConditionBuilder.\n // The condition will only reference columns in the specific index, which are also indexed columns.\n this.#whereClause = condition as unknown as (\n eb: IndexedConditionBuilder<TTable>,\n ) => Condition | boolean;\n }\n return this;\n }\n\n /**\n * Specify columns to select\n * @throws Error if selectCount() has already been called\n */\n select<const TNewSelect extends SelectClause<TTable>>(\n columns: TNewSelect,\n ): FindBuilder<TTable, TNewSelect, TJoinOut> {\n if (this.#countMode) {\n throw new Error(\n `Cannot call select() after selectCount() on table \"${this.#tableName}\". ` +\n `Use either select() or selectCount(), not both.`,\n );\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (this as any).#selectClause = columns;\n return this as unknown as FindBuilder<TTable, TNewSelect, TJoinOut>;\n }\n\n /**\n * Select count instead of records\n * @throws Error if select() has already been called\n */\n selectCount(): this {\n if (this.#selectClause !== undefined) {\n throw new Error(\n `Cannot call selectCount() after select() on table \"${this.#tableName}\". ` +\n `Use either select() or selectCount(), not both.`,\n );\n }\n this.#countMode = true;\n return this;\n }\n\n /**\n * Order results by index in ascending or descending order\n */\n orderByIndex<TIndexName extends ValidIndexName<TTable>>(\n indexName: TIndexName,\n direction: \"asc\" | \"desc\",\n ): this {\n // Validate index exists (primary is always valid)\n if (indexName !== \"primary\" && !(indexName in this.#table.indexes)) {\n throw new Error(\n `Index \"${String(indexName)}\" not found on table \"${this.#tableName}\". ` +\n `Available indexes: primary, ${Object.keys(this.#table.indexes).join(\", \")}`,\n );\n }\n\n this.#orderByIndexClause = {\n indexName: indexName === \"primary\" ? \"_primary\" : indexName,\n direction,\n };\n return this;\n }\n\n /**\n * Set cursor to continue pagination after this point (forward pagination)\n * If a Cursor object is provided, its metadata will be used to set defaults for\n * index, orderByIndex, and pageSize (if not explicitly set)\n */\n after(cursor: Cursor | string): this {\n this.#afterCursor = cursor;\n if (cursor instanceof Cursor) {\n this.#cursorMetadata = cursor;\n }\n return this;\n }\n\n /**\n * Set cursor to continue pagination before this point (backward pagination)\n * If a Cursor object is provided, its metadata will be used to set defaults for\n * index, orderByIndex, and pageSize (if not explicitly set)\n */\n before(cursor: Cursor | string): this {\n this.#beforeCursor = cursor;\n if (cursor instanceof Cursor) {\n this.#cursorMetadata = cursor;\n }\n return this;\n }\n\n /**\n * Set the number of results per page\n */\n pageSize(size: number): this {\n this.#pageSizeValue = size;\n return this;\n }\n\n /**\n * Add joins to include related data\n * Join where clauses are restricted to indexed columns only\n */\n join<TNewJoinOut>(\n joinFn: (jb: IndexedJoinBuilder<TTable, {}>) => IndexedJoinBuilder<TTable, TNewJoinOut>,\n ): FindBuilder<TTable, TSelect, TNewJoinOut> {\n this.#joinClause = joinFn;\n return this as unknown as FindBuilder<TTable, TSelect, TNewJoinOut>;\n }\n\n /**\n * @internal\n */\n build():\n | { type: \"find\"; indexName: string; options: FindOptions<TTable, TSelect> }\n | {\n type: \"count\";\n indexName: string;\n options: Pick<FindOptions<TTable>, \"where\" | \"useIndex\">;\n } {\n // Apply cursor metadata as defaults if available and not explicitly set\n let indexName = this.#indexName;\n let orderByIndex = this.#orderByIndexClause;\n let pageSize = this.#pageSizeValue;\n\n if (this.#cursorMetadata) {\n // Use cursor metadata as defaults\n if (!indexName) {\n indexName = this.#cursorMetadata.indexName;\n }\n if (!orderByIndex) {\n orderByIndex = {\n indexName: this.#cursorMetadata.indexName,\n direction: this.#cursorMetadata.orderDirection,\n };\n }\n if (pageSize === undefined) {\n pageSize = this.#cursorMetadata.pageSize;\n }\n\n // Validate that explicit params match cursor params\n if (indexName && indexName !== this.#cursorMetadata.indexName) {\n throw new Error(\n `Index mismatch: builder specifies \"${indexName}\" but cursor specifies \"${this.#cursorMetadata.indexName}\"`,\n );\n }\n if (\n orderByIndex &&\n (orderByIndex.indexName !== this.#cursorMetadata.indexName ||\n orderByIndex.direction !== this.#cursorMetadata.orderDirection)\n ) {\n throw new Error(`Order mismatch: builder and cursor specify different ordering`);\n }\n if (pageSize !== undefined && pageSize !== this.#cursorMetadata.pageSize) {\n throw new Error(\n `Page size mismatch: builder specifies ${pageSize} but cursor specifies ${this.#cursorMetadata.pageSize}`,\n );\n }\n }\n\n if (!indexName) {\n throw new Error(\n `Must specify an index using .whereIndex() before finalizing find operation on table \"${this.#tableName}\"`,\n );\n }\n\n // If in count mode, return count operation\n if (this.#countMode) {\n return {\n type: \"count\",\n indexName,\n options: {\n useIndex: indexName,\n where: this.#whereClause,\n },\n };\n }\n\n // Compile joins if provided\n let compiledJoins: CompiledJoin[] | undefined;\n if (this.#joinClause) {\n compiledJoins = buildJoinIndexed(this.#table, this.#joinClause);\n }\n\n // Convert Cursor objects to strings for after/before\n const afterCursor =\n this.#afterCursor instanceof Cursor ? this.#afterCursor.encode() : this.#afterCursor;\n const beforeCursor =\n this.#beforeCursor instanceof Cursor ? this.#beforeCursor.encode() : this.#beforeCursor;\n\n const options: FindOptions<TTable, TSelect> = {\n useIndex: indexName,\n select: this.#selectClause,\n where: this.#whereClause,\n orderByIndex,\n after: afterCursor,\n before: beforeCursor,\n pageSize,\n joins: compiledJoins,\n };\n\n return { type: \"find\", indexName, options };\n }\n}\n\n/**\n * Builder for update operations in Unit of Work\n */\nexport class UpdateBuilder<TTable extends AnyTable> {\n readonly #tableName: string;\n readonly #id: FragnoId | string;\n\n #checkVersion = false;\n #setValues?: TableToUpdateValues<TTable>;\n\n constructor(tableName: string, id: FragnoId | string) {\n this.#tableName = tableName;\n this.#id = id;\n }\n\n /**\n * Specify values to update\n */\n set(values: TableToUpdateValues<TTable>): this {\n this.#setValues = values;\n return this;\n }\n\n /**\n * Enable version checking for optimistic concurrency control\n * @throws Error if the ID is just a string (no version available)\n */\n check(): this {\n if (typeof this.#id === \"string\") {\n throw new Error(\n `Cannot use check() with a string ID on table \"${this.#tableName}\". ` +\n `Version checking requires a FragnoId with version information.`,\n );\n }\n this.#checkVersion = true;\n return this;\n }\n\n /**\n * @internal\n */\n build(): {\n id: FragnoId | string;\n checkVersion: boolean;\n set: TableToUpdateValues<TTable>;\n } {\n if (!this.#setValues) {\n throw new Error(\n `Must specify values using .set() before finalizing update operation on table \"${this.#tableName}\"`,\n );\n }\n\n return {\n id: this.#id,\n checkVersion: this.#checkVersion,\n set: this.#setValues,\n };\n }\n}\n\n/**\n * Builder for delete operations in Unit of Work\n */\nexport class DeleteBuilder {\n readonly #tableName: string;\n readonly #id: FragnoId | string;\n\n #checkVersion = false;\n\n constructor(tableName: string, id: FragnoId | string) {\n this.#tableName = tableName;\n this.#id = id;\n }\n\n /**\n * Enable version checking for optimistic concurrency control\n * @throws Error if the ID is just a string (no version available)\n */\n check(): this {\n if (typeof this.#id === \"string\") {\n throw new Error(\n `Cannot use check() with a string ID on table \"${this.#tableName}\". ` +\n `Version checking requires a FragnoId with version information.`,\n );\n }\n this.#checkVersion = true;\n return this;\n }\n\n /**\n * @internal\n */\n build(): { id: FragnoId | string; checkVersion: boolean } {\n return {\n id: this.#id,\n checkVersion: this.#checkVersion,\n };\n }\n}\n\n/**\n * Builder for join operations in Unit of Work\n * Similar to FindBuilder but tailored for joins (no cursor pagination, no count mode)\n */\nexport class JoinFindBuilder<\n TTable extends AnyTable,\n TSelect extends SelectClause<TTable> = true,\n TJoinOut = {},\n> {\n readonly #table: TTable;\n readonly #tableName: string;\n\n #indexName?: string;\n #whereClause?: (eb: IndexedConditionBuilder<TTable>) => Condition | boolean;\n #orderByIndexClause?: {\n indexName: string;\n direction: \"asc\" | \"desc\";\n };\n #pageSizeValue?: number;\n #selectClause?: TSelect;\n #joinClause?: (jb: IndexedJoinBuilder<TTable, TJoinOut>) => IndexedJoinBuilder<TTable, TJoinOut>;\n\n constructor(tableName: string, table: TTable) {\n this.#tableName = tableName;\n this.#table = table;\n }\n\n /**\n * Specify which index to use and optionally filter the results\n */\n whereIndex<TIndexName extends ValidIndexName<TTable>>(\n indexName: TIndexName,\n condition?: (eb: IndexSpecificConditionBuilder<TTable, TIndexName>) => Condition | boolean,\n ): this {\n // Validate index exists (primary is always valid)\n if (indexName !== \"primary\" && !(indexName in this.#table.indexes)) {\n throw new Error(\n `Index \"${String(indexName)}\" not found on table \"${this.#tableName}\". ` +\n `Available indexes: primary, ${Object.keys(this.#table.indexes).join(\", \")}`,\n );\n }\n\n this.#indexName = indexName === \"primary\" ? \"_primary\" : indexName;\n if (condition) {\n // Safe: IndexSpecificConditionBuilder is a subset of IndexedConditionBuilder.\n // The condition will only reference columns in the specific index, which are also indexed columns.\n this.#whereClause = condition as unknown as (\n eb: IndexedConditionBuilder<TTable>,\n ) => Condition | boolean;\n }\n return this;\n }\n\n /**\n * Specify columns to select\n */\n select<const TNewSelect extends SelectClause<TTable>>(\n columns: TNewSelect,\n ): JoinFindBuilder<TTable, TNewSelect, TJoinOut> {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (this as any).#selectClause = columns;\n return this as unknown as JoinFindBuilder<TTable, TNewSelect, TJoinOut>;\n }\n\n /**\n * Order results by index in ascending or descending order\n */\n orderByIndex<TIndexName extends ValidIndexName<TTable>>(\n indexName: TIndexName,\n direction: \"asc\" | \"desc\",\n ): this {\n // Validate index exists (primary is always valid)\n if (indexName !== \"primary\" && !(indexName in this.#table.indexes)) {\n throw new Error(\n `Index \"${String(indexName)}\" not found on table \"${this.#tableName}\". ` +\n `Available indexes: primary, ${Object.keys(this.#table.indexes).join(\", \")}`,\n );\n }\n\n this.#orderByIndexClause = {\n indexName: indexName === \"primary\" ? \"_primary\" : indexName,\n direction,\n };\n return this;\n }\n\n /**\n * Set the number of results to return\n */\n pageSize(size: number): this {\n this.#pageSizeValue = size;\n return this;\n }\n\n /**\n * Add joins to include related data\n * Join where clauses are restricted to indexed columns only\n */\n join<TNewJoinOut>(\n joinFn: (jb: IndexedJoinBuilder<TTable, {}>) => IndexedJoinBuilder<TTable, TNewJoinOut>,\n ): JoinFindBuilder<TTable, TSelect, TJoinOut & TNewJoinOut> {\n this.#joinClause = joinFn;\n return this as unknown as JoinFindBuilder<TTable, TSelect, TJoinOut & TNewJoinOut>;\n }\n\n /**\n * @internal\n */\n build(): {\n indexName: string | undefined;\n select: TSelect | undefined;\n where: ((eb: IndexedConditionBuilder<TTable>) => Condition | boolean) | undefined;\n orderByIndex:\n | {\n indexName: string;\n direction: \"asc\" | \"desc\";\n }\n | undefined;\n pageSize: number | undefined;\n joins: CompiledJoin[] | undefined;\n } {\n // Compile joins if provided\n let compiledJoins: CompiledJoin[] | undefined;\n if (this.#joinClause) {\n compiledJoins = buildJoinIndexed(this.#table, this.#joinClause);\n }\n\n return {\n indexName: this.#indexName,\n select: this.#selectClause,\n where: this.#whereClause,\n orderByIndex: this.#orderByIndexClause,\n pageSize: this.#pageSizeValue,\n joins: compiledJoins,\n };\n }\n}\n\ninterface MapRelationType<T> {\n // FIXME: Not sure why we need the RemoveEmptyObject, we should somehow fix at the source where it's added to the union\n one: RemoveEmptyObject<T> | null;\n many: RemoveEmptyObject<T>[];\n}\n\n/**\n * Join builder with indexed-only where clauses for Unit of Work\n * TJoinOut accumulates the types of all joined relations\n */\nexport type IndexedJoinBuilder<TTable extends AnyTable, TJoinOut> = {\n [K in keyof TTable[\"relations\"]]: TTable[\"relations\"][K] extends Relation<\n infer TRelationType,\n infer TTargetTable\n >\n ? <TSelect extends SelectClause<TTable[\"relations\"][K][\"table\"]> = true, TNestedJoinOut = {}>(\n builderFn?: (\n builder: JoinFindBuilder<TTable[\"relations\"][K][\"table\"]>,\n ) => JoinFindBuilder<TTable[\"relations\"][K][\"table\"], TSelect, TNestedJoinOut>,\n ) => IndexedJoinBuilder<\n TTable,\n TJoinOut & {\n [P in K]: MapRelationType<\n SelectResult<TTargetTable, TNestedJoinOut, TSelect>\n >[TRelationType];\n }\n >\n : never;\n};\n\n/**\n * Build join operations with indexed-only where clauses for Unit of Work\n * This ensures all join conditions can leverage indexes for optimal performance\n */\nexport function buildJoinIndexed<TTable extends AnyTable, TJoinOut>(\n table: TTable,\n fn: (builder: IndexedJoinBuilder<TTable, {}>) => IndexedJoinBuilder<TTable, TJoinOut>,\n): CompiledJoin[] {\n const compiled: CompiledJoin[] = [];\n const builder: Record<string, unknown> = {};\n\n for (const name in table.relations) {\n const relation = table.relations[name]!;\n\n builder[name] = (builderFn?: (b: JoinFindBuilder<AnyTable>) => JoinFindBuilder<AnyTable>) => {\n // Create join builder for this relation's table\n const joinBuilder = new JoinFindBuilder(relation.table.ormName, relation.table);\n if (builderFn) {\n builderFn(joinBuilder);\n }\n const config = joinBuilder.build();\n\n // Build condition with indexed columns only\n let conditions: Condition | undefined;\n if (config.where) {\n const cond = buildCondition(relation.table.columns, config.where);\n if (cond === true) {\n conditions = undefined;\n } else if (cond === false) {\n // If condition evaluates to false, skip this join\n compiled.push({\n relation,\n options: false,\n });\n delete builder[name];\n return builder;\n } else {\n conditions = cond;\n }\n }\n\n // Build orderBy from orderByIndex if provided\n let orderBy: [AnyColumn, \"asc\" | \"desc\"][] | undefined;\n if (config.orderByIndex) {\n const index = relation.table.indexes[config.orderByIndex.indexName];\n if (index) {\n // Use all columns from the index for ordering\n orderBy = index.columns.map(\n (col) => [col, config.orderByIndex!.direction] as [AnyColumn, \"asc\" | \"desc\"],\n );\n } else {\n // Fallback to ID column if index not found\n orderBy = [[relation.table.getIdColumn(), config.orderByIndex.direction]];\n }\n }\n\n compiled.push({\n relation,\n options: {\n select: config.select ?? true,\n where: conditions,\n orderBy,\n join: config.joins,\n limit: config.pageSize,\n },\n });\n\n delete builder[name];\n return builder;\n };\n }\n\n fn(builder as IndexedJoinBuilder<TTable, {}>);\n return compiled;\n}\n\n/**\n * Base interface for Unit of Work with schema-agnostic methods only.\n * This allows UOW instances to be passed between services that use different schemas.\n */\nexport interface IUnitOfWorkBase {\n // Getters (schema-agnostic)\n readonly state: UOWState;\n readonly name: string | undefined;\n readonly retrievalPhase: Promise<unknown[]>;\n readonly mutationPhase: Promise<void>;\n\n // Execution (schema-agnostic)\n executeRetrieve(): Promise<unknown[]>;\n executeMutations(): Promise<{ success: boolean }>;\n\n // Inspection (schema-agnostic)\n getRetrievalOperations(): ReadonlyArray<RetrievalOperation<AnySchema>>;\n getMutationOperations(): ReadonlyArray<MutationOperation<AnySchema>>;\n getCreatedIds(): FragnoId[];\n\n // Schema-specific view (for cross-schema operations)\n forSchema<TOtherSchema extends AnySchema>(\n schema: TOtherSchema,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ): UnitOfWorkSchemaView<TOtherSchema, [], any>;\n}\n\nexport function createUnitOfWork<\n const TSchema extends AnySchema,\n const TRetrievalResults extends unknown[] = [],\n const TRawInput = unknown,\n>(\n schema: TSchema,\n compiler: UOWCompiler<unknown>,\n executor: UOWExecutor<unknown, TRawInput>,\n decoder: UOWDecoder<TRawInput>,\n name?: string,\n): UnitOfWork<TSchema, TRetrievalResults, TRawInput> {\n return new UnitOfWork(schema, compiler, executor, decoder, name);\n}\n\nexport interface UnitOfWorkConfig {\n dryRun?: boolean;\n onQuery?: (query: unknown) => void;\n}\n\n/**\n * Unit of Work implementation with optimistic concurrency control\n *\n * UOW has two phases:\n * 1. Retrieval phase: Read operations to fetch entities with their versions\n * 2. Mutation phase: Write operations that check versions before committing\n *\n * @example\n * ```ts\n * const uow = queryEngine.createUnitOfWork(\"update-user-balance\");\n *\n * // Retrieval phase\n * uow.find(\"users\", (b) => b.where(\"primary\", (eb) => eb(\"id\", \"=\", userId)));\n *\n * // Execute retrieval and transition to mutation phase\n * const [users] = await uow.executeRetrieve();\n *\n * // Mutation phase with version check\n * const user = users[0];\n * uow.update(\"users\", user.id, (b) => b.set({ balance: newBalance }).check());\n *\n * // Execute mutations\n * const { success } = await uow.executeMutations();\n * if (!success) {\n * // Handle version conflict\n * }\n * ```\n */\nexport class UnitOfWork<\n const TSchema extends AnySchema,\n const TRetrievalResults extends unknown[] = [],\n const TRawInput = unknown,\n> implements IUnitOfWorkBase\n{\n #schema: TSchema;\n\n #name?: string;\n #config?: UnitOfWorkConfig;\n\n #state: UOWState = \"building-retrieval\";\n\n // Operations can now come from any schema\n #retrievalOps: RetrievalOperation<AnySchema>[] = [];\n #mutationOps: MutationOperation<AnySchema>[] = [];\n\n #compiler: UOWCompiler<unknown>;\n #executor: UOWExecutor<unknown, TRawInput>;\n #decoder: UOWDecoder<TRawInput>;\n #schemaNamespaceMap?: WeakMap<AnySchema, string>;\n\n #retrievalResults?: TRetrievalResults;\n #createdInternalIds: (bigint | null)[] = [];\n\n // Phase coordination promises\n #retrievalPhaseResolve?: (value: TRetrievalResults) => void;\n #mutationPhaseResolve?: () => void;\n #retrievalPhasePromise: Promise<TRetrievalResults>;\n #mutationPhasePromise: Promise<void>;\n\n constructor(\n schema: TSchema,\n compiler: UOWCompiler<unknown>,\n executor: UOWExecutor<unknown, TRawInput>,\n decoder: UOWDecoder<TRawInput>,\n name?: string,\n config?: UnitOfWorkConfig,\n schemaNamespaceMap?: WeakMap<AnySchema, string>,\n ) {\n this.#schema = schema;\n this.#compiler = compiler;\n this.#executor = executor;\n this.#decoder = decoder;\n this.#name = name;\n this.#config = config;\n this.#schemaNamespaceMap = schemaNamespaceMap;\n\n // Initialize phase coordination promises\n this.#retrievalPhasePromise = new Promise<TRetrievalResults>((resolve) => {\n this.#retrievalPhaseResolve = resolve;\n });\n this.#mutationPhasePromise = new Promise<void>((resolve) => {\n this.#mutationPhaseResolve = resolve;\n });\n }\n\n get schema(): TSchema {\n return this.#schema;\n }\n\n get $results(): Prettify<TRetrievalResults> {\n throw new Error(\"type only\");\n }\n\n /**\n * Get a schema-specific view of this UOW for type-safe operations\n * Returns a wrapper that uses a different schema for operations.\n * The namespace is automatically resolved from the schema-namespace map.\n */\n forSchema<TOtherSchema extends AnySchema>(\n schema: TOtherSchema,\n ): UnitOfWorkSchemaView<TOtherSchema, [], TRawInput> {\n // Look up namespace from map\n const resolvedNamespace = this.#schemaNamespaceMap?.get(schema);\n\n // Safe cast: UnitOfWorkSchemaView starts with empty result types\n // As operations are added, the types will accumulate correctly\n return new UnitOfWorkSchemaView(\n schema,\n resolvedNamespace,\n this as unknown as UnitOfWork<AnySchema, unknown[], TRawInput>,\n );\n }\n\n get state(): UOWState {\n return this.#state;\n }\n\n get name(): string | undefined {\n return this.#name;\n }\n\n /**\n * Promise that resolves when the retrieval phase is executed\n * Service methods can await this to coordinate multi-phase logic\n */\n get retrievalPhase(): Promise<TRetrievalResults> {\n return this.#retrievalPhasePromise;\n }\n\n /**\n * Promise that resolves when the mutation phase is executed\n * Service methods can await this to coordinate multi-phase logic\n */\n get mutationPhase(): Promise<void> {\n return this.#mutationPhasePromise;\n }\n\n /**\n * Execute the retrieval phase and transition to mutation phase\n * Returns all results from find operations\n */\n async executeRetrieve(): Promise<TRetrievalResults> {\n if (this.#state !== \"building-retrieval\") {\n throw new Error(\n `Cannot execute retrieval from state ${this.#state}. Must be in building-retrieval state.`,\n );\n }\n\n if (this.#retrievalOps.length === 0) {\n this.#state = \"building-mutation\";\n const emptyResults = [] as unknown as TRetrievalResults;\n this.#retrievalPhaseResolve?.(emptyResults);\n return emptyResults;\n }\n\n // Compile retrieval operations using single compiler\n const retrievalBatch: unknown[] = [];\n for (const op of this.#retrievalOps) {\n const compiled = this.#compiler.compileRetrievalOperation(op);\n if (compiled !== null) {\n this.#config?.onQuery?.(compiled);\n retrievalBatch.push(compiled);\n }\n }\n\n if (this.#config?.dryRun) {\n this.#state = \"executed\";\n return [] as unknown as TRetrievalResults;\n }\n\n // Execute all operations together (ideally in same transaction)\n const rawResults = await this.#executor.executeRetrievalPhase(retrievalBatch);\n\n // Decode results using single decoder\n const results = this.#decoder(rawResults, this.#retrievalOps);\n\n // Store results and transition to mutation phase\n this.#retrievalResults = results as TRetrievalResults;\n this.#state = \"building-mutation\";\n\n // Resolve the retrieval phase promise to unblock waiting service methods\n this.#retrievalPhaseResolve?.(this.#retrievalResults);\n\n return this.#retrievalResults;\n }\n\n /**\n * Add a find operation using a builder callback (retrieval phase only)\n */\n find<TTableName extends keyof TSchema[\"tables\"] & string, const TBuilderResult>(\n tableName: TTableName,\n builderFn: (\n builder: Omit<FindBuilder<TSchema[\"tables\"][TTableName]>, \"build\">,\n ) => TBuilderResult,\n ): UnitOfWork<\n TSchema,\n [\n ...TRetrievalResults,\n SelectResult<\n TSchema[\"tables\"][TTableName],\n ExtractJoinOut<TBuilderResult>,\n Extract<ExtractSelect<TBuilderResult>, SelectClause<TSchema[\"tables\"][TTableName]>>\n >[],\n ],\n TRawInput\n >;\n find<TTableName extends keyof TSchema[\"tables\"] & string>(\n tableName: TTableName,\n ): UnitOfWork<\n TSchema,\n [...TRetrievalResults, SelectResult<TSchema[\"tables\"][TTableName], {}, true>[]],\n TRawInput\n >;\n find<TTableName extends keyof TSchema[\"tables\"] & string, const TBuilderResult>(\n tableName: TTableName,\n builderFn?: (\n builder: Omit<FindBuilder<TSchema[\"tables\"][TTableName]>, \"build\">,\n ) => TBuilderResult,\n ): UnitOfWork<\n TSchema,\n [\n ...TRetrievalResults,\n SelectResult<\n TSchema[\"tables\"][TTableName],\n ExtractJoinOut<TBuilderResult>,\n Extract<ExtractSelect<TBuilderResult>, SelectClause<TSchema[\"tables\"][TTableName]>>\n >[],\n ],\n TRawInput\n > {\n if (this.#state !== \"building-retrieval\") {\n throw new Error(\n `find() can only be called during retrieval phase. Current state: ${this.#state}`,\n );\n }\n\n const table = this.#schema.tables[tableName];\n if (!table) {\n throw new Error(`Table ${tableName} not found in schema`);\n }\n\n // Create builder, pass to callback (or use default), then extract configuration\n const builder = new FindBuilder(tableName, table as TSchema[\"tables\"][TTableName]);\n if (builderFn) {\n builderFn(builder);\n } else {\n // Default to primary index with no filter\n builder.whereIndex(\"primary\");\n }\n const { indexName, options, type } = builder.build();\n\n this.#retrievalOps.push({\n type,\n schema: this.#schema,\n // Safe: we know the table is part of the schema from the find() method\n table: table as TSchema[\"tables\"][TTableName],\n indexName,\n // Safe: we're storing the options for later compilation\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n options: options as any,\n });\n\n // Safe: return type is correctly specified in the method signature\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return this as any;\n }\n\n /**\n * Add a find operation with cursor metadata (retrieval phase only)\n */\n findWithCursor<TTableName extends keyof TSchema[\"tables\"] & string, const TBuilderResult>(\n tableName: TTableName,\n builderFn: (\n // We omit \"build\" because we don't want to expose it to the user\n builder: Omit<FindBuilder<TSchema[\"tables\"][TTableName]>, \"build\">,\n ) => TBuilderResult,\n ): UnitOfWork<\n TSchema,\n [\n ...TRetrievalResults,\n CursorResult<\n SelectResult<\n TSchema[\"tables\"][TTableName],\n ExtractJoinOut<TBuilderResult>,\n Extract<ExtractSelect<TBuilderResult>, SelectClause<TSchema[\"tables\"][TTableName]>>\n >\n >,\n ],\n TRawInput\n > {\n if (this.#state !== \"building-retrieval\") {\n throw new Error(\n `findWithCursor() can only be called during retrieval phase. Current state: ${this.#state}`,\n );\n }\n\n const table = this.#schema.tables[tableName];\n if (!table) {\n throw new Error(`Table ${tableName} not found in schema`);\n }\n\n // Create builder and pass to callback\n const builder = new FindBuilder(tableName, table as TSchema[\"tables\"][TTableName]);\n builderFn(builder);\n const { indexName, options, type } = builder.build();\n\n this.#retrievalOps.push({\n type,\n schema: this.#schema,\n // Safe: we know the table is part of the schema from the findWithCursor() method\n table: table as TSchema[\"tables\"][TTableName],\n indexName,\n // Safe: we're storing the options for later compilation\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n options: options as any,\n withCursor: true,\n });\n\n // Safe: return type is correctly specified in the method signature\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return this as any;\n }\n\n /**\n * Add a create operation (mutation phase only)\n * Returns a FragnoId with the external ID that can be used immediately in subsequent operations\n */\n create<TableName extends keyof TSchema[\"tables\"] & string>(\n table: TableName,\n values: TableToInsertValues<TSchema[\"tables\"][TableName]>,\n ): FragnoId {\n if (this.#state === \"executed\") {\n throw new Error(`create() can only be called during mutation phase.`);\n }\n\n const tableSchema = this.#schema.tables[table];\n if (!tableSchema) {\n throw new Error(`Table ${table} not found in schema`);\n }\n\n const idColumn = tableSchema.getIdColumn();\n let externalId: string;\n let updatedValues = values;\n\n // Check if ID value is provided in values\n const providedIdValue = (values as Record<string, unknown>)[idColumn.ormName];\n\n if (providedIdValue !== undefined) {\n // Extract string from FragnoId or use string directly\n if (\n typeof providedIdValue === \"object\" &&\n providedIdValue !== null &&\n \"externalId\" in providedIdValue\n ) {\n externalId = (providedIdValue as FragnoId).externalId;\n } else {\n externalId = providedIdValue as string;\n }\n } else {\n // Generate using the column's default configuration\n const generated = idColumn.generateDefaultValue();\n if (generated === undefined) {\n throw new Error(\n `No ID value provided and ID column ${idColumn.ormName} has no default generator`,\n );\n }\n externalId = generated as string;\n\n // Add the generated ID to values so it's used in the insert\n updatedValues = {\n ...values,\n [idColumn.ormName]: externalId,\n } as TableToInsertValues<TSchema[\"tables\"][TableName]>;\n }\n\n this.#mutationOps.push({\n type: \"create\",\n schema: this.#schema,\n table,\n values: updatedValues,\n generatedExternalId: externalId,\n });\n\n return FragnoId.fromExternal(externalId, 0);\n }\n\n /**\n * Add an update operation using a builder callback (mutation phase only)\n */\n update<TableName extends keyof TSchema[\"tables\"] & string>(\n table: TableName,\n id: FragnoId | string,\n builderFn: (\n // We omit \"build\" because we don't want to expose it to the user\n builder: Omit<UpdateBuilder<TSchema[\"tables\"][TableName]>, \"build\">,\n ) => Omit<UpdateBuilder<TSchema[\"tables\"][TableName]>, \"build\"> | void,\n ): void {\n if (this.#state === \"executed\") {\n throw new Error(`update() can only be called during mutation phase.`);\n }\n\n // Create builder, pass to callback, then extract configuration\n const builder = new UpdateBuilder<TSchema[\"tables\"][TableName]>(table, id);\n builderFn(builder);\n const { id: opId, checkVersion, set } = builder.build();\n\n this.#mutationOps.push({\n type: \"update\",\n schema: this.#schema,\n table,\n id: opId,\n checkVersion,\n set,\n });\n }\n\n /**\n * Add a delete operation using a builder callback (mutation phase only)\n */\n delete<TableName extends keyof TSchema[\"tables\"] & string>(\n table: TableName,\n id: FragnoId | string,\n builderFn?: (\n // We omit \"build\" because we don't want to expose it to the user\n builder: Omit<DeleteBuilder, \"build\">,\n ) => Omit<DeleteBuilder, \"build\"> | void,\n ): void {\n if (this.#state === \"executed\") {\n throw new Error(`delete() can only be called during mutation phase.`);\n }\n\n // Create builder, optionally pass to callback, then extract configuration\n const builder = new DeleteBuilder(table, id);\n builderFn?.(builder);\n const { id: opId, checkVersion } = builder.build();\n\n this.#mutationOps.push({\n type: \"delete\",\n schema: this.#schema,\n table,\n id: opId,\n checkVersion,\n });\n }\n\n /**\n * Execute the mutation phase\n * Returns success flag indicating if mutations completed without conflicts\n */\n async executeMutations(): Promise<{ success: boolean }> {\n if (this.#state === \"executed\") {\n throw new Error(`Cannot execute mutations from state ${this.#state}.`);\n }\n\n // Compile mutation operations using single compiler\n const mutationBatch: CompiledMutation<unknown>[] = [];\n for (const op of this.#mutationOps) {\n const compiled = this.#compiler.compileMutationOperation(op);\n if (compiled !== null) {\n this.#config?.onQuery?.(compiled);\n mutationBatch.push(compiled);\n }\n }\n\n if (this.#config?.dryRun) {\n this.#state = \"executed\";\n return {\n success: true,\n };\n }\n\n // Execute mutation phase\n const result = await this.#executor.executeMutationPhase(mutationBatch);\n this.#state = \"executed\";\n\n if (result.success) {\n this.#createdInternalIds = result.createdInternalIds;\n }\n\n // Resolve the mutation phase promise to unblock waiting service methods\n this.#mutationPhaseResolve?.();\n\n return {\n success: result.success,\n };\n }\n\n /**\n * Get the retrieval operations (for inspection/debugging)\n */\n getRetrievalOperations(): ReadonlyArray<RetrievalOperation<AnySchema>> {\n return this.#retrievalOps;\n }\n\n /**\n * Get the mutation operations (for inspection/debugging)\n */\n getMutationOperations(): ReadonlyArray<MutationOperation<AnySchema>> {\n return this.#mutationOps;\n }\n\n /**\n * @internal\n * Add a retrieval operation (used by SchemaView)\n */\n addRetrievalOperation(op: RetrievalOperation<AnySchema>): number {\n this.#retrievalOps.push(op);\n return this.#retrievalOps.length - 1;\n }\n\n /**\n * @internal\n * Add a mutation operation (used by SchemaView)\n */\n addMutationOperation(op: MutationOperation<AnySchema>): void {\n this.#mutationOps.push(op);\n }\n\n /**\n * Get the IDs of created entities after executeMutations() has been called.\n * Returns FragnoId objects with external IDs (always available) and internal IDs\n * (available when database supports RETURNING).\n *\n * @throws Error if called before executeMutations()\n * @returns Array of FragnoIds in the same order as create() calls\n */\n getCreatedIds(): FragnoId[] {\n if (this.#state !== \"executed\") {\n throw new Error(\n `getCreatedIds() can only be called after executeMutations(). Current state: ${this.#state}`,\n );\n }\n\n const createdIds: FragnoId[] = [];\n let createIndex = 0;\n\n for (const op of this.#mutationOps) {\n if (op.type === \"create\") {\n const internalId = this.#createdInternalIds[createIndex] ?? undefined;\n createdIds.push(\n new FragnoId({\n externalId: op.generatedExternalId,\n internalId,\n version: 0, // New records always start at version 0\n }),\n );\n createIndex++;\n }\n }\n\n return createdIds;\n }\n\n /**\n * @internal\n * Compile the unit of work to executable queries for testing\n */\n compile<TOutput>(compiler: UOWCompiler<TOutput>): {\n name?: string;\n retrievalBatch: TOutput[];\n mutationBatch: CompiledMutation<TOutput>[];\n } {\n const retrievalBatch: TOutput[] = [];\n for (const op of this.#retrievalOps) {\n const compiled = compiler.compileRetrievalOperation(op);\n if (compiled !== null) {\n retrievalBatch.push(compiled);\n }\n }\n\n const mutationBatch: CompiledMutation<TOutput>[] = [];\n for (const op of this.#mutationOps) {\n const compiled = compiler.compileMutationOperation(op);\n if (compiled !== null) {\n mutationBatch.push(compiled);\n }\n }\n\n return {\n name: this.#name,\n retrievalBatch,\n mutationBatch,\n };\n }\n}\n\n/**\n * A lightweight wrapper around a parent UOW that provides type-safe operations for a different schema.\n * All operations are stored in the parent UOW, but this wrapper ensures the correct schema is used.\n */\nexport class UnitOfWorkSchemaView<\n const TSchema extends AnySchema,\n const TRetrievalResults extends unknown[] = [],\n const TRawInput = unknown,\n> implements IUnitOfWorkBase\n{\n #schema: TSchema;\n #namespace?: string;\n #parent: UnitOfWork<AnySchema, unknown[], TRawInput>;\n #operationIndices: number[] = [];\n\n constructor(\n schema: TSchema,\n namespace: string | undefined,\n parent: UnitOfWork<AnySchema, unknown[], TRawInput>,\n ) {\n this.#schema = schema;\n this.#namespace = namespace;\n this.#parent = parent;\n }\n\n get $results(): Prettify<TRetrievalResults> {\n throw new Error(\"type only\");\n }\n\n get schema(): TSchema {\n return this.#schema;\n }\n\n get name(): string | undefined {\n return this.#parent.name;\n }\n\n get state() {\n return this.#parent.state;\n }\n\n get retrievalPhase(): Promise<TRetrievalResults> {\n // Filter parent's results to only include operations from this view\n return this.#parent.retrievalPhase.then((allResults) => {\n const filteredResults = this.#operationIndices.map((index) => allResults[index]);\n return filteredResults as TRetrievalResults;\n });\n }\n\n get mutationPhase(): Promise<void> {\n return this.#parent.mutationPhase;\n }\n\n getRetrievalOperations() {\n return this.#parent.getRetrievalOperations();\n }\n\n getMutationOperations() {\n return this.#parent.getMutationOperations();\n }\n\n getCreatedIds() {\n return this.#parent.getCreatedIds();\n }\n\n async executeRetrieve(): Promise<unknown[]> {\n return this.#parent.executeRetrieve();\n }\n\n async executeMutations(): Promise<{ success: boolean }> {\n return this.#parent.executeMutations();\n }\n\n find<TTableName extends keyof TSchema[\"tables\"] & string, const TBuilderResult>(\n tableName: TTableName,\n builderFn: (\n builder: Omit<FindBuilder<TSchema[\"tables\"][TTableName]>, \"build\">,\n ) => TBuilderResult,\n ): UnitOfWorkSchemaView<\n TSchema,\n [\n ...TRetrievalResults,\n SelectResult<\n TSchema[\"tables\"][TTableName],\n ExtractJoinOut<TBuilderResult>,\n Extract<ExtractSelect<TBuilderResult>, SelectClause<TSchema[\"tables\"][TTableName]>>\n >[],\n ],\n TRawInput\n >;\n find<TTableName extends keyof TSchema[\"tables\"] & string>(\n tableName: TTableName,\n ): UnitOfWorkSchemaView<\n TSchema,\n [...TRetrievalResults, SelectResult<TSchema[\"tables\"][TTableName], {}, true>[]],\n TRawInput\n >;\n find<TTableName extends keyof TSchema[\"tables\"] & string, const TBuilderResult>(\n tableName: TTableName,\n builderFn?: (\n builder: Omit<FindBuilder<TSchema[\"tables\"][TTableName]>, \"build\">,\n ) => TBuilderResult,\n ): UnitOfWorkSchemaView<\n TSchema,\n [\n ...TRetrievalResults,\n SelectResult<\n TSchema[\"tables\"][TTableName],\n ExtractJoinOut<TBuilderResult>,\n Extract<ExtractSelect<TBuilderResult>, SelectClause<TSchema[\"tables\"][TTableName]>>\n >[],\n ],\n TRawInput\n > {\n const table = this.#schema.tables[tableName];\n if (!table) {\n throw new Error(`Table ${tableName} not found in schema`);\n }\n\n const builder = new FindBuilder(tableName, table as TSchema[\"tables\"][TTableName]);\n if (builderFn) {\n builderFn(builder);\n } else {\n builder.whereIndex(\"primary\");\n }\n const { indexName, options, type } = builder.build();\n\n const operationIndex = this.#parent.addRetrievalOperation({\n type,\n schema: this.#schema,\n namespace: this.#namespace,\n table: table as TSchema[\"tables\"][TTableName],\n indexName,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n options: options as any,\n });\n\n // Track which operation index belongs to this view\n this.#operationIndices.push(operationIndex);\n\n // Safe: return type is correctly specified in the method signature\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return this as any;\n }\n\n findWithCursor<TTableName extends keyof TSchema[\"tables\"] & string, const TBuilderResult>(\n tableName: TTableName,\n builderFn: (\n builder: Omit<FindBuilder<TSchema[\"tables\"][TTableName]>, \"build\">,\n ) => TBuilderResult,\n ): UnitOfWorkSchemaView<\n TSchema,\n [\n ...TRetrievalResults,\n CursorResult<\n SelectResult<\n TSchema[\"tables\"][TTableName],\n ExtractJoinOut<TBuilderResult>,\n Extract<ExtractSelect<TBuilderResult>, SelectClause<TSchema[\"tables\"][TTableName]>>\n >\n >,\n ],\n TRawInput\n > {\n const table = this.#schema.tables[tableName];\n if (!table) {\n throw new Error(`Table ${tableName} not found in schema`);\n }\n\n const builder = new FindBuilder(tableName, table as TSchema[\"tables\"][TTableName]);\n builderFn(builder);\n const { indexName, options, type } = builder.build();\n\n const operationIndex = this.#parent.addRetrievalOperation({\n type,\n schema: this.#schema,\n namespace: this.#namespace,\n table: table as TSchema[\"tables\"][TTableName],\n indexName,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n options: options as any,\n withCursor: true,\n });\n\n // Track which operation index belongs to this view\n this.#operationIndices.push(operationIndex);\n\n // Safe: return type is correctly specified in the method signature\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return this as any;\n }\n\n create<TableName extends keyof TSchema[\"tables\"] & string>(\n tableName: TableName,\n values: TableToInsertValues<TSchema[\"tables\"][TableName]>,\n ): FragnoId {\n const tableSchema = this.#schema.tables[tableName];\n if (!tableSchema) {\n throw new Error(`Table ${tableName} not found in schema`);\n }\n\n const idColumn = tableSchema.getIdColumn();\n let externalId: string;\n let updatedValues = values;\n\n // Check if ID value is provided in values\n const providedIdValue = (values as Record<string, unknown>)[idColumn.ormName];\n\n if (providedIdValue !== undefined) {\n // Extract string from FragnoId or use string directly\n if (\n typeof providedIdValue === \"object\" &&\n providedIdValue !== null &&\n \"externalId\" in providedIdValue\n ) {\n externalId = (providedIdValue as FragnoId).externalId;\n } else {\n externalId = providedIdValue as string;\n }\n } else {\n // Generate using the column's default configuration\n const generated = idColumn.generateDefaultValue();\n if (generated === undefined) {\n throw new Error(\n `No ID value provided and ID column ${idColumn.ormName} has no default generator`,\n );\n }\n externalId = generated as string;\n\n // Add the generated ID to values so it's used in the insert\n updatedValues = {\n ...values,\n [idColumn.ormName]: externalId,\n } as TableToInsertValues<TSchema[\"tables\"][TableName]>;\n }\n\n this.#parent.addMutationOperation({\n type: \"create\",\n schema: this.#schema,\n namespace: this.#namespace,\n table: tableName,\n values: updatedValues,\n generatedExternalId: externalId,\n });\n\n return FragnoId.fromExternal(externalId, 0);\n }\n\n update<TableName extends keyof TSchema[\"tables\"] & string>(\n tableName: TableName,\n id: FragnoId | string,\n builderFn: (\n builder: Omit<UpdateBuilder<TSchema[\"tables\"][TableName]>, \"build\">,\n ) => Omit<UpdateBuilder<TSchema[\"tables\"][TableName]>, \"build\"> | void,\n ): void {\n const builder = new UpdateBuilder<TSchema[\"tables\"][TableName]>(tableName, id);\n builderFn(builder);\n const { id: opId, checkVersion, set } = builder.build();\n\n this.#parent.addMutationOperation({\n type: \"update\",\n schema: this.#schema,\n namespace: this.#namespace,\n table: tableName,\n id: opId,\n checkVersion,\n set,\n });\n }\n\n delete<TableName extends keyof TSchema[\"tables\"] & string>(\n tableName: TableName,\n id: FragnoId | string,\n builderFn?: (builder: Omit<DeleteBuilder, \"build\">) => Omit<DeleteBuilder, \"build\"> | void,\n ): void {\n const builder = new DeleteBuilder(tableName, id);\n builderFn?.(builder);\n const { id: opId, checkVersion } = builder.build();\n\n this.#parent.addMutationOperation({\n type: \"delete\",\n schema: this.#schema,\n namespace: this.#namespace,\n table: tableName,\n id: opId,\n checkVersion,\n });\n }\n\n forSchema<TOtherSchema extends AnySchema>(\n schema: TOtherSchema,\n ): UnitOfWorkSchemaView<TOtherSchema, [], TRawInput> {\n // Delegate to the parent's forSchema to create a new view\n return this.#parent.forSchema(schema);\n }\n}\n"],"mappings":"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"}
|
package/dist/schema/serialize.js
DELETED
|
@@ -1,106 +0,0 @@
|
|
|
1
|
-
import { FragnoId, FragnoReference } from "./create.js";
|
|
2
|
-
|
|
3
|
-
//#region src/schema/serialize.ts
|
|
4
|
-
function schemaToDBType(column, provider) {
|
|
5
|
-
const { type } = column;
|
|
6
|
-
if ("role" in column && column.role === "internal-id") {
|
|
7
|
-
if (provider === "postgresql" || provider === "cockroachdb") return "bigserial";
|
|
8
|
-
if (provider === "mysql") return "bigint";
|
|
9
|
-
if (provider === "sqlite") return "integer";
|
|
10
|
-
if (provider === "mssql") return "bigint";
|
|
11
|
-
}
|
|
12
|
-
if ("role" in column && column.role === "reference") {
|
|
13
|
-
if (provider === "sqlite") return "integer";
|
|
14
|
-
}
|
|
15
|
-
if (provider === "sqlite") switch (type) {
|
|
16
|
-
case "integer":
|
|
17
|
-
case "timestamp":
|
|
18
|
-
case "date":
|
|
19
|
-
case "bool": return "integer";
|
|
20
|
-
case "binary":
|
|
21
|
-
case "bigint": return "blob";
|
|
22
|
-
case "json":
|
|
23
|
-
case "string": return "text";
|
|
24
|
-
case "decimal": return "real";
|
|
25
|
-
default: if (type.startsWith("varchar")) return "text";
|
|
26
|
-
}
|
|
27
|
-
if (provider === "mssql") switch (type) {
|
|
28
|
-
case "bool": return "bit";
|
|
29
|
-
case "timestamp": return "datetime";
|
|
30
|
-
case "integer": return "int";
|
|
31
|
-
case "string": return "varchar(max)";
|
|
32
|
-
case "binary": return "varbinary(max)";
|
|
33
|
-
case "json": return "varchar(max)";
|
|
34
|
-
default:
|
|
35
|
-
if (type.startsWith("varchar")) return type;
|
|
36
|
-
return type;
|
|
37
|
-
}
|
|
38
|
-
if (provider === "postgresql" || provider === "cockroachdb") switch (type) {
|
|
39
|
-
case "bool": return "boolean";
|
|
40
|
-
case "json": return "json";
|
|
41
|
-
case "string": return "text";
|
|
42
|
-
case "binary": return "bytea";
|
|
43
|
-
default:
|
|
44
|
-
if (type.startsWith("varchar")) return type;
|
|
45
|
-
return type;
|
|
46
|
-
}
|
|
47
|
-
if (provider === "mysql") switch (type) {
|
|
48
|
-
case "bool": return "boolean";
|
|
49
|
-
case "string": return "text";
|
|
50
|
-
case "binary": return "longblob";
|
|
51
|
-
default:
|
|
52
|
-
if (type.startsWith("varchar")) return type;
|
|
53
|
-
return type;
|
|
54
|
-
}
|
|
55
|
-
throw new Error(`cannot handle ${provider} ${type}`);
|
|
56
|
-
}
|
|
57
|
-
const supportJson = [
|
|
58
|
-
"postgresql",
|
|
59
|
-
"cockroachdb",
|
|
60
|
-
"mysql"
|
|
61
|
-
];
|
|
62
|
-
/**
|
|
63
|
-
* Parse from driver value
|
|
64
|
-
*/
|
|
65
|
-
function deserialize(value, col, provider) {
|
|
66
|
-
if (value === null) return null;
|
|
67
|
-
if (!supportJson.includes(provider) && col.type === "json" && typeof value === "string") return JSON.parse(value);
|
|
68
|
-
if (provider === "sqlite" && (col.type === "timestamp" || col.type === "date") && (typeof value === "number" || typeof value === "string")) return new Date(value);
|
|
69
|
-
if ((provider === "postgresql" || provider === "cockroachdb") && (col.type === "timestamp" || col.type === "date") && typeof value === "string") return new Date(value);
|
|
70
|
-
if (provider === "mysql" && (col.type === "timestamp" || col.type === "date") && typeof value === "string") return new Date(value);
|
|
71
|
-
if (col.type === "bool" && typeof value === "number") return value === 1;
|
|
72
|
-
if (col.type === "bigint" && value instanceof Buffer) return value.readBigInt64BE(0);
|
|
73
|
-
if (col.type === "bigint" && typeof value === "string") return BigInt(value);
|
|
74
|
-
if (col.type === "binary" && value instanceof Buffer) return new Uint8Array(value.buffer, value.byteOffset, value.byteLength);
|
|
75
|
-
return value;
|
|
76
|
-
}
|
|
77
|
-
/**
|
|
78
|
-
* Encode to driver value
|
|
79
|
-
*/
|
|
80
|
-
function serialize(value, col, provider) {
|
|
81
|
-
if (value === null) return null;
|
|
82
|
-
if (value instanceof FragnoReference) return value.internalId;
|
|
83
|
-
if (value instanceof FragnoId) {
|
|
84
|
-
if (col.role === "external-id") return value.externalId;
|
|
85
|
-
if (col.role === "internal-id") {
|
|
86
|
-
if (!value.internalId) throw new Error(`FragnoId must have internalId for internal-id column ${col.name}`);
|
|
87
|
-
return value.internalId;
|
|
88
|
-
}
|
|
89
|
-
if (col.role === "reference") return value.databaseId;
|
|
90
|
-
return value.externalId;
|
|
91
|
-
}
|
|
92
|
-
if (!supportJson.includes(provider) && col.type === "json") return JSON.stringify(value);
|
|
93
|
-
if (provider === "sqlite" && value instanceof Date) return value.getTime();
|
|
94
|
-
if (provider === "sqlite" && typeof value === "boolean") return value ? 1 : 0;
|
|
95
|
-
if (provider === "sqlite" && typeof value === "bigint") {
|
|
96
|
-
const buf = Buffer.alloc(8);
|
|
97
|
-
buf.writeBigInt64BE(value);
|
|
98
|
-
return buf;
|
|
99
|
-
}
|
|
100
|
-
if (col.type === "binary" && value instanceof Uint8Array) return Buffer.from(value);
|
|
101
|
-
return value;
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
//#endregion
|
|
105
|
-
export { deserialize, schemaToDBType, serialize };
|
|
106
|
-
//# sourceMappingURL=serialize.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"serialize.js","names":["supportJson: SQLProvider[]"],"sources":["../../src/schema/serialize.ts"],"sourcesContent":["import type { SQLProvider } from \"../shared/providers\";\nimport type { AnyColumn } from \"./create\";\nimport { FragnoId, FragnoReference } from \"./create\";\n\nexport interface AdditionalColumnMetadata {\n length?: number;\n precision?: number;\n scale?: number;\n}\n\n/**\n * Get the possible column types that the raw DB type can map to.\n */\nexport function dbToSchemaType(\n dbType: string,\n provider: SQLProvider,\n additional: AdditionalColumnMetadata,\n): (AnyColumn[\"type\"] | \"varchar(n)\")[] {\n dbType = dbType.toLowerCase();\n if (provider === \"sqlite\") {\n switch (dbType) {\n case \"integer\":\n return [\"bool\", \"date\", \"timestamp\", \"bigint\", \"integer\"];\n case \"text\":\n return [\"json\", \"string\", \"bigint\", \"varchar(n)\"];\n case \"real\":\n case \"numeric\":\n return [\"decimal\"];\n case \"blob\":\n return [\"bigint\", \"binary\"];\n default:\n return [dbType as AnyColumn[\"type\"]];\n }\n }\n\n if (provider === \"postgresql\" || provider === \"cockroachdb\") {\n switch (dbType) {\n case \"decimal\":\n case \"real\":\n case \"numeric\":\n case \"double precision\":\n return [\"decimal\"];\n case \"timestamp\":\n case \"timestamptz\":\n return [\"timestamp\"];\n case \"varchar\": {\n const len = additional.length;\n if (len != null) {\n return [`varchar(${len})`];\n }\n return [\"string\"];\n }\n case \"text\":\n return [\"string\"];\n case \"boolean\":\n case \"bool\":\n return [\"bool\"];\n case \"bytea\":\n return [\"binary\"];\n default:\n return [dbType as AnyColumn[\"type\"]];\n }\n }\n\n if (provider === \"mysql\") {\n switch (dbType) {\n case \"bool\":\n case \"boolean\":\n return [\"bool\"];\n case \"integer\":\n case \"int\":\n return [\"integer\"];\n case \"decimal\":\n case \"numeric\":\n case \"float\":\n case \"double\":\n return [\"decimal\"];\n case \"datetime\":\n return [\"timestamp\"];\n case \"varchar\": {\n const len = additional.length;\n if (len != null) {\n return [`varchar(${len})`];\n }\n return [\"string\"];\n }\n case \"text\":\n return [\"string\"];\n case \"longblob\":\n case \"blob\":\n case \"mediumblob\":\n case \"tinyblob\":\n return [\"binary\"];\n default:\n return [dbType as AnyColumn[\"type\"]];\n }\n }\n\n if (provider === \"mssql\") {\n switch (dbType) {\n case \"int\":\n return [\"integer\"];\n case \"decimal\":\n case \"float\":\n case \"real\":\n case \"numeric\":\n return [\"decimal\"];\n case \"bit\":\n return [\"bool\"];\n case \"datetime\":\n case \"datetime2\":\n return [\"timestamp\"];\n case \"nvarchar\":\n case \"varchar\": {\n const len = additional.length;\n if (len != null) {\n return [`varchar(${len})`];\n }\n return [\"string\", \"json\"];\n }\n case \"ntext\":\n case \"text\":\n case \"varchar(max)\":\n case \"nvarchar(max)\":\n return [\"string\", \"json\"];\n case \"binary\":\n case \"varbinary\":\n return [\"binary\"];\n default:\n return [dbType as AnyColumn[\"type\"]];\n }\n }\n\n throw new Error(`unhandled database provider: ${provider}`);\n}\n\n/**\n * Database type literals that can be returned by schemaToDBType\n */\nexport type DBTypeLiteral =\n // PostgreSQL/CockroachDB types\n | \"bigserial\"\n | \"serial\"\n | \"boolean\"\n | \"bool\"\n | \"json\"\n | \"text\"\n | \"bytea\"\n | \"timestamp\"\n | \"timestamptz\"\n | \"bigint\"\n | \"integer\"\n | \"decimal\"\n | \"date\"\n // MySQL types\n | \"longblob\"\n | \"datetime\"\n // SQLite types\n | \"blob\"\n | \"real\"\n // MSSQL types\n | \"bit\"\n | \"int\"\n | \"varbinary(max)\"\n | \"varchar(max)\"\n // varchar with length parameter\n | `varchar(${number})`;\n\nexport function schemaToDBType(\n column: AnyColumn | Pick<AnyColumn, \"type\">,\n provider: SQLProvider,\n): DBTypeLiteral {\n const { type } = column;\n\n // Handle internal ID columns with auto-increment\n if (\"role\" in column && column.role === \"internal-id\") {\n if (provider === \"postgresql\" || provider === \"cockroachdb\") {\n return \"bigserial\";\n }\n if (provider === \"mysql\") {\n return \"bigint\";\n }\n if (provider === \"sqlite\") {\n return \"integer\"; // SQLite uses INTEGER for auto-increment\n }\n if (provider === \"mssql\") {\n return \"bigint\";\n }\n }\n\n if (\"role\" in column && column.role === \"reference\") {\n if (provider === \"sqlite\") {\n return \"integer\";\n }\n // Other providers use bigint for references\n }\n\n if (provider === \"sqlite\") {\n switch (type) {\n case \"integer\":\n case \"timestamp\":\n case \"date\":\n case \"bool\":\n return \"integer\";\n case \"binary\":\n case \"bigint\":\n return \"blob\";\n case \"json\":\n case \"string\":\n return \"text\";\n case \"decimal\":\n return \"real\";\n default:\n // sqlite doesn't support varchar\n if (type.startsWith(\"varchar\")) {\n return \"text\";\n }\n }\n }\n\n if (provider === \"mssql\") {\n switch (type) {\n case \"bool\":\n return \"bit\";\n case \"timestamp\":\n return \"datetime\";\n case \"integer\":\n return \"int\";\n case \"string\":\n return \"varchar(max)\";\n case \"binary\":\n return \"varbinary(max)\";\n // only 2025 preview supports JSON natively\n case \"json\":\n return \"varchar(max)\";\n default:\n if (type.startsWith(\"varchar\")) {\n return type as `varchar(${number})`;\n }\n return type;\n }\n }\n\n if (provider === \"postgresql\" || provider === \"cockroachdb\") {\n switch (type) {\n case \"bool\":\n return \"boolean\";\n case \"json\":\n return \"json\";\n case \"string\":\n return \"text\";\n case \"binary\":\n return \"bytea\";\n default:\n if (type.startsWith(\"varchar\")) {\n return type as `varchar(${number})`;\n }\n return type;\n }\n }\n\n if (provider === \"mysql\") {\n switch (type) {\n case \"bool\":\n return \"boolean\";\n case \"string\":\n return \"text\";\n case \"binary\":\n return \"longblob\";\n default:\n if (type.startsWith(\"varchar\")) {\n return type as `varchar(${number})`;\n }\n return type;\n }\n }\n\n throw new Error(`cannot handle ${provider} ${type}`);\n}\n\nconst supportJson: SQLProvider[] = [\"postgresql\", \"cockroachdb\", \"mysql\"];\n\n/**\n * Parse from driver value\n */\nexport function deserialize(value: unknown, col: AnyColumn, provider: SQLProvider) {\n if (value === null) {\n return null;\n }\n\n if (!supportJson.includes(provider) && col.type === \"json\" && typeof value === \"string\") {\n return JSON.parse(value);\n }\n\n if (\n provider === \"sqlite\" &&\n (col.type === \"timestamp\" || col.type === \"date\") &&\n (typeof value === \"number\" || typeof value === \"string\")\n ) {\n return new Date(value);\n }\n\n if (\n (provider === \"postgresql\" || provider === \"cockroachdb\") &&\n (col.type === \"timestamp\" || col.type === \"date\") &&\n typeof value === \"string\"\n ) {\n return new Date(value);\n }\n\n if (\n provider === \"mysql\" &&\n (col.type === \"timestamp\" || col.type === \"date\") &&\n typeof value === \"string\"\n ) {\n return new Date(value);\n }\n\n if (col.type === \"bool\" && typeof value === \"number\") {\n return value === 1;\n }\n\n if (col.type === \"bigint\" && value instanceof Buffer) {\n return value.readBigInt64BE(0);\n }\n\n if (col.type === \"bigint\" && typeof value === \"string\") {\n return BigInt(value);\n }\n\n if (col.type === \"binary\" && value instanceof Buffer) {\n return new Uint8Array(value.buffer, value.byteOffset, value.byteLength);\n }\n\n return value;\n}\n\n/**\n * Encode to driver value\n */\nexport function serialize(value: unknown, col: AnyColumn, provider: SQLProvider) {\n if (value === null) {\n return null;\n }\n\n // Handle FragnoReference objects (for reference columns)\n if (value instanceof FragnoReference) {\n return value.internalId;\n }\n\n // Handle FragnoId objects\n if (value instanceof FragnoId) {\n // For external ID columns, use the external ID\n if (col.role === \"external-id\") {\n return value.externalId;\n }\n // For internal ID columns, use the internal ID (must be present)\n if (col.role === \"internal-id\") {\n if (!value.internalId) {\n throw new Error(`FragnoId must have internalId for internal-id column ${col.name}`);\n }\n return value.internalId;\n }\n // For reference columns, prefer internal ID if available\n if (col.role === \"reference\") {\n return value.databaseId;\n }\n // Default to external ID for other columns\n return value.externalId;\n }\n\n if (!supportJson.includes(provider) && col.type === \"json\") {\n return JSON.stringify(value);\n }\n\n if (provider === \"sqlite\" && value instanceof Date) {\n return value.getTime();\n }\n\n if (provider === \"sqlite\" && typeof value === \"boolean\") {\n return value ? 1 : 0;\n }\n\n if (provider === \"sqlite\" && typeof value === \"bigint\") {\n const buf = Buffer.alloc(8);\n buf.writeBigInt64BE(value);\n return buf;\n }\n\n // most drivers accept Buffer\n if (col.type === \"binary\" && value instanceof Uint8Array) {\n return Buffer.from(value);\n }\n\n return value;\n}\n"],"mappings":"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"}
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
import { column, idColumn, schema } from "../schema/create.js";
|
|
2
|
-
|
|
3
|
-
//#region src/shared/settings-schema.ts
|
|
4
|
-
const SETTINGS_TABLE_NAME = "fragno_db_settings";
|
|
5
|
-
const SETTINGS_NAMESPACE = "fragno-db-settings";
|
|
6
|
-
const settingsSchema = schema((s) => {
|
|
7
|
-
return s.addTable(SETTINGS_TABLE_NAME, (t) => {
|
|
8
|
-
return t.addColumn("id", idColumn()).addColumn("key", column("string")).addColumn("value", column("string")).createIndex("unique_key", ["key"], { unique: true });
|
|
9
|
-
});
|
|
10
|
-
});
|
|
11
|
-
function createSettingsManager(queryEngine, namespace) {
|
|
12
|
-
return {
|
|
13
|
-
async get(key) {
|
|
14
|
-
const [[result]] = await queryEngine.createUnitOfWork().find(SETTINGS_TABLE_NAME, (b) => b.whereIndex("unique_key", (eb) => eb("key", "=", `${namespace}.${key}`))).executeRetrieve();
|
|
15
|
-
return result;
|
|
16
|
-
},
|
|
17
|
-
async set(key, value) {
|
|
18
|
-
const uow = queryEngine.createUnitOfWork("createSettingsManager#set").find(SETTINGS_TABLE_NAME, (b) => b.whereIndex("unique_key", (eb) => eb("key", "=", `${namespace}.${key}`)));
|
|
19
|
-
const [[existing]] = await uow.executeRetrieve();
|
|
20
|
-
if (existing) uow.update(SETTINGS_TABLE_NAME, existing.id, (b) => b.set({ value }).check());
|
|
21
|
-
else uow.create(SETTINGS_TABLE_NAME, {
|
|
22
|
-
key: `${namespace}.${key}`,
|
|
23
|
-
value
|
|
24
|
-
});
|
|
25
|
-
const { success } = await uow.executeMutations();
|
|
26
|
-
if (!success) throw new Error("Failed to set schema version");
|
|
27
|
-
},
|
|
28
|
-
async delete(id) {
|
|
29
|
-
await queryEngine.delete(SETTINGS_TABLE_NAME, id);
|
|
30
|
-
}
|
|
31
|
-
};
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
//#endregion
|
|
35
|
-
export { SETTINGS_NAMESPACE, SETTINGS_TABLE_NAME, createSettingsManager, settingsSchema };
|
|
36
|
-
//# sourceMappingURL=settings-schema.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"settings-schema.js","names":[],"sources":["../../src/shared/settings-schema.ts"],"sourcesContent":["import type { AbstractQuery } from \"../query/query\";\nimport { schema, idColumn, column, type FragnoId } from \"../schema/create\";\n\nexport const SETTINGS_TABLE_NAME = \"fragno_db_settings\" as const;\nexport const SETTINGS_NAMESPACE = \"fragno-db-settings\" as const;\n\nexport const settingsSchema = schema((s) => {\n return s.addTable(SETTINGS_TABLE_NAME, (t) => {\n return t\n .addColumn(\"id\", idColumn())\n .addColumn(\"key\", column(\"string\"))\n .addColumn(\"value\", column(\"string\"))\n .createIndex(\"unique_key\", [\"key\"], { unique: true });\n });\n});\n\nexport function createSettingsManager(\n // oxlint-disable-next-line no-explicit-any\n queryEngine: AbstractQuery<typeof settingsSchema, any>,\n namespace: string,\n) {\n return {\n async get(key: string): Promise<{ id: FragnoId; key: string; value: string } | undefined> {\n const uow = queryEngine\n .createUnitOfWork()\n .find(SETTINGS_TABLE_NAME, (b) =>\n b.whereIndex(\"unique_key\", (eb) => eb(\"key\", \"=\", `${namespace}.${key}`)),\n );\n const [[result]] = await uow.executeRetrieve();\n return result; // Safe: result can be undefined if key doesn't exist\n },\n\n async set(key: string, value: string) {\n const uow = queryEngine\n .createUnitOfWork(\"createSettingsManager#set\")\n .find(SETTINGS_TABLE_NAME, (b) =>\n b.whereIndex(\"unique_key\", (eb) => eb(\"key\", \"=\", `${namespace}.${key}`)),\n );\n const [[existing]] = await uow.executeRetrieve();\n\n if (existing) {\n uow.update(SETTINGS_TABLE_NAME, existing.id, (b) => b.set({ value }).check());\n } else {\n uow.create(SETTINGS_TABLE_NAME, {\n key: `${namespace}.${key}`,\n value,\n });\n }\n\n const { success } = await uow.executeMutations();\n\n if (!success) {\n throw new Error(\"Failed to set schema version\");\n }\n },\n\n async delete(id: FragnoId) {\n await queryEngine.delete(SETTINGS_TABLE_NAME, id);\n },\n };\n}\n"],"mappings":";;;AAGA,MAAa,sBAAsB;AACnC,MAAa,qBAAqB;AAElC,MAAa,iBAAiB,QAAQ,MAAM;AAC1C,QAAO,EAAE,SAAS,sBAAsB,MAAM;AAC5C,SAAO,EACJ,UAAU,MAAM,UAAU,CAAC,CAC3B,UAAU,OAAO,OAAO,SAAS,CAAC,CAClC,UAAU,SAAS,OAAO,SAAS,CAAC,CACpC,YAAY,cAAc,CAAC,MAAM,EAAE,EAAE,QAAQ,MAAM,CAAC;GACvD;EACF;AAEF,SAAgB,sBAEd,aACA,WACA;AACA,QAAO;EACL,MAAM,IAAI,KAAgF;GAMxF,MAAM,CAAC,CAAC,WAAW,MALP,YACT,kBAAkB,CAClB,KAAK,sBAAsB,MAC1B,EAAE,WAAW,eAAe,OAAO,GAAG,OAAO,KAAK,GAAG,UAAU,GAAG,MAAM,CAAC,CAC1E,CAC0B,iBAAiB;AAC9C,UAAO;;EAGT,MAAM,IAAI,KAAa,OAAe;GACpC,MAAM,MAAM,YACT,iBAAiB,4BAA4B,CAC7C,KAAK,sBAAsB,MAC1B,EAAE,WAAW,eAAe,OAAO,GAAG,OAAO,KAAK,GAAG,UAAU,GAAG,MAAM,CAAC,CAC1E;GACH,MAAM,CAAC,CAAC,aAAa,MAAM,IAAI,iBAAiB;AAEhD,OAAI,SACF,KAAI,OAAO,qBAAqB,SAAS,KAAK,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,OAAO,CAAC;OAE7E,KAAI,OAAO,qBAAqB;IAC9B,KAAK,GAAG,UAAU,GAAG;IACrB;IACD,CAAC;GAGJ,MAAM,EAAE,YAAY,MAAM,IAAI,kBAAkB;AAEhD,OAAI,CAAC,QACH,OAAM,IAAI,MAAM,+BAA+B;;EAInD,MAAM,OAAO,IAAc;AACzB,SAAM,YAAY,OAAO,qBAAqB,GAAG;;EAEpD"}
|