@gitwand/core 2.3.0 → 2.4.1

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 (113) hide show
  1. package/dist/__tests__/corpus.d.ts.map +1 -1
  2. package/dist/__tests__/corpus.js +115 -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/non-overlapping.test.d.ts +11 -0
  13. package/dist/__tests__/patterns/non-overlapping.test.d.ts.map +1 -0
  14. package/dist/__tests__/patterns/non-overlapping.test.js +240 -0
  15. package/dist/__tests__/patterns/non-overlapping.test.js.map +1 -0
  16. package/dist/__tests__/patterns/one-side-change.test.d.ts +10 -0
  17. package/dist/__tests__/patterns/one-side-change.test.d.ts.map +1 -0
  18. package/dist/__tests__/patterns/one-side-change.test.js +191 -0
  19. package/dist/__tests__/patterns/one-side-change.test.js.map +1 -0
  20. package/dist/__tests__/patterns/same-change.test.d.ts +9 -0
  21. package/dist/__tests__/patterns/same-change.test.d.ts.map +1 -0
  22. package/dist/__tests__/patterns/same-change.test.js +173 -0
  23. package/dist/__tests__/patterns/same-change.test.js.map +1 -0
  24. package/dist/__tests__/patterns/value-only-change.test.d.ts +11 -0
  25. package/dist/__tests__/patterns/value-only-change.test.d.ts.map +1 -0
  26. package/dist/__tests__/patterns/value-only-change.test.js +159 -0
  27. package/dist/__tests__/patterns/value-only-change.test.js.map +1 -0
  28. package/dist/__tests__/patterns/whitespace-only.test.d.ts +10 -0
  29. package/dist/__tests__/patterns/whitespace-only.test.d.ts.map +1 -0
  30. package/dist/__tests__/patterns/whitespace-only.test.js +177 -0
  31. package/dist/__tests__/patterns/whitespace-only.test.js.map +1 -0
  32. package/dist/__tests__/resolvers/css.test.d.ts +12 -0
  33. package/dist/__tests__/resolvers/css.test.d.ts.map +1 -0
  34. package/dist/__tests__/resolvers/css.test.js +171 -0
  35. package/dist/__tests__/resolvers/css.test.js.map +1 -0
  36. package/dist/__tests__/resolvers/imports.test.d.ts +12 -0
  37. package/dist/__tests__/resolvers/imports.test.d.ts.map +1 -0
  38. package/dist/__tests__/resolvers/imports.test.js +135 -0
  39. package/dist/__tests__/resolvers/imports.test.js.map +1 -0
  40. package/dist/__tests__/resolvers/json.test.d.ts +12 -0
  41. package/dist/__tests__/resolvers/json.test.d.ts.map +1 -0
  42. package/dist/__tests__/resolvers/json.test.js +184 -0
  43. package/dist/__tests__/resolvers/json.test.js.map +1 -0
  44. package/dist/__tests__/resolvers/lockfile-npm.test.d.ts +12 -0
  45. package/dist/__tests__/resolvers/lockfile-npm.test.d.ts.map +1 -0
  46. package/dist/__tests__/resolvers/lockfile-npm.test.js +187 -0
  47. package/dist/__tests__/resolvers/lockfile-npm.test.js.map +1 -0
  48. package/dist/__tests__/resolvers/lockfile-pnpm.test.d.ts +12 -0
  49. package/dist/__tests__/resolvers/lockfile-pnpm.test.d.ts.map +1 -0
  50. package/dist/__tests__/resolvers/lockfile-pnpm.test.js +175 -0
  51. package/dist/__tests__/resolvers/lockfile-pnpm.test.js.map +1 -0
  52. package/dist/__tests__/resolvers/lockfile-yarn.test.d.ts +12 -0
  53. package/dist/__tests__/resolvers/lockfile-yarn.test.d.ts.map +1 -0
  54. package/dist/__tests__/resolvers/lockfile-yarn.test.js +165 -0
  55. package/dist/__tests__/resolvers/lockfile-yarn.test.js.map +1 -0
  56. package/dist/__tests__/resolvers/markdown.test.d.ts +12 -0
  57. package/dist/__tests__/resolvers/markdown.test.d.ts.map +1 -0
  58. package/dist/__tests__/resolvers/markdown.test.js +188 -0
  59. package/dist/__tests__/resolvers/markdown.test.js.map +1 -0
  60. package/dist/__tests__/resolvers/vue.test.d.ts +12 -0
  61. package/dist/__tests__/resolvers/vue.test.d.ts.map +1 -0
  62. package/dist/__tests__/resolvers/vue.test.js +225 -0
  63. package/dist/__tests__/resolvers/vue.test.js.map +1 -0
  64. package/dist/__tests__/resolvers/yaml.test.d.ts +12 -0
  65. package/dist/__tests__/resolvers/yaml.test.d.ts.map +1 -0
  66. package/dist/__tests__/resolvers/yaml.test.js +203 -0
  67. package/dist/__tests__/resolvers/yaml.test.js.map +1 -0
  68. package/dist/__tests__/v2-core-scenarios.test.d.ts +35 -0
  69. package/dist/__tests__/v2-core-scenarios.test.d.ts.map +1 -0
  70. package/dist/__tests__/v2-core-scenarios.test.js +692 -0
  71. package/dist/__tests__/v2-core-scenarios.test.js.map +1 -0
  72. package/dist/__tests__/validation-parse-tree.test.d.ts +15 -0
  73. package/dist/__tests__/validation-parse-tree.test.d.ts.map +1 -0
  74. package/dist/__tests__/validation-parse-tree.test.js +243 -0
  75. package/dist/__tests__/validation-parse-tree.test.js.map +1 -0
  76. package/dist/config.d.ts +25 -0
  77. package/dist/config.d.ts.map +1 -1
  78. package/dist/config.js +17 -0
  79. package/dist/config.js.map +1 -1
  80. package/dist/diff/index.d.ts.map +1 -1
  81. package/dist/diff/index.js +1 -3
  82. package/dist/diff/index.js.map +1 -1
  83. package/dist/patterns/utils.d.ts +8 -7
  84. package/dist/patterns/utils.d.ts.map +1 -1
  85. package/dist/patterns/utils.js +13 -12
  86. package/dist/patterns/utils.js.map +1 -1
  87. package/dist/resolver/adapters/strict-node.d.ts +32 -0
  88. package/dist/resolver/adapters/strict-node.d.ts.map +1 -0
  89. package/dist/resolver/adapters/strict-node.js +117 -0
  90. package/dist/resolver/adapters/strict-node.js.map +1 -0
  91. package/dist/resolver/index.d.ts +20 -1
  92. package/dist/resolver/index.d.ts.map +1 -1
  93. package/dist/resolver/index.js +89 -5
  94. package/dist/resolver/index.js.map +1 -1
  95. package/dist/resolver/policy.d.ts.map +1 -1
  96. package/dist/resolver/policy.js +3 -0
  97. package/dist/resolver/policy.js.map +1 -1
  98. package/dist/resolver/validate-parse-tree.d.ts +52 -0
  99. package/dist/resolver/validate-parse-tree.d.ts.map +1 -0
  100. package/dist/resolver/validate-parse-tree.js +87 -0
  101. package/dist/resolver/validate-parse-tree.js.map +1 -0
  102. package/dist/resolver/validate-strict.d.ts +27 -0
  103. package/dist/resolver/validate-strict.d.ts.map +1 -0
  104. package/dist/resolver/validate-strict.js +41 -0
  105. package/dist/resolver/validate-strict.js.map +1 -0
  106. package/dist/resolver/validation.d.ts.map +1 -1
  107. package/dist/resolver/validation.js +15 -1
  108. package/dist/resolver/validation.js.map +1 -1
  109. package/dist/resolvers/dispatcher.d.ts.map +1 -1
  110. package/dist/resolvers/dispatcher.js.map +1 -1
  111. package/dist/types.d.ts +60 -3
  112. package/dist/types.d.ts.map +1 -1
  113. package/package.json +1 -1
@@ -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"}
@@ -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"}