intentpatch 0.0.0-stage → 0.1.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/LICENSE +21 -0
- package/README.ko.md +470 -0
- package/README.md +436 -2
- package/dist/application/ports/analysis-rule.d.ts +23 -0
- package/dist/application/ports/analysis-rule.d.ts.map +1 -0
- package/dist/application/ports/analysis-rule.js +2 -0
- package/dist/application/ports/analysis-rule.js.map +1 -0
- package/dist/application/ports/change-impact-analyzer.d.ts +6 -0
- package/dist/application/ports/change-impact-analyzer.d.ts.map +1 -0
- package/dist/application/ports/change-impact-analyzer.js +2 -0
- package/dist/application/ports/change-impact-analyzer.js.map +1 -0
- package/dist/application/ports/change-source.d.ts +10 -0
- package/dist/application/ports/change-source.d.ts.map +1 -0
- package/dist/application/ports/change-source.js +2 -0
- package/dist/application/ports/change-source.js.map +1 -0
- package/dist/application/ports/code-structure-analyzer.d.ts +6 -0
- package/dist/application/ports/code-structure-analyzer.d.ts.map +1 -0
- package/dist/application/ports/code-structure-analyzer.js +2 -0
- package/dist/application/ports/code-structure-analyzer.js.map +1 -0
- package/dist/application/ports/code-structure-extractor.d.ts +33 -0
- package/dist/application/ports/code-structure-extractor.d.ts.map +1 -0
- package/dist/application/ports/code-structure-extractor.js +2 -0
- package/dist/application/ports/code-structure-extractor.js.map +1 -0
- package/dist/application/ports/file-snapshot-source.d.ts +10 -0
- package/dist/application/ports/file-snapshot-source.d.ts.map +1 -0
- package/dist/application/ports/file-snapshot-source.js +2 -0
- package/dist/application/ports/file-snapshot-source.js.map +1 -0
- package/dist/application/ports/module-reference-extractor.d.ts +13 -0
- package/dist/application/ports/module-reference-extractor.d.ts.map +1 -0
- package/dist/application/ports/module-reference-extractor.js +2 -0
- package/dist/application/ports/module-reference-extractor.js.map +1 -0
- package/dist/application/ports/project-file-source.d.ts +16 -0
- package/dist/application/ports/project-file-source.d.ts.map +1 -0
- package/dist/application/ports/project-file-source.js +2 -0
- package/dist/application/ports/project-file-source.js.map +1 -0
- package/dist/application/ports/source-symbol-extractor.d.ts +14 -0
- package/dist/application/ports/source-symbol-extractor.d.ts.map +1 -0
- package/dist/application/ports/source-symbol-extractor.js +2 -0
- package/dist/application/ports/source-symbol-extractor.js.map +1 -0
- package/dist/application/ports/symbol-change-analyzer.d.ts +6 -0
- package/dist/application/ports/symbol-change-analyzer.d.ts.map +1 -0
- package/dist/application/ports/symbol-change-analyzer.js +2 -0
- package/dist/application/ports/symbol-change-analyzer.js.map +1 -0
- package/dist/application/ports/test-change-analyzer.d.ts +6 -0
- package/dist/application/ports/test-change-analyzer.d.ts.map +1 -0
- package/dist/application/ports/test-change-analyzer.js +2 -0
- package/dist/application/ports/test-change-analyzer.js.map +1 -0
- package/dist/application/rules/change-budget-rule.d.ts +7 -0
- package/dist/application/rules/change-budget-rule.d.ts.map +1 -0
- package/dist/application/rules/change-budget-rule.js +42 -0
- package/dist/application/rules/change-budget-rule.js.map +1 -0
- package/dist/application/rules/duplicate-implementation-rule.d.ts +7 -0
- package/dist/application/rules/duplicate-implementation-rule.d.ts.map +1 -0
- package/dist/application/rules/duplicate-implementation-rule.js +20 -0
- package/dist/application/rules/duplicate-implementation-rule.js.map +1 -0
- package/dist/application/rules/expected-scope-rule.d.ts +7 -0
- package/dist/application/rules/expected-scope-rule.d.ts.map +1 -0
- package/dist/application/rules/expected-scope-rule.js +27 -0
- package/dist/application/rules/expected-scope-rule.js.map +1 -0
- package/dist/application/rules/missing-test-change-rule.d.ts +7 -0
- package/dist/application/rules/missing-test-change-rule.d.ts.map +1 -0
- package/dist/application/rules/missing-test-change-rule.js +25 -0
- package/dist/application/rules/missing-test-change-rule.js.map +1 -0
- package/dist/application/rules/package-dependency-rule.d.ts +13 -0
- package/dist/application/rules/package-dependency-rule.d.ts.map +1 -0
- package/dist/application/rules/package-dependency-rule.js +174 -0
- package/dist/application/rules/package-dependency-rule.js.map +1 -0
- package/dist/application/rules/public-api-compatibility-rule.d.ts +7 -0
- package/dist/application/rules/public-api-compatibility-rule.d.ts.map +1 -0
- package/dist/application/rules/public-api-compatibility-rule.js +92 -0
- package/dist/application/rules/public-api-compatibility-rule.js.map +1 -0
- package/dist/application/rules/public-api-removal-rule.d.ts +7 -0
- package/dist/application/rules/public-api-removal-rule.d.ts.map +1 -0
- package/dist/application/rules/public-api-removal-rule.js +45 -0
- package/dist/application/rules/public-api-removal-rule.js.map +1 -0
- package/dist/application/rules/single-implementation-abstraction-rule.d.ts +7 -0
- package/dist/application/rules/single-implementation-abstraction-rule.d.ts.map +1 -0
- package/dist/application/rules/single-implementation-abstraction-rule.js +20 -0
- package/dist/application/rules/single-implementation-abstraction-rule.js.map +1 -0
- package/dist/application/services/analyze-code-structure.d.ts +14 -0
- package/dist/application/services/analyze-code-structure.d.ts.map +1 -0
- package/dist/application/services/analyze-code-structure.js +113 -0
- package/dist/application/services/analyze-code-structure.js.map +1 -0
- package/dist/application/services/analyze-import-impact.d.ts +14 -0
- package/dist/application/services/analyze-import-impact.d.ts.map +1 -0
- package/dist/application/services/analyze-import-impact.js +142 -0
- package/dist/application/services/analyze-import-impact.js.map +1 -0
- package/dist/application/services/analyze-test-changes.d.ts +8 -0
- package/dist/application/services/analyze-test-changes.d.ts.map +1 -0
- package/dist/application/services/analyze-test-changes.js +41 -0
- package/dist/application/services/analyze-test-changes.js.map +1 -0
- package/dist/application/services/compare-source-symbols.d.ts +13 -0
- package/dist/application/services/compare-source-symbols.d.ts.map +1 -0
- package/dist/application/services/compare-source-symbols.js +103 -0
- package/dist/application/services/compare-source-symbols.js.map +1 -0
- package/dist/application/services/path-pattern.d.ts +3 -0
- package/dist/application/services/path-pattern.d.ts.map +1 -0
- package/dist/application/services/path-pattern.js +34 -0
- package/dist/application/services/path-pattern.js.map +1 -0
- package/dist/application/services/rule-engine.d.ts +9 -0
- package/dist/application/services/rule-engine.d.ts.map +1 -0
- package/dist/application/services/rule-engine.js +13 -0
- package/dist/application/services/rule-engine.js.map +1 -0
- package/dist/application/use-cases/analyze-changes.d.ts +28 -0
- package/dist/application/use-cases/analyze-changes.d.ts.map +1 -0
- package/dist/application/use-cases/analyze-changes.js +88 -0
- package/dist/application/use-cases/analyze-changes.js.map +1 -0
- package/dist/domain/change-contract.d.ts +33 -0
- package/dist/domain/change-contract.d.ts.map +1 -0
- package/dist/domain/change-contract.js +76 -0
- package/dist/domain/change-contract.js.map +1 -0
- package/dist/domain/change.d.ts +37 -0
- package/dist/domain/change.d.ts.map +1 -0
- package/dist/domain/change.js +61 -0
- package/dist/domain/change.js.map +1 -0
- package/dist/domain/code-structure.d.ts +38 -0
- package/dist/domain/code-structure.d.ts.map +1 -0
- package/dist/domain/code-structure.js +63 -0
- package/dist/domain/code-structure.js.map +1 -0
- package/dist/domain/finding.d.ts +24 -0
- package/dist/domain/finding.d.ts.map +1 -0
- package/dist/domain/finding.js +30 -0
- package/dist/domain/finding.js.map +1 -0
- package/dist/domain/impact.d.ts +45 -0
- package/dist/domain/impact.d.ts.map +1 -0
- package/dist/domain/impact.js +60 -0
- package/dist/domain/impact.js.map +1 -0
- package/dist/domain/report.d.ts +22 -0
- package/dist/domain/report.d.ts.map +1 -0
- package/dist/domain/report.js +2 -0
- package/dist/domain/report.js.map +1 -0
- package/dist/domain/symbol-change.d.ts +60 -0
- package/dist/domain/symbol-change.d.ts.map +1 -0
- package/dist/domain/symbol-change.js +79 -0
- package/dist/domain/symbol-change.js.map +1 -0
- package/dist/domain/test-change.d.ts +29 -0
- package/dist/domain/test-change.d.ts.map +1 -0
- package/dist/domain/test-change.js +35 -0
- package/dist/domain/test-change.js.map +1 -0
- package/dist/infrastructure/config/json-change-contract-loader.d.ts +6 -0
- package/dist/infrastructure/config/json-change-contract-loader.d.ts.map +1 -0
- package/dist/infrastructure/config/json-change-contract-loader.js +130 -0
- package/dist/infrastructure/config/json-change-contract-loader.js.map +1 -0
- package/dist/infrastructure/filesystem/repository-path.d.ts +3 -0
- package/dist/infrastructure/filesystem/repository-path.d.ts.map +1 -0
- package/dist/infrastructure/filesystem/repository-path.js +11 -0
- package/dist/infrastructure/filesystem/repository-path.js.map +1 -0
- package/dist/infrastructure/git/diff-parser.d.ts +3 -0
- package/dist/infrastructure/git/diff-parser.d.ts.map +1 -0
- package/dist/infrastructure/git/diff-parser.js +124 -0
- package/dist/infrastructure/git/diff-parser.js.map +1 -0
- package/dist/infrastructure/git/git-change-source.d.ts +13 -0
- package/dist/infrastructure/git/git-change-source.d.ts.map +1 -0
- package/dist/infrastructure/git/git-change-source.js +43 -0
- package/dist/infrastructure/git/git-change-source.js.map +1 -0
- package/dist/infrastructure/git/git-file-snapshot-source.d.ts +14 -0
- package/dist/infrastructure/git/git-file-snapshot-source.d.ts.map +1 -0
- package/dist/infrastructure/git/git-file-snapshot-source.js +87 -0
- package/dist/infrastructure/git/git-file-snapshot-source.js.map +1 -0
- package/dist/infrastructure/git/git-project-file-source.d.ts +16 -0
- package/dist/infrastructure/git/git-project-file-source.d.ts.map +1 -0
- package/dist/infrastructure/git/git-project-file-source.js +113 -0
- package/dist/infrastructure/git/git-project-file-source.js.map +1 -0
- package/dist/infrastructure/git/untracked-file-collector.d.ts +4 -0
- package/dist/infrastructure/git/untracked-file-collector.d.ts.map +1 -0
- package/dist/infrastructure/git/untracked-file-collector.js +52 -0
- package/dist/infrastructure/git/untracked-file-collector.js.map +1 -0
- package/dist/infrastructure/process/command-runner.d.ts +17 -0
- package/dist/infrastructure/process/command-runner.d.ts.map +1 -0
- package/dist/infrastructure/process/command-runner.js +35 -0
- package/dist/infrastructure/process/command-runner.js.map +1 -0
- package/dist/infrastructure/typescript/parse-typescript-source.d.ts +11 -0
- package/dist/infrastructure/typescript/parse-typescript-source.d.ts.map +1 -0
- package/dist/infrastructure/typescript/parse-typescript-source.js +31 -0
- package/dist/infrastructure/typescript/parse-typescript-source.js.map +1 -0
- package/dist/infrastructure/typescript/typescript-code-structure-extractor.d.ts +7 -0
- package/dist/infrastructure/typescript/typescript-code-structure-extractor.d.ts.map +1 -0
- package/dist/infrastructure/typescript/typescript-code-structure-extractor.js +80 -0
- package/dist/infrastructure/typescript/typescript-code-structure-extractor.js.map +1 -0
- package/dist/infrastructure/typescript/typescript-module-reference-extractor.d.ts +7 -0
- package/dist/infrastructure/typescript/typescript-module-reference-extractor.d.ts.map +1 -0
- package/dist/infrastructure/typescript/typescript-module-reference-extractor.js +37 -0
- package/dist/infrastructure/typescript/typescript-module-reference-extractor.js.map +1 -0
- package/dist/infrastructure/typescript/typescript-symbol-extractor.d.ts +7 -0
- package/dist/infrastructure/typescript/typescript-symbol-extractor.d.ts.map +1 -0
- package/dist/infrastructure/typescript/typescript-symbol-extractor.js +206 -0
- package/dist/infrastructure/typescript/typescript-symbol-extractor.js.map +1 -0
- package/dist/presentation/analyze-repository.d.ts +10 -0
- package/dist/presentation/analyze-repository.d.ts.map +1 -0
- package/dist/presentation/analyze-repository.js +55 -0
- package/dist/presentation/analyze-repository.js.map +1 -0
- package/dist/presentation/cli/arguments.d.ts +26 -0
- package/dist/presentation/cli/arguments.d.ts.map +1 -0
- package/dist/presentation/cli/arguments.js +120 -0
- package/dist/presentation/cli/arguments.js.map +1 -0
- package/dist/presentation/cli/failure-policy.d.ts +3 -0
- package/dist/presentation/cli/failure-policy.d.ts.map +1 -0
- package/dist/presentation/cli/failure-policy.js +5 -0
- package/dist/presentation/cli/failure-policy.js.map +1 -0
- package/dist/presentation/cli/main.d.ts +3 -0
- package/dist/presentation/cli/main.d.ts.map +1 -0
- package/dist/presentation/cli/main.js +71 -0
- package/dist/presentation/cli/main.js.map +1 -0
- package/dist/presentation/cli/report-file-writer.d.ts +3 -0
- package/dist/presentation/cli/report-file-writer.d.ts.map +1 -0
- package/dist/presentation/cli/report-file-writer.js +9 -0
- package/dist/presentation/cli/report-file-writer.js.map +1 -0
- package/dist/presentation/cli/report-formatter.d.ts +5 -0
- package/dist/presentation/cli/report-formatter.d.ts.map +1 -0
- package/dist/presentation/cli/report-formatter.js +14 -0
- package/dist/presentation/cli/report-formatter.js.map +1 -0
- package/dist/presentation/cli/text-report.d.ts +3 -0
- package/dist/presentation/cli/text-report.d.ts.map +1 -0
- package/dist/presentation/cli/text-report.js +151 -0
- package/dist/presentation/cli/text-report.js.map +1 -0
- package/dist/presentation/github/action-inputs.d.ts +14 -0
- package/dist/presentation/github/action-inputs.d.ts.map +1 -0
- package/dist/presentation/github/action-inputs.js +24 -0
- package/dist/presentation/github/action-inputs.js.map +1 -0
- package/dist/presentation/github/action-main.d.ts +3 -0
- package/dist/presentation/github/action-main.d.ts.map +1 -0
- package/dist/presentation/github/action-main.js +20 -0
- package/dist/presentation/github/action-main.js.map +1 -0
- package/dist/presentation/github/action-runtime.d.ts +22 -0
- package/dist/presentation/github/action-runtime.d.ts.map +1 -0
- package/dist/presentation/github/action-runtime.js +58 -0
- package/dist/presentation/github/action-runtime.js.map +1 -0
- package/dist/presentation/github/comparison.d.ts +11 -0
- package/dist/presentation/github/comparison.d.ts.map +1 -0
- package/dist/presentation/github/comparison.js +35 -0
- package/dist/presentation/github/comparison.js.map +1 -0
- package/dist/presentation/github/markdown-summary.d.ts +4 -0
- package/dist/presentation/github/markdown-summary.d.ts.map +1 -0
- package/dist/presentation/github/markdown-summary.js +47 -0
- package/dist/presentation/github/markdown-summary.js.map +1 -0
- package/dist/presentation/github/run-action.d.ts +7 -0
- package/dist/presentation/github/run-action.d.ts.map +1 -0
- package/dist/presentation/github/run-action.js +81 -0
- package/dist/presentation/github/run-action.js.map +1 -0
- package/dist/presentation/html/html-report.d.ts +4 -0
- package/dist/presentation/html/html-report.d.ts.map +1 -0
- package/dist/presentation/html/html-report.js +362 -0
- package/dist/presentation/html/html-report.js.map +1 -0
- package/package.json +57 -4
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import ts from "typescript";
|
|
2
|
+
/** TypeScript 파싱과 진단 메시지 형식을 AST 기반 어댑터 사이에서 공유한다. */
|
|
3
|
+
export function parseTypeScriptSource(path, source) {
|
|
4
|
+
const sourceFile = ts.createSourceFile(path, source, ts.ScriptTarget.Latest, true, path.endsWith(".tsx") ? ts.ScriptKind.TSX : ts.ScriptKind.TS);
|
|
5
|
+
const parseError = firstParseError(path, source);
|
|
6
|
+
return parseError === undefined
|
|
7
|
+
? { kind: "success", sourceFile }
|
|
8
|
+
: { kind: "unavailable", reason: parseError };
|
|
9
|
+
}
|
|
10
|
+
function firstParseError(path, source) {
|
|
11
|
+
const diagnostic = ts
|
|
12
|
+
.transpileModule(source, {
|
|
13
|
+
fileName: path,
|
|
14
|
+
reportDiagnostics: true,
|
|
15
|
+
compilerOptions: {
|
|
16
|
+
jsx: ts.JsxEmit.ReactJSX,
|
|
17
|
+
target: ts.ScriptTarget.Latest,
|
|
18
|
+
},
|
|
19
|
+
})
|
|
20
|
+
.diagnostics?.find((candidate) => candidate.category === ts.DiagnosticCategory.Error);
|
|
21
|
+
if (diagnostic === undefined) {
|
|
22
|
+
return undefined;
|
|
23
|
+
}
|
|
24
|
+
const message = ts.flattenDiagnosticMessageText(diagnostic.messageText, " ");
|
|
25
|
+
if (diagnostic.file === undefined || diagnostic.start === undefined) {
|
|
26
|
+
return message;
|
|
27
|
+
}
|
|
28
|
+
const position = diagnostic.file.getLineAndCharacterOfPosition(diagnostic.start);
|
|
29
|
+
return `line ${position.line + 1}, column ${position.character + 1}: ${message}`;
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=parse-typescript-source.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse-typescript-source.js","sourceRoot":"","sources":["../../../src/infrastructure/typescript/parse-typescript-source.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,YAAY,CAAC;AAM5B,sDAAsD;AACtD,MAAM,UAAU,qBAAqB,CAAC,IAAY,EAAE,MAAc;IAChE,MAAM,UAAU,GAAG,EAAE,CAAC,gBAAgB,CACpC,IAAI,EACJ,MAAM,EACN,EAAE,CAAC,YAAY,CAAC,MAAM,EACtB,IAAI,EACJ,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,EAAE,CAC7D,CAAC;IACF,MAAM,UAAU,GAAG,eAAe,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAEjD,OAAO,UAAU,KAAK,SAAS;QAC7B,CAAC,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,UAAU,EAAE;QACjC,CAAC,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;AAClD,CAAC;AAED,SAAS,eAAe,CAAC,IAAY,EAAE,MAAc;IACnD,MAAM,UAAU,GAAG,EAAE;SAClB,eAAe,CAAC,MAAM,EAAE;QACvB,QAAQ,EAAE,IAAI;QACd,iBAAiB,EAAE,IAAI;QACvB,eAAe,EAAE;YACf,GAAG,EAAE,EAAE,CAAC,OAAO,CAAC,QAAQ;YACxB,MAAM,EAAE,EAAE,CAAC,YAAY,CAAC,MAAM;SAC/B;KACF,CAAC;SACD,WAAW,EAAE,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,QAAQ,KAAK,EAAE,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;IACxF,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;QAC7B,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,OAAO,GAAG,EAAE,CAAC,4BAA4B,CAAC,UAAU,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;IAC7E,IAAI,UAAU,CAAC,IAAI,KAAK,SAAS,IAAI,UAAU,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QACpE,OAAO,OAAO,CAAC;IACjB,CAAC;IACD,MAAM,QAAQ,GAAG,UAAU,CAAC,IAAI,CAAC,6BAA6B,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;IACjF,OAAO,QAAQ,QAAQ,CAAC,IAAI,GAAG,CAAC,YAAY,QAAQ,CAAC,SAAS,GAAG,CAAC,KAAK,OAAO,EAAE,CAAC;AACnF,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { CodeStructureExtractionResult, CodeStructureExtractor } from "../../application/ports/code-structure-extractor.js";
|
|
2
|
+
/** TypeScript AST에서 구현 중복과 단일 구현 추론에 필요한 사실만 추출한다. */
|
|
3
|
+
export declare class TypeScriptCodeStructureExtractor implements CodeStructureExtractor {
|
|
4
|
+
supports(path: string): boolean;
|
|
5
|
+
extract(path: string, source: string): CodeStructureExtractionResult;
|
|
6
|
+
}
|
|
7
|
+
//# sourceMappingURL=typescript-code-structure-extractor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"typescript-code-structure-extractor.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/typescript/typescript-code-structure-extractor.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAEV,6BAA6B,EAC7B,sBAAsB,EAGvB,MAAM,qDAAqD,CAAC;AAG7D,sDAAsD;AACtD,qBAAa,gCAAiC,YAAW,sBAAsB;IACtE,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAI/B,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,6BAA6B;CAiD5E"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import ts from "typescript";
|
|
3
|
+
import { parseTypeScriptSource } from "./parse-typescript-source.js";
|
|
4
|
+
/** TypeScript AST에서 구현 중복과 단일 구현 추론에 필요한 사실만 추출한다. */
|
|
5
|
+
export class TypeScriptCodeStructureExtractor {
|
|
6
|
+
supports(path) {
|
|
7
|
+
return path.endsWith(".ts") || path.endsWith(".tsx");
|
|
8
|
+
}
|
|
9
|
+
extract(path, source) {
|
|
10
|
+
const parseResult = parseTypeScriptSource(path, source);
|
|
11
|
+
if (parseResult.kind === "unavailable") {
|
|
12
|
+
return parseResult;
|
|
13
|
+
}
|
|
14
|
+
const functions = [];
|
|
15
|
+
const interfaces = new Map();
|
|
16
|
+
const classes = new Map();
|
|
17
|
+
const { sourceFile } = parseResult;
|
|
18
|
+
for (const statement of sourceFile.statements) {
|
|
19
|
+
const line = sourceFile.getLineAndCharacterOfPosition(statement.getStart(sourceFile)).line + 1;
|
|
20
|
+
if (ts.isFunctionDeclaration(statement) &&
|
|
21
|
+
statement.name !== undefined &&
|
|
22
|
+
statement.body !== undefined) {
|
|
23
|
+
const implementation = fingerprintImplementation(statement.body, sourceFile);
|
|
24
|
+
functions.push({ name: statement.name.text, line, ...implementation });
|
|
25
|
+
continue;
|
|
26
|
+
}
|
|
27
|
+
if (ts.isInterfaceDeclaration(statement) && !interfaces.has(statement.name.text)) {
|
|
28
|
+
interfaces.set(statement.name.text, { name: statement.name.text, line });
|
|
29
|
+
continue;
|
|
30
|
+
}
|
|
31
|
+
if (ts.isClassDeclaration(statement) &&
|
|
32
|
+
statement.name !== undefined &&
|
|
33
|
+
!classes.has(statement.name.text)) {
|
|
34
|
+
classes.set(statement.name.text, {
|
|
35
|
+
name: statement.name.text,
|
|
36
|
+
line,
|
|
37
|
+
implementedTypes: implementedTypeNames(statement),
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
return {
|
|
42
|
+
kind: "success",
|
|
43
|
+
facts: {
|
|
44
|
+
functions: functions.sort(compareFacts),
|
|
45
|
+
interfaces: [...interfaces.values()].sort(compareFacts),
|
|
46
|
+
classes: [...classes.values()].sort(compareFacts),
|
|
47
|
+
},
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
function fingerprintImplementation(body, sourceFile) {
|
|
52
|
+
const scanner = ts.createScanner(sourceFile.languageVersion, true, sourceFile.languageVariant, body.getText(sourceFile));
|
|
53
|
+
const tokens = [];
|
|
54
|
+
for (let token = scanner.scan(); token !== ts.SyntaxKind.EndOfFileToken; token = scanner.scan()) {
|
|
55
|
+
tokens.push(`${token}:${scanner.getTokenText()}`);
|
|
56
|
+
}
|
|
57
|
+
return {
|
|
58
|
+
implementationFingerprint: createHash("sha256").update(tokens.join("\0")).digest("hex"),
|
|
59
|
+
tokenCount: tokens.length,
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
function implementedTypeNames(declaration) {
|
|
63
|
+
const names = declaration.heritageClauses
|
|
64
|
+
?.filter((clause) => clause.token === ts.SyntaxKind.ImplementsKeyword)
|
|
65
|
+
.flatMap((clause) => clause.types.map((type) => simpleExpressionName(type.expression))) ?? [];
|
|
66
|
+
return [...new Set(names)].sort();
|
|
67
|
+
}
|
|
68
|
+
function simpleExpressionName(expression) {
|
|
69
|
+
if (ts.isIdentifier(expression)) {
|
|
70
|
+
return expression.text;
|
|
71
|
+
}
|
|
72
|
+
if (ts.isPropertyAccessExpression(expression)) {
|
|
73
|
+
return expression.name.text;
|
|
74
|
+
}
|
|
75
|
+
return expression.getText();
|
|
76
|
+
}
|
|
77
|
+
function compareFacts(left, right) {
|
|
78
|
+
return left.line - right.line || left.name.localeCompare(right.name);
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=typescript-code-structure-extractor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"typescript-code-structure-extractor.js","sourceRoot":"","sources":["../../../src/infrastructure/typescript/typescript-code-structure-extractor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,MAAM,YAAY,CAAC;AAQ5B,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AAErE,sDAAsD;AACtD,MAAM,OAAO,gCAAgC;IACpC,QAAQ,CAAC,IAAY;QAC1B,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IACvD,CAAC;IAEM,OAAO,CAAC,IAAY,EAAE,MAAc;QACzC,MAAM,WAAW,GAAG,qBAAqB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACxD,IAAI,WAAW,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;YACvC,OAAO,WAAW,CAAC;QACrB,CAAC;QAED,MAAM,SAAS,GAAiC,EAAE,CAAC;QACnD,MAAM,UAAU,GAAG,IAAI,GAAG,EAAoC,CAAC;QAC/D,MAAM,OAAO,GAAG,IAAI,GAAG,EAAmC,CAAC;QAC3D,MAAM,EAAE,UAAU,EAAE,GAAG,WAAW,CAAC;QAEnC,KAAK,MAAM,SAAS,IAAI,UAAU,CAAC,UAAU,EAAE,CAAC;YAC9C,MAAM,IAAI,GACR,UAAU,CAAC,6BAA6B,CAAC,SAAS,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC;YACpF,IACE,EAAE,CAAC,qBAAqB,CAAC,SAAS,CAAC;gBACnC,SAAS,CAAC,IAAI,KAAK,SAAS;gBAC5B,SAAS,CAAC,IAAI,KAAK,SAAS,EAC5B,CAAC;gBACD,MAAM,cAAc,GAAG,yBAAyB,CAAC,SAAS,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;gBAC7E,SAAS,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,cAAc,EAAE,CAAC,CAAC;gBACvE,SAAS;YACX,CAAC;YACD,IAAI,EAAE,CAAC,sBAAsB,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBACjF,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;gBACzE,SAAS;YACX,CAAC;YACD,IACE,EAAE,CAAC,kBAAkB,CAAC,SAAS,CAAC;gBAChC,SAAS,CAAC,IAAI,KAAK,SAAS;gBAC5B,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EACjC,CAAC;gBACD,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE;oBAC/B,IAAI,EAAE,SAAS,CAAC,IAAI,CAAC,IAAI;oBACzB,IAAI;oBACJ,gBAAgB,EAAE,oBAAoB,CAAC,SAAS,CAAC;iBAClD,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,OAAO;YACL,IAAI,EAAE,SAAS;YACf,KAAK,EAAE;gBACL,SAAS,EAAE,SAAS,CAAC,IAAI,CAAC,YAAY,CAAC;gBACvC,UAAU,EAAE,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC;gBACvD,OAAO,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC;aAClD;SACF,CAAC;IACJ,CAAC;CACF;AAED,SAAS,yBAAyB,CAChC,IAAc,EACd,UAAyB;IAEzB,MAAM,OAAO,GAAG,EAAE,CAAC,aAAa,CAC9B,UAAU,CAAC,eAAe,EAC1B,IAAI,EACJ,UAAU,CAAC,eAAe,EAC1B,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CACzB,CAAC;IACF,MAAM,MAAM,GAAa,EAAE,CAAC;IAE5B,KAAK,IAAI,KAAK,GAAG,OAAO,CAAC,IAAI,EAAE,EAAE,KAAK,KAAK,EAAE,CAAC,UAAU,CAAC,cAAc,EAAE,KAAK,GAAG,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;QAChG,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,IAAI,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;IACpD,CAAC;IAED,OAAO;QACL,yBAAyB,EAAE,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;QACvF,UAAU,EAAE,MAAM,CAAC,MAAM;KAC1B,CAAC;AACJ,CAAC;AAED,SAAS,oBAAoB,CAAC,WAAgC;IAC5D,MAAM,KAAK,GACT,WAAW,CAAC,eAAe;QACzB,EAAE,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,KAAK,EAAE,CAAC,UAAU,CAAC,iBAAiB,CAAC;SACrE,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,oBAAoB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAClG,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;AACpC,CAAC;AAED,SAAS,oBAAoB,CAAC,UAAyB;IACrD,IAAI,EAAE,CAAC,YAAY,CAAC,UAAU,CAAC,EAAE,CAAC;QAChC,OAAO,UAAU,CAAC,IAAI,CAAC;IACzB,CAAC;IACD,IAAI,EAAE,CAAC,0BAA0B,CAAC,UAAU,CAAC,EAAE,CAAC;QAC9C,OAAO,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC;IAC9B,CAAC;IACD,OAAO,UAAU,CAAC,OAAO,EAAE,CAAC;AAC9B,CAAC;AAED,SAAS,YAAY,CACnB,IAA8C,EAC9C,KAA+C;IAE/C,OAAO,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AACvE,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { ModuleReferenceExtractionResult, ModuleReferenceExtractor } from "../../application/ports/module-reference-extractor.js";
|
|
2
|
+
/** TypeScript AST에서 빌드 시점에 결정되는 정적 module specifier만 추출한다. */
|
|
3
|
+
export declare class TypeScriptModuleReferenceExtractor implements ModuleReferenceExtractor {
|
|
4
|
+
supports(path: string): boolean;
|
|
5
|
+
extract(path: string, source: string): ModuleReferenceExtractionResult;
|
|
6
|
+
}
|
|
7
|
+
//# sourceMappingURL=typescript-module-reference-extractor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"typescript-module-reference-extractor.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/typescript/typescript-module-reference-extractor.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,+BAA+B,EAC/B,wBAAwB,EACzB,MAAM,uDAAuD,CAAC;AAG/D,8DAA8D;AAC9D,qBAAa,kCAAmC,YAAW,wBAAwB;IAC1E,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAI/B,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,+BAA+B;CAgB9E"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import ts from "typescript";
|
|
2
|
+
import { parseTypeScriptSource } from "./parse-typescript-source.js";
|
|
3
|
+
/** TypeScript AST에서 빌드 시점에 결정되는 정적 module specifier만 추출한다. */
|
|
4
|
+
export class TypeScriptModuleReferenceExtractor {
|
|
5
|
+
supports(path) {
|
|
6
|
+
return path.endsWith(".ts") || path.endsWith(".tsx");
|
|
7
|
+
}
|
|
8
|
+
extract(path, source) {
|
|
9
|
+
const parseResult = parseTypeScriptSource(path, source);
|
|
10
|
+
if (parseResult.kind === "unavailable") {
|
|
11
|
+
return parseResult;
|
|
12
|
+
}
|
|
13
|
+
const specifiers = new Set();
|
|
14
|
+
for (const statement of parseResult.sourceFile.statements) {
|
|
15
|
+
const specifier = moduleSpecifier(statement);
|
|
16
|
+
if (specifier !== undefined) {
|
|
17
|
+
specifiers.add(specifier);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
return { kind: "success", specifiers: [...specifiers].sort() };
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
function moduleSpecifier(statement) {
|
|
24
|
+
if ((ts.isImportDeclaration(statement) || ts.isExportDeclaration(statement)) &&
|
|
25
|
+
statement.moduleSpecifier !== undefined &&
|
|
26
|
+
ts.isStringLiteralLike(statement.moduleSpecifier)) {
|
|
27
|
+
return statement.moduleSpecifier.text;
|
|
28
|
+
}
|
|
29
|
+
if (ts.isImportEqualsDeclaration(statement) &&
|
|
30
|
+
ts.isExternalModuleReference(statement.moduleReference) &&
|
|
31
|
+
statement.moduleReference.expression !== undefined &&
|
|
32
|
+
ts.isStringLiteralLike(statement.moduleReference.expression)) {
|
|
33
|
+
return statement.moduleReference.expression.text;
|
|
34
|
+
}
|
|
35
|
+
return undefined;
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=typescript-module-reference-extractor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"typescript-module-reference-extractor.js","sourceRoot":"","sources":["../../../src/infrastructure/typescript/typescript-module-reference-extractor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,YAAY,CAAC;AAK5B,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AAErE,8DAA8D;AAC9D,MAAM,OAAO,kCAAkC;IACtC,QAAQ,CAAC,IAAY;QAC1B,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IACvD,CAAC;IAEM,OAAO,CAAC,IAAY,EAAE,MAAc;QACzC,MAAM,WAAW,GAAG,qBAAqB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACxD,IAAI,WAAW,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;YACvC,OAAO,WAAW,CAAC;QACrB,CAAC;QAED,MAAM,UAAU,GAAG,IAAI,GAAG,EAAU,CAAC;QACrC,KAAK,MAAM,SAAS,IAAI,WAAW,CAAC,UAAU,CAAC,UAAU,EAAE,CAAC;YAC1D,MAAM,SAAS,GAAG,eAAe,CAAC,SAAS,CAAC,CAAC;YAC7C,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;gBAC5B,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YAC5B,CAAC;QACH,CAAC;QAED,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,UAAU,EAAE,CAAC,GAAG,UAAU,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;IACjE,CAAC;CACF;AAED,SAAS,eAAe,CAAC,SAAuB;IAC9C,IACE,CAAC,EAAE,CAAC,mBAAmB,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,mBAAmB,CAAC,SAAS,CAAC,CAAC;QACxE,SAAS,CAAC,eAAe,KAAK,SAAS;QACvC,EAAE,CAAC,mBAAmB,CAAC,SAAS,CAAC,eAAe,CAAC,EACjD,CAAC;QACD,OAAO,SAAS,CAAC,eAAe,CAAC,IAAI,CAAC;IACxC,CAAC;IAED,IACE,EAAE,CAAC,yBAAyB,CAAC,SAAS,CAAC;QACvC,EAAE,CAAC,yBAAyB,CAAC,SAAS,CAAC,eAAe,CAAC;QACvD,SAAS,CAAC,eAAe,CAAC,UAAU,KAAK,SAAS;QAClD,EAAE,CAAC,mBAAmB,CAAC,SAAS,CAAC,eAAe,CAAC,UAAU,CAAC,EAC5D,CAAC;QACD,OAAO,SAAS,CAAC,eAAe,CAAC,UAAU,CAAC,IAAI,CAAC;IACnD,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { SourceSymbolExtractor, SymbolExtractionResult } from "../../application/ports/source-symbol-extractor.js";
|
|
2
|
+
/** TypeScript Compiler API로 이름이 있는 최상위 선언과 공개 계약을 추출한다. */
|
|
3
|
+
export declare class TypeScriptSymbolExtractor implements SourceSymbolExtractor {
|
|
4
|
+
supports(path: string): boolean;
|
|
5
|
+
extract(path: string, source: string): SymbolExtractionResult;
|
|
6
|
+
}
|
|
7
|
+
//# sourceMappingURL=typescript-symbol-extractor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"typescript-symbol-extractor.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/typescript/typescript-symbol-extractor.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,qBAAqB,EACrB,sBAAsB,EACvB,MAAM,oDAAoD,CAAC;AAkB5D,2DAA2D;AAC3D,qBAAa,yBAA0B,YAAW,qBAAqB;IAC9D,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAI/B,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,sBAAsB;CA+CrE"}
|
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import ts from "typescript";
|
|
3
|
+
import { parseTypeScriptSource } from "./parse-typescript-source.js";
|
|
4
|
+
/** TypeScript Compiler API로 이름이 있는 최상위 선언과 공개 계약을 추출한다. */
|
|
5
|
+
export class TypeScriptSymbolExtractor {
|
|
6
|
+
supports(path) {
|
|
7
|
+
return path.endsWith(".ts") || path.endsWith(".tsx");
|
|
8
|
+
}
|
|
9
|
+
extract(path, source) {
|
|
10
|
+
const parseResult = parseTypeScriptSource(path, source);
|
|
11
|
+
if (parseResult.kind === "unavailable") {
|
|
12
|
+
return parseResult;
|
|
13
|
+
}
|
|
14
|
+
const { sourceFile } = parseResult;
|
|
15
|
+
const localExports = collectLocalExports(sourceFile);
|
|
16
|
+
const groups = new Map();
|
|
17
|
+
for (const statement of sourceFile.statements) {
|
|
18
|
+
const identity = declarationIdentity(statement);
|
|
19
|
+
if (identity === undefined) {
|
|
20
|
+
continue;
|
|
21
|
+
}
|
|
22
|
+
const key = `${identity.kind}\0${identity.name}`;
|
|
23
|
+
const existing = groups.get(key);
|
|
24
|
+
const text = statement.getText(sourceFile);
|
|
25
|
+
const exported = hasExportModifier(statement) || localExports.has(identity.name);
|
|
26
|
+
if (existing === undefined) {
|
|
27
|
+
const position = sourceFile.getLineAndCharacterOfPosition(statement.getStart(sourceFile));
|
|
28
|
+
groups.set(key, {
|
|
29
|
+
...identity,
|
|
30
|
+
line: position.line + 1,
|
|
31
|
+
declarations: [text],
|
|
32
|
+
statements: [statement],
|
|
33
|
+
exported,
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
existing.declarations.push(text);
|
|
38
|
+
existing.statements.push(statement);
|
|
39
|
+
existing.exported ||= exported;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
collectExternalReExports(sourceFile, groups);
|
|
43
|
+
const symbols = [...groups.values()]
|
|
44
|
+
.map((group) => toSourceSymbol(group, sourceFile))
|
|
45
|
+
.sort((left, right) => left.line - right.line ||
|
|
46
|
+
left.kind.localeCompare(right.kind) ||
|
|
47
|
+
left.name.localeCompare(right.name));
|
|
48
|
+
return { kind: "success", symbols };
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
function collectLocalExports(sourceFile) {
|
|
52
|
+
const names = new Set();
|
|
53
|
+
for (const statement of sourceFile.statements) {
|
|
54
|
+
if (!ts.isExportDeclaration(statement) ||
|
|
55
|
+
statement.moduleSpecifier !== undefined ||
|
|
56
|
+
statement.exportClause === undefined ||
|
|
57
|
+
!ts.isNamedExports(statement.exportClause)) {
|
|
58
|
+
continue;
|
|
59
|
+
}
|
|
60
|
+
for (const element of statement.exportClause.elements) {
|
|
61
|
+
names.add((element.propertyName ?? element.name).text);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
return names;
|
|
65
|
+
}
|
|
66
|
+
function collectExternalReExports(sourceFile, groups) {
|
|
67
|
+
for (const statement of sourceFile.statements) {
|
|
68
|
+
if (!ts.isExportDeclaration(statement) || statement.moduleSpecifier === undefined) {
|
|
69
|
+
continue;
|
|
70
|
+
}
|
|
71
|
+
const moduleName = statement.moduleSpecifier.getText(sourceFile);
|
|
72
|
+
for (const name of reExportNames(statement, moduleName)) {
|
|
73
|
+
const key = `re-export\0${name}`;
|
|
74
|
+
const text = statement.getText(sourceFile);
|
|
75
|
+
const existing = groups.get(key);
|
|
76
|
+
if (existing === undefined) {
|
|
77
|
+
const position = sourceFile.getLineAndCharacterOfPosition(statement.getStart(sourceFile));
|
|
78
|
+
groups.set(key, {
|
|
79
|
+
name,
|
|
80
|
+
kind: "re-export",
|
|
81
|
+
line: position.line + 1,
|
|
82
|
+
declarations: [text],
|
|
83
|
+
statements: [statement],
|
|
84
|
+
exported: true,
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
else {
|
|
88
|
+
existing.declarations.push(text);
|
|
89
|
+
existing.statements.push(statement);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
function reExportNames(statement, moduleName) {
|
|
95
|
+
if (statement.exportClause === undefined) {
|
|
96
|
+
return [`* from ${moduleName}`];
|
|
97
|
+
}
|
|
98
|
+
if (ts.isNamespaceExport(statement.exportClause)) {
|
|
99
|
+
return [statement.exportClause.name.text];
|
|
100
|
+
}
|
|
101
|
+
return statement.exportClause.elements.map((element) => element.name.text);
|
|
102
|
+
}
|
|
103
|
+
function hasExportModifier(statement) {
|
|
104
|
+
return (ts.canHaveModifiers(statement) &&
|
|
105
|
+
(ts
|
|
106
|
+
.getModifiers(statement)
|
|
107
|
+
?.some((modifier) => modifier.kind === ts.SyntaxKind.ExportKeyword) ??
|
|
108
|
+
false));
|
|
109
|
+
}
|
|
110
|
+
function declarationIdentity(statement) {
|
|
111
|
+
if (ts.isFunctionDeclaration(statement) && statement.name !== undefined) {
|
|
112
|
+
return { name: statement.name.text, kind: "function" };
|
|
113
|
+
}
|
|
114
|
+
if (ts.isClassDeclaration(statement) && statement.name !== undefined) {
|
|
115
|
+
return { name: statement.name.text, kind: "class" };
|
|
116
|
+
}
|
|
117
|
+
if (ts.isInterfaceDeclaration(statement)) {
|
|
118
|
+
return { name: statement.name.text, kind: "interface" };
|
|
119
|
+
}
|
|
120
|
+
if (ts.isTypeAliasDeclaration(statement)) {
|
|
121
|
+
return { name: statement.name.text, kind: "type-alias" };
|
|
122
|
+
}
|
|
123
|
+
return undefined;
|
|
124
|
+
}
|
|
125
|
+
function toSourceSymbol(group, sourceFile) {
|
|
126
|
+
const publicApi = group.exported ? extractPublicApi(group, sourceFile) : undefined;
|
|
127
|
+
return {
|
|
128
|
+
name: group.name,
|
|
129
|
+
kind: group.kind,
|
|
130
|
+
line: group.line,
|
|
131
|
+
exported: group.exported,
|
|
132
|
+
fingerprint: createHash("sha256").update(group.declarations.join("\0")).digest("hex"),
|
|
133
|
+
...(publicApi === undefined ? {} : { publicApi }),
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
function extractPublicApi(group, sourceFile) {
|
|
137
|
+
if (group.kind === "function") {
|
|
138
|
+
const declarations = group.statements.filter(ts.isFunctionDeclaration);
|
|
139
|
+
const overloads = declarations.filter((declaration) => declaration.body === undefined);
|
|
140
|
+
const publicDeclarations = overloads.length > 0 ? overloads : declarations;
|
|
141
|
+
return {
|
|
142
|
+
kind: "function",
|
|
143
|
+
signatures: publicDeclarations
|
|
144
|
+
.map((declaration) => functionSignature(declaration, sourceFile))
|
|
145
|
+
.sort(),
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
if (group.kind === "interface") {
|
|
149
|
+
const declarations = group.statements.filter(ts.isInterfaceDeclaration);
|
|
150
|
+
return {
|
|
151
|
+
kind: "interface",
|
|
152
|
+
extendsTypes: declarations
|
|
153
|
+
.flatMap((declaration) => declaration.heritageClauses?.flatMap((clause) => clause.types.map((type) => normalize(type.getText(sourceFile)))) ?? [])
|
|
154
|
+
.sort(),
|
|
155
|
+
members: declarations
|
|
156
|
+
.flatMap((declaration) => declaration.members.flatMap((member) => interfaceMember(member, sourceFile)))
|
|
157
|
+
.sort(compareInterfaceMembers),
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
return undefined;
|
|
161
|
+
}
|
|
162
|
+
function functionSignature(declaration, sourceFile) {
|
|
163
|
+
const typeParameters = declaration.typeParameters?.map((parameter) => normalize(parameter.getText(sourceFile)));
|
|
164
|
+
const generics = typeParameters === undefined ? "" : `<${typeParameters.join(",")}>`;
|
|
165
|
+
const parameters = declaration.parameters
|
|
166
|
+
.map((parameter) => parameterSignature(parameter, sourceFile))
|
|
167
|
+
.join(",");
|
|
168
|
+
const returnType = declaration.type?.getText(sourceFile) ?? "inferred";
|
|
169
|
+
return `${generics}(${parameters}):${normalize(returnType)}`;
|
|
170
|
+
}
|
|
171
|
+
function parameterSignature(parameter, sourceFile) {
|
|
172
|
+
const rest = parameter.dotDotDotToken === undefined ? "" : "...";
|
|
173
|
+
const optional = parameter.questionToken !== undefined || parameter.initializer !== undefined ? "?" : "";
|
|
174
|
+
const type = parameter.type?.getText(sourceFile) ?? "inferred";
|
|
175
|
+
return `${rest}${normalize(type)}${optional}`;
|
|
176
|
+
}
|
|
177
|
+
function interfaceMember(member, sourceFile) {
|
|
178
|
+
if (ts.isPropertySignature(member) && member.name !== undefined) {
|
|
179
|
+
return [
|
|
180
|
+
{
|
|
181
|
+
name: normalize(member.name.getText(sourceFile)),
|
|
182
|
+
memberKind: "property",
|
|
183
|
+
optional: member.questionToken !== undefined,
|
|
184
|
+
signature: normalize(member.type?.getText(sourceFile) ?? "inferred"),
|
|
185
|
+
},
|
|
186
|
+
];
|
|
187
|
+
}
|
|
188
|
+
if (ts.isMethodSignature(member)) {
|
|
189
|
+
return [
|
|
190
|
+
{
|
|
191
|
+
name: normalize(member.name.getText(sourceFile)),
|
|
192
|
+
memberKind: "method",
|
|
193
|
+
optional: member.questionToken !== undefined,
|
|
194
|
+
signature: functionSignature(member, sourceFile),
|
|
195
|
+
},
|
|
196
|
+
];
|
|
197
|
+
}
|
|
198
|
+
return [];
|
|
199
|
+
}
|
|
200
|
+
function compareInterfaceMembers(left, right) {
|
|
201
|
+
return left.name.localeCompare(right.name) || left.memberKind.localeCompare(right.memberKind);
|
|
202
|
+
}
|
|
203
|
+
function normalize(value) {
|
|
204
|
+
return value.replace(/\s+/g, " ").trim();
|
|
205
|
+
}
|
|
206
|
+
//# sourceMappingURL=typescript-symbol-extractor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"typescript-symbol-extractor.js","sourceRoot":"","sources":["../../../src/infrastructure/typescript/typescript-symbol-extractor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,MAAM,YAAY,CAAC;AAW5B,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AAWrE,2DAA2D;AAC3D,MAAM,OAAO,yBAAyB;IAC7B,QAAQ,CAAC,IAAY;QAC1B,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IACvD,CAAC;IAEM,OAAO,CAAC,IAAY,EAAE,MAAc;QACzC,MAAM,WAAW,GAAG,qBAAqB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACxD,IAAI,WAAW,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;YACvC,OAAO,WAAW,CAAC;QACrB,CAAC;QACD,MAAM,EAAE,UAAU,EAAE,GAAG,WAAW,CAAC;QACnC,MAAM,YAAY,GAAG,mBAAmB,CAAC,UAAU,CAAC,CAAC;QACrD,MAAM,MAAM,GAAG,IAAI,GAAG,EAAuB,CAAC;QAE9C,KAAK,MAAM,SAAS,IAAI,UAAU,CAAC,UAAU,EAAE,CAAC;YAC9C,MAAM,QAAQ,GAAG,mBAAmB,CAAC,SAAS,CAAC,CAAC;YAChD,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;gBAC3B,SAAS;YACX,CAAC;YAED,MAAM,GAAG,GAAG,GAAG,QAAQ,CAAC,IAAI,KAAK,QAAQ,CAAC,IAAI,EAAE,CAAC;YACjD,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACjC,MAAM,IAAI,GAAG,SAAS,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;YAC3C,MAAM,QAAQ,GAAG,iBAAiB,CAAC,SAAS,CAAC,IAAI,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YACjF,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;gBAC3B,MAAM,QAAQ,GAAG,UAAU,CAAC,6BAA6B,CAAC,SAAS,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC;gBAC1F,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE;oBACd,GAAG,QAAQ;oBACX,IAAI,EAAE,QAAQ,CAAC,IAAI,GAAG,CAAC;oBACvB,YAAY,EAAE,CAAC,IAAI,CAAC;oBACpB,UAAU,EAAE,CAAC,SAAS,CAAC;oBACvB,QAAQ;iBACT,CAAC,CAAC;YACL,CAAC;iBAAM,CAAC;gBACN,QAAQ,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACjC,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBACpC,QAAQ,CAAC,QAAQ,KAAK,QAAQ,CAAC;YACjC,CAAC;QACH,CAAC;QAED,wBAAwB,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;QAE7C,MAAM,OAAO,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC;aACjC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,cAAc,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;aACjD,IAAI,CACH,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CACd,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI;YACtB,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC;YACnC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,CACtC,CAAC;QACJ,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC;IACtC,CAAC;CACF;AAED,SAAS,mBAAmB,CAAC,UAAyB;IACpD,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;IAChC,KAAK,MAAM,SAAS,IAAI,UAAU,CAAC,UAAU,EAAE,CAAC;QAC9C,IACE,CAAC,EAAE,CAAC,mBAAmB,CAAC,SAAS,CAAC;YAClC,SAAS,CAAC,eAAe,KAAK,SAAS;YACvC,SAAS,CAAC,YAAY,KAAK,SAAS;YACpC,CAAC,EAAE,CAAC,cAAc,CAAC,SAAS,CAAC,YAAY,CAAC,EAC1C,CAAC;YACD,SAAS;QACX,CAAC;QACD,KAAK,MAAM,OAAO,IAAI,SAAS,CAAC,YAAY,CAAC,QAAQ,EAAE,CAAC;YACtD,KAAK,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC;QACzD,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,wBAAwB,CAC/B,UAAyB,EACzB,MAAgC;IAEhC,KAAK,MAAM,SAAS,IAAI,UAAU,CAAC,UAAU,EAAE,CAAC;QAC9C,IAAI,CAAC,EAAE,CAAC,mBAAmB,CAAC,SAAS,CAAC,IAAI,SAAS,CAAC,eAAe,KAAK,SAAS,EAAE,CAAC;YAClF,SAAS;QACX,CAAC;QACD,MAAM,UAAU,GAAG,SAAS,CAAC,eAAe,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QACjE,KAAK,MAAM,IAAI,IAAI,aAAa,CAAC,SAAS,EAAE,UAAU,CAAC,EAAE,CAAC;YACxD,MAAM,GAAG,GAAG,cAAc,IAAI,EAAE,CAAC;YACjC,MAAM,IAAI,GAAG,SAAS,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;YAC3C,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACjC,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;gBAC3B,MAAM,QAAQ,GAAG,UAAU,CAAC,6BAA6B,CAAC,SAAS,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC;gBAC1F,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE;oBACd,IAAI;oBACJ,IAAI,EAAE,WAAW;oBACjB,IAAI,EAAE,QAAQ,CAAC,IAAI,GAAG,CAAC;oBACvB,YAAY,EAAE,CAAC,IAAI,CAAC;oBACpB,UAAU,EAAE,CAAC,SAAS,CAAC;oBACvB,QAAQ,EAAE,IAAI;iBACf,CAAC,CAAC;YACL,CAAC;iBAAM,CAAC;gBACN,QAAQ,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACjC,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACtC,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,aAAa,CAAC,SAA+B,EAAE,UAAkB;IACxE,IAAI,SAAS,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;QACzC,OAAO,CAAC,UAAU,UAAU,EAAE,CAAC,CAAC;IAClC,CAAC;IACD,IAAI,EAAE,CAAC,iBAAiB,CAAC,SAAS,CAAC,YAAY,CAAC,EAAE,CAAC;QACjD,OAAO,CAAC,SAAS,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC5C,CAAC;IACD,OAAO,SAAS,CAAC,YAAY,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC7E,CAAC;AAED,SAAS,iBAAiB,CAAC,SAAuB;IAChD,OAAO,CACL,EAAE,CAAC,gBAAgB,CAAC,SAAS,CAAC;QAC9B,CAAC,EAAE;aACA,YAAY,CAAC,SAAS,CAAC;YACxB,EAAE,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,KAAK,EAAE,CAAC,UAAU,CAAC,aAAa,CAAC;YACnE,KAAK,CAAC,CACT,CAAC;AACJ,CAAC;AAED,SAAS,mBAAmB,CAC1B,SAAuB;IAEvB,IAAI,EAAE,CAAC,qBAAqB,CAAC,SAAS,CAAC,IAAI,SAAS,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QACxE,OAAO,EAAE,IAAI,EAAE,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;IACzD,CAAC;IACD,IAAI,EAAE,CAAC,kBAAkB,CAAC,SAAS,CAAC,IAAI,SAAS,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QACrE,OAAO,EAAE,IAAI,EAAE,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;IACtD,CAAC;IACD,IAAI,EAAE,CAAC,sBAAsB,CAAC,SAAS,CAAC,EAAE,CAAC;QACzC,OAAO,EAAE,IAAI,EAAE,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;IAC1D,CAAC;IACD,IAAI,EAAE,CAAC,sBAAsB,CAAC,SAAS,CAAC,EAAE,CAAC;QACzC,OAAO,EAAE,IAAI,EAAE,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;IAC3D,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,cAAc,CAAC,KAAkB,EAAE,UAAyB;IACnE,MAAM,SAAS,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,gBAAgB,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACnF,OAAO;QACL,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,WAAW,EAAE,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;QACrF,GAAG,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC;KAClD,CAAC;AACJ,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAkB,EAAE,UAAyB;IACrE,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;QAC9B,MAAM,YAAY,GAAG,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC,qBAAqB,CAAC,CAAC;QACvE,MAAM,SAAS,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC;QACvF,MAAM,kBAAkB,GAAG,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,YAAY,CAAC;QAC3E,OAAO;YACL,IAAI,EAAE,UAAU;YAChB,UAAU,EAAE,kBAAkB;iBAC3B,GAAG,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,iBAAiB,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;iBAChE,IAAI,EAAE;SACV,CAAC;IACJ,CAAC;IACD,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;QAC/B,MAAM,YAAY,GAAG,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC,sBAAsB,CAAC,CAAC;QACxE,OAAO;YACL,IAAI,EAAE,WAAW;YACjB,YAAY,EAAE,YAAY;iBACvB,OAAO,CACN,CAAC,WAAW,EAAE,EAAE,CACd,WAAW,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE,CAC9C,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAChE,IAAI,EAAE,CACV;iBACA,IAAI,EAAE;YACT,OAAO,EAAE,YAAY;iBAClB,OAAO,CAAC,CAAC,WAAW,EAAE,EAAE,CACvB,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,eAAe,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAC7E;iBACA,IAAI,CAAC,uBAAuB,CAAC;SACjC,CAAC;IACJ,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,iBAAiB,CACxB,WAAwD,EACxD,UAAyB;IAEzB,MAAM,cAAc,GAAG,WAAW,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CACnE,SAAS,CAAC,SAAS,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CACzC,CAAC;IACF,MAAM,QAAQ,GAAG,cAAc,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;IACrF,MAAM,UAAU,GAAG,WAAW,CAAC,UAAU;SACtC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,kBAAkB,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;SAC7D,IAAI,CAAC,GAAG,CAAC,CAAC;IACb,MAAM,UAAU,GAAG,WAAW,CAAC,IAAI,EAAE,OAAO,CAAC,UAAU,CAAC,IAAI,UAAU,CAAC;IACvE,OAAO,GAAG,QAAQ,IAAI,UAAU,KAAK,SAAS,CAAC,UAAU,CAAC,EAAE,CAAC;AAC/D,CAAC;AAED,SAAS,kBAAkB,CAAC,SAAkC,EAAE,UAAyB;IACvF,MAAM,IAAI,GAAG,SAAS,CAAC,cAAc,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;IACjE,MAAM,QAAQ,GACZ,SAAS,CAAC,aAAa,KAAK,SAAS,IAAI,SAAS,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IAC1F,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,EAAE,OAAO,CAAC,UAAU,CAAC,IAAI,UAAU,CAAC;IAC/D,OAAO,GAAG,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,GAAG,QAAQ,EAAE,CAAC;AAChD,CAAC;AAED,SAAS,eAAe,CACtB,MAAsB,EACtB,UAAyB;IAEzB,IAAI,EAAE,CAAC,mBAAmB,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAChE,OAAO;YACL;gBACE,IAAI,EAAE,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;gBAChD,UAAU,EAAE,UAAU;gBACtB,QAAQ,EAAE,MAAM,CAAC,aAAa,KAAK,SAAS;gBAC5C,SAAS,EAAE,SAAS,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,UAAU,CAAC,IAAI,UAAU,CAAC;aACrE;SACF,CAAC;IACJ,CAAC;IACD,IAAI,EAAE,CAAC,iBAAiB,CAAC,MAAM,CAAC,EAAE,CAAC;QACjC,OAAO;YACL;gBACE,IAAI,EAAE,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;gBAChD,UAAU,EAAE,QAAQ;gBACpB,QAAQ,EAAE,MAAM,CAAC,aAAa,KAAK,SAAS;gBAC5C,SAAS,EAAE,iBAAiB,CAAC,MAAM,EAAE,UAAU,CAAC;aACjD;SACF,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,SAAS,uBAAuB,CAC9B,IAA8B,EAC9B,KAA+B;IAE/B,OAAO,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;AAChG,CAAC;AAED,SAAS,SAAS,CAAC,KAAa;IAC9B,OAAO,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;AAC3C,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { ChangeReport } from "../domain/report.js";
|
|
2
|
+
export interface RepositoryAnalysisOptions {
|
|
3
|
+
readonly workingDirectory: string;
|
|
4
|
+
readonly baseRef?: string;
|
|
5
|
+
readonly headRef?: string;
|
|
6
|
+
readonly configurationPath?: string;
|
|
7
|
+
}
|
|
8
|
+
/** CLI와 자동화 어댑터가 동일한 분석 구성과 규칙 집합을 사용하도록 조립을 공유한다. */
|
|
9
|
+
export declare function analyzeRepository(options: RepositoryAnalysisOptions): Promise<ChangeReport>;
|
|
10
|
+
//# sourceMappingURL=analyze-repository.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analyze-repository.d.ts","sourceRoot":"","sources":["../../src/presentation/analyze-repository.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAUxD,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;CACrC;AAED,sDAAsD;AACtD,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,yBAAyB,GAAG,OAAO,CAAC,YAAY,CAAC,CAyCjG"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { ChangeBudgetRule } from "../application/rules/change-budget-rule.js";
|
|
2
|
+
import { DuplicateImplementationRule } from "../application/rules/duplicate-implementation-rule.js";
|
|
3
|
+
import { ExpectedScopeRule } from "../application/rules/expected-scope-rule.js";
|
|
4
|
+
import { MissingTestChangeRule } from "../application/rules/missing-test-change-rule.js";
|
|
5
|
+
import { PackageDependencyRule } from "../application/rules/package-dependency-rule.js";
|
|
6
|
+
import { PublicApiCompatibilityRule } from "../application/rules/public-api-compatibility-rule.js";
|
|
7
|
+
import { PublicApiRemovalRule } from "../application/rules/public-api-removal-rule.js";
|
|
8
|
+
import { SingleImplementationAbstractionRule } from "../application/rules/single-implementation-abstraction-rule.js";
|
|
9
|
+
import { AnalyzeCodeStructure } from "../application/services/analyze-code-structure.js";
|
|
10
|
+
import { AnalyzeImportImpact } from "../application/services/analyze-import-impact.js";
|
|
11
|
+
import { AnalyzeTestChanges } from "../application/services/analyze-test-changes.js";
|
|
12
|
+
import { CompareSourceSymbols } from "../application/services/compare-source-symbols.js";
|
|
13
|
+
import { RuleEngine } from "../application/services/rule-engine.js";
|
|
14
|
+
import { AnalyzeChanges } from "../application/use-cases/analyze-changes.js";
|
|
15
|
+
import { JsonChangeContractLoader } from "../infrastructure/config/json-change-contract-loader.js";
|
|
16
|
+
import { GitChangeSource } from "../infrastructure/git/git-change-source.js";
|
|
17
|
+
import { GitFileSnapshotSource } from "../infrastructure/git/git-file-snapshot-source.js";
|
|
18
|
+
import { GitProjectFileSource } from "../infrastructure/git/git-project-file-source.js";
|
|
19
|
+
import { NodeCommandRunner } from "../infrastructure/process/command-runner.js";
|
|
20
|
+
import { TypeScriptCodeStructureExtractor } from "../infrastructure/typescript/typescript-code-structure-extractor.js";
|
|
21
|
+
import { TypeScriptModuleReferenceExtractor } from "../infrastructure/typescript/typescript-module-reference-extractor.js";
|
|
22
|
+
import { TypeScriptSymbolExtractor } from "../infrastructure/typescript/typescript-symbol-extractor.js";
|
|
23
|
+
/** CLI와 자동화 어댑터가 동일한 분석 구성과 규칙 집합을 사용하도록 조립을 공유한다. */
|
|
24
|
+
export async function analyzeRepository(options) {
|
|
25
|
+
const commandRunner = new NodeCommandRunner();
|
|
26
|
+
const snapshotSource = new GitFileSnapshotSource(options.workingDirectory, commandRunner);
|
|
27
|
+
const contract = await new JsonChangeContractLoader().load(options.workingDirectory, options.configurationPath);
|
|
28
|
+
const ruleEngine = new RuleEngine([
|
|
29
|
+
new PackageDependencyRule(snapshotSource),
|
|
30
|
+
new ExpectedScopeRule(),
|
|
31
|
+
new ChangeBudgetRule(),
|
|
32
|
+
new MissingTestChangeRule(),
|
|
33
|
+
new PublicApiRemovalRule(),
|
|
34
|
+
new PublicApiCompatibilityRule(),
|
|
35
|
+
new DuplicateImplementationRule(),
|
|
36
|
+
new SingleImplementationAbstractionRule(),
|
|
37
|
+
]);
|
|
38
|
+
const symbolChangeAnalyzer = new CompareSourceSymbols(snapshotSource, [
|
|
39
|
+
new TypeScriptSymbolExtractor(),
|
|
40
|
+
]);
|
|
41
|
+
const projectFiles = new GitProjectFileSource(options.workingDirectory, commandRunner);
|
|
42
|
+
const impactAnalyzer = new AnalyzeImportImpact(projectFiles, [
|
|
43
|
+
new TypeScriptModuleReferenceExtractor(),
|
|
44
|
+
]);
|
|
45
|
+
const codeStructureAnalyzer = new AnalyzeCodeStructure(projectFiles, [
|
|
46
|
+
new TypeScriptCodeStructureExtractor(),
|
|
47
|
+
]);
|
|
48
|
+
const useCase = new AnalyzeChanges(new GitChangeSource(options.workingDirectory, commandRunner), ruleEngine, symbolChangeAnalyzer, impactAnalyzer, new AnalyzeTestChanges(), codeStructureAnalyzer);
|
|
49
|
+
return useCase.execute({
|
|
50
|
+
...(options.baseRef === undefined ? {} : { baseRef: options.baseRef }),
|
|
51
|
+
...(options.headRef === undefined ? {} : { headRef: options.headRef }),
|
|
52
|
+
...(contract === undefined ? {} : { contract }),
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=analyze-repository.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analyze-repository.js","sourceRoot":"","sources":["../../src/presentation/analyze-repository.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { type Severity } from "../../domain/finding.js";
|
|
2
|
+
export declare const outputFormats: readonly ["text", "json", "html"];
|
|
3
|
+
export type OutputFormat = (typeof outputFormats)[number];
|
|
4
|
+
export interface AnalyzeCommandOptions {
|
|
5
|
+
readonly command: "analyze";
|
|
6
|
+
readonly baseRef?: string;
|
|
7
|
+
readonly headRef?: string;
|
|
8
|
+
readonly workingDirectory: string;
|
|
9
|
+
readonly configurationPath?: string;
|
|
10
|
+
readonly outputFormat: OutputFormat;
|
|
11
|
+
readonly outputPath?: string;
|
|
12
|
+
readonly failOn?: Severity;
|
|
13
|
+
}
|
|
14
|
+
export interface HelpCommandOptions {
|
|
15
|
+
readonly command: "help";
|
|
16
|
+
}
|
|
17
|
+
export interface VersionCommandOptions {
|
|
18
|
+
readonly command: "version";
|
|
19
|
+
}
|
|
20
|
+
export type CliOptions = AnalyzeCommandOptions | HelpCommandOptions | VersionCommandOptions;
|
|
21
|
+
export declare class CliUsageError extends Error {
|
|
22
|
+
constructor(message: string);
|
|
23
|
+
}
|
|
24
|
+
export declare function parseArguments(arguments_: readonly string[], currentDirectory: string): CliOptions;
|
|
25
|
+
export declare function helpText(): string;
|
|
26
|
+
//# sourceMappingURL=arguments.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"arguments.d.ts","sourceRoot":"","sources":["../../../src/presentation/cli/arguments.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,QAAQ,EAAc,MAAM,yBAAyB,CAAC;AAEpE,eAAO,MAAM,aAAa,mCAAoC,CAAC;AAE/D,MAAM,MAAM,YAAY,GAAG,CAAC,OAAO,aAAa,CAAC,CAAC,MAAM,CAAC,CAAC;AAE1D,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,OAAO,EAAE,SAAS,CAAC;IAC5B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IACpC,QAAQ,CAAC,YAAY,EAAE,YAAY,CAAC;IACpC,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,MAAM,CAAC,EAAE,QAAQ,CAAC;CAC5B;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,OAAO,EAAE,SAAS,CAAC;CAC7B;AAED,MAAM,MAAM,UAAU,GAAG,qBAAqB,GAAG,kBAAkB,GAAG,qBAAqB,CAAC;AAE5F,qBAAa,aAAc,SAAQ,KAAK;gBACnB,OAAO,EAAE,MAAM;CAInC;AAED,wBAAgB,cAAc,CAC5B,UAAU,EAAE,SAAS,MAAM,EAAE,EAC7B,gBAAgB,EAAE,MAAM,GACvB,UAAU,CAoEZ;AAED,wBAAgB,QAAQ,IAAI,MAAM,CAqBjC"}
|