intentpatch 0.7.0 → 0.8.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 +34 -17
- package/README.md +39 -17
- package/dist/application/ports/property-type-compatibility.d.ts +5 -0
- package/dist/application/ports/property-type-compatibility.d.ts.map +1 -0
- package/dist/application/ports/property-type-compatibility.js +2 -0
- package/dist/application/ports/property-type-compatibility.js.map +1 -0
- package/dist/application/ports/yarn-lock-parser.d.ts +19 -0
- package/dist/application/ports/yarn-lock-parser.d.ts.map +1 -0
- package/dist/application/ports/yarn-lock-parser.js +2 -0
- package/dist/application/ports/yarn-lock-parser.js.map +1 -0
- package/dist/application/rules/missing-test-change-rule.d.ts.map +1 -1
- package/dist/application/rules/missing-test-change-rule.js +17 -12
- package/dist/application/rules/missing-test-change-rule.js.map +1 -1
- package/dist/application/rules/public-api-compatibility-rule.d.ts +3 -1
- package/dist/application/rules/public-api-compatibility-rule.d.ts.map +1 -1
- package/dist/application/rules/public-api-compatibility-rule.js +16 -11
- package/dist/application/rules/public-api-compatibility-rule.js.map +1 -1
- package/dist/application/rules/yarn-lockfile-rule.d.ts +12 -0
- package/dist/application/rules/yarn-lockfile-rule.d.ts.map +1 -0
- package/dist/application/rules/yarn-lockfile-rule.js +106 -0
- package/dist/application/rules/yarn-lockfile-rule.js.map +1 -0
- package/dist/application/services/analyze-test-changes.d.ts.map +1 -1
- package/dist/application/services/analyze-test-changes.js +3 -1
- package/dist/application/services/analyze-test-changes.js.map +1 -1
- package/dist/domain/change-contract.d.ts +3 -0
- package/dist/domain/change-contract.d.ts.map +1 -1
- package/dist/domain/change-contract.js +19 -0
- package/dist/domain/change-contract.js.map +1 -1
- package/dist/infrastructure/config/json-change-contract-loader.js +13 -1
- package/dist/infrastructure/config/json-change-contract-loader.js.map +1 -1
- package/dist/infrastructure/git/git-file-snapshot-source.js +1 -1
- package/dist/infrastructure/git/git-file-snapshot-source.js.map +1 -1
- package/dist/infrastructure/typescript/typescript-property-type-compatibility.d.ts +6 -0
- package/dist/infrastructure/typescript/typescript-property-type-compatibility.d.ts.map +1 -0
- package/dist/infrastructure/typescript/typescript-property-type-compatibility.js +72 -0
- package/dist/infrastructure/typescript/typescript-property-type-compatibility.js.map +1 -0
- package/dist/infrastructure/yarn/yarn-lock-parser.d.ts +6 -0
- package/dist/infrastructure/yarn/yarn-lock-parser.d.ts.map +1 -0
- package/dist/infrastructure/yarn/yarn-lock-parser.js +77 -0
- package/dist/infrastructure/yarn/yarn-lock-parser.js.map +1 -0
- package/dist/presentation/analyze-repository.d.ts.map +1 -1
- package/dist/presentation/analyze-repository.js +5 -1
- package/dist/presentation/analyze-repository.js.map +1 -1
- package/dist/presentation/cli/text-report.js +3 -0
- package/dist/presentation/cli/text-report.js.map +1 -1
- package/dist/presentation/html/html-report.d.ts.map +1 -1
- package/dist/presentation/html/html-report.js +84 -14
- package/dist/presentation/html/html-report.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
const lockfilePath = "yarn.lock";
|
|
2
|
+
/** Yarn 4가 고정한 레지스트리 패키지의 추가·제거·단일 버전 교체를 보고한다. */
|
|
3
|
+
export class YarnLockfileRule {
|
|
4
|
+
snapshots;
|
|
5
|
+
parser;
|
|
6
|
+
constructor(snapshots, parser) {
|
|
7
|
+
this.snapshots = snapshots;
|
|
8
|
+
this.parser = parser;
|
|
9
|
+
}
|
|
10
|
+
async analyze(context) {
|
|
11
|
+
if (!context.changes.files.some((file) => file.path === lockfilePath || file.previousPath === lockfilePath))
|
|
12
|
+
return [];
|
|
13
|
+
const snapshot = await this.snapshots.read(context.target, lockfilePath);
|
|
14
|
+
const before = snapshot.before === undefined ? undefined : this.parser.parse(snapshot.before);
|
|
15
|
+
const after = snapshot.after === undefined ? undefined : this.parser.parse(snapshot.after);
|
|
16
|
+
const errors = [
|
|
17
|
+
...(before !== undefined && !before.ok ? [parseFinding("base", before)] : []),
|
|
18
|
+
...(after !== undefined && !after.ok ? [parseFinding("current", after)] : []),
|
|
19
|
+
];
|
|
20
|
+
if (errors.length > 0)
|
|
21
|
+
return errors;
|
|
22
|
+
if (before === undefined && after?.ok)
|
|
23
|
+
return [presenceFinding("added", after.packages.size)];
|
|
24
|
+
if (after === undefined && before?.ok)
|
|
25
|
+
return [presenceFinding("removed", before.packages.size)];
|
|
26
|
+
if (!before?.ok || !after?.ok)
|
|
27
|
+
return [];
|
|
28
|
+
const findings = [];
|
|
29
|
+
const beforeByName = groupByName(before.packages);
|
|
30
|
+
const afterByName = groupByName(after.packages);
|
|
31
|
+
const names = [...new Set([...beforeByName.keys(), ...afterByName.keys()])].sort();
|
|
32
|
+
for (const name of names) {
|
|
33
|
+
const removed = (beforeByName.get(name) ?? []).filter((item) => !after.packages.has(item.id));
|
|
34
|
+
const added = (afterByName.get(name) ?? []).filter((item) => !before.packages.has(item.id));
|
|
35
|
+
if (removed.length === 1 &&
|
|
36
|
+
added.length === 1 &&
|
|
37
|
+
removed[0] !== undefined &&
|
|
38
|
+
added[0] !== undefined) {
|
|
39
|
+
findings.push({
|
|
40
|
+
ruleId: "dependency/locked-version-changed",
|
|
41
|
+
severity: "low",
|
|
42
|
+
title: "Resolved package version changed",
|
|
43
|
+
description: `${name} changed from ${removed[0].version} to ${added[0].version} in yarn.lock.`,
|
|
44
|
+
file: lockfilePath,
|
|
45
|
+
evidence: { ...evidence(added[0]), from: removed[0].version, to: added[0].version },
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
findings.push(...added.map((item) => packageFinding("added", item)), ...removed.map((item) => packageFinding("removed", item)));
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
return findings;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
function groupByName(packages) {
|
|
56
|
+
const grouped = new Map();
|
|
57
|
+
for (const item of packages.values()) {
|
|
58
|
+
const group = grouped.get(item.name) ?? [];
|
|
59
|
+
group.push(item);
|
|
60
|
+
grouped.set(item.name, group);
|
|
61
|
+
}
|
|
62
|
+
return grouped;
|
|
63
|
+
}
|
|
64
|
+
function evidence(item) {
|
|
65
|
+
return {
|
|
66
|
+
package: item.name,
|
|
67
|
+
version: item.version,
|
|
68
|
+
packageId: item.id,
|
|
69
|
+
rootDirect: item.rootDirect,
|
|
70
|
+
packageManager: "yarn",
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
function packageFinding(kind, item) {
|
|
74
|
+
return {
|
|
75
|
+
ruleId: `dependency/locked-package-${kind}`,
|
|
76
|
+
severity: "low",
|
|
77
|
+
title: kind === "added" ? "Resolved package added" : "Resolved package removed",
|
|
78
|
+
description: `${item.id} was ${kind} in yarn.lock.`,
|
|
79
|
+
file: lockfilePath,
|
|
80
|
+
evidence: evidence(item),
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
function parseFinding(side, result) {
|
|
84
|
+
const unsupported = result.kind === "unsupported";
|
|
85
|
+
return {
|
|
86
|
+
ruleId: unsupported
|
|
87
|
+
? "dependency/unsupported-yarn-lockfile"
|
|
88
|
+
: "dependency/invalid-yarn-lockfile",
|
|
89
|
+
severity: unsupported ? "low" : "high",
|
|
90
|
+
title: unsupported ? "Unsupported Yarn lockfile" : "Invalid Yarn lockfile",
|
|
91
|
+
description: `Could not analyze the ${side} yarn.lock: ${result.reason}`,
|
|
92
|
+
file: lockfilePath,
|
|
93
|
+
evidence: { side, reason: result.reason },
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
function presenceFinding(kind, packageCount) {
|
|
97
|
+
return {
|
|
98
|
+
ruleId: `dependency/yarn-lockfile-${kind}`,
|
|
99
|
+
severity: "low",
|
|
100
|
+
title: kind === "added" ? "Yarn lockfile added" : "Yarn lockfile removed",
|
|
101
|
+
description: `yarn.lock was ${kind} with ${packageCount} resolved registry packages.`,
|
|
102
|
+
file: lockfilePath,
|
|
103
|
+
evidence: { packageCount },
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=yarn-lockfile-rule.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"yarn-lockfile-rule.js","sourceRoot":"","sources":["../../../src/application/rules/yarn-lockfile-rule.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"analyze-test-changes.d.ts","sourceRoot":"","sources":["../../../src/application/services/analyze-test-changes.ts"],"names":[],"mappings":"AACA,OAAO,EAA4B,KAAK,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AAChG,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AAM3E,gDAAgD;AAChD,qBAAa,kBAAmB,YAAW,kBAAkB;IAC9C,OAAO,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"analyze-test-changes.d.ts","sourceRoot":"","sources":["../../../src/application/services/analyze-test-changes.ts"],"names":[],"mappings":"AACA,OAAO,EAA4B,KAAK,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AAChG,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AAM3E,gDAAgD;AAChD,qBAAa,kBAAmB,YAAW,kBAAkB;IAC9C,OAAO,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,kBAAkB,CAAC;CAmC5E"}
|
|
@@ -22,7 +22,9 @@ export class AnalyzeTestChanges {
|
|
|
22
22
|
sourcePath: source.path,
|
|
23
23
|
sourceChangeKind: source.kind,
|
|
24
24
|
matchingTests: testFiles
|
|
25
|
-
.filter((test) =>
|
|
25
|
+
.filter((test) => (Object.hasOwn(policy.related ?? {}, source.path)
|
|
26
|
+
? (policy.related?.[source.path] ?? []).some((path) => matchesPathPattern(test.path, path))
|
|
27
|
+
: testIdentity(test.path) === sourceIdentity(source.path)) &&
|
|
26
28
|
(source.kind === "deleted" || test.changeKind !== "deleted"))
|
|
27
29
|
.map((test) => test.path),
|
|
28
30
|
})),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"analyze-test-changes.js","sourceRoot":"","sources":["../../../src/application/services/analyze-test-changes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,wBAAwB,EAA2B,MAAM,6BAA6B,CAAC;AAGhG,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAEvD,MAAM,eAAe,GAAG,sBAAsB,CAAC;AAC/C,MAAM,UAAU,GAAG,kDAAkD,CAAC;AAEtE,gDAAgD;AAChD,MAAM,OAAO,kBAAkB;IACtB,KAAK,CAAC,OAAO,CAAC,OAAwB;QAC3C,MAAM,MAAM,GAAG,OAAO,CAAC,QAAQ,EAAE,KAAK,CAAC;QACvC,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACzB,OAAO,wBAAwB,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,cAAc,EAAE,EAAE,EAAE,CAAC,CAAC;QACzE,CAAC;QAED,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK;aACpC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;aACvD,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QAC/D,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAC9C,CAAC,IAAI,EAAE,EAAE,CACP,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,OAAO,CAAC;YACtC,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,UAAU,CAAC;YACxC,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,OAAO,CAAC,CACzC,CAAC;QAEF,OAAO,wBAAwB,CAAC;YAC9B,SAAS;YACT,cAAc,EAAE,WAAW,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;gBAC3C,UAAU,EAAE,MAAM,CAAC,IAAI;gBACvB,gBAAgB,EAAE,MAAM,CAAC,IAAI;gBAC7B,aAAa,EAAE,SAAS;qBACrB,MAAM,CACL,CAAC,IAAI,EAAE,EAAE,CACP,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"analyze-test-changes.js","sourceRoot":"","sources":["../../../src/application/services/analyze-test-changes.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,6 +8,8 @@ export interface TestChangePolicy {
|
|
|
8
8
|
readonly requireFor: readonly string[];
|
|
9
9
|
readonly include: readonly string[];
|
|
10
10
|
readonly exclude: readonly string[];
|
|
11
|
+
/** 이전 버전의 공개 정책 객체도 계속 사용할 수 있도록 선택적으로 유지한다. */
|
|
12
|
+
readonly related?: Readonly<Record<string, readonly string[]>>;
|
|
11
13
|
}
|
|
12
14
|
export interface ChangeContract {
|
|
13
15
|
readonly intent?: string;
|
|
@@ -26,6 +28,7 @@ export interface CreateChangeContractInput {
|
|
|
26
28
|
requireFor?: readonly string[];
|
|
27
29
|
include?: readonly string[];
|
|
28
30
|
exclude?: readonly string[];
|
|
31
|
+
related?: Readonly<Record<string, readonly string[]>>;
|
|
29
32
|
}>;
|
|
30
33
|
}
|
|
31
34
|
/** 사용자 기대 범위를 정규화해 규칙마다 설정 해석이 달라지지 않게 한다. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"change-contract.d.ts","sourceRoot":"","sources":["../../src/domain/change-contract.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE,CAAC;IACvC,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"change-contract.d.ts","sourceRoot":"","sources":["../../src/domain/change-contract.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE,CAAC;IACvC,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,gDAAgD;IAChD,QAAQ,CAAC,OAAO,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC,CAAC,CAAC;CAChE;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC;IAC5B,QAAQ,CAAC,KAAK,CAAC,EAAE,gBAAgB,CAAC;CACnC;AAED,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,KAAK,CAAC,EAAE,QAAQ,CAAC;QACxB,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;QAC5B,KAAK,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;QAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,CAAC,CAAC;IACH,QAAQ,CAAC,KAAK,CAAC,EAAE,QAAQ,CAAC;QACxB,UAAU,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;QAC/B,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;QAC5B,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;QAC5B,OAAO,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC,CAAC,CAAC;KACvD,CAAC,CAAC;CACJ;AAED,8CAA8C;AAC9C,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,yBAAyB,GAAG,cAAc,CAmBrF"}
|
|
@@ -25,6 +25,7 @@ function normalizeTestPolicy(input) {
|
|
|
25
25
|
const requireFor = normalizePatterns(input.requireFor ?? [], "tests.requireFor");
|
|
26
26
|
const include = normalizePatterns(input.include ?? [], "tests.include");
|
|
27
27
|
const exclude = normalizePatterns(input.exclude ?? [], "tests.exclude");
|
|
28
|
+
const related = normalizeRelatedTests(input.related ?? {});
|
|
28
29
|
if (requireFor.length === 0) {
|
|
29
30
|
throw new Error("Change contract tests.requireFor must contain at least one pattern.");
|
|
30
31
|
}
|
|
@@ -35,8 +36,26 @@ function normalizeTestPolicy(input) {
|
|
|
35
36
|
requireFor: Object.freeze(requireFor),
|
|
36
37
|
include: Object.freeze(include),
|
|
37
38
|
exclude: Object.freeze(exclude),
|
|
39
|
+
related: Object.freeze(related),
|
|
38
40
|
});
|
|
39
41
|
}
|
|
42
|
+
function normalizeRelatedTests(values) {
|
|
43
|
+
const related = Object.create(null);
|
|
44
|
+
for (const [source, tests] of Object.entries(values).sort(([left], [right]) => left.localeCompare(right))) {
|
|
45
|
+
const path = normalizePattern(source, "tests.related");
|
|
46
|
+
if (path.includes("*")) {
|
|
47
|
+
throw new Error("Change contract tests.related source paths must be exact paths.");
|
|
48
|
+
}
|
|
49
|
+
if (Object.hasOwn(related, path)) {
|
|
50
|
+
throw new Error(`Change contract tests.related contains a duplicate source path: ${path}`);
|
|
51
|
+
}
|
|
52
|
+
if (!Array.isArray(tests) || tests.length === 0) {
|
|
53
|
+
throw new Error(`Change contract tests.related[${JSON.stringify(source)}] must contain test paths.`);
|
|
54
|
+
}
|
|
55
|
+
related[path] = Object.freeze(normalizePatterns(tests, `tests.related[${source}]`));
|
|
56
|
+
}
|
|
57
|
+
return related;
|
|
58
|
+
}
|
|
40
59
|
function normalizeIntent(value) {
|
|
41
60
|
if (value === undefined) {
|
|
42
61
|
return undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"change-contract.js","sourceRoot":"","sources":["../../src/domain/change-contract.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"change-contract.js","sourceRoot":"","sources":["../../src/domain/change-contract.ts"],"names":[],"mappings":"AAqCA,8CAA8C;AAC9C,MAAM,UAAU,oBAAoB,CAAC,KAAgC;IACnE,MAAM,MAAM,GAAG,eAAe,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAC7C,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,IAAI,EAAE,CAAC;IAChC,MAAM,OAAO,GAAG,iBAAiB,CAAC,KAAK,CAAC,OAAO,IAAI,EAAE,EAAE,eAAe,CAAC,CAAC;IACxE,MAAM,KAAK,GAAG,iBAAiB,CAAC,KAAK,CAAC,KAAK,IAAI,EAAE,EAAE,aAAa,CAAC,CAAC;IAClE,MAAM,QAAQ,GAAG,eAAe,CAAC,KAAK,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;IAC7D,MAAM,QAAQ,GAAG,eAAe,CAAC,KAAK,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;IAC7D,MAAM,KAAK,GAAG,mBAAmB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAE/C,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,GAAG,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC;QAC3C,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC;YACnB,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC;YAC/B,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC;YAC3B,GAAG,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC;YAC/C,GAAG,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC;SAChD,CAAC;QACF,GAAG,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC;KAC1C,CAAC,CAAC;AACL,CAAC;AAED,SAAS,mBAAmB,CAC1B,KAAyC;IAEzC,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,UAAU,GAAG,iBAAiB,CAAC,KAAK,CAAC,UAAU,IAAI,EAAE,EAAE,kBAAkB,CAAC,CAAC;IACjF,MAAM,OAAO,GAAG,iBAAiB,CAAC,KAAK,CAAC,OAAO,IAAI,EAAE,EAAE,eAAe,CAAC,CAAC;IACxE,MAAM,OAAO,GAAG,iBAAiB,CAAC,KAAK,CAAC,OAAO,IAAI,EAAE,EAAE,eAAe,CAAC,CAAC;IACxE,MAAM,OAAO,GAAG,qBAAqB,CAAC,KAAK,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;IAC3D,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5B,MAAM,IAAI,KAAK,CAAC,qEAAqE,CAAC,CAAC;IACzF,CAAC;IACD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CAAC,kEAAkE,CAAC,CAAC;IACtF,CAAC;IAED,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,UAAU,EAAE,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC;QACrC,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC;QAC/B,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC;QAC/B,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC;KAChC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,qBAAqB,CAC5B,MAAmD;IAEnD,MAAM,OAAO,GAAsC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACvE,KAAK,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,EAAE,CAC5E,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAC1B,EAAE,CAAC;QACF,MAAM,IAAI,GAAG,gBAAgB,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;QACvD,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YACvB,MAAM,IAAI,KAAK,CAAC,iEAAiE,CAAC,CAAC;QACrF,CAAC;QACD,IAAI,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,CAAC;YACjC,MAAM,IAAI,KAAK,CAAC,mEAAmE,IAAI,EAAE,CAAC,CAAC;QAC7F,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAChD,MAAM,IAAI,KAAK,CACb,iCAAiC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,4BAA4B,CACpF,CAAC;QACJ,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,iBAAiB,CAAC,KAAK,EAAE,iBAAiB,MAAM,GAAG,CAAC,CAAC,CAAC;IACtF,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,eAAe,CAAC,KAAyB;IAChD,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC5B,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;IAC/D,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,iBAAiB,CAAC,MAAyB,EAAE,KAAa;IACjE,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,gBAAgB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;IACvE,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC;AACjF,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAa,EAAE,KAAa;IACpD,IAAI,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IACjD,OAAO,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QAChC,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC7B,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CAAC,mBAAmB,KAAK,oCAAoC,CAAC,CAAC;IAChF,CAAC;IACD,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACjE,MAAM,IAAI,KAAK,CAAC,yDAAyD,KAAK,EAAE,CAAC,CAAC;IACpF,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,eAAe,CAAC,KAAyB,EAAE,KAA8B;IAChF,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;QAC9C,MAAM,IAAI,KAAK,CAAC,yBAAyB,KAAK,kCAAkC,CAAC,CAAC;IACpF,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -5,7 +5,7 @@ import { isRecord } from "../../domain/value-guards.js";
|
|
|
5
5
|
const defaultConfigurationFile = ".intentpatch.json";
|
|
6
6
|
const rootFields = new Set(["intent", "scope", "tests"]);
|
|
7
7
|
const scopeFields = new Set(["include", "allow", "maxFiles", "maxLines"]);
|
|
8
|
-
const testFields = new Set(["requireFor", "include", "exclude"]);
|
|
8
|
+
const testFields = new Set(["requireFor", "include", "exclude", "related"]);
|
|
9
9
|
/** JSON 설정을 엄격하게 검증하고 ChangeContract 도메인 모델로 변환한다. */
|
|
10
10
|
export class JsonChangeContractLoader {
|
|
11
11
|
async load(workingDirectory, configurationPath) {
|
|
@@ -85,10 +85,22 @@ function parseConfiguration(content) {
|
|
|
85
85
|
requireFor: optionalStringArray(testsValue.requireFor, "tests.requireFor"),
|
|
86
86
|
include: optionalStringArray(testsValue.include, "tests.include"),
|
|
87
87
|
exclude: optionalStringArray(testsValue.exclude, "tests.exclude"),
|
|
88
|
+
related: optionalRelatedTests(testsValue.related),
|
|
88
89
|
},
|
|
89
90
|
}),
|
|
90
91
|
};
|
|
91
92
|
}
|
|
93
|
+
function optionalRelatedTests(value) {
|
|
94
|
+
if (value === undefined)
|
|
95
|
+
return {};
|
|
96
|
+
if (!isRecord(value))
|
|
97
|
+
throw new Error("tests.related must be a JSON object.");
|
|
98
|
+
const related = Object.create(null);
|
|
99
|
+
for (const [source, paths] of Object.entries(value)) {
|
|
100
|
+
related[source] = optionalStringArray(paths, `tests.related[${source}]`);
|
|
101
|
+
}
|
|
102
|
+
return related;
|
|
103
|
+
}
|
|
92
104
|
function assertKnownFields(value, knownFields, location) {
|
|
93
105
|
const unknownField = Object.keys(value).find((field) => !knownFields.has(field));
|
|
94
106
|
if (unknownField !== undefined) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"json-change-contract-loader.js","sourceRoot":"","sources":["../../../src/infrastructure/config/json-change-contract-loader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAChD,OAAO,EAGL,oBAAoB,GACrB,MAAM,iCAAiC,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AAExD,MAAM,wBAAwB,GAAG,mBAAmB,CAAC;AACrD,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;AACzD,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,CAAC,SAAS,EAAE,OAAO,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC;AAC1E,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,CAAC,YAAY,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"json-change-contract-loader.js","sourceRoot":"","sources":["../../../src/infrastructure/config/json-change-contract-loader.ts"],"names":[],"mappings":"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"}
|
|
@@ -73,7 +73,7 @@ export class GitFileSnapshotSource {
|
|
|
73
73
|
if (!metadata.isFile()) {
|
|
74
74
|
throw new Error(`Expected a regular file: ${path}`);
|
|
75
75
|
}
|
|
76
|
-
const sizeLimit = path === "package-lock.json" || path === "pnpm-lock.yaml"
|
|
76
|
+
const sizeLimit = path === "package-lock.json" || path === "pnpm-lock.yaml" || path === "yarn.lock"
|
|
77
77
|
? maximumLockfileSize
|
|
78
78
|
: maximumTextFileSize;
|
|
79
79
|
if (metadata.size > sizeLimit) {
|
|
@@ -1 +1 @@
|
|
|
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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
|
|
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 { PropertyTypeCompatibility } from "../../application/ports/property-type-compatibility.js";
|
|
2
|
+
/** 자체적으로 해석 가능한 객체 타입에서 선택 필드만 추가된 경우에 한해 호환성을 인정한다. */
|
|
3
|
+
export declare class TypeScriptPropertyTypeCompatibility implements PropertyTypeCompatibility {
|
|
4
|
+
preservesOptionalObjectExtensions(previous: string, current: string): boolean;
|
|
5
|
+
}
|
|
6
|
+
//# sourceMappingURL=typescript-property-type-compatibility.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"typescript-property-type-compatibility.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/typescript/typescript-property-type-compatibility.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,wDAAwD,CAAC;AAExG,wDAAwD;AACxD,qBAAa,mCAAoC,YAAW,yBAAyB;IAC5E,iCAAiC,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO;CAgBrF"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import ts from "typescript";
|
|
2
|
+
/** 자체적으로 해석 가능한 객체 타입에서 선택 필드만 추가된 경우에 한해 호환성을 인정한다. */
|
|
3
|
+
export class TypeScriptPropertyTypeCompatibility {
|
|
4
|
+
preservesOptionalObjectExtensions(previous, current) {
|
|
5
|
+
const source = ts.createSourceFile("intentpatch-property-compatibility.ts", `type Previous = ${previous};\ntype Current = ${current};`, ts.ScriptTarget.Latest, true);
|
|
6
|
+
const declarations = source.statements.filter(ts.isTypeAliasDeclaration);
|
|
7
|
+
return (source.statements.length === 2 &&
|
|
8
|
+
declarations.length === 2 &&
|
|
9
|
+
declarations[0] !== undefined &&
|
|
10
|
+
declarations[1] !== undefined &&
|
|
11
|
+
preservesType(declarations[0].type, declarations[1].type, source));
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
function preservesType(previous, current, source) {
|
|
15
|
+
if (normalized(previous, source) === normalized(current, source))
|
|
16
|
+
return true;
|
|
17
|
+
if (ts.isParenthesizedTypeNode(previous) && ts.isParenthesizedTypeNode(current)) {
|
|
18
|
+
return preservesType(previous.type, current.type, source);
|
|
19
|
+
}
|
|
20
|
+
if (isReadonlyWrapper(previous) && isReadonlyWrapper(current)) {
|
|
21
|
+
const previousArgument = previous.typeArguments?.[0];
|
|
22
|
+
const currentArgument = current.typeArguments?.[0];
|
|
23
|
+
return (previousArgument !== undefined &&
|
|
24
|
+
currentArgument !== undefined &&
|
|
25
|
+
preservesType(previousArgument, currentArgument, source));
|
|
26
|
+
}
|
|
27
|
+
if (!ts.isTypeLiteralNode(previous) || !ts.isTypeLiteralNode(current))
|
|
28
|
+
return false;
|
|
29
|
+
const previousMembers = propertyMembers(previous);
|
|
30
|
+
const currentMembers = propertyMembers(current);
|
|
31
|
+
if (previousMembers === undefined || currentMembers === undefined)
|
|
32
|
+
return false;
|
|
33
|
+
for (const [name, member] of previousMembers) {
|
|
34
|
+
const next = currentMembers.get(name);
|
|
35
|
+
if (next === undefined ||
|
|
36
|
+
Boolean(member.questionToken) !== Boolean(next.questionToken) ||
|
|
37
|
+
isReadonly(member) !== isReadonly(next) ||
|
|
38
|
+
member.type === undefined ||
|
|
39
|
+
next.type === undefined ||
|
|
40
|
+
!preservesType(member.type, next.type, source)) {
|
|
41
|
+
return false;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
return [...currentMembers].every(([name, member]) => previousMembers.has(name) || member.questionToken !== undefined);
|
|
45
|
+
}
|
|
46
|
+
function propertyMembers(literal) {
|
|
47
|
+
const members = new Map();
|
|
48
|
+
for (const member of literal.members) {
|
|
49
|
+
if (!ts.isPropertySignature(member) || member.name === undefined)
|
|
50
|
+
return undefined;
|
|
51
|
+
const name = ts.isIdentifier(member.name) || ts.isStringLiteral(member.name)
|
|
52
|
+
? member.name.text
|
|
53
|
+
: undefined;
|
|
54
|
+
if (name === undefined || members.has(name))
|
|
55
|
+
return undefined;
|
|
56
|
+
members.set(name, member);
|
|
57
|
+
}
|
|
58
|
+
return members;
|
|
59
|
+
}
|
|
60
|
+
function isReadonlyWrapper(type) {
|
|
61
|
+
return (ts.isTypeReferenceNode(type) &&
|
|
62
|
+
ts.isIdentifier(type.typeName) &&
|
|
63
|
+
type.typeName.text === "Readonly" &&
|
|
64
|
+
type.typeArguments?.length === 1);
|
|
65
|
+
}
|
|
66
|
+
function isReadonly(member) {
|
|
67
|
+
return (member.modifiers?.some((modifier) => modifier.kind === ts.SyntaxKind.ReadonlyKeyword) ?? false);
|
|
68
|
+
}
|
|
69
|
+
function normalized(type, source) {
|
|
70
|
+
return type.getText(source).replace(/\s+/gu, " ").trim();
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=typescript-property-type-compatibility.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"typescript-property-type-compatibility.js","sourceRoot":"","sources":["../../../src/infrastructure/typescript/typescript-property-type-compatibility.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { YarnLockParseResult, YarnLockParser } from "../../application/ports/yarn-lock-parser.js";
|
|
2
|
+
/** Yarn 4의 metadata v8 YAML lockfile만 읽는다. Classic/다른 버전은 추측하지 않는다. */
|
|
3
|
+
export declare class YarnYamlLockParser implements YarnLockParser {
|
|
4
|
+
parse(content: string): YarnLockParseResult;
|
|
5
|
+
}
|
|
6
|
+
//# sourceMappingURL=yarn-lock-parser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"yarn-lock-parser.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/yarn/yarn-lock-parser.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAEV,mBAAmB,EACnB,cAAc,EACf,MAAM,6CAA6C,CAAC;AAOrD,uEAAuE;AACvE,qBAAa,kBAAmB,YAAW,cAAc;IAChD,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,mBAAmB;CAwDnD"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { parseDocument } from "yaml";
|
|
2
|
+
import { invalidParseResult as invalid } from "../../application/ports/parse-failure.js";
|
|
3
|
+
import { isRecord } from "../../domain/value-guards.js";
|
|
4
|
+
const registryResolution = /^((?:@[^/@]+\/)?[^/@]+)@npm:(\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?(?:\+[0-9A-Za-z.-]+)?)$/u;
|
|
5
|
+
const directSections = ["dependencies", "devDependencies", "optionalDependencies"];
|
|
6
|
+
/** Yarn 4의 metadata v8 YAML lockfile만 읽는다. Classic/다른 버전은 추측하지 않는다. */
|
|
7
|
+
export class YarnYamlLockParser {
|
|
8
|
+
parse(content) {
|
|
9
|
+
try {
|
|
10
|
+
const document = parseDocument(content, { logLevel: "error", stringKeys: true });
|
|
11
|
+
if (document.errors.length > 0) {
|
|
12
|
+
return invalid(`The file is not valid YAML: ${document.errors[0]?.message ?? "unknown error"}`);
|
|
13
|
+
}
|
|
14
|
+
const value = document.toJS({ maxAliasCount: 100 });
|
|
15
|
+
if (!isRecord(value) || !isRecord(value.__metadata)) {
|
|
16
|
+
return invalid("A Yarn lockfile must contain a __metadata mapping.");
|
|
17
|
+
}
|
|
18
|
+
if (String(value.__metadata.version) !== "8") {
|
|
19
|
+
return {
|
|
20
|
+
ok: false,
|
|
21
|
+
kind: "unsupported",
|
|
22
|
+
reason: `Only Yarn 4 lockfile metadata version 8 is supported; found ${String(value.__metadata.version)}.`,
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
const direct = rootDependencies(value);
|
|
26
|
+
if (!direct.ok)
|
|
27
|
+
return direct;
|
|
28
|
+
const packages = new Map();
|
|
29
|
+
for (const [descriptor, entry] of Object.entries(value)) {
|
|
30
|
+
if (descriptor === "__metadata")
|
|
31
|
+
continue;
|
|
32
|
+
if (!isRecord(entry) ||
|
|
33
|
+
typeof entry.resolution !== "string" ||
|
|
34
|
+
typeof entry.version !== "string") {
|
|
35
|
+
return invalid(`Lockfile entry ${JSON.stringify(descriptor)} must contain resolution and version strings.`);
|
|
36
|
+
}
|
|
37
|
+
const match = registryResolution.exec(entry.resolution);
|
|
38
|
+
if (match === null)
|
|
39
|
+
continue; // workspace:, patch:, file:, virtual: 등은 레지스트리 버전이 아니다.
|
|
40
|
+
const [, name, version] = match;
|
|
41
|
+
if (name === undefined || version === undefined || entry.version !== version) {
|
|
42
|
+
return invalid(`Lockfile entry ${JSON.stringify(descriptor)} has inconsistent version and resolution.`);
|
|
43
|
+
}
|
|
44
|
+
packages.set(entry.resolution, {
|
|
45
|
+
id: entry.resolution,
|
|
46
|
+
name,
|
|
47
|
+
version,
|
|
48
|
+
rootDirect: direct.names.has(name),
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
return { ok: true, packages };
|
|
52
|
+
}
|
|
53
|
+
catch (error) {
|
|
54
|
+
return invalid(`The YAML parser could not read the lockfile: ${error instanceof Error ? error.message : String(error)}`);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
function rootDependencies(lockfile) {
|
|
59
|
+
const names = new Set();
|
|
60
|
+
for (const entry of Object.values(lockfile)) {
|
|
61
|
+
if (!isRecord(entry) ||
|
|
62
|
+
typeof entry.resolution !== "string" ||
|
|
63
|
+
!entry.resolution.endsWith("@workspace:."))
|
|
64
|
+
continue;
|
|
65
|
+
for (const section of directSections) {
|
|
66
|
+
const dependencies = entry[section];
|
|
67
|
+
if (dependencies === undefined)
|
|
68
|
+
continue;
|
|
69
|
+
if (!isRecord(dependencies))
|
|
70
|
+
return invalid(`Root workspace ${section} must be a YAML mapping.`);
|
|
71
|
+
for (const name of Object.keys(dependencies))
|
|
72
|
+
names.add(name);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
return { ok: true, names };
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=yarn-lock-parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"yarn-lock-parser.js","sourceRoot":"","sources":["../../../src/infrastructure/yarn/yarn-lock-parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"analyze-repository.d.ts","sourceRoot":"","sources":["../../src/presentation/analyze-repository.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"analyze-repository.d.ts","sourceRoot":"","sources":["../../src/presentation/analyze-repository.ts"],"names":[],"mappings":"AAqBA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAmBxD,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IACpC,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;CAClC;AAED,sDAAsD;AACtD,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,yBAAyB,GAAG,OAAO,CAAC,YAAY,CAAC,CAsEjG"}
|
|
@@ -11,6 +11,7 @@ import { PnpmWorkspaceDependencyRule } from "../application/rules/pnpm-workspace
|
|
|
11
11
|
import { PublicApiCompatibilityRule } from "../application/rules/public-api-compatibility-rule.js";
|
|
12
12
|
import { PublicApiRemovalRule } from "../application/rules/public-api-removal-rule.js";
|
|
13
13
|
import { SingleImplementationAbstractionRule } from "../application/rules/single-implementation-abstraction-rule.js";
|
|
14
|
+
import { YarnLockfileRule } from "../application/rules/yarn-lockfile-rule.js";
|
|
14
15
|
import { AnalyzeCodeStructure } from "../application/services/analyze-code-structure.js";
|
|
15
16
|
import { AnalyzeImportImpact } from "../application/services/analyze-import-impact.js";
|
|
16
17
|
import { AnalyzeTestChanges } from "../application/services/analyze-test-changes.js";
|
|
@@ -32,7 +33,9 @@ import { SourceModuleReferenceExtractor } from "../infrastructure/typescript/sou
|
|
|
32
33
|
import { TypeScriptCodeStructureExtractor } from "../infrastructure/typescript/typescript-code-structure-extractor.js";
|
|
33
34
|
import { TypeScriptFunctionSignatureCompatibility } from "../infrastructure/typescript/typescript-function-signature-compatibility.js";
|
|
34
35
|
import { TypeScriptModuleAliasResolver } from "../infrastructure/typescript/typescript-module-alias-resolver.js";
|
|
36
|
+
import { TypeScriptPropertyTypeCompatibility } from "../infrastructure/typescript/typescript-property-type-compatibility.js";
|
|
35
37
|
import { TypeScriptSymbolExtractor } from "../infrastructure/typescript/typescript-symbol-extractor.js";
|
|
38
|
+
import { YarnYamlLockParser } from "../infrastructure/yarn/yarn-lock-parser.js";
|
|
36
39
|
/** CLI와 자동화 어댑터가 동일한 분석 구성과 규칙 집합을 사용하도록 조립을 공유한다. */
|
|
37
40
|
export async function analyzeRepository(options) {
|
|
38
41
|
const commandRunner = new NodeCommandRunner();
|
|
@@ -54,13 +57,14 @@ export async function analyzeRepository(options) {
|
|
|
54
57
|
new AddedDependencyUsageRule(snapshotSource, projectFiles, moduleReferenceExtractor, pnpmWorkspaceParser),
|
|
55
58
|
new NpmLockfileRule(snapshotSource, new NpmPackageLockParser()),
|
|
56
59
|
new PnpmLockfileRule(snapshotSource, new PnpmYamlLockParser()),
|
|
60
|
+
new YarnLockfileRule(snapshotSource, new YarnYamlLockParser()),
|
|
57
61
|
new NpmWorkspaceDependencyRule(snapshotSource),
|
|
58
62
|
new PnpmWorkspaceDependencyRule(snapshotSource, pnpmWorkspaceParser),
|
|
59
63
|
new ExpectedScopeRule(),
|
|
60
64
|
new ChangeBudgetRule(),
|
|
61
65
|
new MissingTestChangeRule(),
|
|
62
66
|
new PublicApiRemovalRule(),
|
|
63
|
-
new PublicApiCompatibilityRule(new TypeScriptFunctionSignatureCompatibility()),
|
|
67
|
+
new PublicApiCompatibilityRule(new TypeScriptFunctionSignatureCompatibility(), new TypeScriptPropertyTypeCompatibility()),
|
|
64
68
|
new DuplicateImplementationRule(),
|
|
65
69
|
new SingleImplementationAbstractionRule(),
|
|
66
70
|
]);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"analyze-repository.js","sourceRoot":"","sources":["../../src/presentation/analyze-repository.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,qDAAqD,CAAC;AAC/F,OAAO,EAAE,gBAAgB,EAAE,MAAM,4CAA4C,CAAC;AAC9E,OAAO,EAAE,2BAA2B,EAAE,MAAM,uDAAuD,CAAC;AACpG,OAAO,EAAE,iBAAiB,EAAE,MAAM,6CAA6C,CAAC;AAChF,OAAO,EAAE,qBAAqB,EAAE,MAAM,kDAAkD,CAAC;AACzF,OAAO,EAAE,eAAe,EAAE,MAAM,2CAA2C,CAAC;AAC5E,OAAO,EAAE,0BAA0B,EAAE,MAAM,uDAAuD,CAAC;AACnG,OAAO,EAAE,qBAAqB,EAAE,MAAM,iDAAiD,CAAC;AACxF,OAAO,EAAE,gBAAgB,EAAE,MAAM,4CAA4C,CAAC;AAC9E,OAAO,EAAE,2BAA2B,EAAE,MAAM,wDAAwD,CAAC;AACrG,OAAO,EAAE,0BAA0B,EAAE,MAAM,uDAAuD,CAAC;AACnG,OAAO,EAAE,oBAAoB,EAAE,MAAM,iDAAiD,CAAC;AACvF,OAAO,EAAE,mCAAmC,EAAE,MAAM,gEAAgE,CAAC;AACrH,OAAO,EAAE,oBAAoB,EAAE,MAAM,mDAAmD,CAAC;AACzF,OAAO,EAAE,mBAAmB,EAAE,MAAM,kDAAkD,CAAC;AACvF,OAAO,EAAE,kBAAkB,EAAE,MAAM,iDAAiD,CAAC;AACrF,OAAO,EAAE,oBAAoB,EAAE,MAAM,mDAAmD,CAAC;AACzF,OAAO,EAAE,UAAU,EAAE,MAAM,wCAAwC,CAAC;AACpE,OAAO,EAAE,cAAc,EAAE,MAAM,6CAA6C,CAAC;AAC7E,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AAEpE,OAAO,EAAE,wBAAwB,EAAE,MAAM,yDAAyD,CAAC;AACnG,OAAO,EAAE,eAAe,EAAE,MAAM,4CAA4C,CAAC;AAC7E,OAAO,EAAE,qBAAqB,EAAE,MAAM,mDAAmD,CAAC;AAC1F,OAAO,EAAE,oBAAoB,EAAE,MAAM,kDAAkD,CAAC;AACxF,OAAO,EAAE,oBAAoB,EAAE,MAAM,kDAAkD,CAAC;AACxF,OAAO,EAAE,kBAAkB,EAAE,MAAM,4CAA4C,CAAC;AAChF,OAAO,EAAE,uBAAuB,EAAE,MAAM,iDAAiD,CAAC;AAC1F,OAAO,EAAE,iBAAiB,EAAE,MAAM,6CAA6C,CAAC;AAChF,OAAO,EAAE,yBAAyB,EAAE,MAAM,6DAA6D,CAAC;AACxG,OAAO,EAAE,yBAAyB,EAAE,MAAM,8DAA8D,CAAC;AACzG,OAAO,EAAE,8BAA8B,EAAE,MAAM,mEAAmE,CAAC;AACnH,OAAO,EAAE,gCAAgC,EAAE,MAAM,qEAAqE,CAAC;AACvH,OAAO,EAAE,wCAAwC,EAAE,MAAM,6EAA6E,CAAC;AACvI,OAAO,EAAE,6BAA6B,EAAE,MAAM,kEAAkE,CAAC;AACjH,OAAO,EAAE,yBAAyB,EAAE,MAAM,6DAA6D,CAAC;
|
|
1
|
+
{"version":3,"file":"analyze-repository.js","sourceRoot":"","sources":["../../src/presentation/analyze-repository.ts"],"names":[],"mappings":"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"}
|
|
@@ -107,6 +107,9 @@ function formatChangeContract(contract) {
|
|
|
107
107
|
];
|
|
108
108
|
if (contract.tests !== undefined) {
|
|
109
109
|
lines.push(`Test sources ${contract.tests.requireFor.join(", ")}`, `Test files ${contract.tests.include.join(", ")}`, `Test excludes ${contract.tests.exclude.join(", ") || "(none)"}`);
|
|
110
|
+
for (const [source, tests] of Object.entries(contract.tests.related ?? {})) {
|
|
111
|
+
lines.push(`Related tests ${source} → ${tests.join(", ")}`);
|
|
112
|
+
}
|
|
110
113
|
}
|
|
111
114
|
return lines;
|
|
112
115
|
}
|