@nielspeter/eess-ts 0.2.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (433) hide show
  1. package/README.md +87 -34
  2. package/dist/builders/call-rule-builder.d.ts +66 -26
  3. package/dist/builders/call-rule-builder.d.ts.map +1 -1
  4. package/dist/builders/call-rule-builder.js +73 -31
  5. package/dist/builders/call-rule-builder.js.map +1 -1
  6. package/dist/builders/class-rule-builder.d.ts +125 -26
  7. package/dist/builders/class-rule-builder.d.ts.map +1 -1
  8. package/dist/builders/class-rule-builder.js +134 -30
  9. package/dist/builders/class-rule-builder.js.map +1 -1
  10. package/dist/builders/correspondence-builder.d.ts +287 -0
  11. package/dist/builders/correspondence-builder.d.ts.map +1 -0
  12. package/dist/builders/correspondence-builder.js +393 -0
  13. package/dist/builders/correspondence-builder.js.map +1 -0
  14. package/dist/builders/correspondence-findings.d.ts +104 -0
  15. package/dist/builders/correspondence-findings.d.ts.map +1 -0
  16. package/dist/builders/correspondence-findings.js +301 -0
  17. package/dist/builders/correspondence-findings.js.map +1 -0
  18. package/dist/builders/cross-layer-builder.d.ts +99 -16
  19. package/dist/builders/cross-layer-builder.d.ts.map +1 -1
  20. package/dist/builders/cross-layer-builder.js +181 -35
  21. package/dist/builders/cross-layer-builder.js.map +1 -1
  22. package/dist/builders/function-rule-builder.d.ts +144 -25
  23. package/dist/builders/function-rule-builder.d.ts.map +1 -1
  24. package/dist/builders/function-rule-builder.js +173 -26
  25. package/dist/builders/function-rule-builder.js.map +1 -1
  26. package/dist/builders/jsx-rule-builder.d.ts +70 -14
  27. package/dist/builders/jsx-rule-builder.d.ts.map +1 -1
  28. package/dist/builders/jsx-rule-builder.js +73 -14
  29. package/dist/builders/jsx-rule-builder.js.map +1 -1
  30. package/dist/builders/module-rule-builder.d.ts +2 -2
  31. package/dist/builders/module-rule-builder.d.ts.map +1 -1
  32. package/dist/builders/module-rule-builder.js +12 -3
  33. package/dist/builders/module-rule-builder.js.map +1 -1
  34. package/dist/builders/scoped-function-rule-builder.d.ts +11 -0
  35. package/dist/builders/scoped-function-rule-builder.d.ts.map +1 -1
  36. package/dist/builders/scoped-function-rule-builder.js +12 -0
  37. package/dist/builders/scoped-function-rule-builder.js.map +1 -1
  38. package/dist/builders/slice-discovery-message.d.ts +36 -0
  39. package/dist/builders/slice-discovery-message.d.ts.map +1 -0
  40. package/dist/builders/slice-discovery-message.js +181 -0
  41. package/dist/builders/slice-discovery-message.js.map +1 -0
  42. package/dist/builders/slice-rule-builder.d.ts +151 -12
  43. package/dist/builders/slice-rule-builder.d.ts.map +1 -1
  44. package/dist/builders/slice-rule-builder.js +242 -35
  45. package/dist/builders/slice-rule-builder.js.map +1 -1
  46. package/dist/builders/type-rule-builder.d.ts +95 -24
  47. package/dist/builders/type-rule-builder.d.ts.map +1 -1
  48. package/dist/builders/type-rule-builder.js +105 -29
  49. package/dist/builders/type-rule-builder.js.map +1 -1
  50. package/dist/{helpers → builders}/within.d.ts +2 -2
  51. package/dist/builders/within.d.ts.map +1 -0
  52. package/dist/{helpers → builders}/within.js +1 -1
  53. package/dist/builders/within.js.map +1 -0
  54. package/dist/cli/commands/baseline.d.ts +3 -2
  55. package/dist/cli/commands/baseline.d.ts.map +1 -1
  56. package/dist/cli/commands/baseline.js +68 -6
  57. package/dist/cli/commands/baseline.js.map +1 -1
  58. package/dist/cli/commands/check.d.ts +7 -2
  59. package/dist/cli/commands/check.d.ts.map +1 -1
  60. package/dist/cli/commands/check.js +241 -45
  61. package/dist/cli/commands/check.js.map +1 -1
  62. package/dist/cli/commands/doctor.d.ts +29 -0
  63. package/dist/cli/commands/doctor.d.ts.map +1 -0
  64. package/dist/cli/commands/doctor.js +224 -0
  65. package/dist/cli/commands/doctor.js.map +1 -0
  66. package/dist/cli/commands/explain.d.ts +2 -1
  67. package/dist/cli/commands/explain.d.ts.map +1 -1
  68. package/dist/cli/commands/explain.js +19 -10
  69. package/dist/cli/commands/explain.js.map +1 -1
  70. package/dist/cli/commands/init.d.ts +9 -3
  71. package/dist/cli/commands/init.d.ts.map +1 -1
  72. package/dist/cli/commands/init.js +162 -137
  73. package/dist/cli/commands/init.js.map +1 -1
  74. package/dist/cli/import-rule-module.d.ts +29 -0
  75. package/dist/cli/import-rule-module.d.ts.map +1 -0
  76. package/dist/cli/import-rule-module.js +60 -0
  77. package/dist/cli/import-rule-module.js.map +1 -0
  78. package/dist/cli/index.d.ts +2 -2
  79. package/dist/cli/index.d.ts.map +1 -1
  80. package/dist/cli/index.js +98 -33
  81. package/dist/cli/index.js.map +1 -1
  82. package/dist/cli/load-rules.d.ts +6 -11
  83. package/dist/cli/load-rules.d.ts.map +1 -1
  84. package/dist/cli/load-rules.js +21 -29
  85. package/dist/cli/load-rules.js.map +1 -1
  86. package/dist/cli/resolve-config.d.ts.map +1 -1
  87. package/dist/cli/resolve-config.js +24 -14
  88. package/dist/cli/resolve-config.js.map +1 -1
  89. package/dist/cli/rule-file-findings.d.ts +178 -0
  90. package/dist/cli/rule-file-findings.d.ts.map +1 -0
  91. package/dist/cli/rule-file-findings.js +293 -0
  92. package/dist/cli/rule-file-findings.js.map +1 -0
  93. package/dist/cli/watch.d.ts +20 -7
  94. package/dist/cli/watch.d.ts.map +1 -1
  95. package/dist/cli/watch.js +39 -14
  96. package/dist/cli/watch.js.map +1 -1
  97. package/dist/conditions/body-analysis-function.d.ts.map +1 -1
  98. package/dist/conditions/body-analysis-function.js +16 -7
  99. package/dist/conditions/body-analysis-function.js.map +1 -1
  100. package/dist/conditions/body-analysis-module.d.ts.map +1 -1
  101. package/dist/conditions/body-analysis-module.js +14 -9
  102. package/dist/conditions/body-analysis-module.js.map +1 -1
  103. package/dist/conditions/body-analysis.d.ts.map +1 -1
  104. package/dist/conditions/body-analysis.js +16 -7
  105. package/dist/conditions/body-analysis.js.map +1 -1
  106. package/dist/conditions/call.d.ts.map +1 -1
  107. package/dist/conditions/call.js +38 -17
  108. package/dist/conditions/call.js.map +1 -1
  109. package/dist/conditions/catch-analysis.d.ts +2 -1
  110. package/dist/conditions/catch-analysis.d.ts.map +1 -1
  111. package/dist/conditions/catch-analysis.js.map +1 -1
  112. package/dist/conditions/cross-layer.d.ts +2 -10
  113. package/dist/conditions/cross-layer.d.ts.map +1 -1
  114. package/dist/conditions/cross-layer.js +227 -23
  115. package/dist/conditions/cross-layer.js.map +1 -1
  116. package/dist/conditions/dependency.d.ts +35 -6
  117. package/dist/conditions/dependency.d.ts.map +1 -1
  118. package/dist/conditions/dependency.js +299 -45
  119. package/dist/conditions/dependency.js.map +1 -1
  120. package/dist/conditions/exports.d.ts.map +1 -1
  121. package/dist/conditions/exports.js +10 -0
  122. package/dist/conditions/exports.js.map +1 -1
  123. package/dist/conditions/function.d.ts.map +1 -1
  124. package/dist/conditions/function.js +19 -5
  125. package/dist/conditions/function.js.map +1 -1
  126. package/dist/conditions/helpers.d.ts +2 -1
  127. package/dist/conditions/helpers.d.ts.map +1 -1
  128. package/dist/conditions/helpers.js +4 -1
  129. package/dist/conditions/helpers.js.map +1 -1
  130. package/dist/conditions/jsx.d.ts.map +1 -1
  131. package/dist/conditions/jsx.js +7 -2
  132. package/dist/conditions/jsx.js.map +1 -1
  133. package/dist/conditions/match-identity.d.ts +43 -0
  134. package/dist/conditions/match-identity.d.ts.map +1 -0
  135. package/dist/conditions/match-identity.js +43 -0
  136. package/dist/conditions/match-identity.js.map +1 -0
  137. package/dist/conditions/members.d.ts.map +1 -1
  138. package/dist/conditions/members.js +17 -4
  139. package/dist/conditions/members.js.map +1 -1
  140. package/dist/conditions/reverse-dependency.d.ts +18 -5
  141. package/dist/conditions/reverse-dependency.d.ts.map +1 -1
  142. package/dist/conditions/reverse-dependency.js +109 -92
  143. package/dist/conditions/reverse-dependency.js.map +1 -1
  144. package/dist/conditions/slice.d.ts +86 -2
  145. package/dist/conditions/slice.d.ts.map +1 -1
  146. package/dist/conditions/slice.js +234 -53
  147. package/dist/conditions/slice.js.map +1 -1
  148. package/dist/conditions/structural.d.ts.map +1 -1
  149. package/dist/conditions/structural.js +16 -4
  150. package/dist/conditions/structural.js.map +1 -1
  151. package/dist/core/check-all.d.ts +19 -0
  152. package/dist/core/check-all.d.ts.map +1 -0
  153. package/dist/core/check-all.js +96 -0
  154. package/dist/core/check-all.js.map +1 -0
  155. package/dist/core/combinators.d.ts +48 -0
  156. package/dist/core/combinators.d.ts.map +1 -0
  157. package/dist/core/combinators.js +56 -0
  158. package/dist/core/combinators.js.map +1 -0
  159. package/dist/core/descendant-cache.d.ts +36 -0
  160. package/dist/core/descendant-cache.d.ts.map +1 -0
  161. package/dist/core/descendant-cache.js +119 -0
  162. package/dist/core/descendant-cache.js.map +1 -0
  163. package/dist/core/diagnose.d.ts +234 -0
  164. package/dist/core/diagnose.d.ts.map +1 -0
  165. package/dist/core/diagnose.js +382 -0
  166. package/dist/core/diagnose.js.map +1 -0
  167. package/dist/core/disk-set.d.ts +48 -0
  168. package/dist/core/disk-set.d.ts.map +1 -0
  169. package/dist/core/disk-set.js +218 -0
  170. package/dist/core/disk-set.js.map +1 -0
  171. package/dist/core/element-cache.d.ts +75 -0
  172. package/dist/core/element-cache.d.ts.map +1 -0
  173. package/dist/core/element-cache.js +32 -0
  174. package/dist/core/element-cache.js.map +1 -0
  175. package/dist/core/empty-project-advice.d.ts +75 -0
  176. package/dist/core/empty-project-advice.d.ts.map +1 -0
  177. package/dist/core/empty-project-advice.js +61 -0
  178. package/dist/core/empty-project-advice.js.map +1 -0
  179. package/dist/core/exclusion-comments.d.ts +54 -0
  180. package/dist/core/exclusion-comments.d.ts.map +1 -0
  181. package/dist/core/exclusion-comments.js +310 -0
  182. package/dist/core/exclusion-comments.js.map +1 -0
  183. package/dist/core/execute-rule.d.ts +150 -0
  184. package/dist/core/execute-rule.d.ts.map +1 -0
  185. package/dist/core/execute-rule.js +580 -0
  186. package/dist/core/execute-rule.js.map +1 -0
  187. package/dist/core/glob-diagnosis.d.ts +78 -0
  188. package/dist/core/glob-diagnosis.d.ts.map +1 -0
  189. package/dist/core/glob-diagnosis.js +134 -0
  190. package/dist/core/glob-diagnosis.js.map +1 -0
  191. package/dist/core/glob-evaluator.d.ts +48 -0
  192. package/dist/core/glob-evaluator.d.ts.map +1 -0
  193. package/dist/core/glob-evaluator.js +89 -0
  194. package/dist/core/glob-evaluator.js.map +1 -0
  195. package/dist/core/import-candidates.d.ts +60 -0
  196. package/dist/core/import-candidates.d.ts.map +1 -0
  197. package/dist/core/import-candidates.js +93 -0
  198. package/dist/core/import-candidates.js.map +1 -0
  199. package/dist/core/import-options.d.ts +55 -2
  200. package/dist/core/import-options.d.ts.map +1 -1
  201. package/dist/core/import-options.js +64 -0
  202. package/dist/core/import-options.js.map +1 -1
  203. package/dist/core/line-index.d.ts +3 -0
  204. package/dist/core/line-index.d.ts.map +1 -0
  205. package/dist/core/line-index.js +229 -0
  206. package/dist/core/line-index.js.map +1 -0
  207. package/dist/core/metric-violation.d.ts +86 -0
  208. package/dist/core/metric-violation.d.ts.map +1 -0
  209. package/dist/core/metric-violation.js +132 -0
  210. package/dist/core/metric-violation.js.map +1 -0
  211. package/dist/core/module-edges.d.ts +361 -0
  212. package/dist/core/module-edges.d.ts.map +1 -0
  213. package/dist/core/module-edges.js +592 -0
  214. package/dist/core/module-edges.js.map +1 -0
  215. package/dist/core/object-literal-functions.d.ts +42 -0
  216. package/dist/core/object-literal-functions.d.ts.map +1 -0
  217. package/dist/core/object-literal-functions.js +75 -0
  218. package/dist/core/object-literal-functions.js.map +1 -0
  219. package/dist/core/orphan-exclusions.d.ts +44 -0
  220. package/dist/core/orphan-exclusions.d.ts.map +1 -0
  221. package/dist/core/orphan-exclusions.js +214 -0
  222. package/dist/core/orphan-exclusions.js.map +1 -0
  223. package/dist/core/pair-condition.d.ts +32 -3
  224. package/dist/core/pair-condition.d.ts.map +1 -1
  225. package/dist/core/path-universe.d.ts +54 -0
  226. package/dist/core/path-universe.d.ts.map +1 -0
  227. package/dist/core/path-universe.js +65 -0
  228. package/dist/core/path-universe.js.map +1 -0
  229. package/dist/core/per-root-compiler-options.d.ts +20 -0
  230. package/dist/core/per-root-compiler-options.d.ts.map +1 -0
  231. package/dist/core/per-root-compiler-options.js +57 -0
  232. package/dist/core/per-root-compiler-options.js.map +1 -0
  233. package/dist/core/project-relative.d.ts +98 -0
  234. package/dist/core/project-relative.d.ts.map +1 -0
  235. package/dist/core/project-relative.js +185 -0
  236. package/dist/core/project-relative.js.map +1 -0
  237. package/dist/core/project.d.ts +7 -1
  238. package/dist/core/project.d.ts.map +1 -1
  239. package/dist/core/project.js +24 -0
  240. package/dist/core/project.js.map +1 -1
  241. package/dist/core/rule-builder.d.ts +282 -0
  242. package/dist/core/rule-builder.d.ts.map +1 -0
  243. package/dist/core/rule-builder.js +445 -0
  244. package/dist/core/rule-builder.js.map +1 -0
  245. package/dist/core/rule-declaration.d.ts +32 -0
  246. package/dist/core/rule-declaration.d.ts.map +1 -0
  247. package/dist/core/rule-declaration.js +126 -0
  248. package/dist/core/rule-declaration.js.map +1 -0
  249. package/dist/core/terminal-builder.d.ts +625 -0
  250. package/dist/core/terminal-builder.d.ts.map +1 -0
  251. package/dist/core/terminal-builder.js +787 -0
  252. package/dist/core/terminal-builder.js.map +1 -0
  253. package/dist/core/terminal-execution.d.ts +23 -0
  254. package/dist/core/terminal-execution.d.ts.map +1 -0
  255. package/dist/core/terminal-execution.js +71 -0
  256. package/dist/core/terminal-execution.js.map +1 -0
  257. package/dist/core/vacuity-diagnosis.d.ts +103 -0
  258. package/dist/core/vacuity-diagnosis.d.ts.map +1 -0
  259. package/dist/core/vacuity-diagnosis.js +415 -0
  260. package/dist/core/vacuity-diagnosis.js.map +1 -0
  261. package/dist/core/violation.d.ts +16 -11
  262. package/dist/core/violation.d.ts.map +1 -1
  263. package/dist/core/violation.js +33 -13
  264. package/dist/core/violation.js.map +1 -1
  265. package/dist/graphql/index.js +1 -1
  266. package/dist/graphql/index.js.map +1 -1
  267. package/dist/graphql/resolver-rule-builder.d.ts +98 -23
  268. package/dist/graphql/resolver-rule-builder.d.ts.map +1 -1
  269. package/dist/graphql/resolver-rule-builder.js +151 -21
  270. package/dist/graphql/resolver-rule-builder.js.map +1 -1
  271. package/dist/graphql/schema-loader.d.ts +21 -0
  272. package/dist/graphql/schema-loader.d.ts.map +1 -1
  273. package/dist/graphql/schema-loader.js +81 -12
  274. package/dist/graphql/schema-loader.js.map +1 -1
  275. package/dist/graphql/schema-rule-builder.d.ts +57 -20
  276. package/dist/graphql/schema-rule-builder.d.ts.map +1 -1
  277. package/dist/graphql/schema-rule-builder.js +101 -25
  278. package/dist/graphql/schema-rule-builder.js.map +1 -1
  279. package/dist/helpers/baseline-diagnostics.d.ts +45 -0
  280. package/dist/helpers/baseline-diagnostics.d.ts.map +1 -0
  281. package/dist/helpers/baseline-diagnostics.js +168 -0
  282. package/dist/helpers/baseline-diagnostics.js.map +1 -0
  283. package/dist/helpers/baseline-generator.d.ts +19 -0
  284. package/dist/helpers/baseline-generator.d.ts.map +1 -0
  285. package/dist/helpers/baseline-generator.js +18 -0
  286. package/dist/helpers/baseline-generator.js.map +1 -0
  287. package/dist/helpers/baseline.d.ts +336 -0
  288. package/dist/helpers/baseline.d.ts.map +1 -0
  289. package/dist/helpers/baseline.js +664 -0
  290. package/dist/helpers/baseline.js.map +1 -0
  291. package/dist/helpers/body-traversal.d.ts +27 -2
  292. package/dist/helpers/body-traversal.d.ts.map +1 -1
  293. package/dist/helpers/body-traversal.js +122 -16
  294. package/dist/helpers/body-traversal.js.map +1 -1
  295. package/dist/helpers/callback-extractor.d.ts.map +1 -1
  296. package/dist/helpers/callback-extractor.js +48 -47
  297. package/dist/helpers/callback-extractor.js.map +1 -1
  298. package/dist/helpers/complexity.d.ts +13 -5
  299. package/dist/helpers/complexity.d.ts.map +1 -1
  300. package/dist/helpers/complexity.js +15 -6
  301. package/dist/helpers/complexity.js.map +1 -1
  302. package/dist/helpers/diff-aware.d.ts +44 -0
  303. package/dist/helpers/diff-aware.d.ts.map +1 -0
  304. package/dist/helpers/diff-aware.js +84 -0
  305. package/dist/helpers/diff-aware.js.map +1 -0
  306. package/dist/helpers/matchers.d.ts +68 -7
  307. package/dist/helpers/matchers.d.ts.map +1 -1
  308. package/dist/helpers/matchers.js +114 -20
  309. package/dist/helpers/matchers.js.map +1 -1
  310. package/dist/helpers/slice-graph.d.ts +100 -8
  311. package/dist/helpers/slice-graph.d.ts.map +1 -1
  312. package/dist/helpers/slice-graph.js +126 -34
  313. package/dist/helpers/slice-graph.js.map +1 -1
  314. package/dist/helpers/tarjan.d.ts +0 -14
  315. package/dist/helpers/tarjan.d.ts.map +1 -1
  316. package/dist/helpers/tarjan.js +29 -16
  317. package/dist/helpers/tarjan.js.map +1 -1
  318. package/dist/index.d.ts +56 -17
  319. package/dist/index.d.ts.map +1 -1
  320. package/dist/index.js +57 -13
  321. package/dist/index.js.map +1 -1
  322. package/dist/models/arch-call.d.ts +3 -2
  323. package/dist/models/arch-call.d.ts.map +1 -1
  324. package/dist/models/arch-call.js.map +1 -1
  325. package/dist/models/arch-function.d.ts +28 -6
  326. package/dist/models/arch-function.d.ts.map +1 -1
  327. package/dist/models/arch-function.js +106 -3
  328. package/dist/models/arch-function.js.map +1 -1
  329. package/dist/models/arch-jsx-element.js +2 -2
  330. package/dist/models/arch-jsx-element.js.map +1 -1
  331. package/dist/models/slice.d.ts +33 -9
  332. package/dist/models/slice.d.ts.map +1 -1
  333. package/dist/models/slice.js +129 -19
  334. package/dist/models/slice.js.map +1 -1
  335. package/dist/predicates/call.d.ts.map +1 -1
  336. package/dist/predicates/call.js +5 -0
  337. package/dist/predicates/call.js.map +1 -1
  338. package/dist/predicates/identity.d.ts +21 -0
  339. package/dist/predicates/identity.d.ts.map +1 -1
  340. package/dist/predicates/identity.js +75 -3
  341. package/dist/predicates/identity.js.map +1 -1
  342. package/dist/predicates/index.d.ts +1 -1
  343. package/dist/predicates/index.d.ts.map +1 -1
  344. package/dist/predicates/index.js +1 -1
  345. package/dist/predicates/index.js.map +1 -1
  346. package/dist/predicates/metrics.d.ts +4 -2
  347. package/dist/predicates/metrics.d.ts.map +1 -1
  348. package/dist/predicates/metrics.js +4 -2
  349. package/dist/predicates/metrics.js.map +1 -1
  350. package/dist/predicates/module.d.ts +4 -12
  351. package/dist/predicates/module.d.ts.map +1 -1
  352. package/dist/predicates/module.js +57 -37
  353. package/dist/predicates/module.js.map +1 -1
  354. package/dist/presets/agent-guardrails.d.ts +22 -15
  355. package/dist/presets/agent-guardrails.d.ts.map +1 -1
  356. package/dist/presets/agent-guardrails.js +124 -19
  357. package/dist/presets/agent-guardrails.js.map +1 -1
  358. package/dist/presets/boundaries.d.ts +45 -2
  359. package/dist/presets/boundaries.d.ts.map +1 -1
  360. package/dist/presets/boundaries.js +132 -23
  361. package/dist/presets/boundaries.js.map +1 -1
  362. package/dist/presets/data-layer.d.ts +22 -2
  363. package/dist/presets/data-layer.d.ts.map +1 -1
  364. package/dist/presets/data-layer.js +58 -16
  365. package/dist/presets/data-layer.js.map +1 -1
  366. package/dist/presets/index.d.ts +7 -5
  367. package/dist/presets/index.d.ts.map +1 -1
  368. package/dist/presets/index.js +9 -3
  369. package/dist/presets/index.js.map +1 -1
  370. package/dist/presets/layered.d.ts +46 -2
  371. package/dist/presets/layered.d.ts.map +1 -1
  372. package/dist/presets/layered.js +66 -29
  373. package/dist/presets/layered.js.map +1 -1
  374. package/dist/presets/recommended.d.ts +80 -9
  375. package/dist/presets/recommended.d.ts.map +1 -1
  376. package/dist/presets/recommended.js +25 -23
  377. package/dist/presets/recommended.js.map +1 -1
  378. package/dist/presets/shared.d.ts +270 -2
  379. package/dist/presets/shared.d.ts.map +1 -1
  380. package/dist/presets/shared.js +338 -4
  381. package/dist/presets/shared.js.map +1 -1
  382. package/dist/rules/code-quality.d.ts.map +1 -1
  383. package/dist/rules/code-quality.js +15 -6
  384. package/dist/rules/code-quality.js.map +1 -1
  385. package/dist/rules/hygiene.d.ts +1 -1
  386. package/dist/rules/hygiene.js +1 -1
  387. package/dist/rules/metrics-function.d.ts +2 -1
  388. package/dist/rules/metrics-function.d.ts.map +1 -1
  389. package/dist/rules/metrics-function.js +33 -6
  390. package/dist/rules/metrics-function.js.map +1 -1
  391. package/dist/rules/metrics.d.ts +2 -1
  392. package/dist/rules/metrics.d.ts.map +1 -1
  393. package/dist/rules/metrics.js +39 -9
  394. package/dist/rules/metrics.js.map +1 -1
  395. package/dist/smells/duplicate-bodies.d.ts +58 -5
  396. package/dist/smells/duplicate-bodies.d.ts.map +1 -1
  397. package/dist/smells/duplicate-bodies.js +137 -56
  398. package/dist/smells/duplicate-bodies.js.map +1 -1
  399. package/dist/smells/fingerprint.d.ts +8 -1
  400. package/dist/smells/fingerprint.d.ts.map +1 -1
  401. package/dist/smells/fingerprint.js +21 -3
  402. package/dist/smells/fingerprint.js.map +1 -1
  403. package/dist/smells/inconsistent-siblings.d.ts +128 -7
  404. package/dist/smells/inconsistent-siblings.d.ts.map +1 -1
  405. package/dist/smells/inconsistent-siblings.js +288 -86
  406. package/dist/smells/inconsistent-siblings.js.map +1 -1
  407. package/dist/smells/sibling-files.d.ts +47 -0
  408. package/dist/smells/sibling-files.d.ts.map +1 -0
  409. package/dist/smells/sibling-files.js +104 -0
  410. package/dist/smells/sibling-files.js.map +1 -0
  411. package/dist/smells/similar-pairs.d.ts +27 -0
  412. package/dist/smells/similar-pairs.d.ts.map +1 -0
  413. package/dist/smells/similar-pairs.js +52 -0
  414. package/dist/smells/similar-pairs.js.map +1 -0
  415. package/dist/smells/smell-builder.d.ts +57 -12
  416. package/dist/smells/smell-builder.d.ts.map +1 -1
  417. package/dist/smells/smell-builder.js +111 -14
  418. package/dist/smells/smell-builder.js.map +1 -1
  419. package/dist/tsconfig/index.d.ts +19 -0
  420. package/dist/tsconfig/index.d.ts.map +1 -0
  421. package/dist/tsconfig/index.js +20 -0
  422. package/dist/tsconfig/index.js.map +1 -0
  423. package/dist/tsconfig/tsconfig-builder.d.ts +42 -9
  424. package/dist/tsconfig/tsconfig-builder.d.ts.map +1 -1
  425. package/dist/tsconfig/tsconfig-builder.js +64 -16
  426. package/dist/tsconfig/tsconfig-builder.js.map +1 -1
  427. package/package.json +3 -2
  428. package/dist/core/module-dependencies.d.ts +0 -28
  429. package/dist/core/module-dependencies.d.ts.map +0 -1
  430. package/dist/core/module-dependencies.js +0 -35
  431. package/dist/core/module-dependencies.js.map +0 -1
  432. package/dist/helpers/within.d.ts.map +0 -1
  433. package/dist/helpers/within.js.map +0 -1
