Skip to content

Commit 187dcbe

Browse files
committed
Add CLI restore command to restore backup files
1 parent e046393 commit 187dcbe

File tree

3 files changed

+35
-3
lines changed

3 files changed

+35
-3
lines changed

.changeset/restore-command.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"git-json-resolver": minor
3+
---
4+
5+
Add CLI restore command to restore backup files

lib/src/cli.test.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,9 @@ vi.mock("node:child_process");
99
vi.mock("./index", () => ({
1010
resolveConflicts: vi.fn(),
1111
}));
12+
vi.mock("./utils", () => ({
13+
restoreBackups: vi.fn(),
14+
}));
1215
vi.mock("./normalizer", () => ({
1316
DEFAULT_CONFIG: { defaultStrategy: "merge" },
1417
}));
@@ -70,6 +73,16 @@ describe("cli helpers", () => {
7073
expect(result.init).toBe(true);
7174
});
7275

76+
it("sets restore with undefined", () => {
77+
const result = (cli as any).parseArgs(["node", "cli", "--restore"]);
78+
expect(result.restore).toBe(undefined);
79+
});
80+
81+
it("sets restore with custom directory", () => {
82+
const result = (cli as any).parseArgs(["node", "cli", "--restore", "custom-backup"]);
83+
expect(result.restore).toBe("custom-backup");
84+
});
85+
7386
it("warns on unknown option", () => {
7487
const warn = vi.spyOn(console, "warn").mockImplementation(() => {});
7588
(cli as any).parseArgs(["node", "cli", "--unknown"]);

lib/src/cli.ts

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import { pathToFileURL } from "node:url";
66
import { resolveConflicts } from "./index";
77
import type { Config } from "./types";
88
import { DEFAULT_CONFIG } from "./normalizer";
9+
import { restoreBackups } from "./utils";
910

1011
const CONFIG_FILENAME = "git-json-resolver.config.js";
1112

@@ -63,9 +64,12 @@ module.exports = ${JSON.stringify(DEFAULT_CONFIG, null, 2)};
6364
/**
6465
* CLI argument parser (minimal, no external deps).
6566
*/
66-
export const parseArgs = (argv: string[]): { overrides: Partial<Config>; init?: boolean } => {
67+
export const parseArgs = (
68+
argv: string[],
69+
): { overrides: Partial<Config>; init?: boolean; restore?: string } => {
6770
const overrides: Partial<Config> = {};
6871
let init = false;
72+
let restore: string | undefined;
6973

7074
for (let i = 2; i < argv.length; i++) {
7175
const arg = argv[i];
@@ -93,18 +97,22 @@ export const parseArgs = (argv: string[]): { overrides: Partial<Config>; init?:
9397
case "--init":
9498
init = true;
9599
break;
100+
case "--restore":
101+
restore = next;
102+
i++;
103+
break;
96104
default:
97105
if (arg.startsWith("--")) {
98106
console.warn(`[git-json-resolver] Unknown option: ${arg}`);
99107
}
100108
}
101109
}
102-
return { overrides, init };
110+
return { overrides, init, restore };
103111
};
104112

105113
(async () => {
106114
try {
107-
const { overrides, init } = parseArgs(process.argv);
115+
const { overrides, init, restore } = parseArgs(process.argv);
108116

109117
if (init) {
110118
initConfig(process.cwd());
@@ -117,6 +125,12 @@ export const parseArgs = (argv: string[]): { overrides: Partial<Config>; init?:
117125
...overrides,
118126
};
119127

128+
if (restore) {
129+
await restoreBackups(restore || fileConfig.backupDir || ".merge-backups");
130+
console.log(`[git-json-resolver] Restored backups from ${restore}`);
131+
process.exit(0);
132+
}
133+
120134
await resolveConflicts(finalConfig);
121135
} catch (err) {
122136
console.error("[git-json-resolver] Failed:", err);

0 commit comments

Comments
 (0)