Skip to content

Commit 45e0623

Browse files
committed
feat: update compatibility with git-json-resolver v1.3.1 API
1 parent 123455c commit 45e0623

File tree

4 files changed

+52
-35
lines changed

4 files changed

+52
-35
lines changed

lib/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@
3838
"@vitest/coverage-v8": "^3.2.4",
3939
"compare-versions": "^6.1.1",
4040
"esbuild-plugin-rdi": "^0.0.0",
41-
"git-json-resolver": "^1.2.0",
41+
"git-json-resolver": "^1.3.1",
4242
"tsup": "^8.5.0",
4343
"typescript": "^5.9.2",
4444
"vite-tsconfig-paths": "^5.1.4",

lib/src/index.test.ts

Lines changed: 22 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
import { describe, it, expect, beforeEach } from "vitest";
22
import plugin, { semverMax, semverMin, semverOurs, semverTheirs } from "./index";
3-
import { StrategyStatus } from "git-json-resolver";
3+
import {
4+
StrategyStatus_OK,
5+
StrategyStatus_CONTINUE,
6+
StrategyStatus_FAIL,
7+
} from "git-json-resolver/utils";
48

59
const run = (fn: any, ours: any, theirs: any) => fn({ ours, theirs, base: undefined, path: [] });
610

@@ -20,109 +24,109 @@ describe("git-json-resolver-semver", () => {
2024
describe("semver-max", () => {
2125
it("picks higher when both valid", () => {
2226
const r = run(semverMax, "1.2.3", "1.3.0");
23-
expect(r.status).toBe(StrategyStatus.OK);
27+
expect(r.status).toBe(StrategyStatus_OK);
2428
expect(r.value).toBe("1.3.0");
2529
});
2630

2731
it("prefers valid when only one is valid", () => {
2832
const r = run(semverMax, "1.2.3", "banana");
29-
expect(r.status).toBe(StrategyStatus.OK);
33+
expect(r.status).toBe(StrategyStatus_OK);
3034
expect(r.value).toBe("1.2.3");
3135
});
3236

3337
it("respects fallback=continue when both invalid", async () => {
3438
await reset({ preferValid: false, fallback: "continue" });
3539
const r = run(semverMax, "foo", "bar");
36-
expect(r.status).toBe(StrategyStatus.CONTINUE);
40+
expect(r.status).toBe(StrategyStatus_CONTINUE);
3741
});
3842

3943
it("respects fallback=ours/theirs/error", async () => {
4044
await reset({ preferValid: false, fallback: "ours" });
4145
let r = run(semverMax, "foo", "bar");
42-
expect(r.status).toBe(StrategyStatus.OK);
46+
expect(r.status).toBe(StrategyStatus_OK);
4347
expect(r.value).toBe("foo");
4448

4549
await reset({ preferValid: false, fallback: "theirs" });
4650
r = run(semverMax, "foo", "bar");
47-
expect(r.status).toBe(StrategyStatus.OK);
51+
expect(r.status).toBe(StrategyStatus_OK);
4852
expect(r.value).toBe("bar");
4953

5054
await reset({ preferValid: false, fallback: "error" });
5155
r = run(semverMax, "foo", "bar");
52-
expect(r.status).toBe(StrategyStatus.FAIL);
56+
expect(r.status).toBe(StrategyStatus_FAIL);
5357
});
5458

5559
it("strict=false allows prereleases/ranges", async () => {
5660
await reset({ strict: false });
5761
const r1 = run(semverMax, "1.2.3", "1.2.3-beta.1");
58-
expect(r1.status).toBe(StrategyStatus.OK);
62+
expect(r1.status).toBe(StrategyStatus_OK);
5963
expect(r1.value).toBe("1.2.3"); // release > prerelease
6064

6165
const r2 = run(semverMax, "^1.2.3", "1.3.0");
6266
// validate("^1.2.3") is true in non-strict; compareVersions("^1.2.3", "1.3.0")
6367
// is not meaningful, so preferValid should push to 1.3.0 only when one side valid.
6468
// Here both are considered valid, so we trust compareVersions result.
65-
expect([StrategyStatus.OK, StrategyStatus.CONTINUE]).toContain(r2.status);
69+
expect([StrategyStatus_OK, StrategyStatus_CONTINUE]).toContain(r2.status);
6670
});
6771

6872
it("strict=true rejects prereleases", async () => {
6973
await reset({ strict: true });
7074
const r = run(semverMax, "1.2.3-beta.1", "1.2.3");
71-
expect(r.status).toBe(StrategyStatus.OK);
75+
expect(r.status).toBe(StrategyStatus_OK);
7276
expect(r.value).toBe("1.2.3"); // only ours invalid → pick valid theirs via preferValid
7377
});
7478
});
7579

7680
describe("semver-min", () => {
7781
it("picks lower when both valid", () => {
7882
const r = run(semverMin, "2.0.0", "2.1.0");
79-
expect(r.status).toBe(StrategyStatus.OK);
83+
expect(r.status).toBe(StrategyStatus_OK);
8084
expect(r.value).toBe("2.0.0");
8185
});
8286

8387
it("prefers valid when only one is valid", () => {
8488
const r = run(semverMin, "banana", "2.1.0");
85-
expect(r.status).toBe(StrategyStatus.OK);
89+
expect(r.status).toBe(StrategyStatus_OK);
8690
expect(r.value).toBe("2.1.0");
8791
});
8892

8993
it("strict=false handles prerelease ordering", async () => {
9094
await reset({ strict: false });
9195
const r = run(semverMin, "1.2.3", "1.2.3-beta.1");
92-
expect(r.status).toBe(StrategyStatus.OK);
96+
expect(r.status).toBe(StrategyStatus_OK);
9397
expect(r.value).toBe("1.2.3-beta.1"); // prerelease < release
9498
});
9599
});
96100

97101
describe("semver-ours / semver-theirs", () => {
98102
it("semver-ours returns ours when ours is valid", () => {
99103
const r = run(semverOurs, "1.0.0", "2.0.0");
100-
expect(r.status).toBe(StrategyStatus.OK);
104+
expect(r.status).toBe(StrategyStatus_OK);
101105
expect(r.value).toBe("1.0.0");
102106
});
103107

104108
it("semver-ours falls back to valid theirs when ours invalid", () => {
105109
const r = run(semverOurs, "banana", "1.0.1");
106-
expect(r.status).toBe(StrategyStatus.OK);
110+
expect(r.status).toBe(StrategyStatus_OK);
107111
expect(r.value).toBe("1.0.1");
108112
});
109113

110114
it("semver-theirs returns theirs when theirs is valid", () => {
111115
const r = run(semverTheirs, "1.2.3", "2.0.0");
112-
expect(r.status).toBe(StrategyStatus.OK);
116+
expect(r.status).toBe(StrategyStatus_OK);
113117
expect(r.value).toBe("2.0.0");
114118
});
115119

116120
it("semver-theirs falls back to valid ours when theirs invalid", () => {
117121
const r = run(semverTheirs, "1.2.3", "carrot");
118-
expect(r.status).toBe(StrategyStatus.OK);
122+
expect(r.status).toBe(StrategyStatus_OK);
119123
expect(r.value).toBe("1.2.3");
120124
});
121125

122126
it("falls back per config when neither valid", async () => {
123127
await reset({ preferValid: false, fallback: "theirs" });
124128
const r = run(semverOurs, "foo", "bar");
125-
expect(r.status).toBe(StrategyStatus.OK);
129+
expect(r.status).toBe(StrategyStatus_OK);
126130
expect(r.value).toBe("bar");
127131
});
128132
});

lib/src/index.ts

Lines changed: 28 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
1-
import { StrategyFn, StrategyPlugin, StrategyStatus } from "git-json-resolver";
1+
import { StrategyFn, StrategyPlugin } from "git-json-resolver";
22
import { compareVersions, validate } from "compare-versions";
3+
import {
4+
StrategyStatus_OK,
5+
StrategyStatus_CONTINUE,
6+
StrategyStatus_FAIL,
7+
} from "git-json-resolver/utils";
38

49
/**
510
* Semver-aware strategies for `git-json-resolver`.
@@ -29,6 +34,14 @@ declare module "git-json-resolver" {
2934
"semver-ours": string;
3035
"semver-theirs": string;
3136
}
37+
38+
interface PluginConfig {
39+
"git-json-resolver-semver": SemverPluginConfig;
40+
"json-merge-semver": SemverPluginConfig;
41+
"git-semver-resolver": SemverPluginConfig;
42+
"semver-merge-driver": SemverPluginConfig;
43+
"semver-conflict-resolver": SemverPluginConfig;
44+
}
3245
}
3346

3447
interface SemverPluginConfig {
@@ -65,11 +78,11 @@ const isValidSemver = (val: unknown): val is string => {
6578
export const semverMax: StrategyFn = ({ ours, theirs }) => {
6679
if (isValidSemver(ours) && isValidSemver(theirs)) {
6780
const winner = compareVersions(ours, theirs) >= 0 ? ours : theirs;
68-
return { status: StrategyStatus.OK, value: winner };
81+
return { status: StrategyStatus_OK, value: winner };
6982
}
7083
if (pluginConfig.preferValid) {
71-
if (isValidSemver(ours)) return { status: StrategyStatus.OK, value: ours };
72-
if (isValidSemver(theirs)) return { status: StrategyStatus.OK, value: theirs };
84+
if (isValidSemver(ours)) return { status: StrategyStatus_OK, value: ours };
85+
if (isValidSemver(theirs)) return { status: StrategyStatus_OK, value: theirs };
7386
}
7487
return handleFallback({ ours, theirs });
7588
};
@@ -80,11 +93,11 @@ export const semverMax: StrategyFn = ({ ours, theirs }) => {
8093
export const semverMin: StrategyFn = ({ ours, theirs }) => {
8194
if (isValidSemver(ours) && isValidSemver(theirs)) {
8295
const winner = compareVersions(ours, theirs) <= 0 ? ours : theirs;
83-
return { status: StrategyStatus.OK, value: winner };
96+
return { status: StrategyStatus_OK, value: winner };
8497
}
8598
if (pluginConfig.preferValid) {
86-
if (isValidSemver(ours)) return { status: StrategyStatus.OK, value: ours };
87-
if (isValidSemver(theirs)) return { status: StrategyStatus.OK, value: theirs };
99+
if (isValidSemver(ours)) return { status: StrategyStatus_OK, value: ours };
100+
if (isValidSemver(theirs)) return { status: StrategyStatus_OK, value: theirs };
88101
}
89102
return handleFallback({ ours, theirs });
90103
};
@@ -93,9 +106,9 @@ export const semverMin: StrategyFn = ({ ours, theirs }) => {
93106
* Always prefer ours if valid semver, else apply preferValid/fallback rules.
94107
*/
95108
export const semverOurs: StrategyFn = ({ ours, theirs }) => {
96-
if (isValidSemver(ours)) return { status: StrategyStatus.OK, value: ours };
109+
if (isValidSemver(ours)) return { status: StrategyStatus_OK, value: ours };
97110
if (pluginConfig.preferValid && isValidSemver(theirs)) {
98-
return { status: StrategyStatus.OK, value: theirs };
111+
return { status: StrategyStatus_OK, value: theirs };
99112
}
100113
return handleFallback({ ours, theirs });
101114
};
@@ -104,9 +117,9 @@ export const semverOurs: StrategyFn = ({ ours, theirs }) => {
104117
* Always prefer theirs if valid semver, else apply preferValid/fallback rules.
105118
*/
106119
export const semverTheirs: StrategyFn = ({ ours, theirs }) => {
107-
if (isValidSemver(theirs)) return { status: StrategyStatus.OK, value: theirs };
120+
if (isValidSemver(theirs)) return { status: StrategyStatus_OK, value: theirs };
108121
if (pluginConfig.preferValid && isValidSemver(ours)) {
109-
return { status: StrategyStatus.OK, value: ours };
122+
return { status: StrategyStatus_OK, value: ours };
110123
}
111124
return handleFallback({ ours, theirs });
112125
};
@@ -123,14 +136,14 @@ const handleFallback = ({
123136
}): ReturnType<StrategyFn> => {
124137
switch (pluginConfig.fallback) {
125138
case "ours":
126-
return { status: StrategyStatus.OK, value: ours };
139+
return { status: StrategyStatus_OK, value: ours };
127140
case "theirs":
128-
return { status: StrategyStatus.OK, value: theirs };
141+
return { status: StrategyStatus_OK, value: theirs };
129142
case "error":
130-
return { status: StrategyStatus.FAIL, reason: "No valid semver found" };
143+
return { status: StrategyStatus_FAIL, reason: "No valid semver found" };
131144
case "continue":
132145
default:
133-
return { status: StrategyStatus.CONTINUE };
146+
return { status: StrategyStatus_CONTINUE };
134147
}
135148
};
136149

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
"pre-commit": "^1.2.2",
2626
"prettier": "^3.6.2",
2727
"turbo": "^2.5.6",
28-
"turborepo-template-upgrade": "^0.5.1",
28+
"turborepo-template-upgrade": "^0.5.2",
2929
"typedoc": "^0.28.12",
3030
"typedoc-plugin-markdown": "^4.8.1",
3131
"typedoc-plugin-mdn-links": "^5.0.9",

0 commit comments

Comments
 (0)