everything-dev
Version:
A consolidated product package for building Module Federation apps with oRPC APIs.
115 lines (113 loc) • 4.01 kB
JavaScript
const require_runtime = require('../_virtual/_rolldown/runtime.cjs');
const require_db_doctor = require('./db-doctor.cjs');
let node_fs = require("node:fs");
let node_path = require("node:path");
let node_child_process = require("node:child_process");
//#region src/cli/db-repair.ts
async function repairPlugin(info, mode) {
const diagnosis = await require_db_doctor.diagnosePlugin(info);
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 schemas. Use --mode history-reset instead."
};
if (diagnosis.diagnosis !== "drift-safe-repair" && diagnosis.diagnosis !== "legacy-importable") {
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."
};
return {
status: "refused",
diagnosis,
message: `Cannot repair — diagnosis: ${diagnosis.diagnosis}`
};
}
const { Pool } = await Promise.resolve().then(() => require("../node_modules/pg/esm/index.cjs"));
const journalRef = `"${diagnosis.journalSchema}"."${diagnosis.journalTable}"`;
const pool = new Pool({
connectionString: info.databaseUrl,
ssl: info.databaseUrl.includes("localhost") || info.databaseUrl.includes("127.0.0.1") ? false : { rejectUnauthorized: false },
max: 1,
connectionTimeoutMillis: 1e4
});
try {
await pool.query(`DROP TABLE IF EXISTS ${journalRef}`);
} catch (error) {
return {
status: "error",
diagnosis,
message: `Failed to reset journal: ${error instanceof Error ? error.message : String(error)}`
};
} finally {
await pool.end().catch(() => {});
}
if (info.workspaceDir) {
const configPath = (0, node_path.join)(info.workspaceDir, "drizzle.config.ts");
if ((0, node_fs.existsSync)(configPath)) try {
await spawnDrizzleMigrate(info.workspaceDir, configPath);
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 \`bun run --cwd ${info.workspaceDir} db:migrate\` manually.`
};
}
}
return {
status: "repaired",
diagnosis,
message: `Migration history reset for ${diagnosis.plugin}. No local drizzle.config.ts found — start the dev server to reapply migrations.`
};
}
function spawnDrizzleMigrate(cwd, configPath) {
return new Promise((resolvePromise, reject) => {
const child = (0, node_child_process.spawn)("npx", [
"drizzle-kit",
"migrate",
"--config",
configPath
], {
cwd,
stdio: "pipe",
shell: true
});
let stderr = "";
child.stderr?.on("data", (data) => {
stderr += data.toString();
});
child.on("error", (err) => reject(err));
child.on("exit", (code) => {
if (code === 0) resolvePromise();
else reject(/* @__PURE__ */ new Error(`drizzle-kit migrate exited with code ${code}: ${stderr}`));
});
});
}
//#endregion
exports.repairPlugin = repairPlugin;
//# sourceMappingURL=db-repair.cjs.map