@nielspeter/eess-ts 0.2.1 → 0.5.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 (467) 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 +75 -32
  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 +141 -55
  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 +385 -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 +182 -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 +177 -39
  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 +16 -19
  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 +243 -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 +109 -42
  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 +8 -3
  55. package/dist/cli/commands/baseline.d.ts.map +1 -1
  56. package/dist/cli/commands/baseline.js +111 -7
  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 +385 -47
  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 +47 -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 +101 -43
  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 +25 -32
  85. package/dist/cli/load-rules.js.map +1 -1
  86. package/dist/cli/resolve-config.d.ts +0 -8
  87. package/dist/cli/resolve-config.d.ts.map +1 -1
  88. package/dist/cli/resolve-config.js +25 -55
  89. package/dist/cli/resolve-config.js.map +1 -1
  90. package/dist/cli/rule-file-findings.d.ts +178 -0
  91. package/dist/cli/rule-file-findings.d.ts.map +1 -0
  92. package/dist/cli/rule-file-findings.js +351 -0
  93. package/dist/cli/rule-file-findings.js.map +1 -0
  94. package/dist/cli/watch.d.ts +17 -34
  95. package/dist/cli/watch.d.ts.map +1 -1
  96. package/dist/cli/watch.js +14 -129
  97. package/dist/cli/watch.js.map +1 -1
  98. package/dist/conditions/body-analysis-function.d.ts.map +1 -1
  99. package/dist/conditions/body-analysis-function.js +16 -7
  100. package/dist/conditions/body-analysis-function.js.map +1 -1
  101. package/dist/conditions/body-analysis-module.d.ts.map +1 -1
  102. package/dist/conditions/body-analysis-module.js +14 -9
  103. package/dist/conditions/body-analysis-module.js.map +1 -1
  104. package/dist/conditions/body-analysis.d.ts.map +1 -1
  105. package/dist/conditions/body-analysis.js +16 -7
  106. package/dist/conditions/body-analysis.js.map +1 -1
  107. package/dist/conditions/call.d.ts.map +1 -1
  108. package/dist/conditions/call.js +41 -19
  109. package/dist/conditions/call.js.map +1 -1
  110. package/dist/conditions/catch-analysis.d.ts +2 -1
  111. package/dist/conditions/catch-analysis.d.ts.map +1 -1
  112. package/dist/conditions/catch-analysis.js.map +1 -1
  113. package/dist/conditions/cross-layer.d.ts +2 -10
  114. package/dist/conditions/cross-layer.d.ts.map +1 -1
  115. package/dist/conditions/cross-layer.js +227 -23
  116. package/dist/conditions/cross-layer.js.map +1 -1
  117. package/dist/conditions/dependency.d.ts +35 -6
  118. package/dist/conditions/dependency.d.ts.map +1 -1
  119. package/dist/conditions/dependency.js +299 -45
  120. package/dist/conditions/dependency.js.map +1 -1
  121. package/dist/conditions/exports.d.ts.map +1 -1
  122. package/dist/conditions/exports.js +41 -37
  123. package/dist/conditions/exports.js.map +1 -1
  124. package/dist/conditions/function.d.ts.map +1 -1
  125. package/dist/conditions/function.js +19 -5
  126. package/dist/conditions/function.js.map +1 -1
  127. package/dist/conditions/helpers.d.ts +2 -1
  128. package/dist/conditions/helpers.d.ts.map +1 -1
  129. package/dist/conditions/helpers.js +4 -1
  130. package/dist/conditions/helpers.js.map +1 -1
  131. package/dist/conditions/jsx.d.ts.map +1 -1
  132. package/dist/conditions/jsx.js +7 -2
  133. package/dist/conditions/jsx.js.map +1 -1
  134. package/dist/conditions/match-identity.d.ts +43 -0
  135. package/dist/conditions/match-identity.d.ts.map +1 -0
  136. package/dist/conditions/match-identity.js +43 -0
  137. package/dist/conditions/match-identity.js.map +1 -0
  138. package/dist/conditions/members.d.ts.map +1 -1
  139. package/dist/conditions/members.js +20 -6
  140. package/dist/conditions/members.js.map +1 -1
  141. package/dist/conditions/reverse-dependency.d.ts +18 -5
  142. package/dist/conditions/reverse-dependency.d.ts.map +1 -1
  143. package/dist/conditions/reverse-dependency.js +155 -93
  144. package/dist/conditions/reverse-dependency.js.map +1 -1
  145. package/dist/conditions/slice.d.ts +86 -2
  146. package/dist/conditions/slice.d.ts.map +1 -1
  147. package/dist/conditions/slice.js +234 -53
  148. package/dist/conditions/slice.js.map +1 -1
  149. package/dist/conditions/structural.d.ts.map +1 -1
  150. package/dist/conditions/structural.js +16 -4
  151. package/dist/conditions/structural.js.map +1 -1
  152. package/dist/core/check-all.d.ts +19 -0
  153. package/dist/core/check-all.d.ts.map +1 -0
  154. package/dist/core/check-all.js +150 -0
  155. package/dist/core/check-all.js.map +1 -0
  156. package/dist/core/combinators.d.ts +48 -0
  157. package/dist/core/combinators.d.ts.map +1 -0
  158. package/dist/core/combinators.js +49 -0
  159. package/dist/core/combinators.js.map +1 -0
  160. package/dist/core/descendant-cache.d.ts +36 -0
  161. package/dist/core/descendant-cache.d.ts.map +1 -0
  162. package/dist/core/descendant-cache.js +117 -0
  163. package/dist/core/descendant-cache.js.map +1 -0
  164. package/dist/core/diagnose.d.ts +234 -0
  165. package/dist/core/diagnose.d.ts.map +1 -0
  166. package/dist/core/diagnose.js +390 -0
  167. package/dist/core/diagnose.js.map +1 -0
  168. package/dist/core/disk-set.d.ts +48 -0
  169. package/dist/core/disk-set.d.ts.map +1 -0
  170. package/dist/core/disk-set.js +218 -0
  171. package/dist/core/disk-set.js.map +1 -0
  172. package/dist/core/element-cache.d.ts +75 -0
  173. package/dist/core/element-cache.d.ts.map +1 -0
  174. package/dist/core/element-cache.js +32 -0
  175. package/dist/core/element-cache.js.map +1 -0
  176. package/dist/core/empty-project-advice.d.ts +75 -0
  177. package/dist/core/empty-project-advice.d.ts.map +1 -0
  178. package/dist/core/empty-project-advice.js +61 -0
  179. package/dist/core/empty-project-advice.js.map +1 -0
  180. package/dist/core/exclusion-comments.d.ts +19 -0
  181. package/dist/core/exclusion-comments.d.ts.map +1 -0
  182. package/dist/core/exclusion-comments.js +7 -0
  183. package/dist/core/exclusion-comments.js.map +1 -0
  184. package/dist/core/execute-rule.d.ts +158 -0
  185. package/dist/core/execute-rule.d.ts.map +1 -0
  186. package/dist/core/execute-rule.js +666 -0
  187. package/dist/core/execute-rule.js.map +1 -0
  188. package/dist/core/glob-diagnosis.d.ts +78 -0
  189. package/dist/core/glob-diagnosis.d.ts.map +1 -0
  190. package/dist/core/glob-diagnosis.js +134 -0
  191. package/dist/core/glob-diagnosis.js.map +1 -0
  192. package/dist/core/glob-evaluator.d.ts +48 -0
  193. package/dist/core/glob-evaluator.d.ts.map +1 -0
  194. package/dist/core/glob-evaluator.js +89 -0
  195. package/dist/core/glob-evaluator.js.map +1 -0
  196. package/dist/core/import-candidates.d.ts +60 -0
  197. package/dist/core/import-candidates.d.ts.map +1 -0
  198. package/dist/core/import-candidates.js +93 -0
  199. package/dist/core/import-candidates.js.map +1 -0
  200. package/dist/core/import-options.d.ts +55 -2
  201. package/dist/core/import-options.d.ts.map +1 -1
  202. package/dist/core/import-options.js +64 -0
  203. package/dist/core/import-options.js.map +1 -1
  204. package/dist/core/invalidate-on-modify.d.ts +20 -0
  205. package/dist/core/invalidate-on-modify.d.ts.map +1 -0
  206. package/dist/core/invalidate-on-modify.js +26 -0
  207. package/dist/core/invalidate-on-modify.js.map +1 -0
  208. package/dist/core/line-index.d.ts +3 -0
  209. package/dist/core/line-index.d.ts.map +1 -0
  210. package/dist/core/line-index.js +227 -0
  211. package/dist/core/line-index.js.map +1 -0
  212. package/dist/core/metric-violation.d.ts +86 -0
  213. package/dist/core/metric-violation.d.ts.map +1 -0
  214. package/dist/core/metric-violation.js +132 -0
  215. package/dist/core/metric-violation.js.map +1 -0
  216. package/dist/core/module-edges.d.ts +361 -0
  217. package/dist/core/module-edges.d.ts.map +1 -0
  218. package/dist/core/module-edges.js +593 -0
  219. package/dist/core/module-edges.js.map +1 -0
  220. package/dist/core/object-literal-functions.d.ts +42 -0
  221. package/dist/core/object-literal-functions.d.ts.map +1 -0
  222. package/dist/core/object-literal-functions.js +75 -0
  223. package/dist/core/object-literal-functions.js.map +1 -0
  224. package/dist/core/orphan-exclusions.d.ts +44 -0
  225. package/dist/core/orphan-exclusions.d.ts.map +1 -0
  226. package/dist/core/orphan-exclusions.js +224 -0
  227. package/dist/core/orphan-exclusions.js.map +1 -0
  228. package/dist/core/pair-condition.d.ts +32 -3
  229. package/dist/core/pair-condition.d.ts.map +1 -1
  230. package/dist/core/path-universe.d.ts +22 -0
  231. package/dist/core/path-universe.d.ts.map +1 -0
  232. package/dist/core/path-universe.js +45 -0
  233. package/dist/core/path-universe.js.map +1 -0
  234. package/dist/core/per-root-compiler-options.d.ts +20 -0
  235. package/dist/core/per-root-compiler-options.d.ts.map +1 -0
  236. package/dist/core/per-root-compiler-options.js +57 -0
  237. package/dist/core/per-root-compiler-options.js.map +1 -0
  238. package/dist/core/project-relative.d.ts +98 -0
  239. package/dist/core/project-relative.d.ts.map +1 -0
  240. package/dist/core/project-relative.js +185 -0
  241. package/dist/core/project-relative.js.map +1 -0
  242. package/dist/core/project.d.ts +7 -1
  243. package/dist/core/project.d.ts.map +1 -1
  244. package/dist/core/project.js +29 -4
  245. package/dist/core/project.js.map +1 -1
  246. package/dist/core/rule-builder.d.ts +303 -0
  247. package/dist/core/rule-builder.d.ts.map +1 -0
  248. package/dist/core/rule-builder.js +463 -0
  249. package/dist/core/rule-builder.js.map +1 -0
  250. package/dist/core/rule-declaration.d.ts +32 -0
  251. package/dist/core/rule-declaration.d.ts.map +1 -0
  252. package/dist/core/rule-declaration.js +88 -0
  253. package/dist/core/rule-declaration.js.map +1 -0
  254. package/dist/core/terminal-builder.d.ts +629 -0
  255. package/dist/core/terminal-builder.d.ts.map +1 -0
  256. package/dist/core/terminal-builder.js +807 -0
  257. package/dist/core/terminal-builder.js.map +1 -0
  258. package/dist/core/terminal-execution.d.ts +39 -0
  259. package/dist/core/terminal-execution.d.ts.map +1 -0
  260. package/dist/core/terminal-execution.js +103 -0
  261. package/dist/core/terminal-execution.js.map +1 -0
  262. package/dist/core/ts-comment-mask.d.ts +2 -0
  263. package/dist/core/ts-comment-mask.d.ts.map +1 -0
  264. package/dist/core/ts-comment-mask.js +102 -0
  265. package/dist/core/ts-comment-mask.js.map +1 -0
  266. package/dist/core/vacuity-diagnosis.d.ts +103 -0
  267. package/dist/core/vacuity-diagnosis.d.ts.map +1 -0
  268. package/dist/core/vacuity-diagnosis.js +415 -0
  269. package/dist/core/vacuity-diagnosis.js.map +1 -0
  270. package/dist/core/violation.d.ts +16 -11
  271. package/dist/core/violation.d.ts.map +1 -1
  272. package/dist/core/violation.js +33 -13
  273. package/dist/core/violation.js.map +1 -1
  274. package/dist/graphql/graphql-rule-builder.d.ts +95 -0
  275. package/dist/graphql/graphql-rule-builder.d.ts.map +1 -0
  276. package/dist/graphql/graphql-rule-builder.js +127 -0
  277. package/dist/graphql/graphql-rule-builder.js.map +1 -0
  278. package/dist/graphql/index.d.ts +1 -0
  279. package/dist/graphql/index.d.ts.map +1 -1
  280. package/dist/graphql/index.js +2 -1
  281. package/dist/graphql/index.js.map +1 -1
  282. package/dist/graphql/resolver-rule-builder.d.ts +44 -23
  283. package/dist/graphql/resolver-rule-builder.d.ts.map +1 -1
  284. package/dist/graphql/resolver-rule-builder.js +80 -72
  285. package/dist/graphql/resolver-rule-builder.js.map +1 -1
  286. package/dist/graphql/schema-loader.d.ts +21 -0
  287. package/dist/graphql/schema-loader.d.ts.map +1 -1
  288. package/dist/graphql/schema-loader.js +82 -12
  289. package/dist/graphql/schema-loader.js.map +1 -1
  290. package/dist/graphql/schema-predicates.d.ts.map +1 -1
  291. package/dist/graphql/schema-predicates.js +17 -12
  292. package/dist/graphql/schema-predicates.js.map +1 -1
  293. package/dist/graphql/schema-rule-builder.d.ts +15 -24
  294. package/dist/graphql/schema-rule-builder.d.ts.map +1 -1
  295. package/dist/graphql/schema-rule-builder.js +39 -77
  296. package/dist/graphql/schema-rule-builder.js.map +1 -1
  297. package/dist/helpers/baseline-diagnostics.d.ts +45 -0
  298. package/dist/helpers/baseline-diagnostics.d.ts.map +1 -0
  299. package/dist/helpers/baseline-diagnostics.js +168 -0
  300. package/dist/helpers/baseline-diagnostics.js.map +1 -0
  301. package/dist/helpers/baseline-generator.d.ts +28 -0
  302. package/dist/helpers/baseline-generator.d.ts.map +1 -0
  303. package/dist/helpers/baseline-generator.js +27 -0
  304. package/dist/helpers/baseline-generator.js.map +1 -0
  305. package/dist/helpers/baseline.d.ts +336 -0
  306. package/dist/helpers/baseline.d.ts.map +1 -0
  307. package/dist/helpers/baseline.js +664 -0
  308. package/dist/helpers/baseline.js.map +1 -0
  309. package/dist/helpers/body-traversal.d.ts +27 -2
  310. package/dist/helpers/body-traversal.d.ts.map +1 -1
  311. package/dist/helpers/body-traversal.js +135 -16
  312. package/dist/helpers/body-traversal.js.map +1 -1
  313. package/dist/helpers/callback-extractor.d.ts.map +1 -1
  314. package/dist/helpers/callback-extractor.js +53 -84
  315. package/dist/helpers/callback-extractor.js.map +1 -1
  316. package/dist/helpers/complexity.d.ts +13 -5
  317. package/dist/helpers/complexity.d.ts.map +1 -1
  318. package/dist/helpers/complexity.js +15 -6
  319. package/dist/helpers/complexity.js.map +1 -1
  320. package/dist/helpers/diff-aware.d.ts +16 -0
  321. package/dist/helpers/diff-aware.d.ts.map +1 -0
  322. package/dist/helpers/diff-aware.js +16 -0
  323. package/dist/helpers/diff-aware.js.map +1 -0
  324. package/dist/helpers/matchers.d.ts +68 -7
  325. package/dist/helpers/matchers.d.ts.map +1 -1
  326. package/dist/helpers/matchers.js +164 -86
  327. package/dist/helpers/matchers.js.map +1 -1
  328. package/dist/helpers/slice-graph.d.ts +100 -8
  329. package/dist/helpers/slice-graph.d.ts.map +1 -1
  330. package/dist/helpers/slice-graph.js +126 -34
  331. package/dist/helpers/slice-graph.js.map +1 -1
  332. package/dist/helpers/tarjan.d.ts +0 -14
  333. package/dist/helpers/tarjan.d.ts.map +1 -1
  334. package/dist/helpers/tarjan.js +29 -16
  335. package/dist/helpers/tarjan.js.map +1 -1
  336. package/dist/index.d.ts +55 -19
  337. package/dist/index.d.ts.map +1 -1
  338. package/dist/index.js +67 -15
  339. package/dist/index.js.map +1 -1
  340. package/dist/models/arch-call.d.ts +3 -2
  341. package/dist/models/arch-call.d.ts.map +1 -1
  342. package/dist/models/arch-call.js.map +1 -1
  343. package/dist/models/arch-function.d.ts +54 -8
  344. package/dist/models/arch-function.d.ts.map +1 -1
  345. package/dist/models/arch-function.js +145 -8
  346. package/dist/models/arch-function.js.map +1 -1
  347. package/dist/models/arch-jsx-element.d.ts.map +1 -1
  348. package/dist/models/arch-jsx-element.js +18 -19
  349. package/dist/models/arch-jsx-element.js.map +1 -1
  350. package/dist/models/slice.d.ts +33 -9
  351. package/dist/models/slice.d.ts.map +1 -1
  352. package/dist/models/slice.js +129 -19
  353. package/dist/models/slice.js.map +1 -1
  354. package/dist/predicates/call.d.ts.map +1 -1
  355. package/dist/predicates/call.js +5 -0
  356. package/dist/predicates/call.js.map +1 -1
  357. package/dist/predicates/identity.d.ts +21 -0
  358. package/dist/predicates/identity.d.ts.map +1 -1
  359. package/dist/predicates/identity.js +75 -3
  360. package/dist/predicates/identity.js.map +1 -1
  361. package/dist/predicates/index.d.ts +1 -1
  362. package/dist/predicates/index.d.ts.map +1 -1
  363. package/dist/predicates/index.js +1 -1
  364. package/dist/predicates/index.js.map +1 -1
  365. package/dist/predicates/jsx.d.ts.map +1 -1
  366. package/dist/predicates/jsx.js +2 -1
  367. package/dist/predicates/jsx.js.map +1 -1
  368. package/dist/predicates/metrics.d.ts +4 -2
  369. package/dist/predicates/metrics.d.ts.map +1 -1
  370. package/dist/predicates/metrics.js +4 -2
  371. package/dist/predicates/metrics.js.map +1 -1
  372. package/dist/predicates/module.d.ts +4 -12
  373. package/dist/predicates/module.d.ts.map +1 -1
  374. package/dist/predicates/module.js +57 -37
  375. package/dist/predicates/module.js.map +1 -1
  376. package/dist/presets/agent-guardrails.d.ts +49 -16
  377. package/dist/presets/agent-guardrails.d.ts.map +1 -1
  378. package/dist/presets/agent-guardrails.js +308 -19
  379. package/dist/presets/agent-guardrails.js.map +1 -1
  380. package/dist/presets/boundaries.d.ts +46 -3
  381. package/dist/presets/boundaries.d.ts.map +1 -1
  382. package/dist/presets/boundaries.js +132 -23
  383. package/dist/presets/boundaries.js.map +1 -1
  384. package/dist/presets/data-layer.d.ts +23 -3
  385. package/dist/presets/data-layer.d.ts.map +1 -1
  386. package/dist/presets/data-layer.js +58 -16
  387. package/dist/presets/data-layer.js.map +1 -1
  388. package/dist/presets/index.d.ts +10 -5
  389. package/dist/presets/index.d.ts.map +1 -1
  390. package/dist/presets/index.js +19 -3
  391. package/dist/presets/index.js.map +1 -1
  392. package/dist/presets/layered.d.ts +47 -3
  393. package/dist/presets/layered.d.ts.map +1 -1
  394. package/dist/presets/layered.js +66 -29
  395. package/dist/presets/layered.js.map +1 -1
  396. package/dist/presets/recommended.d.ts +81 -10
  397. package/dist/presets/recommended.d.ts.map +1 -1
  398. package/dist/presets/recommended.js +25 -23
  399. package/dist/presets/recommended.js.map +1 -1
  400. package/dist/presets/shared.d.ts +267 -2
  401. package/dist/presets/shared.d.ts.map +1 -1
  402. package/dist/presets/shared.js +367 -4
  403. package/dist/presets/shared.js.map +1 -1
  404. package/dist/rules/code-quality.d.ts.map +1 -1
  405. package/dist/rules/code-quality.js +15 -6
  406. package/dist/rules/code-quality.js.map +1 -1
  407. package/dist/rules/hygiene.d.ts +1 -1
  408. package/dist/rules/hygiene.js +1 -1
  409. package/dist/rules/metrics-function.d.ts +2 -1
  410. package/dist/rules/metrics-function.d.ts.map +1 -1
  411. package/dist/rules/metrics-function.js +63 -39
  412. package/dist/rules/metrics-function.js.map +1 -1
  413. package/dist/rules/metrics.d.ts +2 -1
  414. package/dist/rules/metrics.d.ts.map +1 -1
  415. package/dist/rules/metrics.js +80 -47
  416. package/dist/rules/metrics.js.map +1 -1
  417. package/dist/smells/clusters.d.ts +78 -0
  418. package/dist/smells/clusters.d.ts.map +1 -0
  419. package/dist/smells/clusters.js +124 -0
  420. package/dist/smells/clusters.js.map +1 -0
  421. package/dist/smells/duplicate-bodies.d.ts +92 -5
  422. package/dist/smells/duplicate-bodies.d.ts.map +1 -1
  423. package/dist/smells/duplicate-bodies.js +203 -73
  424. package/dist/smells/duplicate-bodies.js.map +1 -1
  425. package/dist/smells/duplicate-report.d.ts +90 -0
  426. package/dist/smells/duplicate-report.d.ts.map +1 -0
  427. package/dist/smells/duplicate-report.js +344 -0
  428. package/dist/smells/duplicate-report.js.map +1 -0
  429. package/dist/smells/fingerprint.d.ts +20 -1
  430. package/dist/smells/fingerprint.d.ts.map +1 -1
  431. package/dist/smells/fingerprint.js +27 -3
  432. package/dist/smells/fingerprint.js.map +1 -1
  433. package/dist/smells/inconsistent-siblings.d.ts +128 -7
  434. package/dist/smells/inconsistent-siblings.d.ts.map +1 -1
  435. package/dist/smells/inconsistent-siblings.js +288 -86
  436. package/dist/smells/inconsistent-siblings.js.map +1 -1
  437. package/dist/smells/sibling-files.d.ts +47 -0
  438. package/dist/smells/sibling-files.d.ts.map +1 -0
  439. package/dist/smells/sibling-files.js +104 -0
  440. package/dist/smells/sibling-files.js.map +1 -0
  441. package/dist/smells/similar-pairs.d.ts +28 -0
  442. package/dist/smells/similar-pairs.d.ts.map +1 -0
  443. package/dist/smells/similar-pairs.js +134 -0
  444. package/dist/smells/similar-pairs.js.map +1 -0
  445. package/dist/smells/smell-builder.d.ts +57 -12
  446. package/dist/smells/smell-builder.d.ts.map +1 -1
  447. package/dist/smells/smell-builder.js +112 -14
  448. package/dist/smells/smell-builder.js.map +1 -1
  449. package/dist/smells/variation.d.ts +47 -0
  450. package/dist/smells/variation.d.ts.map +1 -0
  451. package/dist/smells/variation.js +90 -0
  452. package/dist/smells/variation.js.map +1 -0
  453. package/dist/tsconfig/index.d.ts +19 -0
  454. package/dist/tsconfig/index.d.ts.map +1 -0
  455. package/dist/tsconfig/index.js +20 -0
  456. package/dist/tsconfig/index.js.map +1 -0
  457. package/dist/tsconfig/tsconfig-builder.d.ts +42 -9
  458. package/dist/tsconfig/tsconfig-builder.d.ts.map +1 -1
  459. package/dist/tsconfig/tsconfig-builder.js +65 -16
  460. package/dist/tsconfig/tsconfig-builder.js.map +1 -1
  461. package/package.json +4 -2
  462. package/dist/core/module-dependencies.d.ts +0 -28
  463. package/dist/core/module-dependencies.d.ts.map +0 -1
  464. package/dist/core/module-dependencies.js +0 -35
  465. package/dist/core/module-dependencies.js.map +0 -1
  466. package/dist/helpers/within.d.ts.map +0 -1
  467. package/dist/helpers/within.js.map +0 -1