@@ -0,0 +1,98 @@
1
+ /**
2
+ * Make a project-relative glob work, instead of failing loudly — plan 0067 C.
3
+ *
4
+ * Globs are matched against **absolute** file paths, so `'src/domain/**'`
5
+ * matches nothing. That is the single commonest real mistake with this library:
6
+ * it is the shape 0.18.1 was released for, and as of **0.34.0** it is a hard
7
+ * build failure telling the author to prefix `'**\/'`.
8
+ *
9
+ * Prefixing works but says something different. `'**\/src/domain/**'` matches a
10
+ * `src/domain` **anywhere** — including `vendor/thing/src/domain`, and
11
+ * including a second `src/` nested inside a monorepo package. What the author
12
+ * meant was the one at the project root. 0067 called normalization "the root
13
+ * cause" fix for that reason, and 0069 sequenced it directly after R3b.
14
+ *
15
+ * So an unanchored glob is matched against the path **relative to the
16
+ * tsconfig's directory**, in addition to the absolute path. Both spellings keep
17
+ * working and they mean different things:
18
+ *
19
+ * | glob | matches |
20
+ * | --------------------- | ------------------------------------------- |
21
+ * | `'src/domain/**'` | that folder **at the project root** |
22
+ * | `'**\/src/domain/**'` | a `src/domain` **anywhere** in the project |
23
+ * | `'/abs/src/domain/**'`| exactly that absolute path |
24
+ *
25
+ * ## Why the root comes from the element, not from the builder
26
+ *
27
+ * A predicate is constructed two ways that must not diverge:
28
+ * `.that().resideInFolder(g)`, where the builder knows the project, and
29
+ * `.that().satisfy(resideInFolder(g))`, where nothing does.
30
+ * `tests/core/glob-declaration.test.ts` exists to assert the two spellings
31
+ * agree, and threading the root through only the first would break that.
32
+ *
33
+ * Every `Located` element can reach its own `SourceFile`, and ts-morph carries
34
+ * the tsconfig it was loaded from on the project's compiler options. So the
35
+ * root is derived where the match happens, from the element itself, and both
36
+ * spellings get it for free.
37
+ *
38
+ * `configFilePath` is `undefined` for a project built in memory or without a
39
+ * tsconfig. That is a genuine "no root known" and normalization is skipped —
40
+ * the glob keeps its absolute-only meaning rather than being matched against
41
+ * something invented.
42
+ */
43
+ import type { Project as TsMorphProject, SourceFile } from 'ts-morph';
44
+ /**
45
+ * Whether a glob can already match an absolute path, so the `**\/` hint would
46
+ * be a no-op (or worse). Covers POSIX-absolute and Windows drive-absolute
47
+ * globs as well as an explicit globstar.
48
+ *
49
+ * Lives here rather than in `glob-diagnosis.ts` (which re-exports it) because
50
+ * `isProjectRelative` below is defined as its negation, and this module sits
51
+ * under the one that diagnoses.
52
+ */
53
+ export declare function isAnchored(glob: string): boolean;
54
+ /**
55
+ * Does this glob name a location relative to the project root?
56
+ *
57
+ * Only an **unanchored, relative** glob is normalized. `'**\/x'` is explicitly
58
+ * "anywhere" and must keep meaning that; `'/abs/x'` is already absolute. So
59
+ * this is the same population `syntacticFault` calls `unanchored`, which is
60
+ * what makes the two consistent: a glob stops being reported dead for being
61
+ * unanchored exactly when it starts working.
62
+ */
63
+ export declare function isProjectRelative(glob: string): boolean;
64
+ /**
65
+ * Record the directories a project was loaded from.
66
+ *
67
+ * Load-bearing for `workspace()`, which has several. For a single-tsconfig
68
+ * `project()` it is **defence in depth and not independently observable**:
69
+ * removing that call leaves every test green, because `rootOf` then falls
70
+ * through to ts-morph's `configFilePath`, which agrees. Recorded rather than
71
+ * papered over — a sabotage row that survives because the behaviour is
72
+ * genuinely redundant is a different thing from a missing guard, and the next
73
+ * person to see it green should not go hunting for a test to write.
74
+ */
75
+ export declare function registerProjectRoots(tsMorphProject: TsMorphProject, tsConfigPaths: readonly string[]): void;
76
+ /**
77
+ * The project root implied by a tsconfig path.
78
+ *
79
+ * Preferred wherever the caller holds the `ArchProject`, because it is the path
80
+ * the user named rather than what ts-morph recorded — `getCompilerOptions()
81
+ * .configFilePath` is `undefined` for an in-memory project even when the
82
+ * `ArchProject` carries a perfectly good path, and normalization then silently
83
+ * did not happen. The predicates cannot use this (they see only an element, by
84
+ * design, so the builder and `.satisfy()` spellings cannot diverge); the slice
85
+ * resolver can.
86
+ */
87
+ export declare function rootFromTsConfigPath(tsConfigPath: string): string | undefined;
88
+ export declare function rootOf(sourceFile: SourceFile, fallbackTsConfigPath?: string): string | undefined;
89
+ /**
90
+ * `absolutePath` relative to the project root, or `undefined` when it sits
91
+ * outside the root or the root is unknown.
92
+ *
93
+ * Never `path.relative`, which emits `../../..` for a path above the root and
94
+ * so encodes the root's depth — machine-dependent, and the mistake
95
+ * `path-universe.ts` documents avoiding for the same reason.
96
+ */
97
+ export declare function relativeToRoot(sourceFile: SourceFile, absolutePath: string, fallbackTsConfigPath?: string): string | undefined;
98
+ //# sourceMappingURL=project-relative.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-relative.d.ts","sourceRoot":"","sources":["../../src/core/project-relative.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyCG;AACH,OAAO,KAAK,EAAE,OAAO,IAAI,cAAc,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AAErE;;;;;;;;GAQG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEhD;AAED;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAgCvD;AA+BD;;;;;;;;;;GAUG;AACH,wBAAgB,oBAAoB,CAClC,cAAc,EAAE,cAAc,EAC9B,aAAa,EAAE,SAAS,MAAM,EAAE,GAC/B,IAAI,CAKN;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,oBAAoB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAY7E;AAOD,wBAAgB,MAAM,CAAC,UAAU,EAAE,UAAU,EAAE,oBAAoB,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAqChG;AAED;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAC5B,UAAU,EAAE,UAAU,EACtB,YAAY,EAAE,MAAM,EACpB,oBAAoB,CAAC,EAAE,MAAM,GAC5B,MAAM,GAAG,SAAS,CAKpB"}
@@ -0,0 +1,185 @@
1
+ /**
2
+ * Whether a glob can already match an absolute path, so the `**\/` hint would
3
+ * be a no-op (or worse). Covers POSIX-absolute and Windows drive-absolute
4
+ * globs as well as an explicit globstar.
5
+ *
6
+ * Lives here rather than in `glob-diagnosis.ts` (which re-exports it) because
7
+ * `isProjectRelative` below is defined as its negation, and this module sits
8
+ * under the one that diagnoses.
9
+ */
10
+ export function isAnchored(glob) {
11
+ return glob.startsWith('**/') || glob.startsWith('/') || /^[A-Za-z]:\//.test(glob);
12
+ }
13
+ /**
14
+ * Does this glob name a location relative to the project root?
15
+ *
16
+ * Only an **unanchored, relative** glob is normalized. `'**\/x'` is explicitly
17
+ * "anywhere" and must keep meaning that; `'/abs/x'` is already absolute. So
18
+ * this is the same population `syntacticFault` calls `unanchored`, which is
19
+ * what makes the two consistent: a glob stops being reported dead for being
20
+ * unanchored exactly when it starts working.
21
+ */
22
+ export function isProjectRelative(glob) {
23
+ // A `./` segment is excluded, and that exclusion is load-bearing rather than
24
+ // fussy. `syntacticFault` reports `dot-segment` for a `./` anywhere in a
25
+ // glob, so normalizing one would make the rule MATCH at runtime while the
26
+ // gate still reported it dead — two derivations disagreeing about the same
27
+ // glob, which is the failure this project spends most of its guards on.
28
+ // Measured before this line existed: `'./src/domain/**'` selected 3 subjects
29
+ // and produced a dead-selector finding in the same run.
30
+ //
31
+ // `./` is a mistake in both worlds — it never occurs in an absolute path and
32
+ // it says nothing extra in a relative one — so the honest fix is to leave it
33
+ // failing, with advice that says to remove it.
34
+ // `..` is not relative-to-the-root in any usable sense: containment returns
35
+ // `undefined` for anything above the root, deliberately, so a `../`
36
+ // glob would normalize to nothing and be reported dead with three false
37
+ // causes. Excluded alongside `./` — both are mistakes in both readings.
38
+ if (/(?:^|\/)\.\.?\//.test(glob))
39
+ return false;
40
+ // Derived from `isAnchored`, not restated. They were two lists and disagreed:
41
+ // `isAnchored` recognises a drive-absolute `C:/x/**` and this did not, so a
42
+ // Windows path was declared project-relative. Benign today — it still matches
43
+ // the absolute path — but `base` is a function of this at three sites now,
44
+ // and `base` affects the verdict.
45
+ // `isAnchored` covers `/x`, `**/x` and a drive-absolute `C:/x` — the last of
46
+ // which this used to miss, declaring a Windows path project-relative.
47
+ if (isAnchored(glob))
48
+ return false;
49
+ // `*/x/**` is deliberately NOT normalized, even though it is unanchored.
50
+ // Normalizing it would make it match, which sounds like an improvement until
51
+ // you notice it is the LAST reachable `unanchored` fault for a path glob —
52
+ // the anchor advice, and the whole `ANCHOR_ADVICE` grouping in the slice
53
+ // discovery message, would become unreachable code. Left failing, with a
54
+ // remedy that works: `'**/x/**'`.
55
+ return !glob.startsWith('*/');
56
+ }
57
+ /**
58
+ * The directory holding the tsconfig this element's project was loaded from.
59
+ *
60
+ * Forward slashes, no trailing separator — the same normalization
61
+ * `path-universe.ts` applies, so the two cannot disagree about what the root
62
+ * is. `undefined` when the project has no tsconfig.
63
+ */
64
+ /**
65
+ * Every directory a project was loaded from, by ts-morph `Project`.
66
+ *
67
+ * A **workspace has no single root.** `workspace([a, b])` sets
68
+ * `ArchProject.tsConfigPath` to the alphabetically first config, so resolving
69
+ * "the project root" from it silently meant *that one package*: measured on a
70
+ * two-package workspace, `'src/api/**'` matched `packages/alpha` and not
71
+ * `packages/beta`, and adding a package named `aaa` would have changed which
72
+ * one it meant. That is the machine-dependent shape bug 0011 already cost this
73
+ * project once — a rule scoped by a name nobody chose deliberately.
74
+ *
75
+ * So a file resolves against **the root that contains it**, and every root is
76
+ * kept. For a single-tsconfig project there is one, and the behaviour is
77
+ * exactly what it was.
78
+ *
79
+ * A `WeakMap` on the ts-morph project, because a predicate sees only an
80
+ * element: `sourceFile.getProject()` is the one handle both the predicate and
81
+ * the slice resolver can reach, and ts-morph itself records only the primary
82
+ * config.
83
+ */
84
+ const rootsByProject = new WeakMap();
85
+ /**
86
+ * Record the directories a project was loaded from.
87
+ *
88
+ * Load-bearing for `workspace()`, which has several. For a single-tsconfig
89
+ * `project()` it is **defence in depth and not independently observable**:
90
+ * removing that call leaves every test green, because `rootOf` then falls
91
+ * through to ts-morph's `configFilePath`, which agrees. Recorded rather than
92
+ * papered over — a sabotage row that survives because the behaviour is
93
+ * genuinely redundant is a different thing from a missing guard, and the next
94
+ * person to see it green should not go hunting for a test to write.
95
+ */
96
+ export function registerProjectRoots(tsMorphProject, tsConfigPaths) {
97
+ const roots = tsConfigPaths
98
+ .map((configPath) => rootFromTsConfigPath(configPath))
99
+ .filter((root) => root !== undefined);
100
+ if (roots.length > 0)
101
+ rootsByProject.set(tsMorphProject, roots);
102
+ }
103
+ /**
104
+ * The project root implied by a tsconfig path.
105
+ *
106
+ * Preferred wherever the caller holds the `ArchProject`, because it is the path
107
+ * the user named rather than what ts-morph recorded — `getCompilerOptions()
108
+ * .configFilePath` is `undefined` for an in-memory project even when the
109
+ * `ArchProject` carries a perfectly good path, and normalization then silently
110
+ * did not happen. The predicates cannot use this (they see only an element, by
111
+ * design, so the builder and `.satisfy()` spellings cannot diverge); the slice
112
+ * resolver can.
113
+ */
114
+ export function rootFromTsConfigPath(tsConfigPath) {
115
+ if (tsConfigPath === '')
116
+ return undefined;
117
+ const normalized = tsConfigPath.replaceAll('\\', '/');
118
+ const lastSlash = normalized.lastIndexOf('/');
119
+ if (lastSlash === -1)
120
+ return undefined;
121
+ // A tsconfig AT the filesystem root gives `'/'`, not `''`. Returning `''`
122
+ // overloaded one value with two meanings — "no root known" and "the root is
123
+ // `/`" — and the three copies of this derivation disagreed about which:
124
+ // measured on `/tsconfig.json`, the rule discovered its file and `diagnose()`
125
+ // called the same glob dead, in one run. Reachable in a container that mounts
126
+ // the repository at `/`.
127
+ return lastSlash === 0 ? '/' : normalized.slice(0, lastSlash);
128
+ }
129
+ /** The prefix a path under `root` starts with. `'/'` is its own prefix. */
130
+ function prefixOf(root) {
131
+ return root === '/' ? '/' : `${root}/`;
132
+ }
133
+ export function rootOf(sourceFile, fallbackTsConfigPath) {
134
+ const filePath = sourceFile.getFilePath().replaceAll('\\', '/');
135
+ // The registered root that CONTAINS this file, longest first — a nested
136
+ // package's tsconfig must win over the repository's, or every file in it
137
+ // resolves against the outer root and the inner one never applies.
138
+ const registered = rootsByProject.get(sourceFile.getProject());
139
+ if (registered !== undefined) {
140
+ // Roots WERE registered for this project (a real `workspace()`) — fail
141
+ // CLOSED here (ADR-009) rather than falling through to the generic fallback
142
+ // below. That fallback resolves to the tie-break-winner's own tsconfig for a
143
+ // `workspace()`-built project, which is a specific, plausible-looking, WRONG
144
+ // answer for a file outside every registered package (a shared root-level
145
+ // `.d.ts`, a broad `include`/`references` reaching outside a package's own
146
+ // directory) — exactly the silent mis-scoping this module exists to
147
+ // eliminate, just relocated to the edges. `fallbackTsConfigPath` doesn't
148
+ // rescue it either: for a `workspace()` caller it is typically the primary
149
+ // config's own path (see `resolveByDefinition`'s `project.tsConfigPath`), so
150
+ // honoring it here would reintroduce the same bug through the back door.
151
+ //
152
+ // eess's own fix (plan 0148 Phase 1). The wholesale engine copy of plan 0165
153
+ // reverted it to `if (best !== undefined) return best`, which reads as a
154
+ // harmless guard and is in fact the fall-through. Pinned by
155
+ // `tests/core/project-relative.test.ts` · `a file outside every registered
156
+ // root of a real workspace() is unresolved, not silently the tie-break
157
+ // winner`.
158
+ const containing = registered
159
+ .filter((root) => filePath.startsWith(prefixOf(root)))
160
+ .sort((a, b) => b.length - a.length);
161
+ return containing[0];
162
+ }
163
+ // A project built without going through `project()`/`workspace()` — a test
164
+ // double, or an in-memory project, where ts-morph records no config path.
165
+ if (fallbackTsConfigPath !== undefined)
166
+ return rootFromTsConfigPath(fallbackTsConfigPath);
167
+ const configFilePath = sourceFile.getProject().getCompilerOptions().configFilePath;
168
+ return typeof configFilePath === 'string' ? rootFromTsConfigPath(configFilePath) : undefined;
169
+ }
170
+ /**
171
+ * `absolutePath` relative to the project root, or `undefined` when it sits
172
+ * outside the root or the root is unknown.
173
+ *
174
+ * Never `path.relative`, which emits `../../..` for a path above the root and
175
+ * so encodes the root's depth — machine-dependent, and the mistake
176
+ * `path-universe.ts` documents avoiding for the same reason.
177
+ */
178
+ export function relativeToRoot(sourceFile, absolutePath, fallbackTsConfigPath) {
179
+ const root = rootOf(sourceFile, fallbackTsConfigPath);
180
+ if (root === undefined)
181
+ return undefined;
182
+ const prefix = prefixOf(root);
183
+ return absolutePath.startsWith(prefix) ? absolutePath.slice(prefix.length) : undefined;
184
+ }
185
+ //# sourceMappingURL=project-relative.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-relative.js","sourceRoot":"","sources":["../../src/core/project-relative.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { Project, type SourceFile } from 'ts-morph';
1
+ import { Project, type SourceFile, type CompilerOptions } from 'ts-morph';
2
2
  /**
3
3
  * A loaded TypeScript project. Returned by `project()`.
4
4
  *
@@ -10,6 +10,12 @@ export interface ArchProject {
10
10
  readonly tsConfigPath: string;
11
11
  /** Returns all source files included by the tsconfig. */
12
12
  getSourceFiles(): SourceFile[];
13
+ /**
14
+ * Resolved TypeScript compiler options (after `extends`), as `tsc` computes
15
+ * them. Optional so bare `ArchProject` literals (test doubles) stay valid;
16
+ * `project()` and `workspace()` always implement it. Used by `tsconfig()`.
17
+ */
18
+ getCompilerOptions?(): CompilerOptions;
13
19
  /**
14
20
  * The underlying ts-morph Project.
15
21
  * @internal Used by entry points — not part of the public API.
@@ -1 +1 @@
1
- {"version":3,"file":"project.d.ts","sourceRoot":"","sources":["../../src/core/project.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,UAAU,CAAA;AAInD;;;;;GAKG;AACH,MAAM,WAAW,WAAW;IAC1B,6EAA6E;IAC7E,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAA;IAE7B,yDAAyD;IACzD,cAAc,IAAI,UAAU,EAAE,CAAA;IAE9B;;;OAGG;IACH,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAA;CAC3B;AAID;;;;;;;;;GASG;AACH,wBAAgB,OAAO,CAAC,YAAY,EAAE,MAAM,GAAG,WAAW,CA6BzD;AAMD;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,wBAAgB,SAAS,CAAC,aAAa,EAAE,MAAM,EAAE,GAAG,WAAW,CAuD9D;AAED;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,IAAI,IAAI,CAGxC"}
1
+ {"version":3,"file":"project.d.ts","sourceRoot":"","sources":["../../src/core/project.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,KAAK,UAAU,EAAE,KAAK,eAAe,EAAE,MAAM,UAAU,CAAA;AAOzE;;;;;GAKG;AACH,MAAM,WAAW,WAAW;IAC1B,6EAA6E;IAC7E,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAA;IAE7B,yDAAyD;IACzD,cAAc,IAAI,UAAU,EAAE,CAAA;IAE9B;;;;OAIG;IACH,kBAAkB,CAAC,IAAI,eAAe,CAAA;IAEtC;;;OAGG;IACH,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAA;CAC3B;AAID;;;;;;;;;GASG;AACH,wBAAgB,OAAO,CAAC,YAAY,EAAE,MAAM,GAAG,WAAW,CAkCzD;AAMD;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,wBAAgB,SAAS,CAAC,aAAa,EAAE,MAAM,EAAE,GAAG,WAAW,CAqE9D;AAED;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,IAAI,IAAI,CAQxC"}
@@ -1,6 +1,9 @@
1
1
  import { Project } from 'ts-morph';
2
2
  import path from 'node:path';
3
+ import { clearRegisteredCaches } from '@nielspeter/eess';
3
4
  import fs from 'node:fs';
5
+ import { registerProjectRoots } from './project-relative.js';
6
+ import { registerRootCompilerOptions } from './per-root-compiler-options.js';
4
7
  const cache = new Map();
5
8
  /**
6
9
  * Load a TypeScript project from a tsconfig.json path.
@@ -25,12 +28,16 @@ export function project(tsConfigPath) {
25
28
  const tsMorphProject = new Project({
26
29
  tsConfigFilePath: resolved,
27
30
  });
31
+ registerProjectRoots(tsMorphProject, [resolved]);
28
32
  const archProject = {
29
33
  tsConfigPath: resolved,
30
34
  _project: tsMorphProject,
31
35
  getSourceFiles() {
32
36
  return tsMorphProject.getSourceFiles();
33
37
  },
38
+ getCompilerOptions() {
39
+ return tsMorphProject.getCompilerOptions();
40
+ },
34
41
  };
35
42
  cache.set(resolved, archProject);
36
43
  return archProject;
@@ -102,12 +109,24 @@ export function workspace(tsConfigPaths) {
102
109
  if (configPath)
103
110
  tsMorphProject.addSourceFilesFromTsConfig(configPath);
104
111
  }
112
+ // EVERY config, not just the primary: a relative glob resolves against the
113
+ // package that contains the file, so `'src/api/**'` means each package's
114
+ // `src/api` rather than the alphabetically-first one's (bug 0035).
115
+ registerProjectRoots(tsMorphProject, resolvedPaths);
116
+ // Same argument, one field over: compiler options are per package too, and
117
+ // `addSourceFilesFromTsConfig` above adds files WITHOUT adding options — so
118
+ // `getCompilerOptions()` answers for the primary config whatever package a file is in.
119
+ // Bug 0058, measured wrong in both directions before this line existed.
120
+ registerRootCompilerOptions(tsMorphProject, resolvedPaths);
105
121
  const archProject = {
106
122
  tsConfigPath: primaryConfig,
107
123
  _project: tsMorphProject,
108
124
  getSourceFiles() {
109
125
  return tsMorphProject.getSourceFiles();
110
126
  },
127
+ getCompilerOptions() {
128
+ return tsMorphProject.getCompilerOptions();
129
+ },
111
130
  };
112
131
  workspaceCache.set(cacheKey, archProject);
113
132
  return archProject;
@@ -123,5 +142,10 @@ export function workspace(tsConfigPaths) {
123
142
  export function resetProjectCache() {
124
143
  cache.clear();
125
144
  workspaceCache.clear();
145
+ // Plan 0075/0076: the memoized element collections and module edges are keyed
146
+ // on objects this function replaces, so `project()` callers are covered by
147
+ // identity alone. A consumer holding their OWN `ArchProject` is not, and this
148
+ // is their documented way to invalidate after mutating the ts-morph project.
149
+ clearRegisteredCaches();
126
150
  }
127
151
  //# sourceMappingURL=project.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"project.js","sourceRoot":"","sources":["../../src/core/project.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"project.js","sourceRoot":"","sources":["../../src/core/project.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAyC,MAAM,UAAU,CAAA;AACzE,OAAO,IAAI,MAAM,WAAW,CAAA;AAC5B,OAAO,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAA;AACxD,OAAO,EAAE,MAAM,SAAS,CAAA;AACxB,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAA;AAC5D,OAAO,EAAE,2BAA2B,EAAE,MAAM,gCAAgC,CAAA;AA6B5E,MAAM,KAAK,GAAG,IAAI,GAAG,EAAuB,CAAA;AAE5C;;;;;;;;;GASG;AACH,MAAM,UAAU,OAAO,CAAC,YAAoB;IAC1C,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,CAAA;IAE3C,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;IAClC,IAAI,MAAM,EAAE,CAAC;QACX,OAAO,MAAM,CAAA;IACf,CAAC;IAED,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CACb,uBAAuB,QAAQ,IAAI;YACjC,iHAAiH,CACpH,CAAA;IACH,CAAC;IAED,MAAM,cAAc,GAAG,IAAI,OAAO,CAAC;QACjC,gBAAgB,EAAE,QAAQ;KAC3B,CAAC,CAAA;IAEF,oBAAoB,CAAC,cAAc,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAA;IAEhD,MAAM,WAAW,GAAgB;QAC/B,YAAY,EAAE,QAAQ;QACtB,QAAQ,EAAE,cAAc;QACxB,cAAc;YACZ,OAAO,cAAc,CAAC,cAAc,EAAE,CAAA;QACxC,CAAC;QACD,kBAAkB;YAChB,OAAO,cAAc,CAAC,kBAAkB,EAAE,CAAA;QAC5C,CAAC;KACF,CAAA;IAED,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAA;IAChC,OAAO,WAAW,CAAA;AACpB,CAAC;AAED,mEAAmE;AAEnE,MAAM,cAAc,GAAG,IAAI,GAAG,EAAuB,CAAA;AAErD;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,MAAM,UAAU,SAAS,CAAC,aAAuB;IAC/C,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC/B,MAAM,IAAI,KAAK,CACb,oDAAoD;YAClD,iFAAiF,CACpF,CAAA;IACH,CAAC;IAED,qEAAqE;IACrE,0EAA0E;IAC1E,iFAAiF;IACjF,mFAAmF;IACnF,MAAM,aAAa,GAAG,aAAa;SAChC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;SAC3B,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IAE/C,MAAM,QAAQ,GAAG,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACzC,MAAM,MAAM,GAAG,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;IAC3C,IAAI,MAAM,EAAE,CAAC;QACX,OAAO,MAAM,CAAA;IACf,CAAC;IAED,uDAAuD;IACvD,KAAK,MAAM,QAAQ,IAAI,aAAa,EAAE,CAAC;QACrC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC7B,MAAM,IAAI,KAAK,CACb,uBAAuB,QAAQ,IAAI;gBACjC,qEAAqE,CACxE,CAAA;QACH,CAAC;IACH,CAAC;IAED,2EAA2E;IAC3E,MAAM,aAAa,GAAG,aAAa,CAAC,CAAC,CAAC,CAAA;IACtC,IAAI,CAAC,aAAa;QAAE,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAA;IAClE,MAAM,cAAc,GAAG,IAAI,OAAO,CAAC;QACjC,gBAAgB,EAAE,aAAa;KAChC,CAAC,CAAA;IAEF,4CAA4C;IAC5C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,aAAa,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC9C,MAAM,UAAU,GAAG,aAAa,CAAC,CAAC,CAAC,CAAA;QACnC,IAAI,UAAU;YAAE,cAAc,CAAC,0BAA0B,CAAC,UAAU,CAAC,CAAA;IACvE,CAAC;IAED,2EAA2E;IAC3E,yEAAyE;IACzE,mEAAmE;IACnE,oBAAoB,CAAC,cAAc,EAAE,aAAa,CAAC,CAAA;IAEnD,2EAA2E;IAC3E,4EAA4E;IAC5E,uFAAuF;IACvF,wEAAwE;IACxE,2BAA2B,CAAC,cAAc,EAAE,aAAa,CAAC,CAAA;IAE1D,MAAM,WAAW,GAAgB;QAC/B,YAAY,EAAE,aAAa;QAC3B,QAAQ,EAAE,cAAc;QACxB,cAAc;YACZ,OAAO,cAAc,CAAC,cAAc,EAAE,CAAA;QACxC,CAAC;QACD,kBAAkB;YAChB,OAAO,cAAc,CAAC,kBAAkB,EAAE,CAAA;QAC5C,CAAC;KACF,CAAA;IAED,cAAc,CAAC,GAAG,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAA;IACzC,OAAO,WAAW,CAAA;AACpB,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,iBAAiB;IAC/B,KAAK,CAAC,KAAK,EAAE,CAAA;IACb,cAAc,CAAC,KAAK,EAAE,CAAA;IACtB,8EAA8E;IAC9E,2EAA2E;IAC3E,8EAA8E;IAC9E,6EAA6E;IAC7E,qBAAqB,EAAE,CAAA;AACzB,CAAC"}