@nielspeter/eess-ts 0.2.1 → 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 +61 -35
  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 -24
  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,84 @@
1
+ import { execFileSync } from 'node:child_process';
2
+ import path from 'node:path';
3
+ import { writeStderr } from '@nielspeter/eess';
4
+ /**
5
+ * A diff filter that restricts violation reporting to files
6
+ * changed since a base branch.
7
+ *
8
+ * IMPORTANT: Rules evaluate the FULL project (needed for cross-file
9
+ * rules like cycles and layer ordering). Only the REPORTING is filtered
10
+ * to changed files. This ensures correctness — a new file that creates
11
+ * a cycle is detected even though the cycle involves unchanged files.
12
+ */
13
+ export class DiffFilter {
14
+ changedFiles;
15
+ /**
16
+ * The branch this filter diffed against, for the suppression notice plan
17
+ * 0071 added. Defaulted rather than required: the constructor is public API
18
+ * (`src/index.ts` exports `DiffFilter`), so an existing
19
+ * `new DiffFilter(files)` must keep compiling.
20
+ */
21
+ baseBranch;
22
+ constructor(changedFiles, baseBranch = 'the base branch') {
23
+ this.changedFiles = changedFiles;
24
+ this.baseBranch = baseBranch;
25
+ }
26
+ /**
27
+ * Filter violations to only those in changed files.
28
+ * If changedFiles is null (git error), returns all violations unfiltered.
29
+ */
30
+ filterToChanged(violations) {
31
+ const files = this.changedFiles;
32
+ if (files === null)
33
+ return violations;
34
+ // Config-level meta-findings (empty selector/discovery) have no changed
35
+ // file to attribute to — never filter them out (ADR-008; plan 0067).
36
+ return violations.filter((v) => v.bypassFilters === true || files.has(v.file));
37
+ }
38
+ /** Number of changed files detected, or -1 if diff unavailable */
39
+ get size() {
40
+ return this.changedFiles === null ? -1 : this.changedFiles.size;
41
+ }
42
+ }
43
+ /**
44
+ * Create a diff filter from git, comparing HEAD against a base branch.
45
+ *
46
+ * Uses `git diff --name-only <base>...HEAD` to find changed files.
47
+ * Resolves relative paths to absolute paths for matching against
48
+ * violation file paths (which are always absolute).
49
+ *
50
+ * @param baseBranch - The base branch to diff against (default: 'main')
51
+ * @returns A DiffFilter for use with check(\{ diff \})
52
+ *
53
+ * @example
54
+ * // Only report violations in files changed since main
55
+ * classes(p).should().notContain(call('eval')).check(\{ diff: diffAware('main') \})
56
+ */
57
+ export function diffAware(baseBranch = 'main') {
58
+ const cwd = process.cwd();
59
+ let output;
60
+ try {
61
+ output = execFileSync('git', ['diff', '--name-only', `${baseBranch}...HEAD`], {
62
+ encoding: 'utf-8',
63
+ cwd,
64
+ stdio: ['pipe', 'pipe', 'pipe'],
65
+ }).trim();
66
+ }
67
+ catch (error) {
68
+ // Not a git repo, or the base branch doesn't exist — skip filtering (report
69
+ // all violations). The cause is named: "could not run git diff" alone sends
70
+ // a reader looking for a missing branch when the real answer may be that git
71
+ // is not installed, or that the cwd is not a repository at all.
72
+ writeStderr(`[eess] Could not run git diff against '${baseBranch}' ` +
73
+ `(${error instanceof Error ? error.message.split('\n')[0] : String(error)}). ` +
74
+ 'All violations will be reported.');
75
+ return new DiffFilter(null, baseBranch);
76
+ }
77
+ if (output === '') {
78
+ // No changes — empty set means nothing is "changed", so all violations are filtered out
79
+ return new DiffFilter(new Set(), baseBranch);
80
+ }
81
+ const changedFiles = new Set(output.split('\n').map((relativePath) => path.resolve(cwd, relativePath)));
82
+ return new DiffFilter(changedFiles, baseBranch);
83
+ }
84
+ //# sourceMappingURL=diff-aware.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff-aware.js","sourceRoot":"","sources":["../../src/helpers/diff-aware.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACjD,OAAO,IAAI,MAAM,WAAW,CAAA;AAE5B,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAE9C;;;;;;;;GAQG;AACH,MAAM,OAAO,UAAU;IACJ,YAAY,CAAoB;IAEjD;;;;;OAKG;IACM,UAAU,CAAQ;IAE3B,YAAY,YAAgC,EAAE,aAAqB,iBAAiB;QAClF,IAAI,CAAC,YAAY,GAAG,YAAY,CAAA;QAChC,IAAI,CAAC,UAAU,GAAG,UAAU,CAAA;IAC9B,CAAC;IAED;;;OAGG;IACH,eAAe,CAAC,UAA2B;QACzC,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAA;QAC/B,IAAI,KAAK,KAAK,IAAI;YAAE,OAAO,UAAU,CAAA;QACrC,wEAAwE;QACxE,qEAAqE;QACrE,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,KAAK,IAAI,IAAI,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAA;IAChF,CAAC;IAED,kEAAkE;IAClE,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,YAAY,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAA;IACjE,CAAC;CACF;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,SAAS,CAAC,aAAqB,MAAM;IACnD,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAA;IAEzB,IAAI,MAAc,CAAA;IAClB,IAAI,CAAC;QACH,MAAM,GAAG,YAAY,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,aAAa,EAAE,GAAG,UAAU,SAAS,CAAC,EAAE;YAC5E,QAAQ,EAAE,OAAO;YACjB,GAAG;YACH,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;SAChC,CAAC,CAAC,IAAI,EAAE,CAAA;IACX,CAAC;IAAC,OAAO,KAAc,EAAE,CAAC;QACxB,4EAA4E;QAC5E,4EAA4E;QAC5E,6EAA6E;QAC7E,gEAAgE;QAChE,WAAW,CACT,0CAA0C,UAAU,IAAI;YACtD,IAAI,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK;YAC9E,kCAAkC,CACrC,CAAA;QACD,OAAO,IAAI,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,CAAA;IACzC,CAAC;IAED,IAAI,MAAM,KAAK,EAAE,EAAE,CAAC;QAClB,wFAAwF;QACxF,OAAO,IAAI,UAAU,CAAC,IAAI,GAAG,EAAE,EAAE,UAAU,CAAC,CAAA;IAC9C,CAAC;IAED,MAAM,YAAY,GAAG,IAAI,GAAG,CAC1B,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,YAAY,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC,CAC1E,CAAA;IAED,OAAO,IAAI,UAAU,CAAC,YAAY,EAAE,UAAU,CAAC,CAAA;AACjD,CAAC"}
@@ -21,6 +21,29 @@ export interface ExpressionMatcher {
21
21
  * The condition layer enforces this — matchers can assume the kind is correct.
22
22
  */
23
23
  matches(node: Node): boolean;
24
+ /**
25
+ * Every position at which this matcher's pattern matches a comment attached
26
+ * to `node`. Absent for an ordinary matcher, where the node *is* the match.
27
+ *
28
+ * **Presence of this method is what makes a matcher a trivia matcher.** It
29
+ * was two members — a `matchesTrivia: true` flag beside a single-position
30
+ * accessor — and that admitted four states of which two were silently wrong:
31
+ * the flag without the accessor reported every node at its own line, and the
32
+ * accessor without the flag reproduced the original bug. Both were measured.
33
+ * One member cannot disagree with itself.
34
+ *
35
+ * **Every** position, not the first. A node routinely carries several
36
+ * matching comments — four stacked `// TODO` lines lead one statement — and
37
+ * the unit of a comment finding is the **comment**. Returning one collapsed
38
+ * them, which left `noStubComments()` reporting a single finding for four
39
+ * stubs: a ratchet hole exactly where agent-written stubs accumulate, in the
40
+ * rule `agentGuardrails` ships to catch them.
41
+ *
42
+ * Must be **pure and stable for a node**: the traversal calls it to
43
+ * enumerate and deduplicate matches, and the conditions layer calls it again
44
+ * to name the line, across a layer boundary, and the two must agree.
45
+ */
46
+ matchedTriviaPositions?(node: Node): readonly number[];
24
47
  }
