@nielspeter/eess-ts 0.2.1 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (433) hide show
  1. package/README.md +61 -35
  2. package/dist/builders/call-rule-builder.d.ts +66 -26
  3. package/dist/builders/call-rule-builder.d.ts.map +1 -1
  4. package/dist/builders/call-rule-builder.js +73 -31
  5. package/dist/builders/call-rule-builder.js.map +1 -1
  6. package/dist/builders/class-rule-builder.d.ts +125 -26
  7. package/dist/builders/class-rule-builder.d.ts.map +1 -1
  8. package/dist/builders/class-rule-builder.js +134 -30
  9. package/dist/builders/class-rule-builder.js.map +1 -1
  10. package/dist/builders/correspondence-builder.d.ts +287 -0
  11. package/dist/builders/correspondence-builder.d.ts.map +1 -0
  12. package/dist/builders/correspondence-builder.js +393 -0
  13. package/dist/builders/correspondence-builder.js.map +1 -0
  14. package/dist/builders/correspondence-findings.d.ts +104 -0
  15. package/dist/builders/correspondence-findings.d.ts.map +1 -0
  16. package/dist/builders/correspondence-findings.js +301 -0
  17. package/dist/builders/correspondence-findings.js.map +1 -0
  18. package/dist/builders/cross-layer-builder.d.ts +99 -16
  19. package/dist/builders/cross-layer-builder.d.ts.map +1 -1
  20. package/dist/builders/cross-layer-builder.js +181 -35
  21. package/dist/builders/cross-layer-builder.js.map +1 -1
  22. package/dist/builders/function-rule-builder.d.ts +144 -25
  23. package/dist/builders/function-rule-builder.d.ts.map +1 -1
  24. package/dist/builders/function-rule-builder.js +173 -26
  25. package/dist/builders/function-rule-builder.js.map +1 -1
  26. package/dist/builders/jsx-rule-builder.d.ts +70 -14
  27. package/dist/builders/jsx-rule-builder.d.ts.map +1 -1
  28. package/dist/builders/jsx-rule-builder.js +73 -14
  29. package/dist/builders/jsx-rule-builder.js.map +1 -1
  30. package/dist/builders/module-rule-builder.d.ts +2 -2
  31. package/dist/builders/module-rule-builder.d.ts.map +1 -1
  32. package/dist/builders/module-rule-builder.js +12 -3
  33. package/dist/builders/module-rule-builder.js.map +1 -1
  34. package/dist/builders/scoped-function-rule-builder.d.ts +11 -0
  35. package/dist/builders/scoped-function-rule-builder.d.ts.map +1 -1
  36. package/dist/builders/scoped-function-rule-builder.js +12 -0
  37. package/dist/builders/scoped-function-rule-builder.js.map +1 -1
  38. package/dist/builders/slice-discovery-message.d.ts +36 -0
  39. package/dist/builders/slice-discovery-message.d.ts.map +1 -0
  40. package/dist/builders/slice-discovery-message.js +181 -0
  41. package/dist/builders/slice-discovery-message.js.map +1 -0
  42. package/dist/builders/slice-rule-builder.d.ts +151 -12
  43. package/dist/builders/slice-rule-builder.d.ts.map +1 -1
  44. package/dist/builders/slice-rule-builder.js +242 -35
  45. package/dist/builders/slice-rule-builder.js.map +1 -1
  46. package/dist/builders/type-rule-builder.d.ts +95 -24
  47. package/dist/builders/type-rule-builder.d.ts.map +1 -1
  48. package/dist/builders/type-rule-builder.js +105 -29
  49. package/dist/builders/type-rule-builder.js.map +1 -1
  50. package/dist/{helpers → builders}/within.d.ts +2 -2
  51. package/dist/builders/within.d.ts.map +1 -0
  52. package/dist/{helpers → builders}/within.js +1 -1
  53. package/dist/builders/within.js.map +1 -0
  54. package/dist/cli/commands/baseline.d.ts +3 -2
  55. package/dist/cli/commands/baseline.d.ts.map +1 -1
  56. package/dist/cli/commands/baseline.js +68 -6
  57. package/dist/cli/commands/baseline.js.map +1 -1
  58. package/dist/cli/commands/check.d.ts +7 -2
  59. package/dist/cli/commands/check.d.ts.map +1 -1
  60. package/dist/cli/commands/check.js +241 -45
  61. package/dist/cli/commands/check.js.map +1 -1
  62. package/dist/cli/commands/doctor.d.ts +29 -0
  63. package/dist/cli/commands/doctor.d.ts.map +1 -0
  64. package/dist/cli/commands/doctor.js +224 -0
  65. package/dist/cli/commands/doctor.js.map +1 -0
  66. package/dist/cli/commands/explain.d.ts +2 -1
  67. package/dist/cli/commands/explain.d.ts.map +1 -1
  68. package/dist/cli/commands/explain.js +19 -10
  69. package/dist/cli/commands/explain.js.map +1 -1
  70. package/dist/cli/commands/init.d.ts +9 -3
  71. package/dist/cli/commands/init.d.ts.map +1 -1
  72. package/dist/cli/commands/init.js +162 -137
  73. package/dist/cli/commands/init.js.map +1 -1
  74. package/dist/cli/import-rule-module.d.ts +29 -0
  75. package/dist/cli/import-rule-module.d.ts.map +1 -0
  76. package/dist/cli/import-rule-module.js +60 -0
  77. package/dist/cli/import-rule-module.js.map +1 -0
  78. package/dist/cli/index.d.ts +2 -2
  79. package/dist/cli/index.d.ts.map +1 -1
  80. package/dist/cli/index.js +98 -33
  81. package/dist/cli/index.js.map +1 -1
  82. package/dist/cli/load-rules.d.ts +6 -11
  83. package/dist/cli/load-rules.d.ts.map +1 -1
  84. package/dist/cli/load-rules.js +21 -29
  85. package/dist/cli/load-rules.js.map +1 -1
  86. package/dist/cli/resolve-config.d.ts.map +1 -1
  87. package/dist/cli/resolve-config.js +24 -24
  88. package/dist/cli/resolve-config.js.map +1 -1
  89. package/dist/cli/rule-file-findings.d.ts +178 -0
  90. package/dist/cli/rule-file-findings.d.ts.map +1 -0
  91. package/dist/cli/rule-file-findings.js +293 -0
  92. package/dist/cli/rule-file-findings.js.map +1 -0
  93. package/dist/cli/watch.d.ts +20 -7
  94. package/dist/cli/watch.d.ts.map +1 -1
  95. package/dist/cli/watch.js +39 -14
  96. package/dist/cli/watch.js.map +1 -1
  97. package/dist/conditions/body-analysis-function.d.ts.map +1 -1
  98. package/dist/conditions/body-analysis-function.js +16 -7
  99. package/dist/conditions/body-analysis-function.js.map +1 -1
  100. package/dist/conditions/body-analysis-module.d.ts.map +1 -1
  101. package/dist/conditions/body-analysis-module.js +14 -9
  102. package/dist/conditions/body-analysis-module.js.map +1 -1
  103. package/dist/conditions/body-analysis.d.ts.map +1 -1
  104. package/dist/conditions/body-analysis.js +16 -7
  105. package/dist/conditions/body-analysis.js.map +1 -1
  106. package/dist/conditions/call.d.ts.map +1 -1
  107. package/dist/conditions/call.js +38 -17
  108. package/dist/conditions/call.js.map +1 -1
  109. package/dist/conditions/catch-analysis.d.ts +2 -1
  110. package/dist/conditions/catch-analysis.d.ts.map +1 -1
  111. package/dist/conditions/catch-analysis.js.map +1 -1
  112. package/dist/conditions/cross-layer.d.ts +2 -10
  113. package/dist/conditions/cross-layer.d.ts.map +1 -1
  114. package/dist/conditions/cross-layer.js +227 -23
  115. package/dist/conditions/cross-layer.js.map +1 -1
  116. package/dist/conditions/dependency.d.ts +35 -6
  117. package/dist/conditions/dependency.d.ts.map +1 -1
  118. package/dist/conditions/dependency.js +299 -45
  119. package/dist/conditions/dependency.js.map +1 -1
  120. package/dist/conditions/exports.d.ts.map +1 -1
  121. package/dist/conditions/exports.js +10 -0
  122. package/dist/conditions/exports.js.map +1 -1
  123. package/dist/conditions/function.d.ts.map +1 -1
  124. package/dist/conditions/function.js +19 -5
  125. package/dist/conditions/function.js.map +1 -1
  126. package/dist/conditions/helpers.d.ts +2 -1
  127. package/dist/conditions/helpers.d.ts.map +1 -1
  128. package/dist/conditions/helpers.js +4 -1
  129. package/dist/conditions/helpers.js.map +1 -1
  130. package/dist/conditions/jsx.d.ts.map +1 -1
  131. package/dist/conditions/jsx.js +7 -2
  132. package/dist/conditions/jsx.js.map +1 -1
  133. package/dist/conditions/match-identity.d.ts +43 -0
  134. package/dist/conditions/match-identity.d.ts.map +1 -0
  135. package/dist/conditions/match-identity.js +43 -0
  136. package/dist/conditions/match-identity.js.map +1 -0
  137. package/dist/conditions/members.d.ts.map +1 -1
  138. package/dist/conditions/members.js +17 -4
  139. package/dist/conditions/members.js.map +1 -1
  140. package/dist/conditions/reverse-dependency.d.ts +18 -5
  141. package/dist/conditions/reverse-dependency.d.ts.map +1 -1
  142. package/dist/conditions/reverse-dependency.js +109 -92
  143. package/dist/conditions/reverse-dependency.js.map +1 -1
  144. package/dist/conditions/slice.d.ts +86 -2
  145. package/dist/conditions/slice.d.ts.map +1 -1
  146. package/dist/conditions/slice.js +234 -53
  147. package/dist/conditions/slice.js.map +1 -1
  148. package/dist/conditions/structural.d.ts.map +1 -1
  149. package/dist/conditions/structural.js +16 -4
  150. package/dist/conditions/structural.js.map +1 -1
  151. package/dist/core/check-all.d.ts +19 -0
  152. package/dist/core/check-all.d.ts.map +1 -0
  153. package/dist/core/check-all.js +96 -0
  154. package/dist/core/check-all.js.map +1 -0
  155. package/dist/core/combinators.d.ts +48 -0
  156. package/dist/core/combinators.d.ts.map +1 -0
  157. package/dist/core/combinators.js +56 -0
  158. package/dist/core/combinators.js.map +1 -0
  159. package/dist/core/descendant-cache.d.ts +36 -0
  160. package/dist/core/descendant-cache.d.ts.map +1 -0
  161. package/dist/core/descendant-cache.js +119 -0
  162. package/dist/core/descendant-cache.js.map +1 -0
  163. package/dist/core/diagnose.d.ts +234 -0
  164. package/dist/core/diagnose.d.ts.map +1 -0
  165. package/dist/core/diagnose.js +382 -0
  166. package/dist/core/diagnose.js.map +1 -0
  167. package/dist/core/disk-set.d.ts +48 -0
  168. package/dist/core/disk-set.d.ts.map +1 -0
  169. package/dist/core/disk-set.js +218 -0
  170. package/dist/core/disk-set.js.map +1 -0
  171. package/dist/core/element-cache.d.ts +75 -0
  172. package/dist/core/element-cache.d.ts.map +1 -0
  173. package/dist/core/element-cache.js +32 -0
  174. package/dist/core/element-cache.js.map +1 -0
  175. package/dist/core/empty-project-advice.d.ts +75 -0
  176. package/dist/core/empty-project-advice.d.ts.map +1 -0
  177. package/dist/core/empty-project-advice.js +61 -0
  178. package/dist/core/empty-project-advice.js.map +1 -0
  179. package/dist/core/exclusion-comments.d.ts +54 -0
  180. package/dist/core/exclusion-comments.d.ts.map +1 -0
  181. package/dist/core/exclusion-comments.js +310 -0
  182. package/dist/core/exclusion-comments.js.map +1 -0
  183. package/dist/core/execute-rule.d.ts +150 -0
  184. package/dist/core/execute-rule.d.ts.map +1 -0
  185. package/dist/core/execute-rule.js +580 -0
  186. package/dist/core/execute-rule.js.map +1 -0
  187. package/dist/core/glob-diagnosis.d.ts +78 -0
  188. package/dist/core/glob-diagnosis.d.ts.map +1 -0
  189. package/dist/core/glob-diagnosis.js +134 -0
  190. package/dist/core/glob-diagnosis.js.map +1 -0
  191. package/dist/core/glob-evaluator.d.ts +48 -0
  192. package/dist/core/glob-evaluator.d.ts.map +1 -0
  193. package/dist/core/glob-evaluator.js +89 -0
  194. package/dist/core/glob-evaluator.js.map +1 -0
  195. package/dist/core/import-candidates.d.ts +60 -0
  196. package/dist/core/import-candidates.d.ts.map +1 -0
  197. package/dist/core/import-candidates.js +93 -0
  198. package/dist/core/import-candidates.js.map +1 -0
  199. package/dist/core/import-options.d.ts +55 -2
  200. package/dist/core/import-options.d.ts.map +1 -1
  201. package/dist/core/import-options.js +64 -0
  202. package/dist/core/import-options.js.map +1 -1
  203. package/dist/core/line-index.d.ts +3 -0
  204. package/dist/core/line-index.d.ts.map +1 -0
  205. package/dist/core/line-index.js +229 -0
  206. package/dist/core/line-index.js.map +1 -0
  207. package/dist/core/metric-violation.d.ts +86 -0
  208. package/dist/core/metric-violation.d.ts.map +1 -0
  209. package/dist/core/metric-violation.js +132 -0
  210. package/dist/core/metric-violation.js.map +1 -0
  211. package/dist/core/module-edges.d.ts +361 -0
  212. package/dist/core/module-edges.d.ts.map +1 -0
  213. package/dist/core/module-edges.js +592 -0
  214. package/dist/core/module-edges.js.map +1 -0
  215. package/dist/core/object-literal-functions.d.ts +42 -0
  216. package/dist/core/object-literal-functions.d.ts.map +1 -0
  217. package/dist/core/object-literal-functions.js +75 -0
  218. package/dist/core/object-literal-functions.js.map +1 -0
  219. package/dist/core/orphan-exclusions.d.ts +44 -0
  220. package/dist/core/orphan-exclusions.d.ts.map +1 -0
  221. package/dist/core/orphan-exclusions.js +214 -0
  222. package/dist/core/orphan-exclusions.js.map +1 -0
  223. package/dist/core/pair-condition.d.ts +32 -3
  224. package/dist/core/pair-condition.d.ts.map +1 -1
  225. package/dist/core/path-universe.d.ts +54 -0
  226. package/dist/core/path-universe.d.ts.map +1 -0
  227. package/dist/core/path-universe.js +65 -0
  228. package/dist/core/path-universe.js.map +1 -0
  229. package/dist/core/per-root-compiler-options.d.ts +20 -0
  230. package/dist/core/per-root-compiler-options.d.ts.map +1 -0
  231. package/dist/core/per-root-compiler-options.js +57 -0
  232. package/dist/core/per-root-compiler-options.js.map +1 -0
  233. package/dist/core/project-relative.d.ts +98 -0
  234. package/dist/core/project-relative.d.ts.map +1 -0
  235. package/dist/core/project-relative.js +185 -0
  236. package/dist/core/project-relative.js.map +1 -0
  237. package/dist/core/project.d.ts +7 -1
  238. package/dist/core/project.d.ts.map +1 -1
  239. package/dist/core/project.js +24 -0
  240. package/dist/core/project.js.map +1 -1
  241. package/dist/core/rule-builder.d.ts +282 -0
  242. package/dist/core/rule-builder.d.ts.map +1 -0
  243. package/dist/core/rule-builder.js +445 -0
  244. package/dist/core/rule-builder.js.map +1 -0
  245. package/dist/core/rule-declaration.d.ts +32 -0
  246. package/dist/core/rule-declaration.d.ts.map +1 -0
  247. package/dist/core/rule-declaration.js +126 -0
  248. package/dist/core/rule-declaration.js.map +1 -0
  249. package/dist/core/terminal-builder.d.ts +625 -0
  250. package/dist/core/terminal-builder.d.ts.map +1 -0
  251. package/dist/core/terminal-builder.js +787 -0
  252. package/dist/core/terminal-builder.js.map +1 -0
  253. package/dist/core/terminal-execution.d.ts +23 -0
  254. package/dist/core/terminal-execution.d.ts.map +1 -0
  255. package/dist/core/terminal-execution.js +71 -0
  256. package/dist/core/terminal-execution.js.map +1 -0
  257. package/dist/core/vacuity-diagnosis.d.ts +103 -0
  258. package/dist/core/vacuity-diagnosis.d.ts.map +1 -0
  259. package/dist/core/vacuity-diagnosis.js +415 -0
  260. package/dist/core/vacuity-diagnosis.js.map +1 -0
  261. package/dist/core/violation.d.ts +16 -11
  262. package/dist/core/violation.d.ts.map +1 -1
  263. package/dist/core/violation.js +33 -13
  264. package/dist/core/violation.js.map +1 -1
  265. package/dist/graphql/index.js +1 -1
  266. package/dist/graphql/index.js.map +1 -1
  267. package/dist/graphql/resolver-rule-builder.d.ts +98 -23
  268. package/dist/graphql/resolver-rule-builder.d.ts.map +1 -1
  269. package/dist/graphql/resolver-rule-builder.js +151 -21
  270. package/dist/graphql/resolver-rule-builder.js.map +1 -1
  271. package/dist/graphql/schema-loader.d.ts +21 -0
  272. package/dist/graphql/schema-loader.d.ts.map +1 -1
  273. package/dist/graphql/schema-loader.js +81 -12
  274. package/dist/graphql/schema-loader.js.map +1 -1
  275. package/dist/graphql/schema-rule-builder.d.ts +57 -20
  276. package/dist/graphql/schema-rule-builder.d.ts.map +1 -1
  277. package/dist/graphql/schema-rule-builder.js +101 -25
  278. package/dist/graphql/schema-rule-builder.js.map +1 -1
  279. package/dist/helpers/baseline-diagnostics.d.ts +45 -0
  280. package/dist/helpers/baseline-diagnostics.d.ts.map +1 -0
  281. package/dist/helpers/baseline-diagnostics.js +168 -0
  282. package/dist/helpers/baseline-diagnostics.js.map +1 -0
  283. package/dist/helpers/baseline-generator.d.ts +19 -0
  284. package/dist/helpers/baseline-generator.d.ts.map +1 -0
  285. package/dist/helpers/baseline-generator.js +18 -0
  286. package/dist/helpers/baseline-generator.js.map +1 -0
  287. package/dist/helpers/baseline.d.ts +336 -0
  288. package/dist/helpers/baseline.d.ts.map +1 -0
  289. package/dist/helpers/baseline.js +664 -0
  290. package/dist/helpers/baseline.js.map +1 -0
  291. package/dist/helpers/body-traversal.d.ts +27 -2
  292. package/dist/helpers/body-traversal.d.ts.map +1 -1
  293. package/dist/helpers/body-traversal.js +122 -16
  294. package/dist/helpers/body-traversal.js.map +1 -1
  295. package/dist/helpers/callback-extractor.d.ts.map +1 -1
  296. package/dist/helpers/callback-extractor.js +48 -47
  297. package/dist/helpers/callback-extractor.js.map +1 -1
  298. package/dist/helpers/complexity.d.ts +13 -5
  299. package/dist/helpers/complexity.d.ts.map +1 -1
  300. package/dist/helpers/complexity.js +15 -6
  301. package/dist/helpers/complexity.js.map +1 -1
  302. package/dist/helpers/diff-aware.d.ts +44 -0
  303. package/dist/helpers/diff-aware.d.ts.map +1 -0
  304. package/dist/helpers/diff-aware.js +84 -0
  305. package/dist/helpers/diff-aware.js.map +1 -0
  306. package/dist/helpers/matchers.d.ts +68 -7
  307. package/dist/helpers/matchers.d.ts.map +1 -1
  308. package/dist/helpers/matchers.js +114 -20
  309. package/dist/helpers/matchers.js.map +1 -1
  310. package/dist/helpers/slice-graph.d.ts +100 -8
  311. package/dist/helpers/slice-graph.d.ts.map +1 -1
  312. package/dist/helpers/slice-graph.js +126 -34
  313. package/dist/helpers/slice-graph.js.map +1 -1
  314. package/dist/helpers/tarjan.d.ts +0 -14
  315. package/dist/helpers/tarjan.d.ts.map +1 -1
  316. package/dist/helpers/tarjan.js +29 -16
  317. package/dist/helpers/tarjan.js.map +1 -1
  318. package/dist/index.d.ts +56 -17
  319. package/dist/index.d.ts.map +1 -1
  320. package/dist/index.js +57 -13
  321. package/dist/index.js.map +1 -1
  322. package/dist/models/arch-call.d.ts +3 -2
  323. package/dist/models/arch-call.d.ts.map +1 -1
  324. package/dist/models/arch-call.js.map +1 -1
  325. package/dist/models/arch-function.d.ts +28 -6
  326. package/dist/models/arch-function.d.ts.map +1 -1
  327. package/dist/models/arch-function.js +106 -3
  328. package/dist/models/arch-function.js.map +1 -1
  329. package/dist/models/arch-jsx-element.js +2 -2
  330. package/dist/models/arch-jsx-element.js.map +1 -1
  331. package/dist/models/slice.d.ts +33 -9
  332. package/dist/models/slice.d.ts.map +1 -1
  333. package/dist/models/slice.js +129 -19
  334. package/dist/models/slice.js.map +1 -1
  335. package/dist/predicates/call.d.ts.map +1 -1
  336. package/dist/predicates/call.js +5 -0
  337. package/dist/predicates/call.js.map +1 -1
  338. package/dist/predicates/identity.d.ts +21 -0
  339. package/dist/predicates/identity.d.ts.map +1 -1
  340. package/dist/predicates/identity.js +75 -3
  341. package/dist/predicates/identity.js.map +1 -1
  342. package/dist/predicates/index.d.ts +1 -1
  343. package/dist/predicates/index.d.ts.map +1 -1
  344. package/dist/predicates/index.js +1 -1
  345. package/dist/predicates/index.js.map +1 -1
  346. package/dist/predicates/metrics.d.ts +4 -2
  347. package/dist/predicates/metrics.d.ts.map +1 -1
  348. package/dist/predicates/metrics.js +4 -2
  349. package/dist/predicates/metrics.js.map +1 -1
  350. package/dist/predicates/module.d.ts +4 -12
  351. package/dist/predicates/module.d.ts.map +1 -1
  352. package/dist/predicates/module.js +57 -37
  353. package/dist/predicates/module.js.map +1 -1
  354. package/dist/presets/agent-guardrails.d.ts +22 -15
  355. package/dist/presets/agent-guardrails.d.ts.map +1 -1
  356. package/dist/presets/agent-guardrails.js +124 -19
  357. package/dist/presets/agent-guardrails.js.map +1 -1
  358. package/dist/presets/boundaries.d.ts +45 -2
  359. package/dist/presets/boundaries.d.ts.map +1 -1
  360. package/dist/presets/boundaries.js +132 -23
  361. package/dist/presets/boundaries.js.map +1 -1
  362. package/dist/presets/data-layer.d.ts +22 -2
  363. package/dist/presets/data-layer.d.ts.map +1 -1
  364. package/dist/presets/data-layer.js +58 -16
  365. package/dist/presets/data-layer.js.map +1 -1
  366. package/dist/presets/index.d.ts +7 -5
  367. package/dist/presets/index.d.ts.map +1 -1
  368. package/dist/presets/index.js +9 -3
  369. package/dist/presets/index.js.map +1 -1
  370. package/dist/presets/layered.d.ts +46 -2
  371. package/dist/presets/layered.d.ts.map +1 -1
  372. package/dist/presets/layered.js +66 -29
  373. package/dist/presets/layered.js.map +1 -1
  374. package/dist/presets/recommended.d.ts +80 -9
  375. package/dist/presets/recommended.d.ts.map +1 -1
  376. package/dist/presets/recommended.js +25 -23
  377. package/dist/presets/recommended.js.map +1 -1
  378. package/dist/presets/shared.d.ts +270 -2
  379. package/dist/presets/shared.d.ts.map +1 -1
  380. package/dist/presets/shared.js +338 -4
  381. package/dist/presets/shared.js.map +1 -1
  382. package/dist/rules/code-quality.d.ts.map +1 -1
  383. package/dist/rules/code-quality.js +15 -6
  384. package/dist/rules/code-quality.js.map +1 -1
  385. package/dist/rules/hygiene.d.ts +1 -1
  386. package/dist/rules/hygiene.js +1 -1
  387. package/dist/rules/metrics-function.d.ts +2 -1
  388. package/dist/rules/metrics-function.d.ts.map +1 -1
  389. package/dist/rules/metrics-function.js +33 -6
  390. package/dist/rules/metrics-function.js.map +1 -1
  391. package/dist/rules/metrics.d.ts +2 -1
  392. package/dist/rules/metrics.d.ts.map +1 -1
  393. package/dist/rules/metrics.js +39 -9
  394. package/dist/rules/metrics.js.map +1 -1
  395. package/dist/smells/duplicate-bodies.d.ts +58 -5
  396. package/dist/smells/duplicate-bodies.d.ts.map +1 -1
  397. package/dist/smells/duplicate-bodies.js +137 -56
  398. package/dist/smells/duplicate-bodies.js.map +1 -1
  399. package/dist/smells/fingerprint.d.ts +8 -1
  400. package/dist/smells/fingerprint.d.ts.map +1 -1
  401. package/dist/smells/fingerprint.js +21 -3
  402. package/dist/smells/fingerprint.js.map +1 -1
  403. package/dist/smells/inconsistent-siblings.d.ts +128 -7
  404. package/dist/smells/inconsistent-siblings.d.ts.map +1 -1
  405. package/dist/smells/inconsistent-siblings.js +288 -86
  406. package/dist/smells/inconsistent-siblings.js.map +1 -1
  407. package/dist/smells/sibling-files.d.ts +47 -0
  408. package/dist/smells/sibling-files.d.ts.map +1 -0
  409. package/dist/smells/sibling-files.js +104 -0
  410. package/dist/smells/sibling-files.js.map +1 -0
  411. package/dist/smells/similar-pairs.d.ts +27 -0
  412. package/dist/smells/similar-pairs.d.ts.map +1 -0
  413. package/dist/smells/similar-pairs.js +52 -0
  414. package/dist/smells/similar-pairs.js.map +1 -0
  415. package/dist/smells/smell-builder.d.ts +57 -12
  416. package/dist/smells/smell-builder.d.ts.map +1 -1
  417. package/dist/smells/smell-builder.js +111 -14
  418. package/dist/smells/smell-builder.js.map +1 -1
  419. package/dist/tsconfig/index.d.ts +19 -0
  420. package/dist/tsconfig/index.d.ts.map +1 -0
  421. package/dist/tsconfig/index.js +20 -0
  422. package/dist/tsconfig/index.js.map +1 -0
  423. package/dist/tsconfig/tsconfig-builder.d.ts +42 -9
  424. package/dist/tsconfig/tsconfig-builder.d.ts.map +1 -1
  425. package/dist/tsconfig/tsconfig-builder.js +64 -16
  426. package/dist/tsconfig/tsconfig-builder.js.map +1 -1
  427. package/package.json +3 -2
  428. package/dist/core/module-dependencies.d.ts +0 -28
  429. package/dist/core/module-dependencies.d.ts.map +0 -1
  430. package/dist/core/module-dependencies.js +0 -35
  431. package/dist/core/module-dependencies.js.map +0 -1
  432. package/dist/helpers/within.d.ts.map +0 -1
  433. package/dist/helpers/within.js.map +0 -1
