@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,445 @@
1
+ import { assertionAdviceOf, buildRuleDescription, describeRuleOf, globsOf, } from './rule-declaration.js';
2
+ import { TerminalBuilder } from './terminal-builder.js';
3
+ import { assertsCardinality } from '@nielspeter/eess';
4
+ /**
5
+ * Abstract base class for the predicate/condition rule builders.
6
+ *
7
+ * Concrete entry points (plans 0007+) extend this and:
8
+ * 1. Implement `getElements()` to return the elements to check
9
+ * 2. Add predicate methods that call `addPredicate()`
10
+ * 3. Add condition methods that call `addCondition()`
11
+ *
12
+ * The builder accumulates predicates and conditions. Nothing executes
13
+ * until a terminal method (`.check()`, `.warn()`, `.severity()`) is called.
14
+ *
15
+ * Extends `TerminalBuilder`, which owns everything that is not about the
16
+ * predicate/condition pipeline: `because`, `rule`, `excluding`, `violations`,
17
+ * `check`, `warn`, `asSeverity`, `severity`. Those used to exist twice, once
18
+ * here and once there, and the two copies had already drifted — this class's
19
+ * `excluding()` documented matching against element/file/message while the
20
+ * other still claimed element only, and the more accurate one was the one
21
+ * fewer builders inherited.
22
+ *
23
+ * The cost of the second root was not duplication, it was silent
24
+ * non-coverage: the materialized subject set (plan 0064) and the
25
+ * empty-selector guard (plan 0067) were added here and never reached the
26
+ * seven builders on the other branch. Plan 0069 needs `globs()` to reach all
27
+ * thirteen, so it goes on the root and the root is now singular.
28
+ */
29
+ export class RuleBuilder extends TerminalBuilder {
30
+ project;
31
+ _predicates = [];
32
+ _conditions = [];
33
+ _phase = 'predicate';
34
+ // Plan 0070: state for the assertion-less remedies. `_phase` cannot carry
35
+ // either fact — `.should().that()` legally returns to the predicate phase,
36
+ // so `_phase === 'predicate'` does not mean `.should()` was never reached,
37
+ // and a predicate applied after `should()` leaves no other trace.
38
+ _reachedShould = false;
39
+ _misplaced = [];
40
+ /** `.expectEmpty()` — plan 0074. Asserts the selection is empty, and fails when it is not. */
41
+ constructor(project) {
42
+ super();
43
+ this.project = project;
44
+ }
45
+ // --- Chain methods (grammar transitions) ---
46
+ /**
47
+ * Begin the predicate phase. Returns a COPY, per bug 0016 — a held selection
48
+ * is never edited by narrowing it. Every ordinary chain is unaffected,
49
+ * because the copy is what the chain continues on; what changed is that
50
+ * `held.that()...` no longer reaches back into `held`.
51
+ * Purely a readability marker — `.that().haveNameMatching(...)` reads like English.
52
+ * Explicitly resets phase to 'predicate' — defensive against `.should().that()` misuse.
53
+ */
54
+ that() {
55
+ const next = this.copy();
56
+ next._phase = 'predicate';
57
+ return next;
58
+ }
59
+ /**
60
+ * Add another predicate (AND). Returns `this` for chaining.
61
+ * `.that().extend('Base').and().resideInFolder('src/repos/**')` means both must match.
62
+ */
63
+ and() {
64
+ return this;
65
+ }
66
+ /**
67
+ * Begin the condition phase. Returns a forked builder for named selection safety.
68
+ * Creates a fresh builder with the same predicates but empty conditions.
69
+ * Sets phase to 'condition' so dual-use methods dispatch correctly.
70
+ */
71
+ should() {
72
+ const fork = this.fork();
73
+ fork._phase = 'condition';
74
+ fork._reachedShould = true;
75
+ return fork;
76
+ }
77
+ /**
78
+ * Add another condition that must ALSO pass (AND).
79
+ * `.should().notContain(call('x')).andShould().notContain(call('y'))` means both must hold.
80
+ */
81
+ andShould() {
82
+ return this;
83
+ }
84
+ /**
85
+ * Plug in a custom predicate or condition.
86
+ *
87
+ * After `.that()` — pass a `Predicate<T>` to filter elements.
88
+ * After `.should()` — pass a `Condition<T>` to assert against filtered elements.
89
+ *
90
+ * Dispatch is structural: if the object has a `test` method it is treated
91
+ * as a predicate; if it has `evaluate` it is treated as a condition.
92
+ */
93
+ satisfy(custom) {
94
+ if ('test' in custom) {
95
+ return this.addPredicate(custom);
96
+ }
97
+ return this.addCondition(custom);
98
+ }
99
+ // --- Terminal methods ---
100
+ /**
101
+ * Return the predicate-filtered elements as a labelled `Selection<T>` for
102
+ * cross-validation (`crossProject()`). The set is exactly the elements this
103
+ * rule would evaluate — the same filtering `.check()` applies.
104
+ *
105
+ * **Restored in plan 0165 Phase 2.** `select()` is eess's, not upstream's: it
106
+ * is the side of the kernel's two-sided join, and `@nielspeter/eess-crossvalidate`
107
+ * is built entirely on it — four of its five source files failed `tsc` and 33 of
108
+ * its tests failed without it. The wholesale engine copy of plan 0165 dropped it
109
+ * along with the rest of eess's `RuleBuilder`.
110
+ *
111
+ * Stateless by construction, which is why it can live here while the kernel keeps
112
+ * its own copy: it reads `getElements()` and `_predicates` and returns a plain
113
+ * object. The duplication that matters — and that Phase 1 measured breaking — is
114
+ * module-level STATE, not a pure method.
115
+ *
116
+ * @param opts.label - human-readable name of this side ("diagram class")
117
+ * @param opts.identify - map an element to its message metadata (name/file/line)
118
+ */
119
+ select(opts) {
120
+ const filtered = this.getElements().filter((element) => this._predicates.every((predicate) => predicate.test(element)));
121
+ return { elements: filtered, label: opts.label, identify: opts.identify };
122
+ }
123
+ /** This rule as declared — the input every description and advice reads. */
124
+ asDeclared() {
125
+ return {
126
+ predicates: this._predicates,
127
+ conditions: this._conditions,
128
+ misplaced: this._misplaced,
129
+ reachedShould: this._reachedShould,
130
+ metadata: this._metadata,
131
+ reason: this._reason,
132
+ };
133
+ }
134
+ /**
135
+ * Return a structured description of this rule without executing it.
136
+ * Used by the `explain` CLI subcommand.
137
+ */
138
+ describeRule() {
139
+ return describeRuleOf(this.asDeclared());
140
+ }
141
+ /**
142
+ * Return the subject set this rule would evaluate: the elements matched by
143
+ * the predicate chain (`.that()...`), before any condition runs. Executes the
144
+ * predicate filter and returns the materialized set.
145
+ *
146
+ * Distinct from the abstract `getElements()`, which is the *pre-filter*
147
+ * population. This is the materialization contract (F1, plan 0064) that
148
+ * composable primitives build on — `crossProject().side(selection, keyFn)`
149
+ * keys each subject, and `.expectNonEmpty()` (plan 0064+) asserts the set is
150
+ * non-empty. It does not evaluate conditions and never warns about their
151
+ * absence, so it is safe to call on a bare `.that()` selection.
152
+ *
153
+ * Note (ADR-007): the returned `T` is the builder's element type (e.g. a
154
+ * ts-morph `ClassDeclaration` for `classes()`), so this is an acknowledged
155
+ * raw-node seam for callers that derive keys from subjects.
156
+ */
157
+ subjects() {
158
+ return this.filterElements();
159
+ }
160
+ /**
161
+ * The selector and condition globs this rule declares.
162
+ *
163
+ * `position` is derived, not declared: a predicate registered while
164
+ * `_phase` is `'predicate'` is a selector, one registered after `.should()`
165
+ * is a condition. That is a structural fact about where the code is, which
166
+ * is why it is not on `DeclaredGlob` for an author to get wrong.
167
+ */
168
+ globs() {
169
+ return globsOf(this.asDeclared());
170
+ }
171
+ /**
172
+ * The project this rule was built against.
173
+ *
174
+ * Used by `within()` to create scoped builders, and by `doctor` to find the
175
+ * project to compare globs against — which must be the one the rules
176
+ * actually ran on, not one the CLI guessed at.
177
+ */
178
+ /**
179
+ * Plan 0074: is EVERY condition satisfied by an empty selection?
180
+ *
181
+ * `.every()`, not `.some()` — `andShould()` ANDs, so a rule reading
182
+ * `.should().notExist().andShould().beExported()` still asserts something
183
+ * about subjects that exist, and exempting it on the strength of one
184
+ * cardinality condition would silence the other. 0069's appendix names this
185
+ * as an implementation constraint; the first cut used `.some()`.
186
+ *
187
+ * An empty condition list is NOT exempt: `[].every()` is `true`, and a rule
188
+ * with no conditions is the assertion-less case that its own gate reports.
189
+ */
190
+ assertsCardinality() {
191
+ if (this._conditions.length === 0)
192
+ return false;
193
+ return this._conditions.every((condition) => assertsCardinality(condition));
194
+ }
195
+ /**
196
+ * The project this rule was built against.
197
+ *
198
+ * Public because the empty-project and dead-glob findings are constructed by
199
+ * `TerminalBuilder`, which has no project of its own to consult.
200
+ */
201
+ getProject() {
202
+ return this.project;
203
+ }
204
+ /**
205
+ * Whether this rule asserts anything about the elements it selected.
206
+ *
207
+ * `.that()...` with no `.should()` selects a set and then says nothing about
208
+ * it, so it can never fail — proposal 019. Exposed as a method because
209
+ * `_conditions` is protected and `doctor` must not duck-type a private name.
210
+ *
211
+ * **A misplaced predicate disqualifies the rule even when conditions exist**,
212
+ * which `_conditions.length > 0` alone did not. Measured on the shipped 0.23.0
213
+ * branch, and it is the worst shape of the seven rather than a corner:
214
+ *
215
+ * functions(p).that().haveNameMatching(/^parse/).should().notExist().areAsync()
216
+ * subjects 4 -> 0 violations 4 -> 0 diagnose() [] check() passes
217
+ *
218
+ * `areAsync()` after `.should()` lands in `addPredicate` and retroactively
219
+ * narrows the set every condition is evaluated over — here to nothing, so
220
+ * `notExist` holds vacuously. The rule reads as deliberate, its description
221
+ * reads as deliberate, and it certifies nothing. Every other assertion-less
222
+ * shape at least looks unfinished; this one does not, so the author has no
223
+ * reason to look. Under ADR-008 the finding is not optional: the remedy is
224
+ * one method call and nothing about it is a judgement call.
225
+ */
226
+ assertsSomething() {
227
+ return this._conditions.length > 0 && this._misplaced.length === 0;
228
+ }
229
+ /**
230
+ * Three assertion-less states, three remedies (plan 0070). Branching on
231
+ * `_reachedShould`/`_misplaced`, never `_phase` — `.should().that()` lands
232
+ * in the predicate phase having reached `.should()`, and would be told a
233
+ * verifiable falsehood by any phase-derived message.
234
+ */
235
+ assertionAdvice() {
236
+ return assertionAdviceOf(this.asDeclared());
237
+ }
238
+ /**
239
+ * The root's collection hook. `evaluate()` is this builder's pipeline —
240
+ * filter by predicates, run conditions, add the empty-selector finding —
241
+ * and the root's terminal methods do the rest.
242
+ */
243
+ collectViolations() {
244
+ // Plan 0098. The unit is the POST-predicate set — what the conditions
245
+ // actually receive — not `getElements()`. `filterElements()` is memoized per
246
+ // builder (`element-cache.ts`), so asking here and again inside `evaluate()`
247
+ // walks once.
248
+ return { violations: this.evaluate(), examined: this.examinedUnits() };
249
+ }
250
+ /**
251
+ * Units this rule examined — plan 0098: the POST-predicate subjects, which is
252
+ * exactly what `subjects()` returns and what the conditions receive.
253
+ *
254
+ * Public for the same structural reason as `assertsSomething()`: `diagnose()`
255
+ * reads it through a structural interface and a protected member cannot
256
+ * satisfy one. One definition, two readers — `collectViolations()` above and
257
+ * the preview — so the number the gate carries and the number the preview
258
+ * reports cannot drift apart.
259
+ */
260
+ examinedUnits() {
261
+ return this.filterElements().length;
262
+ }
263
+ // --- Protected: for subclasses ---
264
+ /**
265
+ * Register a predicate. Called by concrete builder methods like
266
+ * `.haveNameMatching()`, `.extend()`, etc.
267
+ */
268
+ addPredicate(predicate) {
269
+ const next = this.copy();
270
+ next._predicates.push(predicate);
271
+ // A predicate-only method used after `.should()` (dual-use methods
272
+ // dispatch to conditions in that phase and never land here). Recorded so
273
+ // the assertion-less remedy can say "move it before .should()" — the one
274
+ // state whose fix is not "add a condition" (plan 0070, state 2).
275
+ if (next._phase === 'condition') {
276
+ next._misplaced.push(predicate.description);
277
+ }
278
+ return next;
279
+ }
280
+ /**
281
+ * Register a condition. Called by concrete builder methods like
282
+ * `.notContain()`, `.notExist()`, etc.
283
+ */
284
+ addCondition(condition) {
285
+ const next = this.copy();
286
+ next._conditions.push(condition);
287
+ return next;
288
+ }
289
+ /**
290
+ * An independent copy, carrying **both** lists. See `TerminalBuilder.copy`.
291
+ *
292
+ * Nothing on this class clears the conditions any more (bug 0020): a rule
293
+ * that asserted something must never be turned into one that asserts nothing
294
+ * by a chain method, which is what `.should()` used to do via `fork()`.
295
+ * `.should().beExported().that().areAsync()` keeps `beExported`, and a second
296
+ * `.should()` accumulates exactly as `.andShould()` does.
297
+ */
298
+ copy() {
299
+ const clone = super.copy();
300
+ clone._predicates = [...this._predicates];
301
+ clone._conditions = [...this._conditions];
302
+ clone._misplaced = [...this._misplaced];
303
+ return clone;
304
+ }
305
+ /**
306
+ * A copy carrying everything, including the conditions, with `_reason`
307
+ * resolved from metadata. The only caller is `.should()`.
308
+ *
309
+ * **The name is historical.** It used to clear the conditions, which is what
310
+ * distinguished it from `copy()`, and that clearing was
311
+ * [bug 0156](../../../../work/bugs/0156-should-twice-silently-drops-the-first-assertion.md):
312
+ * a second `.should()` on a builder that already carried a condition discarded
313
+ * it, so `.should().notExist().should().beExported()` enforced only the second
314
+ * and lost four findings with no output. Measured. Removed in 0.23.0 —
315
+ * conditions accumulate, and a second `.should()` behaves as `.andShould()`.
316
+ *
317
+ * What is left is `copy()` plus the `_reason` resolution, so the method is now
318
+ * thin enough to inline. It stays because it is `protected` on an exported
319
+ * class: deleting it is a compile break for an external subclass that
320
+ * overrides or calls it, which is the same compatibility argument that keeps
321
+ * `globs()` concrete and `assertsSomething()` exempt-by-default. Do not read
322
+ * the name as a description of the behaviour.
323
+ */
324
+ fork() {
325
+ const fork = this.copy();
326
+ fork._reason = fork._metadata?.because ?? this._reason;
327
+ return fork;
328
+ }
329
+ // --- Private: execution engine ---
330
+ /**
331
+ * Materialize the subject set: all elements narrowed by the predicate chain
332
+ * (the post-`.that()` set), before any condition runs. Shared by the
333
+ * `RuleBuilder` execution pipeline (`evaluate`) and the public `subjects()`
334
+ * accessor so those two cannot diverge (F1). Note: a few builders keep their
335
+ * own separate materialization for other paths (e.g. `CallRuleBuilder`'s
336
+ * `within()` matcher) — those are not routed through here.
337
+ */
338
+ filterElements() {
339
+ // AND semantics — every predicate must match.
340
+ return this.getElements().filter((element) => this._predicates.every((predicate) => predicate.test(element)));
341
+ }
342
+ /**
343
+ * Build the config-level meta-finding for an empty selector under
344
+ * `.expectNonEmpty()`. A typed literal (no `createViolation` — there is no
345
+ * Node), ADR-005-clean, flagged `bypassFilters` so diff/baseline keep it.
346
+ */
347
+ emptySelectionViolation() {
348
+ const description = buildRuleDescription(this.asDeclared()) || 'selector';
349
+ // The TEXT comes from the shared producer; the ATTRIBUTION stays here.
350
+ //
351
+ // Plan 0099 keeps this family's block because it is the better-attributed
352
+ // implementation — it names the chain and carries the author's `because`.
353
+ // What it must not keep is its own wording: two texts for one state is the
354
+ // plan-0070 drift shape, and its copy carried the three defects 0098's
355
+ // user-perspective review found.
356
+ //
357
+ // Fields are assigned LITERALLY rather than spread, and that is not style.
358
+ // The config-finding census scans for a `bypassFilters: true`
359
+ // PropertyAssignment and for a literal `suggestion`; a spread made this
360
+ // producer invisible to it, which silently dropped its census row — through
361
+ // the exact route the census docstring claims is impossible ("no spreads that
362
+ // introduce the flag"). Review measured that regression.
363
+ //
364
+ // `element` keeps the rule id: unlike the expiry finding, N rules that cannot
365
+ // enforce ARE one edit, so `dedupeConfigFindings` collapsing them is correct.
366
+ const shared = this.zeroSubjectsViolation(this.project);
367
+ return {
368
+ rule: description,
369
+ ruleId: this._metadata?.id,
370
+ element: this._metadata?.id ?? description,
371
+ file: '',
372
+ line: 0,
373
+ message: shared.message,
374
+ suggestion: shared.suggestion,
375
+ // The author's rationale, which the shared producer has no access to. Not
376
+ // their `suggestion`/`docs` (bug 0021): this finding says the selector
377
+ // matched nothing, and the author's remedy is for a violation of the rule.
378
+ because: this._reason,
379
+ bypassFilters: true,
380
+ };
381
+ }
382
+ /**
383
+ * Execute the full pipeline: filter elements with predicates,
384
+ * evaluate conditions, return violations.
385
+ */
386
+ evaluate() {
387
+ // Step 1+2: Get elements and narrow by predicates (see filterElements).
388
+ const filtered = this.filterElements();
389
+ // Step 3: the selection is empty — a FAULT by default since plan 0074.
390
+ //
391
+ // The inversion R3b exists for. A condition reports a violation when SOME
392
+ // subject fails; over an empty set that is vacuously false, so every rule
393
+ // passed and the suite counted it as coverage. `.expectNonEmpty()` was the
394
+ // opt-in, and terminal-builder.ts records why that was not enough: it is
395
+ // "the opt-in this whole plan exists because nobody uses".
396
+ //
397
+ // Read the exemptions in this order — most specific first.
398
+ if (filtered.length === 0) {
399
+ // The author said so, in the rule, where a reader sees it. Not a
400
+ // silencer: the non-empty branch below fails the day it matches.
401
+ if (this._expectEmpty)
402
+ return [];
403
+ // Every condition is satisfied BY emptiness — `.should().notExist()`, the
404
+ // pre-emptive guard. `.every()`, because `andShould()` ANDs.
405
+ if (this.assertsCardinality())
406
+ return [];
407
+ return [this.emptySelectionViolation()];
408
+ }
409
+ // NO expiry branch here. Plan 0099 moved it to the root
410
+ // (`TerminalBuilder.collectWithAssertionGuard`), because this family's copy
411
+ // and the root's would both fire and double-report one fault.
412
+ //
413
+ // The property it enforced is unchanged and is now enforced for EVERY family
414
+ // rather than this one: a false declaration fails, and — the part plan 0089's
415
+ // review measured — it does not swallow the violations underneath it. The
416
+ // root appends them, so a fanned-out preset id whose one non-empty instance
417
+ // used to replace a genuine `imports "lodash" which matches forbidden` with a
418
+ // config error now reports both.
419
+ // Step 4: Build context for conditions
420
+ const context = this.buildConditionContext();
421
+ // Step 5: Evaluate all conditions (AND — all must pass)
422
+ const violations = [];
423
+ for (const condition of this._conditions) {
424
+ violations.push(...condition.evaluate(filtered, context));
425
+ }
426
+ return violations;
427
+ }
428
+ /**
429
+ * Build the `ConditionContext` passed to each condition.
430
+ *
431
+ * Subclasses with builder-specific context fields (e.g. `CallRuleBuilder`'s
432
+ * `_identifyByArgument`) override this to extend the base context.
433
+ * Call `super.buildConditionContext()` and spread the result.
434
+ */
435
+ buildConditionContext() {
436
+ return {
437
+ rule: buildRuleDescription(this.asDeclared()),
438
+ because: this._reason,
439
+ ruleId: this._metadata?.id,
440
+ suggestion: this._metadata?.suggestion,
441
+ docs: this._metadata?.docs,
442
+ };
443
+ }
444
+ }
445
+ //# sourceMappingURL=rule-builder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rule-builder.js","sourceRoot":"","sources":["../../src/core/rule-builder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ import type { Condition, GlobNode, Predicate, RuleDescription } from '@nielspeter/eess';
2
+ /**
3
+ * A rule as DECLARED — what was chained onto the builder, before anything runs.
4
+ *
5
+ * The description, the imperative and the assertion advice are all functions of
6
+ * this and nothing else. Keeping them as methods only meant the class carried
7
+ * them; they read no evaluation state and call nothing back.
8
+ */
9
+ export interface DeclaredRule {
10
+ readonly predicates: readonly Predicate<unknown>[];
11
+ readonly conditions: readonly Condition<unknown>[];
12
+ readonly misplaced: readonly string[];
13
+ readonly reachedShould: boolean;
14
+ readonly metadata: {
15
+ id?: string;
16
+ imperative?: string;
17
+ suggestion?: string;
18
+ docs?: string;
19
+ } | undefined;
20
+ readonly reason: string | undefined;
21
+ }
22
+ /**
23
+ * Build the rule description from predicates and conditions.
24
+ */
25
+ export declare function buildRuleDescription(declared: DeclaredRule): string;
26
+ /** The value behind `RuleBuilder.globs()`. */
27
+ export declare function globsOf(declared: DeclaredRule): readonly GlobNode[];
28
+ /** The value behind `RuleBuilder.assertionAdvice()`. */
29
+ export declare function assertionAdviceOf(declared: DeclaredRule): string;
30
+ /** The value behind `RuleBuilder.describeRule()`. */
31
+ export declare function describeRuleOf(declared: DeclaredRule): RuleDescription;
32
+ //# sourceMappingURL=rule-declaration.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rule-declaration.d.ts","sourceRoot":"","sources":["../../src/core/rule-declaration.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,SAAS,EAET,QAAQ,EACR,SAAS,EACT,eAAe,EAChB,MAAM,kBAAkB,CAAA;AAmBzB;;;;;;GAMG;AACH,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,UAAU,EAAE,SAAS,SAAS,CAAC,OAAO,CAAC,EAAE,CAAA;IAClD,QAAQ,CAAC,UAAU,EAAE,SAAS,SAAS,CAAC,OAAO,CAAC,EAAE,CAAA;IAClD,QAAQ,CAAC,SAAS,EAAE,SAAS,MAAM,EAAE,CAAA;IACrC,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAA;IAC/B,QAAQ,CAAC,QAAQ,EACb;QAAE,EAAE,CAAC,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,GACxE,SAAS,CAAA;IACb,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAA;CACpC;AAkCD;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,YAAY,GAAG,MAAM,CAOnE;AAwBD,8CAA8C;AAC9C,wBAAgB,OAAO,CAAC,QAAQ,EAAE,YAAY,GAAG,SAAS,QAAQ,EAAE,CAgCnE;AAED,wDAAwD;AACxD,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,YAAY,GAAG,MAAM,CAchE;AAED,qDAAqD;AACrD,wBAAgB,cAAc,CAAC,QAAQ,EAAE,YAAY,GAAG,eAAe,CAStE"}
@@ -0,0 +1,126 @@
1
+ import { countDeclaredGlobs, stampGlobs } from '@nielspeter/eess';
2
+ /**
3
+ * Where a glob was written, for the message.
4
+ *
5
+ * The predicate's own description already names the API and the glob
6
+ * (`reside in folder matching "**\/src/x/**"`), so the origin is that
7
+ * description unless one predicate declared several globs — in which case the
8
+ * glob is appended to tell them apart.
9
+ */
10
+ function describeOrigin(description, glob, siteCount) {
11
+ // Keyed on the COUNT, not on whether the description happens to contain the
12
+ // glob. A variadic predicate's description contains every one of its globs
13
+ // (`import from "**/a/**", "**/b/**"`), so a substring test collapsed the
14
+ // one case this exists to separate.
15
+ return siteCount > 1 ? `${description} ("${glob.glob}")` : description;
16
+ }
17
+ /**
18
+ * Advice for predicates that landed after `.should()`.
19
+ *
20
+ * Extracted from {@link assertionAdvice} so that method reads as its three
21
+ * outcomes rather than as one of them. Two remedies live here, and the
22
+ * distinction is the point: with conditions present the rule is not
23
+ * "asserting nothing" — it asserts something over a set the misplaced
24
+ * predicate silently shrank, which is a different fault and a different fix
25
+ * (move it; do NOT add another condition). Telling that author to "add a
26
+ * condition" names a fix that leaves the rule exactly as broken (ADR-008
27
+ * rule 2).
28
+ */
29
+ function misplacedPredicateAdvice(declared) {
30
+ const names = declared.misplaced.map((d) => `"${d}"`).join(', ');
31
+ const one = declared.misplaced.length === 1;
32
+ const verb = one ? 'is a predicate, which filters' : 'are predicates, which filter';
33
+ const it = one ? 'it' : 'them';
34
+ if (declared.conditions.length > 0) {
35
+ return (`this rule's ${names} ${verb} subjects rather than asserting anything about them, ` +
36
+ `and ${one ? 'it comes' : 'they come'} after .should() — so ${it} narrowed the ` +
37
+ "selection this rule's conditions are evaluated over, and if that narrowed it to " +
38
+ `nothing the conditions hold vacuously. Move ${it} before .should(), where the ` +
39
+ 'filtering is explicit.');
40
+ }
41
+ return (`this rule asserts nothing: ${names} ${verb} subjects rather than asserting ` +
42
+ `anything about them. Move ${it} before .should(), then add a condition.`);
43
+ }
44
+ /**
45
+ * Build the rule description from predicates and conditions.
46
+ */
47
+ export function buildRuleDescription(declared) {
48
+ const predicateDesc = declared.predicates.map((p) => p.description).join(' and ');
49
+ const conditionDesc = declared.conditions.map((c) => c.description).join(' and ');
50
+ const parts = [];
51
+ if (predicateDesc)
52
+ parts.push(`that ${predicateDesc}`);
53
+ if (conditionDesc)
54
+ parts.push(`should ${conditionDesc}`);
55
+ return parts.join(' ');
56
+ }
57
+ /**
58
+ * Build an imperative "Do NOT … / MUST …" sentence for AI-agent system
59
+ * prompts (`explain --format agent`). Heuristic FALLBACK — a rule author's
60
+ * `.rule({ imperative })` overrides it.
61
+ */
62
+ function buildImperative(declared) {
63
+ // The Do-NOT/MUST transform only reads the polarity of a single condition.
64
+ // For zero or multiple (`and`-joined) conditions, negating the joined string
65
+ // would mis-handle mixed polarity ("not X and not Y"), so fall back to the
66
+ // plain, always-correct rule description.
67
+ const [only] = declared.conditions;
68
+ if (declared.conditions.length !== 1 || only === undefined) {
69
+ return buildRuleDescription(declared) || 'Follow the architecture rule.';
70
+ }
71
+ const cond = only.description;
72
+ const isNegative = /^(not|no)\b/i.test(cond);
73
+ const body = cond.replace(/^(not|no)\s+/i, '');
74
+ const scope = declared.predicates.map((p) => p.description).join(' and ');
75
+ const scopeSuffix = scope ? ` (in code that ${scope})` : '';
76
+ return `${isNegative ? 'Do NOT' : 'MUST'} ${body}${scopeSuffix}`;
77
+ }
78
+ /** The value behind `RuleBuilder.globs()`. */
79
+ export function globsOf(declared) {
80
+ const trees = [];
81
+ for (const predicate of declared.predicates) {
82
+ if (predicate.globs) {
83
+ const count = countDeclaredGlobs(predicate.globs);
84
+ trees.push(stampGlobs(predicate.globs, 'selector', (g) =>
85
+ // A preset's `originLabel` names the option the user wrote rather
86
+ // than the calls it expanded into. Used VERBATIM, skipping
87
+ // `describeOrigin`: that appends `("glob")` to disambiguate a
88
+ // predicate holding several sites, and a label already names
89
+ // exactly one option and one glob — left in, the finding read
90
+ // `shared: "**/x/**" ("**/x/**")`.
91
+ predicate.originLabel ?? describeOrigin(predicate.description, g, count)));
92
+ }
93
+ }
94
+ for (const condition of declared.conditions) {
95
+ if (condition.globs) {
96
+ const count = countDeclaredGlobs(condition.globs);
97
+ trees.push(stampGlobs(condition.globs, 'condition', (g) => describeOrigin(condition.description, g, count)));
98
+ }
99
+ }
100
+ return trees;
101
+ }
102
+ /** The value behind `RuleBuilder.assertionAdvice()`. */
103
+ export function assertionAdviceOf(declared) {
104
+ if (!declared.reachedShould) {
105
+ return ('this rule never reached .should(), so it asserts nothing and can never fail. ' +
106
+ 'Add .should() and a condition, or delete the rule.');
107
+ }
108
+ if (declared.misplaced.length > 0)
109
+ return misplacedPredicateAdvice(declared);
110
+ return ('this rule reached .should() but no condition follows, so it asserts nothing and can ' +
111
+ 'never fail. Add a condition after .should() — or, if this rule is generated from ' +
112
+ 'configuration, skip generating it when there is nothing to assert; if it comes from ' +
113
+ 'a preset (ruleId "preset/..."), report it to the preset\'s author.');
114
+ }
115
+ /** The value behind `RuleBuilder.describeRule()`. */
116
+ export function describeRuleOf(declared) {
117
+ return {
118
+ rule: buildRuleDescription(declared),
119
+ id: declared.metadata?.id,
120
+ because: declared.reason,
121
+ suggestion: declared.metadata?.suggestion,
122
+ docs: declared.metadata?.docs,
123
+ imperative: declared.metadata?.imperative ?? buildImperative(declared),
124
+ };
125
+ }
126
+ //# sourceMappingURL=rule-declaration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rule-declaration.js","sourceRoot":"","sources":["../../src/core/rule-declaration.ts"],"names":[],"mappings":"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"}