@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.
Files changed (136) hide show
  1. package/dist/__tests__/corpus.d.ts.map +1 -1
  2. package/dist/__tests__/corpus.js +377 -0
  3. package/dist/__tests__/corpus.js.map +1 -1
  4. package/dist/__tests__/patterns/complex.test.d.ts +9 -0
  5. package/dist/__tests__/patterns/complex.test.d.ts.map +1 -0
  6. package/dist/__tests__/patterns/complex.test.js +198 -0
  7. package/dist/__tests__/patterns/complex.test.js.map +1 -0
  8. package/dist/__tests__/patterns/delete-no-change.test.d.ts +11 -0
  9. package/dist/__tests__/patterns/delete-no-change.test.d.ts.map +1 -0
  10. package/dist/__tests__/patterns/delete-no-change.test.js +178 -0
  11. package/dist/__tests__/patterns/delete-no-change.test.js.map +1 -0
  12. package/dist/__tests__/patterns/llm-proposed.test.d.ts +10 -0
  13. package/dist/__tests__/patterns/llm-proposed.test.d.ts.map +1 -0
  14. package/dist/__tests__/patterns/llm-proposed.test.js +306 -0
  15. package/dist/__tests__/patterns/llm-proposed.test.js.map +1 -0
  16. package/dist/__tests__/patterns/non-overlapping.test.d.ts +11 -0
  17. package/dist/__tests__/patterns/non-overlapping.test.d.ts.map +1 -0
  18. package/dist/__tests__/patterns/non-overlapping.test.js +240 -0
  19. package/dist/__tests__/patterns/non-overlapping.test.js.map +1 -0
  20. package/dist/__tests__/patterns/one-side-change.test.d.ts +10 -0
  21. package/dist/__tests__/patterns/one-side-change.test.d.ts.map +1 -0
  22. package/dist/__tests__/patterns/one-side-change.test.js +191 -0
  23. package/dist/__tests__/patterns/one-side-change.test.js.map +1 -0
  24. package/dist/__tests__/patterns/same-change.test.d.ts +9 -0
  25. package/dist/__tests__/patterns/same-change.test.d.ts.map +1 -0
  26. package/dist/__tests__/patterns/same-change.test.js +173 -0
  27. package/dist/__tests__/patterns/same-change.test.js.map +1 -0
  28. package/dist/__tests__/patterns/value-only-change.test.d.ts +11 -0
  29. package/dist/__tests__/patterns/value-only-change.test.d.ts.map +1 -0
  30. package/dist/__tests__/patterns/value-only-change.test.js +159 -0
  31. package/dist/__tests__/patterns/value-only-change.test.js.map +1 -0
  32. package/dist/__tests__/patterns/whitespace-only.test.d.ts +10 -0
  33. package/dist/__tests__/patterns/whitespace-only.test.d.ts.map +1 -0
  34. package/dist/__tests__/patterns/whitespace-only.test.js +177 -0
  35. package/dist/__tests__/patterns/whitespace-only.test.js.map +1 -0
  36. package/dist/__tests__/resolvers/css.test.d.ts +12 -0
  37. package/dist/__tests__/resolvers/css.test.d.ts.map +1 -0
  38. package/dist/__tests__/resolvers/css.test.js +171 -0
  39. package/dist/__tests__/resolvers/css.test.js.map +1 -0
  40. package/dist/__tests__/resolvers/imports.test.d.ts +12 -0
  41. package/dist/__tests__/resolvers/imports.test.d.ts.map +1 -0
  42. package/dist/__tests__/resolvers/imports.test.js +135 -0
  43. package/dist/__tests__/resolvers/imports.test.js.map +1 -0
  44. package/dist/__tests__/resolvers/json.test.d.ts +12 -0
  45. package/dist/__tests__/resolvers/json.test.d.ts.map +1 -0
  46. package/dist/__tests__/resolvers/json.test.js +184 -0
  47. package/dist/__tests__/resolvers/json.test.js.map +1 -0
  48. package/dist/__tests__/resolvers/lockfile-npm.test.d.ts +12 -0
  49. package/dist/__tests__/resolvers/lockfile-npm.test.d.ts.map +1 -0
  50. package/dist/__tests__/resolvers/lockfile-npm.test.js +187 -0
  51. package/dist/__tests__/resolvers/lockfile-npm.test.js.map +1 -0
  52. package/dist/__tests__/resolvers/lockfile-pnpm.test.d.ts +12 -0
  53. package/dist/__tests__/resolvers/lockfile-pnpm.test.d.ts.map +1 -0
  54. package/dist/__tests__/resolvers/lockfile-pnpm.test.js +175 -0
  55. package/dist/__tests__/resolvers/lockfile-pnpm.test.js.map +1 -0
  56. package/dist/__tests__/resolvers/lockfile-yarn.test.d.ts +12 -0
  57. package/dist/__tests__/resolvers/lockfile-yarn.test.d.ts.map +1 -0
  58. package/dist/__tests__/resolvers/lockfile-yarn.test.js +165 -0
  59. package/dist/__tests__/resolvers/lockfile-yarn.test.js.map +1 -0
  60. package/dist/__tests__/resolvers/markdown.test.d.ts +12 -0
  61. package/dist/__tests__/resolvers/markdown.test.d.ts.map +1 -0
  62. package/dist/__tests__/resolvers/markdown.test.js +188 -0
  63. package/dist/__tests__/resolvers/markdown.test.js.map +1 -0
  64. package/dist/__tests__/resolvers/vue.test.d.ts +12 -0
  65. package/dist/__tests__/resolvers/vue.test.d.ts.map +1 -0
  66. package/dist/__tests__/resolvers/vue.test.js +225 -0
  67. package/dist/__tests__/resolvers/vue.test.js.map +1 -0
  68. package/dist/__tests__/resolvers/yaml.test.d.ts +12 -0
  69. package/dist/__tests__/resolvers/yaml.test.d.ts.map +1 -0
  70. package/dist/__tests__/resolvers/yaml.test.js +203 -0
  71. package/dist/__tests__/resolvers/yaml.test.js.map +1 -0
  72. package/dist/__tests__/v2-core-scenarios.test.d.ts +35 -0
  73. package/dist/__tests__/v2-core-scenarios.test.d.ts.map +1 -0
  74. package/dist/__tests__/v2-core-scenarios.test.js +692 -0
  75. package/dist/__tests__/v2-core-scenarios.test.js.map +1 -0
  76. package/dist/__tests__/validation-parse-tree.test.d.ts +15 -0
  77. package/dist/__tests__/validation-parse-tree.test.d.ts.map +1 -0
  78. package/dist/__tests__/validation-parse-tree.test.js +243 -0
  79. package/dist/__tests__/validation-parse-tree.test.js.map +1 -0
  80. package/dist/classifier.d.ts.map +1 -1
  81. package/dist/classifier.js +3 -0
  82. package/dist/classifier.js.map +1 -1
  83. package/dist/config.d.ts +54 -0
  84. package/dist/config.d.ts.map +1 -1
  85. package/dist/config.js +42 -0
  86. package/dist/config.js.map +1 -1
  87. package/dist/diff/index.d.ts.map +1 -1
  88. package/dist/diff/index.js +1 -3
  89. package/dist/diff/index.js.map +1 -1
  90. package/dist/index.d.ts +3 -1
  91. package/dist/index.d.ts.map +1 -1
  92. package/dist/index.js +2 -0
  93. package/dist/index.js.map +1 -1
  94. package/dist/patterns/llm-proposed.d.ts +8 -0
  95. package/dist/patterns/llm-proposed.d.ts.map +1 -0
  96. package/dist/patterns/llm-proposed.js +66 -0
  97. package/dist/patterns/llm-proposed.js.map +1 -0
  98. package/dist/patterns/utils.d.ts +8 -7
  99. package/dist/patterns/utils.d.ts.map +1 -1
  100. package/dist/patterns/utils.js +13 -12
  101. package/dist/patterns/utils.js.map +1 -1
  102. package/dist/resolver/adapters/strict-node.d.ts +32 -0
  103. package/dist/resolver/adapters/strict-node.d.ts.map +1 -0
  104. package/dist/resolver/adapters/strict-node.js +117 -0
  105. package/dist/resolver/adapters/strict-node.js.map +1 -0
  106. package/dist/resolver/index.d.ts +20 -1
  107. package/dist/resolver/index.d.ts.map +1 -1
  108. package/dist/resolver/index.js +106 -5
  109. package/dist/resolver/index.js.map +1 -1
  110. package/dist/resolver/llm-pipeline.d.ts +33 -0
  111. package/dist/resolver/llm-pipeline.d.ts.map +1 -0
  112. package/dist/resolver/llm-pipeline.js +218 -0
  113. package/dist/resolver/llm-pipeline.js.map +1 -0
  114. package/dist/resolver/policy.d.ts.map +1 -1
  115. package/dist/resolver/policy.js +5 -0
  116. package/dist/resolver/policy.js.map +1 -1
  117. package/dist/resolver/validate-parse-tree.d.ts +52 -0
  118. package/dist/resolver/validate-parse-tree.d.ts.map +1 -0
  119. package/dist/resolver/validate-parse-tree.js +87 -0
  120. package/dist/resolver/validate-parse-tree.js.map +1 -0
  121. package/dist/resolver/validate-strict.d.ts +27 -0
  122. package/dist/resolver/validate-strict.d.ts.map +1 -0
  123. package/dist/resolver/validate-strict.js +41 -0
  124. package/dist/resolver/validate-strict.js.map +1 -0
  125. package/dist/resolver/validation.d.ts.map +1 -1
  126. package/dist/resolver/validation.js +15 -1
  127. package/dist/resolver/validation.js.map +1 -1
  128. package/dist/resolvers/dispatcher.d.ts.map +1 -1
  129. package/dist/resolvers/dispatcher.js.map +1 -1
  130. package/dist/resolvers/llm-fallback.d.ts +41 -0
  131. package/dist/resolvers/llm-fallback.d.ts.map +1 -0
  132. package/dist/resolvers/llm-fallback.js +231 -0
  133. package/dist/resolvers/llm-fallback.js.map +1 -0
  134. package/dist/types.d.ts +183 -4
  135. package/dist/types.d.ts.map +1 -1
  136. package/package.json +1 -1
