@gitwand/core 2.3.0 → 2.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/__tests__/corpus.d.ts.map +1 -1
- package/dist/__tests__/corpus.js +115 -0
- package/dist/__tests__/corpus.js.map +1 -1
- package/dist/__tests__/patterns/complex.test.d.ts +9 -0
- package/dist/__tests__/patterns/complex.test.d.ts.map +1 -0
- package/dist/__tests__/patterns/complex.test.js +198 -0
- package/dist/__tests__/patterns/complex.test.js.map +1 -0
- package/dist/__tests__/patterns/delete-no-change.test.d.ts +11 -0
- package/dist/__tests__/patterns/delete-no-change.test.d.ts.map +1 -0
- package/dist/__tests__/patterns/delete-no-change.test.js +178 -0
- package/dist/__tests__/patterns/delete-no-change.test.js.map +1 -0
- package/dist/__tests__/patterns/non-overlapping.test.d.ts +11 -0
- package/dist/__tests__/patterns/non-overlapping.test.d.ts.map +1 -0
- package/dist/__tests__/patterns/non-overlapping.test.js +240 -0
- package/dist/__tests__/patterns/non-overlapping.test.js.map +1 -0
- package/dist/__tests__/patterns/one-side-change.test.d.ts +10 -0
- package/dist/__tests__/patterns/one-side-change.test.d.ts.map +1 -0
- package/dist/__tests__/patterns/one-side-change.test.js +191 -0
- package/dist/__tests__/patterns/one-side-change.test.js.map +1 -0
- package/dist/__tests__/patterns/same-change.test.d.ts +9 -0
- package/dist/__tests__/patterns/same-change.test.d.ts.map +1 -0
- package/dist/__tests__/patterns/same-change.test.js +173 -0
- package/dist/__tests__/patterns/same-change.test.js.map +1 -0
- package/dist/__tests__/patterns/value-only-change.test.d.ts +11 -0
- package/dist/__tests__/patterns/value-only-change.test.d.ts.map +1 -0
- package/dist/__tests__/patterns/value-only-change.test.js +159 -0
- package/dist/__tests__/patterns/value-only-change.test.js.map +1 -0
- package/dist/__tests__/patterns/whitespace-only.test.d.ts +10 -0
- package/dist/__tests__/patterns/whitespace-only.test.d.ts.map +1 -0
- package/dist/__tests__/patterns/whitespace-only.test.js +177 -0
- package/dist/__tests__/patterns/whitespace-only.test.js.map +1 -0
- package/dist/__tests__/resolvers/css.test.d.ts +12 -0
- package/dist/__tests__/resolvers/css.test.d.ts.map +1 -0
- package/dist/__tests__/resolvers/css.test.js +171 -0
- package/dist/__tests__/resolvers/css.test.js.map +1 -0
- package/dist/__tests__/resolvers/imports.test.d.ts +12 -0
- package/dist/__tests__/resolvers/imports.test.d.ts.map +1 -0
- package/dist/__tests__/resolvers/imports.test.js +135 -0
- package/dist/__tests__/resolvers/imports.test.js.map +1 -0
- package/dist/__tests__/resolvers/json.test.d.ts +12 -0
- package/dist/__tests__/resolvers/json.test.d.ts.map +1 -0
- package/dist/__tests__/resolvers/json.test.js +184 -0
- package/dist/__tests__/resolvers/json.test.js.map +1 -0
- package/dist/__tests__/resolvers/lockfile-npm.test.d.ts +12 -0
- package/dist/__tests__/resolvers/lockfile-npm.test.d.ts.map +1 -0
- package/dist/__tests__/resolvers/lockfile-npm.test.js +187 -0
- package/dist/__tests__/resolvers/lockfile-npm.test.js.map +1 -0
- package/dist/__tests__/resolvers/lockfile-pnpm.test.d.ts +12 -0
- package/dist/__tests__/resolvers/lockfile-pnpm.test.d.ts.map +1 -0
- package/dist/__tests__/resolvers/lockfile-pnpm.test.js +175 -0
- package/dist/__tests__/resolvers/lockfile-pnpm.test.js.map +1 -0
- package/dist/__tests__/resolvers/lockfile-yarn.test.d.ts +12 -0
- package/dist/__tests__/resolvers/lockfile-yarn.test.d.ts.map +1 -0
- package/dist/__tests__/resolvers/lockfile-yarn.test.js +165 -0
- package/dist/__tests__/resolvers/lockfile-yarn.test.js.map +1 -0
- package/dist/__tests__/resolvers/markdown.test.d.ts +12 -0
- package/dist/__tests__/resolvers/markdown.test.d.ts.map +1 -0
- package/dist/__tests__/resolvers/markdown.test.js +188 -0
- package/dist/__tests__/resolvers/markdown.test.js.map +1 -0
- package/dist/__tests__/resolvers/vue.test.d.ts +12 -0
- package/dist/__tests__/resolvers/vue.test.d.ts.map +1 -0
- package/dist/__tests__/resolvers/vue.test.js +225 -0
- package/dist/__tests__/resolvers/vue.test.js.map +1 -0
- package/dist/__tests__/resolvers/yaml.test.d.ts +12 -0
- package/dist/__tests__/resolvers/yaml.test.d.ts.map +1 -0
- package/dist/__tests__/resolvers/yaml.test.js +203 -0
- package/dist/__tests__/resolvers/yaml.test.js.map +1 -0
- package/dist/__tests__/v2-core-scenarios.test.d.ts +35 -0
- package/dist/__tests__/v2-core-scenarios.test.d.ts.map +1 -0
- package/dist/__tests__/v2-core-scenarios.test.js +692 -0
- package/dist/__tests__/v2-core-scenarios.test.js.map +1 -0
- package/dist/__tests__/validation-parse-tree.test.d.ts +15 -0
- package/dist/__tests__/validation-parse-tree.test.d.ts.map +1 -0
- package/dist/__tests__/validation-parse-tree.test.js +243 -0
- package/dist/__tests__/validation-parse-tree.test.js.map +1 -0
- package/dist/config.d.ts +25 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +17 -0
- package/dist/config.js.map +1 -1
- package/dist/diff/index.d.ts.map +1 -1
- package/dist/diff/index.js +1 -3
- package/dist/diff/index.js.map +1 -1
- package/dist/patterns/utils.d.ts +8 -7
- package/dist/patterns/utils.d.ts.map +1 -1
- package/dist/patterns/utils.js +13 -12
- package/dist/patterns/utils.js.map +1 -1
- package/dist/resolver/adapters/strict-node.d.ts +32 -0
- package/dist/resolver/adapters/strict-node.d.ts.map +1 -0
- package/dist/resolver/adapters/strict-node.js +117 -0
- package/dist/resolver/adapters/strict-node.js.map +1 -0
- package/dist/resolver/index.d.ts +20 -1
- package/dist/resolver/index.d.ts.map +1 -1
- package/dist/resolver/index.js +89 -5
- package/dist/resolver/index.js.map +1 -1
- package/dist/resolver/policy.d.ts.map +1 -1
- package/dist/resolver/policy.js +3 -0
- package/dist/resolver/policy.js.map +1 -1
- package/dist/resolver/validate-parse-tree.d.ts +52 -0
- package/dist/resolver/validate-parse-tree.d.ts.map +1 -0
- package/dist/resolver/validate-parse-tree.js +87 -0
- package/dist/resolver/validate-parse-tree.js.map +1 -0
- package/dist/resolver/validate-strict.d.ts +27 -0
- package/dist/resolver/validate-strict.d.ts.map +1 -0
- package/dist/resolver/validate-strict.js +41 -0
- package/dist/resolver/validate-strict.js.map +1 -0
- package/dist/resolver/validation.d.ts.map +1 -1
- package/dist/resolver/validation.js +15 -1
- package/dist/resolver/validation.js.map +1 -1
- package/dist/resolvers/dispatcher.d.ts.map +1 -1
- package/dist/resolvers/dispatcher.js.map +1 -1
- package/dist/types.d.ts +60 -3
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @gitwand/core v2.4 — Strict validation adapter (Node.js only)
|
|
3
|
+
*
|
|
4
|
+
* Exécute les outils de validation externes (tsc, eslint) sur le contenu
|
|
5
|
+
* fusionné en écrivant un fichier temporaire. Ce module utilise des APIs
|
|
6
|
+
* Node.js natives (node:fs/promises, node:os, node:child_process) et ne
|
|
7
|
+
* doit JAMAIS être importé statiquement depuis du code partagé browser/Tauri.
|
|
8
|
+
*
|
|
9
|
+
* Pattern d'utilisation (depuis validate-strict.ts) :
|
|
10
|
+
* const { runStrictValidationNode } = await import(
|
|
11
|
+
* /* @vite-ignore *\/ "./adapters/strict-node.js"
|
|
12
|
+
* );
|
|
13
|
+
*/
|
|
14
|
+
import { writeFile, unlink, mkdtemp } from "node:fs/promises";
|
|
15
|
+
import { join } from "node:path";
|
|
16
|
+
import { tmpdir } from "node:os";
|
|
17
|
+
import { execFile } from "node:child_process";
|
|
18
|
+
import { promisify } from "node:util";
|
|
19
|
+
const execFileAsync = promisify(execFile);
|
|
20
|
+
/**
|
|
21
|
+
* Valide le contenu avec tsc et/ou eslint.
|
|
22
|
+
* Écrit le contenu dans un fichier temporaire, exécute les outils, puis supprime le fichier.
|
|
23
|
+
*
|
|
24
|
+
* @param content - Contenu fusionné à valider
|
|
25
|
+
* @param filePath - Chemin original (pour l'extension et l'identification)
|
|
26
|
+
* @param tools - Outils à exécuter
|
|
27
|
+
* @returns Résultat de validation strict
|
|
28
|
+
*/
|
|
29
|
+
export async function runStrictValidationNode(content, filePath, tools) {
|
|
30
|
+
const errors = [];
|
|
31
|
+
const toolsRun = [];
|
|
32
|
+
const toolsFailed = [];
|
|
33
|
+
// Extraire l'extension pour le fichier temporaire
|
|
34
|
+
const ext = filePath.includes(".") ? filePath.slice(filePath.lastIndexOf(".")) : ".ts";
|
|
35
|
+
// Créer un répertoire temporaire et y écrire le contenu
|
|
36
|
+
let tmpDir = null;
|
|
37
|
+
let tmpFile = null;
|
|
38
|
+
try {
|
|
39
|
+
tmpDir = await mkdtemp(join(tmpdir(), "gitwand-validate-"));
|
|
40
|
+
tmpFile = join(tmpDir, `merged${ext}`);
|
|
41
|
+
await writeFile(tmpFile, content, "utf8");
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
return { errors: [], toolsRun: [], toolsFailed: ["setup"] };
|
|
45
|
+
}
|
|
46
|
+
try {
|
|
47
|
+
// ─── tsc ──────────────────────────────────────────────────────
|
|
48
|
+
if (tools.includes("tsc")) {
|
|
49
|
+
try {
|
|
50
|
+
await execFileAsync("tsc", [
|
|
51
|
+
"--noEmit",
|
|
52
|
+
"--noResolve", // pas besoin de résoudre les imports pour la syntaxe
|
|
53
|
+
"--noLib", // pas de lib.d.ts requis pour un check syntaxique rapide
|
|
54
|
+
"--allowJs", // traiter aussi les .js/.jsx
|
|
55
|
+
"--checkJs",
|
|
56
|
+
"--strict", "false", // on ne vérifie que la syntaxe, pas les types stricts
|
|
57
|
+
"--target", "esnext",
|
|
58
|
+
"--moduleResolution", "bundler",
|
|
59
|
+
tmpFile,
|
|
60
|
+
], { timeout: 10_000 });
|
|
61
|
+
toolsRun.push("tsc");
|
|
62
|
+
// Si tsc sort sans erreur, aucune erreur syntaxique
|
|
63
|
+
}
|
|
64
|
+
catch (err) {
|
|
65
|
+
// tsc exit code != 0 → des erreurs
|
|
66
|
+
toolsRun.push("tsc");
|
|
67
|
+
const output = err.stdout ?? "";
|
|
68
|
+
const stderr = err.stderr ?? "";
|
|
69
|
+
const combined = [output, stderr].filter(Boolean).join("\n");
|
|
70
|
+
// Nettoyer le chemin temporaire pour ne pas exposer les internals
|
|
71
|
+
const cleaned = combined.replace(new RegExp(tmpFile.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"), "g"), filePath);
|
|
72
|
+
if (cleaned.trim()) {
|
|
73
|
+
errors.push(...cleaned.split("\n").filter((l) => l.trim()));
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
// ─── eslint ───────────────────────────────────────────────────
|
|
78
|
+
if (tools.includes("eslint")) {
|
|
79
|
+
try {
|
|
80
|
+
await execFileAsync("eslint", [
|
|
81
|
+
"--no-eslintrc", // ignorer la config du projet
|
|
82
|
+
"--rule", '{"no-undef": 0}', // désactiver les règles de type (syntaxe only)
|
|
83
|
+
"--parser-options", "ecmaVersion:latest",
|
|
84
|
+
"--format", "compact",
|
|
85
|
+
tmpFile,
|
|
86
|
+
], { timeout: 10_000 });
|
|
87
|
+
toolsRun.push("eslint");
|
|
88
|
+
}
|
|
89
|
+
catch (err) {
|
|
90
|
+
toolsRun.push("eslint");
|
|
91
|
+
const output = err.stdout ?? "";
|
|
92
|
+
const cleaned = output.replace(new RegExp(tmpFile.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"), "g"), filePath);
|
|
93
|
+
if (cleaned.trim()) {
|
|
94
|
+
errors.push(...cleaned.split("\n").filter((l) => l.trim()));
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
finally {
|
|
100
|
+
// Nettoyage du fichier temporaire
|
|
101
|
+
if (tmpFile) {
|
|
102
|
+
try {
|
|
103
|
+
await unlink(tmpFile);
|
|
104
|
+
}
|
|
105
|
+
catch { /* ignore */ }
|
|
106
|
+
}
|
|
107
|
+
if (tmpDir) {
|
|
108
|
+
try {
|
|
109
|
+
const { rmdir } = await import("node:fs/promises");
|
|
110
|
+
await rmdir(tmpDir);
|
|
111
|
+
}
|
|
112
|
+
catch { /* ignore */ }
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
return { errors, toolsRun, toolsFailed };
|
|
116
|
+
}
|
|
117
|
+
//# sourceMappingURL=strict-node.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"strict-node.js","sourceRoot":"","sources":["../../../src/resolver/adapters/strict-node.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AAW1C;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,OAAe,EACf,QAAgB,EAChB,KAA8B;IAE9B,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,MAAM,WAAW,GAAa,EAAE,CAAC;IAEjC,kDAAkD;IAClD,MAAM,GAAG,GAAG,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;IAEvF,wDAAwD;IACxD,IAAI,MAAM,GAAkB,IAAI,CAAC;IACjC,IAAI,OAAO,GAAkB,IAAI,CAAC;IAClC,IAAI,CAAC;QACH,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,mBAAmB,CAAC,CAAC,CAAC;QAC5D,OAAO,GAAG,IAAI,CAAC,MAAM,EAAE,SAAS,GAAG,EAAE,CAAC,CAAC;QACvC,MAAM,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;IAC5C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,WAAW,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC;IAC9D,CAAC;IAED,IAAI,CAAC;QACH,iEAAiE;QACjE,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YAC1B,IAAI,CAAC;gBACH,MAAM,aAAa,CAAC,KAAK,EAAE;oBACzB,UAAU;oBACV,aAAa,EAAS,qDAAqD;oBAC3E,SAAS,EAAa,yDAAyD;oBAC/E,WAAW,EAAW,6BAA6B;oBACnD,WAAW;oBACX,UAAU,EAAE,OAAO,EAAG,sDAAsD;oBAC5E,UAAU,EAAE,QAAQ;oBACpB,oBAAoB,EAAE,SAAS;oBAC/B,OAAO;iBACR,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;gBACxB,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBACrB,oDAAoD;YACtD,CAAC;YAAC,OAAO,GAAY,EAAE,CAAC;gBACtB,mCAAmC;gBACnC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBACrB,MAAM,MAAM,GAAI,GAA4C,CAAC,MAAM,IAAI,EAAE,CAAC;gBAC1E,MAAM,MAAM,GAAI,GAA2B,CAAC,MAAM,IAAI,EAAE,CAAC;gBACzD,MAAM,QAAQ,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAC7D,kEAAkE;gBAClE,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,EAAE,GAAG,CAAC,EAAE,QAAQ,CAAC,CAAC;gBAC5G,IAAI,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;oBACnB,MAAM,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;gBAC9D,CAAC;YACH,CAAC;QACH,CAAC;QAED,iEAAiE;QACjE,IAAI,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC7B,IAAI,CAAC;gBACH,MAAM,aAAa,CAAC,QAAQ,EAAE;oBAC5B,eAAe,EAAa,8BAA8B;oBAC1D,QAAQ,EAAE,iBAAiB,EAAE,+CAA+C;oBAC5E,kBAAkB,EAAE,oBAAoB;oBACxC,UAAU,EAAE,SAAS;oBACrB,OAAO;iBACR,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;gBACxB,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC1B,CAAC;YAAC,OAAO,GAAY,EAAE,CAAC;gBACtB,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBACxB,MAAM,MAAM,GAAI,GAA2B,CAAC,MAAM,IAAI,EAAE,CAAC;gBACzD,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,EAAE,GAAG,CAAC,EAAE,QAAQ,CAAC,CAAC;gBAC1G,IAAI,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;oBACnB,MAAM,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;gBAC9D,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;YAAS,CAAC;QACT,kCAAkC;QAClC,IAAI,OAAO,EAAE,CAAC;YACZ,IAAI,CAAC;gBAAC,MAAM,MAAM,CAAC,OAAO,CAAC,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;QACvD,CAAC;QACD,IAAI,MAAM,EAAE,CAAC;YACX,IAAI,CAAC;gBACH,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,CAAC;gBACnD,MAAM,KAAK,CAAC,MAAM,CAAC,CAAC;YACtB,CAAC;YAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,CAAC;AAC3C,CAAC"}
|
package/dist/resolver/index.d.ts
CHANGED
|
@@ -27,9 +27,28 @@ export declare function resolve(conflictedContent: string, filePath: string, use
|
|
|
27
27
|
/**
|
|
28
28
|
* Async variant of `resolve()` — attempts structural (AST-based) merge for
|
|
29
29
|
* TypeScript/TSX files before falling back to the standard hunk-by-hunk engine.
|
|
30
|
+
* Additionally runs parse-tree validation (v2.4) and optionally strict validation
|
|
31
|
+
* (tsc/eslint) when `validationLevel: "strict"` is configured.
|
|
30
32
|
*
|
|
31
33
|
* Structural merge requires `web-tree-sitter` as an **optional** peer dependency.
|
|
32
|
-
* If it is not installed, `resolveAsync()` behaves identically to `resolve()
|
|
34
|
+
* If it is not installed, `resolveAsync()` behaves identically to `resolve()` with
|
|
35
|
+
* the addition of the parse-tree validation pass.
|
|
36
|
+
*
|
|
37
|
+
* ### v2.4 — Parse-tree validation & retraction
|
|
38
|
+
*
|
|
39
|
+
* After hunk-based resolution produces a `mergedContent`, `resolveAsync()` re-parses
|
|
40
|
+
* it with tree-sitter. If the tree contains ERROR nodes (indicating the merged code is
|
|
41
|
+
* syntactically broken), every auto-resolved hunk is **retracted**:
|
|
42
|
+
*
|
|
43
|
+
* - `resolution.autoResolved` → `false`
|
|
44
|
+
* - `resolution.resolvedLines` → `null`
|
|
45
|
+
* - `hunk.confidence.dimensions.postMergeRisk` → `100`
|
|
46
|
+
* - `validation.parseTreeValid` → `false`
|
|
47
|
+
* - `mergedContent` → `null` (conflicts restored as markers)
|
|
48
|
+
*
|
|
49
|
+
* This eliminates the class of false-positives where the resolver auto-merged code
|
|
50
|
+
* that compiles/runs fine locally but is syntactically invalid (e.g. from two hunks
|
|
51
|
+
* interacting unexpectedly).
|
|
33
52
|
*
|
|
34
53
|
* @param conflictedContent - File content with Git conflict markers
|
|
35
54
|
* @param filePath - File path (format detection + grammar selection)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/resolver/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/resolver/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAIV,cAAc,EAEd,WAAW,EAGZ,MAAM,aAAa,CAAC;AACrB,OAAO,EAIL,KAAK,uBAAuB,EAC7B,MAAM,wBAAwB,CAAC;AAkEhC;;;;;;;GAOG;AACH,wBAAgB,OAAO,CACrB,iBAAiB,EAAE,MAAM,EACzB,QAAQ,EAAE,MAAM,EAChB,WAAW,GAAE,cAAmB,GAC/B,WAAW,CAgGb;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,wBAAsB,YAAY,CAChC,iBAAiB,EAAE,MAAM,EACzB,QAAQ,EAAE,MAAM,EAChB,WAAW,GAAE,cAAmB,EAChC,cAAc,GAAE,uBAA4B,GAC3C,OAAO,CAAC,WAAW,CAAC,CA4FtB"}
|
package/dist/resolver/index.js
CHANGED
|
@@ -16,6 +16,8 @@
|
|
|
16
16
|
import { tryStructuralMergeResolve, wrapStructuralResult, isStructuralLanguage, } from "../structural/index.js";
|
|
17
17
|
import { parseConflictMarkers, toConflictHunk } from "../parser.js";
|
|
18
18
|
import { EMPTY_VALIDATION, validateMergedContent } from "./validation.js";
|
|
19
|
+
import { checkParseTreeValid, applyPostMergeRiskPenalty } from "./validate-parse-tree.js";
|
|
20
|
+
import { runStrictValidation } from "./validate-strict.js";
|
|
19
21
|
import { isGeneratedFile, reclassifyIfGenerated } from "./generated-detection.js";
|
|
20
22
|
import { CONFIDENCE_ORDER, DEFAULT_OPTIONS, applyFileFrequencyPenalty, computeEffectiveMinConfidence, computeEffectivePolicy, } from "./policy.js";
|
|
21
23
|
import { dispatchFormatAware } from "./format-dispatch.js";
|
|
@@ -148,9 +150,28 @@ export function resolve(conflictedContent, filePath, userOptions = {}) {
|
|
|
148
150
|
/**
|
|
149
151
|
* Async variant of `resolve()` — attempts structural (AST-based) merge for
|
|
150
152
|
* TypeScript/TSX files before falling back to the standard hunk-by-hunk engine.
|
|
153
|
+
* Additionally runs parse-tree validation (v2.4) and optionally strict validation
|
|
154
|
+
* (tsc/eslint) when `validationLevel: "strict"` is configured.
|
|
151
155
|
*
|
|
152
156
|
* Structural merge requires `web-tree-sitter` as an **optional** peer dependency.
|
|
153
|
-
* If it is not installed, `resolveAsync()` behaves identically to `resolve()
|
|
157
|
+
* If it is not installed, `resolveAsync()` behaves identically to `resolve()` with
|
|
158
|
+
* the addition of the parse-tree validation pass.
|
|
159
|
+
*
|
|
160
|
+
* ### v2.4 — Parse-tree validation & retraction
|
|
161
|
+
*
|
|
162
|
+
* After hunk-based resolution produces a `mergedContent`, `resolveAsync()` re-parses
|
|
163
|
+
* it with tree-sitter. If the tree contains ERROR nodes (indicating the merged code is
|
|
164
|
+
* syntactically broken), every auto-resolved hunk is **retracted**:
|
|
165
|
+
*
|
|
166
|
+
* - `resolution.autoResolved` → `false`
|
|
167
|
+
* - `resolution.resolvedLines` → `null`
|
|
168
|
+
* - `hunk.confidence.dimensions.postMergeRisk` → `100`
|
|
169
|
+
* - `validation.parseTreeValid` → `false`
|
|
170
|
+
* - `mergedContent` → `null` (conflicts restored as markers)
|
|
171
|
+
*
|
|
172
|
+
* This eliminates the class of false-positives where the resolver auto-merged code
|
|
173
|
+
* that compiles/runs fine locally but is syntactically invalid (e.g. from two hunks
|
|
174
|
+
* interacting unexpectedly).
|
|
154
175
|
*
|
|
155
176
|
* @param conflictedContent - File content with Git conflict markers
|
|
156
177
|
* @param filePath - File path (format detection + grammar selection)
|
|
@@ -158,19 +179,82 @@ export function resolve(conflictedContent, filePath, userOptions = {}) {
|
|
|
158
179
|
* @param structuralOpts - Optional tree-sitter loader overrides
|
|
159
180
|
*/
|
|
160
181
|
export async function resolveAsync(conflictedContent, filePath, userOptions = {}, structuralOpts = {}) {
|
|
161
|
-
|
|
182
|
+
const options = { ...DEFAULT_OPTIONS, ...userOptions };
|
|
183
|
+
// ─── 1. Tentative de merge structurel (v2.3) ──────────────────────────────
|
|
162
184
|
if (isStructuralLanguage(filePath)) {
|
|
163
185
|
try {
|
|
164
186
|
const merged = await tryStructuralMergeResolve(conflictedContent, filePath, structuralOpts);
|
|
165
187
|
if (merged !== null) {
|
|
166
|
-
|
|
188
|
+
const result = wrapStructuralResult(conflictedContent, merged, filePath);
|
|
189
|
+
// Validation parse-tree sur le résultat structurel (devrait toujours passer,
|
|
190
|
+
// mais on vérifie quand même par cohérence).
|
|
191
|
+
const parseTreeValid = await checkParseTreeValid(result.mergedContent ?? "", filePath, structuralOpts);
|
|
192
|
+
return {
|
|
193
|
+
...result,
|
|
194
|
+
validation: { ...result.validation, parseTreeValid, externalValidation: null },
|
|
195
|
+
};
|
|
167
196
|
}
|
|
168
197
|
}
|
|
169
198
|
catch {
|
|
170
199
|
// Structural merge failed unexpectedly — fall through to hunk-based resolver
|
|
171
200
|
}
|
|
172
201
|
}
|
|
173
|
-
//
|
|
174
|
-
|
|
202
|
+
// ─── 2. Résolution hunk-par-hunk (synchrone) ─────────────────────────────
|
|
203
|
+
const result = resolve(conflictedContent, filePath, userOptions);
|
|
204
|
+
// Rien à valider si la résolution n'est pas complète
|
|
205
|
+
if (result.mergedContent === null) {
|
|
206
|
+
return result;
|
|
207
|
+
}
|
|
208
|
+
// ─── 3. v2.4 — Validation parse-tree ─────────────────────────────────────
|
|
209
|
+
// Skipped when validationLevel === "off" (performance mode).
|
|
210
|
+
if (options.validationLevel === "off") {
|
|
211
|
+
return { ...result, validation: { ...result.validation, parseTreeValid: null, externalValidation: null } };
|
|
212
|
+
}
|
|
213
|
+
const parseTreeValid = await checkParseTreeValid(result.mergedContent, filePath, structuralOpts);
|
|
214
|
+
if (parseTreeValid === false) {
|
|
215
|
+
// Parse-tree invalide → rétraction de toutes les résolutions automatiques.
|
|
216
|
+
// On ne peut pas savoir quel hunk a cassé la syntaxe sans une analyse fine,
|
|
217
|
+
// donc on est conservatif : tout remettre en conflits manuels.
|
|
218
|
+
const retractedResolutions = result.resolutions.map((r) => r.autoResolved ? applyPostMergeRiskPenalty(r) : r);
|
|
219
|
+
return {
|
|
220
|
+
...result,
|
|
221
|
+
// mergedContent = null indique aux consommateurs que des conflits subsistent.
|
|
222
|
+
// Le contenu original (avec marqueurs) est conservé dans conflictedContent
|
|
223
|
+
// par l'appelant — ici on expose uniquement la MergeResult enrichie.
|
|
224
|
+
mergedContent: null,
|
|
225
|
+
resolutions: retractedResolutions,
|
|
226
|
+
stats: {
|
|
227
|
+
...result.stats,
|
|
228
|
+
autoResolved: 0,
|
|
229
|
+
remaining: result.stats.totalConflicts,
|
|
230
|
+
},
|
|
231
|
+
validation: {
|
|
232
|
+
...result.validation,
|
|
233
|
+
isValid: false,
|
|
234
|
+
parseTreeValid: false,
|
|
235
|
+
},
|
|
236
|
+
};
|
|
237
|
+
}
|
|
238
|
+
// ─── 4. v2.4 — Validation stricte opt-in (tsc / eslint) ─────────────────
|
|
239
|
+
let externalValidation = null;
|
|
240
|
+
if (options.validationLevel === "strict") {
|
|
241
|
+
const tools = options.validationTools ?? ["tsc"];
|
|
242
|
+
const strictResult = await runStrictValidation(result.mergedContent, filePath, tools);
|
|
243
|
+
const failedTool = (strictResult.toolsFailed[0] ?? strictResult.toolsRun[0] ?? "tsc");
|
|
244
|
+
externalValidation = {
|
|
245
|
+
tool: failedTool,
|
|
246
|
+
errors: strictResult.errors,
|
|
247
|
+
passed: strictResult.errors.length === 0,
|
|
248
|
+
};
|
|
249
|
+
}
|
|
250
|
+
return {
|
|
251
|
+
...result,
|
|
252
|
+
validation: {
|
|
253
|
+
...result.validation,
|
|
254
|
+
parseTreeValid,
|
|
255
|
+
externalValidation,
|
|
256
|
+
...(externalValidation && !externalValidation.passed ? { isValid: false } : {}),
|
|
257
|
+
},
|
|
258
|
+
};
|
|
175
259
|
}
|
|
176
260
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/resolver/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/resolver/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"policy.d.ts","sourceRoot":"","sources":["../../src/resolver/policy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC5E,OAAO,EAIL,KAAK,WAAW,EAChB,KAAK,YAAY,EAClB,MAAM,cAAc,CAAC;AAEtB,0BAA0B;AAC1B,eAAO,MAAM,eAAe,EAAE,QAAQ,CAAC,cAAc,
|
|
1
|
+
{"version":3,"file":"policy.d.ts","sourceRoot":"","sources":["../../src/resolver/policy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC5E,OAAO,EAIL,KAAK,WAAW,EAChB,KAAK,YAAY,EAClB,MAAM,cAAc,CAAC;AAEtB,0BAA0B;AAC1B,eAAO,MAAM,eAAe,EAAE,QAAQ,CAAC,cAAc,CAcpD,CAAC;AAEF,2CAA2C;AAC3C,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,CAKvD,CAAC;AAEF;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,QAAQ,CAAC,cAAc,CAAC,GAChC;IAAE,MAAM,EAAE,WAAW,CAAC;IAAC,GAAG,EAAE,YAAY,CAAA;CAAE,CAO5C;AAED;;;;;GAKG;AACH,wBAAgB,6BAA6B,CAC3C,SAAS,EAAE,YAAY,EACvB,OAAO,EAAE,QAAQ,CAAC,cAAc,CAAC,GAChC,UAAU,CAIZ;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,yBAAyB,CACvC,IAAI,EAAE,YAAY,EAClB,iBAAiB,EAAE,MAAM,GACxB,YAAY,CAiCd"}
|
package/dist/resolver/policy.js
CHANGED
|
@@ -26,6 +26,9 @@ export const DEFAULT_OPTIONS = {
|
|
|
26
26
|
generatedFiles: [],
|
|
27
27
|
// v2.2 — profils de format actifs par défaut
|
|
28
28
|
disableFormatProfiles: false,
|
|
29
|
+
// v2.4 — validation post-merge
|
|
30
|
+
validationLevel: "balanced",
|
|
31
|
+
validationTools: ["tsc"],
|
|
29
32
|
};
|
|
30
33
|
/** Ordre de confiance pour comparaison. */
|
|
31
34
|
export const CONFIDENCE_ORDER = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"policy.js","sourceRoot":"","sources":["../../src/resolver/policy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAGH,OAAO,EACL,cAAc,EACd,sBAAsB,EACtB,cAAc,GAGf,MAAM,cAAc,CAAC;AAEtB,0BAA0B;AAC1B,MAAM,CAAC,MAAM,eAAe,GAA6B;IACvD,iBAAiB,EAAE,IAAI;IACvB,qBAAqB,EAAE,IAAI;IAC3B,aAAa,EAAE,MAAM;IACrB,OAAO,EAAE,KAAK;IACd,WAAW,EAAE,KAAK;IAClB,MAAM,EAAE,cAAc;IACtB,gBAAgB,EAAE,EAAE;IACpB,cAAc,EAAE,EAAE;IAClB,6CAA6C;IAC7C,qBAAqB,EAAE,KAAK;
|
|
1
|
+
{"version":3,"file":"policy.js","sourceRoot":"","sources":["../../src/resolver/policy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAGH,OAAO,EACL,cAAc,EACd,sBAAsB,EACtB,cAAc,GAGf,MAAM,cAAc,CAAC;AAEtB,0BAA0B;AAC1B,MAAM,CAAC,MAAM,eAAe,GAA6B;IACvD,iBAAiB,EAAE,IAAI;IACvB,qBAAqB,EAAE,IAAI;IAC3B,aAAa,EAAE,MAAM;IACrB,OAAO,EAAE,KAAK;IACd,WAAW,EAAE,KAAK;IAClB,MAAM,EAAE,cAAc;IACtB,gBAAgB,EAAE,EAAE;IACpB,cAAc,EAAE,EAAE;IAClB,6CAA6C;IAC7C,qBAAqB,EAAE,KAAK;IAC5B,+BAA+B;IAC/B,eAAe,EAAE,UAAU;IAC3B,eAAe,EAAE,CAAC,KAAK,CAAC;CACzB,CAAC;AAEF,2CAA2C;AAC3C,MAAM,CAAC,MAAM,gBAAgB,GAA+B;IAC1D,OAAO,EAAE,CAAC;IACV,IAAI,EAAE,CAAC;IACP,MAAM,EAAE,CAAC;IACT,GAAG,EAAE,CAAC;CACP,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,UAAU,sBAAsB,CACpC,QAAgB,EAChB,OAAiC;IAEjC,MAAM,MAAM,GAAG,sBAAsB,CACnC,QAAQ,EACR,OAAO,CAAC,MAAM,EACd,OAAO,CAAC,gBAAgB,CACzB,CAAC;IACF,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,cAAc,CAAC,MAAM,CAAC,EAAE,CAAC;AACjD,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,6BAA6B,CAC3C,SAAuB,EACvB,OAAiC;IAEjC,OAAO,gBAAgB,CAAC,SAAS,CAAC,aAAa,CAAC,GAAG,gBAAgB,CAAC,OAAO,CAAC,aAAa,CAAC;QACxF,CAAC,CAAC,SAAS,CAAC,aAAa;QACzB,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC;AAC5B,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,yBAAyB,CACvC,IAAkB,EAClB,iBAAyB;IAEzB,IAAI,iBAAiB,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QACtD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,iBAAiB,GAAG,EAAE,CAAC,CAAC;IACjD,MAAM,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC;IACrC,MAAM,GAAG,GACP,CAAC,CAAC,kBAAkB;UAClB,CAAC,CAAC,QAAQ,GAAU,IAAI;UACxB,CAAC,CAAC,WAAW,GAAO,IAAI;UACxB,EAAE,GAAkB,IAAI;UACxB,CAAC,CAAC,CAAC,gBAAgB,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC;IACrC,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;IAC7D,MAAM,QAAQ,GACZ,QAAQ,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS;QAC1B,CAAC,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,CAAC,MAAM;YACzB,CAAC,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,CAAC,QAAQ;gBAC3B,CAAC,CAAC,KAAK,CAAC;IAEV,OAAO;QACL,GAAG,IAAI;QACP,UAAU,EAAE;YACV,GAAG,IAAI,CAAC,UAAU;YAClB,KAAK,EAAE,QAAQ;YACf,KAAK,EAAE,QAAQ;YACf,UAAU,EAAE,EAAE,GAAG,CAAC,EAAE,aAAa,EAAE,EAAE,EAAE;YACvC,SAAS,EAAE;gBACT,GAAG,IAAI,CAAC,UAAU,CAAC,SAAS;gBAC5B,iBAAiB,iBAAiB,QAAQ,iBAAiB,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,YAAY,iBAAiB,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,+BAA+B,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO;aACnL;SACF;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @gitwand/core v2.4 — Parse-tree validation
|
|
3
|
+
*
|
|
4
|
+
* Vérifie si le contenu fusionné produit un arbre syntaxique sans erreurs
|
|
5
|
+
* via web-tree-sitter. Utilisé comme couche de filet de sécurité après
|
|
6
|
+
* la résolution automatique : si le merge produit du code syntaxiquement
|
|
7
|
+
* cassé, les résolutions sont rétractées pour revenir aux marqueurs de conflit.
|
|
8
|
+
*
|
|
9
|
+
* Contrainte : cette fonction est async (tree-sitter est lazy-loaded).
|
|
10
|
+
* Elle retourne `null` (graceful) si :
|
|
11
|
+
* - web-tree-sitter n'est pas installé
|
|
12
|
+
* - Le fichier n'est pas d'un langage supporté (TS/JS/Python/Go/Rust)
|
|
13
|
+
* - Le chargement de la grammaire échoue
|
|
14
|
+
*
|
|
15
|
+
* Elle ne lève jamais d'exception — les erreurs sont silencieusement absorbées.
|
|
16
|
+
*/
|
|
17
|
+
import type { LoaderOptions } from "../structural/parsers/loader.js";
|
|
18
|
+
/**
|
|
19
|
+
* Vérifie si le contenu fourni parse sans erreur syntaxique pour le langage
|
|
20
|
+
* du fichier cible.
|
|
21
|
+
*
|
|
22
|
+
* @param content - Contenu à valider (après résolution des conflits)
|
|
23
|
+
* @param filePath - Chemin du fichier (sélection de la grammaire tree-sitter)
|
|
24
|
+
* @param opts - Options de chargement (WASM paths, custom loader)
|
|
25
|
+
* @returns
|
|
26
|
+
* - `true` : l'arbre syntaxique est valide (pas de nœuds ERROR)
|
|
27
|
+
* - `false` : des erreurs syntaxiques ont été détectées
|
|
28
|
+
* - `null` : tree-sitter indisponible ou langage non supporté
|
|
29
|
+
*/
|
|
30
|
+
export declare function checkParseTreeValid(content: string, filePath: string, opts?: LoaderOptions): Promise<boolean | null>;
|
|
31
|
+
/**
|
|
32
|
+
* Construit un objet `HunkResolution` mis à jour avec la pénalité `postMergeRisk`
|
|
33
|
+
* pour signaler qu'une résolution a été rétractée suite à une invalidation parse-tree.
|
|
34
|
+
*
|
|
35
|
+
* Le score de confiance est mis à 0 et le label à "low" pour communiquer clairement
|
|
36
|
+
* à l'UI que ce hunk requiert une intervention manuelle.
|
|
37
|
+
*/
|
|
38
|
+
export declare function applyPostMergeRiskPenalty<T extends {
|
|
39
|
+
autoResolved: boolean;
|
|
40
|
+
resolvedLines: string[] | null;
|
|
41
|
+
resolutionReason: string;
|
|
42
|
+
hunk: {
|
|
43
|
+
confidence: {
|
|
44
|
+
score: number;
|
|
45
|
+
label: string;
|
|
46
|
+
dimensions: Record<string, unknown>;
|
|
47
|
+
boosters: string[];
|
|
48
|
+
penalties: string[];
|
|
49
|
+
};
|
|
50
|
+
};
|
|
51
|
+
}>(resolution: T): T;
|
|
52
|
+
//# sourceMappingURL=validate-parse-tree.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate-parse-tree.d.ts","sourceRoot":"","sources":["../../src/resolver/validate-parse-tree.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAMH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAErE;;;;;;;;;;;GAWG;AACH,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,IAAI,GAAE,aAAkB,GACvB,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAsBzB;AAED;;;;;;GAMG;AACH,wBAAgB,yBAAyB,CACvC,CAAC,SAAS;IACR,YAAY,EAAE,OAAO,CAAC;IACtB,aAAa,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IAC/B,gBAAgB,EAAE,MAAM,CAAC;IACzB,IAAI,EAAE;QACJ,UAAU,EAAE;YACV,KAAK,EAAE,MAAM,CAAC;YACd,KAAK,EAAE,MAAM,CAAC;YACd,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;YACpC,QAAQ,EAAE,MAAM,EAAE,CAAC;YACnB,SAAS,EAAE,MAAM,EAAE,CAAC;SACrB,CAAC;KACH,CAAC;CACH,EACD,UAAU,EAAE,CAAC,GAAG,CAAC,CAwBlB"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @gitwand/core v2.4 — Parse-tree validation
|
|
3
|
+
*
|
|
4
|
+
* Vérifie si le contenu fusionné produit un arbre syntaxique sans erreurs
|
|
5
|
+
* via web-tree-sitter. Utilisé comme couche de filet de sécurité après
|
|
6
|
+
* la résolution automatique : si le merge produit du code syntaxiquement
|
|
7
|
+
* cassé, les résolutions sont rétractées pour revenir aux marqueurs de conflit.
|
|
8
|
+
*
|
|
9
|
+
* Contrainte : cette fonction est async (tree-sitter est lazy-loaded).
|
|
10
|
+
* Elle retourne `null` (graceful) si :
|
|
11
|
+
* - web-tree-sitter n'est pas installé
|
|
12
|
+
* - Le fichier n'est pas d'un langage supporté (TS/JS/Python/Go/Rust)
|
|
13
|
+
* - Le chargement de la grammaire échoue
|
|
14
|
+
*
|
|
15
|
+
* Elle ne lève jamais d'exception — les erreurs sont silencieusement absorbées.
|
|
16
|
+
*/
|
|
17
|
+
import { isStructuralLanguage } from "../structural/parsers/grammars/languages.js";
|
|
18
|
+
import { loadGrammarForFile } from "../structural/parsers/grammars/ts.js";
|
|
19
|
+
import { createParser } from "../structural/parsers/loader.js";
|
|
20
|
+
import { hasParseErrors } from "../structural/entities.js";
|
|
21
|
+
/**
|
|
22
|
+
* Vérifie si le contenu fourni parse sans erreur syntaxique pour le langage
|
|
23
|
+
* du fichier cible.
|
|
24
|
+
*
|
|
25
|
+
* @param content - Contenu à valider (après résolution des conflits)
|
|
26
|
+
* @param filePath - Chemin du fichier (sélection de la grammaire tree-sitter)
|
|
27
|
+
* @param opts - Options de chargement (WASM paths, custom loader)
|
|
28
|
+
* @returns
|
|
29
|
+
* - `true` : l'arbre syntaxique est valide (pas de nœuds ERROR)
|
|
30
|
+
* - `false` : des erreurs syntaxiques ont été détectées
|
|
31
|
+
* - `null` : tree-sitter indisponible ou langage non supporté
|
|
32
|
+
*/
|
|
33
|
+
export async function checkParseTreeValid(content, filePath, opts = {}) {
|
|
34
|
+
// Vérification rapide : langage supporté ?
|
|
35
|
+
if (!isStructuralLanguage(filePath))
|
|
36
|
+
return null;
|
|
37
|
+
try {
|
|
38
|
+
// Chargement lazy de la grammaire (retourne null si non disponible)
|
|
39
|
+
const language = await loadGrammarForFile(filePath, opts);
|
|
40
|
+
if (!language)
|
|
41
|
+
return null;
|
|
42
|
+
const parser = await createParser(language, opts);
|
|
43
|
+
if (!parser)
|
|
44
|
+
return null;
|
|
45
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
46
|
+
const p = parser;
|
|
47
|
+
const tree = p.parse(content);
|
|
48
|
+
// hasParseErrors() vérifie récursivement la présence de nœuds ERROR
|
|
49
|
+
return !hasParseErrors(tree);
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
// Graceful degradation — ne jamais bloquer la résolution pour un échec tree-sitter
|
|
53
|
+
return null;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Construit un objet `HunkResolution` mis à jour avec la pénalité `postMergeRisk`
|
|
58
|
+
* pour signaler qu'une résolution a été rétractée suite à une invalidation parse-tree.
|
|
59
|
+
*
|
|
60
|
+
* Le score de confiance est mis à 0 et le label à "low" pour communiquer clairement
|
|
61
|
+
* à l'UI que ce hunk requiert une intervention manuelle.
|
|
62
|
+
*/
|
|
63
|
+
export function applyPostMergeRiskPenalty(resolution) {
|
|
64
|
+
return {
|
|
65
|
+
...resolution,
|
|
66
|
+
autoResolved: false,
|
|
67
|
+
resolvedLines: null,
|
|
68
|
+
resolutionReason: "Rétracté : le contenu fusionné contient des erreurs syntaxiques (parse-tree tree-sitter). Intervention manuelle requise.",
|
|
69
|
+
hunk: {
|
|
70
|
+
...resolution.hunk,
|
|
71
|
+
confidence: {
|
|
72
|
+
...resolution.hunk.confidence,
|
|
73
|
+
score: 0,
|
|
74
|
+
label: "low",
|
|
75
|
+
dimensions: {
|
|
76
|
+
...resolution.hunk.confidence.dimensions,
|
|
77
|
+
postMergeRisk: 100,
|
|
78
|
+
},
|
|
79
|
+
penalties: [
|
|
80
|
+
...resolution.hunk.confidence.penalties,
|
|
81
|
+
"v2.4 — Parse-tree invalide après résolution automatique",
|
|
82
|
+
],
|
|
83
|
+
},
|
|
84
|
+
},
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=validate-parse-tree.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate-parse-tree.js","sourceRoot":"","sources":["../../src/resolver/validate-parse-tree.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,oBAAoB,EAAE,MAAM,6CAA6C,CAAC;AACnF,OAAO,EAAE,kBAAkB,EAAE,MAAM,sCAAsC,CAAC;AAC1E,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAC/D,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAG3D;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,OAAe,EACf,QAAgB,EAChB,OAAsB,EAAE;IAExB,2CAA2C;IAC3C,IAAI,CAAC,oBAAoB,CAAC,QAAQ,CAAC;QAAE,OAAO,IAAI,CAAC;IAEjD,IAAI,CAAC;QACH,oEAAoE;QACpE,MAAM,QAAQ,GAAG,MAAM,kBAAkB,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QAC1D,IAAI,CAAC,QAAQ;YAAE,OAAO,IAAI,CAAC;QAE3B,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QAClD,IAAI,CAAC,MAAM;YAAE,OAAO,IAAI,CAAC;QAEzB,8DAA8D;QAC9D,MAAM,CAAC,GAAG,MAAa,CAAC;QACxB,MAAM,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAE9B,oEAAoE;QACpE,OAAO,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;IAC/B,CAAC;IAAC,MAAM,CAAC;QACP,mFAAmF;QACnF,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,yBAAyB,CAevC,UAAa;IACb,OAAO;QACL,GAAG,UAAU;QACb,YAAY,EAAE,KAAK;QACnB,aAAa,EAAE,IAAI;QACnB,gBAAgB,EACd,0HAA0H;QAC5H,IAAI,EAAE;YACJ,GAAG,UAAU,CAAC,IAAI;YAClB,UAAU,EAAE;gBACV,GAAG,UAAU,CAAC,IAAI,CAAC,UAAU;gBAC7B,KAAK,EAAE,CAAC;gBACR,KAAK,EAAE,KAAc;gBACrB,UAAU,EAAE;oBACV,GAAG,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,UAAU;oBACxC,aAAa,EAAE,GAAG;iBACnB;gBACD,SAAS,EAAE;oBACT,GAAG,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS;oBACvC,yDAAyD;iBAC1D;aACF;SACF;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @gitwand/core v2.4 — Strict validation dispatcher
|
|
3
|
+
*
|
|
4
|
+
* Point d'entrée pour la validation opt-in via outils externes (tsc, eslint).
|
|
5
|
+
* Le chargement de l'implémentation Node.js est gardé derrière un import
|
|
6
|
+
* dynamique avec `/* @vite-ignore *\/` pour éviter son inclusion dans les
|
|
7
|
+
* bundles browser/Tauri où child_process n'est pas disponible.
|
|
8
|
+
*
|
|
9
|
+
* Retourne toujours `[]` (aucune erreur) en environnement browser ou Tauri.
|
|
10
|
+
*/
|
|
11
|
+
export interface StrictValidationResult {
|
|
12
|
+
errors: string[];
|
|
13
|
+
toolsRun: string[];
|
|
14
|
+
toolsFailed: string[];
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Exécute la validation stricte sur le contenu fusionné.
|
|
18
|
+
*
|
|
19
|
+
* Disponible uniquement en environnement Node.js — retourne un résultat vide
|
|
20
|
+
* en browser ou Tauri sans lever d'exception.
|
|
21
|
+
*
|
|
22
|
+
* @param content - Contenu fusionné à valider
|
|
23
|
+
* @param filePath - Chemin du fichier (pour l'extension et les messages d'erreur)
|
|
24
|
+
* @param tools - Outils à exécuter (`["tsc"]` par défaut)
|
|
25
|
+
*/
|
|
26
|
+
export declare function runStrictValidation(content: string, filePath: string, tools?: Array<"tsc" | "eslint">): Promise<StrictValidationResult>;
|
|
27
|
+
//# sourceMappingURL=validate-strict.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate-strict.d.ts","sourceRoot":"","sources":["../../src/resolver/validate-strict.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAID;;;;;;;;;GASG;AACH,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,KAAK,GAAE,KAAK,CAAC,KAAK,GAAG,QAAQ,CAAW,GACvC,OAAO,CAAC,sBAAsB,CAAC,CAgBjC"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @gitwand/core v2.4 — Strict validation dispatcher
|
|
3
|
+
*
|
|
4
|
+
* Point d'entrée pour la validation opt-in via outils externes (tsc, eslint).
|
|
5
|
+
* Le chargement de l'implémentation Node.js est gardé derrière un import
|
|
6
|
+
* dynamique avec `/* @vite-ignore *\/` pour éviter son inclusion dans les
|
|
7
|
+
* bundles browser/Tauri où child_process n'est pas disponible.
|
|
8
|
+
*
|
|
9
|
+
* Retourne toujours `[]` (aucune erreur) en environnement browser ou Tauri.
|
|
10
|
+
*/
|
|
11
|
+
import { detectEnvironment } from "../structural/parsers/loader.js";
|
|
12
|
+
const EMPTY_RESULT = { errors: [], toolsRun: [], toolsFailed: [] };
|
|
13
|
+
/**
|
|
14
|
+
* Exécute la validation stricte sur le contenu fusionné.
|
|
15
|
+
*
|
|
16
|
+
* Disponible uniquement en environnement Node.js — retourne un résultat vide
|
|
17
|
+
* en browser ou Tauri sans lever d'exception.
|
|
18
|
+
*
|
|
19
|
+
* @param content - Contenu fusionné à valider
|
|
20
|
+
* @param filePath - Chemin du fichier (pour l'extension et les messages d'erreur)
|
|
21
|
+
* @param tools - Outils à exécuter (`["tsc"]` par défaut)
|
|
22
|
+
*/
|
|
23
|
+
export async function runStrictValidation(content, filePath, tools = ["tsc"]) {
|
|
24
|
+
const env = detectEnvironment();
|
|
25
|
+
if (env !== "node")
|
|
26
|
+
return EMPTY_RESULT;
|
|
27
|
+
// Seulement les langages que tsc et eslint comprennent
|
|
28
|
+
const strictLangs = /\.(ts|tsx|js|jsx|mjs|cjs|mts|cts)$/i;
|
|
29
|
+
if (!strictLangs.test(filePath))
|
|
30
|
+
return EMPTY_RESULT;
|
|
31
|
+
try {
|
|
32
|
+
// vite-ignore: Node.js adapter — jamais bundlé pour browser/Tauri
|
|
33
|
+
const { runStrictValidationNode } = await import(/* @vite-ignore */ "./adapters/strict-node.js");
|
|
34
|
+
return await runStrictValidationNode(content, filePath, tools);
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
// L'adapter n'a pas pu être chargé — dégradation gracieuse
|
|
38
|
+
return EMPTY_RESULT;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=validate-strict.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate-strict.js","sourceRoot":"","sources":["../../src/resolver/validate-strict.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AAQpE,MAAM,YAAY,GAA2B,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC;AAE3F;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,OAAe,EACf,QAAgB,EAChB,QAAiC,CAAC,KAAK,CAAC;IAExC,MAAM,GAAG,GAAG,iBAAiB,EAAE,CAAC;IAChC,IAAI,GAAG,KAAK,MAAM;QAAE,OAAO,YAAY,CAAC;IAExC,uDAAuD;IACvD,MAAM,WAAW,GAAG,qCAAqC,CAAC;IAC1D,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC;QAAE,OAAO,YAAY,CAAC;IAErD,IAAI,CAAC;QACH,kEAAkE;QAClE,MAAM,EAAE,uBAAuB,EAAE,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,2BAA2B,CAAC,CAAC;QACjG,OAAO,MAAM,uBAAuB,CAAC,OAAO,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;IACjE,CAAC;IAAC,MAAM,CAAC;QACP,2DAA2D;QAC3D,OAAO,YAAY,CAAC;IACtB,CAAC;AACH,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../src/resolver/validation.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAEpD,kDAAkD;AAClD,eAAO,MAAM,wBAAwB,UAKpC,CAAC;AA8CF;;;;;;;;;;;;GAYG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,gBAAgB,
|
|
1
|
+
{"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../src/resolver/validation.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAEpD,kDAAkD;AAClD,eAAO,MAAM,wBAAwB,UAKpC,CAAC;AA8CF;;;;;;;;;;;;GAYG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,gBAAgB,CAgCzF;AAED,8EAA8E;AAC9E,eAAO,MAAM,gBAAgB,EAAE,gBAQ9B,CAAC"}
|
|
@@ -84,7 +84,18 @@ export function validateMergedContent(content, filePath) {
|
|
|
84
84
|
const format = detectFormat(filePath);
|
|
85
85
|
const syntaxError = tryParse(content, format);
|
|
86
86
|
const isValid = !hasResidualMarkers && syntaxError === null;
|
|
87
|
-
|
|
87
|
+
// parseTreeValid est null ici car validateMergedContent est synchrone.
|
|
88
|
+
// La validation parse-tree (tree-sitter, async) est effectuée séparément
|
|
89
|
+
// dans resolveAsync() via checkParseTreeValid().
|
|
90
|
+
return {
|
|
91
|
+
hasResidualMarkers,
|
|
92
|
+
residualMarkerLines,
|
|
93
|
+
syntaxError,
|
|
94
|
+
isValid,
|
|
95
|
+
parseTreeValid: null,
|
|
96
|
+
parseTreeErrors: 0,
|
|
97
|
+
parseTreeErrorRanges: [],
|
|
98
|
+
};
|
|
88
99
|
}
|
|
89
100
|
/** Validation vide (pour les cas où le contenu n'est pas encore fusionné). */
|
|
90
101
|
export const EMPTY_VALIDATION = {
|
|
@@ -92,5 +103,8 @@ export const EMPTY_VALIDATION = {
|
|
|
92
103
|
residualMarkerLines: [],
|
|
93
104
|
syntaxError: null,
|
|
94
105
|
isValid: true,
|
|
106
|
+
parseTreeValid: null,
|
|
107
|
+
parseTreeErrors: 0,
|
|
108
|
+
parseTreeErrorRanges: [],
|
|
95
109
|
};
|
|
96
110
|
//# sourceMappingURL=validation.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validation.js","sourceRoot":"","sources":["../../src/resolver/validation.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,KAAK,IAAI,SAAS,EAAE,MAAM,WAAW,CAAC;AAG/C,kDAAkD;AAClD,MAAM,CAAC,MAAM,wBAAwB,GAAG;IACtC,SAAS,EAAG,eAAe;IAC3B,SAAS,EAAG,iBAAiB;IAC7B,UAAU,EAAE,eAAe;IAC3B,QAAQ,EAAI,UAAU;CACvB,CAAC;AAQF,sEAAsE;AACtE,SAAS,YAAY,CAAC,QAAgB;IACpC,IAAI,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC;QAAE,OAAO,MAAM,CAAC;IACjD,IAAI,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC;QAAE,OAAO,MAAM,CAAC;IAC9C,IAAI,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC;QAAE,OAAO,MAAM,CAAC;IAC7C,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;;GAOG;AACH,SAAS,QAAQ,CAAC,OAAe,EAAE,MAAwB;IACzD,IAAI,MAAM,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IACjC,IAAI,CAAC;QACH,QAAQ,MAAM,EAAE,CAAC;YACf,KAAK,MAAM;gBACT,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;gBACpB,OAAO,IAAI,CAAC;YACd,KAAK,MAAM;gBACT,yEAAyE;gBACzE,mEAAmE;gBACnE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;gBACpB,OAAO,IAAI,CAAC;YACd,KAAK,MAAM;gBACT,SAAS,CAAC,OAAO,CAAC,CAAC;gBACnB,OAAO,IAAI,CAAC;QAChB,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC7D,OAAO,GAAG,MAAM,CAAC,WAAW,EAAE,KAAK,GAAG,EAAE,CAAC;IAC3C,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,qBAAqB,CAAC,OAAe,EAAE,QAAgB;IACrE,sCAAsC;IACtC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAClC,MAAM,mBAAmB,GAAa,EAAE,CAAC;IAEzC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACtB,IAAI,wBAAwB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;YACvD,mBAAmB,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,YAAY;QAC/C,CAAC;IACH,CAAC;IAED,MAAM,kBAAkB,GAAG,mBAAmB,CAAC,MAAM,GAAG,CAAC,CAAC;IAE1D,mDAAmD;IACnD,MAAM,MAAM,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;IACtC,MAAM,WAAW,GAAG,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAE9C,MAAM,OAAO,GAAG,CAAC,kBAAkB,IAAI,WAAW,KAAK,IAAI,CAAC;IAE5D,OAAO,
|
|
1
|
+
{"version":3,"file":"validation.js","sourceRoot":"","sources":["../../src/resolver/validation.ts"],"names":[],"mappings":"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"}
|