@@ -1,8 +1,12 @@
1
- import { RuleBuilder } from '@nielspeter/eess';
1
+ import { RuleBuilder } from '../core/rule-builder.js';
2
2
  import { resideInFile as resideInFilePredicate, resideInFolder as resideInFolderPredicate, } from '../predicates/identity.js';
3
- import { importFrom as importFromPredicate, notImportFrom as notImportFromPredicate, exportSymbolNamed as exportSymbolNamedPredicate, havePathMatching as havePathMatchingPredicate, } from '../predicates/module.js';
3
+ import { importFrom as importFromPredicate, notImportFrom as notImportFromPredicate, exportSymbolNamed as exportSymbolNamedPredicate, } from '../predicates/module.js';
4
+ import { havePathMatching as havePathMatchingPredicate } from '../predicates/identity.js';
4
5
  import { onlyImportFrom as onlyImportFromCondition, notImportFrom as notImportFromCondition, onlyHaveTypeImportsFrom as onlyHaveTypeImportsFromCondition, notHaveAliasedImports as notHaveAliasedImportsCondition, } from '../conditions/dependency.js';
5
6
  import { notExist, resideInFile as resideInFileCondition, resideInFolder as resideInFolderCondition, } from '../conditions/structural.js';
7
+ import { createElementCache, SOLE_POPULATION } from '../core/element-cache.js';
8
+ /** One collection per project, shared by every rule built from it (plan 0075). */
9
+ const cache = createElementCache();
6
10
  import { moduleContain, moduleNotContain, moduleUseInsteadOf, } from '../conditions/body-analysis-module.js';