25
48
  /**
26
49
  * Match a CallExpression by function/method name.
@@ -82,13 +105,50 @@ export declare function newExpr(nameOrRegex: string | RegExp): ExpressionMatcher
82
105
  export declare function expression(textOrRegex: string | RegExp): ExpressionMatcher;
83
106
  export declare function property(name: string | RegExp, value?: boolean | number | string | RegExp): ExpressionMatcher;
84
107
  /**
85
- * Default stub/deferred-work patterns found in comments.
86
- * Matches common markers (see regex) and phrases like
87
- * "not implemented" or "coming soon".
108
+ * A stub marker: an **UPPERCASE** marker word opening a comment line, or either
109
+ * of two phrases.
110
+ *
111
+ * Both halves of that are load-bearing, and each was found by a prose false
112
+ * positive in this repo's own source
113
+ * ([ts-archunit bug 0053](https://github.com/nielspeter/ts-archunit/blob/main/bugs/fixed/0053-the-stub-rule-matched-prose-about-stubs.md)).
114
+ *
115
+ * **Anchored to a line start**, because unanchored it matched every sentence that
116
+ * mentions a marker — including the docstring of the fix for bug 0052, which says
117
+ * the word TODO three times.
118
+ *
119
+ * **Case-sensitive for the markers**, because anchoring alone was not enough: a
120
+ * wrapped JSDoc sentence put the lowercase word "stub," at the start of a
121
+ * continuation line. Uppercase is the convention (`// TODO:`, `// FIXME`) and the
122
+ * casing is what separates a marker from the English word. Known limit, stated
123
+ * rather than discovered: a lowercase `// todo: x` is not matched. That is the
124
+ * price of not matching "the todo list below", and it is the right trade for a
125
+ * rule whose findings must fail a build.
126
+ *
127
+ * The phrase forms are anchored too, because unanchored they matched
128
+ * `noStubComments()`'s own docstring, which lists them. That is bug 0043's shape:
129
+ * documentation of a syntax read as the syntax.
130
+ *
131
+ * **The phrase forms ARE case-insensitive, since v0.55.0** — and were not between v0.47.0
132
+ * and then, though this text claimed otherwise for part of that window. The `i` flag was
133
+ * dropped for the whole expression, correctly, because the MARKERS must stay
134
+ * case-sensitive: that is what rejects a wrapped JSDoc line beginning `stub,`. But only
135
+ * the phrases' INITIAL letters were alternated, so `// NOT IMPLEMENTED` and
136
+ * `// COMING SOON` silently stopped matching. The reasoning offered at the time was
137
+ * "nobody writes NOT IMPLEMENTED", which is precisely the casing the marker branch would
138
+ * otherwise have caught. `anyCase` below DERIVES the alternation, so the class cannot come
139
+ * back one letter at a time
140
+ * ([ts-archunit bug 0061](https://github.com/nielspeter/ts-archunit/blob/main/bugs/fixed/0061-an-all-caps-stub-marker-no-longer-matches.md)).
141
+ */
142
+ /**
143
+ * A word matched case-INSENSITIVELY, letter by letter.
88
144
  *
89
- * Exported as a constant for use with `comment()`. Users can pass
90
- * their own RegExp to `comment()` for narrower matching.
145
+ * JavaScript has no inline `(?i:…)` group and the `i` flag applies to the whole expression,
146
+ * which cannot be used here — the MARKER branch must stay case-sensitive. So the phrase
147
+ * branch alternates its own letters, and it is DERIVED rather than hand-written, because
148
+ * hand-writing it is what produced bug 0061: `[Nn]ot\\s+[Ii]mplemented` alternates the
149
+ * first letter of each word and nothing else.
91
150
  */
