@gitwand/core 1.6.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/LICENSE +21 -0
- package/README.md +52 -0
- package/dist/__tests__/bench.bench.d.ts +14 -0
- package/dist/__tests__/bench.bench.d.ts.map +1 -0
- package/dist/__tests__/bench.bench.js +137 -0
- package/dist/__tests__/bench.bench.js.map +1 -0
- package/dist/__tests__/confidence-v14.test.d.ts +13 -0
- package/dist/__tests__/confidence-v14.test.d.ts.map +1 -0
- package/dist/__tests__/confidence-v14.test.js +284 -0
- package/dist/__tests__/confidence-v14.test.js.map +1 -0
- package/dist/__tests__/config.test.d.ts +2 -0
- package/dist/__tests__/config.test.d.ts.map +1 -0
- package/dist/__tests__/config.test.js +317 -0
- package/dist/__tests__/config.test.js.map +1 -0
- package/dist/__tests__/corpus.d.ts +36 -0
- package/dist/__tests__/corpus.d.ts.map +1 -0
- package/dist/__tests__/corpus.js +541 -0
- package/dist/__tests__/corpus.js.map +1 -0
- package/dist/__tests__/corpus.test.d.ts +17 -0
- package/dist/__tests__/corpus.test.d.ts.map +1 -0
- package/dist/__tests__/corpus.test.js +179 -0
- package/dist/__tests__/corpus.test.js.map +1 -0
- package/dist/__tests__/diff.test.d.ts +10 -0
- package/dist/__tests__/diff.test.d.ts.map +1 -0
- package/dist/__tests__/diff.test.js +178 -0
- package/dist/__tests__/diff.test.js.map +1 -0
- package/dist/__tests__/format-resolvers.test.d.ts +2 -0
- package/dist/__tests__/format-resolvers.test.d.ts.map +1 -0
- package/dist/__tests__/format-resolvers.test.js +577 -0
- package/dist/__tests__/format-resolvers.test.js.map +1 -0
- package/dist/__tests__/imports-extended.test.d.ts +2 -0
- package/dist/__tests__/imports-extended.test.d.ts.map +1 -0
- package/dist/__tests__/imports-extended.test.js +94 -0
- package/dist/__tests__/imports-extended.test.js.map +1 -0
- package/dist/__tests__/lockfile-resolvers.test.d.ts +2 -0
- package/dist/__tests__/lockfile-resolvers.test.d.ts.map +1 -0
- package/dist/__tests__/lockfile-resolvers.test.js +200 -0
- package/dist/__tests__/lockfile-resolvers.test.js.map +1 -0
- package/dist/__tests__/patterns/insertion-at-boundary.test.d.ts +10 -0
- package/dist/__tests__/patterns/insertion-at-boundary.test.d.ts.map +1 -0
- package/dist/__tests__/patterns/insertion-at-boundary.test.js +185 -0
- package/dist/__tests__/patterns/insertion-at-boundary.test.js.map +1 -0
- package/dist/__tests__/patterns/reorder-only.test.d.ts +10 -0
- package/dist/__tests__/patterns/reorder-only.test.d.ts.map +1 -0
- package/dist/__tests__/patterns/reorder-only.test.js +181 -0
- package/dist/__tests__/patterns/reorder-only.test.js.map +1 -0
- package/dist/__tests__/phase-7-2-3b.test.d.ts +6 -0
- package/dist/__tests__/phase-7-2-3b.test.d.ts.map +1 -0
- package/dist/__tests__/phase-7-2-3b.test.js +730 -0
- package/dist/__tests__/phase-7-2-3b.test.js.map +1 -0
- package/dist/__tests__/resolver.test.d.ts +2 -0
- package/dist/__tests__/resolver.test.d.ts.map +1 -0
- package/dist/__tests__/resolver.test.js +927 -0
- package/dist/__tests__/resolver.test.js.map +1 -0
- package/dist/__tests__/resolvers/cargo.test.d.ts +10 -0
- package/dist/__tests__/resolvers/cargo.test.d.ts.map +1 -0
- package/dist/__tests__/resolvers/cargo.test.js +158 -0
- package/dist/__tests__/resolvers/cargo.test.js.map +1 -0
- package/dist/__tests__/resolvers/dockerfile.test.d.ts +8 -0
- package/dist/__tests__/resolvers/dockerfile.test.d.ts.map +1 -0
- package/dist/__tests__/resolvers/dockerfile.test.js +120 -0
- package/dist/__tests__/resolvers/dockerfile.test.js.map +1 -0
- package/dist/__tests__/resolvers/dotenv.test.d.ts +9 -0
- package/dist/__tests__/resolvers/dotenv.test.d.ts.map +1 -0
- package/dist/__tests__/resolvers/dotenv.test.js +113 -0
- package/dist/__tests__/resolvers/dotenv.test.js.map +1 -0
- package/dist/__tests__/resolvers/improvements-v14.test.d.ts +8 -0
- package/dist/__tests__/resolvers/improvements-v14.test.d.ts.map +1 -0
- package/dist/__tests__/resolvers/improvements-v14.test.js +306 -0
- package/dist/__tests__/resolvers/improvements-v14.test.js.map +1 -0
- package/dist/__tests__/validation.test.d.ts +12 -0
- package/dist/__tests__/validation.test.d.ts.map +1 -0
- package/dist/__tests__/validation.test.js +136 -0
- package/dist/__tests__/validation.test.js.map +1 -0
- package/dist/classifier.d.ts +21 -0
- package/dist/classifier.d.ts.map +1 -0
- package/dist/classifier.js +127 -0
- package/dist/classifier.js.map +1 -0
- package/dist/config.d.ts +108 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +200 -0
- package/dist/config.js.map +1 -0
- package/dist/diff.d.ts +69 -0
- package/dist/diff.d.ts.map +1 -0
- package/dist/diff.js +328 -0
- package/dist/diff.js.map +1 -0
- package/dist/index.d.ts +47 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +38 -0
- package/dist/index.js.map +1 -0
- package/dist/parser.d.ts +39 -0
- package/dist/parser.d.ts.map +1 -0
- package/dist/parser.js +164 -0
- package/dist/parser.js.map +1 -0
- package/dist/patterns/complex.d.ts +5 -0
- package/dist/patterns/complex.d.ts.map +1 -0
- package/dist/patterns/complex.js +27 -0
- package/dist/patterns/complex.js.map +1 -0
- package/dist/patterns/delete-no-change.d.ts +4 -0
- package/dist/patterns/delete-no-change.d.ts.map +1 -0
- package/dist/patterns/delete-no-change.js +75 -0
- package/dist/patterns/delete-no-change.js.map +1 -0
- package/dist/patterns/insertion-at-boundary.d.ts +22 -0
- package/dist/patterns/insertion-at-boundary.d.ts.map +1 -0
- package/dist/patterns/insertion-at-boundary.js +164 -0
- package/dist/patterns/insertion-at-boundary.js.map +1 -0
- package/dist/patterns/non-overlapping.d.ts +4 -0
- package/dist/patterns/non-overlapping.d.ts.map +1 -0
- package/dist/patterns/non-overlapping.js +28 -0
- package/dist/patterns/non-overlapping.js.map +1 -0
- package/dist/patterns/one-side-change.d.ts +4 -0
- package/dist/patterns/one-side-change.d.ts.map +1 -0
- package/dist/patterns/one-side-change.js +45 -0
- package/dist/patterns/one-side-change.js.map +1 -0
- package/dist/patterns/reorder-only.d.ts +14 -0
- package/dist/patterns/reorder-only.d.ts.map +1 -0
- package/dist/patterns/reorder-only.js +81 -0
- package/dist/patterns/reorder-only.js.map +1 -0
- package/dist/patterns/same-change.d.ts +4 -0
- package/dist/patterns/same-change.d.ts.map +1 -0
- package/dist/patterns/same-change.js +25 -0
- package/dist/patterns/same-change.js.map +1 -0
- package/dist/patterns/utils.d.ts +70 -0
- package/dist/patterns/utils.d.ts.map +1 -0
- package/dist/patterns/utils.js +206 -0
- package/dist/patterns/utils.js.map +1 -0
- package/dist/patterns/value-only-change.d.ts +4 -0
- package/dist/patterns/value-only-change.d.ts.map +1 -0
- package/dist/patterns/value-only-change.js +34 -0
- package/dist/patterns/value-only-change.js.map +1 -0
- package/dist/patterns/whitespace-only.d.ts +4 -0
- package/dist/patterns/whitespace-only.d.ts.map +1 -0
- package/dist/patterns/whitespace-only.js +32 -0
- package/dist/patterns/whitespace-only.js.map +1 -0
- package/dist/resolver/assemble.d.ts +25 -0
- package/dist/resolver/assemble.d.ts.map +1 -0
- package/dist/resolver/assemble.js +170 -0
- package/dist/resolver/assemble.js.map +1 -0
- package/dist/resolver/format-dispatch.d.ts +40 -0
- package/dist/resolver/format-dispatch.d.ts.map +1 -0
- package/dist/resolver/format-dispatch.js +51 -0
- package/dist/resolver/format-dispatch.js.map +1 -0
- package/dist/resolver/generated-detection.d.ts +48 -0
- package/dist/resolver/generated-detection.d.ts.map +1 -0
- package/dist/resolver/generated-detection.js +123 -0
- package/dist/resolver/generated-detection.js.map +1 -0
- package/dist/resolver/index.d.ts +26 -0
- package/dist/resolver/index.d.ts.map +1 -0
- package/dist/resolver/index.js +147 -0
- package/dist/resolver/index.js.map +1 -0
- package/dist/resolver/policy.d.ts +53 -0
- package/dist/resolver/policy.d.ts.map +1 -0
- package/dist/resolver/policy.js +99 -0
- package/dist/resolver/policy.js.map +1 -0
- package/dist/resolver/validation.d.ts +28 -0
- package/dist/resolver/validation.d.ts.map +1 -0
- package/dist/resolver/validation.js +96 -0
- package/dist/resolver/validation.js.map +1 -0
- package/dist/resolver.d.ts +18 -0
- package/dist/resolver.d.ts.map +1 -0
- package/dist/resolver.js +18 -0
- package/dist/resolver.js.map +1 -0
- package/dist/resolvers/cargo.d.ts +34 -0
- package/dist/resolvers/cargo.d.ts.map +1 -0
- package/dist/resolvers/cargo.js +262 -0
- package/dist/resolvers/cargo.js.map +1 -0
- package/dist/resolvers/css.d.ts +60 -0
- package/dist/resolvers/css.d.ts.map +1 -0
- package/dist/resolvers/css.js +531 -0
- package/dist/resolvers/css.js.map +1 -0
- package/dist/resolvers/dispatcher.d.ts +78 -0
- package/dist/resolvers/dispatcher.d.ts.map +1 -0
- package/dist/resolvers/dispatcher.js +290 -0
- package/dist/resolvers/dispatcher.js.map +1 -0
- package/dist/resolvers/dockerfile.d.ts +24 -0
- package/dist/resolvers/dockerfile.d.ts.map +1 -0
- package/dist/resolvers/dockerfile.js +221 -0
- package/dist/resolvers/dockerfile.js.map +1 -0
- package/dist/resolvers/dotenv.d.ts +27 -0
- package/dist/resolvers/dotenv.d.ts.map +1 -0
- package/dist/resolvers/dotenv.js +114 -0
- package/dist/resolvers/dotenv.js.map +1 -0
- package/dist/resolvers/imports.d.ts +63 -0
- package/dist/resolvers/imports.d.ts.map +1 -0
- package/dist/resolvers/imports.js +513 -0
- package/dist/resolvers/imports.js.map +1 -0
- package/dist/resolvers/json.d.ts +48 -0
- package/dist/resolvers/json.d.ts.map +1 -0
- package/dist/resolvers/json.js +363 -0
- package/dist/resolvers/json.js.map +1 -0
- package/dist/resolvers/lockfile-npm.d.ts +38 -0
- package/dist/resolvers/lockfile-npm.d.ts.map +1 -0
- package/dist/resolvers/lockfile-npm.js +267 -0
- package/dist/resolvers/lockfile-npm.js.map +1 -0
- package/dist/resolvers/lockfile-pnpm.d.ts +44 -0
- package/dist/resolvers/lockfile-pnpm.d.ts.map +1 -0
- package/dist/resolvers/lockfile-pnpm.js +277 -0
- package/dist/resolvers/lockfile-pnpm.js.map +1 -0
- package/dist/resolvers/lockfile-yarn.d.ts +40 -0
- package/dist/resolvers/lockfile-yarn.d.ts.map +1 -0
- package/dist/resolvers/lockfile-yarn.js +184 -0
- package/dist/resolvers/lockfile-yarn.js.map +1 -0
- package/dist/resolvers/markdown.d.ts +64 -0
- package/dist/resolvers/markdown.d.ts.map +1 -0
- package/dist/resolvers/markdown.js +335 -0
- package/dist/resolvers/markdown.js.map +1 -0
- package/dist/resolvers/vue.d.ts +65 -0
- package/dist/resolvers/vue.d.ts.map +1 -0
- package/dist/resolvers/vue.js +258 -0
- package/dist/resolvers/vue.js.map +1 -0
- package/dist/resolvers/yaml.d.ts +65 -0
- package/dist/resolvers/yaml.d.ts.map +1 -0
- package/dist/resolvers/yaml.js +405 -0
- package/dist/resolvers/yaml.js.map +1 -0
- package/dist/types.d.ts +256 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +8 -0
- package/dist/types.js.map +1 -0
- package/package.json +57 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"complex.d.ts","sourceRoot":"","sources":["../../src/patterns/complex.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAkC,aAAa,EAAE,MAAM,aAAa,CAAC;AAGjF,+DAA+D;AAC/D,QAAA,MAAM,OAAO,EAAE,aA2Bd,CAAC;AAEF,eAAe,OAAO,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { makeScore } from "./utils.js";
|
|
2
|
+
/** Fallback — s'applique toujours, placé en fin de registre */
|
|
3
|
+
const complex = {
|
|
4
|
+
type: "complex",
|
|
5
|
+
priority: 999,
|
|
6
|
+
requires: "both",
|
|
7
|
+
detect(_h) {
|
|
8
|
+
return true; // always matches — unreachable guard
|
|
9
|
+
},
|
|
10
|
+
confidence(_h) {
|
|
11
|
+
return makeScore(100, 100, 0, [], [
|
|
12
|
+
"Aucune heuristique automatique applicable",
|
|
13
|
+
"Les deux branches ont modifié le bloc de façon incompatible",
|
|
14
|
+
]);
|
|
15
|
+
},
|
|
16
|
+
explanation(_h) {
|
|
17
|
+
return "Conflit complexe nécessitant une résolution manuelle. Les deux branches ont modifié ce bloc différemment.";
|
|
18
|
+
},
|
|
19
|
+
passReason(_h) {
|
|
20
|
+
return "Aucun pattern automatique ne s'applique — résolution manuelle requise.";
|
|
21
|
+
},
|
|
22
|
+
failReason(_h) {
|
|
23
|
+
return ""; // ne peut pas échouer
|
|
24
|
+
},
|
|
25
|
+
};
|
|
26
|
+
export default complex;
|
|
27
|
+
//# sourceMappingURL=complex.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"complex.js","sourceRoot":"","sources":["../../src/patterns/complex.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEvC,+DAA+D;AAC/D,MAAM,OAAO,GAAkB;IAC7B,IAAI,EAAE,SAAS;IACf,QAAQ,EAAE,GAAG;IACb,QAAQ,EAAE,MAAM;IAEhB,MAAM,CAAC,EAAiB;QACtB,OAAO,IAAI,CAAC,CAAC,qCAAqC;IACpD,CAAC;IAED,UAAU,CAAC,EAAiB;QAC1B,OAAO,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,EAAE;YAChC,2CAA2C;YAC3C,6DAA6D;SAC9D,CAAC,CAAC;IACL,CAAC;IAED,WAAW,CAAC,EAAiB;QAC3B,OAAO,2GAA2G,CAAC;IACrH,CAAC;IAED,UAAU,CAAC,EAAiB;QAC1B,OAAO,wEAAwE,CAAC;IAClF,CAAC;IAED,UAAU,CAAC,EAAiB;QAC1B,OAAO,EAAE,CAAC,CAAC,sBAAsB;IACnC,CAAC;CACF,CAAC;AAEF,eAAe,OAAO,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delete-no-change.d.ts","sourceRoot":"","sources":["../../src/patterns/delete-no-change.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAkC,aAAa,EAAE,MAAM,aAAa,CAAC;AAGjF,QAAA,MAAM,cAAc,EAAE,aAgFrB,CAAC;AAEF,eAAe,cAAc,CAAC"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { makeScore } from "./utils.js";
|
|
2
|
+
const deleteNoChange = {
|
|
3
|
+
type: "delete_no_change",
|
|
4
|
+
priority: 20,
|
|
5
|
+
requires: "both",
|
|
6
|
+
detect(h) {
|
|
7
|
+
const hasBase = h.baseLines.length > 0;
|
|
8
|
+
if (hasBase) {
|
|
9
|
+
const baseText = h.baseLines.join("\n");
|
|
10
|
+
const oursText = h.oursLines.join("\n");
|
|
11
|
+
const theirsText = h.theirsLines.join("\n");
|
|
12
|
+
return ((h.oursLines.length === 0 && theirsText === baseText) ||
|
|
13
|
+
(h.theirsLines.length === 0 && oursText === baseText));
|
|
14
|
+
}
|
|
15
|
+
// diff2 fallback
|
|
16
|
+
return ((h.oursLines.length === 0 && h.theirsLines.length > 0) ||
|
|
17
|
+
(h.theirsLines.length === 0 && h.oursLines.length > 0));
|
|
18
|
+
},
|
|
19
|
+
confidence(h) {
|
|
20
|
+
const hasBase = h.baseLines.length > 0;
|
|
21
|
+
if (hasBase) {
|
|
22
|
+
const baseText = h.baseLines.join("\n");
|
|
23
|
+
const theirsText = h.theirsLines.join("\n");
|
|
24
|
+
const oursDeleted = h.oursLines.length === 0 && theirsText === baseText;
|
|
25
|
+
return makeScore(100, 5, 0, [
|
|
26
|
+
"Base disponible",
|
|
27
|
+
oursDeleted
|
|
28
|
+
? "Ours a supprimé, theirs identique à la base"
|
|
29
|
+
: "Theirs a supprimé, ours identique à la base",
|
|
30
|
+
], []);
|
|
31
|
+
}
|
|
32
|
+
return makeScore(60, 30, 0, [], [
|
|
33
|
+
"Sans base (diff2) — suppression non confirmée par rapport à l'ancêtre commun",
|
|
34
|
+
]);
|
|
35
|
+
},
|
|
36
|
+
explanation(h) {
|
|
37
|
+
const hasBase = h.baseLines.length > 0;
|
|
38
|
+
if (hasBase) {
|
|
39
|
+
const baseText = h.baseLines.join("\n");
|
|
40
|
+
const theirsText = h.theirsLines.join("\n");
|
|
41
|
+
if (h.oursLines.length === 0 && theirsText === baseText) {
|
|
42
|
+
return "La branche courante (ours) a supprimé ce bloc, l'autre ne l'a pas modifié. Résolution : supprimer.";
|
|
43
|
+
}
|
|
44
|
+
return "La branche entrante (theirs) a supprimé ce bloc, l'autre ne l'a pas modifié. Résolution : supprimer.";
|
|
45
|
+
}
|
|
46
|
+
if (h.oursLines.length === 0) {
|
|
47
|
+
return "La branche courante (ours) a supprimé ce bloc. Sans base, confiance moyenne. Résolution proposée : supprimer.";
|
|
48
|
+
}
|
|
49
|
+
return "La branche entrante (theirs) a supprimé ce bloc. Sans base, confiance moyenne. Résolution proposée : supprimer.";
|
|
50
|
+
},
|
|
51
|
+
passReason(h) {
|
|
52
|
+
const hasBase = h.baseLines.length > 0;
|
|
53
|
+
if (hasBase) {
|
|
54
|
+
const baseText = h.baseLines.join("\n");
|
|
55
|
+
const theirsText = h.theirsLines.join("\n");
|
|
56
|
+
if (h.oursLines.length === 0 && theirsText === baseText) {
|
|
57
|
+
return "Ours a supprimé le bloc (0 lignes) et theirs n'a pas modifié la base.";
|
|
58
|
+
}
|
|
59
|
+
return "Theirs a supprimé le bloc (0 lignes) et ours n'a pas modifié la base.";
|
|
60
|
+
}
|
|
61
|
+
if (h.oursLines.length === 0) {
|
|
62
|
+
return "Ours est vide (0 lignes) en diff2. Suppression probable mais incertaine sans base.";
|
|
63
|
+
}
|
|
64
|
+
return "Theirs est vide (0 lignes) en diff2. Suppression probable mais incertaine sans base.";
|
|
65
|
+
},
|
|
66
|
+
failReason(h) {
|
|
67
|
+
const hasBase = h.baseLines.length > 0;
|
|
68
|
+
if (hasBase) {
|
|
69
|
+
return "Ni ours ni theirs n'est une suppression unilatérale avec l'autre côté identique à la base.";
|
|
70
|
+
}
|
|
71
|
+
return "Ni ours ni theirs n'est vide en diff2 — pas de suppression unilatérale évidente.";
|
|
72
|
+
},
|
|
73
|
+
};
|
|
74
|
+
export default deleteNoChange;
|
|
75
|
+
//# sourceMappingURL=delete-no-change.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delete-no-change.js","sourceRoot":"","sources":["../../src/patterns/delete-no-change.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pattern `insertion_at_boundary` — v1.4
|
|
3
|
+
*
|
|
4
|
+
* Détecte les conflits où les deux branches ont uniquement ajouté des lignes
|
|
5
|
+
* par rapport à la base — sans suppression ni modification.
|
|
6
|
+
* Inspiré du comportement ORT merge (Git 2.34+).
|
|
7
|
+
*
|
|
8
|
+
* Cas typiques : liste de dépendances, tableau de routes, définitions d'enum,
|
|
9
|
+
* listes d'exports dans des fichiers partagés.
|
|
10
|
+
*
|
|
11
|
+
* Priority : 57 (après reorder_only, avant value_only_change)
|
|
12
|
+
* Requires : both (diff3 = haute confiance, diff2 = heuristique, confiance réduite)
|
|
13
|
+
*
|
|
14
|
+
* Relation avec non_overlapping (priority 40) :
|
|
15
|
+
* - non_overlapping traite les cas où le LCS 3-way merge réussit directement
|
|
16
|
+
* - insertion_at_boundary traite les cas où les insertions tombent au MÊME
|
|
17
|
+
* point de frontière (le LCS échoue) mais l'analyse sémantique réussit
|
|
18
|
+
*/
|
|
19
|
+
import type { PatternPlugin } from "../types.js";
|
|
20
|
+
declare const insertionAtBoundary: PatternPlugin;
|
|
21
|
+
export default insertionAtBoundary;
|
|
22
|
+
//# sourceMappingURL=insertion-at-boundary.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"insertion-at-boundary.d.ts","sourceRoot":"","sources":["../../src/patterns/insertion-at-boundary.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,KAAK,EAAkC,aAAa,EAAE,MAAM,aAAa,CAAC;AAoGjF,QAAA,MAAM,mBAAmB,EAAE,aA6D1B,CAAC;AAEF,eAAe,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pattern `insertion_at_boundary` — v1.4
|
|
3
|
+
*
|
|
4
|
+
* Détecte les conflits où les deux branches ont uniquement ajouté des lignes
|
|
5
|
+
* par rapport à la base — sans suppression ni modification.
|
|
6
|
+
* Inspiré du comportement ORT merge (Git 2.34+).
|
|
7
|
+
*
|
|
8
|
+
* Cas typiques : liste de dépendances, tableau de routes, définitions d'enum,
|
|
9
|
+
* listes d'exports dans des fichiers partagés.
|
|
10
|
+
*
|
|
11
|
+
* Priority : 57 (après reorder_only, avant value_only_change)
|
|
12
|
+
* Requires : both (diff3 = haute confiance, diff2 = heuristique, confiance réduite)
|
|
13
|
+
*
|
|
14
|
+
* Relation avec non_overlapping (priority 40) :
|
|
15
|
+
* - non_overlapping traite les cas où le LCS 3-way merge réussit directement
|
|
16
|
+
* - insertion_at_boundary traite les cas où les insertions tombent au MÊME
|
|
17
|
+
* point de frontière (le LCS échoue) mais l'analyse sémantique réussit
|
|
18
|
+
*/
|
|
19
|
+
import { scopeImpact, makeScore, normalizeLine } from "./utils.js";
|
|
20
|
+
// ─── LCS helpers ─────────────────────────────────────────────
|
|
21
|
+
/**
|
|
22
|
+
* Calcule la Longest Common Subsequence entre deux tableaux de lignes.
|
|
23
|
+
* Retourne les indices des lignes de `a` qui sont dans le LCS.
|
|
24
|
+
*/
|
|
25
|
+
function lcsIndices(a, b) {
|
|
26
|
+
const m = a.length;
|
|
27
|
+
const n = b.length;
|
|
28
|
+
// dp[i][j] = longueur du LCS de a[0..i-1] et b[0..j-1]
|
|
29
|
+
const dp = Array.from({ length: m + 1 }, () => new Array(n + 1).fill(0));
|
|
30
|
+
for (let i = 1; i <= m; i++) {
|
|
31
|
+
for (let j = 1; j <= n; j++) {
|
|
32
|
+
dp[i][j] = a[i - 1] === b[j - 1]
|
|
33
|
+
? dp[i - 1][j - 1] + 1
|
|
34
|
+
: Math.max(dp[i - 1][j], dp[i][j - 1]);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
// Backtrack pour récupérer les indices dans `a`
|
|
38
|
+
const inLcs = new Set();
|
|
39
|
+
let i = m;
|
|
40
|
+
let j = n;
|
|
41
|
+
while (i > 0 && j > 0) {
|
|
42
|
+
if (a[i - 1] === b[j - 1]) {
|
|
43
|
+
inLcs.add(i - 1);
|
|
44
|
+
i--;
|
|
45
|
+
j--;
|
|
46
|
+
}
|
|
47
|
+
else if (dp[i - 1][j] > dp[i][j - 1]) {
|
|
48
|
+
i--;
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
j--;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
return inLcs;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Retourne les lignes de `modified` qui ne sont pas dans le LCS avec `base`.
|
|
58
|
+
* Ces lignes sont les "additions" par rapport à la base.
|
|
59
|
+
*/
|
|
60
|
+
function lcsAdditions(base, modified) {
|
|
61
|
+
const lcs = lcsIndices(modified, base); // indices dans modified qui sont dans le LCS
|
|
62
|
+
return modified.filter((_, i) => !lcs.has(i));
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Retourne les lignes de `base` qui ne sont plus dans `modified`.
|
|
66
|
+
* Ces lignes sont les "suppressions" par rapport à la base.
|
|
67
|
+
*/
|
|
68
|
+
function lcsRemovals(base, modified) {
|
|
69
|
+
const lcs = lcsIndices(base, modified); // indices dans base qui sont dans le LCS
|
|
70
|
+
return base.filter((_, i) => !lcs.has(i));
|
|
71
|
+
}
|
|
72
|
+
/** Vérifie si deux tableaux ont des éléments communs */
|
|
73
|
+
function hasOverlap(a, b) {
|
|
74
|
+
const setA = new Set(a);
|
|
75
|
+
return b.some((l) => setA.has(l));
|
|
76
|
+
}
|
|
77
|
+
// ─── Heuristique diff2 ────────────────────────────────────────
|
|
78
|
+
/**
|
|
79
|
+
* En l'absence de base (diff2), on vérifie que les deux côtés sont
|
|
80
|
+
* des sur-ensembles l'un de l'autre (union sans suppression).
|
|
81
|
+
*/
|
|
82
|
+
/**
|
|
83
|
+
* Heuristique diff2 stricte : détecte uniquement le cas où un côté est
|
|
84
|
+
* un sous-ensemble de l'autre (tailles différentes).
|
|
85
|
+
* Exemple valide : ours = [A, B, C, NEW] et theirs = [A, B, C]
|
|
86
|
+
* → theirs est un sous-ensemble de ours → ours a inséré NEW.
|
|
87
|
+
*
|
|
88
|
+
* NON applicable quand les deux côtés ont la même taille (cas value_only_change)
|
|
89
|
+
* ou quand les lignes ne sont pas comparables par inclusion.
|
|
90
|
+
*/
|
|
91
|
+
function detectWithoutBase(h) {
|
|
92
|
+
const oursNorm = h.oursLines.map(normalizeLine).filter((l) => l.length > 0);
|
|
93
|
+
const theirsNorm = h.theirsLines.map(normalizeLine).filter((l) => l.length > 0);
|
|
94
|
+
if (oursNorm.length === 0 || theirsNorm.length === 0)
|
|
95
|
+
return false;
|
|
96
|
+
if (oursNorm.join("\n") === theirsNorm.join("\n"))
|
|
97
|
+
return false;
|
|
98
|
+
const oursSet = new Set(oursNorm);
|
|
99
|
+
const theirsSet = new Set(theirsNorm);
|
|
100
|
+
// Les tailles doivent différer : un côté a plus de lignes que l'autre
|
|
101
|
+
if (oursSet.size === theirsSet.size)
|
|
102
|
+
return false;
|
|
103
|
+
// Le plus petit doit être un sous-ensemble du plus grand
|
|
104
|
+
if (oursSet.size < theirsSet.size) {
|
|
105
|
+
return [...oursSet].every((l) => theirsSet.has(l));
|
|
106
|
+
}
|
|
107
|
+
else {
|
|
108
|
+
return [...theirsSet].every((l) => oursSet.has(l));
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
// ─── Plugin ──────────────────────────────────────────────────
|
|
112
|
+
const insertionAtBoundary = {
|
|
113
|
+
type: "insertion_at_boundary",
|
|
114
|
+
priority: 57,
|
|
115
|
+
requires: "both",
|
|
116
|
+
detect(h) {
|
|
117
|
+
const hasBase = h.baseLines.length > 0;
|
|
118
|
+
if (!hasBase) {
|
|
119
|
+
return detectWithoutBase(h);
|
|
120
|
+
}
|
|
121
|
+
// diff3 : vérifier qu'il n'y a que des ajouts (pas de suppressions)
|
|
122
|
+
const oursRemovals = lcsRemovals(h.baseLines, h.oursLines);
|
|
123
|
+
const theirsRemovals = lcsRemovals(h.baseLines, h.theirsLines);
|
|
124
|
+
const oursAdded = lcsAdditions(h.baseLines, h.oursLines);
|
|
125
|
+
const theirsAdded = lcsAdditions(h.baseLines, h.theirsLines);
|
|
126
|
+
return (oursRemovals.length === 0 &&
|
|
127
|
+
theirsRemovals.length === 0 &&
|
|
128
|
+
oursAdded.length > 0 &&
|
|
129
|
+
theirsAdded.length > 0 &&
|
|
130
|
+
!hasOverlap(oursAdded, theirsAdded));
|
|
131
|
+
},
|
|
132
|
+
confidence(h) {
|
|
133
|
+
const hasBase = h.baseLines.length > 0;
|
|
134
|
+
const totalLines = Math.max(h.oursLines.length, h.theirsLines.length);
|
|
135
|
+
if (hasBase) {
|
|
136
|
+
return makeScore(90, 8, scopeImpact(totalLines), [
|
|
137
|
+
"Insertions pures — base intacte des deux côtés",
|
|
138
|
+
], []);
|
|
139
|
+
}
|
|
140
|
+
return makeScore(68, 20, scopeImpact(totalLines), [], [
|
|
141
|
+
"Sans base (diff2) — heuristique d'union (−22)",
|
|
142
|
+
]);
|
|
143
|
+
},
|
|
144
|
+
explanation(h) {
|
|
145
|
+
const hasBase = h.baseLines.length > 0;
|
|
146
|
+
return hasBase
|
|
147
|
+
? "Les deux branches ont uniquement ajouté des lignes sans modifier la base. Résolution : union des insertions (ours en premier)."
|
|
148
|
+
: "Les deux branches semblent avoir uniquement ajouté des lignes (heuristique diff2). Résolution : union (ours en premier).";
|
|
149
|
+
},
|
|
150
|
+
passReason(h) {
|
|
151
|
+
const hasBase = h.baseLines.length > 0;
|
|
152
|
+
return hasBase
|
|
153
|
+
? "Aucune suppression des deux côtés, insertions distinctes — insertions pures confirmées par la base."
|
|
154
|
+
: "Heuristique diff2 : les deux côtés sont des sur-ensembles l'un de l'autre.";
|
|
155
|
+
},
|
|
156
|
+
failReason(h) {
|
|
157
|
+
const hasBase = h.baseLines.length > 0;
|
|
158
|
+
return hasBase
|
|
159
|
+
? "Au moins un côté a des suppressions ou des insertions qui se chevauchent."
|
|
160
|
+
: "La heuristique diff2 d'union échoue — des lignes sont présentes d'un côté mais absentes de l'autre de façon asymétrique.";
|
|
161
|
+
},
|
|
162
|
+
};
|
|
163
|
+
export default insertionAtBoundary;
|
|
164
|
+
//# sourceMappingURL=insertion-at-boundary.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"insertion-at-boundary.js","sourceRoot":"","sources":["../../src/patterns/insertion-at-boundary.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"non-overlapping.d.ts","sourceRoot":"","sources":["../../src/patterns/non-overlapping.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAkC,aAAa,EAAE,MAAM,aAAa,CAAC;AAIjF,QAAA,MAAM,cAAc,EAAE,aA4BrB,CAAC;AAEF,eAAe,cAAc,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { mergeNonOverlapping } from "../diff.js";
|
|
2
|
+
import { scopeImpact, makeScore } from "./utils.js";
|
|
3
|
+
const nonOverlapping = {
|
|
4
|
+
type: "non_overlapping",
|
|
5
|
+
priority: 40,
|
|
6
|
+
requires: "diff3",
|
|
7
|
+
detect(h) {
|
|
8
|
+
return mergeNonOverlapping(h.baseLines, h.oursLines, h.theirsLines) !== null;
|
|
9
|
+
},
|
|
10
|
+
confidence(h) {
|
|
11
|
+
const mergedSize = Math.max(h.oursLines.length, h.theirsLines.length);
|
|
12
|
+
return makeScore(90, 20, scopeImpact(mergedSize), [
|
|
13
|
+
"Base disponible",
|
|
14
|
+
"Merge LCS 3-way réussi sans chevauchement",
|
|
15
|
+
], []);
|
|
16
|
+
},
|
|
17
|
+
explanation(_h) {
|
|
18
|
+
return "Les deux branches ont modifié des zones différentes du même bloc. Fusion automatique possible.";
|
|
19
|
+
},
|
|
20
|
+
passReason(_h) {
|
|
21
|
+
return "Le merge 3-way LCS a réussi sans conflit — les modifications ne se chevauchent pas.";
|
|
22
|
+
},
|
|
23
|
+
failReason(_h) {
|
|
24
|
+
return "Le merge 3-way LCS détecte un chevauchement — les deux branches ont modifié les mêmes lignes.";
|
|
25
|
+
},
|
|
26
|
+
};
|
|
27
|
+
export default nonOverlapping;
|
|
28
|
+
//# sourceMappingURL=non-overlapping.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"non-overlapping.js","sourceRoot":"","sources":["../../src/patterns/non-overlapping.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEpD,MAAM,cAAc,GAAkB;IACpC,IAAI,EAAE,iBAAiB;IACvB,QAAQ,EAAE,EAAE;IACZ,QAAQ,EAAE,OAAO;IAEjB,MAAM,CAAC,CAAgB;QACrB,OAAO,mBAAmB,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,WAAW,CAAC,KAAK,IAAI,CAAC;IAC/E,CAAC;IAED,UAAU,CAAC,CAAgB;QACzB,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QACtE,OAAO,SAAS,CAAC,EAAE,EAAE,EAAE,EAAE,WAAW,CAAC,UAAU,CAAC,EAAE;YAChD,iBAAiB;YACjB,2CAA2C;SAC5C,EAAE,EAAE,CAAC,CAAC;IACT,CAAC;IAED,WAAW,CAAC,EAAiB;QAC3B,OAAO,gGAAgG,CAAC;IAC1G,CAAC;IAED,UAAU,CAAC,EAAiB;QAC1B,OAAO,qFAAqF,CAAC;IAC/F,CAAC;IAED,UAAU,CAAC,EAAiB;QAC1B,OAAO,+FAA+F,CAAC;IACzG,CAAC;CACF,CAAC;AAEF,eAAe,cAAc,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"one-side-change.d.ts","sourceRoot":"","sources":["../../src/patterns/one-side-change.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAkC,aAAa,EAAE,MAAM,aAAa,CAAC;AAGjF,QAAA,MAAM,aAAa,EAAE,aA8CpB,CAAC;AAEF,eAAe,aAAa,CAAC"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { scopeImpact, makeScore } from "./utils.js";
|
|
2
|
+
const oneSideChange = {
|
|
3
|
+
type: "one_side_change",
|
|
4
|
+
priority: 30,
|
|
5
|
+
requires: "diff3",
|
|
6
|
+
detect(h) {
|
|
7
|
+
const baseText = h.baseLines.join("\n");
|
|
8
|
+
const oursText = h.oursLines.join("\n");
|
|
9
|
+
const theirsText = h.theirsLines.join("\n");
|
|
10
|
+
const oursMatchesBase = oursText === baseText;
|
|
11
|
+
const theirsMatchesBase = theirsText === baseText;
|
|
12
|
+
return (oursMatchesBase && !theirsMatchesBase) || (!oursMatchesBase && theirsMatchesBase);
|
|
13
|
+
},
|
|
14
|
+
confidence(h) {
|
|
15
|
+
const baseText = h.baseLines.join("\n");
|
|
16
|
+
const oursText = h.oursLines.join("\n");
|
|
17
|
+
const oursMatchesBase = oursText === baseText;
|
|
18
|
+
const changedLines = oursMatchesBase ? h.theirsLines.length : h.oursLines.length;
|
|
19
|
+
return makeScore(100, 0, scopeImpact(changedLines), [
|
|
20
|
+
"Base disponible",
|
|
21
|
+
oursMatchesBase ? "Seul theirs a modifié le bloc" : "Seul ours a modifié le bloc",
|
|
22
|
+
], []);
|
|
23
|
+
},
|
|
24
|
+
explanation(h) {
|
|
25
|
+
const oursText = h.oursLines.join("\n");
|
|
26
|
+
const baseText = h.baseLines.join("\n");
|
|
27
|
+
if (oursText === baseText) {
|
|
28
|
+
return "Seule la branche entrante (theirs) a modifié ce bloc. Résolution : accepter theirs.";
|
|
29
|
+
}
|
|
30
|
+
return "Seule la branche courante (ours) a modifié ce bloc. Résolution : accepter ours.";
|
|
31
|
+
},
|
|
32
|
+
passReason(h) {
|
|
33
|
+
const oursText = h.oursLines.join("\n");
|
|
34
|
+
const baseText = h.baseLines.join("\n");
|
|
35
|
+
if (oursText === baseText) {
|
|
36
|
+
return "Ours est identique à la base, seul theirs a changé.";
|
|
37
|
+
}
|
|
38
|
+
return "Theirs est identique à la base, seul ours a changé.";
|
|
39
|
+
},
|
|
40
|
+
failReason(_h) {
|
|
41
|
+
return "Les deux branches ont modifié le bloc par rapport à la base.";
|
|
42
|
+
},
|
|
43
|
+
};
|
|
44
|
+
export default oneSideChange;
|
|
45
|
+
//# sourceMappingURL=one-side-change.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"one-side-change.js","sourceRoot":"","sources":["../../src/patterns/one-side-change.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEpD,MAAM,aAAa,GAAkB;IACnC,IAAI,EAAE,iBAAiB;IACvB,QAAQ,EAAE,EAAE;IACZ,QAAQ,EAAE,OAAO;IAEjB,MAAM,CAAC,CAAgB;QACrB,MAAM,QAAQ,GAAG,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACxC,MAAM,QAAQ,GAAG,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACxC,MAAM,UAAU,GAAG,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC5C,MAAM,eAAe,GAAG,QAAQ,KAAK,QAAQ,CAAC;QAC9C,MAAM,iBAAiB,GAAG,UAAU,KAAK,QAAQ,CAAC;QAClD,OAAO,CAAC,eAAe,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,eAAe,IAAI,iBAAiB,CAAC,CAAC;IAC5F,CAAC;IAED,UAAU,CAAC,CAAgB;QACzB,MAAM,QAAQ,GAAG,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACxC,MAAM,QAAQ,GAAG,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACxC,MAAM,eAAe,GAAG,QAAQ,KAAK,QAAQ,CAAC;QAC9C,MAAM,YAAY,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC;QACjF,OAAO,SAAS,CAAC,GAAG,EAAE,CAAC,EAAE,WAAW,CAAC,YAAY,CAAC,EAAE;YAClD,iBAAiB;YACjB,eAAe,CAAC,CAAC,CAAC,+BAA+B,CAAC,CAAC,CAAC,6BAA6B;SAClF,EAAE,EAAE,CAAC,CAAC;IACT,CAAC;IAED,WAAW,CAAC,CAAgB;QAC1B,MAAM,QAAQ,GAAG,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACxC,MAAM,QAAQ,GAAG,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACxC,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;YAC1B,OAAO,qFAAqF,CAAC;QAC/F,CAAC;QACD,OAAO,iFAAiF,CAAC;IAC3F,CAAC;IAED,UAAU,CAAC,CAAgB;QACzB,MAAM,QAAQ,GAAG,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACxC,MAAM,QAAQ,GAAG,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACxC,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;YAC1B,OAAO,qDAAqD,CAAC;QAC/D,CAAC;QACD,OAAO,qDAAqD,CAAC;IAC/D,CAAC;IAED,UAAU,CAAC,EAAiB;QAC1B,OAAO,8DAA8D,CAAC;IACxE,CAAC;CACF,CAAC;AAEF,eAAe,aAAa,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pattern `reorder_only` — v1.4
|
|
3
|
+
*
|
|
4
|
+
* Détecte les conflits où les deux branches contiennent exactement les mêmes
|
|
5
|
+
* lignes mais dans un ordre différent. Cas typiques : imports triés
|
|
6
|
+
* alphabétiquement, clés de config réorganisées, listes d'exports réordonnées.
|
|
7
|
+
*
|
|
8
|
+
* Priority : 55 (après whitespace_only, avant value_only_change)
|
|
9
|
+
* Requires : both (fonctionne avec ou sans base)
|
|
10
|
+
*/
|
|
11
|
+
import type { PatternPlugin } from "../types.js";
|
|
12
|
+
declare const reorderOnly: PatternPlugin;
|
|
13
|
+
export default reorderOnly;
|
|
14
|
+
//# sourceMappingURL=reorder-only.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reorder-only.d.ts","sourceRoot":"","sources":["../../src/patterns/reorder-only.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAkC,aAAa,EAAE,MAAM,aAAa,CAAC;AA+BjF,QAAA,MAAM,WAAW,EAAE,aA8ClB,CAAC;AAEF,eAAe,WAAW,CAAC"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pattern `reorder_only` — v1.4
|
|
3
|
+
*
|
|
4
|
+
* Détecte les conflits où les deux branches contiennent exactement les mêmes
|
|
5
|
+
* lignes mais dans un ordre différent. Cas typiques : imports triés
|
|
6
|
+
* alphabétiquement, clés de config réorganisées, listes d'exports réordonnées.
|
|
7
|
+
*
|
|
8
|
+
* Priority : 55 (après whitespace_only, avant value_only_change)
|
|
9
|
+
* Requires : both (fonctionne avec ou sans base)
|
|
10
|
+
*/
|
|
11
|
+
import { scopeImpact, makeScore, normalizeLine } from "./utils.js";
|
|
12
|
+
// ─── Helpers ─────────────────────────────────────────────────
|
|
13
|
+
/**
|
|
14
|
+
* Vérifie si deux tableaux sont des multisets égaux (même éléments, peu importe l'ordre).
|
|
15
|
+
* Gère correctement les lignes dupliquées.
|
|
16
|
+
*/
|
|
17
|
+
function isMultisetEqual(a, b) {
|
|
18
|
+
if (a.length !== b.length)
|
|
19
|
+
return false;
|
|
20
|
+
const freq = new Map();
|
|
21
|
+
for (const l of a)
|
|
22
|
+
freq.set(l, (freq.get(l) ?? 0) + 1);
|
|
23
|
+
for (const l of b) {
|
|
24
|
+
const n = freq.get(l);
|
|
25
|
+
if (!n)
|
|
26
|
+
return false;
|
|
27
|
+
n === 1 ? freq.delete(l) : freq.set(l, n - 1);
|
|
28
|
+
}
|
|
29
|
+
return freq.size === 0;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Compte les lignes dupliquées dans un tableau normalisé.
|
|
33
|
+
* Retourne vrai si au moins une ligne apparaît plus d'une fois.
|
|
34
|
+
*/
|
|
35
|
+
function hasDuplicates(lines) {
|
|
36
|
+
return new Set(lines).size !== lines.length;
|
|
37
|
+
}
|
|
38
|
+
// ─── Plugin ──────────────────────────────────────────────────
|
|
39
|
+
const reorderOnly = {
|
|
40
|
+
type: "reorder_only",
|
|
41
|
+
priority: 55,
|
|
42
|
+
requires: "both",
|
|
43
|
+
detect(h) {
|
|
44
|
+
const ours = h.oursLines.map(normalizeLine).filter((l) => l.length > 0);
|
|
45
|
+
const theirs = h.theirsLines.map(normalizeLine).filter((l) => l.length > 0);
|
|
46
|
+
if (ours.length === 0 || theirs.length === 0)
|
|
47
|
+
return false;
|
|
48
|
+
// Les deux listes doivent être des permutations l'une de l'autre
|
|
49
|
+
// mais pas identiques (same_change aurait déjà matchéi)
|
|
50
|
+
if (ours.join("\n") === theirs.join("\n"))
|
|
51
|
+
return false;
|
|
52
|
+
return isMultisetEqual(ours, theirs);
|
|
53
|
+
},
|
|
54
|
+
confidence(h) {
|
|
55
|
+
const ours = h.oursLines.map(normalizeLine).filter((l) => l.length > 0);
|
|
56
|
+
const duplicates = hasDuplicates(ours);
|
|
57
|
+
const si = scopeImpact(h.oursLines.length);
|
|
58
|
+
const boosters = ["Permutation pure — mêmes lignes, ordre différent"];
|
|
59
|
+
const penalties = [];
|
|
60
|
+
if (duplicates) {
|
|
61
|
+
penalties.push("Lignes dupliquées — ordre ambigu (−10)");
|
|
62
|
+
}
|
|
63
|
+
// typeClassification 92 sauf si doublons (−10 → 82)
|
|
64
|
+
const tc = duplicates ? 82 : 92;
|
|
65
|
+
return makeScore(tc, 5, si, boosters, penalties);
|
|
66
|
+
},
|
|
67
|
+
explanation(h) {
|
|
68
|
+
const hasBase = h.baseLines.length > 0;
|
|
69
|
+
return hasBase
|
|
70
|
+
? "Les deux branches contiennent les mêmes lignes dans un ordre différent. Résolution : accepter l'ordre theirs (ou ours si la base correspond à theirs)."
|
|
71
|
+
: "Les deux branches contiennent les mêmes lignes dans un ordre différent. Résolution : accepter l'ordre theirs.";
|
|
72
|
+
},
|
|
73
|
+
passReason(_h) {
|
|
74
|
+
return "Les deux côtés sont des permutations l'un de l'autre — mêmes lignes, ordre différent.";
|
|
75
|
+
},
|
|
76
|
+
failReason(_h) {
|
|
77
|
+
return "Les lignes ne sont pas une simple permutation — des ajouts ou suppressions sont présents.";
|
|
78
|
+
},
|
|
79
|
+
};
|
|
80
|
+
export default reorderOnly;
|
|
81
|
+
//# sourceMappingURL=reorder-only.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reorder-only.js","sourceRoot":"","sources":["../../src/patterns/reorder-only.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"same-change.d.ts","sourceRoot":"","sources":["../../src/patterns/same-change.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAkC,aAAa,EAAE,MAAM,aAAa,CAAC;AAGjF,QAAA,MAAM,UAAU,EAAE,aA0BjB,CAAC;AAEF,eAAe,UAAU,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { scopeImpact, makeScore } from "./utils.js";
|
|
2
|
+
const sameChange = {
|
|
3
|
+
type: "same_change",
|
|
4
|
+
priority: 10,
|
|
5
|
+
requires: "both",
|
|
6
|
+
detect(h) {
|
|
7
|
+
return h.oursLines.join("\n") === h.theirsLines.join("\n");
|
|
8
|
+
},
|
|
9
|
+
confidence(h) {
|
|
10
|
+
return makeScore(100, 0, scopeImpact(h.oursLines.length), [
|
|
11
|
+
"Les deux branches ont exactement le même contenu",
|
|
12
|
+
], []);
|
|
13
|
+
},
|
|
14
|
+
explanation(_h) {
|
|
15
|
+
return "Les deux branches ont effectué exactement la même modification.";
|
|
16
|
+
},
|
|
17
|
+
passReason(_h) {
|
|
18
|
+
return "Les deux branches ont exactement le même contenu — modification identique des deux côtés.";
|
|
19
|
+
},
|
|
20
|
+
failReason(_h) {
|
|
21
|
+
return "Les deux branches ont des contenus différents.";
|
|
22
|
+
},
|
|
23
|
+
};
|
|
24
|
+
export default sameChange;
|
|
25
|
+
//# sourceMappingURL=same-change.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"same-change.js","sourceRoot":"","sources":["../../src/patterns/same-change.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEpD,MAAM,UAAU,GAAkB;IAChC,IAAI,EAAE,aAAa;IACnB,QAAQ,EAAE,EAAE;IACZ,QAAQ,EAAE,MAAM;IAEhB,MAAM,CAAC,CAAgB;QACrB,OAAO,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC7D,CAAC;IAED,UAAU,CAAC,CAAgB;QACzB,OAAO,SAAS,CAAC,GAAG,EAAE,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE;YACxD,kDAAkD;SACnD,EAAE,EAAE,CAAC,CAAC;IACT,CAAC;IAED,WAAW,CAAC,EAAiB;QAC3B,OAAO,iEAAiE,CAAC;IAC3E,CAAC;IAED,UAAU,CAAC,EAAiB;QAC1B,OAAO,2FAA2F,CAAC;IACrG,CAAC;IAED,UAAU,CAAC,EAAiB;QAC1B,OAAO,gDAAgD,CAAC;IAC1D,CAAC;CACF,CAAC;AAEF,eAAe,UAAU,CAAC"}
|