UNPKG

everything-dev

Version:

A consolidated product package for building Module Federation apps with oRPC APIs.

96 lines (94 loc) • 3.51 kB
import { diagnosePlugin } from "./db-doctor.mjs"; import { existsSync } from "node:fs"; import { join } from "node:path"; import { Effect } from "effect"; //#region src/cli/db-repair.ts async function repairPlugin(binding, mode, drizzleKit) { const diagnosis = await diagnosePlugin(binding); if (diagnosis.diagnosis === "error") return { status: "refused", diagnosis, message: `Cannot repair — diagnosis failed: ${diagnosis.error}` }; if (mode === "recreate") return { status: "refused", diagnosis, message: "Recreate mode is not supported without per-plugin database schemas. Use --mode history-reset instead." }; if (diagnosis.diagnosis !== "drift-safe-repair") { if (diagnosis.diagnosis === "healthy") return { status: "refused", diagnosis, message: "Database is healthy — no repair needed." }; if (diagnosis.diagnosis === "no-local-migrations") return { status: "refused", diagnosis, message: "No local migrations found for this plugin." }; if (diagnosis.diagnosis === "drift-manual") return { status: "refused", diagnosis, message: `Partial drift detected (${diagnosis.missingTables.length}/${diagnosis.expectedTables.length} tables missing). Manual intervention required — some tables exist but schema is incomplete.` }; if (diagnosis.diagnosis === "unapplied") return { status: "refused", diagnosis, message: "Migrations have not been applied yet. Start the dev server to apply them." }; if (diagnosis.diagnosis === "untracked-existing-schema") return { status: "refused", diagnosis, message: "Tables exist but no matching migration history was found. Run `drizzle-kit pull --init` in the plugin workspace to adopt the existing schema, then run migrations from that baseline." }; return { status: "refused", diagnosis, message: `Cannot repair — diagnosis: ${diagnosis.diagnosis}` }; } const { Pool } = await import("pg"); const journalRef = `"${diagnosis.journalSchema}"."${diagnosis.journalTable}"`; const pool = new Pool({ connectionString: binding.url, ssl: binding.url.includes("localhost") || binding.url.includes("127.0.0.1") ? false : { rejectUnauthorized: false }, max: 1, connectionTimeoutMillis: 1e4 }); try { await pool.query(`DROP TABLE IF EXISTS ${journalRef}`); if (binding.identity.workspaceDir) { const configPath = join(binding.identity.workspaceDir, "drizzle.config.ts"); if (existsSync(configPath)) try { await Effect.runPromise(drizzleKit.migrate(binding)); return { status: "repaired", diagnosis, message: `Migration history reset for ${diagnosis.plugin}. Migrations reapplied via drizzle-kit. Restart the dev server to confirm.` }; } catch (error) { return { status: "repaired", diagnosis, message: `Migration history reset for ${diagnosis.plugin}. Automatic reapply failed: ${error instanceof Error ? error.message : String(error)}. Run \`pnpm --dir ${binding.identity.workspaceDir} run db:migrate\` manually.` }; } } } catch (error) { return { status: "error", diagnosis, message: `Repair failed: ${error instanceof Error ? error.message : String(error)}` }; } finally { await pool.end().catch(() => {}); } return { status: "repaired", diagnosis, message: `Migration history reset for ${diagnosis.plugin}. No local drizzle.config.ts found — start the dev server to reapply migrations.` }; } //#endregion export { repairPlugin }; //# sourceMappingURL=db-repair.mjs.map