151
+ export declare function anyCase(word: string): string;
92
152
  export declare const STUB_PATTERNS: RegExp;
93
153
  /**
94
154
  * Match comments attached to AST nodes.
@@ -98,8 +158,9 @@ export declare const STUB_PATTERNS: RegExp;
98
158
  * `syntaxKinds: undefined` so the broad traversal path visits every node,
99
159
  * and `matches(node)` checks that node's comment ranges.
100
160
  *
101
- * A Set tracks matched comment positions to avoid duplicates (the same
102
- * comment may be visited as leading trivia of multiple nested nodes).
161
+ * The same comment is visible as trivia of several nested nodes, so the
162
+ * traversal deduplicates by the comment's own position — this matcher holds no
163
+ * state of its own (bug 0034).
103
164
  *
104
165
  * @param pattern - String substring or RegExp to test against comment text.
105
166
  *
@@ -1 +1 @@
1
- {"version":3,"file":"matchers.d.ts","sourceRoot":"","sources":["../../src/helpers/matchers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,UAAU,EAAqB,MAAM,UAAU,CAAA;AAE9D;;;;;GAKG;AACH,MAAM,WAAW,iBAAiB;IAChC,wDAAwD;IACxD,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;IAE5B;;;;OAIG;IACH,QAAQ,CAAC,WAAW,CAAC,EAAE,UAAU,EAAE,CAAA;IAEnC;;;;;OAKG;IACH,OAAO,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAA;CAC7B;AAaD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,IAAI,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,GAAG,iBAAiB,CAqBpE;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,iBAAiB,CAqBhE;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,OAAO,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,GAAG,iBAAiB,CAqBvE;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,GAAG,iBAAiB,CAgC1E;AAsDD,wBAAgB,QAAQ,CACtB,IAAI,EAAE,MAAM,GAAG,MAAM,EACrB,KAAK,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,GACzC,iBAAiB,CAgBnB;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,aAAa,QACsE,CAAA;AAEhG;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,iBAAiB,CAoCnE;AAeD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,iBAAiB,CAoBzE;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,wBAAgB,OAAO,IAAI,iBAAiB,CAwB3C;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC;;;;;;;;;;OAUG;IACH,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,CAAA;CAC9B;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,aAAa,CAAC,OAAO,CAAC,EAAE,oBAAoB,GAAG,iBAAiB,CAoB/E;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,IAAI,iBAAiB,CAQpD"}
1
+ {"version":3,"file":"matchers.d.ts","sourceRoot":"","sources":["../../src/helpers/matchers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,UAAU,EAAqB,MAAM,UAAU,CAAA;AAG9D;;;;;GAKG;AACH,MAAM,WAAW,iBAAiB;IAChC,wDAAwD;IACxD,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;IAE5B;;;;OAIG;IACH,QAAQ,CAAC,WAAW,CAAC,EAAE,UAAU,EAAE,CAAA;IAEnC;;;;;OAKG;IACH,OAAO,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAA;IAE5B;;;;;;;;;;;;;;;;;;;;;OAqBG;IACH,sBAAsB,CAAC,CAAC,IAAI,EAAE,IAAI,GAAG,SAAS,MAAM,EAAE,CAAA;CACvD;AAaD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,IAAI,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,GAAG,iBAAiB,CAqBpE;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,iBAAiB,CAqBhE;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,OAAO,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,GAAG,iBAAiB,CAqBvE;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,GAAG,iBAAiB,CAgC1E;AAsDD,wBAAgB,QAAQ,CACtB,IAAI,EAAE,MAAM,GAAG,MAAM,EACrB,KAAK,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,GACzC,iBAAiB,CAgBnB;AAeD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH;;;;;;;;GAQG;AAEH,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAoC5C;AAOD,eAAO,MAAM,aAAa,QAEzB,CAAA;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,iBAAiB,CAuCnE;AAeD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,iBAAiB,CAoBzE;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,wBAAgB,OAAO,IAAI,iBAAiB,CAwB3C;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC;;;;;;;;;;OAUG;IACH,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,CAAA;CAC9B;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,aAAa,CAAC,OAAO,CAAC,EAAE,oBAAoB,GAAG,iBAAiB,CAoB/E;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,IAAI,iBAAiB,CAQpD"}
@@ -1,4 +1,5 @@
1
1
  import { Node, SyntaxKind } from 'ts-morph';
2
+ import { writeStderr } from '@nielspeter/eess';
2
3
  /**
3
4
  * Normalize expression text for matching.
4
5
  * Replaces optional chaining `?.` with `.` so users don't need to
@@ -143,7 +144,7 @@ export function expression(textOrRegex) {
143
144
  // No syntaxKinds — walks all descendants
144
145
  matches(node) {
145
146
  if (!warned) {
146
- console.warn(`[eess] expression('${textOrRegex}') is a broad matcher. ` +
147
+ writeStderr(`[eess] expression('${textOrRegex}') is a broad matcher. ` +
147
148
  `Prefer call(), access(), or newExpr() for precise matching.`);
148
149
  warned = true;
149
150
  }
@@ -156,7 +157,7 @@ export function expression(textOrRegex) {
156
157
  // No syntaxKinds — walks all descendants
157
158
  matches(node) {
158
159
  if (!warned) {
159
- console.warn(`[eess] expression(${String(textOrRegex)}) is a broad matcher. ` +
160
+ writeStderr(`[eess] expression(${String(textOrRegex)}) is a broad matcher. ` +
160
161
  `Prefer call(), access(), or newExpr() for precise matching.`);
161
162
  warned = true;
162
163
  }
@@ -244,7 +245,96 @@ export function property(name, value) {
244
245
  * Exported as a constant for use with `comment()`. Users can pass
245
246
  * their own RegExp to `comment()` for narrower matching.
246
247
  */
