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.
Files changed (244) hide show
  1. package/LICENSE +21 -0
  2. package/README.ko.md +470 -0
  3. package/README.md +436 -2
  4. package/dist/application/ports/analysis-rule.d.ts +23 -0
  5. package/dist/application/ports/analysis-rule.d.ts.map +1 -0
  6. package/dist/application/ports/analysis-rule.js +2 -0
  7. package/dist/application/ports/analysis-rule.js.map +1 -0
  8. package/dist/application/ports/change-impact-analyzer.d.ts +6 -0
  9. package/dist/application/ports/change-impact-analyzer.d.ts.map +1 -0
  10. package/dist/application/ports/change-impact-analyzer.js +2 -0
  11. package/dist/application/ports/change-impact-analyzer.js.map +1 -0
  12. package/dist/application/ports/change-source.d.ts +10 -0
  13. package/dist/application/ports/change-source.d.ts.map +1 -0
  14. package/dist/application/ports/change-source.js +2 -0
  15. package/dist/application/ports/change-source.js.map +1 -0
  16. package/dist/application/ports/code-structure-analyzer.d.ts +6 -0
  17. package/dist/application/ports/code-structure-analyzer.d.ts.map +1 -0
  18. package/dist/application/ports/code-structure-analyzer.js +2 -0
  19. package/dist/application/ports/code-structure-analyzer.js.map +1 -0
  20. package/dist/application/ports/code-structure-extractor.d.ts +33 -0
  21. package/dist/application/ports/code-structure-extractor.d.ts.map +1 -0
  22. package/dist/application/ports/code-structure-extractor.js +2 -0
  23. package/dist/application/ports/code-structure-extractor.js.map +1 -0
  24. package/dist/application/ports/file-snapshot-source.d.ts +10 -0
  25. package/dist/application/ports/file-snapshot-source.d.ts.map +1 -0
  26. package/dist/application/ports/file-snapshot-source.js +2 -0
  27. package/dist/application/ports/file-snapshot-source.js.map +1 -0
  28. package/dist/application/ports/module-reference-extractor.d.ts +13 -0
  29. package/dist/application/ports/module-reference-extractor.d.ts.map +1 -0
  30. package/dist/application/ports/module-reference-extractor.js +2 -0
  31. package/dist/application/ports/module-reference-extractor.js.map +1 -0
  32. package/dist/application/ports/project-file-source.d.ts +16 -0
  33. package/dist/application/ports/project-file-source.d.ts.map +1 -0
  34. package/dist/application/ports/project-file-source.js +2 -0
  35. package/dist/application/ports/project-file-source.js.map +1 -0
  36. package/dist/application/ports/source-symbol-extractor.d.ts +14 -0
  37. package/dist/application/ports/source-symbol-extractor.d.ts.map +1 -0
  38. package/dist/application/ports/source-symbol-extractor.js +2 -0
  39. package/dist/application/ports/source-symbol-extractor.js.map +1 -0
  40. package/dist/application/ports/symbol-change-analyzer.d.ts +6 -0
  41. package/dist/application/ports/symbol-change-analyzer.d.ts.map +1 -0
  42. package/dist/application/ports/symbol-change-analyzer.js +2 -0
  43. package/dist/application/ports/symbol-change-analyzer.js.map +1 -0
  44. package/dist/application/ports/test-change-analyzer.d.ts +6 -0
  45. package/dist/application/ports/test-change-analyzer.d.ts.map +1 -0
  46. package/dist/application/ports/test-change-analyzer.js +2 -0
  47. package/dist/application/ports/test-change-analyzer.js.map +1 -0
  48. package/dist/application/rules/change-budget-rule.d.ts +7 -0
  49. package/dist/application/rules/change-budget-rule.d.ts.map +1 -0
  50. package/dist/application/rules/change-budget-rule.js +42 -0
  51. package/dist/application/rules/change-budget-rule.js.map +1 -0
  52. package/dist/application/rules/duplicate-implementation-rule.d.ts +7 -0
  53. package/dist/application/rules/duplicate-implementation-rule.d.ts.map +1 -0
  54. package/dist/application/rules/duplicate-implementation-rule.js +20 -0
  55. package/dist/application/rules/duplicate-implementation-rule.js.map +1 -0
  56. package/dist/application/rules/expected-scope-rule.d.ts +7 -0
  57. package/dist/application/rules/expected-scope-rule.d.ts.map +1 -0
  58. package/dist/application/rules/expected-scope-rule.js +27 -0
  59. package/dist/application/rules/expected-scope-rule.js.map +1 -0
  60. package/dist/application/rules/missing-test-change-rule.d.ts +7 -0
  61. package/dist/application/rules/missing-test-change-rule.d.ts.map +1 -0
  62. package/dist/application/rules/missing-test-change-rule.js +25 -0
  63. package/dist/application/rules/missing-test-change-rule.js.map +1 -0
  64. package/dist/application/rules/package-dependency-rule.d.ts +13 -0
  65. package/dist/application/rules/package-dependency-rule.d.ts.map +1 -0
  66. package/dist/application/rules/package-dependency-rule.js +174 -0
  67. package/dist/application/rules/package-dependency-rule.js.map +1 -0
  68. package/dist/application/rules/public-api-compatibility-rule.d.ts +7 -0
  69. package/dist/application/rules/public-api-compatibility-rule.d.ts.map +1 -0
  70. package/dist/application/rules/public-api-compatibility-rule.js +92 -0
  71. package/dist/application/rules/public-api-compatibility-rule.js.map +1 -0
  72. package/dist/application/rules/public-api-removal-rule.d.ts +7 -0
  73. package/dist/application/rules/public-api-removal-rule.d.ts.map +1 -0
  74. package/dist/application/rules/public-api-removal-rule.js +45 -0
  75. package/dist/application/rules/public-api-removal-rule.js.map +1 -0
  76. package/dist/application/rules/single-implementation-abstraction-rule.d.ts +7 -0
  77. package/dist/application/rules/single-implementation-abstraction-rule.d.ts.map +1 -0
  78. package/dist/application/rules/single-implementation-abstraction-rule.js +20 -0
  79. package/dist/application/rules/single-implementation-abstraction-rule.js.map +1 -0
  80. package/dist/application/services/analyze-code-structure.d.ts +14 -0
  81. package/dist/application/services/analyze-code-structure.d.ts.map +1 -0
  82. package/dist/application/services/analyze-code-structure.js +113 -0
  83. package/dist/application/services/analyze-code-structure.js.map +1 -0
  84. package/dist/application/services/analyze-import-impact.d.ts +14 -0
  85. package/dist/application/services/analyze-import-impact.d.ts.map +1 -0
  86. package/dist/application/services/analyze-import-impact.js +142 -0
  87. package/dist/application/services/analyze-import-impact.js.map +1 -0
  88. package/dist/application/services/analyze-test-changes.d.ts +8 -0
  89. package/dist/application/services/analyze-test-changes.d.ts.map +1 -0
  90. package/dist/application/services/analyze-test-changes.js +41 -0
  91. package/dist/application/services/analyze-test-changes.js.map +1 -0
  92. package/dist/application/services/compare-source-symbols.d.ts +13 -0
  93. package/dist/application/services/compare-source-symbols.d.ts.map +1 -0
  94. package/dist/application/services/compare-source-symbols.js +103 -0
  95. package/dist/application/services/compare-source-symbols.js.map +1 -0
  96. package/dist/application/services/path-pattern.d.ts +3 -0
  97. package/dist/application/services/path-pattern.d.ts.map +1 -0
  98. package/dist/application/services/path-pattern.js +34 -0
  99. package/dist/application/services/path-pattern.js.map +1 -0
  100. package/dist/application/services/rule-engine.d.ts +9 -0
  101. package/dist/application/services/rule-engine.d.ts.map +1 -0
  102. package/dist/application/services/rule-engine.js +13 -0
  103. package/dist/application/services/rule-engine.js.map +1 -0
  104. package/dist/application/use-cases/analyze-changes.d.ts +28 -0
  105. package/dist/application/use-cases/analyze-changes.d.ts.map +1 -0
  106. package/dist/application/use-cases/analyze-changes.js +88 -0
  107. package/dist/application/use-cases/analyze-changes.js.map +1 -0
  108. package/dist/domain/change-contract.d.ts +33 -0
  109. package/dist/domain/change-contract.d.ts.map +1 -0
  110. package/dist/domain/change-contract.js +76 -0
  111. package/dist/domain/change-contract.js.map +1 -0
  112. package/dist/domain/change.d.ts +37 -0
  113. package/dist/domain/change.d.ts.map +1 -0
  114. package/dist/domain/change.js +61 -0
  115. package/dist/domain/change.js.map +1 -0
  116. package/dist/domain/code-structure.d.ts +38 -0
  117. package/dist/domain/code-structure.d.ts.map +1 -0
  118. package/dist/domain/code-structure.js +63 -0
  119. package/dist/domain/code-structure.js.map +1 -0
  120. package/dist/domain/finding.d.ts +24 -0
  121. package/dist/domain/finding.d.ts.map +1 -0
  122. package/dist/domain/finding.js +30 -0
  123. package/dist/domain/finding.js.map +1 -0
  124. package/dist/domain/impact.d.ts +45 -0
  125. package/dist/domain/impact.d.ts.map +1 -0
  126. package/dist/domain/impact.js +60 -0
  127. package/dist/domain/impact.js.map +1 -0
  128. package/dist/domain/report.d.ts +22 -0
  129. package/dist/domain/report.d.ts.map +1 -0
  130. package/dist/domain/report.js +2 -0
  131. package/dist/domain/report.js.map +1 -0
  132. package/dist/domain/symbol-change.d.ts +60 -0
  133. package/dist/domain/symbol-change.d.ts.map +1 -0
  134. package/dist/domain/symbol-change.js +79 -0
  135. package/dist/domain/symbol-change.js.map +1 -0
  136. package/dist/domain/test-change.d.ts +29 -0
  137. package/dist/domain/test-change.d.ts.map +1 -0
  138. package/dist/domain/test-change.js +35 -0
  139. package/dist/domain/test-change.js.map +1 -0
  140. package/dist/infrastructure/config/json-change-contract-loader.d.ts +6 -0
  141. package/dist/infrastructure/config/json-change-contract-loader.d.ts.map +1 -0
  142. package/dist/infrastructure/config/json-change-contract-loader.js +130 -0
  143. package/dist/infrastructure/config/json-change-contract-loader.js.map +1 -0
  144. package/dist/infrastructure/filesystem/repository-path.d.ts +3 -0
  145. package/dist/infrastructure/filesystem/repository-path.d.ts.map +1 -0
  146. package/dist/infrastructure/filesystem/repository-path.js +11 -0
  147. package/dist/infrastructure/filesystem/repository-path.js.map +1 -0
  148. package/dist/infrastructure/git/diff-parser.d.ts +3 -0
  149. package/dist/infrastructure/git/diff-parser.d.ts.map +1 -0
  150. package/dist/infrastructure/git/diff-parser.js +124 -0
  151. package/dist/infrastructure/git/diff-parser.js.map +1 -0
  152. package/dist/infrastructure/git/git-change-source.d.ts +13 -0
  153. package/dist/infrastructure/git/git-change-source.d.ts.map +1 -0
  154. package/dist/infrastructure/git/git-change-source.js +43 -0
  155. package/dist/infrastructure/git/git-change-source.js.map +1 -0
  156. package/dist/infrastructure/git/git-file-snapshot-source.d.ts +14 -0
  157. package/dist/infrastructure/git/git-file-snapshot-source.d.ts.map +1 -0
  158. package/dist/infrastructure/git/git-file-snapshot-source.js +87 -0
  159. package/dist/infrastructure/git/git-file-snapshot-source.js.map +1 -0
  160. package/dist/infrastructure/git/git-project-file-source.d.ts +16 -0
  161. package/dist/infrastructure/git/git-project-file-source.d.ts.map +1 -0
  162. package/dist/infrastructure/git/git-project-file-source.js +113 -0
  163. package/dist/infrastructure/git/git-project-file-source.js.map +1 -0
  164. package/dist/infrastructure/git/untracked-file-collector.d.ts +4 -0
  165. package/dist/infrastructure/git/untracked-file-collector.d.ts.map +1 -0
  166. package/dist/infrastructure/git/untracked-file-collector.js +52 -0
  167. package/dist/infrastructure/git/untracked-file-collector.js.map +1 -0
  168. package/dist/infrastructure/process/command-runner.d.ts +17 -0
  169. package/dist/infrastructure/process/command-runner.d.ts.map +1 -0
  170. package/dist/infrastructure/process/command-runner.js +35 -0
  171. package/dist/infrastructure/process/command-runner.js.map +1 -0
  172. package/dist/infrastructure/typescript/parse-typescript-source.d.ts +11 -0
  173. package/dist/infrastructure/typescript/parse-typescript-source.d.ts.map +1 -0
  174. package/dist/infrastructure/typescript/parse-typescript-source.js +31 -0
  175. package/dist/infrastructure/typescript/parse-typescript-source.js.map +1 -0
  176. package/dist/infrastructure/typescript/typescript-code-structure-extractor.d.ts +7 -0
  177. package/dist/infrastructure/typescript/typescript-code-structure-extractor.d.ts.map +1 -0
  178. package/dist/infrastructure/typescript/typescript-code-structure-extractor.js +80 -0
  179. package/dist/infrastructure/typescript/typescript-code-structure-extractor.js.map +1 -0
  180. package/dist/infrastructure/typescript/typescript-module-reference-extractor.d.ts +7 -0
  181. package/dist/infrastructure/typescript/typescript-module-reference-extractor.d.ts.map +1 -0
  182. package/dist/infrastructure/typescript/typescript-module-reference-extractor.js +37 -0
  183. package/dist/infrastructure/typescript/typescript-module-reference-extractor.js.map +1 -0
  184. package/dist/infrastructure/typescript/typescript-symbol-extractor.d.ts +7 -0
  185. package/dist/infrastructure/typescript/typescript-symbol-extractor.d.ts.map +1 -0
  186. package/dist/infrastructure/typescript/typescript-symbol-extractor.js +206 -0
  187. package/dist/infrastructure/typescript/typescript-symbol-extractor.js.map +1 -0
  188. package/dist/presentation/analyze-repository.d.ts +10 -0
  189. package/dist/presentation/analyze-repository.d.ts.map +1 -0
  190. package/dist/presentation/analyze-repository.js +55 -0
  191. package/dist/presentation/analyze-repository.js.map +1 -0
  192. package/dist/presentation/cli/arguments.d.ts +26 -0
  193. package/dist/presentation/cli/arguments.d.ts.map +1 -0
  194. package/dist/presentation/cli/arguments.js +120 -0
  195. package/dist/presentation/cli/arguments.js.map +1 -0
  196. package/dist/presentation/cli/failure-policy.d.ts +3 -0
  197. package/dist/presentation/cli/failure-policy.d.ts.map +1 -0
  198. package/dist/presentation/cli/failure-policy.js +5 -0
  199. package/dist/presentation/cli/failure-policy.js.map +1 -0
  200. package/dist/presentation/cli/main.d.ts +3 -0
  201. package/dist/presentation/cli/main.d.ts.map +1 -0
  202. package/dist/presentation/cli/main.js +71 -0
  203. package/dist/presentation/cli/main.js.map +1 -0
  204. package/dist/presentation/cli/report-file-writer.d.ts +3 -0
  205. package/dist/presentation/cli/report-file-writer.d.ts.map +1 -0
  206. package/dist/presentation/cli/report-file-writer.js +9 -0
  207. package/dist/presentation/cli/report-file-writer.js.map +1 -0
  208. package/dist/presentation/cli/report-formatter.d.ts +5 -0
  209. package/dist/presentation/cli/report-formatter.d.ts.map +1 -0
  210. package/dist/presentation/cli/report-formatter.js +14 -0
  211. package/dist/presentation/cli/report-formatter.js.map +1 -0
  212. package/dist/presentation/cli/text-report.d.ts +3 -0
  213. package/dist/presentation/cli/text-report.d.ts.map +1 -0
  214. package/dist/presentation/cli/text-report.js +151 -0
  215. package/dist/presentation/cli/text-report.js.map +1 -0
  216. package/dist/presentation/github/action-inputs.d.ts +14 -0
  217. package/dist/presentation/github/action-inputs.d.ts.map +1 -0
  218. package/dist/presentation/github/action-inputs.js +24 -0
  219. package/dist/presentation/github/action-inputs.js.map +1 -0
  220. package/dist/presentation/github/action-main.d.ts +3 -0
  221. package/dist/presentation/github/action-main.d.ts.map +1 -0
  222. package/dist/presentation/github/action-main.js +20 -0
  223. package/dist/presentation/github/action-main.js.map +1 -0
  224. package/dist/presentation/github/action-runtime.d.ts +22 -0
  225. package/dist/presentation/github/action-runtime.d.ts.map +1 -0
  226. package/dist/presentation/github/action-runtime.js +58 -0
  227. package/dist/presentation/github/action-runtime.js.map +1 -0
  228. package/dist/presentation/github/comparison.d.ts +11 -0
  229. package/dist/presentation/github/comparison.d.ts.map +1 -0
  230. package/dist/presentation/github/comparison.js +35 -0
  231. package/dist/presentation/github/comparison.js.map +1 -0
  232. package/dist/presentation/github/markdown-summary.d.ts +4 -0
  233. package/dist/presentation/github/markdown-summary.d.ts.map +1 -0
  234. package/dist/presentation/github/markdown-summary.js +47 -0
  235. package/dist/presentation/github/markdown-summary.js.map +1 -0
  236. package/dist/presentation/github/run-action.d.ts +7 -0
  237. package/dist/presentation/github/run-action.d.ts.map +1 -0
  238. package/dist/presentation/github/run-action.js +81 -0
  239. package/dist/presentation/github/run-action.js.map +1 -0
  240. package/dist/presentation/html/html-report.d.ts +4 -0
  241. package/dist/presentation/html/html-report.d.ts.map +1 -0
  242. package/dist/presentation/html/html-report.js +362 -0
  243. package/dist/presentation/html/html-report.js.map +1 -0
  244. 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":"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"}
@@ -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"}