@fragno-dev/db 0.1.2 → 0.1.5
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 +210 -146
- package/CHANGELOG.md +19 -0
- package/LICENSE.md +16 -0
- package/dist/adapters/adapters.js +1 -0
- package/dist/adapters/drizzle/drizzle-adapter.d.ts.map +1 -1
- package/dist/adapters/drizzle/drizzle-adapter.js +4 -2
- package/dist/adapters/drizzle/drizzle-adapter.js.map +1 -1
- package/dist/adapters/drizzle/drizzle-query.js +2 -2
- package/dist/adapters/drizzle/drizzle-query.js.map +1 -1
- package/dist/adapters/drizzle/drizzle-uow-compiler.js +4 -4
- package/dist/adapters/drizzle/drizzle-uow-decoder.js +14 -4
- package/dist/adapters/drizzle/drizzle-uow-decoder.js.map +1 -1
- package/dist/adapters/drizzle/drizzle-uow-executor.js +78 -60
- package/dist/adapters/drizzle/drizzle-uow-executor.js.map +1 -1
- package/dist/adapters/drizzle/generate.js +5 -4
- package/dist/adapters/drizzle/generate.js.map +1 -1
- package/dist/adapters/kysely/kysely-adapter.d.ts.map +1 -1
- package/dist/adapters/kysely/kysely-adapter.js +33 -22
- package/dist/adapters/kysely/kysely-adapter.js.map +1 -1
- package/dist/adapters/kysely/migration/execute-base.js +128 -0
- package/dist/adapters/kysely/migration/execute-base.js.map +1 -0
- package/dist/adapters/kysely/migration/execute-factory.js +27 -0
- package/dist/adapters/kysely/migration/execute-factory.js.map +1 -0
- package/dist/adapters/kysely/migration/execute-mssql.js +112 -0
- package/dist/adapters/kysely/migration/execute-mssql.js.map +1 -0
- package/dist/adapters/kysely/migration/execute-mysql.js +93 -0
- package/dist/adapters/kysely/migration/execute-mysql.js.map +1 -0
- package/dist/adapters/kysely/migration/execute-postgres.js +104 -0
- package/dist/adapters/kysely/migration/execute-postgres.js.map +1 -0
- package/dist/adapters/kysely/migration/execute-sqlite.js +123 -0
- package/dist/adapters/kysely/migration/execute-sqlite.js.map +1 -0
- package/dist/adapters/kysely/migration/execute.js +23 -168
- package/dist/adapters/kysely/migration/execute.js.map +1 -1
- package/dist/migration-engine/shared.d.ts +24 -5
- package/dist/migration-engine/shared.d.ts.map +1 -1
- package/dist/migration-engine/shared.js.map +1 -1
- package/dist/node_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/alias.js +77 -0
- package/dist/node_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/alias.js.map +1 -0
- package/dist/node_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/casing.js +49 -0
- package/dist/node_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/casing.js.map +1 -0
- package/dist/node_modules/{.bun/drizzle-orm@0.44.6_4fae081eecb963e2 → .pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8}/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_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/column-builder.js.map +1 -0
- package/dist/node_modules/{.bun/drizzle-orm@0.44.6_4fae081eecb963e2 → .pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8}/node_modules/drizzle-orm/column.js +1 -1
- package/dist/node_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/column.js.map +1 -0
- package/dist/node_modules/{.bun/drizzle-orm@0.44.6_4fae081eecb963e2 → .pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8}/node_modules/drizzle-orm/entity.js +1 -1
- package/dist/node_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/entity.js.map +1 -0
- package/dist/node_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/errors.js +21 -0
- package/dist/node_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/errors.js.map +1 -0
- package/dist/node_modules/{.bun/drizzle-orm@0.44.6_4fae081eecb963e2 → .pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8}/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_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/pg-core/columns/common.js.map +1 -0
- package/dist/node_modules/{.bun/drizzle-orm@0.44.6_4fae081eecb963e2 → .pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8}/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_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/pg-core/columns/enum.js.map +1 -0
- package/dist/node_modules/{.bun/drizzle-orm@0.44.6_4fae081eecb963e2 → .pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8}/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_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/pg-core/foreign-keys.js.map +1 -0
- package/dist/node_modules/{.bun/drizzle-orm@0.44.6_4fae081eecb963e2 → .pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8}/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_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/pg-core/unique-constraint.js.map +1 -0
- package/dist/node_modules/{.bun/drizzle-orm@0.44.6_4fae081eecb963e2 → .pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8}/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_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/pg-core/utils/array.js.map +1 -0
- package/dist/node_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/query-builders/query-builder.js +14 -0
- package/dist/node_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/query-builders/query-builder.js.map +1 -0
- package/dist/node_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/query-promise.js +26 -0
- package/dist/node_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/query-promise.js.map +1 -0
- package/dist/node_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/relations.js +127 -0
- package/dist/node_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/relations.js.map +1 -0
- package/dist/node_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/selection-proxy.js +47 -0
- package/dist/node_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/selection-proxy.js.map +1 -0
- package/dist/node_modules/{.bun/drizzle-orm@0.44.6_4fae081eecb963e2 → .pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8}/node_modules/drizzle-orm/sql/expressions/conditions.js +20 -2
- package/dist/node_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/sql/expressions/conditions.js.map +1 -0
- package/dist/node_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/sql/expressions/select.js +13 -0
- package/dist/node_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/sql/expressions/select.js.map +1 -0
- package/dist/node_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/sql/functions/aggregate.js +10 -0
- package/dist/node_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/sql/functions/aggregate.js.map +1 -0
- package/dist/node_modules/{.bun/drizzle-orm@0.44.6_4fae081eecb963e2 → .pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8}/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_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/sql/sql.js.map +1 -0
- package/dist/node_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/sqlite-core/columns/common.js +60 -0
- package/dist/node_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/sqlite-core/columns/common.js.map +1 -0
- package/dist/node_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/sqlite-core/db.js +269 -0
- package/dist/node_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/sqlite-core/db.js.map +1 -0
- package/dist/node_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/sqlite-core/dialect.js +457 -0
- package/dist/node_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/sqlite-core/dialect.js.map +1 -0
- package/dist/node_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/sqlite-core/foreign-keys.js +68 -0
- package/dist/node_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/sqlite-core/foreign-keys.js.map +1 -0
- package/dist/node_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/sqlite-core/query-builders/count.js +41 -0
- package/dist/node_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/sqlite-core/query-builders/count.js.map +1 -0
- package/dist/node_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/sqlite-core/query-builders/delete.js +119 -0
- package/dist/node_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/sqlite-core/query-builders/delete.js.map +1 -0
- package/dist/node_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/sqlite-core/query-builders/insert.js +170 -0
- package/dist/node_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/sqlite-core/query-builders/insert.js.map +1 -0
- package/dist/node_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/sqlite-core/query-builders/query-builder.js +75 -0
- package/dist/node_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/sqlite-core/query-builders/query-builder.js.map +1 -0
- package/dist/node_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/sqlite-core/query-builders/query.js +107 -0
- package/dist/node_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/sqlite-core/query-builders/query.js.map +1 -0
- package/dist/node_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/sqlite-core/query-builders/raw.js +37 -0
- package/dist/node_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/sqlite-core/query-builders/raw.js.map +1 -0
- package/dist/node_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/sqlite-core/query-builders/select.js +621 -0
- package/dist/node_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/sqlite-core/query-builders/select.js.map +1 -0
- package/dist/node_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/sqlite-core/query-builders/update.js +170 -0
- package/dist/node_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/sqlite-core/query-builders/update.js.map +1 -0
- package/dist/node_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/sqlite-core/table.js +20 -0
- package/dist/node_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/sqlite-core/table.js.map +1 -0
- package/dist/node_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/sqlite-core/unique-constraint.js +48 -0
- package/dist/node_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/sqlite-core/unique-constraint.js.map +1 -0
- package/dist/node_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/sqlite-core/utils.js +17 -0
- package/dist/node_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/sqlite-core/utils.js.map +1 -0
- package/dist/node_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/sqlite-core/view-base.js +11 -0
- package/dist/node_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/sqlite-core/view-base.js.map +1 -0
- package/dist/node_modules/{.bun/drizzle-orm@0.44.6_4fae081eecb963e2 → .pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8}/node_modules/drizzle-orm/subquery.js +2 -2
- package/dist/node_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/subquery.js.map +1 -0
- package/dist/node_modules/{.bun/drizzle-orm@0.44.6_4fae081eecb963e2 → .pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8}/node_modules/drizzle-orm/table.js +8 -2
- package/dist/node_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/table.js.map +1 -0
- package/dist/node_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/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_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/table.utils.js.map +1 -0
- package/dist/node_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/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_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/tracing-utils.js.map +1 -0
- package/dist/node_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/tracing.js +8 -0
- package/dist/node_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/tracing.js.map +1 -0
- package/dist/node_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/utils.js +53 -0
- package/dist/node_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/utils.js.map +1 -0
- package/dist/node_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/view-common.js +6 -0
- package/dist/node_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/view-common.js.map +1 -0
- package/dist/query/query.d.ts +4 -4
- package/dist/query/query.d.ts.map +1 -1
- package/dist/query/unit-of-work.d.ts +22 -22
- package/dist/query/unit-of-work.d.ts.map +1 -1
- package/dist/schema/create.d.ts +41 -41
- package/dist/schema/create.d.ts.map +1 -1
- package/dist/schema/serialize.js +3 -0
- package/dist/schema/serialize.js.map +1 -1
- package/package.json +20 -24
- package/src/adapters/drizzle/drizzle-adapter-sqlite.test.ts +585 -0
- package/src/adapters/drizzle/drizzle-adapter.test.ts +2 -2
- package/src/adapters/drizzle/drizzle-adapter.ts +11 -4
- package/src/adapters/drizzle/drizzle-query.ts +2 -2
- package/src/adapters/drizzle/drizzle-uow-compiler.test.ts +1 -1
- package/src/adapters/drizzle/drizzle-uow-decoder.ts +21 -4
- package/src/adapters/drizzle/drizzle-uow-executor.ts +155 -115
- package/src/adapters/drizzle/generate.test.ts +111 -14
- package/src/adapters/drizzle/generate.ts +12 -7
- package/src/adapters/kysely/kysely-adapter.ts +46 -27
- package/src/adapters/kysely/migration/execute-base.ts +256 -0
- package/src/adapters/kysely/migration/execute-factory.ts +30 -0
- package/src/adapters/kysely/migration/execute-mssql.ts +250 -0
- package/src/adapters/kysely/migration/execute-mysql.ts +211 -0
- package/src/adapters/kysely/migration/execute-postgres.ts +234 -0
- package/src/adapters/kysely/migration/execute-sqlite.test.ts +1363 -0
- package/src/adapters/kysely/migration/execute-sqlite.ts +247 -0
- package/src/adapters/kysely/migration/execute.ts +33 -396
- package/src/adapters/kysely/migration/kysely-migrator.test.ts +84 -2
- package/src/migration-engine/shared.ts +29 -11
- package/src/schema/serialize.test.ts +1 -0
- package/src/schema/serialize.ts +7 -0
- package/tsdown.config.ts +1 -0
- package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/column-builder.js.map +0 -1
- package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/column.js.map +0 -1
- package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/entity.js.map +0 -1
- package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/pg-core/columns/common.js.map +0 -1
- package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/pg-core/columns/enum.js.map +0 -1
- package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/pg-core/foreign-keys.js.map +0 -1
- package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/pg-core/unique-constraint.js.map +0 -1
- package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/pg-core/utils/array.js.map +0 -1
- package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/sql/expressions/conditions.js.map +0 -1
- package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/sql/expressions/select.js +0 -13
- package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/sql/expressions/select.js.map +0 -1
- package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/sql/functions/aggregate.js +0 -10
- package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/sql/functions/aggregate.js.map +0 -1
- package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/sql/sql.js.map +0 -1
- package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/subquery.js.map +0 -1
- package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/table.js.map +0 -1
- package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/table.utils.js +0 -6
- package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/table.utils.js.map +0 -1
- package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/tracing-utils.js +0 -8
- package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/tracing-utils.js.map +0 -1
- package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/tracing.js +0 -8
- package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/tracing.js.map +0 -1
- package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/view-common.js +0 -6
- package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/view-common.js.map +0 -1
|
@@ -189,7 +189,7 @@ describe("generateSchema", () => {
|
|
|
189
189
|
it("should generate SQLite schema", () => {
|
|
190
190
|
const generated = generateSchema([{ namespace: "test", schema: testSchema }], "sqlite");
|
|
191
191
|
expect(generated).toMatchInlineSnapshot(`
|
|
192
|
-
"import { sqliteTable, text, integer, uniqueIndex, index,
|
|
192
|
+
"import { sqliteTable, text, integer, uniqueIndex, index, foreignKey } from "drizzle-orm/sqlite-core"
|
|
193
193
|
import { createId } from "@fragno-dev/db/id"
|
|
194
194
|
import { relations } from "drizzle-orm"
|
|
195
195
|
|
|
@@ -201,7 +201,7 @@ describe("generateSchema", () => {
|
|
|
201
201
|
id: text("id").notNull().$defaultFn(() => createId()),
|
|
202
202
|
key: text("key").notNull(),
|
|
203
203
|
value: text("value").notNull(),
|
|
204
|
-
_internalId: integer("_internalId").primaryKey().
|
|
204
|
+
_internalId: integer("_internalId").primaryKey({ autoIncrement: true }).notNull(),
|
|
205
205
|
_version: integer("_version").notNull().default(0)
|
|
206
206
|
}, (table) => [
|
|
207
207
|
uniqueIndex("unique_key").on(table.key)
|
|
@@ -218,7 +218,7 @@ describe("generateSchema", () => {
|
|
|
218
218
|
name: text("name").notNull(),
|
|
219
219
|
email: text("email").notNull(),
|
|
220
220
|
age: integer("age"),
|
|
221
|
-
_internalId: integer("_internalId").primaryKey().
|
|
221
|
+
_internalId: integer("_internalId").primaryKey({ autoIncrement: true }).notNull(),
|
|
222
222
|
_version: integer("_version").notNull().default(0)
|
|
223
223
|
}, (table) => [
|
|
224
224
|
uniqueIndex("idx_email_test").on(table.email),
|
|
@@ -229,9 +229,9 @@ describe("generateSchema", () => {
|
|
|
229
229
|
id: text("id").notNull().$defaultFn(() => createId()),
|
|
230
230
|
title: text("title").notNull(),
|
|
231
231
|
content: text("content").notNull(),
|
|
232
|
-
userId:
|
|
232
|
+
userId: integer("userId").notNull(),
|
|
233
233
|
viewCount: integer("viewCount").notNull().default(0),
|
|
234
|
-
_internalId: integer("_internalId").primaryKey().
|
|
234
|
+
_internalId: integer("_internalId").primaryKey({ autoIncrement: true }).notNull(),
|
|
235
235
|
_version: integer("_version").notNull().default(0)
|
|
236
236
|
}, (table) => [
|
|
237
237
|
foreignKey({
|
|
@@ -612,7 +612,7 @@ describe("generateSchema", () => {
|
|
|
612
612
|
it("should generate SQLite schema with many relations", () => {
|
|
613
613
|
const generated = generateSchema([{ namespace: "test", schema: oneToManySchema }], "sqlite");
|
|
614
614
|
expect(generated).toMatchInlineSnapshot(`
|
|
615
|
-
"import { sqliteTable, text, integer, uniqueIndex,
|
|
615
|
+
"import { sqliteTable, text, integer, uniqueIndex, foreignKey, index } from "drizzle-orm/sqlite-core"
|
|
616
616
|
import { createId } from "@fragno-dev/db/id"
|
|
617
617
|
import { relations } from "drizzle-orm"
|
|
618
618
|
|
|
@@ -624,7 +624,7 @@ describe("generateSchema", () => {
|
|
|
624
624
|
id: text("id").notNull().$defaultFn(() => createId()),
|
|
625
625
|
key: text("key").notNull(),
|
|
626
626
|
value: text("value").notNull(),
|
|
627
|
-
_internalId: integer("_internalId").primaryKey().
|
|
627
|
+
_internalId: integer("_internalId").primaryKey({ autoIncrement: true }).notNull(),
|
|
628
628
|
_version: integer("_version").notNull().default(0)
|
|
629
629
|
}, (table) => [
|
|
630
630
|
uniqueIndex("unique_key").on(table.key)
|
|
@@ -639,7 +639,7 @@ describe("generateSchema", () => {
|
|
|
639
639
|
export const users_test = sqliteTable("users_test", {
|
|
640
640
|
id: text("id").notNull().$defaultFn(() => createId()),
|
|
641
641
|
name: text("name").notNull(),
|
|
642
|
-
_internalId: integer("_internalId").primaryKey().
|
|
642
|
+
_internalId: integer("_internalId").primaryKey({ autoIncrement: true }).notNull(),
|
|
643
643
|
_version: integer("_version").notNull().default(0)
|
|
644
644
|
})
|
|
645
645
|
|
|
@@ -652,8 +652,8 @@ describe("generateSchema", () => {
|
|
|
652
652
|
export const posts_test = sqliteTable("posts_test", {
|
|
653
653
|
id: text("id").notNull().$defaultFn(() => createId()),
|
|
654
654
|
title: text("title").notNull(),
|
|
655
|
-
userId:
|
|
656
|
-
_internalId: integer("_internalId").primaryKey().
|
|
655
|
+
userId: integer("userId").notNull(),
|
|
656
|
+
_internalId: integer("_internalId").primaryKey({ autoIncrement: true }).notNull(),
|
|
657
657
|
_version: integer("_version").notNull().default(0)
|
|
658
658
|
}, (table) => [
|
|
659
659
|
foreignKey({
|
|
@@ -1008,7 +1008,7 @@ describe("generateSchema", () => {
|
|
|
1008
1008
|
it("should generate SQLite self-referencing foreign key using table parameter", () => {
|
|
1009
1009
|
const generated = generateSchema([{ namespace: "test", schema: selfRefSchema }], "sqlite");
|
|
1010
1010
|
expect(generated).toMatchInlineSnapshot(`
|
|
1011
|
-
"import { sqliteTable, text, integer, uniqueIndex,
|
|
1011
|
+
"import { sqliteTable, text, integer, uniqueIndex, foreignKey, index } from "drizzle-orm/sqlite-core"
|
|
1012
1012
|
import { createId } from "@fragno-dev/db/id"
|
|
1013
1013
|
import { relations } from "drizzle-orm"
|
|
1014
1014
|
|
|
@@ -1020,7 +1020,7 @@ describe("generateSchema", () => {
|
|
|
1020
1020
|
id: text("id").notNull().$defaultFn(() => createId()),
|
|
1021
1021
|
key: text("key").notNull(),
|
|
1022
1022
|
value: text("value").notNull(),
|
|
1023
|
-
_internalId: integer("_internalId").primaryKey().
|
|
1023
|
+
_internalId: integer("_internalId").primaryKey({ autoIncrement: true }).notNull(),
|
|
1024
1024
|
_version: integer("_version").notNull().default(0)
|
|
1025
1025
|
}, (table) => [
|
|
1026
1026
|
uniqueIndex("unique_key").on(table.key)
|
|
@@ -1035,8 +1035,8 @@ describe("generateSchema", () => {
|
|
|
1035
1035
|
export const comment_test = sqliteTable("comment_test", {
|
|
1036
1036
|
id: text("id").notNull().$defaultFn(() => createId()),
|
|
1037
1037
|
content: text("content").notNull(),
|
|
1038
|
-
parentId:
|
|
1039
|
-
_internalId: integer("_internalId").primaryKey().
|
|
1038
|
+
parentId: integer("parentId"),
|
|
1039
|
+
_internalId: integer("_internalId").primaryKey({ autoIncrement: true }).notNull(),
|
|
1040
1040
|
_version: integer("_version").notNull().default(0)
|
|
1041
1041
|
}, (table) => [
|
|
1042
1042
|
foreignKey({
|
|
@@ -1063,4 +1063,101 @@ describe("generateSchema", () => {
|
|
|
1063
1063
|
`);
|
|
1064
1064
|
});
|
|
1065
1065
|
});
|
|
1066
|
+
|
|
1067
|
+
describe("namespace sanitization", () => {
|
|
1068
|
+
it("should sanitize namespace with special characters in foreign key references", () => {
|
|
1069
|
+
const generated = generateSchema(
|
|
1070
|
+
[{ namespace: "my-fragment-v2", schema: testSchema }],
|
|
1071
|
+
"postgresql",
|
|
1072
|
+
);
|
|
1073
|
+
|
|
1074
|
+
// Should generate valid JavaScript identifiers (underscores instead of hyphens)
|
|
1075
|
+
expect(generated).toContain("export const users_my_fragment_v2 =");
|
|
1076
|
+
expect(generated).toContain("export const posts_my_fragment_v2 =");
|
|
1077
|
+
|
|
1078
|
+
// Foreign key should reference sanitized table name
|
|
1079
|
+
expect(generated).toContain("foreignColumns: [users_my_fragment_v2._internalId]");
|
|
1080
|
+
|
|
1081
|
+
// Relations should also use sanitized names
|
|
1082
|
+
expect(generated).toContain("author: one(users_my_fragment_v2");
|
|
1083
|
+
expect(generated).toContain("fields: [posts_my_fragment_v2.userId]");
|
|
1084
|
+
expect(generated).toContain("references: [users_my_fragment_v2._internalId]");
|
|
1085
|
+
|
|
1086
|
+
// Physical table names in the database can keep hyphens
|
|
1087
|
+
expect(generated).toContain('pgTable("users_my-fragment-v2"');
|
|
1088
|
+
expect(generated).toContain('pgTable("posts_my-fragment-v2"');
|
|
1089
|
+
|
|
1090
|
+
expect(generated).toMatchInlineSnapshot(`
|
|
1091
|
+
"import { pgTable, varchar, text, bigserial, integer, uniqueIndex, index, bigint, foreignKey } from "drizzle-orm/pg-core"
|
|
1092
|
+
import { createId } from "@fragno-dev/db/id"
|
|
1093
|
+
import { relations } from "drizzle-orm"
|
|
1094
|
+
|
|
1095
|
+
// ============================================================================
|
|
1096
|
+
// Settings Table (shared across all fragments)
|
|
1097
|
+
// ============================================================================
|
|
1098
|
+
|
|
1099
|
+
export const fragno_db_settings = pgTable("fragno_db_settings", {
|
|
1100
|
+
id: varchar("id", { length: 30 }).notNull().$defaultFn(() => createId()),
|
|
1101
|
+
key: text("key").notNull(),
|
|
1102
|
+
value: text("value").notNull(),
|
|
1103
|
+
_internalId: bigserial("_internalId", { mode: "number" }).primaryKey().notNull(),
|
|
1104
|
+
_version: integer("_version").notNull().default(0)
|
|
1105
|
+
}, (table) => [
|
|
1106
|
+
uniqueIndex("unique_key").on(table.key)
|
|
1107
|
+
])
|
|
1108
|
+
|
|
1109
|
+
export const fragnoDbSettingSchemaVersion = 1;
|
|
1110
|
+
|
|
1111
|
+
// ============================================================================
|
|
1112
|
+
// Fragment: my-fragment-v2
|
|
1113
|
+
// ============================================================================
|
|
1114
|
+
|
|
1115
|
+
export const users_my_fragment_v2 = pgTable("users_my-fragment-v2", {
|
|
1116
|
+
id: varchar("id", { length: 30 }).notNull().$defaultFn(() => createId()),
|
|
1117
|
+
name: text("name").notNull(),
|
|
1118
|
+
email: text("email").notNull(),
|
|
1119
|
+
age: integer("age"),
|
|
1120
|
+
_internalId: bigserial("_internalId", { mode: "number" }).primaryKey().notNull(),
|
|
1121
|
+
_version: integer("_version").notNull().default(0)
|
|
1122
|
+
}, (table) => [
|
|
1123
|
+
uniqueIndex("idx_email_my-fragment-v2").on(table.email),
|
|
1124
|
+
index("idx_name_my-fragment-v2").on(table.name)
|
|
1125
|
+
])
|
|
1126
|
+
|
|
1127
|
+
export const posts_my_fragment_v2 = pgTable("posts_my-fragment-v2", {
|
|
1128
|
+
id: varchar("id", { length: 30 }).notNull().$defaultFn(() => createId()),
|
|
1129
|
+
title: text("title").notNull(),
|
|
1130
|
+
content: text("content").notNull(),
|
|
1131
|
+
userId: bigint("userId", { mode: "number" }).notNull(),
|
|
1132
|
+
viewCount: integer("viewCount").notNull().default(0),
|
|
1133
|
+
_internalId: bigserial("_internalId", { mode: "number" }).primaryKey().notNull(),
|
|
1134
|
+
_version: integer("_version").notNull().default(0)
|
|
1135
|
+
}, (table) => [
|
|
1136
|
+
foreignKey({
|
|
1137
|
+
columns: [table.userId],
|
|
1138
|
+
foreignColumns: [users_my_fragment_v2._internalId],
|
|
1139
|
+
name: "fk_posts_users_author_my-fragment-v2"
|
|
1140
|
+
}),
|
|
1141
|
+
index("idx_user_my-fragment-v2").on(table.userId),
|
|
1142
|
+
index("idx_title_my-fragment-v2").on(table.title)
|
|
1143
|
+
])
|
|
1144
|
+
|
|
1145
|
+
export const posts_my_fragment_v2Relations = relations(posts_my_fragment_v2, ({ one }) => ({
|
|
1146
|
+
author: one(users_my_fragment_v2, {
|
|
1147
|
+
relationName: "posts_users",
|
|
1148
|
+
fields: [posts_my_fragment_v2.userId],
|
|
1149
|
+
references: [users_my_fragment_v2._internalId]
|
|
1150
|
+
})
|
|
1151
|
+
}));
|
|
1152
|
+
|
|
1153
|
+
export const my_fragment_v2_schema = {
|
|
1154
|
+
"users_my-fragment-v2": users_my_fragment_v2,
|
|
1155
|
+
users: users_my_fragment_v2,
|
|
1156
|
+
"posts_my-fragment-v2": posts_my_fragment_v2,
|
|
1157
|
+
posts: posts_my_fragment_v2,
|
|
1158
|
+
schemaVersion: 3
|
|
1159
|
+
}"
|
|
1160
|
+
`);
|
|
1161
|
+
});
|
|
1162
|
+
});
|
|
1066
1163
|
});
|
|
@@ -248,12 +248,16 @@ function generateColumnDefinition(
|
|
|
248
248
|
|
|
249
249
|
// Primary key for internal ID
|
|
250
250
|
if (column instanceof InternalIdColumn || column.role === "internal-id") {
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
251
|
+
if (ctx.provider === "sqlite") {
|
|
252
|
+
// SQLite uses primaryKey({ autoIncrement: true })
|
|
253
|
+
parts.push("primaryKey({ autoIncrement: true })");
|
|
254
|
+
} else if (ctx.provider === "mysql") {
|
|
255
|
+
// MySQL uses primaryKey().autoincrement()
|
|
256
|
+
parts.push("primaryKey()");
|
|
256
257
|
parts.push("autoincrement()");
|
|
258
|
+
} else {
|
|
259
|
+
// PostgreSQL just uses primaryKey()
|
|
260
|
+
parts.push("primaryKey()");
|
|
257
261
|
}
|
|
258
262
|
}
|
|
259
263
|
|
|
@@ -334,8 +338,9 @@ function generateForeignKeys(ctx: GeneratorContext, table: AnyTable, namespace?:
|
|
|
334
338
|
foreignColumns.push(`table.${actualRefCol}`);
|
|
335
339
|
} else {
|
|
336
340
|
// Suffix the foreign table reference with namespace if provided
|
|
337
|
-
const foreignTableRef =
|
|
338
|
-
|
|
341
|
+
const foreignTableRef = namespace
|
|
342
|
+
? `${relation.table.ormName}_${sanitizeNamespace(namespace)}`
|
|
343
|
+
: relation.table.ormName;
|
|
339
344
|
foreignColumns.push(`${foreignTableRef}.${actualRefCol}`);
|
|
340
345
|
}
|
|
341
346
|
}
|
|
@@ -4,7 +4,7 @@ import type { DatabaseAdapter } from "../adapters";
|
|
|
4
4
|
import { createMigrator, type Migrator } from "../../migration-engine/create";
|
|
5
5
|
import type { AnySchema } from "../../schema/create";
|
|
6
6
|
import type { CustomOperation, MigrationOperation } from "../../migration-engine/shared";
|
|
7
|
-
import { execute } from "./migration/execute";
|
|
7
|
+
import { execute, preprocessOperations } from "./migration/execute";
|
|
8
8
|
import type { AbstractQuery } from "../../query/query";
|
|
9
9
|
import { fromKysely } from "./kysely-query";
|
|
10
10
|
import { createTableNameMapper } from "./kysely-shared";
|
|
@@ -47,40 +47,50 @@ export class KyselyAdapter implements DatabaseAdapter {
|
|
|
47
47
|
const manager = createSettingsManager(this.#kyselyConfig.db, namespace);
|
|
48
48
|
const mapper = namespace ? createTableNameMapper(namespace) : undefined;
|
|
49
49
|
|
|
50
|
-
const
|
|
51
|
-
|
|
50
|
+
const preprocessMigrationOperations = (operations: MigrationOperation[]) => {
|
|
51
|
+
let preprocessed = preprocessOperations(operations, this.#kyselyConfig);
|
|
52
52
|
|
|
53
|
-
return {
|
|
54
|
-
compile() {
|
|
55
|
-
return statement.compile(db);
|
|
56
|
-
},
|
|
57
|
-
execute() {
|
|
58
|
-
return statement.execute(db);
|
|
59
|
-
},
|
|
60
|
-
};
|
|
61
|
-
};
|
|
62
|
-
|
|
63
|
-
const preprocess = (operations: MigrationOperation[], db: KyselyAny) => {
|
|
64
53
|
if (this.#kyselyConfig.provider === "mysql") {
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
} else if (this.#kyselyConfig.provider === "sqlite") {
|
|
68
|
-
operations.unshift({
|
|
69
|
-
type: "custom",
|
|
70
|
-
sql: "PRAGMA defer_foreign_keys = ON",
|
|
71
|
-
});
|
|
54
|
+
preprocessed.unshift({ type: "custom", sql: "SET FOREIGN_KEY_CHECKS = 0" });
|
|
55
|
+
preprocessed.push({ type: "custom", sql: "SET FOREIGN_KEY_CHECKS = 1" });
|
|
72
56
|
}
|
|
73
57
|
|
|
58
|
+
return preprocessed;
|
|
59
|
+
};
|
|
60
|
+
|
|
61
|
+
// Convert operations to executable nodes bound to specific db instance
|
|
62
|
+
const toExecutableNodes = (operations: MigrationOperation[], db: KyselyAny) => {
|
|
63
|
+
const onCustomNode = (node: CustomOperation, db: KyselyAny) => {
|
|
64
|
+
const statement = sql.raw(node["sql"] as string);
|
|
65
|
+
|
|
66
|
+
return {
|
|
67
|
+
compile() {
|
|
68
|
+
return statement.compile(db);
|
|
69
|
+
},
|
|
70
|
+
execute() {
|
|
71
|
+
return statement.execute(db);
|
|
72
|
+
},
|
|
73
|
+
};
|
|
74
|
+
};
|
|
75
|
+
|
|
76
|
+
const dbConfig: KyselyConfig = { db, provider: this.#kyselyConfig.provider };
|
|
74
77
|
return operations.flatMap((op) =>
|
|
75
|
-
execute(op,
|
|
78
|
+
execute(op, dbConfig, (node) => onCustomNode(node, db), mapper),
|
|
76
79
|
);
|
|
77
80
|
};
|
|
78
81
|
|
|
79
82
|
const migrator = createMigrator({
|
|
80
83
|
schema,
|
|
81
84
|
executor: async (operations) => {
|
|
85
|
+
// For SQLite, execute PRAGMA defer_foreign_keys BEFORE transaction
|
|
86
|
+
if (this.#kyselyConfig.provider === "sqlite") {
|
|
87
|
+
await sql.raw("PRAGMA defer_foreign_keys = ON").execute(this.#kyselyConfig.db);
|
|
88
|
+
}
|
|
89
|
+
|
|
82
90
|
await this.#kyselyConfig.db.transaction().execute(async (tx) => {
|
|
83
|
-
|
|
91
|
+
const preprocessed = preprocessMigrationOperations(operations);
|
|
92
|
+
const nodes = toExecutableNodes(preprocessed, tx);
|
|
93
|
+
for (const node of nodes) {
|
|
84
94
|
try {
|
|
85
95
|
await node.execute();
|
|
86
96
|
} catch (e) {
|
|
@@ -92,11 +102,20 @@ export class KyselyAdapter implements DatabaseAdapter {
|
|
|
92
102
|
},
|
|
93
103
|
sql: {
|
|
94
104
|
toSql: (operations) => {
|
|
95
|
-
const
|
|
96
|
-
|
|
97
|
-
|
|
105
|
+
const parts: string[] = [];
|
|
106
|
+
|
|
107
|
+
// Add SQLite PRAGMA at the beginning
|
|
108
|
+
if (this.#kyselyConfig.provider === "sqlite") {
|
|
109
|
+
parts.push("PRAGMA defer_foreign_keys = ON;");
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
const preprocessed = preprocessMigrationOperations(operations);
|
|
113
|
+
const nodes = toExecutableNodes(preprocessed, this.#kyselyConfig.db);
|
|
114
|
+
const compiled = nodes.map((node) => `${node.compile().sql};`);
|
|
115
|
+
|
|
116
|
+
parts.push(...compiled);
|
|
98
117
|
|
|
99
|
-
return
|
|
118
|
+
return parts.join("\n\n");
|
|
100
119
|
},
|
|
101
120
|
},
|
|
102
121
|
|
|
@@ -0,0 +1,256 @@
|
|
|
1
|
+
import { type ColumnBuilderCallback, type Kysely, type RawBuilder, sql } from "kysely";
|
|
2
|
+
import type {
|
|
3
|
+
ColumnInfo,
|
|
4
|
+
MigrationOperation,
|
|
5
|
+
MigrationOperationMetadata,
|
|
6
|
+
} from "../../../migration-engine/shared";
|
|
7
|
+
import type { SQLProvider } from "../../../shared/providers";
|
|
8
|
+
import { schemaToDBType } from "../../../schema/serialize";
|
|
9
|
+
import type { TableNameMapper } from "../kysely-shared";
|
|
10
|
+
import { SETTINGS_TABLE_NAME } from "../../../shared/settings-schema";
|
|
11
|
+
|
|
12
|
+
export type ExecuteNode = {
|
|
13
|
+
compile(): { sql: string; parameters: readonly unknown[] };
|
|
14
|
+
execute(): Promise<unknown>;
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
18
|
+
type KyselyAny = Kysely<any>;
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Migration executor interface.
|
|
22
|
+
* Each provider implements this to handle database-specific migration execution.
|
|
23
|
+
*/
|
|
24
|
+
export interface MigrationExecutor<
|
|
25
|
+
TMeta extends MigrationOperationMetadata = MigrationOperationMetadata,
|
|
26
|
+
> {
|
|
27
|
+
/**
|
|
28
|
+
* Preprocess operations before execution.
|
|
29
|
+
* Allows executors to combine, split, or transform operations based on provider capabilities.
|
|
30
|
+
*
|
|
31
|
+
* For example, SQLite can merge add-foreign-key operations into create-table operations.
|
|
32
|
+
*/
|
|
33
|
+
preprocessOperations(operations: MigrationOperation[]): MigrationOperation<TMeta>[];
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Execute a single migration operation.
|
|
37
|
+
*/
|
|
38
|
+
executeOperation(
|
|
39
|
+
operation: MigrationOperation<TMeta>,
|
|
40
|
+
mapper?: TableNameMapper,
|
|
41
|
+
): ExecuteNode | ExecuteNode[];
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Base migration executor with common functionality.
|
|
46
|
+
* Provider-specific executors should extend this class.
|
|
47
|
+
*/
|
|
48
|
+
export abstract class BaseMigrationExecutor<
|
|
49
|
+
TMeta extends MigrationOperationMetadata = MigrationOperationMetadata,
|
|
50
|
+
> implements MigrationExecutor<TMeta>
|
|
51
|
+
{
|
|
52
|
+
constructor(
|
|
53
|
+
protected readonly db: KyselyAny,
|
|
54
|
+
protected readonly provider: SQLProvider,
|
|
55
|
+
) {}
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Default implementation: no preprocessing, no metadata.
|
|
59
|
+
* Providers can override to transform operations.
|
|
60
|
+
*/
|
|
61
|
+
preprocessOperations(operations: MigrationOperation[]): MigrationOperation<TMeta>[] {
|
|
62
|
+
return operations as MigrationOperation<TMeta>[];
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Execute a single migration operation.
|
|
67
|
+
* Must be implemented by provider-specific executors.
|
|
68
|
+
*/
|
|
69
|
+
abstract executeOperation(
|
|
70
|
+
operation: MigrationOperation<TMeta>,
|
|
71
|
+
mapper?: TableNameMapper,
|
|
72
|
+
): ExecuteNode | ExecuteNode[];
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Get table name, applying namespace mapping if provided.
|
|
76
|
+
* Settings table is never namespaced.
|
|
77
|
+
*/
|
|
78
|
+
protected getTableName(tableName: string, mapper?: TableNameMapper): string {
|
|
79
|
+
return tableName === SETTINGS_TABLE_NAME
|
|
80
|
+
? tableName
|
|
81
|
+
: mapper
|
|
82
|
+
? mapper.toPhysical(tableName)
|
|
83
|
+
: tableName;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* Get column builder callback for creating/altering columns.
|
|
88
|
+
*/
|
|
89
|
+
protected getColumnBuilderCallback(col: ColumnInfo): ColumnBuilderCallback {
|
|
90
|
+
return (build) => {
|
|
91
|
+
if (!col.isNullable) {
|
|
92
|
+
build = build.notNull();
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
// Internal ID is the primary key with auto-increment
|
|
96
|
+
if (col.role === "internal-id") {
|
|
97
|
+
build = build.primaryKey();
|
|
98
|
+
// Auto-increment for internal ID
|
|
99
|
+
if (this.provider === "postgresql" || this.provider === "cockroachdb") {
|
|
100
|
+
// SERIAL/BIGSERIAL handles auto-increment
|
|
101
|
+
// Already handled in schemaToDBType
|
|
102
|
+
} else if (this.provider === "mysql") {
|
|
103
|
+
build = build.autoIncrement();
|
|
104
|
+
} else if (this.provider === "sqlite") {
|
|
105
|
+
build = build.autoIncrement();
|
|
106
|
+
} else if (this.provider === "mssql") {
|
|
107
|
+
build = build.identity();
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
// External ID must be unique
|
|
112
|
+
if (col.role === "external-id") {
|
|
113
|
+
build = build.unique();
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
const defaultValue = this.defaultValueToDB(col);
|
|
117
|
+
if (defaultValue) {
|
|
118
|
+
build = build.defaultTo(defaultValue);
|
|
119
|
+
}
|
|
120
|
+
return build;
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
/**
|
|
125
|
+
* Convert column default value to database representation.
|
|
126
|
+
*/
|
|
127
|
+
protected defaultValueToDB(column: ColumnInfo): RawBuilder<unknown> | undefined {
|
|
128
|
+
const value = column.default;
|
|
129
|
+
if (!value) {
|
|
130
|
+
return undefined;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
// MySQL doesn't support default values for TEXT columns
|
|
134
|
+
if (this.provider === "mysql" && column.type === "string") {
|
|
135
|
+
return undefined;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
// Static default values: defaultTo(value)
|
|
139
|
+
if ("value" in value && value.value !== undefined) {
|
|
140
|
+
return sql.lit(value.value);
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
// Database-level special functions: defaultTo(b => b.now())
|
|
144
|
+
if ("dbSpecial" in value && value.dbSpecial === "now") {
|
|
145
|
+
return sql`CURRENT_TIMESTAMP`;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
// Runtime defaults (defaultTo$) are NOT generated in SQL - they're handled in application code
|
|
149
|
+
if ("runtime" in value) {
|
|
150
|
+
return undefined;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
return undefined;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
/**
|
|
157
|
+
* Wrap a raw SQL builder in an ExecuteNode.
|
|
158
|
+
*/
|
|
159
|
+
protected rawToNode(raw: RawBuilder<unknown>): ExecuteNode {
|
|
160
|
+
return {
|
|
161
|
+
compile: () => raw.compile(this.db),
|
|
162
|
+
execute: () => raw.execute(this.db),
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
/**
|
|
167
|
+
* Get the database type string for a column.
|
|
168
|
+
*/
|
|
169
|
+
protected getDBType(col: ColumnInfo): string {
|
|
170
|
+
return schemaToDBType(col, this.provider);
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
// ============================================================================
|
|
175
|
+
// Provider-Specific Helper Functions
|
|
176
|
+
// ============================================================================
|
|
177
|
+
|
|
178
|
+
/**
|
|
179
|
+
* Returns the appropriate foreign key action based on the provider.
|
|
180
|
+
* MSSQL doesn't support RESTRICT, so we use NO ACTION (functionally equivalent).
|
|
181
|
+
*/
|
|
182
|
+
export function getForeignKeyAction(provider: SQLProvider): "restrict" | "no action" {
|
|
183
|
+
return provider === "mssql" ? "no action" : "restrict";
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
/**
|
|
187
|
+
* Generates MSSQL default constraint name following the DF_tableName_columnName pattern.
|
|
188
|
+
*/
|
|
189
|
+
export function getMssqlDefaultConstraintName(tableName: string, columnName: string): string {
|
|
190
|
+
const MSSQL_DEFAULT_CONSTRAINT_PREFIX = "DF" as const;
|
|
191
|
+
return `${MSSQL_DEFAULT_CONSTRAINT_PREFIX}_${tableName}_${columnName}`;
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
/**
|
|
195
|
+
* Generate SQL to drop MSSQL default constraint.
|
|
196
|
+
*/
|
|
197
|
+
export function mssqlDropDefaultConstraint(tableName: string, columnName: string) {
|
|
198
|
+
return sql`
|
|
199
|
+
DECLARE @ConstraintName NVARCHAR(200);
|
|
200
|
+
|
|
201
|
+
SELECT @ConstraintName = dc.name
|
|
202
|
+
FROM sys.default_constraints dc
|
|
203
|
+
JOIN sys.columns c ON dc.parent_object_id = c.object_id AND dc.parent_column_id = c.column_id
|
|
204
|
+
JOIN sys.tables t ON t.object_id = c.object_id
|
|
205
|
+
JOIN sys.schemas s ON t.schema_id = s.schema_id
|
|
206
|
+
WHERE s.name = 'dbo' AND t.name = ${sql.lit(tableName)} AND c.name = ${sql.lit(columnName)};
|
|
207
|
+
|
|
208
|
+
IF @ConstraintName IS NOT NULL
|
|
209
|
+
BEGIN
|
|
210
|
+
EXEC('ALTER TABLE [dbo].[' + ${sql.lit(tableName)} + '] DROP CONSTRAINT [' + @ConstraintName + ']');
|
|
211
|
+
END`;
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
/**
|
|
215
|
+
* Create a unique index with provider-specific handling.
|
|
216
|
+
*/
|
|
217
|
+
export function createUniqueIndex(
|
|
218
|
+
db: KyselyAny,
|
|
219
|
+
name: string,
|
|
220
|
+
tableName: string,
|
|
221
|
+
cols: string[],
|
|
222
|
+
provider: SQLProvider,
|
|
223
|
+
) {
|
|
224
|
+
const query = db.schema.createIndex(name).on(tableName).columns(cols).unique();
|
|
225
|
+
|
|
226
|
+
if (provider === "mssql") {
|
|
227
|
+
// MSSQL: ignore null values in unique indexes by default
|
|
228
|
+
return query.where((b) => {
|
|
229
|
+
return b.and(cols.map((col) => b(col, "is not", null)));
|
|
230
|
+
});
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
return query;
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
/**
|
|
237
|
+
* Drop a unique index with provider-specific handling.
|
|
238
|
+
*/
|
|
239
|
+
export function dropUniqueIndex(
|
|
240
|
+
db: KyselyAny,
|
|
241
|
+
name: string,
|
|
242
|
+
tableName: string,
|
|
243
|
+
provider: SQLProvider,
|
|
244
|
+
) {
|
|
245
|
+
let query = db.schema.dropIndex(name).ifExists();
|
|
246
|
+
|
|
247
|
+
if (provider === "cockroachdb") {
|
|
248
|
+
query = query.cascade();
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
if (provider === "mssql") {
|
|
252
|
+
query = query.on(tableName);
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
return query;
|
|
256
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { KyselyConfig } from "../kysely-adapter";
|
|
2
|
+
import type { MigrationExecutor } from "./execute-base";
|
|
3
|
+
import { SqliteMigrationExecutor } from "./execute-sqlite";
|
|
4
|
+
import { PostgresMigrationExecutor } from "./execute-postgres";
|
|
5
|
+
import { MysqlMigrationExecutor } from "./execute-mysql";
|
|
6
|
+
import { MssqlMigrationExecutor } from "./execute-mssql";
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Create a provider-specific migration executor.
|
|
10
|
+
*/
|
|
11
|
+
export function createMigrationExecutor(config: KyselyConfig): MigrationExecutor {
|
|
12
|
+
const { db, provider } = config;
|
|
13
|
+
|
|
14
|
+
switch (provider) {
|
|
15
|
+
case "sqlite":
|
|
16
|
+
return new SqliteMigrationExecutor(db, provider);
|
|
17
|
+
case "postgresql":
|
|
18
|
+
case "cockroachdb":
|
|
19
|
+
return new PostgresMigrationExecutor(db, provider);
|
|
20
|
+
case "mysql":
|
|
21
|
+
return new MysqlMigrationExecutor(db, provider);
|
|
22
|
+
case "mssql":
|
|
23
|
+
return new MssqlMigrationExecutor(db, provider);
|
|
24
|
+
default: {
|
|
25
|
+
// Ensure exhaustive switch
|
|
26
|
+
const _exhaustive: never = provider;
|
|
27
|
+
throw new Error(`Unsupported provider: ${_exhaustive}`);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
}
|