intentpatch 0.1.1 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.ko.md +39 -21
- package/README.md +36 -16
- package/dist/application/ports/module-alias-resolver.d.ts +11 -0
- package/dist/application/ports/module-alias-resolver.d.ts.map +1 -0
- package/dist/application/ports/module-alias-resolver.js +2 -0
- package/dist/application/ports/module-alias-resolver.js.map +1 -0
- package/dist/application/ports/package-lock-parser.d.ts +20 -0
- package/dist/application/ports/package-lock-parser.d.ts.map +1 -0
- package/dist/application/ports/package-lock-parser.js +2 -0
- package/dist/application/ports/package-lock-parser.js.map +1 -0
- package/dist/application/rules/npm-lockfile-rule.d.ts +12 -0
- package/dist/application/rules/npm-lockfile-rule.d.ts.map +1 -0
- package/dist/application/rules/npm-lockfile-rule.js +109 -0
- package/dist/application/rules/npm-lockfile-rule.js.map +1 -0
- package/dist/application/rules/npm-workspace-dependency-rule.d.ts +10 -0
- package/dist/application/rules/npm-workspace-dependency-rule.d.ts.map +1 -0
- package/dist/application/rules/npm-workspace-dependency-rule.js +155 -0
- package/dist/application/rules/npm-workspace-dependency-rule.js.map +1 -0
- package/dist/application/rules/package-dependency-rule.d.ts +4 -3
- package/dist/application/rules/package-dependency-rule.d.ts.map +1 -1
- package/dist/application/rules/package-dependency-rule.js +33 -28
- package/dist/application/rules/package-dependency-rule.js.map +1 -1
- package/dist/application/services/analyze-import-impact.d.ts +3 -1
- package/dist/application/services/analyze-import-impact.d.ts.map +1 -1
- package/dist/application/services/analyze-import-impact.js +12 -7
- package/dist/application/services/analyze-import-impact.js.map +1 -1
- package/dist/infrastructure/git/git-file-snapshot-source.d.ts.map +1 -1
- package/dist/infrastructure/git/git-file-snapshot-source.js +4 -2
- package/dist/infrastructure/git/git-file-snapshot-source.js.map +1 -1
- package/dist/infrastructure/npm/npm-package-lock-parser.d.ts +6 -0
- package/dist/infrastructure/npm/npm-package-lock-parser.d.ts.map +1 -0
- package/dist/infrastructure/npm/npm-package-lock-parser.js +93 -0
- package/dist/infrastructure/npm/npm-package-lock-parser.js.map +1 -0
- package/dist/infrastructure/typescript/typescript-config-loader.d.ts +17 -0
- package/dist/infrastructure/typescript/typescript-config-loader.d.ts.map +1 -0
- package/dist/infrastructure/typescript/typescript-config-loader.js +99 -0
- package/dist/infrastructure/typescript/typescript-config-loader.js.map +1 -0
- package/dist/infrastructure/typescript/typescript-module-alias-resolver.d.ts +10 -0
- package/dist/infrastructure/typescript/typescript-module-alias-resolver.d.ts.map +1 -0
- package/dist/infrastructure/typescript/typescript-module-alias-resolver.js +78 -0
- package/dist/infrastructure/typescript/typescript-module-alias-resolver.js.map +1 -0
- package/dist/presentation/analyze-repository.d.ts.map +1 -1
- package/dist/presentation/analyze-repository.js +7 -3
- package/dist/presentation/analyze-repository.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"npm-workspace-dependency-rule.js","sourceRoot":"","sources":["../../../src/application/rules/npm-workspace-dependency-rule.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,12 +2,13 @@ import type { Finding } from "../../domain/finding.js";
|
|
|
2
2
|
import type { AnalysisContext, AnalysisRule } from "../ports/analysis-rule.js";
|
|
3
3
|
import type { FileSnapshotSource } from "../ports/file-snapshot-source.js";
|
|
4
4
|
/**
|
|
5
|
-
*
|
|
6
|
-
*
|
|
5
|
+
* 한 package.json의 직접 dependency 선언 변경을 판단한다.
|
|
6
|
+
* 루트와 workspace 규칙이 같은 판단 기준을 사용하도록 경로를 주입받는다.
|
|
7
7
|
*/
|
|
8
8
|
export declare class PackageDependencyRule implements AnalysisRule {
|
|
9
9
|
private readonly snapshots;
|
|
10
|
-
|
|
10
|
+
private readonly manifestPath;
|
|
11
|
+
constructor(snapshots: FileSnapshotSource, manifestPath?: string);
|
|
11
12
|
analyze(context: AnalysisContext): Promise<readonly Finding[]>;
|
|
12
13
|
}
|
|
13
14
|
//# sourceMappingURL=package-dependency-rule.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"package-dependency-rule.d.ts","sourceRoot":"","sources":["../../../src/application/rules/package-dependency-rule.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAY,MAAM,yBAAyB,CAAC;AACjE,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAC/E,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AAgB3E;;;GAGG;AACH,qBAAa,qBAAsB,YAAW,YAAY;
|
|
1
|
+
{"version":3,"file":"package-dependency-rule.d.ts","sourceRoot":"","sources":["../../../src/application/rules/package-dependency-rule.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAY,MAAM,yBAAyB,CAAC;AACjE,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAC/E,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AAgB3E;;;GAGG;AACH,qBAAa,qBAAsB,YAAW,YAAY;IAEtD,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,YAAY;gBADZ,SAAS,EAAE,kBAAkB,EAC7B,YAAY,SAAmB;IAGrC,OAAO,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,SAAS,OAAO,EAAE,CAAC;CA6B5E"}
|
|
@@ -1,21 +1,26 @@
|
|
|
1
|
-
const
|
|
1
|
+
const rootManifestPath = "package.json";
|
|
2
2
|
const dependencySections = ["dependencies", "devDependencies"];
|
|
3
3
|
/**
|
|
4
|
-
*
|
|
5
|
-
*
|
|
4
|
+
* 한 package.json의 직접 dependency 선언 변경을 판단한다.
|
|
5
|
+
* 루트와 workspace 규칙이 같은 판단 기준을 사용하도록 경로를 주입받는다.
|
|
6
6
|
*/
|
|
7
7
|
export class PackageDependencyRule {
|
|
8
8
|
snapshots;
|
|
9
|
-
|
|
9
|
+
manifestPath;
|
|
10
|
+
constructor(snapshots, manifestPath = rootManifestPath) {
|
|
10
11
|
this.snapshots = snapshots;
|
|
12
|
+
this.manifestPath = manifestPath;
|
|
11
13
|
}
|
|
12
14
|
async analyze(context) {
|
|
13
|
-
|
|
15
|
+
const change = context.changes.files.find((item) => item.path === this.manifestPath || item.previousPath === this.manifestPath);
|
|
16
|
+
if (change === undefined) {
|
|
14
17
|
return [];
|
|
15
18
|
}
|
|
16
|
-
const snapshot = await this.snapshots.read(context.target, manifestPath)
|
|
17
|
-
|
|
18
|
-
|
|
19
|
+
const snapshot = await this.snapshots.read(context.target, this.manifestPath, change.kind === "renamed" && isPackageManifestPath(change.previousPath)
|
|
20
|
+
? change.previousPath
|
|
21
|
+
: undefined);
|
|
22
|
+
const before = parseManifest(snapshot.before, "base", this.manifestPath);
|
|
23
|
+
const after = parseManifest(snapshot.after, "current", this.manifestPath);
|
|
19
24
|
if (!before.ok && !after.ok) {
|
|
20
25
|
return [before.finding, after.finding];
|
|
21
26
|
}
|
|
@@ -25,13 +30,13 @@ export class PackageDependencyRule {
|
|
|
25
30
|
if (!after.ok) {
|
|
26
31
|
return [after.finding];
|
|
27
32
|
}
|
|
28
|
-
return compareDependencies(before.dependencies, after.dependencies);
|
|
33
|
+
return compareDependencies(before.dependencies, after.dependencies, this.manifestPath);
|
|
29
34
|
}
|
|
30
35
|
}
|
|
31
|
-
function
|
|
32
|
-
return
|
|
36
|
+
function isPackageManifestPath(path) {
|
|
37
|
+
return path === rootManifestPath || path?.endsWith("/package.json") === true;
|
|
33
38
|
}
|
|
34
|
-
function parseManifest(content, side) {
|
|
39
|
+
function parseManifest(content, side, manifestPath) {
|
|
35
40
|
if (content === undefined) {
|
|
36
41
|
return { ok: true, dependencies: new Map() };
|
|
37
42
|
}
|
|
@@ -40,10 +45,10 @@ function parseManifest(content, side) {
|
|
|
40
45
|
value = JSON.parse(content);
|
|
41
46
|
}
|
|
42
47
|
catch {
|
|
43
|
-
return invalidManifest(side, "The file is not valid JSON.");
|
|
48
|
+
return invalidManifest(side, "The file is not valid JSON.", manifestPath);
|
|
44
49
|
}
|
|
45
50
|
if (!isRecord(value)) {
|
|
46
|
-
return invalidManifest(side, "The root value must be a JSON object.");
|
|
51
|
+
return invalidManifest(side, "The root value must be a JSON object.", manifestPath);
|
|
47
52
|
}
|
|
48
53
|
const dependencies = new Map();
|
|
49
54
|
for (const section of dependencySections) {
|
|
@@ -52,48 +57,48 @@ function parseManifest(content, side) {
|
|
|
52
57
|
continue;
|
|
53
58
|
}
|
|
54
59
|
if (!isRecord(entries)) {
|
|
55
|
-
return invalidManifest(side, `${section} must be a JSON object
|
|
60
|
+
return invalidManifest(side, `${section} must be a JSON object.`, manifestPath);
|
|
56
61
|
}
|
|
57
62
|
for (const [name, version] of Object.entries(entries)) {
|
|
58
63
|
if (typeof version !== "string") {
|
|
59
|
-
return invalidManifest(side, `${section}.${name} must have a string version
|
|
64
|
+
return invalidManifest(side, `${section}.${name} must have a string version.`, manifestPath);
|
|
60
65
|
}
|
|
61
66
|
if (dependencies.has(name)) {
|
|
62
|
-
return invalidManifest(side, `${name} is declared in more than one dependency section
|
|
67
|
+
return invalidManifest(side, `${name} is declared in more than one dependency section.`, manifestPath);
|
|
63
68
|
}
|
|
64
69
|
dependencies.set(name, { section, version });
|
|
65
70
|
}
|
|
66
71
|
}
|
|
67
72
|
return { ok: true, dependencies };
|
|
68
73
|
}
|
|
69
|
-
function compareDependencies(before, after) {
|
|
74
|
+
function compareDependencies(before, after, manifestPath) {
|
|
70
75
|
const names = [...new Set([...before.keys(), ...after.keys()])].sort((left, right) => left.localeCompare(right));
|
|
71
76
|
const findings = [];
|
|
72
77
|
for (const name of names) {
|
|
73
78
|
const previous = before.get(name);
|
|
74
79
|
const current = after.get(name);
|
|
75
80
|
if (previous === undefined && current !== undefined) {
|
|
76
|
-
findings.push(addedDependency(name, current));
|
|
81
|
+
findings.push(addedDependency(name, current, manifestPath));
|
|
77
82
|
continue;
|
|
78
83
|
}
|
|
79
84
|
if (previous !== undefined && current === undefined) {
|
|
80
|
-
findings.push(removedDependency(name, previous));
|
|
85
|
+
findings.push(removedDependency(name, previous, manifestPath));
|
|
81
86
|
continue;
|
|
82
87
|
}
|
|
83
88
|
if (previous === undefined || current === undefined) {
|
|
84
89
|
continue;
|
|
85
90
|
}
|
|
86
91
|
if (previous.section !== current.section) {
|
|
87
|
-
findings.push(movedDependency(name, previous, current));
|
|
92
|
+
findings.push(movedDependency(name, previous, current, manifestPath));
|
|
88
93
|
continue;
|
|
89
94
|
}
|
|
90
95
|
if (previous.version !== current.version) {
|
|
91
|
-
findings.push(changedDependency(name, previous, current));
|
|
96
|
+
findings.push(changedDependency(name, previous, current, manifestPath));
|
|
92
97
|
}
|
|
93
98
|
}
|
|
94
99
|
return findings;
|
|
95
100
|
}
|
|
96
|
-
function addedDependency(name, declaration) {
|
|
101
|
+
function addedDependency(name, declaration, manifestPath) {
|
|
97
102
|
const production = declaration.section === "dependencies";
|
|
98
103
|
return {
|
|
99
104
|
ruleId: production ? "dependency/new-production" : "dependency/new-development",
|
|
@@ -108,7 +113,7 @@ function addedDependency(name, declaration) {
|
|
|
108
113
|
},
|
|
109
114
|
};
|
|
110
115
|
}
|
|
111
|
-
function removedDependency(name, declaration) {
|
|
116
|
+
function removedDependency(name, declaration, manifestPath) {
|
|
112
117
|
return {
|
|
113
118
|
ruleId: "dependency/removed",
|
|
114
119
|
severity: "low",
|
|
@@ -122,7 +127,7 @@ function removedDependency(name, declaration) {
|
|
|
122
127
|
},
|
|
123
128
|
};
|
|
124
129
|
}
|
|
125
|
-
function movedDependency(name, previous, current) {
|
|
130
|
+
function movedDependency(name, previous, current, manifestPath) {
|
|
126
131
|
return {
|
|
127
132
|
ruleId: "dependency/section-changed",
|
|
128
133
|
severity: current.section === "dependencies" ? "medium" : "low",
|
|
@@ -137,7 +142,7 @@ function movedDependency(name, previous, current) {
|
|
|
137
142
|
},
|
|
138
143
|
};
|
|
139
144
|
}
|
|
140
|
-
function changedDependency(name, previous, current) {
|
|
145
|
+
function changedDependency(name, previous, current, manifestPath) {
|
|
141
146
|
return {
|
|
142
147
|
ruleId: "dependency/version-changed",
|
|
143
148
|
severity: severityFor(current.section),
|
|
@@ -152,14 +157,14 @@ function changedDependency(name, previous, current) {
|
|
|
152
157
|
},
|
|
153
158
|
};
|
|
154
159
|
}
|
|
155
|
-
function invalidManifest(side, reason) {
|
|
160
|
+
function invalidManifest(side, reason, manifestPath) {
|
|
156
161
|
return {
|
|
157
162
|
ok: false,
|
|
158
163
|
finding: {
|
|
159
164
|
ruleId: "dependency/invalid-manifest",
|
|
160
165
|
severity: "high",
|
|
161
166
|
title: "Invalid package manifest",
|
|
162
|
-
description: `Could not analyze the ${side}
|
|
167
|
+
description: `Could not analyze the ${side} ${manifestPath}: ${reason}`,
|
|
163
168
|
file: manifestPath,
|
|
164
169
|
evidence: { side, reason },
|
|
165
170
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"package-dependency-rule.js","sourceRoot":"","sources":["../../../src/application/rules/package-dependency-rule.ts"],"names":[],"mappings":"AAIA,MAAM,
|
|
1
|
+
{"version":3,"file":"package-dependency-rule.js","sourceRoot":"","sources":["../../../src/application/rules/package-dependency-rule.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,13 +1,15 @@
|
|
|
1
1
|
import { type ImpactAnalysis } from "../../domain/impact.js";
|
|
2
2
|
import type { AnalysisContext } from "../ports/analysis-rule.js";
|
|
3
3
|
import type { ChangeImpactAnalyzer } from "../ports/change-impact-analyzer.js";
|
|
4
|
+
import type { ModuleAliasResolver } from "../ports/module-alias-resolver.js";
|
|
4
5
|
import type { ModuleReferenceExtractor } from "../ports/module-reference-extractor.js";
|
|
5
6
|
import type { ProjectFileSource } from "../ports/project-file-source.js";
|
|
6
7
|
/** 현재 module graph를 역방향으로 탐색해 변경 파일의 직접·간접 의존자를 찾는다. */
|
|
7
8
|
export declare class AnalyzeImportImpact implements ChangeImpactAnalyzer {
|
|
8
9
|
private readonly files;
|
|
9
10
|
private readonly extractors;
|
|
10
|
-
|
|
11
|
+
private readonly aliases;
|
|
12
|
+
constructor(files: ProjectFileSource, extractors: readonly ModuleReferenceExtractor[], aliases: ModuleAliasResolver);
|
|
11
13
|
analyze(context: AnalysisContext): Promise<ImpactAnalysis>;
|
|
12
14
|
private extractorFor;
|
|
13
15
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"analyze-import-impact.d.ts","sourceRoot":"","sources":["../../../src/application/services/analyze-import-impact.ts"],"names":[],"mappings":"AACA,OAAO,EAEL,KAAK,cAAc,EAKpB,MAAM,wBAAwB,CAAC;AAChC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,oCAAoC,CAAC;AAC/E,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,wCAAwC,CAAC;AACvF,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AAKzE,wDAAwD;AACxD,qBAAa,mBAAoB,YAAW,oBAAoB;IAE5D,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,UAAU;
|
|
1
|
+
{"version":3,"file":"analyze-import-impact.d.ts","sourceRoot":"","sources":["../../../src/application/services/analyze-import-impact.ts"],"names":[],"mappings":"AACA,OAAO,EAEL,KAAK,cAAc,EAKpB,MAAM,wBAAwB,CAAC;AAChC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,oCAAoC,CAAC;AAC/E,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAC;AAC7E,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,wCAAwC,CAAC;AACvF,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AAKzE,wDAAwD;AACxD,qBAAa,mBAAoB,YAAW,oBAAoB;IAE5D,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAFP,KAAK,EAAE,iBAAiB,EACxB,UAAU,EAAE,SAAS,wBAAwB,EAAE,EAC/C,OAAO,EAAE,mBAAmB;IAGlC,OAAO,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC;IA4DvE,OAAO,CAAC,YAAY;CAGrB"}
|
|
@@ -6,17 +6,20 @@ const emittedJavaScriptExtensions = [".js", ".jsx", ".mjs", ".cjs"];
|
|
|
6
6
|
export class AnalyzeImportImpact {
|
|
7
7
|
files;
|
|
8
8
|
extractors;
|
|
9
|
-
|
|
9
|
+
aliases;
|
|
10
|
+
constructor(files, extractors, aliases) {
|
|
10
11
|
this.files = files;
|
|
11
12
|
this.extractors = extractors;
|
|
13
|
+
this.aliases = aliases;
|
|
12
14
|
}
|
|
13
15
|
async analyze(context) {
|
|
14
16
|
const allPaths = await this.files.listPaths(context.target);
|
|
15
17
|
const sourcePaths = allPaths.filter((path) => this.extractorFor(path) !== undefined);
|
|
16
18
|
const availablePaths = new Set(sourcePaths);
|
|
19
|
+
const aliasResolver = await this.aliases.prepare(context.target, allPaths, availablePaths);
|
|
17
20
|
const dependencies = [];
|
|
18
21
|
const unresolvedReferences = [];
|
|
19
|
-
const issues = [];
|
|
22
|
+
const issues = [...aliasResolver.issues];
|
|
20
23
|
// 저장소 크기에 비례해 파일 핸들과 Git 프로세스가 폭증하지 않도록 순차 처리한다.
|
|
21
24
|
for (const path of sourcePaths) {
|
|
22
25
|
const extractor = this.extractorFor(path);
|
|
@@ -37,12 +40,14 @@ export class AnalyzeImportImpact {
|
|
|
37
40
|
continue;
|
|
38
41
|
}
|
|
39
42
|
for (const specifier of references.specifiers) {
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
43
|
+
const relative = isRelativeSpecifier(specifier);
|
|
44
|
+
const imported = relative
|
|
45
|
+
? resolveRelativeModule(path, specifier, availablePaths)
|
|
46
|
+
: aliasResolver.resolve(path, specifier);
|
|
44
47
|
if (imported === undefined) {
|
|
45
|
-
|
|
48
|
+
if (relative) {
|
|
49
|
+
unresolvedReferences.push({ importer: path, specifier });
|
|
50
|
+
}
|
|
46
51
|
}
|
|
47
52
|
else {
|
|
48
53
|
dependencies.push({ importer: path, imported });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"analyze-import-impact.js","sourceRoot":"","sources":["../../../src/application/services/analyze-import-impact.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AAClC,OAAO,EACL,oBAAoB,GAMrB,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"analyze-import-impact.js","sourceRoot":"","sources":["../../../src/application/services/analyze-import-impact.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AAClC,OAAO,EACL,oBAAoB,GAMrB,MAAM,wBAAwB,CAAC;AAOhC,MAAM,gBAAgB,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAU,CAAC;AAC3D,MAAM,2BAA2B,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAU,CAAC;AAE7E,wDAAwD;AACxD,MAAM,OAAO,mBAAmB;IAEX;IACA;IACA;IAHnB,YACmB,KAAwB,EACxB,UAA+C,EAC/C,OAA4B;QAF5B,UAAK,GAAL,KAAK,CAAmB;QACxB,eAAU,GAAV,UAAU,CAAqC;QAC/C,YAAO,GAAP,OAAO,CAAqB;IAC5C,CAAC;IAEG,KAAK,CAAC,OAAO,CAAC,OAAwB;QAC3C,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAC5D,MAAM,WAAW,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,SAAS,CAAC,CAAC;QACrF,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC,CAAC;QAC5C,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,QAAQ,EAAE,cAAc,CAAC,CAAC;QAC3F,MAAM,YAAY,GAAuB,EAAE,CAAC;QAC5C,MAAM,oBAAoB,GAAgC,EAAE,CAAC;QAC7D,MAAM,MAAM,GAA0B,CAAC,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;QAEhE,iDAAiD;QACjD,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE,CAAC;YAC/B,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;YAC1C,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;gBAC5B,SAAS;YACX,CAAC;YACD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;YACzD,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;gBAC5B,SAAS;YACX,CAAC;YACD,IAAI,IAAI,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;gBAChC,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;gBAC3C,SAAS;YACX,CAAC;YAED,MAAM,UAAU,GAAG,SAAS,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;YACzD,IAAI,UAAU,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;gBACtC,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC;gBACjD,SAAS;YACX,CAAC;YAED,KAAK,MAAM,SAAS,IAAI,UAAU,CAAC,UAAU,EAAE,CAAC;gBAC9C,MAAM,QAAQ,GAAG,mBAAmB,CAAC,SAAS,CAAC,CAAC;gBAChD,MAAM,QAAQ,GAAG,QAAQ;oBACvB,CAAC,CAAC,qBAAqB,CAAC,IAAI,EAAE,SAAS,EAAE,cAAc,CAAC;oBACxD,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;gBAC3C,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;oBAC3B,IAAI,QAAQ,EAAE,CAAC;wBACb,oBAAoB,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;oBAC3D,CAAC;gBACH,CAAC;qBAAM,CAAC;oBACN,YAAY,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;gBAClD,CAAC;YACH,CAAC;QACH,CAAC;QAED,MAAM,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK;aACzC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,SAAS,CAAC;aAC5D,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC5B,MAAM,aAAa,GAAG,sBAAsB,CAAC,cAAc,EAAE,YAAY,CAAC,CAAC;QAE3E,OAAO,oBAAoB,CAAC;YAC1B,WAAW,EAAE,WAAW,CAAC,MAAM;YAC/B,cAAc;YACd,YAAY;YACZ,aAAa;YACb,oBAAoB;YACpB,MAAM;SACP,CAAC,CAAC;IACL,CAAC;IAEO,YAAY,CAAC,IAAY;QAC/B,OAAO,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;IACvE,CAAC;CACF;AAED,SAAS,mBAAmB,CAAC,SAAiB;IAC5C,OAAO,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,SAAS,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;AACnE,CAAC;AAED,SAAS,qBAAqB,CAC5B,QAAgB,EAChB,SAAiB,EACjB,cAAmC;IAEnC,MAAM,QAAQ,GAAG,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC;IACjF,IAAI,QAAQ,KAAK,IAAI,IAAI,QAAQ,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAClF,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,KAAK,MAAM,SAAS,IAAI,gBAAgB,CAAC,QAAQ,CAAC,EAAE,CAAC;QACnD,IAAI,cAAc,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;YAClC,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,gBAAgB,CAAC,QAAgB;IACxC,MAAM,UAAU,GAAG,CAAC,QAAQ,CAAC,CAAC;IAC9B,MAAM,gBAAgB,GAAG,2BAA2B,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CACtE,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC,CAC7B,CAAC;IAEF,IAAI,gBAAgB,KAAK,SAAS,EAAE,CAAC;QACnC,MAAM,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;QACzD,UAAU,CAAC,IAAI,CAAC,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,GAAG,IAAI,GAAG,SAAS,EAAE,CAAC,CAAC,CAAC;QAC/E,OAAO,UAAU,CAAC;IACpB,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzC,UAAU,CAAC,IAAI,CAAC,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,GAAG,QAAQ,GAAG,SAAS,EAAE,CAAC,CAAC,CAAC;QACnF,UAAU,CAAC,IAAI,CACb,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,SAAS,EAAE,CAAC,CAAC,CAClF,CAAC;IACJ,CAAC;IAED,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,SAAS,sBAAsB,CAC7B,cAAiC,EACjC,YAAyC;IAEzC,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,cAAc,CAAC,CAAC;IACxC,MAAM,iBAAiB,GAAG,IAAI,GAAG,EAAuB,CAAC;IACzD,MAAM,OAAO,GAAG,IAAI,GAAG,EAA6D,CAAC;IAErF,KAAK,MAAM,UAAU,IAAI,YAAY,EAAE,CAAC;QACtC,MAAM,SAAS,GAAG,iBAAiB,CAAC,GAAG,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,IAAI,GAAG,EAAU,CAAC;QAClF,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;QACnC,iBAAiB,CAAC,GAAG,CAAC,UAAU,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;IACxD,CAAC;IAED,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE,CAAC;QAC3B,MAAM,KAAK,GAA8C,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAC;QACvF,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QAEhC,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;YACrD,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;YAC7B,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;gBAC1B,SAAS;YACX,CAAC;YACD,KAAK,MAAM,QAAQ,IAAI,iBAAiB,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;gBACjE,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;oBAC1B,SAAS;gBACX,CAAC;gBACD,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;gBACtB,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;gBACtC,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC;gBAEzC,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;oBAC1B,SAAS;gBACX,CAAC;gBACD,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;gBACvC,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;oBAC3B,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,QAAQ,EAAE,cAAc,EAAE,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC;gBACvE,CAAC;qBAAM,CAAC;oBACN,QAAQ,CAAC,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;oBAC1D,QAAQ,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gBACpC,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,CAAC,GAAG,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;QAC3C,IAAI;QACJ,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,cAAc,EAAE,CAAC,GAAG,MAAM,CAAC,cAAc,CAAC;KAC3C,CAAC,CAAC,CAAC;AACN,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"git-file-snapshot-source.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/git/git-file-snapshot-source.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,kBAAkB,EAClB,gBAAgB,EACjB,MAAM,iDAAiD,CAAC;AACzD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAE7D,OAAO,EAAE,KAAK,aAAa,EAAqB,MAAM,8BAA8B,CAAC;
|
|
1
|
+
{"version":3,"file":"git-file-snapshot-source.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/git/git-file-snapshot-source.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,kBAAkB,EAClB,gBAAgB,EACjB,MAAM,iDAAiD,CAAC;AACzD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAE7D,OAAO,EAAE,KAAK,aAAa,EAAqB,MAAM,8BAA8B,CAAC;AAKrF,wDAAwD;AACxD,qBAAa,qBAAsB,YAAW,kBAAkB;IAE5D,OAAO,CAAC,QAAQ,CAAC,gBAAgB;IACjC,OAAO,CAAC,QAAQ,CAAC,aAAa;gBADb,gBAAgB,EAAE,MAAM,EACxB,aAAa,GAAE,aAAuC;IAG5D,IAAI,CACf,MAAM,EAAE,cAAc,EACtB,IAAI,EAAE,MAAM,EACZ,QAAQ,SAAO,GACd,OAAO,CAAC,gBAAgB,CAAC;YAuBd,mBAAmB;YAiBnB,YAAY;YAuBZ,eAAe;CA4B9B"}
|
|
@@ -2,6 +2,7 @@ import { lstat, readFile } from "node:fs/promises";
|
|
|
2
2
|
import { resolveRepositoryPath } from "../filesystem/repository-path.js";
|
|
3
3
|
import { NodeCommandRunner } from "../process/command-runner.js";
|
|
4
4
|
const maximumTextFileSize = 1024 * 1024;
|
|
5
|
+
const maximumLockfileSize = 10 * maximumTextFileSize;
|
|
5
6
|
/** Git 기준점과 working tree 또는 head ref에서 분석용 텍스트를 읽는다. */
|
|
6
7
|
export class GitFileSnapshotSource {
|
|
7
8
|
workingDirectory;
|
|
@@ -72,8 +73,9 @@ export class GitFileSnapshotSource {
|
|
|
72
73
|
if (!metadata.isFile()) {
|
|
73
74
|
throw new Error(`Expected a regular file: ${path}`);
|
|
74
75
|
}
|
|
75
|
-
|
|
76
|
-
|
|
76
|
+
const sizeLimit = path === "package-lock.json" ? maximumLockfileSize : maximumTextFileSize;
|
|
77
|
+
if (metadata.size > sizeLimit) {
|
|
78
|
+
throw new Error(`Text file exceeds the ${sizeLimit / maximumTextFileSize} MiB analysis limit: ${path}`);
|
|
77
79
|
}
|
|
78
80
|
return readFile(absolutePath, "utf8");
|
|
79
81
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"git-file-snapshot-source.js","sourceRoot":"","sources":["../../../src/infrastructure/git/git-file-snapshot-source.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAMnD,OAAO,EAAE,qBAAqB,EAAE,MAAM,kCAAkC,CAAC;AACzE,OAAO,EAAsB,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AAErF,MAAM,mBAAmB,GAAG,IAAI,GAAG,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"git-file-snapshot-source.js","sourceRoot":"","sources":["../../../src/infrastructure/git/git-file-snapshot-source.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { PackageLockParseResult, PackageLockParser } from "../../application/ports/package-lock-parser.js";
|
|
2
|
+
/** npm v7+의 packages 맵을 설치 위치별 사실로 변환한다. v2의 레거시 dependencies 맵은 중복 집계하지 않는다. */
|
|
3
|
+
export declare class NpmPackageLockParser implements PackageLockParser {
|
|
4
|
+
parse(content: string): PackageLockParseResult;
|
|
5
|
+
}
|
|
6
|
+
//# sourceMappingURL=npm-package-lock-parser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"npm-package-lock-parser.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/npm/npm-package-lock-parser.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,sBAAsB,EACtB,iBAAiB,EAClB,MAAM,gDAAgD,CAAC;AASxD,iFAAiF;AACjF,qBAAa,oBAAqB,YAAW,iBAAiB;IACrD,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,sBAAsB;CAuEtD"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
const directDependencySections = [
|
|
2
|
+
"dependencies",
|
|
3
|
+
"devDependencies",
|
|
4
|
+
"optionalDependencies",
|
|
5
|
+
"peerDependencies",
|
|
6
|
+
];
|
|
7
|
+
/** npm v7+의 packages 맵을 설치 위치별 사실로 변환한다. v2의 레거시 dependencies 맵은 중복 집계하지 않는다. */
|
|
8
|
+
export class NpmPackageLockParser {
|
|
9
|
+
parse(content) {
|
|
10
|
+
let value;
|
|
11
|
+
try {
|
|
12
|
+
value = JSON.parse(content);
|
|
13
|
+
}
|
|
14
|
+
catch {
|
|
15
|
+
return invalid("The file is not valid JSON.");
|
|
16
|
+
}
|
|
17
|
+
if (!isRecord(value)) {
|
|
18
|
+
return invalid("The root value must be a JSON object.");
|
|
19
|
+
}
|
|
20
|
+
if (typeof value.lockfileVersion !== "number" || !Number.isInteger(value.lockfileVersion)) {
|
|
21
|
+
return invalid("lockfileVersion must be an integer.");
|
|
22
|
+
}
|
|
23
|
+
if (value.lockfileVersion !== 2 && value.lockfileVersion !== 3) {
|
|
24
|
+
return {
|
|
25
|
+
ok: false,
|
|
26
|
+
kind: "unsupported",
|
|
27
|
+
reason: `Supported lockfile versions are 2 and 3; found ${value.lockfileVersion}.`,
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
if (!isRecord(value.packages)) {
|
|
31
|
+
return invalid("packages must be a JSON object.");
|
|
32
|
+
}
|
|
33
|
+
const root = value.packages[""];
|
|
34
|
+
if (root !== undefined && !isRecord(root)) {
|
|
35
|
+
return invalid('packages[""] must be a JSON object.');
|
|
36
|
+
}
|
|
37
|
+
const rootDirect = new Set();
|
|
38
|
+
if (root !== undefined) {
|
|
39
|
+
for (const section of directDependencySections) {
|
|
40
|
+
const declarations = root[section];
|
|
41
|
+
if (declarations === undefined) {
|
|
42
|
+
continue;
|
|
43
|
+
}
|
|
44
|
+
if (!isRecord(declarations)) {
|
|
45
|
+
return invalid(`packages[""].${section} must be a JSON object.`);
|
|
46
|
+
}
|
|
47
|
+
for (const name of Object.keys(declarations)) {
|
|
48
|
+
rootDirect.add(name);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
const packages = new Map();
|
|
53
|
+
for (const [path, descriptor] of Object.entries(value.packages)) {
|
|
54
|
+
const name = packageNameAt(path);
|
|
55
|
+
if (name === undefined) {
|
|
56
|
+
continue;
|
|
57
|
+
}
|
|
58
|
+
if (!isRecord(descriptor)) {
|
|
59
|
+
return invalid(`packages[${JSON.stringify(path)}] must be a JSON object.`);
|
|
60
|
+
}
|
|
61
|
+
// npm workspaces and local links are represented as symlinks, not resolved external packages.
|
|
62
|
+
if (descriptor.link === true) {
|
|
63
|
+
continue;
|
|
64
|
+
}
|
|
65
|
+
if (typeof descriptor.version !== "string" || descriptor.version.length === 0) {
|
|
66
|
+
return invalid(`packages[${JSON.stringify(path)}].version must be a non-empty string.`);
|
|
67
|
+
}
|
|
68
|
+
packages.set(path, {
|
|
69
|
+
path,
|
|
70
|
+
name,
|
|
71
|
+
version: descriptor.version,
|
|
72
|
+
rootDirect: path === `node_modules/${name}` && rootDirect.has(name),
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
return { ok: true, packages };
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
function packageNameAt(path) {
|
|
79
|
+
const marker = "node_modules/";
|
|
80
|
+
const markerIndex = path.lastIndexOf(marker);
|
|
81
|
+
if (markerIndex === -1 || (markerIndex > 0 && path[markerIndex - 1] !== "/")) {
|
|
82
|
+
return undefined;
|
|
83
|
+
}
|
|
84
|
+
const name = path.slice(markerIndex + marker.length);
|
|
85
|
+
return /^(?:@[^/]+\/)?[^/]+$/.test(name) ? name : undefined;
|
|
86
|
+
}
|
|
87
|
+
function invalid(reason) {
|
|
88
|
+
return { ok: false, kind: "invalid", reason };
|
|
89
|
+
}
|
|
90
|
+
function isRecord(value) {
|
|
91
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=npm-package-lock-parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"npm-package-lock-parser.js","sourceRoot":"","sources":["../../../src/infrastructure/npm/npm-package-lock-parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import ts from "typescript";
|
|
2
|
+
import type { ProjectFileSource } from "../../application/ports/project-file-source.js";
|
|
3
|
+
import type { ImpactAnalysisIssue } from "../../domain/impact.js";
|
|
4
|
+
import type { AnalysisTarget } from "../../domain/report.js";
|
|
5
|
+
export declare const virtualProjectRoot = "/__intentpatch_project__";
|
|
6
|
+
export declare function virtualProjectPath(path: string): string;
|
|
7
|
+
export interface LoadedTypeScriptConfigs {
|
|
8
|
+
readonly optionsByPath: ReadonlyMap<string, ts.CompilerOptions>;
|
|
9
|
+
readonly issues: readonly ImpactAnalysisIssue[];
|
|
10
|
+
}
|
|
11
|
+
/** Git snapshot의 설정만 사용해 TypeScript 경로 별칭을 읽는다. */
|
|
12
|
+
export declare class TypeScriptConfigLoader {
|
|
13
|
+
private readonly files;
|
|
14
|
+
constructor(files: ProjectFileSource);
|
|
15
|
+
load(target: AnalysisTarget, repositoryPaths: readonly string[], configPaths: readonly string[]): Promise<LoadedTypeScriptConfigs>;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=typescript-config-loader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"typescript-config-loader.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/typescript/typescript-config-loader.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,YAAY,CAAC;AAC5B,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gDAAgD,CAAC;AACxF,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAE7D,eAAO,MAAM,kBAAkB,6BAA6B,CAAC;AAE7D,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEvD;AAED,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,aAAa,EAAE,WAAW,CAAC,MAAM,EAAE,EAAE,CAAC,eAAe,CAAC,CAAC;IAChE,QAAQ,CAAC,MAAM,EAAE,SAAS,mBAAmB,EAAE,CAAC;CACjD;AAED,mDAAmD;AACnD,qBAAa,sBAAsB;IACd,OAAO,CAAC,QAAQ,CAAC,KAAK;gBAAL,KAAK,EAAE,iBAAiB;IAE/C,IAAI,CACf,MAAM,EAAE,cAAc,EACtB,eAAe,EAAE,SAAS,MAAM,EAAE,EAClC,WAAW,EAAE,SAAS,MAAM,EAAE,GAC7B,OAAO,CAAC,uBAAuB,CAAC;CAyFpC"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { posix } from "node:path";
|
|
2
|
+
import ts from "typescript";
|
|
3
|
+
export const virtualProjectRoot = "/__intentpatch_project__";
|
|
4
|
+
export function virtualProjectPath(path) {
|
|
5
|
+
return posix.join(virtualProjectRoot, path);
|
|
6
|
+
}
|
|
7
|
+
/** Git snapshot의 설정만 사용해 TypeScript 경로 별칭을 읽는다. */
|
|
8
|
+
export class TypeScriptConfigLoader {
|
|
9
|
+
files;
|
|
10
|
+
constructor(files) {
|
|
11
|
+
this.files = files;
|
|
12
|
+
}
|
|
13
|
+
async load(target, repositoryPaths, configPaths) {
|
|
14
|
+
const listedPaths = new Set(repositoryPaths);
|
|
15
|
+
const configContents = new Map();
|
|
16
|
+
const parsedConfigs = new Map();
|
|
17
|
+
const visited = new Set();
|
|
18
|
+
const issues = [];
|
|
19
|
+
const collect = async (path) => {
|
|
20
|
+
if (visited.has(path)) {
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
visited.add(path);
|
|
24
|
+
const file = await this.files.read(target, path);
|
|
25
|
+
if (file.kind !== "success") {
|
|
26
|
+
issues.push({
|
|
27
|
+
path,
|
|
28
|
+
reason: file.kind === "missing" ? "TypeScript config is missing" : file.reason,
|
|
29
|
+
});
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
const parsed = ts.parseConfigFileTextToJson(path, file.content);
|
|
33
|
+
if (parsed.error !== undefined || !isRecord(parsed.config)) {
|
|
34
|
+
issues.push({
|
|
35
|
+
path,
|
|
36
|
+
reason: parsed.error === undefined
|
|
37
|
+
? "TypeScript config must be an object"
|
|
38
|
+
: ts.flattenDiagnosticMessageText(parsed.error.messageText, "\n"),
|
|
39
|
+
});
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
configContents.set(virtualProjectPath(path), file.content);
|
|
43
|
+
parsedConfigs.set(path, parsed.config);
|
|
44
|
+
const extensions = parsed.config.extends;
|
|
45
|
+
const references = Array.isArray(extensions) ? extensions : [extensions];
|
|
46
|
+
for (const reference of references) {
|
|
47
|
+
if (typeof reference !== "string" || !reference.startsWith(".")) {
|
|
48
|
+
continue;
|
|
49
|
+
}
|
|
50
|
+
const extendedPath = resolveExtendedConfig(path, reference, listedPaths);
|
|
51
|
+
if (extendedPath !== undefined) {
|
|
52
|
+
await collect(extendedPath);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
};
|
|
56
|
+
for (const path of configPaths) {
|
|
57
|
+
await collect(path);
|
|
58
|
+
}
|
|
59
|
+
const host = {
|
|
60
|
+
useCaseSensitiveFileNames: true,
|
|
61
|
+
readDirectory: () => [],
|
|
62
|
+
fileExists: (path) => configContents.has(path),
|
|
63
|
+
readFile: (path) => configContents.get(path),
|
|
64
|
+
};
|
|
65
|
+
const optionsByPath = new Map();
|
|
66
|
+
for (const path of configPaths) {
|
|
67
|
+
const config = parsedConfigs.get(path);
|
|
68
|
+
if (config === undefined) {
|
|
69
|
+
continue;
|
|
70
|
+
}
|
|
71
|
+
const parsed = ts.parseJsonConfigFileContent(config, host, posix.dirname(virtualProjectPath(path)), undefined, virtualProjectPath(path));
|
|
72
|
+
optionsByPath.set(path, parsed.options);
|
|
73
|
+
for (const diagnostic of parsed.errors) {
|
|
74
|
+
// 파일 목록은 사용하지 않으므로 빈 readDirectory에 따른 입력 없음 진단만 제외한다.
|
|
75
|
+
if (diagnostic.code !== 18003) {
|
|
76
|
+
issues.push({
|
|
77
|
+
path,
|
|
78
|
+
reason: ts
|
|
79
|
+
.flattenDiagnosticMessageText(diagnostic.messageText, "\n")
|
|
80
|
+
.replaceAll(`${virtualProjectRoot}/`, ""),
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
return { optionsByPath, issues };
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
function resolveExtendedConfig(configPath, reference, listedPaths) {
|
|
89
|
+
const basePath = posix.normalize(posix.join(posix.dirname(configPath), reference));
|
|
90
|
+
if (basePath === ".." || basePath.startsWith("../") || posix.isAbsolute(basePath)) {
|
|
91
|
+
return undefined;
|
|
92
|
+
}
|
|
93
|
+
const candidates = [basePath, `${basePath}.json`, posix.join(basePath, "tsconfig.json")];
|
|
94
|
+
return candidates.find((candidate) => listedPaths.has(candidate));
|
|
95
|
+
}
|
|
96
|
+
function isRecord(value) {
|
|
97
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=typescript-config-loader.js.map
|