247
- export const STUB_PATTERNS = /\b(TODO|FIXME|HACK|XXX|STUB|DEFERRED|PLACEHOLDER)\b|\bnot\s+implemented\b|\bcoming\s+soon\b/i;
248
+ const MARKER = 'TODO|FIXME|HACK|XXX|STUB|DEFERRED|PLACEHOLDER';
249
+ /** Start of a comment, or of a line inside one, past any `//`, `/*` or `*`. */
250
+ const COMMENT_LINE_START = String.raw `(?:^|\n)[ \t]*(?:\/\/+|\/\*+|\*+)?[ \t]*`;
251
+ /**
252
+ * A stub marker: an **UPPERCASE** marker word opening a comment line, or either
253
+ * of two phrases.
254
+ *
255
+ * Both halves of that are load-bearing, and each was found by a prose false
256
+ * positive in this repo's own source
257
+ * ([ts-archunit bug 0053](https://github.com/nielspeter/ts-archunit/blob/main/bugs/fixed/0053-the-stub-rule-matched-prose-about-stubs.md)).
258
+ *
259
+ * **Anchored to a line start**, because unanchored it matched every sentence that
260
+ * mentions a marker — including the docstring of the fix for bug 0052, which says
261
+ * the word TODO three times.
262
+ *
263
+ * **Case-sensitive for the markers**, because anchoring alone was not enough: a
264
+ * wrapped JSDoc sentence put the lowercase word "stub," at the start of a
265
+ * continuation line. Uppercase is the convention (`// TODO:`, `// FIXME`) and the
266
+ * casing is what separates a marker from the English word. Known limit, stated
267
+ * rather than discovered: a lowercase `// todo: x` is not matched. That is the
268
+ * price of not matching "the todo list below", and it is the right trade for a
269
+ * rule whose findings must fail a build.
270
+ *
271
+ * The phrase forms are anchored too, because unanchored they matched
272
+ * `noStubComments()`'s own docstring, which lists them. That is bug 0043's shape:
273
+ * documentation of a syntax read as the syntax.
274
+ *
275
+ * **The phrase forms ARE case-insensitive, since v0.55.0** — and were not between v0.47.0
276
+ * and then, though this text claimed otherwise for part of that window. The `i` flag was
277
+ * dropped for the whole expression, correctly, because the MARKERS must stay
278
+ * case-sensitive: that is what rejects a wrapped JSDoc line beginning `stub,`. But only
279
+ * the phrases' INITIAL letters were alternated, so `// NOT IMPLEMENTED` and
280
+ * `// COMING SOON` silently stopped matching. The reasoning offered at the time was
281
+ * "nobody writes NOT IMPLEMENTED", which is precisely the casing the marker branch would
282
+ * otherwise have caught. `anyCase` below DERIVES the alternation, so the class cannot come
283
+ * back one letter at a time
284
+ * ([ts-archunit bug 0061](https://github.com/nielspeter/ts-archunit/blob/main/bugs/fixed/0061-an-all-caps-stub-marker-no-longer-matches.md)).
285
+ */
286
+ /**
287
+ * A word matched case-INSENSITIVELY, letter by letter.
288
+ *
289
+ * JavaScript has no inline `(?i:…)` group and the `i` flag applies to the whole expression,
290
+ * which cannot be used here — the MARKER branch must stay case-sensitive. So the phrase
291
+ * branch alternates its own letters, and it is DERIVED rather than hand-written, because
292
+ * hand-writing it is what produced bug 0061: `[Nn]ot\\s+[Ii]mplemented` alternates the
293
+ * first letter of each word and nothing else.
294
+ */
295
+ // eess-exclude eess/no-unused-exports: consumed by the test suite; the build tsconfig this gate reads excludes tests, so `src` is the only usage it can see
296
+ export function anyCase(word) {
297
+ const escape = (text) => text.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
298
+ return [...word]
299
+ .map((ch) => {
300
+ const lower = ch.toLowerCase();
301
+ const upper = ch.toUpperCase();
302
+ // A character CLASS while both mappings are single characters, and an ALTERNATION
303
+ // when either is not.
304
+ //
305
+ // The alternation is the correctness half: a case mapping is not one-to-one.
306
+ // Measured, `'ß'.toUpperCase()` is `'SS'` — two characters — so `[SSß]` is a class of
307
+ // three single characters matching `S` or `ß` and **not** `SS`, and
308
+ // `anyCase('straße')` produced a pattern that did not match its own uppercase form
309
+ // without throwing. Same silent-wrongness as an unescaped metacharacter; the first
310
+ // version of this function fixed only that half.
311
+ //
312
+ // Keeping the class for the single-character case is the *cost* half, and it is not
313
+ // cosmetic. `[Nn]` and `(?:N|n)` match identically, so switching every letter to an
314
+ // alternation would move `STUB_PATTERNS`' text — and therefore every baselined
315
+ // finding's identity — while changing no behaviour at all. That is a migration
316
+ // charged to every adopter for nothing. Found by the change detector firing on it.
317
+ if (lower !== upper) {
318
+ return upper.length === 1 && lower.length === 1
319
+ ? `[${escape(upper)}${escape(lower)}]`
320
+ : `(?:${escape(upper)}|${escape(lower)})`;
321
+ }
322
+ // A character with no case is passed through ESCAPED. Measured before adding this:
323
+ // `anyCase('todo(x)')` produced `[Tt][Oo][Dd][Oo]([Xx])` — a capture group; `'wip.'`
324
+ // produced a `.` meaning any character; `'a+b'` produced "one or more a". None of
325
+ // them throw, so the pattern silently means something other than the phrase.
326
+ //
327
+ // No live defect — today's phrases are letters and spaces — but this function exists
328
+ // to be called with a new phrase, and that is when it would bite.
329
+ return escape(ch);
330
+ })
331
+ .join('');
332
+ }
333
+ /** `not implemented` / `coming soon`, any casing, any run of whitespace between words. */
334
+ const PHRASES = ['not implemented', 'coming soon']
335
+ .map((phrase) => phrase.split(' ').map(anyCase).join('\\s+'))
336
+ .join('|');
337
+ export const STUB_PATTERNS = new RegExp([`${COMMENT_LINE_START}(?:${MARKER})\\b`, `${COMMENT_LINE_START}(?:${PHRASES})\\b`].join('|'));
248
338
  /**
249
339
  * Match comments attached to AST nodes.
250
340
  *
@@ -253,8 +343,9 @@ export const STUB_PATTERNS = /\b(TODO|FIXME|HACK|XXX|STUB|DEFERRED|PLACEHOLDER)\
253
343
  * `syntaxKinds: undefined` so the broad traversal path visits every node,
254
344
  * and `matches(node)` checks that node's comment ranges.
255
345
  *
256
- * A Set tracks matched comment positions to avoid duplicates (the same
257
- * comment may be visited as leading trivia of multiple nested nodes).
346
+ * The same comment is visible as trivia of several nested nodes, so the
347
+ * traversal deduplicates by the comment's own position — this matcher holds no
348
+ * state of its own (bug 0034).
258
349
  *
259
350
  * @param pattern - String substring or RegExp to test against comment text.
260
351
  *
@@ -264,10 +355,16 @@ export const STUB_PATTERNS = /\b(TODO|FIXME|HACK|XXX|STUB|DEFERRED|PLACEHOLDER)\
264
355
  * comment('HACK') // matches hack comments
265
356
  */
