@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,96 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Post-merge validation (Phase 7.2).
|
|
3
|
+
*
|
|
4
|
+
* Vérifie que le contenu fusionné ne laisse pas de marqueurs de conflit
|
|
5
|
+
* résiduels et, pour les formats structurés (JSON/JSONC, YAML, TOML),
|
|
6
|
+
* qu'il reste syntaxiquement valide. Extrait de `resolver.ts` lors du
|
|
7
|
+
* split P1.1, puis étendu YAML/TOML en P2.5.
|
|
8
|
+
*/
|
|
9
|
+
import * as YAML from "yaml";
|
|
10
|
+
import { parse as parseToml } from "smol-toml";
|
|
11
|
+
/** Patterns de marqueurs de conflit résiduels. */
|
|
12
|
+
export const RESIDUAL_MARKER_PATTERNS = [
|
|
13
|
+
/^<{7}\s/, // <<<<<<< ours
|
|
14
|
+
/^>{7}\s/, // >>>>>>> theirs
|
|
15
|
+
/^\|{7}\s/, // ||||||| base
|
|
16
|
+
/^={7}$/, // =======
|
|
17
|
+
];
|
|
18
|
+
/** Détecte le format structuré à partir de l'extension du fichier. */
|
|
19
|
+
function detectFormat(filePath) {
|
|
20
|
+
if (/\.json(c)?$/i.test(filePath))
|
|
21
|
+
return "json";
|
|
22
|
+
if (/\.ya?ml$/i.test(filePath))
|
|
23
|
+
return "yaml";
|
|
24
|
+
if (/\.toml$/i.test(filePath))
|
|
25
|
+
return "toml";
|
|
26
|
+
return null;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Parse le contenu selon le format détecté. Retourne `null` si OK,
|
|
30
|
+
* sinon un message d'erreur préfixé par le format (ex: "YAML: ...").
|
|
31
|
+
*
|
|
32
|
+
* Le préfixe permet de savoir quel parser a échoué sans avoir à
|
|
33
|
+
* enrichir le type `ValidationResult` — `syntaxError: string | null`
|
|
34
|
+
* reste le contrat public.
|
|
35
|
+
*/
|
|
36
|
+
function tryParse(content, format) {
|
|
37
|
+
if (format === null)
|
|
38
|
+
return null;
|
|
39
|
+
try {
|
|
40
|
+
switch (format) {
|
|
41
|
+
case "json":
|
|
42
|
+
JSON.parse(content);
|
|
43
|
+
return null;
|
|
44
|
+
case "yaml":
|
|
45
|
+
// `yaml.parse` échoue dur sur les erreurs de syntaxe (vs `parseDocument`
|
|
46
|
+
// qui les accumule). On veut un fail-fast équivalent à JSON.parse.
|
|
47
|
+
YAML.parse(content);
|
|
48
|
+
return null;
|
|
49
|
+
case "toml":
|
|
50
|
+
parseToml(content);
|
|
51
|
+
return null;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
catch (err) {
|
|
55
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
56
|
+
return `${format.toUpperCase()}: ${msg}`;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Valide le contenu fusionné pour détecter les problèmes résiduels.
|
|
61
|
+
*
|
|
62
|
+
* Vérifie :
|
|
63
|
+
* 1. Marqueurs de conflit résiduels (indique une résolution incomplète)
|
|
64
|
+
* 2. Erreurs de syntaxe pour les formats structurés :
|
|
65
|
+
* - JSON/JSONC (`.json`, `.jsonc`)
|
|
66
|
+
* - YAML (`.yaml`, `.yml`)
|
|
67
|
+
* - TOML (`.toml`)
|
|
68
|
+
*
|
|
69
|
+
* @param content - Contenu fusionné à valider
|
|
70
|
+
* @param filePath - Chemin du fichier (pour détecter le type)
|
|
71
|
+
*/
|
|
72
|
+
export function validateMergedContent(content, filePath) {
|
|
73
|
+
// 1. Détection de marqueurs résiduels
|
|
74
|
+
const lines = content.split("\n");
|
|
75
|
+
const residualMarkerLines = [];
|
|
76
|
+
for (let i = 0; i < lines.length; i++) {
|
|
77
|
+
const line = lines[i];
|
|
78
|
+
if (RESIDUAL_MARKER_PATTERNS.some((p) => p.test(line))) {
|
|
79
|
+
residualMarkerLines.push(i + 1); // 1-indexed
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
const hasResidualMarkers = residualMarkerLines.length > 0;
|
|
83
|
+
// 2. Validation syntaxique pour formats structurés
|
|
84
|
+
const format = detectFormat(filePath);
|
|
85
|
+
const syntaxError = tryParse(content, format);
|
|
86
|
+
const isValid = !hasResidualMarkers && syntaxError === null;
|
|
87
|
+
return { hasResidualMarkers, residualMarkerLines, syntaxError, isValid };
|
|
88
|
+
}
|
|
89
|
+
/** Validation vide (pour les cas où le contenu n'est pas encore fusionné). */
|
|
90
|
+
export const EMPTY_VALIDATION = {
|
|
91
|
+
hasResidualMarkers: false,
|
|
92
|
+
residualMarkerLines: [],
|
|
93
|
+
syntaxError: null,
|
|
94
|
+
isValid: true,
|
|
95
|
+
};
|
|
96
|
+
//# sourceMappingURL=validation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.js","sourceRoot":"","sources":["../../src/resolver/validation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GitWand Conflict Resolver — re-export shim.
|
|
3
|
+
*
|
|
4
|
+
* L'implémentation a été éclatée (P1.1) dans le dossier `resolver/` :
|
|
5
|
+
*
|
|
6
|
+
* - `resolver/validation.ts` — Phase 7.2 : marqueurs résiduels + JSON
|
|
7
|
+
* - `resolver/generated-detection.ts` — lockfiles/bundles + stripVolatileValues
|
|
8
|
+
* - `resolver/policy.ts` — DEFAULT_OPTIONS, politique effective,
|
|
9
|
+
* seuil de confiance, pénalité v1.4
|
|
10
|
+
* - `resolver/format-dispatch.ts` — Phase 7.3 : résolveurs spécialisés
|
|
11
|
+
* - `resolver/assemble.ts` — moteur textuel (switch par ConflictType)
|
|
12
|
+
* - `resolver/index.ts` — orchestration + `resolve()` public
|
|
13
|
+
*
|
|
14
|
+
* Ce shim existe pour ne rien casser côté consommateurs : de nombreux
|
|
15
|
+
* tests et modules importent `resolve` depuis `../resolver.js`.
|
|
16
|
+
*/
|
|
17
|
+
export { resolve } from "./resolver/index.js";
|
|
18
|
+
//# sourceMappingURL=resolver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolver.d.ts","sourceRoot":"","sources":["../src/resolver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC"}
|
package/dist/resolver.js
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GitWand Conflict Resolver — re-export shim.
|
|
3
|
+
*
|
|
4
|
+
* L'implémentation a été éclatée (P1.1) dans le dossier `resolver/` :
|
|
5
|
+
*
|
|
6
|
+
* - `resolver/validation.ts` — Phase 7.2 : marqueurs résiduels + JSON
|
|
7
|
+
* - `resolver/generated-detection.ts` — lockfiles/bundles + stripVolatileValues
|
|
8
|
+
* - `resolver/policy.ts` — DEFAULT_OPTIONS, politique effective,
|
|
9
|
+
* seuil de confiance, pénalité v1.4
|
|
10
|
+
* - `resolver/format-dispatch.ts` — Phase 7.3 : résolveurs spécialisés
|
|
11
|
+
* - `resolver/assemble.ts` — moteur textuel (switch par ConflictType)
|
|
12
|
+
* - `resolver/index.ts` — orchestration + `resolve()` public
|
|
13
|
+
*
|
|
14
|
+
* Ce shim existe pour ne rien casser côté consommateurs : de nombreux
|
|
15
|
+
* tests et modules importent `resolve` depuis `../resolver.js`.
|
|
16
|
+
*/
|
|
17
|
+
export { resolve } from "./resolver/index.js";
|
|
18
|
+
//# sourceMappingURL=resolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolver.js","sourceRoot":"","sources":["../src/resolver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GitWand — Resolver Cargo.toml / Cargo.lock (v1.4)
|
|
3
|
+
*
|
|
4
|
+
* Parser TOML maison limité aux sections pertinentes pour la résolution
|
|
5
|
+
* de conflits. Zéro dépendance externe.
|
|
6
|
+
*
|
|
7
|
+
* ## Cargo.toml
|
|
8
|
+
* Stratégie par section :
|
|
9
|
+
* - [dependencies], [dev-dependencies], [build-dependencies] → merge par crate name (union)
|
|
10
|
+
* - [package] → clé par clé, `version` délègue à value_only_change
|
|
11
|
+
* - [features] → merge des listes de features comme des sets (union)
|
|
12
|
+
* - [workspace.members/dependencies] → même que dependencies
|
|
13
|
+
* - Autres sections → fallback si les deux côtés les ont modifiées
|
|
14
|
+
*
|
|
15
|
+
* ## Cargo.lock
|
|
16
|
+
* - Parse les blocs `[[package]]` par clé `name@version`
|
|
17
|
+
* - Union par clé ; en cas de conflit sur la même clé → prefer theirs
|
|
18
|
+
*/
|
|
19
|
+
type FormatResult = {
|
|
20
|
+
lines: string[] | null;
|
|
21
|
+
reason: string;
|
|
22
|
+
};
|
|
23
|
+
/**
|
|
24
|
+
* Tente de résoudre un conflit dans un fichier Cargo.toml.
|
|
25
|
+
* Retourne les lignes fusionnées ou null si fallback nécessaire.
|
|
26
|
+
*/
|
|
27
|
+
export declare function tryResolveCargoTomlConflict(_baseLines: string[], oursLines: string[], theirsLines: string[]): FormatResult;
|
|
28
|
+
/**
|
|
29
|
+
* Tente de résoudre un conflit dans un fichier Cargo.lock.
|
|
30
|
+
*/
|
|
31
|
+
export declare function tryResolveCargoLockConflict(_baseLines: string[], oursLines: string[], theirsLines: string[]): FormatResult;
|
|
32
|
+
export declare function tryResolveCargoConflict(filePath: string, baseLines: string[], oursLines: string[], theirsLines: string[]): FormatResult;
|
|
33
|
+
export {};
|
|
34
|
+
//# sourceMappingURL=cargo.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cargo.d.ts","sourceRoot":"","sources":["../../src/resolvers/cargo.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAiBH,KAAK,YAAY,GAAG;IAAE,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAoF/D;;;GAGG;AACH,wBAAgB,2BAA2B,CACzC,UAAU,EAAE,MAAM,EAAE,EACpB,SAAS,EAAE,MAAM,EAAE,EACnB,WAAW,EAAE,MAAM,EAAE,GACpB,YAAY,CAiFd;AAyDD;;GAEG;AACH,wBAAgB,2BAA2B,CACzC,UAAU,EAAE,MAAM,EAAE,EACpB,SAAS,EAAE,MAAM,EAAE,EACnB,WAAW,EAAE,MAAM,EAAE,GACpB,YAAY,CAmCd;AAID,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EAAE,EACnB,SAAS,EAAE,MAAM,EAAE,EACnB,WAAW,EAAE,MAAM,EAAE,GACpB,YAAY,CAKd"}
|
|
@@ -0,0 +1,262 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GitWand — Resolver Cargo.toml / Cargo.lock (v1.4)
|
|
3
|
+
*
|
|
4
|
+
* Parser TOML maison limité aux sections pertinentes pour la résolution
|
|
5
|
+
* de conflits. Zéro dépendance externe.
|
|
6
|
+
*
|
|
7
|
+
* ## Cargo.toml
|
|
8
|
+
* Stratégie par section :
|
|
9
|
+
* - [dependencies], [dev-dependencies], [build-dependencies] → merge par crate name (union)
|
|
10
|
+
* - [package] → clé par clé, `version` délègue à value_only_change
|
|
11
|
+
* - [features] → merge des listes de features comme des sets (union)
|
|
12
|
+
* - [workspace.members/dependencies] → même que dependencies
|
|
13
|
+
* - Autres sections → fallback si les deux côtés les ont modifiées
|
|
14
|
+
*
|
|
15
|
+
* ## Cargo.lock
|
|
16
|
+
* - Parse les blocs `[[package]]` par clé `name@version`
|
|
17
|
+
* - Union par clé ; en cas de conflit sur la même clé → prefer theirs
|
|
18
|
+
*/
|
|
19
|
+
// ─── Parser TOML minimal ──────────────────────────────────────
|
|
20
|
+
/** Détermine si une ligne est un header de section TOML */
|
|
21
|
+
function isSectionHeader(line) {
|
|
22
|
+
return /^\[/.test(line.trim());
|
|
23
|
+
}
|
|
24
|
+
/** Parse un bloc de lignes TOML en sections */
|
|
25
|
+
function parseTomlSections(lines) {
|
|
26
|
+
const sections = [];
|
|
27
|
+
let current = null;
|
|
28
|
+
for (const line of lines) {
|
|
29
|
+
const trimmed = line.trim();
|
|
30
|
+
if (isSectionHeader(trimmed)) {
|
|
31
|
+
if (current)
|
|
32
|
+
sections.push(current);
|
|
33
|
+
current = { header: trimmed, headerLine: line, entries: [], raw: [line] };
|
|
34
|
+
}
|
|
35
|
+
else if (current) {
|
|
36
|
+
current.raw.push(line);
|
|
37
|
+
if (trimmed && !trimmed.startsWith("#")) {
|
|
38
|
+
const eqIdx = line.indexOf("=");
|
|
39
|
+
if (eqIdx > 0) {
|
|
40
|
+
const key = line.slice(0, eqIdx).trim();
|
|
41
|
+
const value = line.slice(eqIdx + 1).trim();
|
|
42
|
+
current.entries.push({ key, value, raw: line });
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
// Lignes avant la première section (commentaires, etc.)
|
|
48
|
+
if (!current) {
|
|
49
|
+
current = { header: "", headerLine: "", entries: [], raw: [line] };
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
if (current)
|
|
54
|
+
sections.push(current);
|
|
55
|
+
return sections;
|
|
56
|
+
}
|
|
57
|
+
// ─── Cargo.toml resolver ──────────────────────────────────────
|
|
58
|
+
/** Sections de dépendances Cargo connues */
|
|
59
|
+
const DEP_SECTIONS = new Set([
|
|
60
|
+
"[dependencies]",
|
|
61
|
+
"[dev-dependencies]",
|
|
62
|
+
"[build-dependencies]",
|
|
63
|
+
"[workspace.dependencies]",
|
|
64
|
+
]);
|
|
65
|
+
const FEATURE_SECTIONS = new Set([
|
|
66
|
+
"[features]",
|
|
67
|
+
]);
|
|
68
|
+
const PACKAGE_SECTIONS = new Set([
|
|
69
|
+
"[package]",
|
|
70
|
+
]);
|
|
71
|
+
const WORKSPACE_SECTIONS = new Set([
|
|
72
|
+
"[workspace]",
|
|
73
|
+
"[workspace.members]",
|
|
74
|
+
]);
|
|
75
|
+
/**
|
|
76
|
+
* Fusionne deux sections de dépendances : union par nom de crate.
|
|
77
|
+
* Si un crate apparaît des deux côtés avec des versions différentes → prefer theirs.
|
|
78
|
+
*/
|
|
79
|
+
function mergeDependencySections(oursEntries, theirsEntries) {
|
|
80
|
+
const merged = new Map();
|
|
81
|
+
// ours d'abord
|
|
82
|
+
for (const e of oursEntries) {
|
|
83
|
+
merged.set(e.key, e);
|
|
84
|
+
}
|
|
85
|
+
// theirs : écrase en cas de conflit (prefer theirs)
|
|
86
|
+
for (const e of theirsEntries) {
|
|
87
|
+
merged.set(e.key, e);
|
|
88
|
+
}
|
|
89
|
+
return [...merged.values()];
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Tente de résoudre un conflit dans un fichier Cargo.toml.
|
|
93
|
+
* Retourne les lignes fusionnées ou null si fallback nécessaire.
|
|
94
|
+
*/
|
|
95
|
+
export function tryResolveCargoTomlConflict(_baseLines, oursLines, theirsLines) {
|
|
96
|
+
const oursSections = parseTomlSections(oursLines);
|
|
97
|
+
const theirsSections = parseTomlSections(theirsLines);
|
|
98
|
+
// Indexer les sections de theirs par header
|
|
99
|
+
const theirsIndex = new Map();
|
|
100
|
+
for (const s of theirsSections) {
|
|
101
|
+
theirsIndex.set(s.header, s);
|
|
102
|
+
}
|
|
103
|
+
const result = [];
|
|
104
|
+
for (const oursSection of oursSections) {
|
|
105
|
+
const theirsSection = theirsIndex.get(oursSection.header);
|
|
106
|
+
if (!theirsSection) {
|
|
107
|
+
// Section seulement dans ours → l'inclure
|
|
108
|
+
result.push(...oursSection.raw);
|
|
109
|
+
continue;
|
|
110
|
+
}
|
|
111
|
+
const header = oursSection.header;
|
|
112
|
+
if (DEP_SECTIONS.has(header)) {
|
|
113
|
+
// Merge par clé (union, prefer theirs en cas de conflit)
|
|
114
|
+
if (oursSection.headerLine)
|
|
115
|
+
result.push(oursSection.headerLine);
|
|
116
|
+
const merged = mergeDependencySections(oursSection.entries, theirsSection.entries);
|
|
117
|
+
for (const e of merged)
|
|
118
|
+
result.push(e.raw);
|
|
119
|
+
theirsIndex.delete(header);
|
|
120
|
+
continue;
|
|
121
|
+
}
|
|
122
|
+
if (FEATURE_SECTIONS.has(header)) {
|
|
123
|
+
// Merge feature lists par clé (union des valeurs)
|
|
124
|
+
if (oursSection.headerLine)
|
|
125
|
+
result.push(oursSection.headerLine);
|
|
126
|
+
const merged = mergeDependencySections(oursSection.entries, theirsSection.entries);
|
|
127
|
+
for (const e of merged)
|
|
128
|
+
result.push(e.raw);
|
|
129
|
+
theirsIndex.delete(header);
|
|
130
|
+
continue;
|
|
131
|
+
}
|
|
132
|
+
if (PACKAGE_SECTIONS.has(header)) {
|
|
133
|
+
// Clé par clé : prefer theirs
|
|
134
|
+
if (oursSection.headerLine)
|
|
135
|
+
result.push(oursSection.headerLine);
|
|
136
|
+
const merged = mergeDependencySections(oursSection.entries, theirsSection.entries);
|
|
137
|
+
for (const e of merged)
|
|
138
|
+
result.push(e.raw);
|
|
139
|
+
theirsIndex.delete(header);
|
|
140
|
+
continue;
|
|
141
|
+
}
|
|
142
|
+
if (WORKSPACE_SECTIONS.has(header)) {
|
|
143
|
+
// Merge comme dependencies
|
|
144
|
+
if (oursSection.headerLine)
|
|
145
|
+
result.push(oursSection.headerLine);
|
|
146
|
+
const merged = mergeDependencySections(oursSection.entries, theirsSection.entries);
|
|
147
|
+
for (const e of merged)
|
|
148
|
+
result.push(e.raw);
|
|
149
|
+
theirsIndex.delete(header);
|
|
150
|
+
continue;
|
|
151
|
+
}
|
|
152
|
+
// Section inconnue : si les contenus sont identiques → inclure ours
|
|
153
|
+
if (oursSection.raw.join("\n") === theirsSection.raw.join("\n")) {
|
|
154
|
+
result.push(...oursSection.raw);
|
|
155
|
+
theirsIndex.delete(header);
|
|
156
|
+
}
|
|
157
|
+
else {
|
|
158
|
+
// Conflit sur une section non reconnue → fallback
|
|
159
|
+
return {
|
|
160
|
+
lines: null,
|
|
161
|
+
reason: `[cargo] Section "${header}" modifiée des deux côtés — fallback textuel.`,
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
// Sections uniquement dans theirs → les ajouter
|
|
166
|
+
for (const [, s] of theirsIndex) {
|
|
167
|
+
result.push(...s.raw);
|
|
168
|
+
}
|
|
169
|
+
return {
|
|
170
|
+
lines: result,
|
|
171
|
+
reason: "Cargo.toml — merge par nom de crate (union des dépendances, prefer-theirs en cas de conflit de version).",
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
// ─── Cargo.lock resolver ──────────────────────────────────────
|
|
175
|
+
/**
|
|
176
|
+
* Parse les blocs [[package]] d'un Cargo.lock.
|
|
177
|
+
* Chaque bloc est indexé par "name@version".
|
|
178
|
+
*/
|
|
179
|
+
function parseCargoLockPackages(lines) {
|
|
180
|
+
const packages = new Map();
|
|
181
|
+
let currentBlock = null;
|
|
182
|
+
let currentKey = null;
|
|
183
|
+
for (const line of lines) {
|
|
184
|
+
if (line.trim() === "[[package]]") {
|
|
185
|
+
if (currentKey && currentBlock) {
|
|
186
|
+
packages.set(currentKey, currentBlock);
|
|
187
|
+
}
|
|
188
|
+
currentBlock = [line];
|
|
189
|
+
currentKey = null;
|
|
190
|
+
continue;
|
|
191
|
+
}
|
|
192
|
+
if (currentBlock !== null) {
|
|
193
|
+
currentBlock.push(line);
|
|
194
|
+
// Extraire name + version pour construire la clé
|
|
195
|
+
if (!currentKey) {
|
|
196
|
+
const nameMatch = line.match(/^name\s*=\s*"([^"]+)"/);
|
|
197
|
+
if (nameMatch) {
|
|
198
|
+
const prevVersion = currentBlock.find((l) => /^version\s*=/.test(l));
|
|
199
|
+
if (prevVersion) {
|
|
200
|
+
const v = prevVersion.match(/"([^"]+)"/)?.[1] ?? "?";
|
|
201
|
+
currentKey = `${nameMatch[1]}@${v}`;
|
|
202
|
+
}
|
|
203
|
+
else {
|
|
204
|
+
// Version pas encore vue — on la cherchera à la prochaine ligne
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
const versionMatch = line.match(/^version\s*=\s*"([^"]+)"/);
|
|
208
|
+
if (versionMatch) {
|
|
209
|
+
const prevName = currentBlock.find((l) => /^name\s*=/.test(l));
|
|
210
|
+
if (prevName) {
|
|
211
|
+
const n = prevName.match(/"([^"]+)"/)?.[1] ?? "?";
|
|
212
|
+
currentKey = `${n}@${versionMatch[1]}`;
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
if (currentKey && currentBlock) {
|
|
219
|
+
packages.set(currentKey, currentBlock);
|
|
220
|
+
}
|
|
221
|
+
return packages;
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* Tente de résoudre un conflit dans un fichier Cargo.lock.
|
|
225
|
+
*/
|
|
226
|
+
export function tryResolveCargoLockConflict(_baseLines, oursLines, theirsLines) {
|
|
227
|
+
// Header (lignes avant le premier [[package]])
|
|
228
|
+
const extractHeader = (lines) => {
|
|
229
|
+
const idx = lines.findIndex((l) => l.trim() === "[[package]]");
|
|
230
|
+
return idx > 0 ? lines.slice(0, idx) : [];
|
|
231
|
+
};
|
|
232
|
+
const oursHeader = extractHeader(oursLines);
|
|
233
|
+
const theirsHeader = extractHeader(theirsLines);
|
|
234
|
+
// On garde le header de theirs (version de lockfile plus récente)
|
|
235
|
+
const header = theirsHeader.length > 0 ? theirsHeader : oursHeader;
|
|
236
|
+
const oursPackages = parseCargoLockPackages(oursLines);
|
|
237
|
+
const theirsPackages = parseCargoLockPackages(theirsLines);
|
|
238
|
+
// Union par clé, prefer theirs en cas de conflit
|
|
239
|
+
const merged = new Map(oursPackages);
|
|
240
|
+
for (const [key, block] of theirsPackages) {
|
|
241
|
+
merged.set(key, block); // theirs wins
|
|
242
|
+
}
|
|
243
|
+
// Trier les packages par clé (nom alphabétique) pour la stabilité
|
|
244
|
+
const sortedKeys = [...merged.keys()].sort();
|
|
245
|
+
const result = [...header];
|
|
246
|
+
for (const key of sortedKeys) {
|
|
247
|
+
result.push(...merged.get(key));
|
|
248
|
+
result.push(""); // blank line between packages
|
|
249
|
+
}
|
|
250
|
+
return {
|
|
251
|
+
lines: result,
|
|
252
|
+
reason: "Cargo.lock — merge par crate name+version (union, prefer-theirs). Vérification recommandée : `cargo check`.",
|
|
253
|
+
};
|
|
254
|
+
}
|
|
255
|
+
// ─── Dispatcher ──────────────────────────────────────────────
|
|
256
|
+
export function tryResolveCargoConflict(filePath, baseLines, oursLines, theirsLines) {
|
|
257
|
+
if (/Cargo\.lock$/i.test(filePath)) {
|
|
258
|
+
return tryResolveCargoLockConflict(baseLines, oursLines, theirsLines);
|
|
259
|
+
}
|
|
260
|
+
return tryResolveCargoTomlConflict(baseLines, oursLines, theirsLines);
|
|
261
|
+
}
|
|
262
|
+
//# sourceMappingURL=cargo.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cargo.js","sourceRoot":"","sources":["../../src/resolvers/cargo.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GitWand — Résolveur CSS/SCSS/Less
|
|
3
|
+
*
|
|
4
|
+
* Résout les conflits dans les fichiers CSS, SCSS et Less en analysant
|
|
5
|
+
* la structure des règles (sélecteur + bloc de propriétés) et en fusionnant
|
|
6
|
+
* règle par règle.
|
|
7
|
+
*
|
|
8
|
+
* Stratégie :
|
|
9
|
+
* 1. Parser les trois versions en "règles" CSS : sélecteur + propriétés
|
|
10
|
+
* 2. Pour chaque règle :
|
|
11
|
+
* - Absente de base → ajout (accepter)
|
|
12
|
+
* - Modifiée d'un seul côté → accepter la modification
|
|
13
|
+
* - Same change → accepter
|
|
14
|
+
* - Modifiée des deux côtés → tenter une fusion propriété par propriété
|
|
15
|
+
* - Conflit réel → fallback textuel (null)
|
|
16
|
+
* 3. Reconnaître aussi les at-rules (@media, @keyframes, @import, etc.)
|
|
17
|
+
*
|
|
18
|
+
* Limites :
|
|
19
|
+
* - Les sélecteurs imbriqués SCSS (`.parent { .child { } }`) ne sont pas
|
|
20
|
+
* récursivement fusionnés (traités comme blocs opaques)
|
|
21
|
+
* - Les at-rules avec blocs (@media) : fusion conservative sur le bloc complet
|
|
22
|
+
* - Les variables CSS (--var: value) et SCSS ($var: value) : traitées comme propriétés
|
|
23
|
+
*/
|
|
24
|
+
/** Une règle CSS parsée */
|
|
25
|
+
export interface CssRule {
|
|
26
|
+
/** Sélecteur ou at-rule (ex: `.btn`, `@media (max-width: 768px)`) */
|
|
27
|
+
selector: string;
|
|
28
|
+
/** Propriétés : tableau de lignes brutes entre `{` et `}` */
|
|
29
|
+
properties: string[];
|
|
30
|
+
/** Lignes brutes constituant la règle complète */
|
|
31
|
+
rawLines: string[];
|
|
32
|
+
/** Commentaires/blancs précédant la règle */
|
|
33
|
+
leadingComments: string[];
|
|
34
|
+
/** Type de règle */
|
|
35
|
+
kind: "rule" | "at-rule" | "comment" | "blank" | "import";
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Parse un tableau de lignes CSS en règles structurées.
|
|
39
|
+
*/
|
|
40
|
+
export declare function parseCssRules(lines: string[]): CssRule[];
|
|
41
|
+
/** Résultat du merge CSS */
|
|
42
|
+
export interface CssMergeResult {
|
|
43
|
+
/** Lignes fusionnées (null = conflit non résolvable) */
|
|
44
|
+
mergedLines: string[] | null;
|
|
45
|
+
/** Description de la fusion */
|
|
46
|
+
reason: string;
|
|
47
|
+
/** Règles résolues automatiquement */
|
|
48
|
+
resolvedRules: number;
|
|
49
|
+
/** Règles en conflit */
|
|
50
|
+
unresolvedRules: number;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Tente de résoudre un conflit CSS/SCSS en fusionnant règle par règle.
|
|
54
|
+
*
|
|
55
|
+
* @param baseLines - Lignes de la version base
|
|
56
|
+
* @param oursLines - Lignes de la version ours
|
|
57
|
+
* @param theirsLines - Lignes de la version theirs
|
|
58
|
+
*/
|
|
59
|
+
export declare function tryResolveCssConflict(baseLines: string[], oursLines: string[], theirsLines: string[]): CssMergeResult;
|
|
60
|
+
//# sourceMappingURL=css.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"css.d.ts","sourceRoot":"","sources":["../../src/resolvers/css.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAIH,2BAA2B;AAC3B,MAAM,WAAW,OAAO;IACtB,qEAAqE;IACrE,QAAQ,EAAE,MAAM,CAAC;IACjB,6DAA6D;IAC7D,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,kDAAkD;IAClD,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,6CAA6C;IAC7C,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,oBAAoB;IACpB,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,GAAG,QAAQ,CAAC;CAC3D;AAWD;;GAEG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,EAAE,CA+FxD;AAID,4BAA4B;AAC5B,MAAM,WAAW,cAAc;IAC7B,wDAAwD;IACxD,WAAW,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IAC7B,+BAA+B;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,sCAAsC;IACtC,aAAa,EAAE,MAAM,CAAC;IACtB,wBAAwB;IACxB,eAAe,EAAE,MAAM,CAAC;CACzB;AA+PD;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CACnC,SAAS,EAAE,MAAM,EAAE,EACnB,SAAS,EAAE,MAAM,EAAE,EACnB,WAAW,EAAE,MAAM,EAAE,GACpB,cAAc,CAmKhB"}
|