@gitwand/core 2.3.0 → 2.5.0
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/dist/__tests__/corpus.d.ts.map +1 -1
- package/dist/__tests__/corpus.js +377 -0
- package/dist/__tests__/corpus.js.map +1 -1
- package/dist/__tests__/patterns/complex.test.d.ts +9 -0
- package/dist/__tests__/patterns/complex.test.d.ts.map +1 -0
- package/dist/__tests__/patterns/complex.test.js +198 -0
- package/dist/__tests__/patterns/complex.test.js.map +1 -0
- package/dist/__tests__/patterns/delete-no-change.test.d.ts +11 -0
- package/dist/__tests__/patterns/delete-no-change.test.d.ts.map +1 -0
- package/dist/__tests__/patterns/delete-no-change.test.js +178 -0
- package/dist/__tests__/patterns/delete-no-change.test.js.map +1 -0
- package/dist/__tests__/patterns/llm-proposed.test.d.ts +10 -0
- package/dist/__tests__/patterns/llm-proposed.test.d.ts.map +1 -0
- package/dist/__tests__/patterns/llm-proposed.test.js +306 -0
- package/dist/__tests__/patterns/llm-proposed.test.js.map +1 -0
- package/dist/__tests__/patterns/non-overlapping.test.d.ts +11 -0
- package/dist/__tests__/patterns/non-overlapping.test.d.ts.map +1 -0
- package/dist/__tests__/patterns/non-overlapping.test.js +240 -0
- package/dist/__tests__/patterns/non-overlapping.test.js.map +1 -0
- package/dist/__tests__/patterns/one-side-change.test.d.ts +10 -0
- package/dist/__tests__/patterns/one-side-change.test.d.ts.map +1 -0
- package/dist/__tests__/patterns/one-side-change.test.js +191 -0
- package/dist/__tests__/patterns/one-side-change.test.js.map +1 -0
- package/dist/__tests__/patterns/same-change.test.d.ts +9 -0
- package/dist/__tests__/patterns/same-change.test.d.ts.map +1 -0
- package/dist/__tests__/patterns/same-change.test.js +173 -0
- package/dist/__tests__/patterns/same-change.test.js.map +1 -0
- package/dist/__tests__/patterns/value-only-change.test.d.ts +11 -0
- package/dist/__tests__/patterns/value-only-change.test.d.ts.map +1 -0
- package/dist/__tests__/patterns/value-only-change.test.js +159 -0
- package/dist/__tests__/patterns/value-only-change.test.js.map +1 -0
- package/dist/__tests__/patterns/whitespace-only.test.d.ts +10 -0
- package/dist/__tests__/patterns/whitespace-only.test.d.ts.map +1 -0
- package/dist/__tests__/patterns/whitespace-only.test.js +177 -0
- package/dist/__tests__/patterns/whitespace-only.test.js.map +1 -0
- package/dist/__tests__/resolvers/css.test.d.ts +12 -0
- package/dist/__tests__/resolvers/css.test.d.ts.map +1 -0
- package/dist/__tests__/resolvers/css.test.js +171 -0
- package/dist/__tests__/resolvers/css.test.js.map +1 -0
- package/dist/__tests__/resolvers/imports.test.d.ts +12 -0
- package/dist/__tests__/resolvers/imports.test.d.ts.map +1 -0
- package/dist/__tests__/resolvers/imports.test.js +135 -0
- package/dist/__tests__/resolvers/imports.test.js.map +1 -0
- package/dist/__tests__/resolvers/json.test.d.ts +12 -0
- package/dist/__tests__/resolvers/json.test.d.ts.map +1 -0
- package/dist/__tests__/resolvers/json.test.js +184 -0
- package/dist/__tests__/resolvers/json.test.js.map +1 -0
- package/dist/__tests__/resolvers/lockfile-npm.test.d.ts +12 -0
- package/dist/__tests__/resolvers/lockfile-npm.test.d.ts.map +1 -0
- package/dist/__tests__/resolvers/lockfile-npm.test.js +187 -0
- package/dist/__tests__/resolvers/lockfile-npm.test.js.map +1 -0
- package/dist/__tests__/resolvers/lockfile-pnpm.test.d.ts +12 -0
- package/dist/__tests__/resolvers/lockfile-pnpm.test.d.ts.map +1 -0
- package/dist/__tests__/resolvers/lockfile-pnpm.test.js +175 -0
- package/dist/__tests__/resolvers/lockfile-pnpm.test.js.map +1 -0
- package/dist/__tests__/resolvers/lockfile-yarn.test.d.ts +12 -0
- package/dist/__tests__/resolvers/lockfile-yarn.test.d.ts.map +1 -0
- package/dist/__tests__/resolvers/lockfile-yarn.test.js +165 -0
- package/dist/__tests__/resolvers/lockfile-yarn.test.js.map +1 -0
- package/dist/__tests__/resolvers/markdown.test.d.ts +12 -0
- package/dist/__tests__/resolvers/markdown.test.d.ts.map +1 -0
- package/dist/__tests__/resolvers/markdown.test.js +188 -0
- package/dist/__tests__/resolvers/markdown.test.js.map +1 -0
- package/dist/__tests__/resolvers/vue.test.d.ts +12 -0
- package/dist/__tests__/resolvers/vue.test.d.ts.map +1 -0
- package/dist/__tests__/resolvers/vue.test.js +225 -0
- package/dist/__tests__/resolvers/vue.test.js.map +1 -0
- package/dist/__tests__/resolvers/yaml.test.d.ts +12 -0
- package/dist/__tests__/resolvers/yaml.test.d.ts.map +1 -0
- package/dist/__tests__/resolvers/yaml.test.js +203 -0
- package/dist/__tests__/resolvers/yaml.test.js.map +1 -0
- package/dist/__tests__/v2-core-scenarios.test.d.ts +35 -0
- package/dist/__tests__/v2-core-scenarios.test.d.ts.map +1 -0
- package/dist/__tests__/v2-core-scenarios.test.js +692 -0
- package/dist/__tests__/v2-core-scenarios.test.js.map +1 -0
- package/dist/__tests__/validation-parse-tree.test.d.ts +15 -0
- package/dist/__tests__/validation-parse-tree.test.d.ts.map +1 -0
- package/dist/__tests__/validation-parse-tree.test.js +243 -0
- package/dist/__tests__/validation-parse-tree.test.js.map +1 -0
- package/dist/classifier.d.ts.map +1 -1
- package/dist/classifier.js +3 -0
- package/dist/classifier.js.map +1 -1
- package/dist/config.d.ts +54 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +42 -0
- package/dist/config.js.map +1 -1
- package/dist/diff/index.d.ts.map +1 -1
- package/dist/diff/index.js +1 -3
- package/dist/diff/index.js.map +1 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/patterns/llm-proposed.d.ts +8 -0
- package/dist/patterns/llm-proposed.d.ts.map +1 -0
- package/dist/patterns/llm-proposed.js +66 -0
- package/dist/patterns/llm-proposed.js.map +1 -0
- package/dist/patterns/utils.d.ts +8 -7
- package/dist/patterns/utils.d.ts.map +1 -1
- package/dist/patterns/utils.js +13 -12
- package/dist/patterns/utils.js.map +1 -1
- package/dist/resolver/adapters/strict-node.d.ts +32 -0
- package/dist/resolver/adapters/strict-node.d.ts.map +1 -0
- package/dist/resolver/adapters/strict-node.js +117 -0
- package/dist/resolver/adapters/strict-node.js.map +1 -0
- package/dist/resolver/index.d.ts +20 -1
- package/dist/resolver/index.d.ts.map +1 -1
- package/dist/resolver/index.js +106 -5
- package/dist/resolver/index.js.map +1 -1
- package/dist/resolver/llm-pipeline.d.ts +33 -0
- package/dist/resolver/llm-pipeline.d.ts.map +1 -0
- package/dist/resolver/llm-pipeline.js +218 -0
- package/dist/resolver/llm-pipeline.js.map +1 -0
- package/dist/resolver/policy.d.ts.map +1 -1
- package/dist/resolver/policy.js +5 -0
- package/dist/resolver/policy.js.map +1 -1
- package/dist/resolver/validate-parse-tree.d.ts +52 -0
- package/dist/resolver/validate-parse-tree.d.ts.map +1 -0
- package/dist/resolver/validate-parse-tree.js +87 -0
- package/dist/resolver/validate-parse-tree.js.map +1 -0
- package/dist/resolver/validate-strict.d.ts +27 -0
- package/dist/resolver/validate-strict.d.ts.map +1 -0
- package/dist/resolver/validate-strict.js +41 -0
- package/dist/resolver/validate-strict.js.map +1 -0
- package/dist/resolver/validation.d.ts.map +1 -1
- package/dist/resolver/validation.js +15 -1
- package/dist/resolver/validation.js.map +1 -1
- package/dist/resolvers/dispatcher.d.ts.map +1 -1
- package/dist/resolvers/dispatcher.js.map +1 -1
- package/dist/resolvers/llm-fallback.d.ts +41 -0
- package/dist/resolvers/llm-fallback.d.ts.map +1 -0
- package/dist/resolvers/llm-fallback.js +231 -0
- package/dist/resolvers/llm-fallback.js.map +1 -0
- package/dist/types.d.ts +183 -4
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests du pattern whitespace_only (priority 50)
|
|
3
|
+
*
|
|
4
|
+
* Compatible diff2 et diff3.
|
|
5
|
+
* Détection : après normalisation (trim de chaque ligne), ours et theirs
|
|
6
|
+
* sont identiques — même code mais indentation ou espacement différent.
|
|
7
|
+
* Auto-résolu (prend ours ou theirs selon la politique).
|
|
8
|
+
*/
|
|
9
|
+
import { describe, it, expect } from "vitest";
|
|
10
|
+
import { resolve } from "../../resolver.js";
|
|
11
|
+
// ─── Cas qui doivent matcher whitespace_only ─────────────────
|
|
12
|
+
describe("whitespace_only : indentation différente (diff2)", () => {
|
|
13
|
+
const input = [
|
|
14
|
+
`<<<<<<< ours`,
|
|
15
|
+
` const x = 42;`,
|
|
16
|
+
` return x;`,
|
|
17
|
+
`=======`,
|
|
18
|
+
` const x = 42;`,
|
|
19
|
+
` return x;`,
|
|
20
|
+
`>>>>>>> theirs`,
|
|
21
|
+
].join("\n");
|
|
22
|
+
it("classifie en whitespace_only", () => {
|
|
23
|
+
const result = resolve(input, "src/utils.ts");
|
|
24
|
+
expect(result.hunks[0].type).toBe("whitespace_only");
|
|
25
|
+
});
|
|
26
|
+
it("auto-résout (autoResolved === 1)", () => {
|
|
27
|
+
const result = resolve(input, "src/utils.ts");
|
|
28
|
+
expect(result.stats.autoResolved).toBe(1);
|
|
29
|
+
});
|
|
30
|
+
});
|
|
31
|
+
describe("whitespace_only : tabs vs spaces (diff2)", () => {
|
|
32
|
+
const input = [
|
|
33
|
+
`<<<<<<< ours`,
|
|
34
|
+
`\tfunction hello() {`,
|
|
35
|
+
`\t\treturn "world";`,
|
|
36
|
+
`\t}`,
|
|
37
|
+
`=======`,
|
|
38
|
+
`function hello() {`,
|
|
39
|
+
` return "world";`,
|
|
40
|
+
`}`,
|
|
41
|
+
`>>>>>>> theirs`,
|
|
42
|
+
].join("\n");
|
|
43
|
+
it("classifie en whitespace_only", () => {
|
|
44
|
+
const result = resolve(input, "src/hello.ts");
|
|
45
|
+
expect(result.hunks[0].type).toBe("whitespace_only");
|
|
46
|
+
});
|
|
47
|
+
it("auto-résout", () => {
|
|
48
|
+
const result = resolve(input, "src/hello.ts");
|
|
49
|
+
expect(result.stats.autoResolved).toBe(1);
|
|
50
|
+
});
|
|
51
|
+
});
|
|
52
|
+
describe("whitespace_only : espaces de fin de ligne (diff2)", () => {
|
|
53
|
+
const input = [
|
|
54
|
+
`<<<<<<< ours`,
|
|
55
|
+
`const a = 1; `,
|
|
56
|
+
`const b = 2;`,
|
|
57
|
+
`=======`,
|
|
58
|
+
`const a = 1;`,
|
|
59
|
+
`const b = 2; `,
|
|
60
|
+
`>>>>>>> theirs`,
|
|
61
|
+
].join("\n");
|
|
62
|
+
it("classifie en whitespace_only", () => {
|
|
63
|
+
const result = resolve(input, "src/vars.ts");
|
|
64
|
+
expect(result.hunks[0].type).toBe("whitespace_only");
|
|
65
|
+
});
|
|
66
|
+
it("auto-résout", () => {
|
|
67
|
+
const result = resolve(input, "src/vars.ts");
|
|
68
|
+
expect(result.stats.autoResolved).toBe(1);
|
|
69
|
+
});
|
|
70
|
+
});
|
|
71
|
+
describe("whitespace_only : indentation modifiée avec base (diff3)", () => {
|
|
72
|
+
const input = [
|
|
73
|
+
`<<<<<<< ours`,
|
|
74
|
+
` if (condition) {`,
|
|
75
|
+
` doSomething();`,
|
|
76
|
+
` }`,
|
|
77
|
+
`||||||| base`,
|
|
78
|
+
` if (condition) {`,
|
|
79
|
+
` doSomething();`,
|
|
80
|
+
` }`,
|
|
81
|
+
`=======`,
|
|
82
|
+
` if (condition) {`,
|
|
83
|
+
` doSomething();`,
|
|
84
|
+
` }`,
|
|
85
|
+
`>>>>>>> theirs`,
|
|
86
|
+
].join("\n");
|
|
87
|
+
it("classifie en whitespace_only", () => {
|
|
88
|
+
const result = resolve(input, "src/logic.ts");
|
|
89
|
+
expect(result.hunks[0].type).toBe("whitespace_only");
|
|
90
|
+
});
|
|
91
|
+
it("auto-résout", () => {
|
|
92
|
+
const result = resolve(input, "src/logic.ts");
|
|
93
|
+
expect(result.stats.autoResolved).toBe(1);
|
|
94
|
+
});
|
|
95
|
+
});
|
|
96
|
+
describe("whitespace_only : reformatage JSON (diff2)", () => {
|
|
97
|
+
const input = [
|
|
98
|
+
`<<<<<<< ours`,
|
|
99
|
+
` "name": "gitwand",`,
|
|
100
|
+
` "version": "1.0.0"`,
|
|
101
|
+
`=======`,
|
|
102
|
+
` "name": "gitwand",`,
|
|
103
|
+
` "version": "1.0.0"`,
|
|
104
|
+
`>>>>>>> theirs`,
|
|
105
|
+
].join("\n");
|
|
106
|
+
it("classifie en whitespace_only", () => {
|
|
107
|
+
const result = resolve(input, "package.json");
|
|
108
|
+
expect(result.hunks[0].type).toBe("whitespace_only");
|
|
109
|
+
});
|
|
110
|
+
it("auto-résout", () => {
|
|
111
|
+
const result = resolve(input, "package.json");
|
|
112
|
+
expect(result.stats.autoResolved).toBe(1);
|
|
113
|
+
});
|
|
114
|
+
});
|
|
115
|
+
// ─── Cas qui ne doivent PAS matcher whitespace_only ──────────
|
|
116
|
+
describe("whitespace_only : cas qui ne doivent pas matcher", () => {
|
|
117
|
+
it("ne matche pas si les contenus diffèrent après trim", () => {
|
|
118
|
+
const input = [
|
|
119
|
+
`<<<<<<< ours`,
|
|
120
|
+
` const x = 42;`,
|
|
121
|
+
`=======`,
|
|
122
|
+
` const x = 99;`,
|
|
123
|
+
`>>>>>>> theirs`,
|
|
124
|
+
].join("\n");
|
|
125
|
+
const result = resolve(input, "src/test.ts");
|
|
126
|
+
expect(result.hunks[0].type).not.toBe("whitespace_only");
|
|
127
|
+
});
|
|
128
|
+
it("ne matche pas si une ligne est ajoutée (nombre de lignes différent)", () => {
|
|
129
|
+
const input = [
|
|
130
|
+
`<<<<<<< ours`,
|
|
131
|
+
` const a = 1;`,
|
|
132
|
+
` const b = 2;`,
|
|
133
|
+
`=======`,
|
|
134
|
+
` const a = 1;`,
|
|
135
|
+
`>>>>>>> theirs`,
|
|
136
|
+
].join("\n");
|
|
137
|
+
const result = resolve(input, "src/test.ts");
|
|
138
|
+
expect(result.hunks[0].type).not.toBe("whitespace_only");
|
|
139
|
+
});
|
|
140
|
+
it("ne matche pas si les variables ont des noms différents", () => {
|
|
141
|
+
const input = [
|
|
142
|
+
`<<<<<<< ours`,
|
|
143
|
+
` const foo = bar;`,
|
|
144
|
+
`=======`,
|
|
145
|
+
` const baz = bar;`,
|
|
146
|
+
`>>>>>>> theirs`,
|
|
147
|
+
].join("\n");
|
|
148
|
+
const result = resolve(input, "src/test.ts");
|
|
149
|
+
expect(result.hunks[0].type).not.toBe("whitespace_only");
|
|
150
|
+
});
|
|
151
|
+
it("ne matche pas si seul l'ordre des lignes change (reorder_only le capte)", () => {
|
|
152
|
+
const input = [
|
|
153
|
+
`<<<<<<< ours`,
|
|
154
|
+
`alpha`,
|
|
155
|
+
`beta`,
|
|
156
|
+
`=======`,
|
|
157
|
+
`beta`,
|
|
158
|
+
`alpha`,
|
|
159
|
+
`>>>>>>> theirs`,
|
|
160
|
+
].join("\n");
|
|
161
|
+
const result = resolve(input, "src/test.ts");
|
|
162
|
+
expect(result.hunks[0].type).not.toBe("whitespace_only");
|
|
163
|
+
});
|
|
164
|
+
it("ne matche pas si les deux côtés sont identiques (same_change prioritaire)", () => {
|
|
165
|
+
const input = [
|
|
166
|
+
`<<<<<<< ours`,
|
|
167
|
+
` const x = 1;`,
|
|
168
|
+
`=======`,
|
|
169
|
+
` const x = 1;`,
|
|
170
|
+
`>>>>>>> theirs`,
|
|
171
|
+
].join("\n");
|
|
172
|
+
// same_change (prio 10) prend la main
|
|
173
|
+
const result = resolve(input, "src/test.ts");
|
|
174
|
+
expect(result.hunks[0].type).toBe("same_change");
|
|
175
|
+
});
|
|
176
|
+
});
|
|
177
|
+
//# sourceMappingURL=whitespace-only.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"whitespace-only.test.js","sourceRoot":"","sources":["../../../src/__tests__/patterns/whitespace-only.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests du resolver CSS/SCSS/Less (GitWand)
|
|
3
|
+
*
|
|
4
|
+
* Fixtures :
|
|
5
|
+
* F1 — règle ajoutée d'un seul côté
|
|
6
|
+
* F2 — même règle, propriétés différentes → conflit partiel
|
|
7
|
+
* F3 — CSS minimal (1 règle)
|
|
8
|
+
* F4 — conflit dans .btn avec couleurs différentes
|
|
9
|
+
* F5 — SCSS avec variable modifiée
|
|
10
|
+
*/
|
|
11
|
+
export {};
|
|
12
|
+
//# sourceMappingURL=css.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"css.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/resolvers/css.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG"}
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests du resolver CSS/SCSS/Less (GitWand)
|
|
3
|
+
*
|
|
4
|
+
* Fixtures :
|
|
5
|
+
* F1 — règle ajoutée d'un seul côté
|
|
6
|
+
* F2 — même règle, propriétés différentes → conflit partiel
|
|
7
|
+
* F3 — CSS minimal (1 règle)
|
|
8
|
+
* F4 — conflit dans .btn avec couleurs différentes
|
|
9
|
+
* F5 — SCSS avec variable modifiée
|
|
10
|
+
*/
|
|
11
|
+
import { describe, it, expect } from "vitest";
|
|
12
|
+
import { resolve } from "../../resolver.js";
|
|
13
|
+
// ─── F1 — règle ajoutée d'un seul côté ───────────────────────────────────────
|
|
14
|
+
describe("F1 — CSS : règle ajoutée d'un seul côté (diff3)", () => {
|
|
15
|
+
const input = [
|
|
16
|
+
`<<<<<<< ours`,
|
|
17
|
+
`.container {`,
|
|
18
|
+
` display: flex;`,
|
|
19
|
+
` padding: 16px;`,
|
|
20
|
+
`}`,
|
|
21
|
+
``,
|
|
22
|
+
`.header {`,
|
|
23
|
+
` background-color: #fff;`,
|
|
24
|
+
` height: 60px;`,
|
|
25
|
+
`}`,
|
|
26
|
+
`||||||| base`,
|
|
27
|
+
`.container {`,
|
|
28
|
+
` display: flex;`,
|
|
29
|
+
` padding: 16px;`,
|
|
30
|
+
`}`,
|
|
31
|
+
`=======`,
|
|
32
|
+
`.container {`,
|
|
33
|
+
` display: flex;`,
|
|
34
|
+
` padding: 16px;`,
|
|
35
|
+
`}`,
|
|
36
|
+
`>>>>>>> theirs`,
|
|
37
|
+
].join("\n");
|
|
38
|
+
it("auto-résout via le resolver css", () => {
|
|
39
|
+
const result = resolve(input, "styles.css");
|
|
40
|
+
expect(result.stats.autoResolved).toBe(1);
|
|
41
|
+
});
|
|
42
|
+
it("le résultat contient la règle ajoutée", () => {
|
|
43
|
+
const result = resolve(input, "styles.css");
|
|
44
|
+
expect(result.mergedContent).toContain(".header");
|
|
45
|
+
});
|
|
46
|
+
it("la raison mentionne [css]", () => {
|
|
47
|
+
const result = resolve(input, "styles.css");
|
|
48
|
+
expect(result.resolutions[0].resolutionReason).toMatch(/\[css\]/i);
|
|
49
|
+
});
|
|
50
|
+
});
|
|
51
|
+
// ─── F2 — même règle, propriétés différentes ─────────────────────────────────
|
|
52
|
+
describe("F2 — CSS : même règle, valeurs différentes des deux côtés (diff3)", () => {
|
|
53
|
+
const input = [
|
|
54
|
+
`<<<<<<< ours`,
|
|
55
|
+
`.container {`,
|
|
56
|
+
` max-width: 1200px;`,
|
|
57
|
+
` padding: 24px;`,
|
|
58
|
+
`}`,
|
|
59
|
+
`||||||| base`,
|
|
60
|
+
`.container {`,
|
|
61
|
+
` max-width: 960px;`,
|
|
62
|
+
` padding: 16px;`,
|
|
63
|
+
`}`,
|
|
64
|
+
`=======`,
|
|
65
|
+
`.container {`,
|
|
66
|
+
` max-width: 1440px;`,
|
|
67
|
+
` padding: 32px;`,
|
|
68
|
+
`}`,
|
|
69
|
+
`>>>>>>> theirs`,
|
|
70
|
+
].join("\n");
|
|
71
|
+
it("ne lève pas d'exception", () => {
|
|
72
|
+
expect(() => resolve(input, "styles.css")).not.toThrow();
|
|
73
|
+
});
|
|
74
|
+
it("la raison mentionne [css]", () => {
|
|
75
|
+
const result = resolve(input, "styles.css");
|
|
76
|
+
expect(result.resolutions[0].resolutionReason).toMatch(/\[css\]/i);
|
|
77
|
+
});
|
|
78
|
+
});
|
|
79
|
+
// ─── F3 — CSS minimal ────────────────────────────────────────────────────────
|
|
80
|
+
describe("F3 — CSS minimal : ne plante pas", () => {
|
|
81
|
+
const input = [
|
|
82
|
+
`<<<<<<< ours`,
|
|
83
|
+
`body { margin: 0; }`,
|
|
84
|
+
`||||||| base`,
|
|
85
|
+
`body { margin: 8px; }`,
|
|
86
|
+
`=======`,
|
|
87
|
+
`body { margin: 0; padding: 0; }`,
|
|
88
|
+
`>>>>>>> theirs`,
|
|
89
|
+
].join("\n");
|
|
90
|
+
it("ne lève pas d'exception", () => {
|
|
91
|
+
expect(() => resolve(input, "minimal.css")).not.toThrow();
|
|
92
|
+
});
|
|
93
|
+
it("produit un résultat avec au moins un hunk", () => {
|
|
94
|
+
const result = resolve(input, "minimal.css");
|
|
95
|
+
expect(result.hunks.length).toBeGreaterThanOrEqual(1);
|
|
96
|
+
});
|
|
97
|
+
});
|
|
98
|
+
// ─── F4 — conflit dans .btn avec couleurs différentes ────────────────────────
|
|
99
|
+
describe("F4 — CSS : .btn avec ajout de règles indépendantes (diff3)", () => {
|
|
100
|
+
const input = [
|
|
101
|
+
`<<<<<<< ours`,
|
|
102
|
+
`.btn {`,
|
|
103
|
+
` display: inline-flex;`,
|
|
104
|
+
` padding: 8px 16px;`,
|
|
105
|
+
` border-radius: 4px;`,
|
|
106
|
+
` font-weight: 600;`,
|
|
107
|
+
`}`,
|
|
108
|
+
``,
|
|
109
|
+
`.btn-primary {`,
|
|
110
|
+
` background-color: #3b82f6;`,
|
|
111
|
+
` color: #fff;`,
|
|
112
|
+
`}`,
|
|
113
|
+
`||||||| base`,
|
|
114
|
+
`.btn {`,
|
|
115
|
+
` display: inline-flex;`,
|
|
116
|
+
` padding: 8px 16px;`,
|
|
117
|
+
` border-radius: 4px;`,
|
|
118
|
+
`}`,
|
|
119
|
+
`=======`,
|
|
120
|
+
`.btn {`,
|
|
121
|
+
` display: inline-flex;`,
|
|
122
|
+
` padding: 8px 16px;`,
|
|
123
|
+
` border-radius: 4px;`,
|
|
124
|
+
`}`,
|
|
125
|
+
``,
|
|
126
|
+
`.btn-danger {`,
|
|
127
|
+
` background-color: #ef4444;`,
|
|
128
|
+
` color: #fff;`,
|
|
129
|
+
`}`,
|
|
130
|
+
`>>>>>>> theirs`,
|
|
131
|
+
].join("\n");
|
|
132
|
+
it("ne lève pas d'exception", () => {
|
|
133
|
+
expect(() => resolve(input, "buttons.css")).not.toThrow();
|
|
134
|
+
});
|
|
135
|
+
it("la raison mentionne [css]", () => {
|
|
136
|
+
const result = resolve(input, "buttons.css");
|
|
137
|
+
expect(result.resolutions[0].resolutionReason).toMatch(/\[css\]/i);
|
|
138
|
+
});
|
|
139
|
+
});
|
|
140
|
+
// ─── F5 — SCSS avec variable modifiée ────────────────────────────────────────
|
|
141
|
+
describe("F5 — SCSS : variable ajoutée d'un seul côté (diff3)", () => {
|
|
142
|
+
const input = [
|
|
143
|
+
`<<<<<<< ours`,
|
|
144
|
+
`$primary-color: #3b82f6;`,
|
|
145
|
+
`$secondary-color: #6b7280;`,
|
|
146
|
+
`$font-size-base: 16px;`,
|
|
147
|
+
`$border-radius: 4px;`,
|
|
148
|
+
`||||||| base`,
|
|
149
|
+
`$primary-color: #3b82f6;`,
|
|
150
|
+
`$secondary-color: #6b7280;`,
|
|
151
|
+
`$font-size-base: 16px;`,
|
|
152
|
+
`=======`,
|
|
153
|
+
`$primary-color: #3b82f6;`,
|
|
154
|
+
`$secondary-color: #6b7280;`,
|
|
155
|
+
`$font-size-base: 16px;`,
|
|
156
|
+
`>>>>>>> theirs`,
|
|
157
|
+
].join("\n");
|
|
158
|
+
it("auto-résout via le resolver css", () => {
|
|
159
|
+
const result = resolve(input, "app.scss");
|
|
160
|
+
expect(result.stats.autoResolved).toBe(1);
|
|
161
|
+
});
|
|
162
|
+
it("le résultat contient la variable ajoutée", () => {
|
|
163
|
+
const result = resolve(input, "app.scss");
|
|
164
|
+
expect(result.mergedContent).toContain("border-radius");
|
|
165
|
+
});
|
|
166
|
+
it("la raison mentionne [css]", () => {
|
|
167
|
+
const result = resolve(input, "app.scss");
|
|
168
|
+
expect(result.resolutions[0].resolutionReason).toMatch(/\[css\]/i);
|
|
169
|
+
});
|
|
170
|
+
});
|
|
171
|
+
//# sourceMappingURL=css.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"css.test.js","sourceRoot":"","sources":["../../../src/__tests__/resolvers/css.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests du resolver imports ES/TS (GitWand)
|
|
3
|
+
*
|
|
4
|
+
* Fixtures :
|
|
5
|
+
* F1 — import ajouté d'un seul côté
|
|
6
|
+
* F2 — même module importé différemment des deux côtés → conflit non résolvable
|
|
7
|
+
* F3 — imports vides (bloc vide)
|
|
8
|
+
* F4 — TypeScript avec `import type`
|
|
9
|
+
* F5 — re-exports `export { X } from 'y'`
|
|
10
|
+
*/
|
|
11
|
+
export {};
|
|
12
|
+
//# sourceMappingURL=imports.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"imports.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/resolvers/imports.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG"}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests du resolver imports ES/TS (GitWand)
|
|
3
|
+
*
|
|
4
|
+
* Fixtures :
|
|
5
|
+
* F1 — import ajouté d'un seul côté
|
|
6
|
+
* F2 — même module importé différemment des deux côtés → conflit non résolvable
|
|
7
|
+
* F3 — imports vides (bloc vide)
|
|
8
|
+
* F4 — TypeScript avec `import type`
|
|
9
|
+
* F5 — re-exports `export { X } from 'y'`
|
|
10
|
+
*/
|
|
11
|
+
import { describe, it, expect } from "vitest";
|
|
12
|
+
import { resolve } from "../../resolver.js";
|
|
13
|
+
// ─── F1 — import ajouté d'un seul côté ───────────────────────────────────────
|
|
14
|
+
describe("F1 — imports : import ajouté d'un seul côté (diff3)", () => {
|
|
15
|
+
const input = [
|
|
16
|
+
`<<<<<<< ours`,
|
|
17
|
+
`import { ref } from 'vue';`,
|
|
18
|
+
`import { computed } from 'vue';`,
|
|
19
|
+
`import { useRouter } from 'vue-router';`,
|
|
20
|
+
`||||||| base`,
|
|
21
|
+
`import { ref } from 'vue';`,
|
|
22
|
+
`import { computed } from 'vue';`,
|
|
23
|
+
`=======`,
|
|
24
|
+
`import { ref } from 'vue';`,
|
|
25
|
+
`import { computed } from 'vue';`,
|
|
26
|
+
`>>>>>>> theirs`,
|
|
27
|
+
].join("\n");
|
|
28
|
+
it("auto-résout via le resolver imports", () => {
|
|
29
|
+
const result = resolve(input, "composable.ts");
|
|
30
|
+
expect(result.stats.autoResolved).toBe(1);
|
|
31
|
+
});
|
|
32
|
+
it("les deux imports sont présents dans le merge", () => {
|
|
33
|
+
const result = resolve(input, "composable.ts");
|
|
34
|
+
expect(result.mergedContent).toContain("useRouter");
|
|
35
|
+
expect(result.mergedContent).toContain("computed");
|
|
36
|
+
expect(result.mergedContent).toContain("ref");
|
|
37
|
+
});
|
|
38
|
+
it("la raison mentionne [imports]", () => {
|
|
39
|
+
const result = resolve(input, "composable.ts");
|
|
40
|
+
expect(result.resolutions[0].resolutionReason).toMatch(/\[imports\]/i);
|
|
41
|
+
});
|
|
42
|
+
});
|
|
43
|
+
// ─── F2 — même module importé différemment des deux côtés ────────────────────
|
|
44
|
+
describe("F2 — imports : même module importé différemment des deux côtés (diff3)", () => {
|
|
45
|
+
const input = [
|
|
46
|
+
`<<<<<<< ours`,
|
|
47
|
+
`import { ref, computed, watch } from 'vue';`,
|
|
48
|
+
`||||||| base`,
|
|
49
|
+
`import { ref } from 'vue';`,
|
|
50
|
+
`=======`,
|
|
51
|
+
`import { ref, reactive, toRefs } from 'vue';`,
|
|
52
|
+
`>>>>>>> theirs`,
|
|
53
|
+
].join("\n");
|
|
54
|
+
it("ne lève pas d'exception", () => {
|
|
55
|
+
expect(() => resolve(input, "store.ts")).not.toThrow();
|
|
56
|
+
});
|
|
57
|
+
it("la raison mentionne [imports]", () => {
|
|
58
|
+
const result = resolve(input, "store.ts");
|
|
59
|
+
expect(result.resolutions[0].resolutionReason).toMatch(/\[imports\]/i);
|
|
60
|
+
});
|
|
61
|
+
});
|
|
62
|
+
// ─── F3 — imports vides ───────────────────────────────────────────────────────
|
|
63
|
+
describe("F3 — imports vides : ne plante pas", () => {
|
|
64
|
+
const input = [
|
|
65
|
+
`<<<<<<< ours`,
|
|
66
|
+
`import {} from 'vue';`,
|
|
67
|
+
`=======`,
|
|
68
|
+
`import {} from 'vue';`,
|
|
69
|
+
`>>>>>>> theirs`,
|
|
70
|
+
].join("\n");
|
|
71
|
+
it("ne lève pas d'exception", () => {
|
|
72
|
+
expect(() => resolve(input, "empty.ts")).not.toThrow();
|
|
73
|
+
});
|
|
74
|
+
it("produit un résultat avec au moins un hunk", () => {
|
|
75
|
+
const result = resolve(input, "empty.ts");
|
|
76
|
+
expect(result.hunks.length).toBeGreaterThanOrEqual(1);
|
|
77
|
+
});
|
|
78
|
+
});
|
|
79
|
+
// ─── F4 — TypeScript avec import type ────────────────────────────────────────
|
|
80
|
+
describe("F4 — imports : TypeScript avec `import type` (diff3)", () => {
|
|
81
|
+
const input = [
|
|
82
|
+
`<<<<<<< ours`,
|
|
83
|
+
`import type { Ref } from 'vue';`,
|
|
84
|
+
`import type { Router } from 'vue-router';`,
|
|
85
|
+
`import type { GitWandOptions } from '@gitwand/core';`,
|
|
86
|
+
`||||||| base`,
|
|
87
|
+
`import type { Ref } from 'vue';`,
|
|
88
|
+
`import type { Router } from 'vue-router';`,
|
|
89
|
+
`=======`,
|
|
90
|
+
`import type { Ref } from 'vue';`,
|
|
91
|
+
`import type { Router } from 'vue-router';`,
|
|
92
|
+
`>>>>>>> theirs`,
|
|
93
|
+
].join("\n");
|
|
94
|
+
it("auto-résout via le resolver imports", () => {
|
|
95
|
+
const result = resolve(input, "types.ts");
|
|
96
|
+
expect(result.stats.autoResolved).toBe(1);
|
|
97
|
+
});
|
|
98
|
+
it("le résultat contient l'import type ajouté", () => {
|
|
99
|
+
const result = resolve(input, "types.ts");
|
|
100
|
+
expect(result.mergedContent).toContain("GitWandOptions");
|
|
101
|
+
expect(result.mergedContent).toContain("import type");
|
|
102
|
+
});
|
|
103
|
+
it("la raison mentionne [imports]", () => {
|
|
104
|
+
const result = resolve(input, "types.ts");
|
|
105
|
+
expect(result.resolutions[0].resolutionReason).toMatch(/\[imports\]/i);
|
|
106
|
+
});
|
|
107
|
+
});
|
|
108
|
+
// ─── F5 — re-exports ──────────────────────────────────────────────────────────
|
|
109
|
+
// F5 — imports de deux modules différents ajoutés des deux côtés (diff2)
|
|
110
|
+
// En diff2, insertion_at_boundary n'a pas accès à la base → le resolver imports
|
|
111
|
+
// est sollicité pour la fusion sémantique.
|
|
112
|
+
describe("F5 — imports : deux modules différents ajoutés (diff2)", () => {
|
|
113
|
+
const input = [
|
|
114
|
+
`<<<<<<< ours`,
|
|
115
|
+
`import { useRouter } from 'vue-router';`,
|
|
116
|
+
`import { ref } from 'vue';`,
|
|
117
|
+
`import { useI18n } from './composables/useI18n';`,
|
|
118
|
+
`=======`,
|
|
119
|
+
`import { useRouter } from 'vue-router';`,
|
|
120
|
+
`import { ref } from 'vue';`,
|
|
121
|
+
`import { useTheme } from './composables/useTheme';`,
|
|
122
|
+
`>>>>>>> theirs`,
|
|
123
|
+
].join("\n");
|
|
124
|
+
it("auto-résout", () => {
|
|
125
|
+
const result = resolve(input, "src/App.ts");
|
|
126
|
+
expect(result.stats.autoResolved).toBe(1);
|
|
127
|
+
});
|
|
128
|
+
it("le résultat contient les imports des deux côtés", () => {
|
|
129
|
+
const result = resolve(input, "src/App.ts");
|
|
130
|
+
expect(result.mergedContent).toContain("useI18n");
|
|
131
|
+
expect(result.mergedContent).toContain("useTheme");
|
|
132
|
+
expect(result.mergedContent).toContain("useRouter");
|
|
133
|
+
});
|
|
134
|
+
});
|
|
135
|
+
//# sourceMappingURL=imports.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"imports.test.js","sourceRoot":"","sources":["../../../src/__tests__/resolvers/imports.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests du resolver JSON/JSONC (GitWand)
|
|
3
|
+
*
|
|
4
|
+
* Fixtures :
|
|
5
|
+
* F1 — clé ajoutée d'un seul côté
|
|
6
|
+
* F2 — même clé modifiée des deux côtés → conflit non résolvable
|
|
7
|
+
* F3 — JSON vide/minimal {}
|
|
8
|
+
* F4 — conflit dans package.json scripts
|
|
9
|
+
* F5 — conflit dans tsconfig.json compilerOptions
|
|
10
|
+
*/
|
|
11
|
+
export {};
|
|
12
|
+
//# sourceMappingURL=json.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/resolvers/json.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG"}
|