266
357
  export function comment(pattern) {
267
- // Dedup by (filePath, pos) — prevents the same comment from matching
268
- // multiple times when visited as leading trivia of nested nodes.
269
- // Using a composite string key avoids cross-file collisions.
270
- const matchedComments = new Set();
358
+ // NO dedup state here, deliberately — bug 0034. This used to hold a
359
+ // `Set<string>` of matched `filePath:pos` keys that was never reset, so the
360
+ // SAME rule object returned 2 violations and then 0 on its second
361
+ // evaluation: measured, and the purest form of the green that means nothing
362
+ // this project exists to remove. It bit watch mode, a preset array checked
363
+ // twice, and any test reusing a rule constant.
364
+ //
365
+ // Dedup now happens in the traversal, keyed by attachment point, via
366
+ // `matchedTriviaPositions` below. A matcher that holds no state cannot go
367
+ // stale.
271
368
  function testComment(range) {
272
369
  const text = range.getText();
273
370
  if (typeof pattern === 'string') {
@@ -283,18 +380,15 @@ export function comment(pattern) {
283
380
  : `comment matching ${String(pattern)}`,
284
381
  // No syntaxKinds — broad traversal to visit all nodes and their comments
285
382
  matches(node) {
286
- const filePath = node.getSourceFile().getFilePath();
287
383
  const ranges = [...node.getLeadingCommentRanges(), ...node.getTrailingCommentRanges()];
288
- for (const range of ranges) {
289
- const key = `${filePath}:${String(range.getPos())}`;
290
- if (matchedComments.has(key))
291
- continue;
292
- if (testComment(range)) {
293
- matchedComments.add(key);
294
- return true;
295
- }
296
- }
297
- return false;
384
+ return ranges.some((range) => testComment(range));
385
+ },
386
+ matchedTriviaPositions(node) {
387
+ // `getPos()`, never `getEnd()`: a multi-line block comment or JSDoc would
388
+ // otherwise be reported at its CLOSING line. Invisible to an all-`//`
389
+ // fixture, where the two share a line — found by sabotage.
390
+ const ranges = [...node.getLeadingCommentRanges(), ...node.getTrailingCommentRanges()];
391
+ return ranges.filter((range) => testComment(range)).map((range) => range.getPos());
298
392
  },
299
393
  };
300
394
  }
@@ -1 +1 @@
1
- {"version":3,"file":"matchers.js","sourceRoot":"","sources":["../../src/helpers/matchers.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"matchers.js","sourceRoot":"","sources":["../../src/helpers/matchers.ts"],"names":[],"mappings":"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"}
@@ -1,10 +1,12 @@
1
1
  import type { SourceFile } from 'ts-morph';
2
2
  import type { Slice } from '../models/slice.js';
3
+ import type { ImportOptions } from '../core/import-options.js';
4
+ import type { ModuleEdge } from '../core/module-edges.js';
3
5
  /**
4
6
  * An edge in the slice dependency graph.
5
- * Represents: a file in `from` imports a file in `to`.
7
+ * Represents: a file in `from` depends on a file in `to`.
6
8
  */
7
- export interface SliceEdge {
9
+ interface SliceEdge {
8
10
  from: string;
9
11
  to: string;
10
12
  }
@@ -13,20 +15,110 @@ export interface SliceEdge {
13
15
  * Shared by buildSliceDependencyGraph and findSliceDependencyDetails.
14
16
  */
15
17
  export declare function buildFileToSliceMap(slices: Slice[]): Map<string, string>;
16
- export declare function buildSliceDependencyGraph(slices: Slice[], fileToSlice?: Map<string, string>): SliceEdge[];
18
+ /**
19
+ * Which erasure question a condition is asking.
20
+ *
21
+ * Both live on this graph and they are **not the same question**, which only became
22
+ * visible when `ModuleEdge` learned to tell them apart
23
+ * ([ts-archunit plan 0087](https://github.com/nielspeter/ts-archunit/blob/main/plans/completed/0087-an-inline-type-import-still-requests-the-module.md)):
24
+ *
25
+ * - `'module-request'` — will importing this file cause the target to be *evaluated*?
26
+ * That is what a **cycle** is: a deadlock in module-initialization order. Used by
27
+ * `beFreeOfCycles`.
28
+ * - `'type-bindings'` — does this file *reference* the target's types? That is
29
+ * **coupling**, which is what `notDependOn` and `respectLayerOrder` are about, and
30
+ * it matches what `dependOn`/`notImportFrom` have always meant by
31
+ * `ignoreTypeImports`.
32
+ *
33
+ * They diverge for exactly two spellings, and only under `verbatimModuleSyntax: true`:
34
+ * `import { type X } from 's'` and `export { type X } from 's'` emit `import {} from 's'`
35
+ * / `export {} from 's'`. Those are eager edges — so a cycle question must count them —
36
+ * while the bindings crossing them are still purely type-level, so a coupling question
37
+ * told to ignore type imports must not.
38
+ *
39
+ * Getting this backwards is a false positive on one side and a false negative on the
40
+ * other, in the same release.
41
+ */
42
+ type ErasureQuestion = 'module-request' | 'type-bindings';
43
+ /**
44
+ * Build a directed dependency graph between slices.
45
+ *
46
+ * For each file in each slice, resolve its dependencies. If the target file
47
+ * belongs to a different slice, add a directed edge from the depending slice
48
+ * to the depended-upon slice.
49
+ *
50
+ * @param slices - The resolved slices
51
+ * @param fileToSlice - Pre-built file-to-slice map (optional, built internally if not provided)
52
+ * @param options - `ignoreTypeImports` drops edges that are erased at compile time
53
+ * @returns Unique directed edges between slices
54
+ */
55
+ /**
56
+ * A built graph, and the only way to ask it for the sites behind one of its edges.
57
+ *
58
+ * `question` and `options` must be the same for the graph and for the details walk, and
59
+ * for a while they were four literals across two call sites kept in step by convention.
60
+ * The failure is silent and specific: the conditions emit **one violation per detail**, so
61
+ * a graph that counts an edge the details walk cannot see reports nothing at all, and a
62
+ * details walk that counts more reports the wrong site.
63
+ *
64
+ * A review measured the live half of that. Passing `'type-bindings'` to `beFreeOfCycles`'s
65
+ * details call — the one mutation of eight that stayed **green** — turned the cycle finding
66
+ * into *"feature dynamically imports legacy at index.ts:1"*, pointing the reader at the one
67
+ * construct that BREAKS cycles and telling them to remove it. ADR-009 rule 2, from a
68
+ * mismatch no test could see.
69
+ *
70
+ * So the pairing is no longer expressible: `detailsFor` reads what the graph was built
71
+ * with. This also retires the older `options`-mismatch hazard the docstrings managed with
72
+ * prose.
73
+ */
74
+ interface SliceGraph {
75
+ readonly edges: SliceEdge[];
76
+ detailsFor(fromSliceName: string, toSliceName: string): SliceDependencySite[];
77
+ }
78
+ /**
79
+ * Build the graph, and bind the details walk to the same question and options.
80
+ *
81
+ * Prefer this over the two loose functions; they remain exported because
82
+ * `tests/` and the reverse-graph work call them directly with an explicit question.
83
+ */
84
+ export declare function sliceGraph(slices: Slice[], fileToSlice: Map<string, string> | undefined, options: ImportOptions | undefined, question: ErasureQuestion): SliceGraph;
17
85
  /**
18
86
  * Find which specific files cause a dependency from one slice to another.
19
87
  * Used for detailed violation messages.
20
88
  *
89
+ * **`options` must be the options the graph was built with**, and that is not a style
90
+ * preference. `respectLayerOrder` and `notDependOn` push one violation *per detail*,
91
+ * so a graph that counts an edge this function cannot see finds the dependency and
92
+ * reports **nothing** — a false green produced by two filters disagreeing rather than
93
+ * by either one being absent. `beFreeOfCycles` fails differently and more quietly: it
94
+ * still reports the cycle, at `unknown:0`, which is a finding whose remedy nobody can
95
+ * act on.
96
+ *
21
97
  * @param slices - The resolved slices
22
98
  * @param fromSliceName - Source slice name
23
99
  * @param toSliceName - Target slice name
24
100
  * @param fileToSlice - Pre-built file-to-slice map (optional, built internally if not provided)
101
+ * @param options - Must match the options passed to `buildSliceDependencyGraph`
25
102
  * @returns Array of { sourceFile, importPath, importLine }
26
103
  */
27
- export declare function findSliceDependencyDetails(slices: Slice[], fromSliceName: string, toSliceName: string, fileToSlice?: Map<string, string>): Array<{
28
- sourceFile: SourceFile;
29
- importPath: string;
30
- importLine: number;
31
- }>;
104
+ export interface SliceDependencySite {
105
+ readonly sourceFile: SourceFile;
106
+ readonly importPath: string;
107
+ readonly importLine: number;
108
+ /**
109
+ * The edge itself, so a caller can build an identity and a message from what the
110
+ * dependency *is* rather than from where it sits.
111
+ *
112
+ * Added by [ts-archunit plan 0088](https://github.com/nielspeter/ts-archunit/blob/main/plans/0088-a-slice-finding-identifies-itself.md): the
113
+ * dependency conditions identify a finding by `basename::kind::specifier::names` and
114
+ * deliberately **not** by line, because a line moves when anything above it is edited
115
+ * (see `ArchViolation.identity`). The slice conditions could not follow that scheme
116
+ * while this function returned only a line number.
117
+ *
118
+ * It also unblocks naming the offending edge's KIND in the message — `edgeVerb()` has
119
+ * returned `'re-exports'` since v0.28.0 and no slice condition could use it.
120
+ */
121
+ readonly edge: ModuleEdge;
122
+ }
123
+ export {};
32
124
  //# sourceMappingURL=slice-graph.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"slice-graph.d.ts","sourceRoot":"","sources":["../../src/helpers/slice-graph.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AAC1C,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAA;AAG/C;;;GAGG;AAEH,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAA;IACZ,EAAE,EAAE,MAAM,CAAA;CACX;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAQxE;AAsCD,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,KAAK,EAAE,EACf,WAAW,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAChC,SAAS,EAAE,CAcb;AAED;;;;;;;;;GASG;AACH,wBAAgB,0BAA0B,CACxC,MAAM,EAAE,KAAK,EAAE,EACf,aAAa,EAAE,MAAM,EACrB,WAAW,EAAE,MAAM,EACnB,WAAW,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAChC,KAAK,CAAC;IAAE,UAAU,EAAE,UAAU,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAAC,CAwB3E"}
1
+ {"version":3,"file":"slice-graph.d.ts","sourceRoot":"","sources":["../../src/helpers/slice-graph.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AAC1C,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAA;AAC/C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAA;AAC9D,OAAO,KAAK,EAAE,UAAU,EAAkB,MAAM,yBAAyB,CAAA;AAGzE;;;GAGG;AACH,UAAU,SAAS;IACjB,IAAI,EAAE,MAAM,CAAA;IACZ,EAAE,EAAE,MAAM,CAAA;CACX;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAQxE;AAqCD;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,KAAK,eAAe,GAAG,gBAAgB,GAAG,eAAe,CAAA;AAyGzD;;;;;;;;;;;GAWG;AACH;;;;;;;;;;;;;;;;;;GAkBG;AACH,UAAU,UAAU;IAClB,QAAQ,CAAC,KAAK,EAAE,SAAS,EAAE,CAAA;IAC3B,UAAU,CAAC,aAAa,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,mBAAmB,EAAE,CAAA;CAC9E;AAED;;;;;GAKG;AACH,wBAAgB,UAAU,CACxB,MAAM,EAAE,KAAK,EAAE,EACf,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,EAC5C,OAAO,EAAE,aAAa,GAAG,SAAS,EAClC,QAAQ,EAAE,eAAe,GACxB,UAAU,CAMZ;AAuBD;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAA;IAC/B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;IAC3B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;IAC3B;;;;;;;;;;;;OAYG;IACH,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAA;CAC1B"}