@fragno-dev/db 0.1.8 → 0.1.9
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 +103 -101
- package/CHANGELOG.md +6 -0
- package/dist/adapters/drizzle/drizzle-adapter.d.ts.map +1 -1
- package/dist/adapters/drizzle/drizzle-adapter.js +1 -1
- package/dist/adapters/drizzle/drizzle-query.d.ts +5 -0
- package/dist/adapters/drizzle/drizzle-query.js +40 -16
- package/dist/adapters/drizzle/drizzle-query.js.map +1 -1
- package/dist/adapters/drizzle/drizzle-uow-compiler.js +12 -21
- package/dist/adapters/drizzle/drizzle-uow-compiler.js.map +1 -1
- package/dist/adapters/drizzle/drizzle-uow-executor.js +3 -3
- package/dist/adapters/drizzle/generate.d.ts +24 -0
- package/dist/adapters/drizzle/generate.d.ts.map +1 -0
- package/dist/adapters/drizzle/generate.js +34 -18
- package/dist/adapters/drizzle/generate.js.map +1 -1
- package/dist/adapters/drizzle/shared.js +13 -4
- package/dist/adapters/drizzle/shared.js.map +1 -1
- package/dist/node_modules/.pnpm/{drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_aee8b50e4fe3dba0cf9f533329f36260 → drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_d581c715d15ad795b3728767f4706e8d}/node_modules/drizzle-orm/alias.js +1 -1
- package/dist/node_modules/.pnpm/{drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_aee8b50e4fe3dba0cf9f533329f36260 → drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_d581c715d15ad795b3728767f4706e8d}/node_modules/drizzle-orm/alias.js.map +1 -1
- package/dist/node_modules/.pnpm/{drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_aee8b50e4fe3dba0cf9f533329f36260 → drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_d581c715d15ad795b3728767f4706e8d}/node_modules/drizzle-orm/casing.js +1 -1
- package/dist/node_modules/.pnpm/{drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_aee8b50e4fe3dba0cf9f533329f36260 → drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_d581c715d15ad795b3728767f4706e8d}/node_modules/drizzle-orm/casing.js.map +1 -1
- package/dist/node_modules/.pnpm/{drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_aee8b50e4fe3dba0cf9f533329f36260 → drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_d581c715d15ad795b3728767f4706e8d}/node_modules/drizzle-orm/column-builder.js +1 -1
- package/dist/node_modules/.pnpm/{drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_aee8b50e4fe3dba0cf9f533329f36260 → drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_d581c715d15ad795b3728767f4706e8d}/node_modules/drizzle-orm/column-builder.js.map +1 -1
- package/dist/node_modules/.pnpm/{drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_aee8b50e4fe3dba0cf9f533329f36260 → drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_d581c715d15ad795b3728767f4706e8d}/node_modules/drizzle-orm/column.js +1 -1
- package/dist/node_modules/.pnpm/{drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_aee8b50e4fe3dba0cf9f533329f36260 → drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_d581c715d15ad795b3728767f4706e8d}/node_modules/drizzle-orm/column.js.map +1 -1
- package/dist/node_modules/.pnpm/{drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_aee8b50e4fe3dba0cf9f533329f36260 → drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_d581c715d15ad795b3728767f4706e8d}/node_modules/drizzle-orm/entity.js +1 -1
- package/dist/node_modules/.pnpm/{drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_aee8b50e4fe3dba0cf9f533329f36260 → drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_d581c715d15ad795b3728767f4706e8d}/node_modules/drizzle-orm/entity.js.map +1 -1
- package/dist/node_modules/.pnpm/{drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_aee8b50e4fe3dba0cf9f533329f36260 → drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_d581c715d15ad795b3728767f4706e8d}/node_modules/drizzle-orm/errors.js +1 -1
- package/dist/node_modules/.pnpm/{drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_aee8b50e4fe3dba0cf9f533329f36260 → drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_d581c715d15ad795b3728767f4706e8d}/node_modules/drizzle-orm/errors.js.map +1 -1
- package/dist/node_modules/.pnpm/{drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_aee8b50e4fe3dba0cf9f533329f36260 → drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_d581c715d15ad795b3728767f4706e8d}/node_modules/drizzle-orm/pg-core/columns/common.js +1 -1
- package/dist/node_modules/.pnpm/{drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_aee8b50e4fe3dba0cf9f533329f36260 → drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_d581c715d15ad795b3728767f4706e8d}/node_modules/drizzle-orm/pg-core/columns/common.js.map +1 -1
- package/dist/node_modules/.pnpm/{drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_aee8b50e4fe3dba0cf9f533329f36260 → drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_d581c715d15ad795b3728767f4706e8d}/node_modules/drizzle-orm/pg-core/columns/enum.js +1 -1
- package/dist/node_modules/.pnpm/{drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_aee8b50e4fe3dba0cf9f533329f36260 → drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_d581c715d15ad795b3728767f4706e8d}/node_modules/drizzle-orm/pg-core/columns/enum.js.map +1 -1
- package/dist/node_modules/.pnpm/{drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_aee8b50e4fe3dba0cf9f533329f36260 → drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_d581c715d15ad795b3728767f4706e8d}/node_modules/drizzle-orm/pg-core/foreign-keys.js +1 -1
- package/dist/node_modules/.pnpm/{drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_aee8b50e4fe3dba0cf9f533329f36260 → drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_d581c715d15ad795b3728767f4706e8d}/node_modules/drizzle-orm/pg-core/foreign-keys.js.map +1 -1
- package/dist/node_modules/.pnpm/{drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_aee8b50e4fe3dba0cf9f533329f36260 → drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_d581c715d15ad795b3728767f4706e8d}/node_modules/drizzle-orm/pg-core/unique-constraint.js +1 -1
- package/dist/node_modules/.pnpm/{drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_aee8b50e4fe3dba0cf9f533329f36260 → drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_d581c715d15ad795b3728767f4706e8d}/node_modules/drizzle-orm/pg-core/unique-constraint.js.map +1 -1
- package/dist/node_modules/.pnpm/{drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_aee8b50e4fe3dba0cf9f533329f36260 → drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_d581c715d15ad795b3728767f4706e8d}/node_modules/drizzle-orm/pg-core/utils/array.js +1 -1
- package/dist/node_modules/.pnpm/{drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_aee8b50e4fe3dba0cf9f533329f36260 → drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_d581c715d15ad795b3728767f4706e8d}/node_modules/drizzle-orm/pg-core/utils/array.js.map +1 -1
- package/dist/node_modules/.pnpm/{drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_aee8b50e4fe3dba0cf9f533329f36260 → drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_d581c715d15ad795b3728767f4706e8d}/node_modules/drizzle-orm/query-builders/query-builder.js +1 -1
- package/dist/node_modules/.pnpm/{drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_aee8b50e4fe3dba0cf9f533329f36260 → drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_d581c715d15ad795b3728767f4706e8d}/node_modules/drizzle-orm/query-builders/query-builder.js.map +1 -1
- package/dist/node_modules/.pnpm/{drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_aee8b50e4fe3dba0cf9f533329f36260 → drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_d581c715d15ad795b3728767f4706e8d}/node_modules/drizzle-orm/query-promise.js +1 -1
- package/dist/node_modules/.pnpm/{drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_aee8b50e4fe3dba0cf9f533329f36260 → drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_d581c715d15ad795b3728767f4706e8d}/node_modules/drizzle-orm/query-promise.js.map +1 -1
- package/dist/node_modules/.pnpm/{drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_aee8b50e4fe3dba0cf9f533329f36260 → drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_d581c715d15ad795b3728767f4706e8d}/node_modules/drizzle-orm/relations.js +1 -1
- package/dist/node_modules/.pnpm/{drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_aee8b50e4fe3dba0cf9f533329f36260 → drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_d581c715d15ad795b3728767f4706e8d}/node_modules/drizzle-orm/relations.js.map +1 -1
- package/dist/node_modules/.pnpm/{drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_aee8b50e4fe3dba0cf9f533329f36260 → drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_d581c715d15ad795b3728767f4706e8d}/node_modules/drizzle-orm/selection-proxy.js +1 -1
- package/dist/node_modules/.pnpm/{drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_aee8b50e4fe3dba0cf9f533329f36260 → drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_d581c715d15ad795b3728767f4706e8d}/node_modules/drizzle-orm/selection-proxy.js.map +1 -1
- package/dist/node_modules/.pnpm/{drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_aee8b50e4fe3dba0cf9f533329f36260 → drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_d581c715d15ad795b3728767f4706e8d}/node_modules/drizzle-orm/sql/expressions/conditions.js +1 -1
- package/dist/node_modules/.pnpm/{drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_aee8b50e4fe3dba0cf9f533329f36260 → drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_d581c715d15ad795b3728767f4706e8d}/node_modules/drizzle-orm/sql/expressions/conditions.js.map +1 -1
- package/dist/node_modules/.pnpm/{drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_aee8b50e4fe3dba0cf9f533329f36260 → drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_d581c715d15ad795b3728767f4706e8d}/node_modules/drizzle-orm/sql/expressions/select.js +1 -1
- package/dist/node_modules/.pnpm/{drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_aee8b50e4fe3dba0cf9f533329f36260 → drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_d581c715d15ad795b3728767f4706e8d}/node_modules/drizzle-orm/sql/expressions/select.js.map +1 -1
- package/dist/node_modules/.pnpm/{drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_aee8b50e4fe3dba0cf9f533329f36260 → drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_d581c715d15ad795b3728767f4706e8d}/node_modules/drizzle-orm/sql/functions/aggregate.js +1 -1
- package/dist/node_modules/.pnpm/{drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_aee8b50e4fe3dba0cf9f533329f36260 → drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_d581c715d15ad795b3728767f4706e8d}/node_modules/drizzle-orm/sql/functions/aggregate.js.map +1 -1
- package/dist/node_modules/.pnpm/{drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_aee8b50e4fe3dba0cf9f533329f36260 → drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_d581c715d15ad795b3728767f4706e8d}/node_modules/drizzle-orm/sql/sql.js +1 -1
- package/dist/node_modules/.pnpm/{drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_aee8b50e4fe3dba0cf9f533329f36260 → drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_d581c715d15ad795b3728767f4706e8d}/node_modules/drizzle-orm/sql/sql.js.map +1 -1
- package/dist/node_modules/.pnpm/{drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_aee8b50e4fe3dba0cf9f533329f36260 → drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_d581c715d15ad795b3728767f4706e8d}/node_modules/drizzle-orm/sqlite-core/columns/common.js +1 -1
- package/dist/node_modules/.pnpm/{drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_aee8b50e4fe3dba0cf9f533329f36260 → drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_d581c715d15ad795b3728767f4706e8d}/node_modules/drizzle-orm/sqlite-core/columns/common.js.map +1 -1
- package/dist/node_modules/.pnpm/{drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_aee8b50e4fe3dba0cf9f533329f36260 → drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_d581c715d15ad795b3728767f4706e8d}/node_modules/drizzle-orm/sqlite-core/db.js +1 -1
- package/dist/node_modules/.pnpm/{drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_aee8b50e4fe3dba0cf9f533329f36260 → drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_d581c715d15ad795b3728767f4706e8d}/node_modules/drizzle-orm/sqlite-core/db.js.map +1 -1
- package/dist/node_modules/.pnpm/{drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_aee8b50e4fe3dba0cf9f533329f36260 → drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_d581c715d15ad795b3728767f4706e8d}/node_modules/drizzle-orm/sqlite-core/dialect.js +1 -1
- package/dist/node_modules/.pnpm/{drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_aee8b50e4fe3dba0cf9f533329f36260 → drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_d581c715d15ad795b3728767f4706e8d}/node_modules/drizzle-orm/sqlite-core/dialect.js.map +1 -1
- package/dist/node_modules/.pnpm/{drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_aee8b50e4fe3dba0cf9f533329f36260 → drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_d581c715d15ad795b3728767f4706e8d}/node_modules/drizzle-orm/sqlite-core/foreign-keys.js +1 -1
- package/dist/node_modules/.pnpm/{drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_aee8b50e4fe3dba0cf9f533329f36260 → drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_d581c715d15ad795b3728767f4706e8d}/node_modules/drizzle-orm/sqlite-core/foreign-keys.js.map +1 -1
- package/dist/node_modules/.pnpm/{drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_aee8b50e4fe3dba0cf9f533329f36260 → drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_d581c715d15ad795b3728767f4706e8d}/node_modules/drizzle-orm/sqlite-core/query-builders/count.js +1 -1
- package/dist/node_modules/.pnpm/{drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_aee8b50e4fe3dba0cf9f533329f36260 → drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_d581c715d15ad795b3728767f4706e8d}/node_modules/drizzle-orm/sqlite-core/query-builders/count.js.map +1 -1
- package/dist/node_modules/.pnpm/{drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_aee8b50e4fe3dba0cf9f533329f36260 → drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_d581c715d15ad795b3728767f4706e8d}/node_modules/drizzle-orm/sqlite-core/query-builders/delete.js +1 -1
- package/dist/node_modules/.pnpm/{drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_aee8b50e4fe3dba0cf9f533329f36260 → drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_d581c715d15ad795b3728767f4706e8d}/node_modules/drizzle-orm/sqlite-core/query-builders/delete.js.map +1 -1
- package/dist/node_modules/.pnpm/{drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_aee8b50e4fe3dba0cf9f533329f36260 → drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_d581c715d15ad795b3728767f4706e8d}/node_modules/drizzle-orm/sqlite-core/query-builders/insert.js +1 -1
- package/dist/node_modules/.pnpm/{drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_aee8b50e4fe3dba0cf9f533329f36260 → drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_d581c715d15ad795b3728767f4706e8d}/node_modules/drizzle-orm/sqlite-core/query-builders/insert.js.map +1 -1
- package/dist/node_modules/.pnpm/{drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_aee8b50e4fe3dba0cf9f533329f36260 → drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_d581c715d15ad795b3728767f4706e8d}/node_modules/drizzle-orm/sqlite-core/query-builders/query-builder.js +1 -1
- package/dist/node_modules/.pnpm/{drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_aee8b50e4fe3dba0cf9f533329f36260 → drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_d581c715d15ad795b3728767f4706e8d}/node_modules/drizzle-orm/sqlite-core/query-builders/query-builder.js.map +1 -1
- package/dist/node_modules/.pnpm/{drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_aee8b50e4fe3dba0cf9f533329f36260 → drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_d581c715d15ad795b3728767f4706e8d}/node_modules/drizzle-orm/sqlite-core/query-builders/query.js +1 -1
- package/dist/node_modules/.pnpm/{drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_aee8b50e4fe3dba0cf9f533329f36260 → drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_d581c715d15ad795b3728767f4706e8d}/node_modules/drizzle-orm/sqlite-core/query-builders/query.js.map +1 -1
- package/dist/node_modules/.pnpm/{drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_aee8b50e4fe3dba0cf9f533329f36260 → drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_d581c715d15ad795b3728767f4706e8d}/node_modules/drizzle-orm/sqlite-core/query-builders/raw.js +1 -1
- package/dist/node_modules/.pnpm/{drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_aee8b50e4fe3dba0cf9f533329f36260 → drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_d581c715d15ad795b3728767f4706e8d}/node_modules/drizzle-orm/sqlite-core/query-builders/raw.js.map +1 -1
- package/dist/node_modules/.pnpm/{drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_aee8b50e4fe3dba0cf9f533329f36260 → drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_d581c715d15ad795b3728767f4706e8d}/node_modules/drizzle-orm/sqlite-core/query-builders/select.js +1 -1
- package/dist/node_modules/.pnpm/{drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_aee8b50e4fe3dba0cf9f533329f36260 → drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_d581c715d15ad795b3728767f4706e8d}/node_modules/drizzle-orm/sqlite-core/query-builders/select.js.map +1 -1
- package/dist/node_modules/.pnpm/{drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_aee8b50e4fe3dba0cf9f533329f36260 → drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_d581c715d15ad795b3728767f4706e8d}/node_modules/drizzle-orm/sqlite-core/query-builders/update.js +1 -1
- package/dist/node_modules/.pnpm/{drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_aee8b50e4fe3dba0cf9f533329f36260 → drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_d581c715d15ad795b3728767f4706e8d}/node_modules/drizzle-orm/sqlite-core/query-builders/update.js.map +1 -1
- package/dist/node_modules/.pnpm/{drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_aee8b50e4fe3dba0cf9f533329f36260 → drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_d581c715d15ad795b3728767f4706e8d}/node_modules/drizzle-orm/sqlite-core/table.js +1 -1
- package/dist/node_modules/.pnpm/{drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_aee8b50e4fe3dba0cf9f533329f36260 → drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_d581c715d15ad795b3728767f4706e8d}/node_modules/drizzle-orm/sqlite-core/table.js.map +1 -1
- package/dist/node_modules/.pnpm/{drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_aee8b50e4fe3dba0cf9f533329f36260 → drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_d581c715d15ad795b3728767f4706e8d}/node_modules/drizzle-orm/sqlite-core/unique-constraint.js +1 -1
- package/dist/node_modules/.pnpm/{drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_aee8b50e4fe3dba0cf9f533329f36260 → drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_d581c715d15ad795b3728767f4706e8d}/node_modules/drizzle-orm/sqlite-core/unique-constraint.js.map +1 -1
- package/dist/node_modules/.pnpm/{drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_aee8b50e4fe3dba0cf9f533329f36260 → drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_d581c715d15ad795b3728767f4706e8d}/node_modules/drizzle-orm/sqlite-core/utils.js +1 -1
- package/dist/node_modules/.pnpm/{drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_aee8b50e4fe3dba0cf9f533329f36260 → drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_d581c715d15ad795b3728767f4706e8d}/node_modules/drizzle-orm/sqlite-core/utils.js.map +1 -1
- package/dist/node_modules/.pnpm/{drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_aee8b50e4fe3dba0cf9f533329f36260 → drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_d581c715d15ad795b3728767f4706e8d}/node_modules/drizzle-orm/sqlite-core/view-base.js +1 -1
- package/dist/node_modules/.pnpm/{drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_aee8b50e4fe3dba0cf9f533329f36260 → drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_d581c715d15ad795b3728767f4706e8d}/node_modules/drizzle-orm/sqlite-core/view-base.js.map +1 -1
- package/dist/node_modules/.pnpm/{drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_aee8b50e4fe3dba0cf9f533329f36260 → drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_d581c715d15ad795b3728767f4706e8d}/node_modules/drizzle-orm/subquery.js +1 -1
- package/dist/node_modules/.pnpm/{drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_aee8b50e4fe3dba0cf9f533329f36260 → drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_d581c715d15ad795b3728767f4706e8d}/node_modules/drizzle-orm/subquery.js.map +1 -1
- package/dist/node_modules/.pnpm/{drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_aee8b50e4fe3dba0cf9f533329f36260 → drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_d581c715d15ad795b3728767f4706e8d}/node_modules/drizzle-orm/table.js +1 -1
- package/dist/node_modules/.pnpm/{drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_aee8b50e4fe3dba0cf9f533329f36260 → drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_d581c715d15ad795b3728767f4706e8d}/node_modules/drizzle-orm/table.js.map +1 -1
- package/dist/node_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_d581c715d15ad795b3728767f4706e8d/node_modules/drizzle-orm/table.utils.js +6 -0
- package/dist/node_modules/.pnpm/{drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_aee8b50e4fe3dba0cf9f533329f36260 → drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_d581c715d15ad795b3728767f4706e8d}/node_modules/drizzle-orm/table.utils.js.map +1 -1
- package/dist/node_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_d581c715d15ad795b3728767f4706e8d/node_modules/drizzle-orm/tracing-utils.js +8 -0
- package/dist/node_modules/.pnpm/{drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_aee8b50e4fe3dba0cf9f533329f36260 → drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_d581c715d15ad795b3728767f4706e8d}/node_modules/drizzle-orm/tracing-utils.js.map +1 -1
- package/dist/node_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_d581c715d15ad795b3728767f4706e8d/node_modules/drizzle-orm/tracing.js +8 -0
- package/dist/node_modules/.pnpm/{drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_aee8b50e4fe3dba0cf9f533329f36260 → drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_d581c715d15ad795b3728767f4706e8d}/node_modules/drizzle-orm/tracing.js.map +1 -1
- package/dist/node_modules/.pnpm/{drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_aee8b50e4fe3dba0cf9f533329f36260 → drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_d581c715d15ad795b3728767f4706e8d}/node_modules/drizzle-orm/utils.js +1 -1
- package/dist/node_modules/.pnpm/{drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_aee8b50e4fe3dba0cf9f533329f36260 → drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_d581c715d15ad795b3728767f4706e8d}/node_modules/drizzle-orm/utils.js.map +1 -1
- package/dist/node_modules/.pnpm/{drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_aee8b50e4fe3dba0cf9f533329f36260 → drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_d581c715d15ad795b3728767f4706e8d}/node_modules/drizzle-orm/view-common.js +1 -1
- package/dist/node_modules/.pnpm/{drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_aee8b50e4fe3dba0cf9f533329f36260 → drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_d581c715d15ad795b3728767f4706e8d}/node_modules/drizzle-orm/view-common.js.map +1 -1
- package/dist/query/unit-of-work.d.ts +6 -2
- package/dist/query/unit-of-work.d.ts.map +1 -1
- package/dist/query/unit-of-work.js +19 -3
- package/dist/query/unit-of-work.js.map +1 -1
- package/package.json +8 -3
- package/src/adapters/drizzle/drizzle-adapter.test.ts +3 -3
- package/src/adapters/drizzle/drizzle-query.test.ts +449 -0
- package/src/adapters/drizzle/drizzle-query.ts +58 -21
- package/src/adapters/drizzle/drizzle-uow-compiler.test.ts +97 -0
- package/src/adapters/drizzle/drizzle-uow-compiler.ts +16 -7
- package/src/adapters/drizzle/generate.test.ts +168 -56
- package/src/adapters/drizzle/generate.ts +80 -21
- package/src/adapters/drizzle/shared.ts +14 -4
- package/src/adapters/drizzle/test-utils.ts +1 -0
- package/src/query/unit-of-work.ts +28 -0
- package/tsdown.config.ts +1 -0
- package/dist/node_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_aee8b50e4fe3dba0cf9f533329f36260/node_modules/drizzle-orm/table.utils.js +0 -6
- package/dist/node_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_aee8b50e4fe3dba0cf9f533329f36260/node_modules/drizzle-orm/tracing-utils.js +0 -8
- package/dist/node_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_aee8b50e4fe3dba0cf9f533329f36260/node_modules/drizzle-orm/tracing.js +0 -8
|
@@ -26,10 +26,15 @@ import { createDrizzleUOWDecoder } from "./drizzle-uow-decoder.js";
|
|
|
26
26
|
* const uow = queryEngine.createUnitOfWork('myOperation');
|
|
27
27
|
* ```
|
|
28
28
|
*/
|
|
29
|
-
function fromDrizzle(schema, pool, provider, mapper) {
|
|
30
|
-
function createUOW(
|
|
31
|
-
|
|
29
|
+
function fromDrizzle(schema, pool, provider, mapper, uowConfig) {
|
|
30
|
+
function createUOW(opts) {
|
|
31
|
+
const uowCompiler = createDrizzleUOWCompiler(schema, pool, provider, mapper);
|
|
32
|
+
const executor = {
|
|
32
33
|
async executeRetrievalPhase(retrievalBatch) {
|
|
34
|
+
if (opts.config?.dryRun) return retrievalBatch.map(() => ({
|
|
35
|
+
rows: [],
|
|
36
|
+
affectedRows: 0
|
|
37
|
+
}));
|
|
33
38
|
const conn = await pool.connect();
|
|
34
39
|
try {
|
|
35
40
|
const db = parseDrizzle(conn.db)[0];
|
|
@@ -39,6 +44,10 @@ function fromDrizzle(schema, pool, provider, mapper) {
|
|
|
39
44
|
}
|
|
40
45
|
},
|
|
41
46
|
async executeMutationPhase(mutationBatch) {
|
|
47
|
+
if (opts.config?.dryRun) return {
|
|
48
|
+
success: true,
|
|
49
|
+
createdInternalIds: mutationBatch.map(() => null)
|
|
50
|
+
};
|
|
42
51
|
const conn = await pool.connect();
|
|
43
52
|
try {
|
|
44
53
|
const db = parseDrizzle(conn.db)[0];
|
|
@@ -47,23 +56,32 @@ function fromDrizzle(schema, pool, provider, mapper) {
|
|
|
47
56
|
await conn.release();
|
|
48
57
|
}
|
|
49
58
|
}
|
|
50
|
-
}
|
|
59
|
+
};
|
|
60
|
+
const decoder = createDrizzleUOWDecoder(schema, provider);
|
|
61
|
+
const { onQuery,...restUowConfig } = opts.config ?? {};
|
|
62
|
+
return new UnitOfWork(schema, uowCompiler, executor, decoder, opts.name, {
|
|
63
|
+
...restUowConfig,
|
|
64
|
+
onQuery: (query) => {
|
|
65
|
+
const actualQuery = query && typeof query === "object" && "query" in query ? query.query : query;
|
|
66
|
+
opts.config?.onQuery?.(actualQuery);
|
|
67
|
+
}
|
|
68
|
+
});
|
|
51
69
|
}
|
|
52
70
|
return {
|
|
53
71
|
find(tableName, builderFn) {
|
|
54
|
-
const uow = createUOW();
|
|
72
|
+
const uow = createUOW({ config: uowConfig });
|
|
55
73
|
uow.find(tableName, builderFn);
|
|
56
74
|
return uow.executeRetrieve();
|
|
57
75
|
},
|
|
58
76
|
async findFirst(tableName, builderFn) {
|
|
59
|
-
const uow = createUOW();
|
|
77
|
+
const uow = createUOW({ config: uowConfig });
|
|
60
78
|
if (builderFn) uow.find(tableName, (b) => builderFn(b).pageSize(1));
|
|
61
79
|
else uow.find(tableName, (b) => b.whereIndex("primary").pageSize(1));
|
|
62
80
|
const [result] = await uow.executeRetrieve();
|
|
63
81
|
return result?.[0] ?? null;
|
|
64
82
|
},
|
|
65
83
|
async create(tableName, values) {
|
|
66
|
-
const uow = createUOW();
|
|
84
|
+
const uow = createUOW({ config: uowConfig });
|
|
67
85
|
uow.create(tableName, values);
|
|
68
86
|
const { success } = await uow.executeMutations();
|
|
69
87
|
if (!success) throw new Error("Failed to create record");
|
|
@@ -72,14 +90,14 @@ function fromDrizzle(schema, pool, provider, mapper) {
|
|
|
72
90
|
return createdId;
|
|
73
91
|
},
|
|
74
92
|
async createMany(tableName, valuesArray) {
|
|
75
|
-
const uow = createUOW();
|
|
93
|
+
const uow = createUOW({ config: uowConfig });
|
|
76
94
|
for (const values of valuesArray) uow.create(tableName, values);
|
|
77
95
|
const { success } = await uow.executeMutations();
|
|
78
96
|
if (!success) throw new Error("Failed to create records");
|
|
79
97
|
return uow.getCreatedIds();
|
|
80
98
|
},
|
|
81
99
|
async update(tableName, id, builderFn) {
|
|
82
|
-
const uow = createUOW();
|
|
100
|
+
const uow = createUOW({ config: uowConfig });
|
|
83
101
|
uow.update(tableName, id, builderFn);
|
|
84
102
|
const { success } = await uow.executeMutations();
|
|
85
103
|
if (!success) throw new Error("Failed to update record (version conflict or record not found)");
|
|
@@ -102,20 +120,20 @@ function fromDrizzle(schema, pool, provider, mapper) {
|
|
|
102
120
|
});
|
|
103
121
|
if (!whereConfig.indexName) throw new Error("whereIndex() must be called in updateMany");
|
|
104
122
|
if (!setValues) throw new Error("set() must be called in updateMany");
|
|
105
|
-
const findUow = createUOW();
|
|
123
|
+
const findUow = createUOW({ config: uowConfig });
|
|
106
124
|
findUow.find(tableName, (b) => {
|
|
107
125
|
if (whereConfig.condition) return b.whereIndex(whereConfig.indexName, whereConfig.condition);
|
|
108
126
|
return b.whereIndex(whereConfig.indexName);
|
|
109
127
|
});
|
|
110
128
|
const records = (await findUow.executeRetrieve())[0];
|
|
111
129
|
if (!records || records.length === 0) return;
|
|
112
|
-
const updateUow = createUOW();
|
|
130
|
+
const updateUow = createUOW({ config: uowConfig });
|
|
113
131
|
for (const record of records) updateUow.update(tableName, record.id, (b) => b.set(setValues));
|
|
114
132
|
const { success } = await updateUow.executeMutations();
|
|
115
133
|
if (!success) throw new Error("Failed to update records (version conflict)");
|
|
116
134
|
},
|
|
117
135
|
async delete(tableName, id, builderFn) {
|
|
118
|
-
const uow = createUOW();
|
|
136
|
+
const uow = createUOW({ config: uowConfig });
|
|
119
137
|
uow.delete(tableName, id, builderFn);
|
|
120
138
|
const { success } = await uow.executeMutations();
|
|
121
139
|
if (!success) throw new Error("Failed to delete record (version conflict or record not found)");
|
|
@@ -130,20 +148,26 @@ function fromDrizzle(schema, pool, provider, mapper) {
|
|
|
130
148
|
return this;
|
|
131
149
|
} });
|
|
132
150
|
if (!whereConfig.indexName) throw new Error("whereIndex() must be called in deleteMany");
|
|
133
|
-
const findUow = createUOW();
|
|
151
|
+
const findUow = createUOW({ config: uowConfig });
|
|
134
152
|
findUow.find(tableName, (b) => {
|
|
135
153
|
if (whereConfig.condition) return b.whereIndex(whereConfig.indexName, whereConfig.condition);
|
|
136
154
|
return b.whereIndex(whereConfig.indexName);
|
|
137
155
|
});
|
|
138
156
|
const records = (await findUow.executeRetrieve())[0];
|
|
139
157
|
if (!records || records.length === 0) return;
|
|
140
|
-
const deleteUow = createUOW();
|
|
158
|
+
const deleteUow = createUOW({ config: uowConfig });
|
|
141
159
|
for (const record of records) deleteUow.delete(tableName, record.id);
|
|
142
160
|
const { success } = await deleteUow.executeMutations();
|
|
143
161
|
if (!success) throw new Error("Failed to delete records (version conflict)");
|
|
144
162
|
},
|
|
145
|
-
createUnitOfWork(name,
|
|
146
|
-
return createUOW(
|
|
163
|
+
createUnitOfWork(name, nestedUowConfig) {
|
|
164
|
+
return createUOW({
|
|
165
|
+
name,
|
|
166
|
+
config: {
|
|
167
|
+
...uowConfig,
|
|
168
|
+
...nestedUowConfig
|
|
169
|
+
}
|
|
170
|
+
});
|
|
147
171
|
}
|
|
148
172
|
};
|
|
149
173
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"drizzle-query.js","names":["whereConfig: { indexName?: string; condition?: unknown }","setValues: unknown"],"sources":["../../../src/adapters/drizzle/drizzle-query.ts"],"sourcesContent":["import type { AbstractQuery } from \"../../query/query\";\nimport type { AnySchema } from \"../../schema/create\";\nimport type { CompiledMutation, UOWExecutor } from \"../../query/unit-of-work\";\nimport { createDrizzleUOWCompiler, type DrizzleCompiledQuery } from \"./drizzle-uow-compiler\";\nimport { executeDrizzleRetrievalPhase, executeDrizzleMutationPhase } from \"./drizzle-uow-executor\";\nimport { UnitOfWork } from \"../../query/unit-of-work\";\nimport { parseDrizzle, type DrizzleResult, type TableNameMapper, type DBType } from \"./shared\";\nimport { createDrizzleUOWDecoder } from \"./drizzle-uow-decoder\";\nimport type { ConnectionPool } from \"../../shared/connection-pool\";\n\n/**\n * Configuration options for creating a Drizzle Unit of Work\n */\nexport interface DrizzleUOWConfig {\n /**\n * Optional callback to receive compiled SQL queries for logging/debugging\n * This callback is invoked for each query as it's compiled\n */\n onQuery?: (query: DrizzleCompiledQuery) => void;\n}\n\n/**\n * Creates a Drizzle-based query engine for the given schema.\n *\n * This is the main entry point for creating a database query interface using Drizzle.\n * It uses a compiler-based architecture where queries are compiled to SQL and then executed,\n * enabling features like SQL snapshot testing.\n *\n * @param schema - The database schema definition\n * @param pool - Connection pool for acquiring database connections\n * @param provider - SQL provider (sqlite, mysql, postgresql)\n * @param mapper - Optional table name mapper for namespace prefixing\n * @returns An AbstractQuery instance for performing database operations\n *\n * @example\n * ```ts\n * const pool = createSimpleConnectionPool(drizzle);\n * const queryEngine = fromDrizzle(mySchema, pool, 'postgresql');\n *\n * const uow = queryEngine.createUnitOfWork('myOperation');\n * ```\n */\nexport function fromDrizzle<T extends AnySchema>(\n schema: T,\n pool: ConnectionPool<DBType>,\n provider: \"sqlite\" | \"mysql\" | \"postgresql\",\n mapper?: TableNameMapper,\n): AbstractQuery<T, DrizzleUOWConfig> {\n function createUOW(name?: string, uowConfig?: DrizzleUOWConfig) {\n const uowCompiler = createDrizzleUOWCompiler(\n schema,\n pool,\n provider,\n mapper,\n uowConfig?.onQuery,\n );\n\n const executor: UOWExecutor<DrizzleCompiledQuery, DrizzleResult> = {\n async executeRetrievalPhase(retrievalBatch: DrizzleCompiledQuery[]) {\n const conn = await pool.connect();\n try {\n const db = parseDrizzle(conn.db)[0];\n return await executeDrizzleRetrievalPhase(db, retrievalBatch, provider);\n } finally {\n await conn.release();\n }\n },\n async executeMutationPhase(mutationBatch: CompiledMutation<DrizzleCompiledQuery>[]) {\n const conn = await pool.connect();\n try {\n const db = parseDrizzle(conn.db)[0];\n return await executeDrizzleMutationPhase(db, mutationBatch, provider);\n } finally {\n await conn.release();\n }\n },\n };\n\n const decoder = createDrizzleUOWDecoder(schema, provider);\n\n return new UnitOfWork(schema, uowCompiler, executor, decoder, name);\n }\n\n return {\n find(tableName, builderFn) {\n const uow = createUOW();\n uow.find(tableName, builderFn);\n return uow.executeRetrieve();\n },\n\n async findFirst(tableName, builderFn) {\n const uow = createUOW();\n if (builderFn) {\n uow.find(tableName, (b) => builderFn(b as never).pageSize(1));\n } else {\n uow.find(tableName, (b) => b.whereIndex(\"primary\").pageSize(1));\n }\n // executeRetrieve runs an array of `find` operation results, which each return an array of rows\n const [result]: unknown[][] = await uow.executeRetrieve();\n return result?.[0] ?? null;\n },\n\n async create(tableName, values) {\n const uow = createUOW();\n uow.create(tableName as string, values as never);\n const { success } = await uow.executeMutations();\n if (!success) {\n throw new Error(\"Failed to create record\");\n }\n\n const createdIds = uow.getCreatedIds();\n const createdId = createdIds[0];\n if (!createdId) {\n throw new Error(\"Failed to get created ID\");\n }\n return createdId;\n },\n\n async createMany(tableName, valuesArray) {\n const uow = createUOW();\n for (const values of valuesArray) {\n uow.create(tableName as string, values as never);\n }\n const { success } = await uow.executeMutations();\n if (!success) {\n throw new Error(\"Failed to create records\");\n }\n\n return uow.getCreatedIds();\n },\n\n async update(tableName, id, builderFn) {\n const uow = createUOW();\n uow.update(tableName as string, id, builderFn as never);\n const { success } = await uow.executeMutations();\n if (!success) {\n throw new Error(\"Failed to update record (version conflict or record not found)\");\n }\n },\n\n async updateMany(tableName, builderFn) {\n // FIXME: This is not correct\n\n let whereConfig: { indexName?: string; condition?: unknown } = {};\n let setValues: unknown;\n\n const specialBuilder = {\n whereIndex(indexName: string, condition?: unknown) {\n whereConfig = { indexName, condition };\n return this;\n },\n set(values: unknown) {\n setValues = values;\n return this;\n },\n };\n\n builderFn(specialBuilder);\n\n if (!whereConfig.indexName) {\n throw new Error(\"whereIndex() must be called in updateMany\");\n }\n if (!setValues) {\n throw new Error(\"set() must be called in updateMany\");\n }\n\n const findUow = createUOW();\n findUow.find(tableName, (b) => {\n if (whereConfig.condition) {\n return b.whereIndex(whereConfig.indexName as never, whereConfig.condition as never);\n }\n return b.whereIndex(whereConfig.indexName as never);\n });\n const findResults = await findUow.executeRetrieve();\n const records = (findResults as unknown as [unknown])[0];\n\n // @ts-expect-error - Type narrowing doesn't work through unknown cast\n if (!records || records.length === 0) {\n return;\n }\n\n const updateUow = createUOW();\n for (const record of records as never as Array<{ id: unknown }>) {\n updateUow.update(tableName as string, record.id as string, (b) =>\n b.set(setValues as never),\n );\n }\n const { success } = await updateUow.executeMutations();\n if (!success) {\n throw new Error(\"Failed to update records (version conflict)\");\n }\n },\n\n async delete(tableName, id, builderFn) {\n const uow = createUOW();\n uow.delete(tableName as string, id, builderFn as never);\n const { success } = await uow.executeMutations();\n if (!success) {\n throw new Error(\"Failed to delete record (version conflict or record not found)\");\n }\n },\n\n async deleteMany(tableName, builderFn) {\n let whereConfig: { indexName?: string; condition?: unknown } = {};\n\n const specialBuilder = {\n whereIndex(indexName: string, condition?: unknown) {\n whereConfig = { indexName, condition };\n return this;\n },\n };\n\n builderFn(specialBuilder as never);\n\n if (!whereConfig.indexName) {\n throw new Error(\"whereIndex() must be called in deleteMany\");\n }\n\n const findUow = createUOW();\n findUow.find(tableName as string, (b) => {\n if (whereConfig.condition) {\n return b.whereIndex(whereConfig.indexName as never, whereConfig.condition as never);\n }\n return b.whereIndex(whereConfig.indexName as never);\n });\n const findResults2 = await findUow.executeRetrieve();\n const records = (findResults2 as unknown as [unknown])[0];\n\n // @ts-expect-error - Type narrowing doesn't work through unknown cast\n if (!records || records.length === 0) {\n return;\n }\n\n const deleteUow = createUOW();\n for (const record of records as never as Array<{ id: unknown }>) {\n deleteUow.delete(tableName as string, record.id as string);\n }\n const { success } = await deleteUow.executeMutations();\n if (!success) {\n throw new Error(\"Failed to delete records (version conflict)\");\n }\n },\n\n createUnitOfWork(name, uowConfig) {\n return createUOW(name, uowConfig);\n },\n } as AbstractQuery<T, DrizzleUOWConfig>;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"drizzle-query.js","names":["executor: UOWExecutor<DrizzleCompiledQuery, DrizzleResult>","whereConfig: { indexName?: string; condition?: unknown }","setValues: unknown"],"sources":["../../../src/adapters/drizzle/drizzle-query.ts"],"sourcesContent":["import type { AbstractQuery } from \"../../query/query\";\nimport type { AnySchema } from \"../../schema/create\";\nimport type { CompiledMutation, UOWExecutor } from \"../../query/unit-of-work\";\nimport { createDrizzleUOWCompiler, type DrizzleCompiledQuery } from \"./drizzle-uow-compiler\";\nimport { executeDrizzleRetrievalPhase, executeDrizzleMutationPhase } from \"./drizzle-uow-executor\";\nimport { UnitOfWork } from \"../../query/unit-of-work\";\nimport { parseDrizzle, type DrizzleResult, type TableNameMapper, type DBType } from \"./shared\";\nimport { createDrizzleUOWDecoder } from \"./drizzle-uow-decoder\";\nimport type { ConnectionPool } from \"../../shared/connection-pool\";\n\n/**\n * Configuration options for creating a Drizzle Unit of Work\n */\nexport interface DrizzleUOWConfig {\n /**\n * Optional callback to receive compiled SQL queries for logging/debugging\n * This callback is invoked for each query as it's compiled\n */\n onQuery?: (query: DrizzleCompiledQuery) => void;\n /**\n * If true, the query will not be executed and the query will be returned. Not respected for UOWs\n * since those have to be manually executed.\n */\n dryRun?: boolean;\n}\n\n/**\n * Creates a Drizzle-based query engine for the given schema.\n *\n * This is the main entry point for creating a database query interface using Drizzle.\n * It uses a compiler-based architecture where queries are compiled to SQL and then executed,\n * enabling features like SQL snapshot testing.\n *\n * @param schema - The database schema definition\n * @param pool - Connection pool for acquiring database connections\n * @param provider - SQL provider (sqlite, mysql, postgresql)\n * @param mapper - Optional table name mapper for namespace prefixing\n * @returns An AbstractQuery instance for performing database operations\n *\n * @example\n * ```ts\n * const pool = createSimpleConnectionPool(drizzle);\n * const queryEngine = fromDrizzle(mySchema, pool, 'postgresql');\n *\n * const uow = queryEngine.createUnitOfWork('myOperation');\n * ```\n */\nexport function fromDrizzle<T extends AnySchema>(\n schema: T,\n pool: ConnectionPool<DBType>,\n provider: \"sqlite\" | \"mysql\" | \"postgresql\",\n mapper?: TableNameMapper,\n uowConfig?: DrizzleUOWConfig,\n): AbstractQuery<T, DrizzleUOWConfig> {\n function createUOW(opts: { name?: string; config?: DrizzleUOWConfig }) {\n const uowCompiler = createDrizzleUOWCompiler(schema, pool, provider, mapper);\n\n const executor: UOWExecutor<DrizzleCompiledQuery, DrizzleResult> = {\n async executeRetrievalPhase(retrievalBatch: DrizzleCompiledQuery[]) {\n // In dryRun mode, skip execution and return empty results\n if (opts.config?.dryRun) {\n return retrievalBatch.map(() => ({\n rows: [],\n affectedRows: 0,\n }));\n }\n\n const conn = await pool.connect();\n try {\n const db = parseDrizzle(conn.db)[0];\n return await executeDrizzleRetrievalPhase(db, retrievalBatch, provider);\n } finally {\n await conn.release();\n }\n },\n async executeMutationPhase(mutationBatch: CompiledMutation<DrizzleCompiledQuery>[]) {\n // In dryRun mode, skip execution and return success with mock internal IDs\n if (opts.config?.dryRun) {\n return {\n success: true,\n createdInternalIds: mutationBatch.map(() => null),\n };\n }\n\n const conn = await pool.connect();\n try {\n const db = parseDrizzle(conn.db)[0];\n return await executeDrizzleMutationPhase(db, mutationBatch, provider);\n } finally {\n await conn.release();\n }\n },\n };\n\n const decoder = createDrizzleUOWDecoder(schema, provider);\n\n const { onQuery, ...restUowConfig } = opts.config ?? {};\n\n return new UnitOfWork(schema, uowCompiler, executor, decoder, opts.name, {\n ...restUowConfig,\n onQuery: (query) => {\n // Handle both CompiledQuery and CompiledMutation structures\n // Retrieval operations return DrizzleCompiledQuery directly: { sql, params }\n // Mutation operations return CompiledMutation: { query: DrizzleCompiledQuery, expectedAffectedRows }\n const actualQuery =\n query && typeof query === \"object\" && \"query\" in query\n ? (query as CompiledMutation<DrizzleCompiledQuery>).query\n : (query as DrizzleCompiledQuery);\n\n opts.config?.onQuery?.(actualQuery);\n },\n });\n }\n\n return {\n find(tableName, builderFn) {\n const uow = createUOW({ config: uowConfig });\n uow.find(tableName, builderFn);\n return uow.executeRetrieve();\n },\n\n async findFirst(tableName, builderFn) {\n const uow = createUOW({ config: uowConfig });\n if (builderFn) {\n uow.find(tableName, (b) => builderFn(b as never).pageSize(1));\n } else {\n uow.find(tableName, (b) => b.whereIndex(\"primary\").pageSize(1));\n }\n // executeRetrieve runs an array of `find` operation results, which each return an array of rows\n const [result]: unknown[][] = await uow.executeRetrieve();\n return result?.[0] ?? null;\n },\n\n async create(tableName, values) {\n const uow = createUOW({ config: uowConfig });\n uow.create(tableName as string, values as never);\n const { success } = await uow.executeMutations();\n if (!success) {\n throw new Error(\"Failed to create record\");\n }\n\n const createdIds = uow.getCreatedIds();\n const createdId = createdIds[0];\n if (!createdId) {\n throw new Error(\"Failed to get created ID\");\n }\n return createdId;\n },\n\n async createMany(tableName, valuesArray) {\n const uow = createUOW({ config: uowConfig });\n for (const values of valuesArray) {\n uow.create(tableName as string, values as never);\n }\n const { success } = await uow.executeMutations();\n if (!success) {\n throw new Error(\"Failed to create records\");\n }\n\n return uow.getCreatedIds();\n },\n\n async update(tableName, id, builderFn) {\n const uow = createUOW({ config: uowConfig });\n uow.update(tableName as string, id, builderFn as never);\n const { success } = await uow.executeMutations();\n if (!success) {\n throw new Error(\"Failed to update record (version conflict or record not found)\");\n }\n },\n\n async updateMany(tableName, builderFn) {\n // FIXME: This is not correct\n\n let whereConfig: { indexName?: string; condition?: unknown } = {};\n let setValues: unknown;\n\n const specialBuilder = {\n whereIndex(indexName: string, condition?: unknown) {\n whereConfig = { indexName, condition };\n return this;\n },\n set(values: unknown) {\n setValues = values;\n return this;\n },\n };\n\n builderFn(specialBuilder);\n\n if (!whereConfig.indexName) {\n throw new Error(\"whereIndex() must be called in updateMany\");\n }\n if (!setValues) {\n throw new Error(\"set() must be called in updateMany\");\n }\n\n const findUow = createUOW({ config: uowConfig });\n findUow.find(tableName, (b) => {\n if (whereConfig.condition) {\n return b.whereIndex(whereConfig.indexName as never, whereConfig.condition as never);\n }\n return b.whereIndex(whereConfig.indexName as never);\n });\n const findResults = await findUow.executeRetrieve();\n const records = (findResults as unknown as [unknown])[0];\n\n // @ts-expect-error - Type narrowing doesn't work through unknown cast\n if (!records || records.length === 0) {\n return;\n }\n\n const updateUow = createUOW({ config: uowConfig });\n for (const record of records as never as Array<{ id: unknown }>) {\n updateUow.update(tableName as string, record.id as string, (b) =>\n b.set(setValues as never),\n );\n }\n const { success } = await updateUow.executeMutations();\n if (!success) {\n throw new Error(\"Failed to update records (version conflict)\");\n }\n },\n\n async delete(tableName, id, builderFn) {\n const uow = createUOW({ config: uowConfig });\n uow.delete(tableName as string, id, builderFn as never);\n const { success } = await uow.executeMutations();\n if (!success) {\n throw new Error(\"Failed to delete record (version conflict or record not found)\");\n }\n },\n\n async deleteMany(tableName, builderFn) {\n let whereConfig: { indexName?: string; condition?: unknown } = {};\n\n const specialBuilder = {\n whereIndex(indexName: string, condition?: unknown) {\n whereConfig = { indexName, condition };\n return this;\n },\n };\n\n builderFn(specialBuilder as never);\n\n if (!whereConfig.indexName) {\n throw new Error(\"whereIndex() must be called in deleteMany\");\n }\n\n const findUow = createUOW({ config: uowConfig });\n findUow.find(tableName as string, (b) => {\n if (whereConfig.condition) {\n return b.whereIndex(whereConfig.indexName as never, whereConfig.condition as never);\n }\n return b.whereIndex(whereConfig.indexName as never);\n });\n const findResults2 = await findUow.executeRetrieve();\n const records = (findResults2 as unknown as [unknown])[0];\n\n // @ts-expect-error - Type narrowing doesn't work through unknown cast\n if (!records || records.length === 0) {\n return;\n }\n\n const deleteUow = createUOW({ config: uowConfig });\n for (const record of records as never as Array<{ id: unknown }>) {\n deleteUow.delete(tableName as string, record.id as string);\n }\n const { success } = await deleteUow.executeMutations();\n if (!success) {\n throw new Error(\"Failed to delete records (version conflict)\");\n }\n },\n\n createUnitOfWork(name, nestedUowConfig) {\n return createUOW({\n name,\n config: {\n ...uowConfig,\n ...nestedUowConfig,\n },\n });\n },\n } as AbstractQuery<T, DrizzleUOWConfig>;\n}\n"],"mappings":"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"}
|
|
@@ -2,10 +2,10 @@ import { Column } from "../../schema/create.js";
|
|
|
2
2
|
import { serialize } from "../../schema/serialize.js";
|
|
3
3
|
import { decodeCursor, serializeCursorValues } from "../../query/cursor.js";
|
|
4
4
|
import { buildCondition } from "../../query/condition-builder.js";
|
|
5
|
-
import { sql } from "../../node_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-
|
|
6
|
-
import { and, eq, gt, gte, inArray, isNotNull, isNull, like, lt, lte, ne, not, notInArray, notLike, or } from "../../node_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-
|
|
7
|
-
import { asc, desc } from "../../node_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-
|
|
8
|
-
import { count } from "../../node_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-
|
|
5
|
+
import { sql } from "../../node_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_d581c715d15ad795b3728767f4706e8d/node_modules/drizzle-orm/sql/sql.js";
|
|
6
|
+
import { and, eq, gt, gte, inArray, isNotNull, isNull, like, lt, lte, ne, not, notInArray, notLike, or } from "../../node_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_d581c715d15ad795b3728767f4706e8d/node_modules/drizzle-orm/sql/expressions/conditions.js";
|
|
7
|
+
import { asc, desc } from "../../node_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_d581c715d15ad795b3728767f4706e8d/node_modules/drizzle-orm/sql/expressions/select.js";
|
|
8
|
+
import { count } from "../../node_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_d581c715d15ad795b3728767f4706e8d/node_modules/drizzle-orm/sql/functions/aggregate.js";
|
|
9
9
|
import { parseDrizzle } from "./shared.js";
|
|
10
10
|
import { ReferenceSubquery, encodeValues } from "../../query/result-transform.js";
|
|
11
11
|
import { getOrderedJoinColumns } from "./join-column-utils.js";
|
|
@@ -21,10 +21,9 @@ import { getOrderedJoinColumns } from "./join-column-utils.js";
|
|
|
21
21
|
* @param pool - Connection pool for acquiring database connections
|
|
22
22
|
* @param provider - SQL provider (sqlite, mysql, postgresql)
|
|
23
23
|
* @param mapper - Optional table name mapper for namespace prefixing
|
|
24
|
-
* @param onQuery - Optional callback to receive compiled queries for logging/debugging
|
|
25
24
|
* @returns A UOWCompiler instance for Drizzle
|
|
26
25
|
*/
|
|
27
|
-
function createDrizzleUOWCompiler(schema, pool, provider, mapper
|
|
26
|
+
function createDrizzleUOWCompiler(schema, pool, provider, mapper) {
|
|
28
27
|
const [db, drizzleTables] = parseDrizzle(pool.getDatabaseSync());
|
|
29
28
|
/**
|
|
30
29
|
* Convert a Fragno table to a Drizzle table
|
|
@@ -174,9 +173,7 @@ function createDrizzleUOWCompiler(schema, pool, provider, mapper, onQuery) {
|
|
|
174
173
|
}
|
|
175
174
|
const drizzleTable = toDrizzleTable(op.table);
|
|
176
175
|
const query = db.select({ count: count() }).from(drizzleTable);
|
|
177
|
-
|
|
178
|
-
onQuery?.(compiledQuery);
|
|
179
|
-
return compiledQuery;
|
|
176
|
+
return whereClause ? query.where(whereClause).toSQL() : query.toSQL();
|
|
180
177
|
}
|
|
181
178
|
case "find": {
|
|
182
179
|
const { useIndex: _useIndex, orderByIndex, joins, after, before, pageSize,...findOptions } = op.options;
|
|
@@ -236,9 +233,7 @@ function createDrizzleUOWCompiler(schema, pool, provider, mapper, onQuery) {
|
|
|
236
233
|
};
|
|
237
234
|
if (joins) queryConfig.with = processJoins(joins);
|
|
238
235
|
const physicalTableName = mapper ? mapper.toPhysical(op.table.ormName) : op.table.ormName;
|
|
239
|
-
|
|
240
|
-
onQuery?.(compiledQuery);
|
|
241
|
-
return compiledQuery;
|
|
236
|
+
return db.query[physicalTableName].findMany(queryConfig).toSQL();
|
|
242
237
|
}
|
|
243
238
|
}
|
|
244
239
|
},
|
|
@@ -248,10 +243,8 @@ function createDrizzleUOWCompiler(schema, pool, provider, mapper, onQuery) {
|
|
|
248
243
|
const table = getTable(op.table);
|
|
249
244
|
const drizzleTable = toDrizzleTable(table);
|
|
250
245
|
const values = processReferenceSubqueries(encodeValues(op.values, table, true, provider));
|
|
251
|
-
const compiledQuery = db.insert(drizzleTable).values(values).toSQL();
|
|
252
|
-
onQuery?.(compiledQuery);
|
|
253
246
|
return {
|
|
254
|
-
query:
|
|
247
|
+
query: db.insert(drizzleTable).values(values).toSQL(),
|
|
255
248
|
expectedAffectedRows: null
|
|
256
249
|
};
|
|
257
250
|
}
|
|
@@ -267,10 +260,8 @@ function createDrizzleUOWCompiler(schema, pool, provider, mapper, onQuery) {
|
|
|
267
260
|
const whereClause = condition === true ? void 0 : buildWhere(condition);
|
|
268
261
|
const setValues = processReferenceSubqueries(encodeValues(op.set, table, false, provider));
|
|
269
262
|
setValues[versionColumn.ormName] = sql.raw(`COALESCE(${versionColumn.ormName}, 0) + 1`);
|
|
270
|
-
const compiledQuery = db.update(drizzleTable).set(setValues).where(whereClause).toSQL();
|
|
271
|
-
onQuery?.(compiledQuery);
|
|
272
263
|
return {
|
|
273
|
-
query:
|
|
264
|
+
query: db.update(drizzleTable).set(setValues).where(whereClause).toSQL(),
|
|
274
265
|
expectedAffectedRows: op.checkVersion ? 1 : null
|
|
275
266
|
};
|
|
276
267
|
}
|
|
@@ -279,15 +270,15 @@ function createDrizzleUOWCompiler(schema, pool, provider, mapper, onQuery) {
|
|
|
279
270
|
const idColumn = table.getIdColumn();
|
|
280
271
|
const versionColumn = table.getVersionColumn();
|
|
281
272
|
const drizzleTable = toDrizzleTable(table);
|
|
273
|
+
if (!op.id) throw new Error(`[Drizzle] Delete operation on table "${op.table}" has undefined id. Make sure you're passing a valid FragnoId or string ID.`);
|
|
282
274
|
const externalId = typeof op.id === "string" ? op.id : op.id.externalId;
|
|
275
|
+
if (!externalId) throw new Error(`[Drizzle] Delete operation on table "${op.table}" has invalid id. The FragnoId object exists but has no externalId. Received: ${JSON.stringify(op.id)}. Make sure the record was properly loaded from the database.`);
|
|
283
276
|
const versionToCheck = getVersionToCheck(op.id, op.checkVersion);
|
|
284
277
|
const condition = versionToCheck !== void 0 ? buildCondition(table.columns, (eb) => eb.and(eb(idColumn.ormName, "=", externalId), eb(versionColumn.ormName, "=", versionToCheck))) : buildCondition(table.columns, (eb) => eb(idColumn.ormName, "=", externalId));
|
|
285
278
|
if (condition === false) return null;
|
|
286
279
|
const whereClause = condition === true ? void 0 : buildWhere(condition);
|
|
287
|
-
const compiledQuery = db.delete(drizzleTable).where(whereClause).toSQL();
|
|
288
|
-
onQuery?.(compiledQuery);
|
|
289
280
|
return {
|
|
290
|
-
query:
|
|
281
|
+
query: db.delete(drizzleTable).where(whereClause).toSQL(),
|
|
291
282
|
expectedAffectedRows: op.checkVersion ? 1 : null
|
|
292
283
|
};
|
|
293
284
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"drizzle-uow-compiler.js","names":["Drizzle.eq","Drizzle.ne","Drizzle.gt","Drizzle.gte","Drizzle.lt","Drizzle.lte","Drizzle.inArray","Drizzle.notInArray","Drizzle.isNull","Drizzle.isNotNull","Drizzle.like","Drizzle.notLike","Drizzle.and","Drizzle.not","Drizzle.or","processed: Record<string, unknown>","result: Record<string, Drizzle.DBQueryConfig<\"many\", boolean>>","joinColumns: Record<string, boolean>","joinOrderBy: Drizzle.SQL[] | undefined","Drizzle.asc","Drizzle.desc","joinWhere: Drizzle.SQL | undefined","joinConfig: Drizzle.DBQueryConfig<\"many\", boolean>","whereClause: Drizzle.SQL | undefined","Drizzle.count","indexColumns: AnyColumn[]","orderDirection: \"asc\" | \"desc\"","orderBy: Drizzle.SQL[] | undefined","columns: Record<string, boolean>","whereClauses: Drizzle.SQL[]","queryConfig: Drizzle.DBQueryConfig<\"many\", boolean>"],"sources":["../../../src/adapters/drizzle/drizzle-uow-compiler.ts"],"sourcesContent":["import * as Drizzle from \"drizzle-orm\";\nimport type { AnyColumn, AnySchema, AnyTable, FragnoId } from \"../../schema/create\";\nimport { Column } from \"../../schema/create\";\nimport type {\n CompiledMutation,\n MutationOperation,\n RetrievalOperation,\n UOWCompiler,\n} from \"../../query/unit-of-work\";\nimport { buildCondition, type Condition } from \"../../query/condition-builder\";\nimport {\n type ColumnType,\n type TableType,\n type TableNameMapper,\n parseDrizzle,\n type DBType,\n} from \"./shared\";\nimport { encodeValues, ReferenceSubquery } from \"../../query/result-transform\";\nimport { serialize } from \"../../schema/serialize\";\nimport { decodeCursor, serializeCursorValues } from \"../../query/cursor\";\nimport type { CompiledJoin } from \"../../query/orm/orm\";\nimport { getOrderedJoinColumns } from \"./join-column-utils\";\nimport type { ConnectionPool } from \"../../shared/connection-pool\";\n\nexport type DrizzleCompiledQuery = {\n sql: string;\n params: unknown[];\n};\n\n/**\n * Create a Drizzle-specific Unit of Work compiler\n *\n * This compiler translates UOW operations into Drizzle query functions\n * that can be executed as a batch/transaction.\n *\n * @param schema - The database schema\n * @param pool - Connection pool for acquiring database connections\n * @param provider - SQL provider (sqlite, mysql, postgresql)\n * @param mapper - Optional table name mapper for namespace prefixing\n * @param onQuery - Optional callback to receive compiled queries for logging/debugging\n * @returns A UOWCompiler instance for Drizzle\n */\nexport function createDrizzleUOWCompiler<TSchema extends AnySchema>(\n schema: TSchema,\n pool: ConnectionPool<DBType>,\n provider: \"sqlite\" | \"mysql\" | \"postgresql\",\n mapper?: TableNameMapper,\n onQuery?: (query: DrizzleCompiledQuery) => void,\n): UOWCompiler<TSchema, DrizzleCompiledQuery> {\n // Get db synchronously for compilation (doesn't execute, just builds SQL)\n // TODO: We don't even need a Drizzle instance with a db client attached here. `drizzle({ schema })` is enough.\n const dbRaw = pool.getDatabaseSync();\n const [db, drizzleTables] = parseDrizzle(dbRaw);\n\n /**\n * Convert a Fragno table to a Drizzle table\n * @throws Error if table is not found in Drizzle schema\n */\n function toDrizzleTable(table: AnyTable): TableType {\n // Map logical table name to physical table name using the mapper\n const physicalTableName = mapper ? mapper.toPhysical(table.ormName) : table.ormName;\n const out = drizzleTables[physicalTableName];\n if (out) {\n return out;\n }\n\n throw new Error(\n `[Drizzle] Unknown table name ${physicalTableName} (logical: ${table.ormName}), is it included in your Drizzle schema?`,\n );\n }\n\n /**\n * Convert a Fragno column to a Drizzle column\n * @throws Error if column is not found in Drizzle table\n */\n function toDrizzleColumn(col: AnyColumn): ColumnType {\n const fragnoTable = schema.tables[col.tableName];\n if (!fragnoTable) {\n throw new Error(`[Drizzle] Unknown table ${col.tableName} for column ${col.ormName}.`);\n }\n\n const table = toDrizzleTable(fragnoTable);\n const out = table[col.ormName];\n if (out) {\n return out;\n }\n\n throw new Error(`[Drizzle] Unknown column name ${col.ormName} in ${fragnoTable.ormName}.`);\n }\n\n /**\n * Build a WHERE clause from a condition using Drizzle's query builder\n */\n function buildWhere(condition: Condition): Drizzle.SQL | undefined {\n if (condition.type === \"compare\") {\n const left = toDrizzleColumn(condition.a);\n const op = condition.operator;\n let right = condition.b;\n if (right instanceof Column) {\n right = toDrizzleColumn(right);\n } else {\n // Serialize non-Column values (e.g., FragnoId -> string, Date -> number for SQLite)\n right = serialize(right, condition.a, provider);\n }\n\n switch (op) {\n case \"=\":\n return Drizzle.eq(left, right);\n case \"!=\":\n return Drizzle.ne(left, right);\n case \">\":\n return Drizzle.gt(left, right);\n case \">=\":\n return Drizzle.gte(left, right);\n case \"<\":\n return Drizzle.lt(left, right);\n case \"<=\":\n return Drizzle.lte(left, right);\n case \"in\": {\n return Drizzle.inArray(left, right as never[]);\n }\n case \"not in\":\n return Drizzle.notInArray(left, right as never[]);\n case \"is\":\n return right === null ? Drizzle.isNull(left) : Drizzle.eq(left, right);\n case \"is not\":\n return right === null ? Drizzle.isNotNull(left) : Drizzle.ne(left, right);\n case \"contains\": {\n right =\n typeof right === \"string\" ? `%${right}%` : Drizzle.sql`concat('%', ${right}, '%')`;\n return Drizzle.like(left, right as string);\n }\n case \"not contains\": {\n right =\n typeof right === \"string\" ? `%${right}%` : Drizzle.sql`concat('%', ${right}, '%')`;\n return Drizzle.notLike(left, right as string);\n }\n case \"ends with\": {\n right = typeof right === \"string\" ? `%${right}` : Drizzle.sql`concat('%', ${right})`;\n return Drizzle.like(left, right as string);\n }\n case \"not ends with\": {\n right = typeof right === \"string\" ? `%${right}` : Drizzle.sql`concat('%', ${right})`;\n return Drizzle.notLike(left, right as string);\n }\n case \"starts with\": {\n right = typeof right === \"string\" ? `${right}%` : Drizzle.sql`concat(${right}, '%')`;\n return Drizzle.like(left, right as string);\n }\n case \"not starts with\": {\n right = typeof right === \"string\" ? `${right}%` : Drizzle.sql`concat(${right}, '%')`;\n return Drizzle.notLike(left, right as string);\n }\n\n default:\n throw new Error(`Unsupported operator: ${op}`);\n }\n }\n\n if (condition.type === \"and\") {\n return Drizzle.and(...condition.items.map((item) => buildWhere(item)));\n }\n\n if (condition.type === \"not\") {\n const result = buildWhere(condition.item);\n if (!result) {\n return;\n }\n\n return Drizzle.not(result);\n }\n\n return Drizzle.or(...condition.items.map((item) => buildWhere(item)));\n }\n\n /**\n * Process reference subqueries in encoded values, converting them to Drizzle SQL subqueries\n */\n function processReferenceSubqueries(values: Record<string, unknown>): Record<string, unknown> {\n const processed: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(values)) {\n if (value instanceof ReferenceSubquery) {\n const refTable = value.referencedTable;\n const externalId = value.externalIdValue;\n const internalIdCol = refTable.getInternalIdColumn();\n const idCol = refTable.getIdColumn();\n\n // Map logical table name to physical table name using the mapper\n const physicalTableName = mapper ? mapper.toPhysical(refTable.ormName) : refTable.ormName;\n\n // Build a SQL subquery using Drizzle's sql template\n // This creates a subquery: (SELECT _internalId FROM table WHERE id = ? LIMIT 1)\n // Safe cast: we're building a SQL subquery that returns a single bigint value\n processed[key] =\n Drizzle.sql`(select ${Drizzle.sql.identifier(internalIdCol.name)} from ${Drizzle.sql.identifier(physicalTableName)} where ${Drizzle.sql.identifier(idCol.name)} = ${externalId} limit 1)`;\n } else {\n processed[key] = value;\n }\n }\n\n return processed;\n }\n\n /**\n * Get table from schema by name\n * @throws Error if table is not found in schema\n */\n function getTable(name: unknown): AnyTable {\n const table = schema.tables[name as string];\n if (!table) {\n throw new Error(`Invalid table name ${name}.`);\n }\n return table;\n }\n\n /**\n * Get the version to check for a given ID and checkVersion flag.\n * @returns The version to check or undefined if no check is required.\n * @throws Error if the ID is a string and checkVersion is true.\n */\n function getVersionToCheck(id: FragnoId | string, checkVersion: boolean): number | undefined {\n if (!checkVersion) {\n return undefined;\n }\n\n if (typeof id === \"string\") {\n throw new Error(\n `Cannot use checkVersion with a string ID. Version checking requires a FragnoId with version information.`,\n );\n }\n\n return id.version;\n }\n\n /**\n * Process joins recursively to support nested joins with orderBy and limit\n */\n function processJoins(\n joins: CompiledJoin[],\n ): Record<string, Drizzle.DBQueryConfig<\"many\", boolean>> {\n const result: Record<string, Drizzle.DBQueryConfig<\"many\", boolean>> = {};\n\n for (const join of joins) {\n const { options, relation } = join;\n\n if (!options) {\n continue;\n }\n\n const targetTable = relation.table;\n const joinName = relation.name;\n\n // Build columns for this join using shared utility\n const selectOption = options.select === undefined ? true : options.select;\n const orderedColumns = getOrderedJoinColumns(targetTable, selectOption);\n const joinColumns: Record<string, boolean> = {};\n for (const colName of orderedColumns) {\n joinColumns[colName] = true;\n }\n\n // Build orderBy for this join\n let joinOrderBy: Drizzle.SQL[] | undefined;\n if (options.orderBy && options.orderBy.length > 0) {\n joinOrderBy = options.orderBy.map(([col, direction]) => {\n const drizzleCol = toDrizzleColumn(col);\n return direction === \"asc\" ? Drizzle.asc(drizzleCol) : Drizzle.desc(drizzleCol);\n });\n }\n\n // Build WHERE clause for this join if provided\n let joinWhere: Drizzle.SQL | undefined;\n if (options.where) {\n joinWhere = buildWhere(options.where);\n }\n\n // Build the join config\n const joinConfig: Drizzle.DBQueryConfig<\"many\", boolean> = {\n columns: joinColumns,\n orderBy: joinOrderBy,\n limit: options.limit,\n where: joinWhere,\n };\n\n // Recursively process nested joins\n if (options.join && options.join.length > 0) {\n joinConfig.with = processJoins(options.join);\n }\n\n result[joinName] = joinConfig;\n }\n\n return result;\n }\n\n return {\n compileRetrievalOperation(op: RetrievalOperation<TSchema>): DrizzleCompiledQuery | null {\n switch (op.type) {\n case \"count\": {\n // Build WHERE clause\n let whereClause: Drizzle.SQL | undefined;\n if (op.options.where) {\n const condition = buildCondition(op.table.columns, op.options.where);\n if (condition === false) {\n // Never matches - return null\n return null;\n }\n if (condition !== true) {\n whereClause = buildWhere(condition);\n }\n }\n\n const drizzleTable = toDrizzleTable(op.table);\n const query = db.select({ count: Drizzle.count() }).from(drizzleTable);\n\n const compiledQuery = whereClause ? query.where(whereClause).toSQL() : query.toSQL();\n onQuery?.(compiledQuery);\n return compiledQuery;\n }\n\n case \"find\": {\n const {\n useIndex: _useIndex,\n orderByIndex,\n joins,\n after,\n before,\n pageSize,\n ...findOptions\n } = op.options;\n\n // Get index columns for ordering and cursor pagination\n let indexColumns: AnyColumn[] = [];\n let orderDirection: \"asc\" | \"desc\" = \"asc\";\n\n if (orderByIndex) {\n const index = op.table.indexes[orderByIndex.indexName];\n orderDirection = orderByIndex.direction;\n\n if (!index) {\n // If _primary index doesn't exist, fall back to ID column\n if (orderByIndex.indexName === \"_primary\") {\n indexColumns = [op.table.getIdColumn()];\n } else {\n throw new Error(\n `Index \"${orderByIndex.indexName}\" not found on table \"${op.table.name}\"`,\n );\n }\n } else {\n indexColumns = index.columns;\n }\n }\n\n // Convert orderByIndex to orderBy format\n let orderBy: Drizzle.SQL[] | undefined;\n if (indexColumns.length > 0) {\n orderBy = indexColumns.map((col) => {\n const drizzleCol = toDrizzleColumn(col);\n return orderDirection === \"asc\" ? Drizzle.asc(drizzleCol) : Drizzle.desc(drizzleCol);\n });\n }\n\n // Build query configuration\n const columns: Record<string, boolean> = {};\n const select = findOptions.select;\n\n if (select === true || select === undefined) {\n for (const col of Object.values(op.table.columns)) {\n columns[col.ormName] = true;\n }\n } else {\n for (const k of select) {\n columns[op.table.columns[k].ormName] = true;\n }\n // Always include hidden columns (for FragnoId construction with internal ID and version)\n for (const col of Object.values(op.table.columns)) {\n if (col.isHidden && !columns[col.ormName]) {\n columns[col.ormName] = true;\n }\n }\n }\n\n // Build WHERE clause with cursor conditions\n const whereClauses: Drizzle.SQL[] = [];\n\n // Add user-defined where clause\n if (findOptions.where) {\n const condition = buildCondition(op.table.columns, findOptions.where);\n if (condition === false) {\n // Never matches - return null to indicate this query should be skipped\n return null;\n }\n if (condition !== true) {\n const clause = buildWhere(condition);\n if (clause) {\n whereClauses.push(clause);\n }\n }\n }\n\n // Add cursor-based pagination conditions\n if ((after || before) && indexColumns.length > 0) {\n const cursor = after || before;\n const cursorData = decodeCursor(cursor!);\n const serializedValues = serializeCursorValues(cursorData, indexColumns, provider);\n\n // Build tuple comparison for cursor pagination\n // For \"after\" with \"asc\": (col1, col2, ...) > (val1, val2, ...)\n // For \"before\" with \"desc\": reverse the comparison\n const isAfter = !!after;\n const useGreaterThan =\n (isAfter && orderDirection === \"asc\") || (!isAfter && orderDirection === \"desc\");\n\n if (indexColumns.length === 1) {\n // Simple single-column case\n const col = toDrizzleColumn(indexColumns[0]!);\n const val = serializedValues[indexColumns[0]!.ormName];\n whereClauses.push(useGreaterThan ? Drizzle.gt(col, val) : Drizzle.lt(col, val));\n } else {\n // Multi-column tuple comparison using SQL\n const drizzleCols = indexColumns.map((c) => toDrizzleColumn(c));\n const vals = indexColumns.map((c) => serializedValues[c.ormName]);\n const operator = useGreaterThan ? \">\" : \"<\";\n // Safe cast: building a SQL comparison expression for cursor pagination\n // Build the tuple comparison: (col1, col2) > (val1, val2)\n const colsSQL = Drizzle.sql.join(drizzleCols, Drizzle.sql.raw(\", \"));\n const valsSQL = Drizzle.sql.join(\n vals.map((v) => Drizzle.sql`${v}`),\n Drizzle.sql.raw(\", \"),\n );\n whereClauses.push(\n Drizzle.sql`(${colsSQL}) ${Drizzle.sql.raw(operator)} (${valsSQL})`,\n );\n }\n }\n\n const whereClause = whereClauses.length > 0 ? Drizzle.and(...whereClauses) : undefined;\n\n const queryConfig: Drizzle.DBQueryConfig<\"many\", boolean> = {\n columns,\n limit: pageSize,\n where: whereClause,\n orderBy,\n with: {},\n };\n\n // Process joins recursively to support nested joins\n if (joins) {\n queryConfig.with = processJoins(joins);\n }\n\n const physicalTableName = mapper ? mapper.toPhysical(op.table.ormName) : op.table.ormName;\n const compiledQuery = db.query[physicalTableName].findMany(queryConfig).toSQL();\n onQuery?.(compiledQuery);\n return compiledQuery;\n }\n }\n },\n\n compileMutationOperation(\n op: MutationOperation<TSchema>,\n ): CompiledMutation<DrizzleCompiledQuery> | null {\n switch (op.type) {\n case \"create\": {\n const table = getTable(op.table);\n const drizzleTable = toDrizzleTable(table);\n // encodeValues now handles runtime defaults automatically\n const encodedValues = encodeValues(op.values, table, true, provider);\n const values = processReferenceSubqueries(encodedValues);\n\n const compiledQuery = db.insert(drizzleTable).values(values).toSQL();\n onQuery?.(compiledQuery);\n return {\n query: compiledQuery,\n expectedAffectedRows: null, // creates don't need affected row checks\n };\n }\n\n case \"update\": {\n const table = getTable(op.table);\n const idColumn = table.getIdColumn();\n const versionColumn = table.getVersionColumn();\n const drizzleTable = toDrizzleTable(table);\n\n const externalId = typeof op.id === \"string\" ? op.id : op.id.externalId;\n const versionToCheck = getVersionToCheck(op.id, op.checkVersion);\n\n // Build WHERE clause that filters by ID and optionally by version\n const condition =\n versionToCheck !== undefined\n ? buildCondition(table.columns, (eb) =>\n eb.and(\n eb(idColumn.ormName, \"=\", externalId),\n eb(versionColumn.ormName, \"=\", versionToCheck),\n ),\n )\n : buildCondition(table.columns, (eb) => eb(idColumn.ormName, \"=\", externalId));\n\n // Handle boolean cases\n if (condition === false) {\n // Never matches - skip this operation\n return null;\n }\n\n const whereClause = condition === true ? undefined : buildWhere(condition);\n const encodedSetValues = encodeValues(op.set, table, false, provider);\n const setValues = processReferenceSubqueries(encodedSetValues);\n\n // Automatically increment _version for optimistic concurrency control\n // Safe cast: we're building a SQL expression for incrementing the version\n setValues[versionColumn.ormName] = Drizzle.sql.raw(\n `COALESCE(${versionColumn.ormName}, 0) + 1`,\n ) as unknown;\n\n const compiledQuery = db.update(drizzleTable).set(setValues).where(whereClause).toSQL();\n onQuery?.(compiledQuery);\n return {\n query: compiledQuery,\n expectedAffectedRows: op.checkVersion ? 1 : null,\n };\n }\n\n case \"delete\": {\n const table = getTable(op.table);\n const idColumn = table.getIdColumn();\n const versionColumn = table.getVersionColumn();\n const drizzleTable = toDrizzleTable(table);\n\n const externalId = typeof op.id === \"string\" ? op.id : op.id.externalId;\n const versionToCheck = getVersionToCheck(op.id, op.checkVersion);\n\n // Build WHERE clause that filters by ID and optionally by version\n const condition =\n versionToCheck !== undefined\n ? buildCondition(table.columns, (eb) =>\n eb.and(\n eb(idColumn.ormName, \"=\", externalId),\n eb(versionColumn.ormName, \"=\", versionToCheck),\n ),\n )\n : buildCondition(table.columns, (eb) => eb(idColumn.ormName, \"=\", externalId));\n\n // Handle boolean cases\n if (condition === false) {\n // Never matches - skip this operation\n return null;\n }\n\n const whereClause = condition === true ? undefined : buildWhere(condition);\n\n const compiledQuery = db.delete(drizzleTable).where(whereClause).toSQL();\n onQuery?.(compiledQuery);\n return {\n query: compiledQuery,\n expectedAffectedRows: op.checkVersion ? 1 : null,\n };\n }\n }\n },\n };\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"drizzle-uow-compiler.js","names":["Drizzle.eq","Drizzle.ne","Drizzle.gt","Drizzle.gte","Drizzle.lt","Drizzle.lte","Drizzle.inArray","Drizzle.notInArray","Drizzle.isNull","Drizzle.isNotNull","Drizzle.like","Drizzle.notLike","Drizzle.and","Drizzle.not","Drizzle.or","processed: Record<string, unknown>","result: Record<string, Drizzle.DBQueryConfig<\"many\", boolean>>","joinColumns: Record<string, boolean>","joinOrderBy: Drizzle.SQL[] | undefined","Drizzle.asc","Drizzle.desc","joinWhere: Drizzle.SQL | undefined","joinConfig: Drizzle.DBQueryConfig<\"many\", boolean>","whereClause: Drizzle.SQL | undefined","Drizzle.count","indexColumns: AnyColumn[]","orderDirection: \"asc\" | \"desc\"","orderBy: Drizzle.SQL[] | undefined","columns: Record<string, boolean>","whereClauses: Drizzle.SQL[]","queryConfig: Drizzle.DBQueryConfig<\"many\", boolean>"],"sources":["../../../src/adapters/drizzle/drizzle-uow-compiler.ts"],"sourcesContent":["import * as Drizzle from \"drizzle-orm\";\nimport type { AnyColumn, AnySchema, AnyTable, FragnoId } from \"../../schema/create\";\nimport { Column } from \"../../schema/create\";\nimport type {\n CompiledMutation,\n MutationOperation,\n RetrievalOperation,\n UOWCompiler,\n} from \"../../query/unit-of-work\";\nimport { buildCondition, type Condition } from \"../../query/condition-builder\";\nimport {\n type ColumnType,\n type TableType,\n type TableNameMapper,\n parseDrizzle,\n type DBType,\n} from \"./shared\";\nimport { encodeValues, ReferenceSubquery } from \"../../query/result-transform\";\nimport { serialize } from \"../../schema/serialize\";\nimport { decodeCursor, serializeCursorValues } from \"../../query/cursor\";\nimport type { CompiledJoin } from \"../../query/orm/orm\";\nimport { getOrderedJoinColumns } from \"./join-column-utils\";\nimport type { ConnectionPool } from \"../../shared/connection-pool\";\n\nexport type DrizzleCompiledQuery = {\n sql: string;\n params: unknown[];\n};\n\n/**\n * Create a Drizzle-specific Unit of Work compiler\n *\n * This compiler translates UOW operations into Drizzle query functions\n * that can be executed as a batch/transaction.\n *\n * @param schema - The database schema\n * @param pool - Connection pool for acquiring database connections\n * @param provider - SQL provider (sqlite, mysql, postgresql)\n * @param mapper - Optional table name mapper for namespace prefixing\n * @returns A UOWCompiler instance for Drizzle\n */\nexport function createDrizzleUOWCompiler<TSchema extends AnySchema>(\n schema: TSchema,\n pool: ConnectionPool<DBType>,\n provider: \"sqlite\" | \"mysql\" | \"postgresql\",\n mapper?: TableNameMapper,\n): UOWCompiler<TSchema, DrizzleCompiledQuery> {\n // Get db synchronously for compilation (doesn't execute, just builds SQL)\n // TODO: We don't even need a Drizzle instance with a db client attached here. `drizzle({ schema })` is enough.\n const dbRaw = pool.getDatabaseSync();\n const [db, drizzleTables] = parseDrizzle(dbRaw);\n\n /**\n * Convert a Fragno table to a Drizzle table\n * @throws Error if table is not found in Drizzle schema\n */\n function toDrizzleTable(table: AnyTable): TableType {\n // Map logical table name to physical table name using the mapper\n const physicalTableName = mapper ? mapper.toPhysical(table.ormName) : table.ormName;\n const out = drizzleTables[physicalTableName];\n if (out) {\n return out;\n }\n\n throw new Error(\n `[Drizzle] Unknown table name ${physicalTableName} (logical: ${table.ormName}), is it included in your Drizzle schema?`,\n );\n }\n\n /**\n * Convert a Fragno column to a Drizzle column\n * @throws Error if column is not found in Drizzle table\n */\n function toDrizzleColumn(col: AnyColumn): ColumnType {\n const fragnoTable = schema.tables[col.tableName];\n if (!fragnoTable) {\n throw new Error(`[Drizzle] Unknown table ${col.tableName} for column ${col.ormName}.`);\n }\n\n const table = toDrizzleTable(fragnoTable);\n const out = table[col.ormName];\n if (out) {\n return out;\n }\n\n throw new Error(`[Drizzle] Unknown column name ${col.ormName} in ${fragnoTable.ormName}.`);\n }\n\n /**\n * Build a WHERE clause from a condition using Drizzle's query builder\n */\n function buildWhere(condition: Condition): Drizzle.SQL | undefined {\n if (condition.type === \"compare\") {\n const left = toDrizzleColumn(condition.a);\n const op = condition.operator;\n let right = condition.b;\n if (right instanceof Column) {\n right = toDrizzleColumn(right);\n } else {\n // Serialize non-Column values (e.g., FragnoId -> string, Date -> number for SQLite)\n right = serialize(right, condition.a, provider);\n }\n\n switch (op) {\n case \"=\":\n return Drizzle.eq(left, right);\n case \"!=\":\n return Drizzle.ne(left, right);\n case \">\":\n return Drizzle.gt(left, right);\n case \">=\":\n return Drizzle.gte(left, right);\n case \"<\":\n return Drizzle.lt(left, right);\n case \"<=\":\n return Drizzle.lte(left, right);\n case \"in\": {\n return Drizzle.inArray(left, right as never[]);\n }\n case \"not in\":\n return Drizzle.notInArray(left, right as never[]);\n case \"is\":\n return right === null ? Drizzle.isNull(left) : Drizzle.eq(left, right);\n case \"is not\":\n return right === null ? Drizzle.isNotNull(left) : Drizzle.ne(left, right);\n case \"contains\": {\n right =\n typeof right === \"string\" ? `%${right}%` : Drizzle.sql`concat('%', ${right}, '%')`;\n return Drizzle.like(left, right as string);\n }\n case \"not contains\": {\n right =\n typeof right === \"string\" ? `%${right}%` : Drizzle.sql`concat('%', ${right}, '%')`;\n return Drizzle.notLike(left, right as string);\n }\n case \"ends with\": {\n right = typeof right === \"string\" ? `%${right}` : Drizzle.sql`concat('%', ${right})`;\n return Drizzle.like(left, right as string);\n }\n case \"not ends with\": {\n right = typeof right === \"string\" ? `%${right}` : Drizzle.sql`concat('%', ${right})`;\n return Drizzle.notLike(left, right as string);\n }\n case \"starts with\": {\n right = typeof right === \"string\" ? `${right}%` : Drizzle.sql`concat(${right}, '%')`;\n return Drizzle.like(left, right as string);\n }\n case \"not starts with\": {\n right = typeof right === \"string\" ? `${right}%` : Drizzle.sql`concat(${right}, '%')`;\n return Drizzle.notLike(left, right as string);\n }\n\n default:\n throw new Error(`Unsupported operator: ${op}`);\n }\n }\n\n if (condition.type === \"and\") {\n return Drizzle.and(...condition.items.map((item) => buildWhere(item)));\n }\n\n if (condition.type === \"not\") {\n const result = buildWhere(condition.item);\n if (!result) {\n return;\n }\n\n return Drizzle.not(result);\n }\n\n return Drizzle.or(...condition.items.map((item) => buildWhere(item)));\n }\n\n /**\n * Process reference subqueries in encoded values, converting them to Drizzle SQL subqueries\n */\n function processReferenceSubqueries(values: Record<string, unknown>): Record<string, unknown> {\n const processed: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(values)) {\n if (value instanceof ReferenceSubquery) {\n const refTable = value.referencedTable;\n const externalId = value.externalIdValue;\n const internalIdCol = refTable.getInternalIdColumn();\n const idCol = refTable.getIdColumn();\n\n // Map logical table name to physical table name using the mapper\n const physicalTableName = mapper ? mapper.toPhysical(refTable.ormName) : refTable.ormName;\n\n // Build a SQL subquery using Drizzle's sql template\n // This creates a subquery: (SELECT _internalId FROM table WHERE id = ? LIMIT 1)\n // Safe cast: we're building a SQL subquery that returns a single bigint value\n processed[key] =\n Drizzle.sql`(select ${Drizzle.sql.identifier(internalIdCol.name)} from ${Drizzle.sql.identifier(physicalTableName)} where ${Drizzle.sql.identifier(idCol.name)} = ${externalId} limit 1)`;\n } else {\n processed[key] = value;\n }\n }\n\n return processed;\n }\n\n /**\n * Get table from schema by name\n * @throws Error if table is not found in schema\n */\n function getTable(name: unknown): AnyTable {\n const table = schema.tables[name as string];\n if (!table) {\n throw new Error(`Invalid table name ${name}.`);\n }\n return table;\n }\n\n /**\n * Get the version to check for a given ID and checkVersion flag.\n * @returns The version to check or undefined if no check is required.\n * @throws Error if the ID is a string and checkVersion is true.\n */\n function getVersionToCheck(id: FragnoId | string, checkVersion: boolean): number | undefined {\n if (!checkVersion) {\n return undefined;\n }\n\n if (typeof id === \"string\") {\n throw new Error(\n `Cannot use checkVersion with a string ID. Version checking requires a FragnoId with version information.`,\n );\n }\n\n return id.version;\n }\n\n /**\n * Process joins recursively to support nested joins with orderBy and limit\n */\n function processJoins(\n joins: CompiledJoin[],\n ): Record<string, Drizzle.DBQueryConfig<\"many\", boolean>> {\n const result: Record<string, Drizzle.DBQueryConfig<\"many\", boolean>> = {};\n\n for (const join of joins) {\n const { options, relation } = join;\n\n if (!options) {\n continue;\n }\n\n const targetTable = relation.table;\n const joinName = relation.name;\n\n // Build columns for this join using shared utility\n const selectOption = options.select === undefined ? true : options.select;\n const orderedColumns = getOrderedJoinColumns(targetTable, selectOption);\n const joinColumns: Record<string, boolean> = {};\n for (const colName of orderedColumns) {\n joinColumns[colName] = true;\n }\n\n // Build orderBy for this join\n let joinOrderBy: Drizzle.SQL[] | undefined;\n if (options.orderBy && options.orderBy.length > 0) {\n joinOrderBy = options.orderBy.map(([col, direction]) => {\n const drizzleCol = toDrizzleColumn(col);\n return direction === \"asc\" ? Drizzle.asc(drizzleCol) : Drizzle.desc(drizzleCol);\n });\n }\n\n // Build WHERE clause for this join if provided\n let joinWhere: Drizzle.SQL | undefined;\n if (options.where) {\n joinWhere = buildWhere(options.where);\n }\n\n // Build the join config\n const joinConfig: Drizzle.DBQueryConfig<\"many\", boolean> = {\n columns: joinColumns,\n orderBy: joinOrderBy,\n limit: options.limit,\n where: joinWhere,\n };\n\n // Recursively process nested joins\n if (options.join && options.join.length > 0) {\n joinConfig.with = processJoins(options.join);\n }\n\n result[joinName] = joinConfig;\n }\n\n return result;\n }\n\n return {\n compileRetrievalOperation(op: RetrievalOperation<TSchema>): DrizzleCompiledQuery | null {\n switch (op.type) {\n case \"count\": {\n // Build WHERE clause\n let whereClause: Drizzle.SQL | undefined;\n if (op.options.where) {\n const condition = buildCondition(op.table.columns, op.options.where);\n if (condition === false) {\n // Never matches - return null\n return null;\n }\n if (condition !== true) {\n whereClause = buildWhere(condition);\n }\n }\n\n const drizzleTable = toDrizzleTable(op.table);\n const query = db.select({ count: Drizzle.count() }).from(drizzleTable);\n\n const compiledQuery = whereClause ? query.where(whereClause).toSQL() : query.toSQL();\n return compiledQuery;\n }\n\n case \"find\": {\n const {\n useIndex: _useIndex,\n orderByIndex,\n joins,\n after,\n before,\n pageSize,\n ...findOptions\n } = op.options;\n\n // Get index columns for ordering and cursor pagination\n let indexColumns: AnyColumn[] = [];\n let orderDirection: \"asc\" | \"desc\" = \"asc\";\n\n if (orderByIndex) {\n const index = op.table.indexes[orderByIndex.indexName];\n orderDirection = orderByIndex.direction;\n\n if (!index) {\n // If _primary index doesn't exist, fall back to ID column\n if (orderByIndex.indexName === \"_primary\") {\n indexColumns = [op.table.getIdColumn()];\n } else {\n throw new Error(\n `Index \"${orderByIndex.indexName}\" not found on table \"${op.table.name}\"`,\n );\n }\n } else {\n indexColumns = index.columns;\n }\n }\n\n // Convert orderByIndex to orderBy format\n let orderBy: Drizzle.SQL[] | undefined;\n if (indexColumns.length > 0) {\n orderBy = indexColumns.map((col) => {\n const drizzleCol = toDrizzleColumn(col);\n return orderDirection === \"asc\" ? Drizzle.asc(drizzleCol) : Drizzle.desc(drizzleCol);\n });\n }\n\n // Build query configuration\n const columns: Record<string, boolean> = {};\n const select = findOptions.select;\n\n if (select === true || select === undefined) {\n for (const col of Object.values(op.table.columns)) {\n columns[col.ormName] = true;\n }\n } else {\n for (const k of select) {\n columns[op.table.columns[k].ormName] = true;\n }\n // Always include hidden columns (for FragnoId construction with internal ID and version)\n for (const col of Object.values(op.table.columns)) {\n if (col.isHidden && !columns[col.ormName]) {\n columns[col.ormName] = true;\n }\n }\n }\n\n // Build WHERE clause with cursor conditions\n const whereClauses: Drizzle.SQL[] = [];\n\n // Add user-defined where clause\n if (findOptions.where) {\n const condition = buildCondition(op.table.columns, findOptions.where);\n if (condition === false) {\n // Never matches - return null to indicate this query should be skipped\n return null;\n }\n if (condition !== true) {\n const clause = buildWhere(condition);\n if (clause) {\n whereClauses.push(clause);\n }\n }\n }\n\n // Add cursor-based pagination conditions\n if ((after || before) && indexColumns.length > 0) {\n const cursor = after || before;\n const cursorData = decodeCursor(cursor!);\n const serializedValues = serializeCursorValues(cursorData, indexColumns, provider);\n\n // Build tuple comparison for cursor pagination\n // For \"after\" with \"asc\": (col1, col2, ...) > (val1, val2, ...)\n // For \"before\" with \"desc\": reverse the comparison\n const isAfter = !!after;\n const useGreaterThan =\n (isAfter && orderDirection === \"asc\") || (!isAfter && orderDirection === \"desc\");\n\n if (indexColumns.length === 1) {\n // Simple single-column case\n const col = toDrizzleColumn(indexColumns[0]!);\n const val = serializedValues[indexColumns[0]!.ormName];\n whereClauses.push(useGreaterThan ? Drizzle.gt(col, val) : Drizzle.lt(col, val));\n } else {\n // Multi-column tuple comparison using SQL\n const drizzleCols = indexColumns.map((c) => toDrizzleColumn(c));\n const vals = indexColumns.map((c) => serializedValues[c.ormName]);\n const operator = useGreaterThan ? \">\" : \"<\";\n // Safe cast: building a SQL comparison expression for cursor pagination\n // Build the tuple comparison: (col1, col2) > (val1, val2)\n const colsSQL = Drizzle.sql.join(drizzleCols, Drizzle.sql.raw(\", \"));\n const valsSQL = Drizzle.sql.join(\n vals.map((v) => Drizzle.sql`${v}`),\n Drizzle.sql.raw(\", \"),\n );\n whereClauses.push(\n Drizzle.sql`(${colsSQL}) ${Drizzle.sql.raw(operator)} (${valsSQL})`,\n );\n }\n }\n\n const whereClause = whereClauses.length > 0 ? Drizzle.and(...whereClauses) : undefined;\n\n const queryConfig: Drizzle.DBQueryConfig<\"many\", boolean> = {\n columns,\n limit: pageSize,\n where: whereClause,\n orderBy,\n with: {},\n };\n\n // Process joins recursively to support nested joins\n if (joins) {\n queryConfig.with = processJoins(joins);\n }\n\n const physicalTableName = mapper ? mapper.toPhysical(op.table.ormName) : op.table.ormName;\n const compiledQuery = db.query[physicalTableName].findMany(queryConfig).toSQL();\n return compiledQuery;\n }\n }\n },\n\n compileMutationOperation(\n op: MutationOperation<TSchema>,\n ): CompiledMutation<DrizzleCompiledQuery> | null {\n switch (op.type) {\n case \"create\": {\n const table = getTable(op.table);\n const drizzleTable = toDrizzleTable(table);\n // encodeValues now handles runtime defaults automatically\n const encodedValues = encodeValues(op.values, table, true, provider);\n const values = processReferenceSubqueries(encodedValues);\n\n const compiledQuery = db.insert(drizzleTable).values(values).toSQL();\n return {\n query: compiledQuery,\n expectedAffectedRows: null, // creates don't need affected row checks\n };\n }\n\n case \"update\": {\n const table = getTable(op.table);\n const idColumn = table.getIdColumn();\n const versionColumn = table.getVersionColumn();\n const drizzleTable = toDrizzleTable(table);\n\n const externalId = typeof op.id === \"string\" ? op.id : op.id.externalId;\n const versionToCheck = getVersionToCheck(op.id, op.checkVersion);\n\n // Build WHERE clause that filters by ID and optionally by version\n const condition =\n versionToCheck !== undefined\n ? buildCondition(table.columns, (eb) =>\n eb.and(\n eb(idColumn.ormName, \"=\", externalId),\n eb(versionColumn.ormName, \"=\", versionToCheck),\n ),\n )\n : buildCondition(table.columns, (eb) => eb(idColumn.ormName, \"=\", externalId));\n\n // Handle boolean cases\n if (condition === false) {\n // Never matches - skip this operation\n return null;\n }\n\n const whereClause = condition === true ? undefined : buildWhere(condition);\n const encodedSetValues = encodeValues(op.set, table, false, provider);\n const setValues = processReferenceSubqueries(encodedSetValues);\n\n // Automatically increment _version for optimistic concurrency control\n // Safe cast: we're building a SQL expression for incrementing the version\n setValues[versionColumn.ormName] = Drizzle.sql.raw(\n `COALESCE(${versionColumn.ormName}, 0) + 1`,\n ) as unknown;\n\n const compiledQuery = db.update(drizzleTable).set(setValues).where(whereClause).toSQL();\n return {\n query: compiledQuery,\n expectedAffectedRows: op.checkVersion ? 1 : null,\n };\n }\n\n case \"delete\": {\n const table = getTable(op.table);\n const idColumn = table.getIdColumn();\n const versionColumn = table.getVersionColumn();\n const drizzleTable = toDrizzleTable(table);\n\n if (!op.id) {\n throw new Error(\n `[Drizzle] Delete operation on table \"${op.table}\" has undefined id. ` +\n `Make sure you're passing a valid FragnoId or string ID.`,\n );\n }\n\n const externalId = typeof op.id === \"string\" ? op.id : op.id.externalId;\n\n if (!externalId) {\n throw new Error(\n `[Drizzle] Delete operation on table \"${op.table}\" has invalid id. ` +\n `The FragnoId object exists but has no externalId. ` +\n `Received: ${JSON.stringify(op.id)}. ` +\n `Make sure the record was properly loaded from the database.`,\n );\n }\n const versionToCheck = getVersionToCheck(op.id, op.checkVersion);\n\n // Build WHERE clause that filters by ID and optionally by version\n const condition =\n versionToCheck !== undefined\n ? buildCondition(table.columns, (eb) =>\n eb.and(\n eb(idColumn.ormName, \"=\", externalId),\n eb(versionColumn.ormName, \"=\", versionToCheck),\n ),\n )\n : buildCondition(table.columns, (eb) => eb(idColumn.ormName, \"=\", externalId));\n\n // Handle boolean cases\n if (condition === false) {\n // Never matches - skip this operation\n return null;\n }\n\n const whereClause = condition === true ? undefined : buildWhere(condition);\n\n const compiledQuery = db.delete(drizzleTable).where(whereClause).toSQL();\n return {\n query: compiledQuery,\n expectedAffectedRows: op.checkVersion ? 1 : null,\n };\n }\n }\n },\n };\n}\n"],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { SQL, StringChunk, sql } from "../../node_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-
|
|
2
|
-
import { SQLiteSyncDialect } from "../../node_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-
|
|
3
|
-
import { BaseSQLiteDatabase } from "../../node_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-
|
|
1
|
+
import { SQL, StringChunk, sql } from "../../node_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_d581c715d15ad795b3728767f4706e8d/node_modules/drizzle-orm/sql/sql.js";
|
|
2
|
+
import { SQLiteSyncDialect } from "../../node_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_d581c715d15ad795b3728767f4706e8d/node_modules/drizzle-orm/sqlite-core/dialect.js";
|
|
3
|
+
import { BaseSQLiteDatabase } from "../../node_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@libsql_client@0.15.15_@types_better-sql_d581c715d15ad795b3728767f4706e8d/node_modules/drizzle-orm/sqlite-core/db.js";
|
|
4
4
|
|
|
5
5
|
//#region src/adapters/drizzle/drizzle-uow-executor.ts
|
|
6
6
|
function isSyncSQLite(db) {
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { AnySchema } from "../../schema/create.js";
|
|
2
|
+
import { SQLProvider } from "../../shared/providers.js";
|
|
3
|
+
|
|
4
|
+
//#region src/adapters/drizzle/generate.d.ts
|
|
5
|
+
type SupportedProvider = Exclude<SQLProvider, "cockroachdb" | "mssql">;
|
|
6
|
+
interface GenerateSchemaOptions {
|
|
7
|
+
/** Custom ID generator import configuration */
|
|
8
|
+
idGeneratorImport?: {
|
|
9
|
+
/** Function name to import */
|
|
10
|
+
name: string;
|
|
11
|
+
/** Module to import from */
|
|
12
|
+
from: string;
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Generate a schema file from one or more fragments with a shared settings table
|
|
17
|
+
*/
|
|
18
|
+
declare function generateSchema(fragments: {
|
|
19
|
+
namespace: string;
|
|
20
|
+
schema: AnySchema;
|
|
21
|
+
}[], provider: SupportedProvider, options?: GenerateSchemaOptions): string;
|
|
22
|
+
//#endregion
|
|
23
|
+
export { GenerateSchemaOptions, SupportedProvider, generateSchema };
|
|
24
|
+
//# sourceMappingURL=generate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate.d.ts","names":[],"sources":["../../../src/adapters/drizzle/generate.ts"],"sourcesContent":[],"mappings":";;;;KA8BY,iBAAA,GAAoB,QAAQ;UA6iBvB,qBAAA;EA7iBL;EA6iBK,iBAAA,CAAA,EAAA;IA4BD;IAC0B,IAAA,EAAA,MAAA;IAC9B;IACA,IAAA,EAAA,MAAA;EAAqB,CAAA;;;;;iBAHjB,cAAA;;UAC0B;eAC9B,6BACA"}
|
|
@@ -3,7 +3,7 @@ import { SETTINGS_TABLE_NAME, settingsSchema } from "../../shared/settings-schem
|
|
|
3
3
|
import { schemaToDBType } from "../../schema/serialize.js";
|
|
4
4
|
import { importGenerator } from "../../util/import-generator.js";
|
|
5
5
|
import { ident, parseVarchar } from "../../util/parse.js";
|
|
6
|
-
import { createTableNameMapper } from "./shared.js";
|
|
6
|
+
import { createTableNameMapper, sanitizeNamespace } from "./shared.js";
|
|
7
7
|
|
|
8
8
|
//#region src/adapters/drizzle/generate.ts
|
|
9
9
|
const PROVIDER_IMPORTS = {
|
|
@@ -227,13 +227,13 @@ function generateTable(ctx, table, customTypes, namespace) {
|
|
|
227
227
|
ctx.imports.addImport(tableFn, ctx.importSource);
|
|
228
228
|
const columns = generateAllColumns(ctx, table, customTypes);
|
|
229
229
|
const constraints = generateTableConstraints(ctx, table, namespace);
|
|
230
|
-
const physicalTableName = namespace ? `${table.ormName}_${namespace}` : table.ormName;
|
|
231
|
-
const exportName =
|
|
230
|
+
const physicalTableName = namespace ? `${table.ormName}_${sanitizeNamespace(namespace)}` : table.ormName;
|
|
231
|
+
const exportName = physicalTableName;
|
|
232
232
|
const args = [`"${physicalTableName}"`, `{\n${columns.join(",\n")}\n}`];
|
|
233
233
|
if (constraints.length > 0) args.push(`(table) => [\n${ident(constraints.join(",\n"))}\n]`);
|
|
234
234
|
return `export const ${exportName} = ${tableFn}(${args.join(", ")})`;
|
|
235
235
|
}
|
|
236
|
-
function generateRelation(ctx, table, namespace) {
|
|
236
|
+
function generateRelation(ctx, table, namespace, inverseRelations) {
|
|
237
237
|
const relations = [];
|
|
238
238
|
let hasOne = false;
|
|
239
239
|
let hasMany = false;
|
|
@@ -257,6 +257,15 @@ function generateRelation(ctx, table, namespace) {
|
|
|
257
257
|
if (options.length > 0) args.push(`{\n${ident(options.join(",\n"))}\n}`);
|
|
258
258
|
relations.push(ident(`${relation.name}: ${relation.type}(${args.join(", ")})`));
|
|
259
259
|
}
|
|
260
|
+
if (inverseRelations && inverseRelations.length > 0) {
|
|
261
|
+
for (const { fromTable, relation } of inverseRelations) if (relation.type === "one") {
|
|
262
|
+
hasMany = true;
|
|
263
|
+
const fromTableRef = namespace ? `${fromTable.ormName}_${sanitizeNamespace(namespace)}` : fromTable.ormName;
|
|
264
|
+
const inverseRelationName = `${fromTable.ormName}List`;
|
|
265
|
+
const args = [fromTableRef, `{\n${ident([`relationName: "${relation.id}"`].join(",\n"))}\n}`];
|
|
266
|
+
relations.push(ident(`${inverseRelationName}: many(${args.join(", ")})`));
|
|
267
|
+
}
|
|
268
|
+
}
|
|
260
269
|
if (relations.length === 0) return;
|
|
261
270
|
const params = [];
|
|
262
271
|
if (hasOne) params.push("one");
|
|
@@ -270,25 +279,19 @@ ${relations.join(",\n")}
|
|
|
270
279
|
}));`;
|
|
271
280
|
}
|
|
272
281
|
/**
|
|
273
|
-
* Sanitize a namespace to be a valid JavaScript identifier
|
|
274
|
-
* Replaces hyphens and other invalid characters with underscores
|
|
275
|
-
*/
|
|
276
|
-
function sanitizeNamespace(namespace) {
|
|
277
|
-
return namespace.replace(/[^a-zA-Z0-9_]/g, "_");
|
|
278
|
-
}
|
|
279
|
-
/**
|
|
280
282
|
* Generate a schema export object for a fragment
|
|
281
283
|
* This groups all tables by their logical names for easier access
|
|
282
284
|
*/
|
|
283
|
-
function generateFragmentSchemaExport(schema, namespace) {
|
|
285
|
+
function generateFragmentSchemaExport(schema, namespace, tablesWithRelations) {
|
|
284
286
|
const entries = [];
|
|
285
287
|
for (const table of Object.values(schema.tables)) {
|
|
286
288
|
const physicalExportName = namespace ? `${table.ormName}_${sanitizeNamespace(namespace)}` : table.ormName;
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
289
|
+
entries.push(` ${physicalExportName}: ${physicalExportName}`);
|
|
290
|
+
if (namespace) entries.push(` ${table.ormName}: ${physicalExportName}`);
|
|
291
|
+
if (tablesWithRelations?.has(table.name)) {
|
|
292
|
+
const relationsName = namespace ? `${table.ormName}_${sanitizeNamespace(namespace)}Relations` : `${table.ormName}Relations`;
|
|
293
|
+
entries.push(` ${relationsName}: ${relationsName}`);
|
|
290
294
|
}
|
|
291
|
-
entries.push(` ${table.ormName}: ${physicalExportName}`);
|
|
292
295
|
}
|
|
293
296
|
entries.push(` schemaVersion: ${schema.version}`);
|
|
294
297
|
return `export const ${namespace ? `${sanitizeNamespace(namespace)}_schema` : "_schema"} = {\n${entries.join(",\n")}\n}`;
|
|
@@ -325,14 +328,27 @@ function generateSchema(fragments, provider, options) {
|
|
|
325
328
|
const tableCode = generateTable(ctx, table, customTypes, namespace);
|
|
326
329
|
fragmentTables.push("");
|
|
327
330
|
fragmentTables.push(tableCode);
|
|
328
|
-
|
|
331
|
+
}
|
|
332
|
+
const inverseRelations = /* @__PURE__ */ new Map();
|
|
333
|
+
for (const table of Object.values(schema.tables)) for (const relation of Object.values(table.relations)) {
|
|
334
|
+
const targetTableName = relation.table.name;
|
|
335
|
+
if (!inverseRelations.has(targetTableName)) inverseRelations.set(targetTableName, []);
|
|
336
|
+
inverseRelations.get(targetTableName).push({
|
|
337
|
+
fromTable: table,
|
|
338
|
+
relation
|
|
339
|
+
});
|
|
340
|
+
}
|
|
341
|
+
const tablesWithRelations = /* @__PURE__ */ new Set();
|
|
342
|
+
for (const table of Object.values(schema.tables)) {
|
|
343
|
+
const relationCode = generateRelation(ctx, table, namespace, inverseRelations.get(table.name));
|
|
329
344
|
if (relationCode) {
|
|
330
345
|
fragmentTables.push("");
|
|
331
346
|
fragmentTables.push(relationCode);
|
|
347
|
+
tablesWithRelations.add(table.name);
|
|
332
348
|
}
|
|
333
349
|
}
|
|
334
350
|
fragmentTables.push("");
|
|
335
|
-
fragmentTables.push(generateFragmentSchemaExport(schema, namespace));
|
|
351
|
+
fragmentTables.push(generateFragmentSchemaExport(schema, namespace, tablesWithRelations));
|
|
336
352
|
sections.push(...fragmentTables);
|
|
337
353
|
}
|
|
338
354
|
return [
|