@gitwand/core 2.0.1 → 2.2.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/README.md +58 -0
- package/dist/__tests__/bench.bench.js +39 -0
- package/dist/__tests__/bench.bench.js.map +1 -1
- package/dist/__tests__/corpus.d.ts.map +1 -1
- package/dist/__tests__/corpus.js +363 -0
- package/dist/__tests__/corpus.js.map +1 -1
- package/dist/__tests__/diff/block-move.test.d.ts +5 -0
- package/dist/__tests__/diff/block-move.test.d.ts.map +1 -0
- package/dist/__tests__/diff/block-move.test.js +132 -0
- package/dist/__tests__/diff/block-move.test.js.map +1 -0
- package/dist/__tests__/diff/histogram.test.d.ts +8 -0
- package/dist/__tests__/diff/histogram.test.d.ts.map +1 -0
- package/dist/__tests__/diff/histogram.test.js +150 -0
- package/dist/__tests__/diff/histogram.test.js.map +1 -0
- package/dist/__tests__/diff/parity.test.d.ts +17 -0
- package/dist/__tests__/diff/parity.test.d.ts.map +1 -0
- package/dist/__tests__/diff/parity.test.js +149 -0
- package/dist/__tests__/diff/parity.test.js.map +1 -0
- package/dist/__tests__/diff.test.js +6 -2
- package/dist/__tests__/diff.test.js.map +1 -1
- package/dist/__tests__/format-profiles/integration.test.d.ts +7 -0
- package/dist/__tests__/format-profiles/integration.test.d.ts.map +1 -0
- package/dist/__tests__/format-profiles/integration.test.js +193 -0
- package/dist/__tests__/format-profiles/integration.test.js.map +1 -0
- package/dist/__tests__/format-profiles/json-patch.test.d.ts +12 -0
- package/dist/__tests__/format-profiles/json-patch.test.d.ts.map +1 -0
- package/dist/__tests__/format-profiles/json-patch.test.js +222 -0
- package/dist/__tests__/format-profiles/json-patch.test.js.map +1 -0
- package/dist/__tests__/format-profiles/registry.test.d.ts +5 -0
- package/dist/__tests__/format-profiles/registry.test.d.ts.map +1 -0
- package/dist/__tests__/format-profiles/registry.test.js +124 -0
- package/dist/__tests__/format-profiles/registry.test.js.map +1 -0
- package/dist/__tests__/patterns/make-score.test.d.ts +9 -0
- package/dist/__tests__/patterns/make-score.test.d.ts.map +1 -0
- package/dist/__tests__/patterns/make-score.test.js +49 -0
- package/dist/__tests__/patterns/make-score.test.js.map +1 -0
- package/dist/diff/block-move.d.ts +53 -0
- package/dist/diff/block-move.d.ts.map +1 -0
- package/dist/diff/block-move.js +192 -0
- package/dist/diff/block-move.js.map +1 -0
- package/dist/diff/histogram.d.ts +45 -0
- package/dist/diff/histogram.d.ts.map +1 -0
- package/dist/diff/histogram.js +172 -0
- package/dist/diff/histogram.js.map +1 -0
- package/dist/diff/index.d.ts +30 -0
- package/dist/diff/index.d.ts.map +1 -0
- package/dist/diff/index.js +47 -0
- package/dist/diff/index.js.map +1 -0
- package/dist/diff/lcs.d.ts +34 -0
- package/dist/diff/lcs.d.ts.map +1 -0
- package/dist/diff/lcs.js +184 -0
- package/dist/diff/lcs.js.map +1 -0
- package/dist/diff/shared.d.ts +54 -0
- package/dist/diff/shared.d.ts.map +1 -0
- package/dist/diff/shared.js +164 -0
- package/dist/diff/shared.js.map +1 -0
- package/dist/diff.d.ts +6 -65
- package/dist/diff.d.ts.map +1 -1
- package/dist/diff.js +6 -324
- package/dist/diff.js.map +1 -1
- package/dist/format-profiles/index.d.ts +34 -0
- package/dist/format-profiles/index.d.ts.map +1 -0
- package/dist/format-profiles/index.js +86 -0
- package/dist/format-profiles/index.js.map +1 -0
- package/dist/format-profiles/json-patch.d.ts +61 -0
- package/dist/format-profiles/json-patch.d.ts.map +1 -0
- package/dist/format-profiles/json-patch.js +269 -0
- package/dist/format-profiles/json-patch.js.map +1 -0
- package/dist/format-profiles/merge-strategies.d.ts +54 -0
- package/dist/format-profiles/merge-strategies.d.ts.map +1 -0
- package/dist/format-profiles/merge-strategies.js +156 -0
- package/dist/format-profiles/merge-strategies.js.map +1 -0
- package/dist/format-profiles/profiles/composer.d.ts +18 -0
- package/dist/format-profiles/profiles/composer.d.ts.map +1 -0
- package/dist/format-profiles/profiles/composer.js +45 -0
- package/dist/format-profiles/profiles/composer.js.map +1 -0
- package/dist/format-profiles/profiles/helm-values.d.ts +21 -0
- package/dist/format-profiles/profiles/helm-values.d.ts.map +1 -0
- package/dist/format-profiles/profiles/helm-values.js +40 -0
- package/dist/format-profiles/profiles/helm-values.js.map +1 -0
- package/dist/format-profiles/profiles/kubernetes.d.ts +22 -0
- package/dist/format-profiles/profiles/kubernetes.d.ts.map +1 -0
- package/dist/format-profiles/profiles/kubernetes.js +60 -0
- package/dist/format-profiles/profiles/kubernetes.js.map +1 -0
- package/dist/format-profiles/profiles/package-json.d.ts +18 -0
- package/dist/format-profiles/profiles/package-json.d.ts.map +1 -0
- package/dist/format-profiles/profiles/package-json.js +36 -0
- package/dist/format-profiles/profiles/package-json.js.map +1 -0
- package/dist/format-profiles/profiles/tsconfig.d.ts +21 -0
- package/dist/format-profiles/profiles/tsconfig.d.ts.map +1 -0
- package/dist/format-profiles/profiles/tsconfig.js +47 -0
- package/dist/format-profiles/profiles/tsconfig.js.map +1 -0
- package/dist/format-profiles/types.d.ts +67 -0
- package/dist/format-profiles/types.d.ts.map +1 -0
- package/dist/format-profiles/types.js +9 -0
- package/dist/format-profiles/types.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -1
- package/dist/patterns/insertion-at-boundary.d.ts.map +1 -1
- package/dist/patterns/insertion-at-boundary.js +15 -33
- package/dist/patterns/insertion-at-boundary.js.map +1 -1
- package/dist/patterns/utils.d.ts +11 -8
- package/dist/patterns/utils.d.ts.map +1 -1
- package/dist/patterns/utils.js +28 -10
- package/dist/patterns/utils.js.map +1 -1
- package/dist/resolver/format-dispatch.d.ts.map +1 -1
- package/dist/resolver/format-dispatch.js +3 -1
- package/dist/resolver/format-dispatch.js.map +1 -1
- package/dist/resolver/policy.d.ts.map +1 -1
- package/dist/resolver/policy.js +2 -0
- package/dist/resolver/policy.js.map +1 -1
- package/dist/resolvers/dispatcher.d.ts +5 -1
- package/dist/resolvers/dispatcher.d.ts.map +1 -1
- package/dist/resolvers/dispatcher.js +8 -3
- package/dist/resolvers/dispatcher.js.map +1 -1
- package/dist/resolvers/json.d.ts +11 -2
- package/dist/resolvers/json.d.ts.map +1 -1
- package/dist/resolvers/json.js +55 -7
- package/dist/resolvers/json.js.map +1 -1
- package/dist/resolvers/yaml.d.ts +8 -2
- package/dist/resolvers/yaml.d.ts.map +1 -1
- package/dist/resolvers/yaml.js +156 -2
- package/dist/resolvers/yaml.js.map +1 -1
- package/dist/types.d.ts +25 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
package/dist/diff.js
CHANGED
|
@@ -1,328 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* GitWand
|
|
2
|
+
* GitWand — Shim de rétro-compat pour `src/diff.ts`
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
* pour
|
|
4
|
+
* Depuis v2.1 le moteur diff vit dans `src/diff/`. Ce fichier re-exporte tout
|
|
5
|
+
* pour que les imports `from "../diff.js"` continuent de marcher sans churn
|
|
6
|
+
* dans les patterns et résolveurs. Sera supprimé en v2.2 — d'ici là, ne pas
|
|
7
|
+
* ajouter de nouvelle logique ici.
|
|
6
8
|
*/
|
|
7
|
-
|
|
8
|
-
* Seuil au-delà duquel on bascule sur Hirschberg (mémoire O(min(n,m))) au lieu
|
|
9
|
-
* du DP plein (mémoire O(n*m)). À 4M cellules → ~16MB avec un Int32Array, déjà
|
|
10
|
-
* lourd en mémoire mais tolérable en pic. Au-dessus, Hirschberg est obligatoire
|
|
11
|
-
* pour éviter un OOM sur les gros fichiers (lockfiles, bundles minifiés…).
|
|
12
|
-
*/
|
|
13
|
-
const HIRSCHBERG_THRESHOLD = 4_000_000;
|
|
14
|
-
/**
|
|
15
|
-
* Calcule la Longest Common Subsequence entre deux tableaux de lignes.
|
|
16
|
-
* Retourne les indices des lignes communes dans chaque tableau.
|
|
17
|
-
*
|
|
18
|
-
* Stratégie hybride (P2.1) :
|
|
19
|
-
* - petit/moyen (n*m ≤ 4M cellules) → DP plein O(n*m) avec `Int32Array`
|
|
20
|
-
* (4 octets/cellule vs 8-16 octets pour des `number[][]`) ;
|
|
21
|
-
* - gros → Hirschberg récursif, mémoire O(min(n,m)) + O(log n) de pile.
|
|
22
|
-
*
|
|
23
|
-
* Le comportement observable (tie-break, pairs retournées) est identique entre
|
|
24
|
-
* les deux branches — voir `src/__tests__/diff.test.ts`.
|
|
25
|
-
*/
|
|
26
|
-
export function lcs(a, b) {
|
|
27
|
-
const n = a.length;
|
|
28
|
-
const m = b.length;
|
|
29
|
-
if (n === 0 || m === 0)
|
|
30
|
-
return [];
|
|
31
|
-
if (n * m <= HIRSCHBERG_THRESHOLD) {
|
|
32
|
-
return lcsDenseDP(a, b);
|
|
33
|
-
}
|
|
34
|
-
return lcsHirschberg(a, b);
|
|
35
|
-
}
|
|
36
|
-
/**
|
|
37
|
-
* DP plein avec `Int32Array` (mémoire compacte, 4 octets/cellule).
|
|
38
|
-
* Équivalent structurel à l'implémentation historique — même tie-break,
|
|
39
|
-
* mêmes paires retournées.
|
|
40
|
-
*/
|
|
41
|
-
function lcsDenseDP(a, b) {
|
|
42
|
-
const n = a.length;
|
|
43
|
-
const m = b.length;
|
|
44
|
-
const W = m + 1;
|
|
45
|
-
// Table DP aplatie : dp[i*W + j] ≡ dp[i][j].
|
|
46
|
-
const dp = new Int32Array((n + 1) * W);
|
|
47
|
-
for (let i = 1; i <= n; i++) {
|
|
48
|
-
const row = i * W;
|
|
49
|
-
const prev = (i - 1) * W;
|
|
50
|
-
for (let j = 1; j <= m; j++) {
|
|
51
|
-
if (a[i - 1] === b[j - 1]) {
|
|
52
|
-
dp[row + j] = dp[prev + (j - 1)] + 1;
|
|
53
|
-
}
|
|
54
|
-
else {
|
|
55
|
-
const up = dp[prev + j];
|
|
56
|
-
const left = dp[row + (j - 1)];
|
|
57
|
-
dp[row + j] = up > left ? up : left;
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
// Backtrack : mêmes règles de tie-break que l'implémentation historique.
|
|
62
|
-
const result = [];
|
|
63
|
-
let i = n;
|
|
64
|
-
let j = m;
|
|
65
|
-
while (i > 0 && j > 0) {
|
|
66
|
-
if (a[i - 1] === b[j - 1]) {
|
|
67
|
-
result.push([i - 1, j - 1]);
|
|
68
|
-
i--;
|
|
69
|
-
j--;
|
|
70
|
-
}
|
|
71
|
-
else if (dp[(i - 1) * W + j] > dp[i * W + (j - 1)]) {
|
|
72
|
-
i--;
|
|
73
|
-
}
|
|
74
|
-
else {
|
|
75
|
-
j--;
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
result.reverse();
|
|
79
|
-
return result;
|
|
80
|
-
}
|
|
81
|
-
/**
|
|
82
|
-
* Implémentation Hirschberg exposée pour les tests (et usage avancé éventuel).
|
|
83
|
-
* L'API publique `lcs()` choisit automatiquement entre cette variante et le DP
|
|
84
|
-
* plein selon la taille de l'input. Exporter sous le préfixe `_` signale son
|
|
85
|
-
* caractère d'interne-testable.
|
|
86
|
-
*/
|
|
87
|
-
export const _lcsHirschberg = (a, b) => lcsHirschberg(a, b);
|
|
88
|
-
/**
|
|
89
|
-
* Hirschberg : divide-and-conquer qui trouve le point de split optimal dans `a`
|
|
90
|
-
* en utilisant seulement 2 lignes de DP (mémoire O(min(n,m))), puis recurse sur
|
|
91
|
-
* les deux moitiés. Les paires LCS retournées peuvent différer de celles du DP
|
|
92
|
-
* plein **sur les ties**, mais la longueur et la validité sont garanties.
|
|
93
|
-
*
|
|
94
|
-
* Stratégie pour rester iso-comportement avec `lcsDenseDP` :
|
|
95
|
-
* - Sous un petit seuil de récursion (`n ≤ 2` ou `m ≤ 2`), on tombe sur des
|
|
96
|
-
* cas triviaux résolus directement (même tie-break que le DP plein).
|
|
97
|
-
* - Le split choisit le `j*` qui maximise `scoreL[j] + scoreR[m - j]`, et en
|
|
98
|
-
* cas d'ex-æquo on prend le **plus petit** `j*` (équivalent au tie-break
|
|
99
|
-
* "j-- d'abord" du backtrack historique).
|
|
100
|
-
*/
|
|
101
|
-
function lcsHirschberg(a, b) {
|
|
102
|
-
const n = a.length;
|
|
103
|
-
const m = b.length;
|
|
104
|
-
// Cas de base : une seule ligne à gauche → chercher la première occurrence.
|
|
105
|
-
if (n === 0 || m === 0)
|
|
106
|
-
return [];
|
|
107
|
-
if (n === 1) {
|
|
108
|
-
const target = a[0];
|
|
109
|
-
for (let j = 0; j < m; j++) {
|
|
110
|
-
if (b[j] === target)
|
|
111
|
-
return [[0, j]];
|
|
112
|
-
}
|
|
113
|
-
return [];
|
|
114
|
-
}
|
|
115
|
-
const mid = n >> 1; // n / 2 floor
|
|
116
|
-
// Scores DP pour a[0..mid] contre b (forward), longueur m+1.
|
|
117
|
-
const scoreL = lcsScoreRow(a, 0, mid, b, 0, m, false);
|
|
118
|
-
// Scores DP pour a[mid..n] contre b (reverse), longueur m+1.
|
|
119
|
-
const scoreR = lcsScoreRow(a, mid, n, b, 0, m, true);
|
|
120
|
-
// Trouver le j* qui maximise scoreL[j] + scoreR[m - j].
|
|
121
|
-
// En cas d'ex-æquo, on prend le plus petit j pour rester proche du tie-break
|
|
122
|
-
// historique (backtrack « j-- en premier » ≈ préférer les splits « early »).
|
|
123
|
-
let bestJ = 0;
|
|
124
|
-
let bestScore = scoreL[0] + scoreR[m];
|
|
125
|
-
for (let j = 1; j <= m; j++) {
|
|
126
|
-
const s = scoreL[j] + scoreR[m - j];
|
|
127
|
-
if (s > bestScore) {
|
|
128
|
-
bestScore = s;
|
|
129
|
-
bestJ = j;
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
// Récursion + ajustement des indices pour la moitié droite.
|
|
133
|
-
const left = lcsHirschberg(a.slice(0, mid), b.slice(0, bestJ));
|
|
134
|
-
const rightRaw = lcsHirschberg(a.slice(mid), b.slice(bestJ));
|
|
135
|
-
const right = rightRaw.map(([i, j]) => [i + mid, j + bestJ]);
|
|
136
|
-
return left.concat(right);
|
|
137
|
-
}
|
|
138
|
-
/**
|
|
139
|
-
* Calcule la dernière ligne du tableau DP LCS en 2 lignes (mémoire O(m+1)).
|
|
140
|
-
*
|
|
141
|
-
* @param a - tableau source pour la dimension « rows »
|
|
142
|
-
* @param aStart - début (inclus) dans a
|
|
143
|
-
* @param aEnd - fin (exclus) dans a
|
|
144
|
-
* @param b - tableau source pour la dimension « cols »
|
|
145
|
-
* @param bStart - début (inclus) dans b
|
|
146
|
-
* @param bEnd - fin (exclus) dans b
|
|
147
|
-
* @param reverse - si true, parcourt a et b à l'envers (pour Hirschberg)
|
|
148
|
-
*/
|
|
149
|
-
function lcsScoreRow(a, aStart, aEnd, b, bStart, bEnd, reverse) {
|
|
150
|
-
const n = aEnd - aStart;
|
|
151
|
-
const m = bEnd - bStart;
|
|
152
|
-
let prev = new Int32Array(m + 1);
|
|
153
|
-
let curr = new Int32Array(m + 1);
|
|
154
|
-
for (let i = 1; i <= n; i++) {
|
|
155
|
-
const ai = reverse ? a[aEnd - i] : a[aStart + i - 1];
|
|
156
|
-
for (let j = 1; j <= m; j++) {
|
|
157
|
-
const bj = reverse ? b[bEnd - j] : b[bStart + j - 1];
|
|
158
|
-
if (ai === bj) {
|
|
159
|
-
curr[j] = prev[j - 1] + 1;
|
|
160
|
-
}
|
|
161
|
-
else {
|
|
162
|
-
const up = prev[j];
|
|
163
|
-
const left = curr[j - 1];
|
|
164
|
-
curr[j] = up > left ? up : left;
|
|
165
|
-
}
|
|
166
|
-
}
|
|
167
|
-
// Swap prev ↔ curr (éviter une réallocation)
|
|
168
|
-
const tmp = prev;
|
|
169
|
-
prev = curr;
|
|
170
|
-
curr = tmp;
|
|
171
|
-
// Reset curr à 0 pour la prochaine itération
|
|
172
|
-
curr.fill(0);
|
|
173
|
-
}
|
|
174
|
-
// Après la boucle, la dernière ligne calculée est dans `prev`.
|
|
175
|
-
return prev;
|
|
176
|
-
}
|
|
177
|
-
/**
|
|
178
|
-
* Calcule le diff entre une base et une branche.
|
|
179
|
-
* Retourne la séquence d'opérations (keep, add, remove).
|
|
180
|
-
*/
|
|
181
|
-
export function computeDiff(base, branch) {
|
|
182
|
-
const common = lcs(base, branch);
|
|
183
|
-
const ops = [];
|
|
184
|
-
let baseIdx = 0;
|
|
185
|
-
let branchIdx = 0;
|
|
186
|
-
for (const [bIdx, rIdx] of common) {
|
|
187
|
-
// Lignes supprimées de la base (avant le prochain match)
|
|
188
|
-
while (baseIdx < bIdx) {
|
|
189
|
-
ops.push({ type: "remove", line: base[baseIdx], index: baseIdx });
|
|
190
|
-
baseIdx++;
|
|
191
|
-
}
|
|
192
|
-
// Lignes ajoutées dans la branche (avant le prochain match)
|
|
193
|
-
while (branchIdx < rIdx) {
|
|
194
|
-
ops.push({ type: "add", line: branch[branchIdx], index: branchIdx });
|
|
195
|
-
branchIdx++;
|
|
196
|
-
}
|
|
197
|
-
// Ligne commune
|
|
198
|
-
ops.push({ type: "keep", line: base[baseIdx], index: baseIdx });
|
|
199
|
-
baseIdx++;
|
|
200
|
-
branchIdx++;
|
|
201
|
-
}
|
|
202
|
-
// Lignes restantes après le dernier match
|
|
203
|
-
while (baseIdx < base.length) {
|
|
204
|
-
ops.push({ type: "remove", line: base[baseIdx], index: baseIdx });
|
|
205
|
-
baseIdx++;
|
|
206
|
-
}
|
|
207
|
-
while (branchIdx < branch.length) {
|
|
208
|
-
ops.push({ type: "add", line: branch[branchIdx], index: branchIdx });
|
|
209
|
-
branchIdx++;
|
|
210
|
-
}
|
|
211
|
-
return ops;
|
|
212
|
-
}
|
|
213
|
-
/**
|
|
214
|
-
* Extrait les edits (changements groupés) d'un diff.
|
|
215
|
-
* Chaque groupe contigu de add/remove forme un edit.
|
|
216
|
-
*/
|
|
217
|
-
export function extractEdits(diff, source) {
|
|
218
|
-
const edits = [];
|
|
219
|
-
let i = 0;
|
|
220
|
-
while (i < diff.length) {
|
|
221
|
-
if (diff[i].type === "keep") {
|
|
222
|
-
i++;
|
|
223
|
-
continue;
|
|
224
|
-
}
|
|
225
|
-
// Début d'un groupe de changements
|
|
226
|
-
const removedLines = [];
|
|
227
|
-
const addedLines = [];
|
|
228
|
-
while (i < diff.length && diff[i].type !== "keep") {
|
|
229
|
-
if (diff[i].type === "remove") {
|
|
230
|
-
removedLines.push(diff[i].index);
|
|
231
|
-
}
|
|
232
|
-
else {
|
|
233
|
-
addedLines.push(diff[i].line);
|
|
234
|
-
}
|
|
235
|
-
i++;
|
|
236
|
-
}
|
|
237
|
-
const baseStart = removedLines.length > 0
|
|
238
|
-
? removedLines[0]
|
|
239
|
-
: // Pour un pur ajout, on utilise l'index de la prochaine ligne keep
|
|
240
|
-
findNextKeepBaseIndex(diff, i);
|
|
241
|
-
const baseEnd = removedLines.length > 0
|
|
242
|
-
? removedLines[removedLines.length - 1] + 1
|
|
243
|
-
: baseStart; // Pur ajout : pas de suppression
|
|
244
|
-
edits.push({ baseStart, baseEnd, addedLines, source });
|
|
245
|
-
}
|
|
246
|
-
return edits;
|
|
247
|
-
}
|
|
248
|
-
/** Trouve l'index base de la prochaine opération "keep" à partir de la position i */
|
|
249
|
-
function findNextKeepBaseIndex(diff, fromIdx) {
|
|
250
|
-
for (let j = fromIdx; j < diff.length; j++) {
|
|
251
|
-
if (diff[j].type === "keep") {
|
|
252
|
-
return diff[j].index;
|
|
253
|
-
}
|
|
254
|
-
}
|
|
255
|
-
// Si pas de keep après, c'est un ajout en fin de fichier
|
|
256
|
-
// On retourne l'index après la dernière ligne de la base
|
|
257
|
-
for (let j = diff.length - 1; j >= 0; j--) {
|
|
258
|
-
if (diff[j].type === "keep" || diff[j].type === "remove") {
|
|
259
|
-
return diff[j].index + 1;
|
|
260
|
-
}
|
|
261
|
-
}
|
|
262
|
-
return 0;
|
|
263
|
-
}
|
|
264
|
-
/**
|
|
265
|
-
* Vérifie si deux edits se chevauchent (overlap).
|
|
266
|
-
* Deux edits overlap si leurs zones dans la base se croisent.
|
|
267
|
-
*/
|
|
268
|
-
export function editsOverlap(a, b) {
|
|
269
|
-
// Les edits sont des intervalles [baseStart, baseEnd) dans la base
|
|
270
|
-
// Ils overlap si un commence avant que l'autre finisse
|
|
271
|
-
// Cas spécial : deux purs ajouts au même point
|
|
272
|
-
if (a.baseStart === a.baseEnd && b.baseStart === b.baseEnd) {
|
|
273
|
-
return a.baseStart === b.baseStart;
|
|
274
|
-
}
|
|
275
|
-
// Cas spécial : un pur ajout à un point touché par l'autre
|
|
276
|
-
if (a.baseStart === a.baseEnd) {
|
|
277
|
-
return a.baseStart >= b.baseStart && a.baseStart < b.baseEnd;
|
|
278
|
-
}
|
|
279
|
-
if (b.baseStart === b.baseEnd) {
|
|
280
|
-
return b.baseStart >= a.baseStart && b.baseStart < a.baseEnd;
|
|
281
|
-
}
|
|
282
|
-
// Cas général : overlap d'intervalles
|
|
283
|
-
return a.baseStart < b.baseEnd && b.baseStart < a.baseEnd;
|
|
284
|
-
}
|
|
285
|
-
/**
|
|
286
|
-
* Tente de fusionner les changements non-overlapping de deux branches.
|
|
287
|
-
*
|
|
288
|
-
* @returns Les lignes fusionnées, ou null si les changements se chevauchent
|
|
289
|
-
*/
|
|
290
|
-
export function mergeNonOverlapping(base, ours, theirs) {
|
|
291
|
-
const oursDiff = computeDiff(base, ours);
|
|
292
|
-
const theirsDiff = computeDiff(base, theirs);
|
|
293
|
-
const oursEdits = extractEdits(oursDiff, "ours");
|
|
294
|
-
const theirsEdits = extractEdits(theirsDiff, "theirs");
|
|
295
|
-
// Vérifier qu'aucun edit ne chevauche un edit de l'autre branche
|
|
296
|
-
for (const oEdit of oursEdits) {
|
|
297
|
-
for (const tEdit of theirsEdits) {
|
|
298
|
-
if (editsOverlap(oEdit, tEdit)) {
|
|
299
|
-
return null; // Overlap détecté → pas de résolution automatique
|
|
300
|
-
}
|
|
301
|
-
}
|
|
302
|
-
}
|
|
303
|
-
// Fusionner les edits triés par position dans la base
|
|
304
|
-
const allEdits = [...oursEdits, ...theirsEdits].sort((a, b) => a.baseStart - b.baseStart || a.baseEnd - b.baseEnd);
|
|
305
|
-
// Reconstruire le fichier fusionné
|
|
306
|
-
const result = [];
|
|
307
|
-
let baseIdx = 0;
|
|
308
|
-
for (const edit of allEdits) {
|
|
309
|
-
// Copier les lignes de la base jusqu'au début de l'edit
|
|
310
|
-
while (baseIdx < edit.baseStart) {
|
|
311
|
-
result.push(base[baseIdx]);
|
|
312
|
-
baseIdx++;
|
|
313
|
-
}
|
|
314
|
-
// Ajouter les lignes de l'edit
|
|
315
|
-
result.push(...edit.addedLines);
|
|
316
|
-
// Avancer au-delà de la zone supprimée
|
|
317
|
-
if (edit.baseEnd > baseIdx) {
|
|
318
|
-
baseIdx = edit.baseEnd;
|
|
319
|
-
}
|
|
320
|
-
}
|
|
321
|
-
// Copier le reste de la base
|
|
322
|
-
while (baseIdx < base.length) {
|
|
323
|
-
result.push(base[baseIdx]);
|
|
324
|
-
baseIdx++;
|
|
325
|
-
}
|
|
326
|
-
return result;
|
|
327
|
-
}
|
|
9
|
+
export * from "./diff/index.js";
|
|
328
10
|
//# sourceMappingURL=diff.js.map
|
package/dist/diff.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"diff.js","sourceRoot":"","sources":["../src/diff.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"diff.js","sourceRoot":"","sources":["../src/diff.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,cAAc,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GitWand — Registre de profils de format
|
|
3
|
+
*
|
|
4
|
+
* Le registre centralise les FormatProfile reconnus. Les consommateurs
|
|
5
|
+
* (tryResolveJsonConflict, tryResolveYamlConflict) appellent profileForFile()
|
|
6
|
+
* pour obtenir, le cas échéant, un profil applicable au filePath courant.
|
|
7
|
+
*
|
|
8
|
+
* Les profils sont essayés dans l'ordre d'enregistrement — le premier dont
|
|
9
|
+
* matches(filePath) retourne true gagne. Les built-ins sont enregistrés ici ;
|
|
10
|
+
* les consommateurs externes peuvent ajouter les leurs via registerFormatProfile.
|
|
11
|
+
*/
|
|
12
|
+
import type { FormatProfile, PathStrategy } from "./types.js";
|
|
13
|
+
/**
|
|
14
|
+
* Cherche un profil applicable au filePath. Retourne null si aucun match.
|
|
15
|
+
*/
|
|
16
|
+
export declare function profileForFile(filePath: string): FormatProfile | null;
|
|
17
|
+
/**
|
|
18
|
+
* Enregistre un profil custom. Inséré en tête (priorité sur les built-ins
|
|
19
|
+
* pour les filePath qu'il match), pratique pour qu'une extension VS Code ou
|
|
20
|
+
* un consommateur monorepo override un built-in.
|
|
21
|
+
*
|
|
22
|
+
* @returns une fonction d'unregister (pour cleanup propre dans les tests).
|
|
23
|
+
*/
|
|
24
|
+
export declare function registerFormatProfile(profile: FormatProfile): () => void;
|
|
25
|
+
/**
|
|
26
|
+
* Résout la stratégie applicable à un chemin JSON Pointer dans un profil.
|
|
27
|
+
*
|
|
28
|
+
* Recherche : exact match d'abord, puis fallback à la stratégie par défaut
|
|
29
|
+
* du profil. Les wildcards "*" dans les paths du profil matchent un segment
|
|
30
|
+
* unique du pointer.
|
|
31
|
+
*/
|
|
32
|
+
export declare function strategyForPath(profile: FormatProfile, pointer: string): PathStrategy;
|
|
33
|
+
export type { FormatProfile, PathStrategy, JsonPatchOp } from "./types.js";
|
|
34
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/format-profiles/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAiB9D;;GAEG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CAKrE;AAED;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,aAAa,GAAG,MAAM,IAAI,CAMxE;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAC7B,OAAO,EAAE,aAAa,EACtB,OAAO,EAAE,MAAM,GACd,YAAY,CAUd;AAcD,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GitWand — Registre de profils de format
|
|
3
|
+
*
|
|
4
|
+
* Le registre centralise les FormatProfile reconnus. Les consommateurs
|
|
5
|
+
* (tryResolveJsonConflict, tryResolveYamlConflict) appellent profileForFile()
|
|
6
|
+
* pour obtenir, le cas échéant, un profil applicable au filePath courant.
|
|
7
|
+
*
|
|
8
|
+
* Les profils sont essayés dans l'ordre d'enregistrement — le premier dont
|
|
9
|
+
* matches(filePath) retourne true gagne. Les built-ins sont enregistrés ici ;
|
|
10
|
+
* les consommateurs externes peuvent ajouter les leurs via registerFormatProfile.
|
|
11
|
+
*/
|
|
12
|
+
import { packageJsonProfile } from "./profiles/package-json.js";
|
|
13
|
+
import { tsconfigProfile } from "./profiles/tsconfig.js";
|
|
14
|
+
import { composerProfile } from "./profiles/composer.js";
|
|
15
|
+
import { helmValuesProfile } from "./profiles/helm-values.js";
|
|
16
|
+
import { kubernetesProfile } from "./profiles/kubernetes.js";
|
|
17
|
+
const PROFILES = [
|
|
18
|
+
packageJsonProfile,
|
|
19
|
+
tsconfigProfile,
|
|
20
|
+
composerProfile,
|
|
21
|
+
// YAML profiles : helm avant kubernetes (helm/values.yaml peut matcher les
|
|
22
|
+
// deux, on veut le plus spécifique en premier).
|
|
23
|
+
helmValuesProfile,
|
|
24
|
+
kubernetesProfile,
|
|
25
|
+
];
|
|
26
|
+
/**
|
|
27
|
+
* Cherche un profil applicable au filePath. Retourne null si aucun match.
|
|
28
|
+
*/
|
|
29
|
+
export function profileForFile(filePath) {
|
|
30
|
+
for (const profile of PROFILES) {
|
|
31
|
+
if (profile.matches(filePath))
|
|
32
|
+
return profile;
|
|
33
|
+
}
|
|
34
|
+
return null;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Enregistre un profil custom. Inséré en tête (priorité sur les built-ins
|
|
38
|
+
* pour les filePath qu'il match), pratique pour qu'une extension VS Code ou
|
|
39
|
+
* un consommateur monorepo override un built-in.
|
|
40
|
+
*
|
|
41
|
+
* @returns une fonction d'unregister (pour cleanup propre dans les tests).
|
|
42
|
+
*/
|
|
43
|
+
export function registerFormatProfile(profile) {
|
|
44
|
+
PROFILES.unshift(profile);
|
|
45
|
+
return () => {
|
|
46
|
+
const idx = PROFILES.indexOf(profile);
|
|
47
|
+
if (idx >= 0)
|
|
48
|
+
PROFILES.splice(idx, 1);
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Résout la stratégie applicable à un chemin JSON Pointer dans un profil.
|
|
53
|
+
*
|
|
54
|
+
* Recherche : exact match d'abord, puis fallback à la stratégie par défaut
|
|
55
|
+
* du profil. Les wildcards "*" dans les paths du profil matchent un segment
|
|
56
|
+
* unique du pointer.
|
|
57
|
+
*/
|
|
58
|
+
export function strategyForPath(profile, pointer) {
|
|
59
|
+
// Match exact
|
|
60
|
+
if (profile.paths[pointer])
|
|
61
|
+
return profile.paths[pointer];
|
|
62
|
+
// Match avec wildcards : on convertit chaque path-clé du profil en regex
|
|
63
|
+
// (segments-by-segments, "*" → tout sauf "/").
|
|
64
|
+
for (const [pathKey, strategy] of Object.entries(profile.paths)) {
|
|
65
|
+
if (!pathKey.includes("*"))
|
|
66
|
+
continue;
|
|
67
|
+
if (matchesWildcardPath(pathKey, pointer))
|
|
68
|
+
return strategy;
|
|
69
|
+
}
|
|
70
|
+
return profile.default;
|
|
71
|
+
}
|
|
72
|
+
/** Match un JSON pointer contre un pattern à wildcards "*" (segment unique). */
|
|
73
|
+
function matchesWildcardPath(pattern, pointer) {
|
|
74
|
+
const patternSegs = pattern.split("/");
|
|
75
|
+
const pointerSegs = pointer.split("/");
|
|
76
|
+
if (patternSegs.length !== pointerSegs.length)
|
|
77
|
+
return false;
|
|
78
|
+
for (let i = 0; i < patternSegs.length; i++) {
|
|
79
|
+
if (patternSegs[i] === "*")
|
|
80
|
+
continue;
|
|
81
|
+
if (patternSegs[i] !== pointerSegs[i])
|
|
82
|
+
return false;
|
|
83
|
+
}
|
|
84
|
+
return true;
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/format-profiles/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAE7D,MAAM,QAAQ,GAAoB;IAChC,kBAAkB;IAClB,eAAe;IACf,eAAe;IACf,2EAA2E;IAC3E,gDAAgD;IAChD,iBAAiB;IACjB,iBAAiB;CAClB,CAAC;AAEF;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,QAAgB;IAC7C,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,IAAI,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC;YAAE,OAAO,OAAO,CAAC;IAChD,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,qBAAqB,CAAC,OAAsB;IAC1D,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAC1B,OAAO,GAAG,EAAE;QACV,MAAM,GAAG,GAAG,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACtC,IAAI,GAAG,IAAI,CAAC;YAAE,QAAQ,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;IACxC,CAAC,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,eAAe,CAC7B,OAAsB,EACtB,OAAe;IAEf,cAAc;IACd,IAAI,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC;QAAE,OAAO,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC1D,yEAAyE;IACzE,+CAA+C;IAC/C,KAAK,MAAM,CAAC,OAAO,EAAE,QAAQ,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAChE,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC;YAAE,SAAS;QACrC,IAAI,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC;YAAE,OAAO,QAAQ,CAAC;IAC7D,CAAC;IACD,OAAO,OAAO,CAAC,OAAO,CAAC;AACzB,CAAC;AAED,gFAAgF;AAChF,SAAS,mBAAmB,CAAC,OAAe,EAAE,OAAe;IAC3D,MAAM,WAAW,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACvC,MAAM,WAAW,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACvC,IAAI,WAAW,CAAC,MAAM,KAAK,WAAW,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IAC5D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5C,IAAI,WAAW,CAAC,CAAC,CAAC,KAAK,GAAG;YAAE,SAAS;QACrC,IAAI,WAAW,CAAC,CAAC,CAAC,KAAK,WAAW,CAAC,CAAC,CAAC;YAAE,OAAO,KAAK,CAAC;IACtD,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GitWand — RFC 6902 (JSON Patch) minimal
|
|
3
|
+
*
|
|
4
|
+
* Implémentation maison, pas de dep externe. Couvre `add`, `remove`, `replace`.
|
|
5
|
+
* `move` et `copy` non implémentées (gérées par séquences add/remove).
|
|
6
|
+
*
|
|
7
|
+
* Trois primitives :
|
|
8
|
+
* - `diffJson(base, target)` produit la séquence d'ops qui transforme base en target.
|
|
9
|
+
* - `applyJsonPatch(doc, ops)` applique séquentiellement, retourne le doc résultat
|
|
10
|
+
* (immutable — entrée non modifiée).
|
|
11
|
+
* - `mergeJsonPatches(oursOps, theirsOps)` concatène si les paths sont disjoints,
|
|
12
|
+
* `null` si conflit (au moins une op des deux côtés sur le même path).
|
|
13
|
+
*
|
|
14
|
+
* JSON Pointer (RFC 6901) avec escape `~0` → `~` et `~1` → `/`.
|
|
15
|
+
*/
|
|
16
|
+
import type { JsonPatchOp } from "./types.js";
|
|
17
|
+
/**
|
|
18
|
+
* Parse un JSON Pointer en tableau de tokens. Le pointer racine `""` retourne
|
|
19
|
+
* `[]`. Chaque token est ré-échappé : `~0` → `~`, `~1` → `/`.
|
|
20
|
+
*/
|
|
21
|
+
export declare function parseJsonPointer(pointer: string): string[];
|
|
22
|
+
/**
|
|
23
|
+
* Construit un JSON Pointer depuis un tableau de tokens. Échappe `~` et `/`.
|
|
24
|
+
*/
|
|
25
|
+
export declare function buildJsonPointer(tokens: ReadonlyArray<string>): string;
|
|
26
|
+
/** Type minimum pour parcourir un JSON. `null` est une valeur valide (pas une absence). */
|
|
27
|
+
type JsonValue = unknown;
|
|
28
|
+
/**
|
|
29
|
+
* Applique une séquence d'opérations RFC 6902 à un document. Retourne le
|
|
30
|
+
* nouveau document (l'entrée n'est pas modifiée). Lance une `Error` si une
|
|
31
|
+
* opération réfère à un path inexistant (sauf `add` qui crée).
|
|
32
|
+
*/
|
|
33
|
+
export declare function applyJsonPatch(doc: JsonValue, ops: ReadonlyArray<JsonPatchOp>): JsonValue;
|
|
34
|
+
/**
|
|
35
|
+
* Calcule la séquence d'ops RFC 6902 qui transforme `base` en `target`.
|
|
36
|
+
*
|
|
37
|
+
* Stratégie : récursion structurelle. Sur les objets, on compare clé-par-clé
|
|
38
|
+
* (ajout / remove / récursion). Sur les tableaux, on émet `replace` global
|
|
39
|
+
* dès que les longueurs diffèrent ou qu'un élément à un index donné diffère —
|
|
40
|
+
* pas de LCS-on-arrays ici (c'est le rôle des stratégies `set` / `ordered-list`
|
|
41
|
+
* du registre, qui appellent `diffJson` à un niveau plus fin).
|
|
42
|
+
*/
|
|
43
|
+
export declare function diffJson(base: JsonValue, target: JsonValue): JsonPatchOp[];
|
|
44
|
+
/** Égalité structurelle (récursive) entre deux JSON values. */
|
|
45
|
+
export declare function jsonStructEqual(a: JsonValue, b: JsonValue): boolean;
|
|
46
|
+
/**
|
|
47
|
+
* Fusionne deux séquences d'ops. Si les paths sont disjoints (aucun path
|
|
48
|
+
* touché par les deux), on retourne la concaténation `[...ours, ...theirs]`.
|
|
49
|
+
* Sinon, on retourne `null` avec une liste des paths en conflit (utile pour
|
|
50
|
+
* la `DecisionTrace`).
|
|
51
|
+
*
|
|
52
|
+
* Disjoint = aucun path d'`ours` n'est égal ni préfixe d'un path de `theirs`,
|
|
53
|
+
* et vice versa. (Si `ours` modifie `/foo/bar` et `theirs` modifie `/foo`, ils
|
|
54
|
+
* sont en conflit même si les chaînes ne sont pas identiques.)
|
|
55
|
+
*/
|
|
56
|
+
export declare function mergeJsonPatches(ours: ReadonlyArray<JsonPatchOp>, theirs: ReadonlyArray<JsonPatchOp>): {
|
|
57
|
+
merged: JsonPatchOp[] | null;
|
|
58
|
+
conflictingPaths: string[];
|
|
59
|
+
};
|
|
60
|
+
export {};
|
|
61
|
+
//# sourceMappingURL=json-patch.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json-patch.d.ts","sourceRoot":"","sources":["../../src/format-profiles/json-patch.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAI9C;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAS1D;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,aAAa,CAAC,MAAM,CAAC,GAAG,MAAM,CAQtE;AAID,2FAA2F;AAC3F,KAAK,SAAS,GAAG,OAAO,CAAC;AAazB;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,aAAa,CAAC,WAAW,CAAC,GAAG,SAAS,CAMzF;AAiFD;;;;;;;;GAQG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,GAAG,WAAW,EAAE,CAI1E;AA0CD,+DAA+D;AAC/D,wBAAgB,eAAe,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,SAAS,GAAG,OAAO,CAsBnE;AAID;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,aAAa,CAAC,WAAW,CAAC,EAChC,MAAM,EAAE,aAAa,CAAC,WAAW,CAAC,GACjC;IAAE,MAAM,EAAE,WAAW,EAAE,GAAG,IAAI,CAAC;IAAC,gBAAgB,EAAE,MAAM,EAAE,CAAA;CAAE,CAc9D"}
|