7
11
  import { notHaveDefaultExport as notHaveDefaultExportCondition, haveDefaultExport as haveDefaultExportCondition, haveMaxExports as haveMaxExportsCondition, } from '../conditions/exports.js';
8
12
  import { onlyBeImportedVia as onlyBeImportedViaCondition, beImported as beImportedCondition, haveNoUnusedExports as haveNoUnusedExportsCondition, } from '../conditions/reverse-dependency.js';
@@ -21,7 +25,12 @@ import { onlyBeImportedVia as onlyBeImportedViaCondition, beImported as beImport
21
25
  */
22
26
  export class ModuleRuleBuilder extends RuleBuilder {
23
27
  getElements() {
24
- return this.project.getSourceFiles();
28
+ // Cached for uniformity rather than for speed: measured, 5 × `modules()`
29
+ // issues zero descendant queries and costs ~1ms, because this is a direct
30
+ // read of ts-morph's own accessor. Included so the population rule is
31
+ // "every RuleBuilder subclass that derives elements from the project",
32
+ // which a test can check, rather than a judgement call per builder.
33
+ return cache.get(this.project, SOLE_POPULATION, () => this.project.getSourceFiles());
25
34
  }
26
35
  // --- Identity predicates (from predicates/identity.ts) ---
27
36
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"module-rule-builder.js","sourceRoot":"","sources":["../../src/builders/module-rule-builder.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"module-rule-builder.js","sourceRoot":"","sources":["../../src/builders/module-rule-builder.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,7 @@
1
1
  import { FunctionRuleBuilder } from './function-rule-builder.js';
2
2
  import type { CallRuleBuilder } from './call-rule-builder.js';
3
3
  import type { ArchFunction } from '../models/arch-function.js';
4
+ import type { GlobNode } from '@nielspeter/eess';
4
5
  /**
5
6
  * A FunctionRuleBuilder that only examines callback functions
6
7
  * inside matched call expressions.
@@ -17,5 +18,15 @@ export declare class ScopedFunctionRuleBuilder extends FunctionRuleBuilder {
17
18
  * from the matched call expressions.
18
19
  */
19
20
  protected getElements(): ArchFunction[];
21
+ /**
22
+ * This builder's own globs, plus the wrapped call selection's.
23
+ *
24
+ * `within(selection).functions()` draws its subjects from `selection`, so a
25
+ * dead glob in the selection empties this rule just as surely as a dead
26
+ * glob on the rule itself — and inheriting `RuleBuilder.globs()` unchanged
27
+ * would report only half of that. The composition follows the element
28
+ * source, which is what `getElements()` above already does for subjects.
29
+ */
30
+ globs(): readonly GlobNode[];
20
31
  }
21
32
  //# sourceMappingURL=scoped-function-rule-builder.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"scoped-function-rule-builder.d.ts","sourceRoot":"","sources":["../../src/builders/scoped-function-rule-builder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAA;AAChE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AAC7D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAA;AAG9D;;;;;;;GAOG;AACH,qBAAa,yBAA0B,SAAQ,mBAAmB;IAChE,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAiB;gBAEnC,aAAa,EAAE,eAAe;IAK1C;;;OAGG;cACgB,WAAW,IAAI,YAAY,EAAE;CAMjD"}
1
+ {"version":3,"file":"scoped-function-rule-builder.d.ts","sourceRoot":"","sources":["../../src/builders/scoped-function-rule-builder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAA;AAChE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AAC7D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAA;AAC9D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAGhD;;;;;;;GAOG;AACH,qBAAa,yBAA0B,SAAQ,mBAAmB;IAChE,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAiB;gBAEnC,aAAa,EAAE,eAAe;IAK1C;;;OAGG;cACgB,WAAW,IAAI,YAAY,EAAE;IAOhD;;;;;;;;OAQG;IACM,KAAK,IAAI,SAAS,QAAQ,EAAE;CAGtC"}
@@ -22,5 +22,17 @@ export class ScopedFunctionRuleBuilder extends FunctionRuleBuilder {
22
22
  const matchedCalls = this.callSelection.getMatchedCalls();
23
23
  return matchedCalls.flatMap((archCall) => extractCallbacks(archCall.getNode()).map((ec) => ec.fn));
24
24
  }
25
+ /**
26
+ * This builder's own globs, plus the wrapped call selection's.
27
+ *
28
+ * `within(selection).functions()` draws its subjects from `selection`, so a
29
+ * dead glob in the selection empties this rule just as surely as a dead
30
+ * glob on the rule itself — and inheriting `RuleBuilder.globs()` unchanged
31
+ * would report only half of that. The composition follows the element
32
+ * source, which is what `getElements()` above already does for subjects.
33
+ */
34
+ globs() {
35
+ return [...this.callSelection.globs(), ...super.globs()];
36
+ }
25
37
  }
26
38
  //# sourceMappingURL=scoped-function-rule-builder.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"scoped-function-rule-builder.js","sourceRoot":"","sources":["../../src/builders/scoped-function-rule-builder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAA;AAGhE,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAA;AAEnE;;;;;;;GAOG;AACH,MAAM,OAAO,yBAA0B,SAAQ,mBAAmB;IAC/C,aAAa,CAAiB;IAE/C,YAAY,aAA8B;QACxC,KAAK,CAAC,aAAa,CAAC,UAAU,EAAE,CAAC,CAAA;QACjC,IAAI,CAAC,aAAa,GAAG,aAAa,CAAA;IACpC,CAAC;IAED;;;OAGG;IACgB,WAAW;QAC5B,MAAM,YAAY,GAAG,IAAI,CAAC,aAAa,CAAC,eAAe,EAAE,CAAA;QACzD,OAAO,YAAY,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE,CACvC,gBAAgB,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CACxD,CAAA;IACH,CAAC;CACF"}
1
+ {"version":3,"file":"scoped-function-rule-builder.js","sourceRoot":"","sources":["../../src/builders/scoped-function-rule-builder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAA;AAIhE,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAA;AAEnE;;;;;;;GAOG;AACH,MAAM,OAAO,yBAA0B,SAAQ,mBAAmB;IAC/C,aAAa,CAAiB;IAE/C,YAAY,aAA8B;QACxC,KAAK,CAAC,aAAa,CAAC,UAAU,EAAE,CAAC,CAAA;QACjC,IAAI,CAAC,aAAa,GAAG,aAAa,CAAA;IACpC,CAAC;IAED;;;OAGG;IACgB,WAAW;QAC5B,MAAM,YAAY,GAAG,IAAI,CAAC,aAAa,CAAC,eAAe,EAAE,CAAA;QACzD,OAAO,YAAY,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE,CACvC,gBAAgB,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CACxD,CAAA;IACH,CAAC;IAED;;;;;;;;OAQG;IACM,KAAK;QACZ,OAAO,CAAC,GAAG,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,EAAE,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC,CAAA;IAC1D,CAAC;CACF"}
@@ -0,0 +1,36 @@
1
+ import type { ArchViolation } from '@nielspeter/eess';
2
+ import type { ArchProject } from '../core/project.js';
3
+ import type { DiscoverySource } from './slice-rule-builder.js';
4
+ /**
5
+ * What a slice rule says when its discovery found nothing.
6
+ *
7
+ * Split from the builder because composing the explanation is not deciding one
8
+ * is warranted — and it is the larger half. The two inputs the family reads,
9
+ * the project and the discovery declaration, arrive as arguments.
10
+ */
11
+ /**
12
+ * The remedy for empty discovery, derived from how slices were sourced *and*
13
+ * from the globs actually given.
14
+ *
15
+ * Bug 0009 was a single hardcoded remedy that was correct for one source and
16
+ * false for the other. Branching only on the source is not enough: telling a
17
+ * caller to add a `**\/` prefix they already have, or to check a directory that
18
+ * plainly exists, is the same defect one level down. So each branch below is
19
+ * reachable only when its advice is actually true (ADR-008).
20
+ */
21
+ export declare function emptyDiscoveryMessage(project: ArchProject, discovery: DiscoverySource | undefined): string;
22
+ /**
23
+ * A config-level finding: the rule is misconfigured, so it checks nothing.
24
+ *
25
+ * Deliberately does NOT carry the rule author's `suggestion`/`docs`. Those
26
+ * describe how to fix a *real* violation of the rule ("Split the cycle"), and the
27
+ * formatter renders `suggestion` under `Fix:` — the field an agent obeys. Pairing
28
+ * a configuration message with an unrelated `Fix:` is a false remedy by
29
+ * juxtaposition, no matter how accurate each half is on its own.
30
+ */
31
+ export declare function metaViolation(message: string, metadata: {
32
+ id?: string;
33
+ suggestion?: string;
34
+ docs?: string;
35
+ } | undefined, reason: string | undefined): ArchViolation;
36
+ //# sourceMappingURL=slice-discovery-message.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slice-discovery-message.d.ts","sourceRoot":"","sources":["../../src/builders/slice-discovery-message.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AACrD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AACrD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAA;AA0B9D;;;;;;GAMG;AAEH;;;;;;;;;GASG;AACH,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,WAAW,EACpB,SAAS,EAAE,eAAe,GAAG,SAAS,GACrC,MAAM,CA0BR;AAwHD;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAC3B,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE;IAAE,EAAE,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,EACzE,MAAM,EAAE,MAAM,GAAG,SAAS,GACzB,aAAa,CAuBf"}
@@ -0,0 +1,181 @@
1
+ import { emptyProjectAdvice, loadedNothing } from '../core/empty-project-advice.js';
2
+ import { matchingGlobPrefix } from '../models/slice.js';
3
+ import { FAULT_ADVICE, GLOB_DOCS, syntacticFault } from '../core/glob-diagnosis.js';
4
+ import { isProjectRelative } from '../core/project-relative.js';
5
+ /** How many causes a group names before it summarises the rest. */
6
+ const MAX_NAMED_CAUSES_PER_GROUP = 4;
7
+ /**
8
+ * Rule builder for slice-level architecture rules.
9
+ *
10
+ * Unlike other builders that extend RuleBuilder<T>, SliceRuleBuilder
11
+ * has its own chain because the grouping step (matching/assignedFrom)
12
+ * replaces the predicate phase entirely.
13
+ *
14
+ * Usage:
15
+ * slices(project).matching(glob).should().beFreeOfCycles().check()
16
+ * slices(project).assignedFrom(def).should().respectLayerOrder(...).check()
17
+ */
18
+ /** The shared advice starts lowercase for `diagnose`; here it opens a sentence. */
19
+ function capitalize(text) {
20
+ return text.charAt(0).toUpperCase() + text.slice(1);
21
+ }
22
+ /**
23
+ * What a slice rule says when its discovery found nothing.
24
+ *
25
+ * Split from the builder because composing the explanation is not deciding one
26
+ * is warranted — and it is the larger half. The two inputs the family reads,
27
+ * the project and the discovery declaration, arrive as arguments.
28
+ */
29
+ /**
30
+ * The remedy for empty discovery, derived from how slices were sourced *and*
31
+ * from the globs actually given.
32
+ *
33
+ * Bug 0009 was a single hardcoded remedy that was correct for one source and
34
+ * false for the other. Branching only on the source is not enough: telling a
35
+ * caller to add a `**\/` prefix they already have, or to check a directory that
36
+ * plainly exists, is the same defect one level down. So each branch below is
37
+ * reachable only when its advice is actually true (ADR-008).
38
+ */
39
+ export function emptyDiscoveryMessage(project, discovery) {
40
+ const tail = 'A slice rule that discovers nothing enforces nothing.';
41
+ if (!discovery) {
42
+ return ('No slice source: call .matching(glob) or .assignedFrom(definition) ' +
43
+ `before .should(). ${tail}`);
44
+ }
45
+ // Nothing can match when the project loaded no files at all — blaming the
46
+ // glob would send the caller to the wrong file entirely.
47
+ if (loadedNothing(project)) {
48
+ // The SAME string `diagnose()` reports, from the one place that owns it.
49
+ // These were two texts for one state and had already diverged: this copy
50
+ // said only "check that this tsconfig includes your sources", which is
51
+ // not actionable for a config that has no `include` at all — and this is
52
+ // the copy a failing build prints.
53
+ return `${capitalize(emptyProjectAdvice(project))}. ${tail}`;
54
+ }
55
+ if (discovery.mode === 'matching') {
56
+ return matchingDiscoveryMessage(project, discovery.glob, tail);
57
+ }
58
+ return assignedFromDiscoveryMessage(discovery.entries, tail);
59
+ }
60
+ /**
61
+ * Why a `matching(glob)` discovery resolved no slices.
62
+ *
63
+ * Its own method because the two discovery modes are two independent fault
64
+ * ladders that share only the closing sentence — `emptyDiscoveryMessage` was
65
+ * both of them plus the guards, and read as one method only by adjacency.
66
+ *
67
+ * Takes the glob rather than re-reading `discovery`: the caller has
68
+ * already narrowed the mode, and narrowing twice is how the two copies drift.
69
+ */
70
+ function matchingDiscoveryMessage(project, glob, tail) {
71
+ const prefix = matchingGlobPrefix(glob);
72
+ // No literal directory prefix at all ('src', '*', '{a,b}/x/*'). Telling the
73
+ // caller to "check the prefix" would send them to inspect something that does
74
+ // not exist — the false-remedy shape this guard keeps relapsing into.
75
+ if (prefix === '') {
76
+ return (`matching(${JSON.stringify(glob)}) has no literal directory prefix, so there is ` +
77
+ 'nothing to locate in your file paths. It needs at least one plain directory ' +
78
+ `segment before the wildcard, e.g. "src/features/*". ${tail}`);
79
+ }
80
+ // Check the claim before making it. The prefix is located with a literal
81
+ // `indexOf` while the pattern goes through picomatch, and the two disagree
82
+ // for prefixes containing `(`, `{` or `!` — so "the prefix was not found"
83
+ // was a verifiable falsehood on exactly the route-group directory names this
84
+ // parser is careful to treat as literal elsewhere.
85
+ const prefixExists = project.getSourceFiles().some((file) => file.getFilePath().includes(prefix));
86
+ if (prefixExists) {
87
+ return (`matching(${JSON.stringify(glob)}) resolved no slices even though the prefix ` +
88
+ `${JSON.stringify(prefix)} does occur in this project's files, so the rest of the ` +
89
+ 'glob matched nothing. If a path segment contains "(", ")", "{", "}" or "!", those ' +
90
+ 'are pattern syntax rather than literal characters here — match that level with ' +
91
+ `"*" instead. ${tail}`);
92
+ }
93
+ return (`matching(${JSON.stringify(glob)}) resolved no slices: the prefix ` +
94
+ `${JSON.stringify(prefix)} was not found in any of this project's ` +
95
+ `${String(project.getSourceFiles().length)} file paths. Compare it against a ` +
96
+ 'real path — the segment after the prefix names each slice (a directory when files ' +
97
+ `are nested under it, otherwise each matching file name). ${tail}`);
98
+ }
99
+ /**
100
+ * Why an `assignedFrom(...)` discovery resolved no slices.
101
+ *
102
+ * Reports EVERY entry, grouped by its own cause — reporting one group and
103
+ * stopping, or applying one group's advice to all of them, is what made each
104
+ * earlier version of this message false for somebody.
105
+ */
106
+ function assignedFromDiscoveryMessage(entries, tail) {
107
+ if (entries.length === 0) {
108
+ return ('assignedFrom() was given no entries, so there are no slices to check. Pass at ' +
109
+ `least one name-to-glob mapping, e.g. { services: "**/src/services/**" }. ${tail}`);
110
+ }
111
+ // Every entry is at fault (all slices are empty), so every entry is reported,
112
+ // grouped by its own cause. Reporting one group and stopping — or applying one
113
+ // group's advice to all of them — is what made each earlier version of this
114
+ // message false for somebody.
115
+ const clauses = faultGroups(entries).map((group) => {
116
+ // Cap per group, never across groups, so no cause is hidden entirely — and
117
+ // always keep an entry whose key the docs single out as error-prone.
118
+ const notable = group.list.filter((entry) => /shared/i.test(entry.name));
119
+ const ordered = [...notable, ...group.list.filter((entry) => !notable.includes(entry))];
120
+ const head = ordered.slice(0, MAX_NAMED_CAUSES_PER_GROUP);
121
+ const rest = ordered.length - head.length;
122
+ const named = head.map((entry) => `${entry.name}: ${JSON.stringify(entry.glob)}`).join(', ') +
123
+ (rest > 0 ? `, and ${String(rest)} more` : '');
124
+ return `${FAULT_ADVICE[group.fault]}: ${named}`;
125
+ });
126
+ return `Every slice in assignedFrom(...) is empty. ${clauses.join('. Separately, ')}. ${tail}`;
127
+ }
128
+ /**
129
+ * The entries, grouped by the fault that explains them, in reporting order.
130
+ *
131
+ * Syntactic only: this runs while explaining why EVERY slice is empty, so
132
+ * "matched no file" is already established and the useful split is between the
133
+ * two causes with a verifiable fix.
134
+ */
135
+ function faultGroups(entries) {
136
+ const FAULT_ORDER = ['dot-segment', 'unanchored', 'no-match'];
137
+ return FAULT_ORDER.map((fault) => ({
138
+ fault,
139
+ list: entries.filter((entry) =>
140
+ // The SAME base the declaration uses (bug 0033). With the default
141
+ // `'absolute'`, a project-relative glob is classified `unanchored` and
142
+ // the message tells the author to prefix `"**/"` — advice that stopped
143
+ // being true when this entry point started resolving one against the
144
+ // project root. It would now send them to change a glob whose spelling
145
+ // is fine and whose folder is simply missing.
146
+ (syntacticFault(entry.glob, 'file-path', isProjectRelative(entry.glob) ? 'normalized' : 'absolute') ?? 'no-match') === fault),
147
+ })).filter((group) => group.list.length > 0);
148
+ }
149
+ /**
150
+ * A config-level finding: the rule is misconfigured, so it checks nothing.
151
+ *
152
+ * Deliberately does NOT carry the rule author's `suggestion`/`docs`. Those
153
+ * describe how to fix a *real* violation of the rule ("Split the cycle"), and the
154
+ * formatter renders `suggestion` under `Fix:` — the field an agent obeys. Pairing
155
+ * a configuration message with an unrelated `Fix:` is a false remedy by
156
+ * juxtaposition, no matter how accurate each half is on its own.
157
+ */
158
+ export function metaViolation(message, metadata, reason) {
159
+ const id = metadata?.id ?? 'slices';
160
+ return {
161
+ rule: id,
162
+ ruleId: metadata?.id,
163
+ element: id,
164
+ file: '',
165
+ line: 0,
166
+ message,
167
+ because: reason,
168
+ // Its own remedy, not the rule author's (bug 0021). Deliberately generic:
169
+ // the specific, per-branch diagnosis is already in `message`, where
170
+ // `emptyDiscoveryMessage` derives it and — per the comment there — each
171
+ // branch is reachable only when its advice is actually true. Restating that
172
+ // in `suggestion` would mean two texts to keep in agreement, which is the
173
+ // drift this project keeps paying for. So the `Fix:` line names the two
174
+ // actions that hold in every branch and points at the diagnosis.
175
+ suggestion: 'A slice rule that discovers nothing cannot enforce anything: correct the cause ' +
176
+ 'named in the message, or remove the rule.',
177
+ docs: GLOB_DOCS,
178
+ bypassFilters: true,
179
+ };
180
+ }
181
+ //# sourceMappingURL=slice-discovery-message.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slice-discovery-message.js","sourceRoot":"","sources":["../../src/builders/slice-discovery-message.ts"],"names":[],"mappings":"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"}
@@ -1,22 +1,55 @@
1
+ import type { RuleDescription } from '@nielspeter/eess';
2
+ import type { CollectResult } from '../core/terminal-builder.js';
1
3
  import type { ArchProject } from '../core/project.js';
2
- import type { ArchViolation } from '../core/violation.js';
3
- import { TerminalBuilder } from '@nielspeter/eess';
4
+ import type { GlobNode } from '@nielspeter/eess';
5
+ import { TerminalBuilder } from '../core/terminal-builder.js';
4
6
  import type { SliceDefinition } from '../models/slice.js';
7
+ import type { ImportOptions } from '../core/import-options.js';
8
+ /**
9
+ * How many causes one group names before it truncates to "and N more".
10
+ *
11
+ * Per GROUP, never across groups, so no cause is hidden entirely — see the call
12
+ * site. Four is a readability budget, not a semantic limit.
13
+ */
14
+ /**
15
+ * How slices were sourced. Recorded so an empty-discovery failure can state the
16
+ * remedy that actually works: `matching()` takes one glob whose literal prefix
17
+ * locates the slices, `assignedFrom()` takes globs matched against the whole
18
+ * absolute path, and their failure modes differ — so one generic hint would
19
+ * misdirect half of all callers (ADR-008 — a failure must carry its sanctioned
20
+ * fix). Declared before the class's own doc block so it does not detach it.
21
+ */
22
+ export type DiscoverySource = {
23
+ readonly mode: 'matching';
24
+ readonly glob: string;
25
+ } | {
26
+ readonly mode: 'assignedFrom';
27
+ readonly entries: readonly {
28
+ readonly name: string;
29
+ readonly glob: string;
30
+ }[];
31
+ };
5
32
  /**
6
33
  * Rule builder for slice-level architecture rules.
7
34
  *
8
- * Unlike other builders that extend RuleBuilder<T>, SliceRuleBuilder
9
- * has its own chain because the grouping step (matching/assignedFrom)
10
- * replaces the predicate phase entirely.
35
+ * Unlike the builders that extend `RuleBuilder<T>`, this one has its own chain:
36
+ * the grouping step (`matching` / `assignedFrom`) replaces the predicate phase
37
+ * entirely, because a slice is defined by how files are grouped rather than by a
38
+ * predicate over already-selected subjects.
11
39
  *
12
- * Usage:
13
- * slices(project).matching(glob).should().beFreeOfCycles().check()
14
- * slices(project).assignedFrom(def).should().respectLayerOrder(...).check()
40
+ * ```ts
41
+ * slices(project).matching(glob).should().beFreeOfCycles().check()
42
+ * slices(project).assignedFrom(def).should().respectLayerOrder(...).check()
43
+ * ```
44
+ *
45
+ * This class carried a docblock on `main` and lost it when the file was split
46
+ * for `eess/max-class-lines`; it is restored rather than rewritten.
15
47
  */
16
48
  export declare class SliceRuleBuilder extends TerminalBuilder {
17
49
  private readonly project;
18
50
  private _slices;
19
- private readonly _conditions;
51
+ private _discovery?;
52
+ private _conditions;
20
53
  constructor(project: ArchProject);
21
54
  /**
22
55
  * Define slices by glob matching. Each directory matching the glob
@@ -41,6 +74,32 @@ export declare class SliceRuleBuilder extends TerminalBuilder {
41
74
  * })
42
75
  */
43
76
  assignedFrom(definition: SliceDefinition): this;
77
+ /** The project this rule was built against. See `RuleBuilder.getProject`. */
78
+ getProject(): ArchProject;
79
+ /**
80
+ * The discovery globs this rule was scoped with.
81
+ *
82
+ * `assignedFrom` fans out into one slice per entry, so each entry is its own
83
+ * tree: one dead layer glob is one empty slice, and folding them into an
84
+ * `any` node would say "no fault unless every slice is empty" — a false
85
+ * green. This is the same reason a preset's option list is not an `any`
86
+ * node.
87
+ *
88
+ * `matching()` needs no `base` special case, because it declares the glob
89
+ * `parseMatchingGlob` produces rather than the one the author wrote — and
90
+ * that one is already anchored. Declaring the author's spelling and
91
+ * exempting it via `base` was the earlier design, and it reported every
92
+ * nested-layout rule as dead while looking correct on a flat fixture.
93
+ */
94
+ globs(): readonly GlobNode[];
95
+ /**
96
+ * An independent copy, carrying the condition list and the resolved slices.
97
+ *
98
+ * `_slices` is replaced wholesale by both discovery methods, so only the
99
+ * condition array needs its own copy — but it is listed here anyway, because
100
+ * the next person to add a field will read this method, not the two callers.
101
+ */
102
+ protected copy(): this;
44
103
  /**
45
104
  * Begin the condition phase. Returns `this` for chaining.
46
105
  */
@@ -52,22 +111,102 @@ export declare class SliceRuleBuilder extends TerminalBuilder {
52
111
  /**
53
112
  * Assert that no circular dependencies exist between slices.
54
113
  */
55
- beFreeOfCycles(): this;
114
+ /**
115
+ * @param options - `ignoreTypeImports` defaults to **true**: a type-only import
116
+ * is erased at compile time and creates no runtime dependency, so counting it
117
+ * as a cycle edge reports cycles that cannot exist (plan 0084). Pass
118
+ * `{ ignoreTypeImports: false }` to count type-only edges too.
119
+ * NOT a way back to the pre-0.47 graph: since v0.48.0 re-exports are counted as
120
+ * well, so type edges plus re-export edges is WIDER than 0.46.1 ever was.
121
+ */
122
+ beFreeOfCycles(options?: ImportOptions): this;
56
123
  /**
57
124
  * Assert that slices respect a layered dependency order.
58
125
  * Layer N may depend on layers N+1, N+2, ... but NOT on layers with lower index.
59
126
  *
60
127
  * @param layers - Ordered layer names from highest to lowest
61
128
  */
129
+ respectLayerOrder(layers: string[], options: ImportOptions): this;
62
130
  respectLayerOrder(...layers: string[]): this;
63
131
  /**
64
132
  * Assert that no slice depends on any of the listed slices.
65
133
  *
66
- * @param sliceNames - Names of forbidden dependency targets
134
+ * **Type-only edges COUNT by default here**, unlike `beFreeOfCycles()`. It looks
135
+ * inconsistent and it is deliberate: a cycle is about runtime module-initialization
136
+ * order, so an erased edge cannot contribute to one — but isolation is about
137
+ * *coupling*, and a type-only dependency on `legacy` is still a dependency on
138
+ * `legacy` that breaks when `legacy` is deleted. This matches `dependOn` and
139
+ * `notImportFrom` as shipped. Pass `{ ignoreTypeImports: true }` to disagree.
140
+ *
141
+ * Counts every edge kind `notImportFrom()` counts, including `import('…')` and
142
+ * `type X = import('…').Y`. `require()` is not counted (ESM-only, ADR-004).
143
+ *
144
+ * @param args - Forbidden slice names, or `(names[], options)`
145
+ *
146
+ * @example
147
+ * .should().notDependOn('legacy', 'deprecated')
148
+ * .should().notDependOn(['legacy'], { ignoreTypeImports: true })
67
149
  */
150
+ notDependOn(sliceNames: string[], options: ImportOptions): this;
68
151
  notDependOn(...sliceNames: string[]): this;
69
- protected collectViolations(): ArchViolation[];
152
+ /**
153
+ * Whether this rule states an assertion at all — the assertion gate's question.
154
+ *
155
+ * True once a condition has been added; a slice selection with none can never fail.
156
+ *
157
+ * Overrides the `TerminalBuilder` default (`true`), whose JSDoc carries the
158
+ * contract and the reason this is public rather than protected.
159
+ */
160
+ assertsSomething(): boolean;
161
+ /**
162
+ * The remedy for this builder's assertion-less state, as one string.
163
+ *
164
+ * One channel, so `diagnose()`'s advice and the finding's own message cannot
165
+ * disagree. Overrides `TerminalBuilder`'s generic text with wording specific to
166
+ * what this builder is missing.
167
+ */
168
+ assertionAdvice(): string;
169
+ /**
170
+ * Named by id when one is set, else by the rule description (plan 0070 §4).
171
+ * The inherited root version says 'unnamed' for every id-less rule, which
172
+ * made three of the assertion hooks unlocatable in a doctor report.
173
+ */
174
+ describeRule(): RuleDescription;
175
+ /**
176
+ * Slice discovery is not per-tree, so the gate must stay out (plan 0080).
177
+ *
178
+ * `assignedFrom` fans out one glob tree per entry, and a single dead entry among
179
+ * populated siblings is a dead *tree* — which the gate would report. That guard
180
+ * was written and **withdrawn before release** for firing on legitimate
181
+ * projects (see `collectViolations` below): a layer not created yet, and the
182
+ * `strict-boundaries` scaffold itself.
183
+ *
184
+ * The all-empty case is handled here too, with a message the gate cannot match
185
+ * — it names the discovery mode and its remedy (bug 0009's corpus). So this
186
+ * builder owns both halves.
187
+ *
188
+ * **Why this is a builder-level `true` while `PairFinalBuilder` asks its
189
+ * condition** (`owns-empty-discovery.ts`, plan 0081): there, ownership varies by
190
+ * condition, and a blanket `true` once suppressed the gate for the one condition
191
+ * that did not self-report. Here nothing varies — the reason is a property of
192
+ * `assignedFrom`'s fan-out, identical for every condition reachable through this
193
+ * builder. The asymmetry reflects the discovery models, not an oversight.
194
+ */
195
+ protected ownsDiscoveryDiagnosis(): boolean;
196
+ /**
197
+ * Slices holding at least one file — plan 0098.
198
+ *
199
+ * Counting `_slices.length` would count the SHAPE of the discovery rather than
200
+ * what was examined: `assignedFrom()` returns one slice per key whether or not
201
+ * anything matched, so the empty case is "every slice has no files", never "no
202
+ * slices" (arch-014 I1) — which is the same condition this family already
203
+ * fails closed on.
204
+ */
205
+ examinedUnits(): number;
206
+ protected collectViolations(): CollectResult;
70
207
  private buildRuleDescription;
208
+ /** Config-level meta-finding for empty slice discovery (plan 0067). */
209
+ private emptyDiscoveryViolation;
71
210
  }
72
211
  /**
73
212
  * Entry point: create a slice-level rule builder.
@@ -1 +1 @@
1
- {"version":3,"file":"slice-rule-builder.d.ts","sourceRoot":"","sources":["../../src/builders/slice-rule-builder.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AACrD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AAEzD,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AAClD,OAAO,KAAK,EAAS,eAAe,EAAE,MAAM,oBAAoB,CAAA;AAQhE;;;;;;;;;;GAUG;AACH,qBAAa,gBAAiB,SAAQ,eAAe;IAIvC,OAAO,CAAC,QAAQ,CAAC,OAAO;IAHpC,OAAO,CAAC,OAAO,CAAc;IAC7B,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAyB;gBAExB,OAAO,EAAE,WAAW;IAIjD;;;;;;;;;OASG;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAK5B;;;;;;;;;;OAUG;IACH,YAAY,CAAC,UAAU,EAAE,eAAe,GAAG,IAAI;IAK/C;;OAEG;IACH,MAAM,IAAI,IAAI;IAId;;OAEG;IACH,SAAS,IAAI,IAAI;IAIjB;;OAEG;IACH,cAAc,IAAI,IAAI;IAKtB;;;;;OAKG;IACH,iBAAiB,CAAC,GAAG,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI;IAK5C;;;;OAIG;IACH,WAAW,CAAC,GAAG,UAAU,EAAE,MAAM,EAAE,GAAG,IAAI;IAK1C,SAAS,CAAC,iBAAiB,IAAI,aAAa,EAAE;IA8B9C,OAAO,CAAC,oBAAoB;CAK7B;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,MAAM,CAAC,CAAC,EAAE,WAAW,GAAG,gBAAgB,CAEvD"}
1
+ {"version":3,"file":"slice-rule-builder.d.ts","sourceRoot":"","sources":["../../src/builders/slice-rule-builder.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AACvD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAA;AAChE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAGrD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAEhD,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAA;AAC7D,OAAO,KAAK,EAAS,eAAe,EAAE,MAAM,oBAAoB,CAAA;AAOhE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAA;AAS9D;;;;;GAKG;AAEH;;;;;;;GAOG;AACH,MAAM,MAAM,eAAe,GACvB;IAAE,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACpD;IACE,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAA;IAC7B,QAAQ,CAAC,OAAO,EAAE,SAAS;QAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;CAC9E,CAAA;AAEL;;;;;;;;;;;;;;;GAeG;AACH,qBAAa,gBAAiB,SAAQ,eAAe;IAKvC,OAAO,CAAC,QAAQ,CAAC,OAAO;IAJpC,OAAO,CAAC,OAAO,CAAc;IAC7B,OAAO,CAAC,UAAU,CAAC,CAAiB;IACpC,OAAO,CAAC,WAAW,CAAyB;gBAEf,OAAO,EAAE,WAAW;IAIjD;;;;;;;;;OASG;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAO5B;;;;;;;;;;OAUG;IACH,YAAY,CAAC,UAAU,EAAE,eAAe,GAAG,IAAI;IAQ/C,6EAA6E;IAC7E,UAAU,IAAI,WAAW;IAIzB;;;;;;;;;;;;;;OAcG;IACM,KAAK,IAAI,SAAS,QAAQ,EAAE;IA4CrC;;;;;;OAMG;cACgB,IAAI,IAAI,IAAI;IAO/B;;OAEG;IACH,MAAM,IAAI,IAAI;IAId;;OAEG;IACH,SAAS,IAAI,IAAI;IAIjB;;OAEG;IACH;;;;;;;OAOG;IACH,cAAc,CAAC,OAAO,CAAC,EAAE,aAAa,GAAG,IAAI;IAM7C;;;;;OAKG;IACH,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,aAAa,GAAG,IAAI;IACjE,iBAAiB,CAAC,GAAG,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI;IAqB5C;;;;;;;;;;;;;;;;;;OAkBG;IACH,WAAW,CAAC,UAAU,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,aAAa,GAAG,IAAI;IAC/D,WAAW,CAAC,GAAG,UAAU,EAAE,MAAM,EAAE,GAAG,IAAI;IAiB1C;;;;;;;OAOG;IACM,gBAAgB,IAAI,OAAO;IAIpC;;;;;;OAMG;IACM,eAAe,IAAI,MAAM;IAQlC;;;;OAIG;IACM,YAAY,IAAI,eAAe;IAaxC;;;;;;;;;;;;;;;;;;;OAmBG;cACgB,sBAAsB,IAAI,OAAO;IAIpD;;;;;;;;OAQG;IACH,aAAa,IAAI,MAAM;IAIvB,SAAS,CAAC,iBAAiB,IAAI,aAAa;IAmD5C,OAAO,CAAC,oBAAoB;IAM5B,uEAAuE;IACvE,OAAO,CAAC,uBAAuB;CAOhC;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,MAAM,CAAC,CAAC,EAAE,WAAW,GAAG,gBAAgB,CAEvD"}