@@ -0,0 +1,184 @@
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
+ import { describe, it, expect } from "vitest";
12
+ import { resolve } from "../../resolver.js";
13
+ // ─── F1 — clé ajoutée d'un seul côté ─────────────────────────────────────────
14
+ describe("F1 — JSON : clé ajoutée d'un seul côté (diff3)", () => {
15
+ const input = [
16
+ `<<<<<<< ours`,
17
+ `{`,
18
+ ` "name": "my-app",`,
19
+ ` "version": "1.0.0",`,
20
+ ` "description": "A test app"`,
21
+ `}`,
22
+ `||||||| base`,
23
+ `{`,
24
+ ` "name": "my-app",`,
25
+ ` "version": "1.0.0"`,
26
+ `}`,
27
+ `=======`,
28
+ `{`,
29
+ ` "name": "my-app",`,
30
+ ` "version": "1.0.0"`,
31
+ `}`,
32
+ `>>>>>>> theirs`,
33
+ ].join("\n");
34
+ it("auto-résout via le resolver json", () => {
35
+ const result = resolve(input, "package.json");
36
+ expect(result.stats.autoResolved).toBe(1);
37
+ });
38
+ it("le résultat contient la clé ajoutée", () => {
39
+ const result = resolve(input, "package.json");
40
+ expect(result.mergedContent).toContain("description");
41
+ });
42
+ it("la raison mentionne [json]", () => {
43
+ const result = resolve(input, "package.json");
44
+ expect(result.resolutions[0].resolutionReason).toMatch(/\[json\]/i);
45
+ });
46
+ });
47
+ // ─── F2 — même clé modifiée des deux côtés ────────────────────────────────────
48
+ describe("F2 — JSON : même clé modifiée des deux côtés → conflit non résolvable", () => {
49
+ const input = [
50
+ `<<<<<<< ours`,
51
+ `{`,
52
+ ` "name": "my-app",`,
53
+ ` "version": "2.0.0"`,
54
+ `}`,
55
+ `||||||| base`,
56
+ `{`,
57
+ ` "name": "my-app",`,
58
+ ` "version": "1.0.0"`,
59
+ `}`,
60
+ `=======`,
61
+ `{`,
62
+ ` "name": "my-app",`,
63
+ ` "version": "3.0.0"`,
64
+ `}`,
65
+ `>>>>>>> theirs`,
66
+ ].join("\n");
67
+ it("ne lève pas d'exception", () => {
68
+ expect(() => resolve(input, "package.json")).not.toThrow();
69
+ });
70
+ it("la raison mentionne [json]", () => {
71
+ const result = resolve(input, "package.json");
72
+ expect(result.resolutions[0].resolutionReason).toMatch(/\[json\]/i);
73
+ });
74
+ });
75
+ // ─── F3 — JSON vide / minimal ─────────────────────────────────────────────────
76
+ describe("F3 — JSON minimal {} : ne plante pas", () => {
77
+ const input = [
78
+ `<<<<<<< ours`,
79
+ `{}`,
80
+ `||||||| base`,
81
+ `{}`,
82
+ `=======`,
83
+ `{}`,
84
+ `>>>>>>> theirs`,
85
+ ].join("\n");
86
+ it("ne lève pas d'exception", () => {
87
+ expect(() => resolve(input, "empty.json")).not.toThrow();
88
+ });
89
+ it("produit un résultat avec au moins un hunk", () => {
90
+ const result = resolve(input, "empty.json");
91
+ expect(result.hunks.length).toBeGreaterThanOrEqual(1);
92
+ });
93
+ });
94
+ // ─── F4 — conflit dans package.json scripts ───────────────────────────────────
95
+ describe("F4 — package.json : merge des scripts (diff3)", () => {
96
+ const input = [
97
+ `<<<<<<< ours`,
98
+ `{`,
99
+ ` "scripts": {`,
100
+ ` "build": "tsc",`,
101
+ ` "test": "vitest",`,
102
+ ` "lint": "eslint ."`,
103
+ ` }`,
104
+ `}`,
105
+ `||||||| base`,
106
+ `{`,
107
+ ` "scripts": {`,
108
+ ` "build": "tsc",`,
109
+ ` "test": "vitest"`,
110
+ ` }`,
111
+ `}`,
112
+ `=======`,
113
+ `{`,
114
+ ` "scripts": {`,
115
+ ` "build": "tsc",`,
116
+ ` "test": "vitest",`,
117
+ ` "format": "prettier --write ."`,
118
+ ` }`,
119
+ `}`,
120
+ `>>>>>>> theirs`,
121
+ ].join("\n");
122
+ it("auto-résout via le resolver json", () => {
123
+ const result = resolve(input, "package.json");
124
+ expect(result.stats.autoResolved).toBe(1);
125
+ });
126
+ it("le résultat contient les scripts des deux côtés", () => {
127
+ const result = resolve(input, "package.json");
128
+ expect(result.mergedContent).toContain("lint");
129
+ expect(result.mergedContent).toContain("format");
130
+ expect(result.mergedContent).toContain("build");
131
+ expect(result.mergedContent).toContain("test");
132
+ });
133
+ it("la raison mentionne [json]", () => {
134
+ const result = resolve(input, "package.json");
135
+ expect(result.resolutions[0].resolutionReason).toMatch(/\[json\]/i);
136
+ });
137
+ });
138
+ // ─── F5 — conflit dans tsconfig.json compilerOptions ─────────────────────────
139
+ describe("F5 — tsconfig.json : merge des compilerOptions (diff3)", () => {
140
+ const input = [
141
+ `<<<<<<< ours`,
142
+ `{`,
143
+ ` "compilerOptions": {`,
144
+ ` "target": "ES2022",`,
145
+ ` "module": "ESNext",`,
146
+ ` "strict": true,`,
147
+ ` "noUncheckedIndexedAccess": true`,
148
+ ` }`,
149
+ `}`,
150
+ `||||||| base`,
151
+ `{`,
152
+ ` "compilerOptions": {`,
153
+ ` "target": "ES2022",`,
154
+ ` "module": "ESNext",`,
155
+ ` "strict": true`,
156
+ ` }`,
157
+ `}`,
158
+ `=======`,
159
+ `{`,
160
+ ` "compilerOptions": {`,
161
+ ` "target": "ES2022",`,
162
+ ` "module": "ESNext",`,
163
+ ` "strict": true,`,
164
+ ` "exactOptionalPropertyTypes": true`,
165
+ ` }`,
166
+ `}`,
167
+ `>>>>>>> theirs`,
168
+ ].join("\n");
169
+ it("auto-résout via le resolver json", () => {
170
+ const result = resolve(input, "tsconfig.json");
171
+ expect(result.stats.autoResolved).toBe(1);
172
+ });
173
+ it("le résultat contient les options des deux côtés", () => {
174
+ const result = resolve(input, "tsconfig.json");
175
+ expect(result.mergedContent).toContain("noUncheckedIndexedAccess");
176
+ expect(result.mergedContent).toContain("exactOptionalPropertyTypes");
177
+ expect(result.mergedContent).toContain("strict");
178
+ });
179
+ it("la raison mentionne [json]", () => {
180
+ const result = resolve(input, "tsconfig.json");
181
+ expect(result.resolutions[0].resolutionReason).toMatch(/\[json\]/i);
182
+ });
183
+ });
184
+ //# sourceMappingURL=json.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json.test.js","sourceRoot":"","sources":["../../../src/__tests__/resolvers/json.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Tests du resolver lockfile-npm (package-lock.json) — GitWand
3
+ *
4
+ * Fixtures :
5
+ * F1 — package ajouté d'un seul côté
6
+ * F2 — même package, version différente → prefer theirs ou conflit
7
+ * F3 — lockfile minimal (structure vide)
8
+ * F4 — dépendances directes ajoutées des deux côtés (différents packages)
9
+ * F5 — détection du nom `package-lock.json` → bon resolver utilisé
10
+ */
11
+ export {};
12
+ //# sourceMappingURL=lockfile-npm.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lockfile-npm.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/resolvers/lockfile-npm.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG"}
@@ -0,0 +1,187 @@
1
+ /**
2
+ * Tests du resolver lockfile-npm (package-lock.json) — GitWand
3
+ *
4
+ * Fixtures :
5
+ * F1 — package ajouté d'un seul côté
6
+ * F2 — même package, version différente → prefer theirs ou conflit
7
+ * F3 — lockfile minimal (structure vide)
8
+ * F4 — dépendances directes ajoutées des deux côtés (différents packages)
9
+ * F5 — détection du nom `package-lock.json` → bon resolver utilisé
10
+ */
11
+ import { describe, it, expect } from "vitest";
12
+ import { resolve } from "../../resolver.js";
13
+ // ─── helpers ──────────────────────────────────────────────────────────────────
14
+ function makeLock(extra = {}) {
15
+ return JSON.stringify({
16
+ name: "my-app",
17
+ version: "1.0.0",
18
+ lockfileVersion: 3,
19
+ requires: true,
20
+ packages: {
21
+ "": { name: "my-app", version: "1.0.0" },
22
+ "node_modules/react": {
23
+ version: "18.2.0",
24
+ resolved: "https://registry.npmjs.org/react/-/react-18.2.0.tgz",
25
+ integrity: "sha512-react",
26
+ },
27
+ ...extra,
28
+ },
29
+ }, null, 2);
30
+ }
31
+ // ─── F1 — package ajouté d'un seul côté ───────────────────────────────────────
32
+ describe("F1 — package-lock.json : package ajouté d'un seul côté (diff3)", () => {
33
+ const base = makeLock();
34
+ const ours = makeLock({
35
+ "node_modules/lodash": {
36
+ version: "4.17.21",
37
+ resolved: "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
38
+ integrity: "sha512-lodash",
39
+ },
40
+ });
41
+ const input = [
42
+ `<<<<<<< ours`,
43
+ ...ours.split("\n"),
44
+ `||||||| base`,
45
+ ...base.split("\n"),
46
+ `=======`,
47
+ ...base.split("\n"),
48
+ `>>>>>>> theirs`,
49
+ ].join("\n");
50
+ it("auto-résout via le resolver lockfile-npm", () => {
51
+ const result = resolve(input, "package-lock.json");
52
+ expect(result.stats.autoResolved).toBe(1);
53
+ });
54
+ it("le résultat contient le package ajouté", () => {
55
+ const result = resolve(input, "package-lock.json");
56
+ expect(result.mergedContent).toContain("lodash");
57
+ expect(result.mergedContent).toContain("react");
58
+ });
59
+ it("la raison mentionne [lockfile-npm]", () => {
60
+ const result = resolve(input, "package-lock.json");
61
+ expect(result.resolutions[0].resolutionReason).toMatch(/\[lockfile-npm\]/i);
62
+ });
63
+ });
64
+ // ─── F2 — même package, version différente ────────────────────────────────────
65
+ describe("F2 — package-lock.json : même package, version différente (diff3)", () => {
66
+ const base = makeLock();
67
+ const ours = makeLock({
68
+ "node_modules/lodash": {
69
+ version: "4.17.20",
70
+ resolved: "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz",
71
+ integrity: "sha512-old",
72
+ },
73
+ });
74
+ const theirs = makeLock({
75
+ "node_modules/lodash": {
76
+ version: "4.17.21",
77
+ resolved: "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
78
+ integrity: "sha512-new",
79
+ },
80
+ });
81
+ const input = [
82
+ `<<<<<<< ours`,
83
+ ...ours.split("\n"),
84
+ `||||||| base`,
85
+ ...base.split("\n"),
86
+ `=======`,
87
+ ...theirs.split("\n"),
88
+ `>>>>>>> theirs`,
89
+ ].join("\n");
90
+ it("ne lève pas d'exception", () => {
91
+ expect(() => resolve(input, "package-lock.json")).not.toThrow();
92
+ });
93
+ it("la raison mentionne [lockfile-npm]", () => {
94
+ const result = resolve(input, "package-lock.json");
95
+ expect(result.resolutions[0].resolutionReason).toMatch(/\[lockfile-npm\]/i);
96
+ });
97
+ });
98
+ // ─── F3 — lockfile minimal ────────────────────────────────────────────────────
99
+ describe("F3 — package-lock.json minimal : ne plante pas", () => {
100
+ const minimal = JSON.stringify({ name: "test", version: "1.0.0", lockfileVersion: 3, packages: {} }, null, 2);
101
+ const input = [
102
+ `<<<<<<< ours`,
103
+ ...minimal.split("\n"),
104
+ `||||||| base`,
105
+ ...minimal.split("\n"),
106
+ `=======`,
107
+ ...minimal.split("\n"),
108
+ `>>>>>>> theirs`,
109
+ ].join("\n");
110
+ it("ne lève pas d'exception", () => {
111
+ expect(() => resolve(input, "package-lock.json")).not.toThrow();
112
+ });
113
+ it("produit un résultat avec au moins un hunk", () => {
114
+ const result = resolve(input, "package-lock.json");
115
+ expect(result.hunks.length).toBeGreaterThanOrEqual(1);
116
+ });
117
+ });
118
+ // ─── F4 — dépendances différentes ajoutées des deux côtés ────────────────────
119
+ describe("F4 — package-lock.json : packages différents ajoutés des deux côtés (diff3)", () => {
120
+ const base = makeLock();
121
+ const ours = makeLock({
122
+ "node_modules/axios": {
123
+ version: "1.6.0",
124
+ resolved: "https://registry.npmjs.org/axios/-/axios-1.6.0.tgz",
125
+ integrity: "sha512-axios",
126
+ },
127
+ });
128
+ const theirs = makeLock({
129
+ "node_modules/date-fns": {
130
+ version: "3.0.0",
131
+ resolved: "https://registry.npmjs.org/date-fns/-/date-fns-3.0.0.tgz",
132
+ integrity: "sha512-datefns",
133
+ },
134
+ });
135
+ const input = [
136
+ `<<<<<<< ours`,
137
+ ...ours.split("\n"),
138
+ `||||||| base`,
139
+ ...base.split("\n"),
140
+ `=======`,
141
+ ...theirs.split("\n"),
142
+ `>>>>>>> theirs`,
143
+ ].join("\n");
144
+ it("auto-résout via le resolver lockfile-npm", () => {
145
+ const result = resolve(input, "package-lock.json");
146
+ expect(result.stats.autoResolved).toBe(1);
147
+ });
148
+ it("le résultat contient les deux packages", () => {
149
+ const result = resolve(input, "package-lock.json");
150
+ expect(result.mergedContent).toContain("axios");
151
+ expect(result.mergedContent).toContain("date-fns");
152
+ expect(result.mergedContent).toContain("react");
153
+ });
154
+ it("la raison mentionne [lockfile-npm]", () => {
155
+ const result = resolve(input, "package-lock.json");
156
+ expect(result.resolutions[0].resolutionReason).toMatch(/\[lockfile-npm\]/i);
157
+ });
158
+ });
159
+ // ─── F5 — détection du nom de fichier ────────────────────────────────────────
160
+ describe("F5 — package-lock.json : détection du nom de fichier", () => {
161
+ const base = makeLock();
162
+ const ours = makeLock({
163
+ "node_modules/vue": {
164
+ version: "3.4.0",
165
+ resolved: "https://registry.npmjs.org/vue/-/vue-3.4.0.tgz",
166
+ integrity: "sha512-vue",
167
+ },
168
+ });
169
+ const input = [
170
+ `<<<<<<< ours`,
171
+ ...ours.split("\n"),
172
+ `||||||| base`,
173
+ ...base.split("\n"),
174
+ `=======`,
175
+ ...base.split("\n"),
176
+ `>>>>>>> theirs`,
177
+ ].join("\n");
178
+ it("le nom package-lock.json active le bon resolver", () => {
179
+ const result = resolve(input, "package-lock.json");
180
+ expect(result.resolutions[0].resolutionReason).toMatch(/\[lockfile-npm\]/i);
181
+ });
182
+ it("le nom dans un sous-dossier est aussi détecté", () => {
183
+ const result = resolve(input, "apps/frontend/package-lock.json");
184
+ expect(result.resolutions[0].resolutionReason).toMatch(/\[lockfile-npm\]/i);
185
+ });
186
+ });
187
+ //# sourceMappingURL=lockfile-npm.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lockfile-npm.test.js","sourceRoot":"","sources":["../../../src/__tests__/resolvers/lockfile-npm.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Tests du resolver lockfile-pnpm (pnpm-lock.yaml) — GitWand
3
+ *
4
+ * Fixtures :
5
+ * F1 — package ajouté dans `packages:` d'un seul côté
6
+ * F2 — même package, version différente → prefer theirs ou conflit
7
+ * F3 — lockfile minimal
8
+ * F4 — ajout dans `importers:` d'un seul côté
9
+ * F5 — détection du nom `pnpm-lock.yaml` → bon resolver utilisé
10
+ */
11
+ export {};
12
+ //# sourceMappingURL=lockfile-pnpm.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lockfile-pnpm.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/resolvers/lockfile-pnpm.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG"}
@@ -0,0 +1,175 @@
1
+ /**
2
+ * Tests du resolver lockfile-pnpm (pnpm-lock.yaml) — GitWand
3
+ *
4
+ * Fixtures :
5
+ * F1 — package ajouté dans `packages:` d'un seul côté
6
+ * F2 — même package, version différente → prefer theirs ou conflit
7
+ * F3 — lockfile minimal
8
+ * F4 — ajout dans `importers:` d'un seul côté
9
+ * F5 — détection du nom `pnpm-lock.yaml` → bon resolver utilisé
10
+ */
11
+ import { describe, it, expect } from "vitest";
12
+ import { resolve } from "../../resolver.js";
13
+ // ─── base lockfile ─────────────────────────────────────────────────────────────
14
+ const baseLock = `lockfileVersion: '9.0'
15
+
16
+ settings:
17
+ autoInstallPeers: true
18
+ excludeLinksFromLockfile: false
19
+
20
+ importers:
21
+ .:
22
+ dependencies:
23
+ vue:
24
+ specifier: ^3.4.0
25
+ version: 3.4.0
26
+
27
+ packages:
28
+
29
+ /vue@3.4.0:
30
+ resolution: {integrity: sha512-vue}
31
+ engines: {node: '>=16.11.0'}
32
+ `;
33
+ // ─── F1 — package ajouté dans packages: d'un seul côté ───────────────────────
34
+ describe("F1 — pnpm-lock.yaml : package ajouté dans packages: d'un seul côté (diff3)", () => {
35
+ const oursLock = baseLock + `
36
+ /axios@1.6.0:
37
+ resolution: {integrity: sha512-axios}
38
+ engines: {node: '>=16'}
39
+ `;
40
+ const input = [
41
+ `<<<<<<< ours`,
42
+ ...oursLock.split("\n"),
43
+ `||||||| base`,
44
+ ...baseLock.split("\n"),
45
+ `=======`,
46
+ ...baseLock.split("\n"),
47
+ `>>>>>>> theirs`,
48
+ ].join("\n");
49
+ it("auto-résout via le resolver lockfile-pnpm", () => {
50
+ const result = resolve(input, "pnpm-lock.yaml");
51
+ expect(result.stats.autoResolved).toBe(1);
52
+ });
53
+ it("le résultat contient le package ajouté", () => {
54
+ const result = resolve(input, "pnpm-lock.yaml");
55
+ expect(result.mergedContent).toContain("axios");
56
+ expect(result.mergedContent).toContain("vue");
57
+ });
58
+ it("la raison mentionne [lockfile-pnpm]", () => {
59
+ const result = resolve(input, "pnpm-lock.yaml");
60
+ expect(result.resolutions[0].resolutionReason).toMatch(/\[lockfile-pnpm\]/i);
61
+ });
62
+ });
63
+ // ─── F2 — même package, version différente ────────────────────────────────────
64
+ describe("F2 — pnpm-lock.yaml : même package, version différente (diff3)", () => {
65
+ const oursLock = baseLock.replace("3.4.0", "3.4.1").replace("sha512-vue", "sha512-vue-new");
66
+ const theirsLock = baseLock.replace("3.4.0", "3.5.0").replace("sha512-vue", "sha512-vue-theirs");
67
+ const input = [
68
+ `<<<<<<< ours`,
69
+ ...oursLock.split("\n"),
70
+ `||||||| base`,
71
+ ...baseLock.split("\n"),
72
+ `=======`,
73
+ ...theirsLock.split("\n"),
74
+ `>>>>>>> theirs`,
75
+ ].join("\n");
76
+ it("ne lève pas d'exception", () => {
77
+ expect(() => resolve(input, "pnpm-lock.yaml")).not.toThrow();
78
+ });
79
+ it("la raison mentionne [lockfile-pnpm]", () => {
80
+ const result = resolve(input, "pnpm-lock.yaml");
81
+ expect(result.resolutions[0].resolutionReason).toMatch(/\[lockfile-pnpm\]/i);
82
+ });
83
+ });
84
+ // ─── F3 — lockfile minimal ────────────────────────────────────────────────────
85
+ describe("F3 — pnpm-lock.yaml minimal : ne plante pas", () => {
86
+ const minimal = `lockfileVersion: '9.0'\n\npackages:\n`;
87
+ const input = [
88
+ `<<<<<<< ours`,
89
+ ...minimal.split("\n"),
90
+ `||||||| base`,
91
+ ...minimal.split("\n"),
92
+ `=======`,
93
+ ...minimal.split("\n"),
94
+ `>>>>>>> theirs`,
95
+ ].join("\n");
96
+ it("ne lève pas d'exception", () => {
97
+ expect(() => resolve(input, "pnpm-lock.yaml")).not.toThrow();
98
+ });
99
+ it("produit un résultat avec au moins un hunk", () => {
100
+ const result = resolve(input, "pnpm-lock.yaml");
101
+ expect(result.hunks.length).toBeGreaterThanOrEqual(1);
102
+ });
103
+ });
104
+ // ─── F4 — ajout dans importers: d'un seul côté ───────────────────────────────
105
+ describe("F4 — pnpm-lock.yaml : ajout dans importers: d'un seul côté (diff3)", () => {
106
+ const oursLock = `lockfileVersion: '9.0'
107
+
108
+ settings:
109
+ autoInstallPeers: true
110
+
111
+ importers:
112
+ .:
113
+ dependencies:
114
+ vue:
115
+ specifier: ^3.4.0
116
+ version: 3.4.0
117
+ axios:
118
+ specifier: ^1.6.0
119
+ version: 1.6.0
120
+
121
+ packages:
122
+
123
+ /vue@3.4.0:
124
+ resolution: {integrity: sha512-vue}
125
+
126
+ /axios@1.6.0:
127
+ resolution: {integrity: sha512-axios}
128
+ `;
129
+ const input = [
130
+ `<<<<<<< ours`,
131
+ ...oursLock.split("\n"),
132
+ `||||||| base`,
133
+ ...baseLock.split("\n"),
134
+ `=======`,
135
+ ...baseLock.split("\n"),
136
+ `>>>>>>> theirs`,
137
+ ].join("\n");
138
+ it("auto-résout via le resolver lockfile-pnpm", () => {
139
+ const result = resolve(input, "pnpm-lock.yaml");
140
+ expect(result.stats.autoResolved).toBe(1);
141
+ });
142
+ it("le résultat contient la dépendance ajoutée dans importers", () => {
143
+ const result = resolve(input, "pnpm-lock.yaml");
144
+ expect(result.mergedContent).toContain("axios");
145
+ });
146
+ it("la raison mentionne [lockfile-pnpm]", () => {
147
+ const result = resolve(input, "pnpm-lock.yaml");
148
+ expect(result.resolutions[0].resolutionReason).toMatch(/\[lockfile-pnpm\]/i);
149
+ });
150
+ });
151
+ // ─── F5 — détection du nom de fichier ────────────────────────────────────────
152
+ describe("F5 — pnpm-lock.yaml : détection du nom de fichier", () => {
153
+ const oursLock = baseLock + `
154
+ /lodash@4.17.21:
155
+ resolution: {integrity: sha512-lodash}
156
+ `;
157
+ const input = [
158
+ `<<<<<<< ours`,
159
+ ...oursLock.split("\n"),
160
+ `||||||| base`,
161
+ ...baseLock.split("\n"),
162
+ `=======`,
163
+ ...baseLock.split("\n"),
164
+ `>>>>>>> theirs`,
165
+ ].join("\n");
166
+ it("le nom pnpm-lock.yaml active le bon resolver", () => {
167
+ const result = resolve(input, "pnpm-lock.yaml");
168
+ expect(result.resolutions[0].resolutionReason).toMatch(/\[lockfile-pnpm\]/i);
169
+ });
170
+ it("le nom dans un sous-dossier est aussi détecté", () => {
171
+ const result = resolve(input, "packages/core/pnpm-lock.yaml");
172
+ expect(result.resolutions[0].resolutionReason).toMatch(/\[lockfile-pnpm\]/i);
173
+ });
174
+ });
175
+ //# sourceMappingURL=lockfile-pnpm.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lockfile-pnpm.test.js","sourceRoot":"","sources":["../../../src/__tests__/resolvers/lockfile-pnpm.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Tests du resolver lockfile-yarn (yarn.lock) — GitWand
3
+ *
4
+ * Fixtures :
5
+ * F1 — bloc de package ajouté d'un seul côté
6
+ * F2 — même bloc, version différente → prefer theirs
7
+ * F3 — yarn.lock minimal
8
+ * F4 — deux packages différents ajoutés de chaque côté
9
+ * F5 — détection du nom `yarn.lock` → bon resolver utilisé
10
+ */
11
+ export {};
12
+ //# sourceMappingURL=lockfile-yarn.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lockfile-yarn.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/resolvers/lockfile-yarn.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG"}