@@ -0,0 +1,234 @@
1
+ import type { ArchProject } from './project.js';
2
+ import type { GlobPosition } from '@nielspeter/eess';
3
+ import type { GlobFault } from './glob-diagnosis.js';
4
+ import type { OnDisk } from './disk-set.js';
5
+ import type { RuleBuilderLike } from '@nielspeter/eess';
6
+ import type { GlobNode } from '@nielspeter/eess';
7
+ /**
8
+ * Anything `diagnose()` can inspect: a rule that can describe its globs.
9
+ *
10
+ * Structural rather than `TerminalBuilder`, so a caller can pass the same
11
+ * `RuleBuilderLike[]` array they already hand to `checkAll` without any
12
+ * of it being coupled to a class.
13
+ */
14
+ export interface DiagnosableRule extends RuleBuilderLike {
15
+ globs?: () => readonly GlobNode[];
16
+ describeRule?: () => {
17
+ rule: string;
18
+ id?: string;
19
+ };
20
+ /**
21
+ * Whether this rule asserts anything about what it selected.
22
+ *
23
+ * A method rather than a look at `_conditions`: that field is protected, and
24
+ * reading it would need a type assertion (ADR-005) to duck-type a private
25
+ * name that no subclass is obliged to keep. Optional, because only the
26
+ * predicate/condition builders can be in the condition-less state at all —
27
+ * the rest take their condition as a constructor argument.
28
+ */
29
+ assertsSomething?: () => boolean;
30
+ /**
31
+ * The remedy for this rule's assertion-less state. When present, `diagnose`
32
+ * reports it VERBATIM as the finding's advice, so the doctor and the
33
+ * configuration finding the gate raises at runtime carry the same string by
34
+ * construction (plan 0070) — they were measured diverging, and two texts for
35
+ * one state is a trust problem for an agent diffing them. Absent, the base
36
+ * `TerminalBuilder` text is used, from the one place that owns it.
37
+ */
38
+ assertionAdvice?: () => string;
39
+ /** The project this rule was built against. */
40
+ getProject?: () => ArchProject | undefined;
41
+ /**
42
+ * How many units this rule's family examined — plan 0096.
43
+ *
44
+ * PUBLIC because `DiagnosableRule` is structural: a protected member cannot
45
+ * satisfy it, which is the recorded reason `assertsSomething()` is public.
46
+ *
47
+ * The unit differs per family and each names its own (ADR-010 part 1), but
48
+ * every family answers it from the SAME method its `collectViolations()` uses
49
+ * — not a parallel derivation. A first attempt at this plan let the two
50
+ * diverge and they disagreed within one commit.
51
+ *
52
+ * Calling it RUNS that materialization. `diagnose()` and `doctor` used to
53
+ * promise they reported "without running any of them"; that sentence changed
54
+ * with this plan, in the docs as well as here.
55
+ */
56
+ examinedUnits?: () => number;
57
+ /**
58
+ * Whether this rule's emptiness was DECLARED — plan 0097, read here by 0096.
59
+ *
60
+ * Public for the same structural reason as `assertsSomething()`. Without it
61
+ * the preview reports a finding on a rule the gate will accept, and tells the
62
+ * reader to do the thing they already did.
63
+ */
64
+ declaresEmpty?: () => boolean;
65
+ /**
66
+ * This rule's own zero-subjects advice — plan 0099.
67
+ *
68
+ * When present, reported VERBATIM, exactly as `assertionAdvice()` is and for
69
+ * the identical reason plan 0070 recorded: the doctor and the finding the gate
70
+ * raises must carry the same string **by construction**, because two texts for
71
+ * one state is a trust problem for an agent diffing them.
72
+ *
73
+ * Measured before this seam existed: `check()` said "a declaration is an
74
+ * assertion, not a silencer" while `doctor` still said "the declaration is not
75
+ * itself checked yet ... A later release makes this state fail at check time" —
76
+ * in the release that makes it fail, on the surface ts-archunit's `docs/upgrading.md` tells
77
+ * people to run first.
78
+ */
79
+ zeroSubjectsAdvice?: () => string;
80
+ /**
81
+ * How this family spells the declaration. Absent means the generic
82
+ * `.expectEmpty()`, which is a `TypeError` on `crossProject` — see
83
+ * `TerminalBuilder.emptyDeclarationAdvice()`.
84
+ */
85
+ emptyDeclarationAdvice?: () => string;
86
+ /**
87
+ * Whether a condition on this rule declares emptiness as its PASSING state —
88
+ * `.notExist()` and friends. Zero examined is the assertion succeeding, so the
89
+ * evidence check must not report it. See `TerminalBuilder.assertsCardinality()`
90
+ * for why this is separate from `declaresEmpty()`.
91
+ */
92
+ assertsCardinality?: () => boolean;
93
+ /**
94
+ * This rule's own adequacy advice — plan 0102.
95
+ *
96
+ * Distinct from `zeroSubjectsAdvice`: that covers `examinedUnits() === 0`.
97
+ * This covers a rule whose evidence is non-empty but which is structurally
98
+ * unable to ever produce a finding as configured (bug 0077(A) — a
99
+ * divergence-policing detector on a majority-less corpus). Returns the empty
100
+ * string for any rule that is not inert, so `diagnose()` reports nothing for
101
+ * a healthy control. Reported VERBATIM, exactly as `zeroSubjectsAdvice` is,
102
+ * for the same plan-0070 reason: the preview and the check-time finding must
103
+ * carry the same string by construction, not two texts for one state.
104
+ */
105
+ inertAdvice?: () => string;
106
+ /**
107
+ * This rule's own deferred-warning advice — plan 0090.
108
+ *
109
+ * A DEFERRED warning (`.asSeverity('warn', { accepted })`) stays `warn` only
110
+ * for violations whose subject is in `accepted`; this reports when a CURRENT
111
+ * violation is not — the exact regression an accepted list exists to catch.
112
+ * Returns `''` for an advisory warning, for a rule at `'error'` severity, and
113
+ * for a deferred warning whose findings are all still accepted, matching
114
+ * `inertAdvice`/`zeroSubjectsAdvice`'s own precedent: reported VERBATIM, so
115
+ * `doctor`'s preview and `checkAll()`/CLI `check`'s eventual failure carry the
116
+ * same string by construction.
117
+ */
118
+ deferredWarningAdvice?: () => string;
119
+ }
120
+ /** One thing wrong with one rule, named specifically enough to fix. */
121
+ export interface DiagnosticFinding {
122
+ /**
123
+ * `'project-empty'` — the project loaded no files, so nothing can match and
124
+ * the globs are not the fault (bug 0031); `'dead-glob'` — a glob that can
125
+ * never match; `'no-condition'` — a rule
126
+ * that asserts nothing; `'project-unknown'` — a rule whose globs could not
127
+ * be checked because it cannot name the project it was built against.
128
+ */
129
+ readonly kind: 'dead-glob' | 'no-condition' | 'project-unknown' | 'project-empty'
130
+ /**
131
+ * A rule that examined **zero units** while its project loaded files, and
132
+ * for which nothing else explained the emptiness — plan 0096.
133
+ *
134
+ * The preview for plan 0098, which makes the same state FAIL. Distinct from
135
+ * `'project-empty'` (the instrument loaded nothing) and from `'dead-glob'`
136
+ * (a glob the author wrote matches nothing): this is the family's OWN
137
+ * filters removing everything, including defaults the author never wrote.
138
+ *
139
+ * It lands in `diagnose()` rather than in `doctor` so that a rule file
140
+ * importing a test runner — which `doctor` cannot load, ADR-009 rule 1's
141
+ * corollary — still gets a preview: `expect(diagnose(rules)).toEqual([])`
142
+ * runs inside the consumer's own suite.
143
+ */
144
+ | 'zero-subjects'
145
+ /**
146
+ * A rule whose evidence is non-empty but which is structurally unable to
147
+ * ever produce a finding as configured — plan 0102. Distinct from
148
+ * `'zero-subjects'`: that fires when `examinedUnits() === 0`; this fires
149
+ * when `examinedUnits() > 0` but the family's own adequacy predicate
150
+ * (`inertAdvice?()`) says the rule can never fail regardless. ADR-009's
151
+ * Notes hand this class to ADR-008 explicitly: "a check can examine 500
152
+ * subjects and still assert nothing worth knowing."
153
+ */
154
+ | 'inert'
155
+ /**
156
+ * An inline `// eess-exclude` comment naming a rule id no rule
157
+ * declares, so it suppresses nothing — [ts-archunit bug 0044](https://github.com/nielspeter/ts-archunit/blob/main/bugs/fixed/0044-an-inline-exclusion-comment-has-no-feedback-channel.md).
158
+ *
159
+ * Produced by `orphanExclusions()`, never by `diagnose()`: it needs every
160
+ * rule at once, and `diagnose()` is called per rule file.
161
+ */
162
+ | 'orphan-exclusion'
163
+ /**
164
+ * A DEFERRED warning (`.asSeverity('warn', { accepted })`) whose current
165
+ * findings are not all covered by `accepted` — plan 0090. The preview for
166
+ * the escalation `.violations()`/`checkAll()`/CLI `check` already apply: one
167
+ * of those findings will report at `error` severity the moment this rule
168
+ * runs. Distinct from `'inert'` and `'zero-subjects'`, which are about
169
+ * whether a rule can ever fail; this is about a rule that already fails,
170
+ * previewed before the run that discovers it does.
171
+ */
172
+ | 'deferred-warning';
173
+ /** The rule's id if it has one, else its assembled description. */
174
+ readonly rule: string;
175
+ /** Where the glob was written: `resideInFolder("**\/src/x/**")`. */
176
+ readonly origin?: string;
177
+ readonly glob?: string;
178
+ readonly position?: GlobPosition;
179
+ readonly fault?: GlobFault;
180
+ readonly onDisk?: OnDisk;
181
+ /** The sanctioned fix, or an honest list of causes where none is verifiable. */
182
+ readonly advice: string;
183
+ /**
184
+ * For `'orphan-exclusion'`, the line the comment sits on.
185
+ */
186
+ readonly line?: number;
187
+ /**
188
+ * For `'orphan-exclusion'`, the **source** file holding the comment.
189
+ *
190
+ * Distinct from `ruleFile`, which names where a *rule* was written. An earlier
191
+ * revision reused `ruleFile` for this and gave JSON consumers two different
192
+ * things under one name depending on `kind`.
193
+ */
194
+ readonly sourceFile?: string;
195
+ /**
196
+ * The rule file this rule was written in, when the caller knows it.
197
+ *
198
+ * `diagnose()` never sets this — it is handed rules, not files, and inventing
199
+ * a path it cannot verify is the thing this library exists to stop. `doctor`
200
+ * sets it, because its loop over rule files is the only place the mapping
201
+ * exists (bug 0026: `docs/cli.md` claimed identities "in which rule" and that
202
+ * was true of a dead glob's position and false of every `no-condition`
203
+ * finding, whose only identity was a prose sentence).
204
+ */
205
+ readonly ruleFile?: string;
206
+ }
207
+ /**
208
+ * Report what each rule cannot enforce, without evaluating their conditions.
209
+ *
210
+ * It DOES materialize each rule's selection, as of plan 0096 — "this rule
211
+ * examined nothing" is a fact about the selection. The docstring said "without
212
+ * running any of them" and that stopped being true; it is the IDE-hover contract
213
+ * for an exported function, so it is corrected here and not only in `docs/`.
214
+ *
215
+ * As of plan 0102, one family's `inertAdvice?()` goes further than selection:
216
+ * `inconsistentSiblings` walks every sibling body's AST to answer it (the same
217
+ * work `check()` does), so for that one family this IS evaluating the
218
+ * condition, not just counting what would be handed to it (review: architect).
219
+ * Still no `Condition.evaluate()` call — the boundary this docstring's
220
+ * predecessor drew — but "without evaluating" is no longer exactly right for
221
+ * every family, and is corrected here rather than left for the next reader to
222
+ * discover by profiling `doctor`.
223
+ *
224
+ * The in-process half of `doctor`. It exists because rules written inside
225
+ * vitest are a co-equal documented path (`docs/running-in-tests.md`), and a
226
+ * CLI-only diagnostic would leave half the users unable to measure before R3
227
+ * flips anything — which is the one job R2a has.
228
+ *
229
+ * Reports **identities, never totals**: which glob, in which rule, at which
230
+ * position. A count is a snapshot, and under ADR-009 rule 4 a snapshot is the
231
+ * thing that rots. Callers who want a number can take `.length`.
232
+ */
233
+ export declare function diagnose(rules: readonly DiagnosableRule[], project?: ArchProject): DiagnosticFinding[];
234
+ //# sourceMappingURL=diagnose.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diagnose.d.ts","sourceRoot":"","sources":["../../src/core/diagnose.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAC/C,OAAO,KAAK,EAAE,YAAY,EAAY,MAAM,kBAAkB,CAAA;AAC9D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAA;AACpD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAA;AAO3C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AACvD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAGhD;;;;;;GAMG;AACH,MAAM,WAAW,eAAgB,SAAQ,eAAe;IACtD,KAAK,CAAC,EAAE,MAAM,SAAS,QAAQ,EAAE,CAAA;IACjC,YAAY,CAAC,EAAE,MAAM;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,EAAE,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;IAClD;;;;;;;;OAQG;IACH,gBAAgB,CAAC,EAAE,MAAM,OAAO,CAAA;IAChC;;;;;;;OAOG;IACH,eAAe,CAAC,EAAE,MAAM,MAAM,CAAA;IAC9B,+CAA+C;IAC/C,UAAU,CAAC,EAAE,MAAM,WAAW,GAAG,SAAS,CAAA;IAC1C;;;;;;;;;;;;;;OAcG;IACH,aAAa,CAAC,EAAE,MAAM,MAAM,CAAA;IAC5B;;;;;;OAMG;IACH,aAAa,CAAC,EAAE,MAAM,OAAO,CAAA;IAE7B;;;;;;;;;;;;;OAaG;IACH,kBAAkB,CAAC,EAAE,MAAM,MAAM,CAAA;IAEjC;;;;OAIG;IACH,sBAAsB,CAAC,EAAE,MAAM,MAAM,CAAA;IAErC;;;;;OAKG;IACH,kBAAkB,CAAC,EAAE,MAAM,OAAO,CAAA;IAElC;;;;;;;;;;;OAWG;IACH,WAAW,CAAC,EAAE,MAAM,MAAM,CAAA;IAE1B;;;;;;;;;;;OAWG;IACH,qBAAqB,CAAC,EAAE,MAAM,MAAM,CAAA;CACrC;AAED,uEAAuE;AACvE,MAAM,WAAW,iBAAiB;IAChC;;;;;;OAMG;IACH,QAAQ,CAAC,IAAI,EACT,WAAW,GACX,cAAc,GACd,iBAAiB,GACjB,eAAe;IACjB;;;;;;;;;;;;;OAaG;OACD,eAAe;IACjB;;;;;;;;OAQG;OACD,OAAO;IACT;;;;;;OAMG;OACD,kBAAkB;IACpB;;;;;;;;OAQG;OACD,kBAAkB,CAAA;IACtB,mEAAmE;IACnE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,oEAAoE;IACpE,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,QAAQ,CAAC,EAAE,YAAY,CAAA;IAChC,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,CAAA;IAC1B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;IACxB,gFAAgF;IAChF,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB;;OAEG;IACH,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;IACtB;;;;;;OAMG;IACH,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAA;IAC5B;;;;;;;;;OASG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAC3B;AAED;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,QAAQ,CACtB,KAAK,EAAE,SAAS,eAAe,EAAE,EACjC,OAAO,CAAC,EAAE,WAAW,GACpB,iBAAiB,EAAE,CA2MrB"}
@@ -0,0 +1,390 @@
1
+ import { TerminalBuilder } from './terminal-builder.js';
2
+ import { diagnoseGlob, syntacticFault, FAULT_ADVICE, ON_DISK_ADVICE } from './glob-diagnosis.js';
3
+ import { globSitesOf, isDeadSite } from './glob-evaluator.js';
4
+ import { pathUniverse } from './path-universe.js';
5
+ import { diskSet } from './disk-set.js';
6
+ import { isDeadGlobTree } from './glob-evaluator.js';
7
+ import { emptyProjectAdvice, loadedNothing } from './empty-project-advice.js';
8
+ import { isFaultPosition } from '@nielspeter/eess/internal';
9
+ /**
10
+ * Report what each rule cannot enforce, without evaluating their conditions.
11
+ *
12
+ * It DOES materialize each rule's selection, as of plan 0096 — "this rule
13
+ * examined nothing" is a fact about the selection. The docstring said "without
14
+ * running any of them" and that stopped being true; it is the IDE-hover contract
15
+ * for an exported function, so it is corrected here and not only in `docs/`.
16
+ *
17
+ * As of plan 0102, one family's `inertAdvice?()` goes further than selection:
18
+ * `inconsistentSiblings` walks every sibling body's AST to answer it (the same
19
+ * work `check()` does), so for that one family this IS evaluating the
20
+ * condition, not just counting what would be handed to it (review: architect).
21
+ * Still no `Condition.evaluate()` call — the boundary this docstring's
22
+ * predecessor drew — but "without evaluating" is no longer exactly right for
23
+ * every family, and is corrected here rather than left for the next reader to
24
+ * discover by profiling `doctor`.
25
+ *
26
+ * The in-process half of `doctor`. It exists because rules written inside
27
+ * vitest are a co-equal documented path (`docs/running-in-tests.md`), and a
28
+ * CLI-only diagnostic would leave half the users unable to measure before R3
29
+ * flips anything — which is the one job R2a has.
30
+ *
31
+ * Reports **identities, never totals**: which glob, in which rule, at which
32
+ * position. A count is a snapshot, and under ADR-009 rule 4 a snapshot is the
33
+ * thing that rots. Callers who want a number can take `.length`.
34
+ */
35
+ export function diagnose(rules, project) {
36
+ const findings = [];
37
+ /**
38
+ * Projects already reported empty, by OBJECT not by path.
39
+ *
40
+ * The path is not an identity: `workspace([...])` sets `tsConfigPath` to the
41
+ * alphabetically first of N configs (`project.ts`), so a `workspace()` and a
42
+ * `project()` naming that same config collided — and the loser was dropped
43
+ * silently, contributing no finding at all. A false green inside the fix for
44
+ * a false green. `project()` and `workspace()` are both memoized, so object
45
+ * identity IS project identity, and it is what `pathUniverse` and `diskSet`
46
+ * already key on.
47
+ */
48
+ const emptyProjects = new WeakSet();
49
+ for (const rule of rules) {
50
+ const name = ruleName(rule);
51
+ // PER RULE, not once for the whole array. Taking the first project any
52
+ // rule could name and diagnosing everything against it is wrong in both
53
+ // directions: a rule file with two `project()` calls gets half its globs
54
+ // checked against the wrong universe — the documented monorepo hazard,
55
+ // committed by the diagnostic itself — and a file whose rules cannot name
56
+ // a project at all got silence.
57
+ // The rule's own project WINS over the parameter. Backwards, the parameter
58
+ // silently re-checks every rule against one universe — which is the
59
+ // documented monorepo hazard the paragraph above complains about, and the
60
+ // `project-unknown` advice used to recommend it. The parameter is a
61
+ // fallback for rules that cannot name a project, which is the only case it
62
+ // was ever needed for.
63
+ const target = rule.getProject?.() ?? project;
64
+ // Where this rule's findings begin, so the tail can ask whether anything
65
+ // else already explained an empty examination (plan 0096's precedence
66
+ // ruling). The gate has the same shape at `terminal-builder.ts` — each fault
67
+ // REPLACES what follows — and `diagnose()` must mirror it or the preview
68
+ // disagrees with the thing it previews.
69
+ //
70
+ // ABOVE the `no-condition` push, deliberately. It sat below on the first
71
+ // pass, so the tail could never see a missing assertion and measured
72
+ // ['no-condition','zero-subjects'] on three shapes — while the comment on
73
+ // the tail claimed a missing assertion already named a cause. The code
74
+ // contradicted its own comment.
75
+ const before = findings.length;
76
+ // A rule with a selector and no condition asserts nothing about what it
77
+ // selected. Reported here so that R3b's gate can see proposal 019 at all:
78
+ // a doctor that reported only glob faults would pass while 019's blast
79
+ // radius was completely unknown — this plan's own question, asked of its
80
+ // own gate.
81
+ if (hasNoCondition(rule)) {
82
+ findings.push({
83
+ kind: 'no-condition',
84
+ rule: name,
85
+ // The builder's own per-state remedy when it offers one — the same
86
+ // string the runtime prints — falling back to the generic form for a
87
+ // DiagnosableRule that predates the hook. The old fixed text here said
88
+ // "add a .should() clause", which is the wrong remedy for the main
89
+ // shape (the .should() is present; the condition is not).
90
+ // The builder's own per-state remedy. No literal fallback string here:
91
+ // an earlier revision hard-coded the generic text a second time, and a
92
+ // review measured either copy being rewritten with nothing failing —
93
+ // two strings in the mechanism whose stated purpose is one string, one
94
+ // place. A DiagnosableRule that predates the hook gets the base
95
+ // method's text, from the one place that owns it.
96
+ advice: rule.assertionAdvice?.() ?? TerminalBuilder.prototype.assertionAdvice.call(rule),
97
+ });
98
+ }
99
+ const trees = rule.globs?.() ?? [];
100
+ // Silence here would be a false green in the tool built to remove false
101
+ // greens: a rule that declares globs and cannot say which project to check
102
+ // them against used to be skipped, so a rule file made entirely of such
103
+ // rules reported a clean bill of health and exited 0 with every one of its
104
+ // globs unchecked. Say so instead.
105
+ //
106
+ // This comment used to name `crossLayer()` and `resolvers()` as the
107
+ // builders that could not name their project — and by the time it was read
108
+ // again, `48e3391` had given both a `getProject()`, so it named as examples
109
+ // the two shapes the fix had repaired. `tests/core/diagnose.test.ts` pins
110
+ // the truth in both directions: one test drives this branch, and a second
111
+ // asserts a `crossLayer` rule does NOT reach it. Hence no roster and no
112
+ // count here — a builder reaches this branch exactly when it implements no
113
+ // `getProject()` and no project was passed in, which is checked on the
114
+ // line below rather than remembered in prose.
115
+ if (!target) {
116
+ if (trees.length > 0) {
117
+ findings.push({
118
+ kind: 'project-unknown',
119
+ rule: name,
120
+ advice: 'this rule declares globs but cannot say which project it was built against, so they were not checked. A builder constructed directly rather than through its entry point has no project to report',
121
+ });
122
+ // ...but the syntactic faults do not need a project, so they are still
123
+ // reported here rather than held back for a run that may never happen.
124
+ findings.push(...syntacticFindings(name, trees));
125
+ }
126
+ // Evidence is a fact about the FAMILY, not about whether we could name its
127
+ // project — so this branch reports it too. Under the SAME gate as the tail:
128
+ // pushed unconditionally it produced ['project-unknown','dead-glob',
129
+ // 'zero-subjects'], the very shape this plan condemns, on the one path the
130
+ // ruling had not been extended to.
131
+ if (findings.length === before) {
132
+ const noProjectEvidence = zeroSubjectsFinding(rule, name);
133
+ if (noProjectEvidence !== undefined)
134
+ findings.push(noProjectEvidence);
135
+ }
136
+ continue;
137
+ }
138
+ // Bug 0031. When the project loaded nothing, EVERY glob is dead and none
139
+ // of them is the reason. Diagnosing them one by one produced six findings
140
+ // whose advice said "a path segment is misspelled" about correctly spelled
141
+ // globs, measured against a real adopting codebase whose root tsconfig is
142
+ // `"files": []` plus project references.
143
+ //
144
+ // The rule is not new here: `slice-rule-builder.ts` already states it —
145
+ // "blaming the glob would send the caller to the wrong file entirely" —
146
+ // and `check` printed the right cause in the same run this printed the
147
+ // wrong one.
148
+ //
149
+ // Once per PROJECT, not per rule and not per glob: the identity of this
150
+ // fault is the tsconfig, so that is what ADR-009 rule 4 asks be named.
151
+ // Deduped by path rather than by object because the path is what the
152
+ // message prints, and printing one sentence twice is the thing being
153
+ // fixed.
154
+ if (loadedNothing(target)) {
155
+ if (!emptyProjects.has(target)) {
156
+ emptyProjects.add(target);
157
+ findings.push({
158
+ kind: 'project-empty',
159
+ rule: name,
160
+ // One owner, shared with the builder's failing-check message. The
161
+ // clause "Reported once for this project" used to be here and was
162
+ // FALSE on the primary surface: `doctor` calls `diagnose()` once per
163
+ // rule file, so two files against one empty tsconfig printed the
164
+ // sentence claiming it was printed once, twice. Measured by review.
165
+ advice: emptyProjectAdvice(target),
166
+ });
167
+ }
168
+ // The syntactic faults survive an empty project: they are properties of
169
+ // the glob text, not of what loaded, so withholding them buys the reader
170
+ // a second failing round trip.
171
+ findings.push(...syntacticFindings(name, trees));
172
+ // Skip the rest of the glob walk. Not an optimisation — reporting those
173
+ // globs is the bug, because every one would carry a cause that is false.
174
+ continue;
175
+ }
176
+ const universe = pathUniverse(target);
177
+ for (const tree of trees) {
178
+ // Only diagnose sites inside a tree that is actually dead. A live tree
179
+ // may still contain a dead site — `or(dead, live)` is a working rule —
180
+ // and reporting the dead one there is the false red the tree exists to
181
+ // prevent.
182
+ if (!isDeadGlobTree(tree, universe))
183
+ continue;
184
+ for (const site of globSitesOf(tree)) {
185
+ // An exclusion matching zero is remedy-optional (proposal 006) and
186
+ // never a fault, and a positive condition glob is indistinguishable
187
+ // from an armed tripwire that has not fired. Reporting either asserts
188
+ // a remedy for a non-fault — and `position` used to be copied into the
189
+ // finding and never read, so both fired.
190
+ if (!isFaultPosition(site.position))
191
+ continue;
192
+ if (!isDeadSite(site, universe))
193
+ continue;
194
+ findings.push(describe(site, name, universe, target));
195
+ }
196
+ }
197
+ // LAST, and only if nothing else spoke for this rule. A dead glob, a missing
198
+ // assertion or an empty project each already names a cause with its own
199
+ // remedy; adding "your narrowing removed everything" beside one of them
200
+ // prints the derived symptom above the root cause, with advice that is false
201
+ // on that path. The first attempt emitted this first and unconditionally,
202
+ // which measured as ['zero-subjects','dead-glob'] for a single typo and
203
+ // broke the invariant bug 0040 is filed for — that `diagnose()` and the gate
204
+ // agree about a dead discovery glob.
205
+ if (findings.length === before) {
206
+ const evidence = zeroSubjectsFinding(rule, name);
207
+ if (evidence !== undefined)
208
+ findings.push(evidence);
209
+ }
210
+ // A DISTINCT branch, not folded into the zeroSubjectsFinding guard above:
211
+ // inertAdvice() only returns non-empty when examinedUnits() > 0 (plan
212
+ // 0102's own guard requires `matching > 0`), so the two are structurally
213
+ // mutually exclusive and this never doubles up with the zero-subjects
214
+ // finding above. Unconditional (not gated on `findings.length === before`)
215
+ // because the emptiness precedence above governs a different axis
216
+ // (evidence present vs. absent); this axis is evidence present vs.
217
+ // adequate, and nothing else in this loop speaks to it.
218
+ const inert = inertFinding(rule, name);
219
+ if (inert !== undefined)
220
+ findings.push(inert);
221
+ // Also unconditional, and naturally exclusive from the two branches above:
222
+ // `deferredWarningAdvice()` only fires when `.violations()` returns at
223
+ // least one `error`-severity result, which cannot happen when examined
224
+ // units is zero (zero-subjects) or the family's own adequacy predicate says
225
+ // this rule can never produce a finding (inert) — both of those states mean
226
+ // no violations at all, so `breaching.length` is `0` and this stays silent.
227
+ const deferred = deferredWarningFinding(rule, name);
228
+ if (deferred !== undefined)
229
+ findings.push(deferred);
230
+ }
231
+ return findings;
232
+ }
233
+ /**
234
+ * A rule that examined nothing, when nothing else explained why — plan 0096.
235
+ *
236
+ * Returns `undefined` unless the family answers `examinedUnits()` and answered
237
+ * zero. Two callers, on purpose: the project-unknown branch (a family with no
238
+ * project still has evidence — `crossProject` and `schemaFromSDL` have no
239
+ * `ArchProject` at all, and the first attempt gated this on one and gave those
240
+ * two families no preview whatsoever) and the tail of the normal path.
241
+ *
242
+ * NOT called from the project-empty branch. That fault is the instrument, it
243
+ * already has its own finding, and reporting both would print one fault twice
244
+ * — and prefigure 0098's precedence backwards, where an empty project outranks
245
+ * every declaration because a declaration asserts a fact about a loaded corpus.
246
+ */
247
+ function zeroSubjectsFinding(rule, name) {
248
+ if (rule.examinedUnits === undefined)
249
+ return undefined;
250
+ if (rule.examinedUnits() !== 0)
251
+ return undefined;
252
+ // The author said empty is the point. Reporting anyway would make the advice
253
+ // below a remedy the reader has already applied — ADR-009 rule 2's loop — and
254
+ // would over-report against 0098's floor, which honours the same mint. That
255
+ // the mint exists at all is why 0097 shipped first; this is its first reader.
256
+ if (rule.declaresEmpty?.() === true)
257
+ return undefined;
258
+ // `.notExist()` examines zero BECAUSE that is what it asserts — the gate has
259
+ // exempted this since 0.34.0 and the preview must agree, or `doctor` reports a
260
+ // working rule as broken. Plan 0098: the rule-builder family is the first to
261
+ // report evidence, so this is the first release in which the two could differ.
262
+ if (rule.assertsCardinality?.() === true)
263
+ return undefined;
264
+ return {
265
+ kind: 'zero-subjects',
266
+ rule: name,
267
+ // ONE cause, because precedence has already removed the others: this fires
268
+ // only when no dead glob, missing assertion or empty project explained the
269
+ // emptiness first. So the remedy can name that cause without the hedging
270
+ // ADR-009 rule 2 forbids — and it must not say "your filters", because the
271
+ // commonest trigger is a default the author never wrote (`minLines` is 5).
272
+ // VERBATIM from the rule when it can speak, so this preview and the gate
273
+ // cannot drift. The fallback is for a foreign dialect that predates the seam;
274
+ // it deliberately no longer promises "a later release makes this fail" — that
275
+ // release is this one.
276
+ // NO fallback literal. It was a six-line copy of the producer's sentence —
277
+ // dead for every real builder (every `TerminalBuilder` has the method), never
278
+ // referenced by a test, and already diverging: no unit noun, no file count,
279
+ // no narrowing hint. The seam exists because "two texts for one state is the
280
+ // plan-0070 drift shape"; a fallback is that second text, one level down, in
281
+ // the commit that added the seam.
282
+ //
283
+ // A duck-typed `DiagnosableRule` that cannot answer simply has no advice to
284
+ // report, which is honest — better than core inventing a sentence for a
285
+ // family whose units and remedies it does not know.
286
+ advice: rule.zeroSubjectsAdvice?.() ??
287
+ 'this rule examined 0 units, so it enforces nothing as written today.',
288
+ };
289
+ }
290
+ /**
291
+ * A rule whose evidence is non-empty but which is structurally unable to ever
292
+ * produce a finding as configured — plan 0102, bug 0077(A).
293
+ *
294
+ * Mirrors `zeroSubjectsFinding`'s shape: returns `undefined` unless the family
295
+ * answers `inertAdvice()` and answers non-empty. No fallback literal, for the
296
+ * same reason `zeroSubjectsFinding` has none — a family that cannot answer has
297
+ * no advice to report, which is honest; core does not invent a sentence for an
298
+ * adequacy predicate it does not own.
299
+ */
300
+ function inertFinding(rule, name) {
301
+ return adviceFinding('inert', name, rule.inertAdvice?.());
302
+ }
303
+ /** A deferred warning whose accepted list no longer covers everything it finds — plan 0090. */
304
+ function deferredWarningFinding(rule, name) {
305
+ return adviceFinding('deferred-warning', name, rule.deferredWarningAdvice?.());
306
+ }
307
+ /**
308
+ * A finding that exists only if the family had something to say.
309
+ *
310
+ * `undefined` and `''` are the same answer — "this family declines to advise"
311
+ * — and treating them alike in ONE place is why an unimplemented hook and an
312
+ * implemented-but-silent one cannot diverge. A finding whose `advice` is the
313
+ * empty string renders as a heading with nothing under it, which reads to the
314
+ * author as a diagnosis that was cut off rather than one that was declined.
315
+ */
316
+ function adviceFinding(kind, name, advice) {
317
+ if (advice === undefined || advice === '')
318
+ return undefined;
319
+ return { kind, rule: name, advice };
320
+ }
321
+ /**
322
+ * The faults that need no project at all, reported on the branches that have none.
323
+ *
324
+ * `syntacticFault` takes `(glob, kind, base)` — no universe, no project — and
325
+ * is split out for exactly that reason. `'./src/**'` is dead in every possible
326
+ * project; loading the tsconfig will not fix it. Both early exits below (the
327
+ * project is unknown, the project is empty) used to swallow these, so the
328
+ * reader corrected their config, re-ran, and only then learned the glob was
329
+ * also malformed — a second round trip for a fault already decided.
330
+ *
331
+ * Reported by review. Applies to the pre-existing `project-unknown` branch too,
332
+ * which had the same hole.
333
+ */
334
+ function syntacticFindings(rule, trees) {
335
+ const findings = [];
336
+ for (const tree of trees) {
337
+ for (const site of globSitesOf(tree)) {
338
+ // Same position filter as the main path: an exclusion or condition glob
339
+ // matching nothing is not a fault, and that does not change because the
340
+ // fault is syntactic.
341
+ if (!isFaultPosition(site.position))
342
+ continue;
343
+ const fault = syntacticFault(site.glob, site.kind, site.base);
344
+ if (fault === undefined)
345
+ continue;
346
+ findings.push({
347
+ kind: 'dead-glob',
348
+ rule,
349
+ origin: site.origin,
350
+ glob: site.glob,
351
+ position: site.position,
352
+ fault,
353
+ advice: FAULT_ADVICE[fault],
354
+ });
355
+ }
356
+ }
357
+ return findings;
358
+ }
359
+ function describe(site, rule, universe, project) {
360
+ // The disk set is reached only from here, so a project with no dead globs
361
+ // never walks the filesystem.
362
+ const diagnosis = diagnoseGlob(site, universe, diskSet(project));
363
+ const onDiskAdvice = diagnosis.onDisk ? ON_DISK_ADVICE[diagnosis.onDisk] : '';
364
+ return {
365
+ kind: 'dead-glob',
366
+ rule,
367
+ origin: site.origin,
368
+ glob: site.glob,
369
+ position: site.position,
370
+ fault: diagnosis.fault,
371
+ onDisk: diagnosis.onDisk,
372
+ advice: onDiskAdvice === '' ? FAULT_ADVICE[diagnosis.fault] : onDiskAdvice,
373
+ };
374
+ }
375
+ function ruleName(rule) {
376
+ const described = rule.describeRule?.();
377
+ // `||` throughout, never `??`: `describeRule()` returns `rule: ''` for a bare
378
+ // entry point (no predicates, no conditions), and `'' ` is not nullish — so
379
+ // `?? 'unnamed rule'` made the fallback dead code and `doctor` printed an
380
+ // empty rule name for precisely the shape this diagnostic is about. Caught by
381
+ // sabotage, not by reading. The gate derives the same name in
382
+ // `TerminalBuilder.collectWithAssertionGuard`; both must be non-empty, and
383
+ // both are asserted so.
384
+ return described?.id || described?.rule || 'unnamed rule';
385
+ }
386
+ /** Whether the rule reached a terminal with no condition attached. */
387
+ function hasNoCondition(rule) {
388
+ return rule.assertsSomething?.() === false;
389
+ }
390
+ //# sourceMappingURL=diagnose.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diagnose.js","sourceRoot":"","sources":["../../src/core/diagnose.ts"],"names":[],"mappings":"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"}