@nielspeter/eess-ts 0.2.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (433) hide show
  1. package/README.md +87 -34
  2. package/dist/builders/call-rule-builder.d.ts +66 -26
  3. package/dist/builders/call-rule-builder.d.ts.map +1 -1
  4. package/dist/builders/call-rule-builder.js +73 -31
  5. package/dist/builders/call-rule-builder.js.map +1 -1
  6. package/dist/builders/class-rule-builder.d.ts +125 -26
  7. package/dist/builders/class-rule-builder.d.ts.map +1 -1
  8. package/dist/builders/class-rule-builder.js +134 -30
  9. package/dist/builders/class-rule-builder.js.map +1 -1
  10. package/dist/builders/correspondence-builder.d.ts +287 -0
  11. package/dist/builders/correspondence-builder.d.ts.map +1 -0
  12. package/dist/builders/correspondence-builder.js +393 -0
  13. package/dist/builders/correspondence-builder.js.map +1 -0
  14. package/dist/builders/correspondence-findings.d.ts +104 -0
  15. package/dist/builders/correspondence-findings.d.ts.map +1 -0
  16. package/dist/builders/correspondence-findings.js +301 -0
  17. package/dist/builders/correspondence-findings.js.map +1 -0
  18. package/dist/builders/cross-layer-builder.d.ts +99 -16
  19. package/dist/builders/cross-layer-builder.d.ts.map +1 -1
  20. package/dist/builders/cross-layer-builder.js +181 -35
  21. package/dist/builders/cross-layer-builder.js.map +1 -1
  22. package/dist/builders/function-rule-builder.d.ts +144 -25
  23. package/dist/builders/function-rule-builder.d.ts.map +1 -1
  24. package/dist/builders/function-rule-builder.js +173 -26
  25. package/dist/builders/function-rule-builder.js.map +1 -1
  26. package/dist/builders/jsx-rule-builder.d.ts +70 -14
  27. package/dist/builders/jsx-rule-builder.d.ts.map +1 -1
  28. package/dist/builders/jsx-rule-builder.js +73 -14
  29. package/dist/builders/jsx-rule-builder.js.map +1 -1
  30. package/dist/builders/module-rule-builder.d.ts +2 -2
  31. package/dist/builders/module-rule-builder.d.ts.map +1 -1
  32. package/dist/builders/module-rule-builder.js +12 -3
  33. package/dist/builders/module-rule-builder.js.map +1 -1
  34. package/dist/builders/scoped-function-rule-builder.d.ts +11 -0
  35. package/dist/builders/scoped-function-rule-builder.d.ts.map +1 -1
  36. package/dist/builders/scoped-function-rule-builder.js +12 -0
  37. package/dist/builders/scoped-function-rule-builder.js.map +1 -1
  38. package/dist/builders/slice-discovery-message.d.ts +36 -0
  39. package/dist/builders/slice-discovery-message.d.ts.map +1 -0
  40. package/dist/builders/slice-discovery-message.js +181 -0
  41. package/dist/builders/slice-discovery-message.js.map +1 -0
  42. package/dist/builders/slice-rule-builder.d.ts +151 -12
  43. package/dist/builders/slice-rule-builder.d.ts.map +1 -1
  44. package/dist/builders/slice-rule-builder.js +242 -35
  45. package/dist/builders/slice-rule-builder.js.map +1 -1
  46. package/dist/builders/type-rule-builder.d.ts +95 -24
  47. package/dist/builders/type-rule-builder.d.ts.map +1 -1
  48. package/dist/builders/type-rule-builder.js +105 -29
  49. package/dist/builders/type-rule-builder.js.map +1 -1
  50. package/dist/{helpers → builders}/within.d.ts +2 -2
  51. package/dist/builders/within.d.ts.map +1 -0
  52. package/dist/{helpers → builders}/within.js +1 -1
  53. package/dist/builders/within.js.map +1 -0
  54. package/dist/cli/commands/baseline.d.ts +3 -2
  55. package/dist/cli/commands/baseline.d.ts.map +1 -1
  56. package/dist/cli/commands/baseline.js +68 -6
  57. package/dist/cli/commands/baseline.js.map +1 -1
  58. package/dist/cli/commands/check.d.ts +7 -2
  59. package/dist/cli/commands/check.d.ts.map +1 -1
  60. package/dist/cli/commands/check.js +241 -45
  61. package/dist/cli/commands/check.js.map +1 -1
  62. package/dist/cli/commands/doctor.d.ts +29 -0
  63. package/dist/cli/commands/doctor.d.ts.map +1 -0
  64. package/dist/cli/commands/doctor.js +224 -0
  65. package/dist/cli/commands/doctor.js.map +1 -0
  66. package/dist/cli/commands/explain.d.ts +2 -1
  67. package/dist/cli/commands/explain.d.ts.map +1 -1
  68. package/dist/cli/commands/explain.js +19 -10
  69. package/dist/cli/commands/explain.js.map +1 -1
  70. package/dist/cli/commands/init.d.ts +9 -3
  71. package/dist/cli/commands/init.d.ts.map +1 -1
  72. package/dist/cli/commands/init.js +162 -137
  73. package/dist/cli/commands/init.js.map +1 -1
  74. package/dist/cli/import-rule-module.d.ts +29 -0
  75. package/dist/cli/import-rule-module.d.ts.map +1 -0
  76. package/dist/cli/import-rule-module.js +60 -0
  77. package/dist/cli/import-rule-module.js.map +1 -0
  78. package/dist/cli/index.d.ts +2 -2
  79. package/dist/cli/index.d.ts.map +1 -1
  80. package/dist/cli/index.js +98 -33
  81. package/dist/cli/index.js.map +1 -1
  82. package/dist/cli/load-rules.d.ts +6 -11
  83. package/dist/cli/load-rules.d.ts.map +1 -1
  84. package/dist/cli/load-rules.js +21 -29
  85. package/dist/cli/load-rules.js.map +1 -1
  86. package/dist/cli/resolve-config.d.ts.map +1 -1
  87. package/dist/cli/resolve-config.js +24 -14
  88. package/dist/cli/resolve-config.js.map +1 -1
  89. package/dist/cli/rule-file-findings.d.ts +178 -0
  90. package/dist/cli/rule-file-findings.d.ts.map +1 -0
  91. package/dist/cli/rule-file-findings.js +293 -0
  92. package/dist/cli/rule-file-findings.js.map +1 -0
  93. package/dist/cli/watch.d.ts +20 -7
  94. package/dist/cli/watch.d.ts.map +1 -1
  95. package/dist/cli/watch.js +39 -14
  96. package/dist/cli/watch.js.map +1 -1
  97. package/dist/conditions/body-analysis-function.d.ts.map +1 -1
  98. package/dist/conditions/body-analysis-function.js +16 -7
  99. package/dist/conditions/body-analysis-function.js.map +1 -1
  100. package/dist/conditions/body-analysis-module.d.ts.map +1 -1
  101. package/dist/conditions/body-analysis-module.js +14 -9
  102. package/dist/conditions/body-analysis-module.js.map +1 -1
  103. package/dist/conditions/body-analysis.d.ts.map +1 -1
  104. package/dist/conditions/body-analysis.js +16 -7
  105. package/dist/conditions/body-analysis.js.map +1 -1
  106. package/dist/conditions/call.d.ts.map +1 -1
  107. package/dist/conditions/call.js +38 -17
  108. package/dist/conditions/call.js.map +1 -1
  109. package/dist/conditions/catch-analysis.d.ts +2 -1
  110. package/dist/conditions/catch-analysis.d.ts.map +1 -1
  111. package/dist/conditions/catch-analysis.js.map +1 -1
  112. package/dist/conditions/cross-layer.d.ts +2 -10
  113. package/dist/conditions/cross-layer.d.ts.map +1 -1
  114. package/dist/conditions/cross-layer.js +227 -23
  115. package/dist/conditions/cross-layer.js.map +1 -1
  116. package/dist/conditions/dependency.d.ts +35 -6
  117. package/dist/conditions/dependency.d.ts.map +1 -1
  118. package/dist/conditions/dependency.js +299 -45
  119. package/dist/conditions/dependency.js.map +1 -1
  120. package/dist/conditions/exports.d.ts.map +1 -1
  121. package/dist/conditions/exports.js +10 -0
  122. package/dist/conditions/exports.js.map +1 -1
  123. package/dist/conditions/function.d.ts.map +1 -1
  124. package/dist/conditions/function.js +19 -5
  125. package/dist/conditions/function.js.map +1 -1
  126. package/dist/conditions/helpers.d.ts +2 -1
  127. package/dist/conditions/helpers.d.ts.map +1 -1
  128. package/dist/conditions/helpers.js +4 -1
  129. package/dist/conditions/helpers.js.map +1 -1
  130. package/dist/conditions/jsx.d.ts.map +1 -1
  131. package/dist/conditions/jsx.js +7 -2
  132. package/dist/conditions/jsx.js.map +1 -1
  133. package/dist/conditions/match-identity.d.ts +43 -0
  134. package/dist/conditions/match-identity.d.ts.map +1 -0
  135. package/dist/conditions/match-identity.js +43 -0
  136. package/dist/conditions/match-identity.js.map +1 -0
  137. package/dist/conditions/members.d.ts.map +1 -1
  138. package/dist/conditions/members.js +17 -4
  139. package/dist/conditions/members.js.map +1 -1
  140. package/dist/conditions/reverse-dependency.d.ts +18 -5
  141. package/dist/conditions/reverse-dependency.d.ts.map +1 -1
  142. package/dist/conditions/reverse-dependency.js +109 -92
  143. package/dist/conditions/reverse-dependency.js.map +1 -1
  144. package/dist/conditions/slice.d.ts +86 -2
  145. package/dist/conditions/slice.d.ts.map +1 -1
  146. package/dist/conditions/slice.js +234 -53
  147. package/dist/conditions/slice.js.map +1 -1
  148. package/dist/conditions/structural.d.ts.map +1 -1
  149. package/dist/conditions/structural.js +16 -4
  150. package/dist/conditions/structural.js.map +1 -1
  151. package/dist/core/check-all.d.ts +19 -0
  152. package/dist/core/check-all.d.ts.map +1 -0
  153. package/dist/core/check-all.js +96 -0
  154. package/dist/core/check-all.js.map +1 -0
  155. package/dist/core/combinators.d.ts +48 -0
  156. package/dist/core/combinators.d.ts.map +1 -0
  157. package/dist/core/combinators.js +56 -0
  158. package/dist/core/combinators.js.map +1 -0
  159. package/dist/core/descendant-cache.d.ts +36 -0
  160. package/dist/core/descendant-cache.d.ts.map +1 -0
  161. package/dist/core/descendant-cache.js +119 -0
  162. package/dist/core/descendant-cache.js.map +1 -0
  163. package/dist/core/diagnose.d.ts +234 -0
  164. package/dist/core/diagnose.d.ts.map +1 -0
  165. package/dist/core/diagnose.js +382 -0
  166. package/dist/core/diagnose.js.map +1 -0
  167. package/dist/core/disk-set.d.ts +48 -0
  168. package/dist/core/disk-set.d.ts.map +1 -0
  169. package/dist/core/disk-set.js +218 -0
  170. package/dist/core/disk-set.js.map +1 -0
  171. package/dist/core/element-cache.d.ts +75 -0
  172. package/dist/core/element-cache.d.ts.map +1 -0
  173. package/dist/core/element-cache.js +32 -0
  174. package/dist/core/element-cache.js.map +1 -0
  175. package/dist/core/empty-project-advice.d.ts +75 -0
  176. package/dist/core/empty-project-advice.d.ts.map +1 -0
  177. package/dist/core/empty-project-advice.js +61 -0
  178. package/dist/core/empty-project-advice.js.map +1 -0
  179. package/dist/core/exclusion-comments.d.ts +54 -0
  180. package/dist/core/exclusion-comments.d.ts.map +1 -0
  181. package/dist/core/exclusion-comments.js +310 -0
  182. package/dist/core/exclusion-comments.js.map +1 -0
  183. package/dist/core/execute-rule.d.ts +150 -0
  184. package/dist/core/execute-rule.d.ts.map +1 -0
  185. package/dist/core/execute-rule.js +580 -0
  186. package/dist/core/execute-rule.js.map +1 -0
  187. package/dist/core/glob-diagnosis.d.ts +78 -0
  188. package/dist/core/glob-diagnosis.d.ts.map +1 -0
  189. package/dist/core/glob-diagnosis.js +134 -0
  190. package/dist/core/glob-diagnosis.js.map +1 -0
  191. package/dist/core/glob-evaluator.d.ts +48 -0
  192. package/dist/core/glob-evaluator.d.ts.map +1 -0
  193. package/dist/core/glob-evaluator.js +89 -0
  194. package/dist/core/glob-evaluator.js.map +1 -0
  195. package/dist/core/import-candidates.d.ts +60 -0
  196. package/dist/core/import-candidates.d.ts.map +1 -0
  197. package/dist/core/import-candidates.js +93 -0
  198. package/dist/core/import-candidates.js.map +1 -0
  199. package/dist/core/import-options.d.ts +55 -2
  200. package/dist/core/import-options.d.ts.map +1 -1
  201. package/dist/core/import-options.js +64 -0
  202. package/dist/core/import-options.js.map +1 -1
  203. package/dist/core/line-index.d.ts +3 -0
  204. package/dist/core/line-index.d.ts.map +1 -0
  205. package/dist/core/line-index.js +229 -0
  206. package/dist/core/line-index.js.map +1 -0
  207. package/dist/core/metric-violation.d.ts +86 -0
  208. package/dist/core/metric-violation.d.ts.map +1 -0
  209. package/dist/core/metric-violation.js +132 -0
  210. package/dist/core/metric-violation.js.map +1 -0
  211. package/dist/core/module-edges.d.ts +361 -0
  212. package/dist/core/module-edges.d.ts.map +1 -0
  213. package/dist/core/module-edges.js +592 -0
  214. package/dist/core/module-edges.js.map +1 -0
  215. package/dist/core/object-literal-functions.d.ts +42 -0
  216. package/dist/core/object-literal-functions.d.ts.map +1 -0
  217. package/dist/core/object-literal-functions.js +75 -0
  218. package/dist/core/object-literal-functions.js.map +1 -0
  219. package/dist/core/orphan-exclusions.d.ts +44 -0
  220. package/dist/core/orphan-exclusions.d.ts.map +1 -0
  221. package/dist/core/orphan-exclusions.js +214 -0
  222. package/dist/core/orphan-exclusions.js.map +1 -0
  223. package/dist/core/pair-condition.d.ts +32 -3
  224. package/dist/core/pair-condition.d.ts.map +1 -1
  225. package/dist/core/path-universe.d.ts +54 -0
  226. package/dist/core/path-universe.d.ts.map +1 -0
  227. package/dist/core/path-universe.js +65 -0
  228. package/dist/core/path-universe.js.map +1 -0
  229. package/dist/core/per-root-compiler-options.d.ts +20 -0
  230. package/dist/core/per-root-compiler-options.d.ts.map +1 -0
  231. package/dist/core/per-root-compiler-options.js +57 -0
  232. package/dist/core/per-root-compiler-options.js.map +1 -0
  233. package/dist/core/project-relative.d.ts +98 -0
  234. package/dist/core/project-relative.d.ts.map +1 -0
  235. package/dist/core/project-relative.js +185 -0
  236. package/dist/core/project-relative.js.map +1 -0
  237. package/dist/core/project.d.ts +7 -1
  238. package/dist/core/project.d.ts.map +1 -1
  239. package/dist/core/project.js +24 -0
  240. package/dist/core/project.js.map +1 -1
  241. package/dist/core/rule-builder.d.ts +282 -0
  242. package/dist/core/rule-builder.d.ts.map +1 -0
  243. package/dist/core/rule-builder.js +445 -0
  244. package/dist/core/rule-builder.js.map +1 -0
  245. package/dist/core/rule-declaration.d.ts +32 -0
  246. package/dist/core/rule-declaration.d.ts.map +1 -0
  247. package/dist/core/rule-declaration.js +126 -0
  248. package/dist/core/rule-declaration.js.map +1 -0
  249. package/dist/core/terminal-builder.d.ts +625 -0
  250. package/dist/core/terminal-builder.d.ts.map +1 -0
  251. package/dist/core/terminal-builder.js +787 -0
  252. package/dist/core/terminal-builder.js.map +1 -0
  253. package/dist/core/terminal-execution.d.ts +23 -0
  254. package/dist/core/terminal-execution.d.ts.map +1 -0
  255. package/dist/core/terminal-execution.js +71 -0
  256. package/dist/core/terminal-execution.js.map +1 -0
  257. package/dist/core/vacuity-diagnosis.d.ts +103 -0
  258. package/dist/core/vacuity-diagnosis.d.ts.map +1 -0
  259. package/dist/core/vacuity-diagnosis.js +415 -0
  260. package/dist/core/vacuity-diagnosis.js.map +1 -0
  261. package/dist/core/violation.d.ts +16 -11
  262. package/dist/core/violation.d.ts.map +1 -1
  263. package/dist/core/violation.js +33 -13
  264. package/dist/core/violation.js.map +1 -1
  265. package/dist/graphql/index.js +1 -1
  266. package/dist/graphql/index.js.map +1 -1
  267. package/dist/graphql/resolver-rule-builder.d.ts +98 -23
  268. package/dist/graphql/resolver-rule-builder.d.ts.map +1 -1
  269. package/dist/graphql/resolver-rule-builder.js +151 -21
  270. package/dist/graphql/resolver-rule-builder.js.map +1 -1
  271. package/dist/graphql/schema-loader.d.ts +21 -0
  272. package/dist/graphql/schema-loader.d.ts.map +1 -1
  273. package/dist/graphql/schema-loader.js +81 -12
  274. package/dist/graphql/schema-loader.js.map +1 -1
  275. package/dist/graphql/schema-rule-builder.d.ts +57 -20
  276. package/dist/graphql/schema-rule-builder.d.ts.map +1 -1
  277. package/dist/graphql/schema-rule-builder.js +101 -25
  278. package/dist/graphql/schema-rule-builder.js.map +1 -1
  279. package/dist/helpers/baseline-diagnostics.d.ts +45 -0
  280. package/dist/helpers/baseline-diagnostics.d.ts.map +1 -0
  281. package/dist/helpers/baseline-diagnostics.js +168 -0
  282. package/dist/helpers/baseline-diagnostics.js.map +1 -0
  283. package/dist/helpers/baseline-generator.d.ts +19 -0
  284. package/dist/helpers/baseline-generator.d.ts.map +1 -0
  285. package/dist/helpers/baseline-generator.js +18 -0
  286. package/dist/helpers/baseline-generator.js.map +1 -0
  287. package/dist/helpers/baseline.d.ts +336 -0
  288. package/dist/helpers/baseline.d.ts.map +1 -0
  289. package/dist/helpers/baseline.js +664 -0
  290. package/dist/helpers/baseline.js.map +1 -0
  291. package/dist/helpers/body-traversal.d.ts +27 -2
  292. package/dist/helpers/body-traversal.d.ts.map +1 -1
  293. package/dist/helpers/body-traversal.js +122 -16
  294. package/dist/helpers/body-traversal.js.map +1 -1
  295. package/dist/helpers/callback-extractor.d.ts.map +1 -1
  296. package/dist/helpers/callback-extractor.js +48 -47
  297. package/dist/helpers/callback-extractor.js.map +1 -1
  298. package/dist/helpers/complexity.d.ts +13 -5
  299. package/dist/helpers/complexity.d.ts.map +1 -1
  300. package/dist/helpers/complexity.js +15 -6
  301. package/dist/helpers/complexity.js.map +1 -1
  302. package/dist/helpers/diff-aware.d.ts +44 -0
  303. package/dist/helpers/diff-aware.d.ts.map +1 -0
  304. package/dist/helpers/diff-aware.js +84 -0
  305. package/dist/helpers/diff-aware.js.map +1 -0
  306. package/dist/helpers/matchers.d.ts +68 -7
  307. package/dist/helpers/matchers.d.ts.map +1 -1
  308. package/dist/helpers/matchers.js +114 -20
  309. package/dist/helpers/matchers.js.map +1 -1
  310. package/dist/helpers/slice-graph.d.ts +100 -8
  311. package/dist/helpers/slice-graph.d.ts.map +1 -1
  312. package/dist/helpers/slice-graph.js +126 -34
  313. package/dist/helpers/slice-graph.js.map +1 -1
  314. package/dist/helpers/tarjan.d.ts +0 -14
  315. package/dist/helpers/tarjan.d.ts.map +1 -1
  316. package/dist/helpers/tarjan.js +29 -16
  317. package/dist/helpers/tarjan.js.map +1 -1
  318. package/dist/index.d.ts +56 -17
  319. package/dist/index.d.ts.map +1 -1
  320. package/dist/index.js +57 -13
  321. package/dist/index.js.map +1 -1
  322. package/dist/models/arch-call.d.ts +3 -2
  323. package/dist/models/arch-call.d.ts.map +1 -1
  324. package/dist/models/arch-call.js.map +1 -1
  325. package/dist/models/arch-function.d.ts +28 -6
  326. package/dist/models/arch-function.d.ts.map +1 -1
  327. package/dist/models/arch-function.js +106 -3
  328. package/dist/models/arch-function.js.map +1 -1
  329. package/dist/models/arch-jsx-element.js +2 -2
  330. package/dist/models/arch-jsx-element.js.map +1 -1
  331. package/dist/models/slice.d.ts +33 -9
  332. package/dist/models/slice.d.ts.map +1 -1
  333. package/dist/models/slice.js +129 -19
  334. package/dist/models/slice.js.map +1 -1
  335. package/dist/predicates/call.d.ts.map +1 -1
  336. package/dist/predicates/call.js +5 -0
  337. package/dist/predicates/call.js.map +1 -1
  338. package/dist/predicates/identity.d.ts +21 -0
  339. package/dist/predicates/identity.d.ts.map +1 -1
  340. package/dist/predicates/identity.js +75 -3
  341. package/dist/predicates/identity.js.map +1 -1
  342. package/dist/predicates/index.d.ts +1 -1
  343. package/dist/predicates/index.d.ts.map +1 -1
  344. package/dist/predicates/index.js +1 -1
  345. package/dist/predicates/index.js.map +1 -1
  346. package/dist/predicates/metrics.d.ts +4 -2
  347. package/dist/predicates/metrics.d.ts.map +1 -1
  348. package/dist/predicates/metrics.js +4 -2
  349. package/dist/predicates/metrics.js.map +1 -1
  350. package/dist/predicates/module.d.ts +4 -12
  351. package/dist/predicates/module.d.ts.map +1 -1
  352. package/dist/predicates/module.js +57 -37
  353. package/dist/predicates/module.js.map +1 -1
  354. package/dist/presets/agent-guardrails.d.ts +22 -15
  355. package/dist/presets/agent-guardrails.d.ts.map +1 -1
  356. package/dist/presets/agent-guardrails.js +124 -19
  357. package/dist/presets/agent-guardrails.js.map +1 -1
  358. package/dist/presets/boundaries.d.ts +45 -2
  359. package/dist/presets/boundaries.d.ts.map +1 -1
  360. package/dist/presets/boundaries.js +132 -23
  361. package/dist/presets/boundaries.js.map +1 -1
  362. package/dist/presets/data-layer.d.ts +22 -2
  363. package/dist/presets/data-layer.d.ts.map +1 -1
  364. package/dist/presets/data-layer.js +58 -16
  365. package/dist/presets/data-layer.js.map +1 -1
  366. package/dist/presets/index.d.ts +7 -5
  367. package/dist/presets/index.d.ts.map +1 -1
  368. package/dist/presets/index.js +9 -3
  369. package/dist/presets/index.js.map +1 -1
  370. package/dist/presets/layered.d.ts +46 -2
  371. package/dist/presets/layered.d.ts.map +1 -1
  372. package/dist/presets/layered.js +66 -29
  373. package/dist/presets/layered.js.map +1 -1
  374. package/dist/presets/recommended.d.ts +80 -9
  375. package/dist/presets/recommended.d.ts.map +1 -1
  376. package/dist/presets/recommended.js +25 -23
  377. package/dist/presets/recommended.js.map +1 -1
  378. package/dist/presets/shared.d.ts +270 -2
  379. package/dist/presets/shared.d.ts.map +1 -1
  380. package/dist/presets/shared.js +338 -4
  381. package/dist/presets/shared.js.map +1 -1
  382. package/dist/rules/code-quality.d.ts.map +1 -1
  383. package/dist/rules/code-quality.js +15 -6
  384. package/dist/rules/code-quality.js.map +1 -1
  385. package/dist/rules/hygiene.d.ts +1 -1
  386. package/dist/rules/hygiene.js +1 -1
  387. package/dist/rules/metrics-function.d.ts +2 -1
  388. package/dist/rules/metrics-function.d.ts.map +1 -1
  389. package/dist/rules/metrics-function.js +33 -6
  390. package/dist/rules/metrics-function.js.map +1 -1
  391. package/dist/rules/metrics.d.ts +2 -1
  392. package/dist/rules/metrics.d.ts.map +1 -1
  393. package/dist/rules/metrics.js +39 -9
  394. package/dist/rules/metrics.js.map +1 -1
  395. package/dist/smells/duplicate-bodies.d.ts +58 -5
  396. package/dist/smells/duplicate-bodies.d.ts.map +1 -1
  397. package/dist/smells/duplicate-bodies.js +137 -56
  398. package/dist/smells/duplicate-bodies.js.map +1 -1
  399. package/dist/smells/fingerprint.d.ts +8 -1
  400. package/dist/smells/fingerprint.d.ts.map +1 -1
  401. package/dist/smells/fingerprint.js +21 -3
  402. package/dist/smells/fingerprint.js.map +1 -1
  403. package/dist/smells/inconsistent-siblings.d.ts +128 -7
  404. package/dist/smells/inconsistent-siblings.d.ts.map +1 -1
  405. package/dist/smells/inconsistent-siblings.js +288 -86
  406. package/dist/smells/inconsistent-siblings.js.map +1 -1
  407. package/dist/smells/sibling-files.d.ts +47 -0
  408. package/dist/smells/sibling-files.d.ts.map +1 -0
  409. package/dist/smells/sibling-files.js +104 -0
  410. package/dist/smells/sibling-files.js.map +1 -0
  411. package/dist/smells/similar-pairs.d.ts +27 -0
  412. package/dist/smells/similar-pairs.d.ts.map +1 -0
  413. package/dist/smells/similar-pairs.js +52 -0
  414. package/dist/smells/similar-pairs.js.map +1 -0
  415. package/dist/smells/smell-builder.d.ts +57 -12
  416. package/dist/smells/smell-builder.d.ts.map +1 -1
  417. package/dist/smells/smell-builder.js +111 -14
  418. package/dist/smells/smell-builder.js.map +1 -1
  419. package/dist/tsconfig/index.d.ts +19 -0
  420. package/dist/tsconfig/index.d.ts.map +1 -0
  421. package/dist/tsconfig/index.js +20 -0
  422. package/dist/tsconfig/index.js.map +1 -0
  423. package/dist/tsconfig/tsconfig-builder.d.ts +42 -9
  424. package/dist/tsconfig/tsconfig-builder.d.ts.map +1 -1
  425. package/dist/tsconfig/tsconfig-builder.js +64 -16
  426. package/dist/tsconfig/tsconfig-builder.js.map +1 -1
  427. package/package.json +3 -2
  428. package/dist/core/module-dependencies.d.ts +0 -28
  429. package/dist/core/module-dependencies.d.ts.map +0 -1
  430. package/dist/core/module-dependencies.js +0 -35
  431. package/dist/core/module-dependencies.js.map +0 -1
  432. package/dist/helpers/within.d.ts.map +0 -1
  433. package/dist/helpers/within.js.map +0 -1
@@ -2,8 +2,9 @@ import picomatch from 'picomatch';
2
2
  import { slices } from '../builders/slice-rule-builder.js';
3
3
  import { modules } from '../builders/module-rule-builder.js';
4
4
  import { smells } from '../smells/index.js';
5
- import { dispatchRule, validateOverrides, finishPreset } from './shared.js';
5
+ import { atPath, collectRule, overrideFindings, validateOverrides, assertDiscovered, declaredEmptyFindings, deliver, } from './shared.js';
6
6
  const RULE_IDS = [
7
+ 'preset/boundaries/shared-discovery',
7
8
  'preset/boundaries/no-cycles',
8
9
  'preset/boundaries/no-cross-boundary',
9
10
  'preset/boundaries/shared-isolation',
@@ -13,40 +14,56 @@ const RULE_IDS = [
13
14
  /**
14
15
  * Collect violations for shared-folder isolation rules.
15
16
  */
16
- function applySharedIsolation(p, sharedGlobs, boundaryFolders, overrides) {
17
- const violations = [];
17
+ function applySharedIsolation(p, sharedGlobs, boundaryFolders, config, constructed) {
18
+ const builders = [];
18
19
  for (const sharedGlob of sharedGlobs) {
19
20
  for (const dir of boundaryFolders) {
20
- violations.push(...dispatchRule(modules(p).that().resideInFolder(sharedGlob).should().notImportFrom(`${dir}/**`), 'preset/boundaries/shared-isolation', 'error', overrides));
21
+ builders.push(...collectRule(modules(p)
22
+ .that()
23
+ .satisfy(atPath(sharedGlob, 'shared'))
24
+ .should()
25
+ .notImportFromWithOptions([`${dir}/**`], config.importOptions ?? {}), {
26
+ id: 'preset/boundaries/shared-isolation',
27
+ because: 'shared code is imported by every boundary, so a dependency from shared back into one of them couples all of them to it',
28
+ suggestion: 'Invert the dependency: move what shared needs into shared, or pass it in as a parameter or interface from the boundary that owns it.',
29
+ imperative: 'Do NOT import a boundary from shared code — invert the dependency',
30
+ }, 'error', config, constructed));
21
31
  }
22
32
  }
23
- return violations;
33
+ return builders;
24
34
  }
25
35
  /**
26
36
  * Collect violations for test-isolation rules across boundaries.
27
37
  */
28
- function applyTestIsolation(p, boundaryFolders, overrides) {
29
- const violations = [];
38
+ function applyTestIsolation(p, boundaryFolders, config, constructed) {
39
+ const builders = [];
30
40
  for (const dir of boundaryFolders) {
31
41
  const testPattern = `${dir}/**/*.test.*`;
32
42
  const otherBoundaryTests = boundaryFolders
33
43
  .filter((d) => d !== dir)
34
44
  .map((d) => `${d}/**/*.test.*`);
35
45
  for (const otherTestGlob of otherBoundaryTests) {
36
- violations.push(...dispatchRule(modules(p).that().resideInFile(testPattern).should().notImportFrom(otherTestGlob), 'preset/boundaries/test-isolation', 'error', overrides));
46
+ builders.push(...collectRule(modules(p)
47
+ .that()
48
+ .resideInFile(testPattern)
49
+ .should()
50
+ .notImportFromWithOptions([otherTestGlob], config.importOptions ?? {}), {
51
+ id: 'preset/boundaries/test-isolation',
52
+ because: "one boundary's tests reaching into another's makes the two impossible to move, delete or run independently",
53
+ suggestion: 'Duplicate the small fixture it needs, or promote the shared helper into a test-support module both boundaries may import.',
54
+ imperative: "Do NOT import another boundary's tests — duplicate the fixture or share it explicitly",
55
+ }, 'error', config, constructed));
37
56
  }
38
57
  }
39
- return violations;
58
+ return builders;
40
59
  }
41
- /**
42
- * Enforce strict module boundaries: no cycles, no cross-boundary imports,
43
- * shared isolation, and optional copy-paste detection.
44
- */
45
60
  export function strictBoundaries(p, options) {
46
- const overrides = options.overrides;
47
- validateOverrides(overrides, [...RULE_IDS]);
61
+ const config = options;
62
+ const constructed = [];
63
+ validateOverrides(config.overrides, [...RULE_IDS]);
64
+ const overrideProblems = overrideFindings(config.overrides, RULE_IDS);
48
65
  const sharedGlobs = options.shared ?? [];
49
- const violations = [];
66
+ const builders = [];
50
67
  // Discover boundary folders from the glob pattern
51
68
  const boundaryGlob = options.folders;
52
69
  const matcher = picomatch(boundaryGlob);
@@ -63,31 +80,123 @@ export function strictBoundaries(p, options) {
63
80
  const name = dir.split('/').pop() ?? dir;
64
81
  sliceDef[name] = `${dir}/**`;
65
82
  }
83
+ // --- Discovery guard: a boundaries preset that finds no boundaries is
84
+ // misconfigured (globs match absolute paths — a project-relative glob
85
+ // matches nothing). Fail loudly instead of generating zero rules
86
+ // (the exact false green of ADR-008 / plan 0067), rather than the old
87
+ // silent skip. ---
88
+ builders.push(...assertDiscovered(boundaryFolders, {
89
+ id: 'preset/boundaries/discovery',
90
+ glob: boundaryGlob,
91
+ remedy: `Boundary discovery matches absolute file paths, so '${boundaryGlob}' matched nothing. ` +
92
+ `Use a '**/'-prefixed glob (e.g. '**/${boundaryGlob.replace(/^[./]+/, '')}') or the absolute project path.`,
93
+ }));
94
+ // --- Discovery guard for `shared`, mirroring the one above for `folders` ---
95
+ //
96
+ // `shared` globs go RAW into `no-cross-boundary`'s allow list and are matched
97
+ // by picomatch against absolute resolved file paths. A glob that matches no
98
+ // file creates no allowance — and produced no finding at all, so the user
99
+ // learned about it only through false reds on the exact code the preset's own
100
+ // docs tell them to write. Measured on `boundaries-folder-level`:
101
+ //
102
+ // shared: ['**/src/shared/**'] shared import passes, 0 config findings
103
+ // shared: ['src/shared/**'] shared import FLAGGED, 0 config findings
104
+ // shared: ['**/no-such-dir/**'] shared import FLAGGED, 0 config findings
105
+ // folders: 'src/features/*' 0 rules, 1 config finding
106
+ //
107
+ // The last row is the contract `shared` was missing: `folders` fails loudly on
108
+ // a spelling that matches nothing, and the two options sat on one preset
109
+ // holding the caller to two different contracts (bug 0023). Note that the
110
+ // middle two rows are indistinguishable from outside — same violation count,
111
+ // no explanation — which is what the guard fixes.
112
+ //
113
+ // A GUARD, deliberately not normalization. `folders` is not normalized either;
114
+ // its remedy states the absolute-path contract and tells the caller how to
115
+ // spell it. Rewriting `shared` globs instead would make one option on this
116
+ // preset accept a spelling the other rejects, which is a worse asymmetry than
117
+ // the one being fixed.
118
+ //
119
+ // Matched against FILE paths, not `atPath`'s file-or-folder: the allow list is
120
+ // what this guard is about, and `onlyImportFrom` matches resolved file paths.
121
+ // `shared: ['**/src/shared']` — a folder glob with no `/**` — selects files for
122
+ // `shared-isolation` via `atPath` yet creates no allowance, so it is a genuine
123
+ // fault here and the guard must fire for it.
124
+ for (const sharedGlob of sharedGlobs) {
125
+ const matchesFile = picomatch(sharedGlob);
126
+ const matchedFiles = p.getSourceFiles().filter((sf) => matchesFile(sf.getFilePath()));
127
+ builders.push(...assertDiscovered(matchedFiles, {
128
+ id: 'preset/boundaries/shared-discovery',
129
+ glob: sharedGlob,
130
+ remedy: `A shared glob is matched against absolute file paths, so '${sharedGlob}' matched no file and ` +
131
+ `creates no allowance — every import of it is reported as a cross-boundary violation. ` +
132
+ `Use a '**/'-prefixed glob ending in '/**' (e.g. '**/${sharedGlob.replace(/^[./]+/, '').replace(/\/\*\*$/, '')}/**') or the absolute project path.`,
133
+ }));
134
+ }
66
135
  // --- No cycles between boundaries ---
67
136
  if (Object.keys(sliceDef).length > 0) {
68
- violations.push(...dispatchRule(slices(p).assignedFrom(sliceDef).should().beFreeOfCycles(), 'preset/boundaries/no-cycles', 'error', overrides));
137
+ builders.push(...collectRule(slices(p).assignedFrom(sliceDef).should().beFreeOfCycles(options.importOptions), {
138
+ id: 'preset/boundaries/no-cycles',
139
+ because: 'boundaries in a cycle cannot be built, tested, released or reasoned about separately, which is the whole point of having them. Since v0.48.0 a cycle formed by `export … from` (a barrel) IS detected; dynamic `import()` still is not, deliberately, because it is lazy and is usually the fix rather than the fault.',
140
+ suggestion: 'Break the cycle at its weakest edge: move the shared type or helper into the shared module, or invert one direction with an interface owned by the depended-on side.',
141
+ imperative: 'Do NOT create an import cycle between boundaries',
142
+ }, 'error', config, constructed));
69
143
  }
70
144
  // --- No cross-boundary imports ---
71
145
  // Each boundary folder: modules in it can only import from itself + shared
72
146
  for (const dir of boundaryFolders) {
73
147
  const boundaryPattern = `${dir}/**`;
74
148
  const allowedGlobs = [boundaryPattern, ...sharedGlobs];
75
- violations.push(...dispatchRule(modules(p)
149
+ builders.push(...collectRule(modules(p)
76
150
  .that()
77
151
  .resideInFolder(boundaryPattern)
78
152
  .should()
79
- .onlyImportFrom(...allowedGlobs), 'preset/boundaries/no-cross-boundary', 'error', overrides));
153
+ // Forwarded, like `beFreeOfCycles`. Measured before the fix, a
154
+ // type-only cross-boundary edge failed this rule identically with and
155
+ // without `{ ignoreTypeImports: true }` — the option documented as
156
+ // reaching the isolation rules reached only the cycle rule.
157
+ .onlyImportFromWithOptions(allowedGlobs, options.importOptions ?? {}), {
158
+ id: 'preset/boundaries/no-cross-boundary',
159
+ // This rule is folder-level: the allow list is this boundary plus the
160
+ // shared globs, so ANY import from another boundary violates it,
161
+ // whichever file it names. The metadata used to describe
162
+ // entry-point-mediated access — a looser policy the rule does not
163
+ // implement — and its `Fix:` line said "import from the other
164
+ // boundary's entry point instead". Applied exactly, that reproduces
165
+ // the identical violation: measured, `reporting -> billing/index.ts`
166
+ // and `reporting -> billing/internal.ts` fail identically
167
+ // ([ts-archunit bug 0017](https://github.com/nielspeter/ts-archunit/blob/main/bugs/fixed/0017-boundaries-no-cross-boundary-message-overclaims-entry-point-enforcement.md)).
168
+ // An agent obeying it loops, and its only exits are unsanctioned.
169
+ because: 'boundaries may only depend on themselves and the shared modules — an import from another boundary couples the two, whichever file it names',
170
+ // COMPUTED, because no fixed string is right in both configurations.
171
+ // `shared` defaults to `[]`, which is legal, and there the "move it
172
+ // into the shared module" clause names somewhere that does not exist:
173
+ // measured, a boundary importing `src/shared/**` with `shared`
174
+ // unconfigured is itself a violation of this rule.
175
+ suggestion: sharedGlobs.length > 0
176
+ ? `Move the code both boundaries need into a shared folder (${sharedGlobs.join(', ')}), or remove the dependency on the other boundary.`
177
+ : 'No shared folders are configured — add one to strictBoundaries({ shared }) and move the code both boundaries need there, or remove the dependency on the other boundary.',
178
+ imperative: 'Do NOT import a file outside this boundary or its shared modules',
179
+ }, 'error', config, constructed));
80
180
  }
81
181
  // --- Shared isolation: shared folders don't import from boundaries ---
82
- violations.push(...applySharedIsolation(p, sharedGlobs, boundaryFolders, overrides));
182
+ builders.push(...applySharedIsolation(p, sharedGlobs, boundaryFolders, config, constructed));
83
183
  // --- Test isolation ---
84
184
  if (options.isolateTests) {
85
- violations.push(...applyTestIsolation(p, boundaryFolders, overrides));
185
+ builders.push(...applyTestIsolation(p, boundaryFolders, config, constructed));
86
186
  }
87
187
  // --- No copy-paste across boundaries ---
88
188
  if (options.noCopyPaste) {
89
- violations.push(...dispatchRule(smells.duplicateBodies(p), 'preset/boundaries/no-duplicate-bodies', 'warn', overrides));
189
+ builders.push(...collectRule(smells.duplicateBodies(p), {
190
+ id: 'preset/boundaries/no-duplicate-bodies',
191
+ because: 'the same body in two boundaries drifts independently, so a fix applied in one silently leaves the other wrong',
192
+ suggestion: 'Extract the shared logic into the shared module and call it from both. If the similarity is coincidental, raise withMinSimilarity() or exclude the pair.',
193
+ imperative: 'Do NOT copy a function body across boundaries — extract it into shared',
194
+ }, 'warn', config, constructed));
90
195
  }
91
- return finishPreset(violations, options);
196
+ // Unknown override keys FIRST: they say the configuration is wrong, which
197
+ // the reader needs before any finding produced under it (bug 0038).
198
+ // Constructed, not merely known: a rule whose option was never enabled, or that
199
+ // was overridden `off`, is not built — so a declaration naming it is dead.
200
+ return deliver([...overrideProblems, ...declaredEmptyFindings(config.expectEmpty, constructed), ...builders], options);
92
201
  }
93
202
  //# sourceMappingURL=boundaries.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"boundaries.js","sourceRoot":"","sources":["../../src/presets/boundaries.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"boundaries.js","sourceRoot":"","sources":["../../src/presets/boundaries.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,10 @@
1
+ import type { ArchViolation } from '@nielspeter/eess';
1
2
  import type { ArchProject } from '../core/project.js';
2
- import type { ArchViolation } from '../core/violation.js';
3
+ import type { RuleBuilderLike } from '@nielspeter/eess';
3
4
  import type { PresetBaseOptions } from './shared.js';
4
- export interface DataLayerIsolationOptions extends PresetBaseOptions {
5
+ /** This preset's rule ids, derived from `RULE_IDS` so the two cannot drift. */
6
+ type DataLayerIsolationRuleId = (typeof RULE_IDS)[number];
7
+ export interface DataLayerIsolationOptions extends PresetBaseOptions<DataLayerIsolationRuleId> {
5
8
  /** Glob pattern for repository files */
6
9
  repositories: string;
7
10
  /** Base class that all repositories must extend */
@@ -9,6 +12,7 @@ export interface DataLayerIsolationOptions extends PresetBaseOptions {
9
12
  /** If true, repositories must throw typed errors, not generic Error */
10
13
  requireTypedErrors?: boolean;
11
14
  }
15
+ declare const RULE_IDS: readonly ["preset/data/extend-base", "preset/data/typed-errors"];
12
16
  /**
13
17
  * Companion to `layeredArchitecture`. Enforces repository pattern:
14
18
  * base class extension and typed error throwing.
@@ -16,5 +20,21 @@ export interface DataLayerIsolationOptions extends PresetBaseOptions {
16
20
  * Does NOT duplicate layer ordering or import direction — those
17
21
  * are `layeredArchitecture`'s job.
18
22
  */
23
+ /**
24
+ * `report` names a delivery mode; omitting it returns the un-executed builders.
25
+ *
26
+ * Overloaded so the common call keeps its exact type — a bare union would make
27
+ * every existing `.violations()` call site an error (26 test files, measured).
28
+ *
29
+ * **The reporting overload is declared FIRST, and that ordering is load-bearing.**
30
+ * `Parameters<typeof preset>[1]` resolves to the LAST overload, and several tests
31
+ * type their options helper that way; with the builder overload last, that helper
32
+ * keeps the shape callers actually use. Overload resolution still picks the
33
+ * reporting one for a call that names `report`, because it is the first match.
34
+ */
35
+ export declare function dataLayerIsolation(p: ArchProject, options: DataLayerIsolationOptions & {
36
+ report: 'builders';
37
+ }): RuleBuilderLike[];
19
38
  export declare function dataLayerIsolation(p: ArchProject, options: DataLayerIsolationOptions): ArchViolation[];
39
+ export {};
20
40
  //# sourceMappingURL=data-layer.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"data-layer.d.ts","sourceRoot":"","sources":["../../src/presets/data-layer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AACrD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AAGzD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAGpD,MAAM,WAAW,yBAA0B,SAAQ,iBAAiB;IAClE,wCAAwC;IACxC,YAAY,EAAE,MAAM,CAAA;IACpB,mDAAmD;IACnD,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,uEAAuE;IACvE,kBAAkB,CAAC,EAAE,OAAO,CAAA;CAC7B;AAID;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAChC,CAAC,EAAE,WAAW,EACd,OAAO,EAAE,yBAAyB,GACjC,aAAa,EAAE,CAmCjB"}
1
+ {"version":3,"file":"data-layer.d.ts","sourceRoot":"","sources":["../../src/presets/data-layer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAErD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AACrD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AAGvD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAWpD,+EAA+E;AAC/E,KAAK,wBAAwB,GAAG,CAAC,OAAO,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAA;AAEzD,MAAM,WAAW,yBAA0B,SAAQ,iBAAiB,CAAC,wBAAwB,CAAC;IAC5F,wCAAwC;IACxC,YAAY,EAAE,MAAM,CAAA;IACpB,mDAAmD;IACnD,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,uEAAuE;IACvE,kBAAkB,CAAC,EAAE,OAAO,CAAA;CAC7B;AAED,QAAA,MAAM,QAAQ,kEAAmE,CAAA;AAEjF;;;;;;GAMG;AACH;;;;;;;;;;;GAWG;AACH,wBAAgB,kBAAkB,CAChC,CAAC,EAAE,WAAW,EACd,OAAO,EAAE,yBAAyB,GAAG;IAAE,MAAM,EAAE,UAAU,CAAA;CAAE,GAC1D,eAAe,EAAE,CAAA;AACpB,wBAAgB,kBAAkB,CAChC,CAAC,EAAE,WAAW,EACd,OAAO,EAAE,yBAAyB,GACjC,aAAa,EAAE,CAAA"}
@@ -1,30 +1,72 @@
1
1
  import { classes } from '../builders/class-rule-builder.js';
2
2
  import { newExpr } from '../helpers/matchers.js';
3
- import { dispatchRule, validateOverrides, finishPreset } from './shared.js';
3
+ import { atPath, collectRule, overrideFindings, validateOverrides, declaredEmptyFindings, assertEnabled, deliver, } from './shared.js';
4
4
  const RULE_IDS = ['preset/data/extend-base', 'preset/data/typed-errors'];
5
- /**
6
- * Companion to `layeredArchitecture`. Enforces repository pattern:
7
- * base class extension and typed error throwing.
8
- *
9
- * Does NOT duplicate layer ordering or import direction — those
10
- * are `layeredArchitecture`'s job.
11
- */
12
5
  export function dataLayerIsolation(p, options) {
13
- const overrides = options.overrides;
14
- validateOverrides(overrides, [...RULE_IDS]);
15
- const violations = [];
6
+ const config = options;
7
+ const constructed = [];
8
+ validateOverrides(config.overrides, [...RULE_IDS]);
9
+ const overrideProblems = overrideFindings(config.overrides, RULE_IDS);
10
+ // Plan 0100's `attempted`: both rules sit behind an independent optional
11
+ // flag, so — unlike `strictBoundaries`/`layeredArchitecture`, which always
12
+ // construct at least one rule once discovery succeeds — this can
13
+ // legitimately be `[]`. Computed from the options directly, before
14
+ // `overrides` is consulted, same as `constructed` is computed after.
15
+ //
16
+ // Kept in step with the two `if` blocks below BY HAND — the same shape of
17
+ // fragility `constructed` already has here (review: nothing enforces
18
+ // `attempted.length === 0 ⟺` no rule gets built; it holds because both
19
+ // conditionals are copy-derived from the same two options).
20
+ const attempted = [];
21
+ if (options.baseClass)
22
+ attempted.push('preset/data/extend-base');
23
+ if (options.requireTypedErrors)
24
+ attempted.push('preset/data/typed-errors');
25
+ const builders = [];
16
26
  // --- Base class enforcement ---
17
27
  if (options.baseClass) {
18
- violations.push(...dispatchRule(classes(p).that().resideInFolder(options.repositories).should().extend(options.baseClass), 'preset/data/extend-base', 'error', overrides));
28
+ builders.push(...collectRule(classes(p)
29
+ .that()
30
+ .satisfy(atPath(options.repositories, 'repositories'))
31
+ .should()
32
+ .extend(options.baseClass), {
33
+ id: 'preset/data/extend-base',
34
+ because: 'a repository that does not extend the base class silently opts out of whatever the base guarantees — connection handling, tenancy scoping, error translation',
35
+ suggestion: 'Extend the base repository. If this one genuinely cannot, exclude it by name and record why, rather than leaving it looking conformant.',
36
+ imperative: 'Do NOT define a repository that does not extend the base repository',
37
+ }, 'error', config, constructed));
19
38
  }
20
39
  // --- Typed errors ---
21
40
  if (options.requireTypedErrors) {
22
- violations.push(...dispatchRule(classes(p)
41
+ builders.push(...collectRule(classes(p)
23
42
  .that()
24
- .resideInFolder(options.repositories)
43
+ .satisfy(atPath(options.repositories, 'repositories'))
25
44
  .should()
26
- .notContain(newExpr('Error')), 'preset/data/typed-errors', 'error', overrides));
45
+ .notContain(newExpr('Error')), {
46
+ id: 'preset/data/typed-errors',
47
+ because: 'a generic Error crossing the data layer loses the information callers need to distinguish not-found from conflict from a real failure',
48
+ suggestion: 'Throw a domain error type instead, so the caller can branch on it and the API layer can map it to a status code.',
49
+ imperative: 'Do NOT throw new Error() in a repository — throw a domain error type',
50
+ }, 'error', config, constructed));
27
51
  }
28
- return finishPreset(violations, options);
52
+ // Unknown override keys FIRST: they say the configuration is wrong, which
53
+ // the reader needs before any finding produced under it (bug 0038).
54
+ // Constructed, not merely known: a rule whose option was never enabled, or that
55
+ // was overridden `off`, is not built — so a declaration naming it is dead.
56
+ const otherFindings = [
57
+ ...overrideProblems,
58
+ ...declaredEmptyFindings(config.expectEmpty, constructed),
59
+ ];
60
+ return deliver([
61
+ ...otherFindings,
62
+ // Plan 0100, LAST: only when nothing above already explains the empty
63
+ // result does "neither flag was ever set" get to be the diagnosis.
64
+ ...assertEnabled(attempted, otherFindings, {
65
+ id: 'preset/data/constructs-nothing',
66
+ presetName: 'dataLayerIsolation',
67
+ optionsHint: 'baseClass, requireTypedErrors',
68
+ }),
69
+ ...builders,
70
+ ], options);
29
71
  }
30
72
  //# sourceMappingURL=data-layer.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"data-layer.js","sourceRoot":"","sources":["../../src/presets/data-layer.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,mCAAmC,CAAA;AAC3D,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAA;AAEhD,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAW3E,MAAM,QAAQ,GAAG,CAAC,yBAAyB,EAAE,0BAA0B,CAAU,CAAA;AAEjF;;;;;;GAMG;AACH,MAAM,UAAU,kBAAkB,CAChC,CAAc,EACd,OAAkC;IAElC,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,CAAA;IACnC,iBAAiB,CAAC,SAAS,EAAE,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAA;IAE3C,MAAM,UAAU,GAAoB,EAAE,CAAA;IAEtC,iCAAiC;IACjC,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;QACtB,UAAU,CAAC,IAAI,CACb,GAAG,YAAY,CACb,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,cAAc,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,MAAM,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,EACzF,yBAAyB,EACzB,OAAO,EACP,SAAS,CACV,CACF,CAAA;IACH,CAAC;IAED,uBAAuB;IACvB,IAAI,OAAO,CAAC,kBAAkB,EAAE,CAAC;QAC/B,UAAU,CAAC,IAAI,CACb,GAAG,YAAY,CACb,OAAO,CAAC,CAAC,CAAC;aACP,IAAI,EAAE;aACN,cAAc,CAAC,OAAO,CAAC,YAAY,CAAC;aACpC,MAAM,EAAE;aACR,UAAU,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,EAC/B,0BAA0B,EAC1B,OAAO,EACP,SAAS,CACV,CACF,CAAA;IACH,CAAC;IAED,OAAO,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAA;AAC1C,CAAC"}
1
+ {"version":3,"file":"data-layer.js","sourceRoot":"","sources":["../../src/presets/data-layer.ts"],"names":[],"mappings":"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"}
@@ -1,13 +1,15 @@
1
1
  export type { RuleSeverity, PresetBaseOptions } from './shared.js';
2
- export { dispatchRule, validateOverrides, throwIfViolations } from './shared.js';
3
- export type { RecommendedOptions } from './recommended.js';
4
- export { recommended } from './recommended.js';
5
- export type { AgentGuardrailsOptions } from './agent-guardrails.js';
6
- export { agentGuardrails } from './agent-guardrails.js';
2
+ export { validateOverrides } from './shared.js';
7
3
  export type { LayeredArchitectureOptions } from './layered.js';
8
4
  export { layeredArchitecture } from './layered.js';
9
5
  export type { DataLayerIsolationOptions } from './data-layer.js';
10
6
  export { dataLayerIsolation } from './data-layer.js';
11
7
  export type { StrictBoundariesOptions } from './boundaries.js';
12
8
  export { strictBoundaries } from './boundaries.js';
9
+ export type { AgentGuardrailsOptions } from './agent-guardrails.js';
10
+ export { agentGuardrails } from './agent-guardrails.js';
11
+ export type { RecommendedOptions } from './recommended.js';
12
+ export { recommended } from './recommended.js';
13
+ export { dispatchRule, throwIfViolations } from '@nielspeter/eess';
14
+ export type { PresetDelivery } from './shared.js';
13
15
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/presets/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAClE,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAEhF,YAAY,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAA;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAE9C,YAAY,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAA;AACnE,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AAEvD,YAAY,EAAE,0BAA0B,EAAE,MAAM,cAAc,CAAA;AAC9D,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAA;AAElD,YAAY,EAAE,yBAAyB,EAAE,MAAM,iBAAiB,CAAA;AAChE,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAA;AAEpD,YAAY,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAA;AAC9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/presets/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAClE,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAE/C,YAAY,EAAE,0BAA0B,EAAE,MAAM,cAAc,CAAA;AAC9D,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAA;AAElD,YAAY,EAAE,yBAAyB,EAAE,MAAM,iBAAiB,CAAA;AAChE,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAA;AAEpD,YAAY,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAA;AAC9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;AAElD,YAAY,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAA;AACnE,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AAEvD,YAAY,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAA;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAO9C,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AAMlE,YAAY,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA"}
@@ -1,7 +1,13 @@
1
- export { dispatchRule, validateOverrides, throwIfViolations } from './shared.js';
2
- export { recommended } from './recommended.js';
3
- export { agentGuardrails } from './agent-guardrails.js';
1
+ export { validateOverrides } from './shared.js';
4
2
  export { layeredArchitecture } from './layered.js';
5
3
  export { dataLayerIsolation } from './data-layer.js';
6
4
  export { strictBoundaries } from './boundaries.js';
5
+ export { agentGuardrails } from './agent-guardrails.js';
6
+ export { recommended } from './recommended.js';
7
+ // Published on the `/presets` subpath before the engine copy and dropped by it.
8
+ // `restore-the-published-ts-surface` audited the ROOT barrel only, so a named
9
+ // import of either from `@nielspeter/eess-ts/presets` was a link-time error that
10
+ // no changeset declared. Found by an adopter review diffing every subpath, not
11
+ // just `.`.
12
+ export { dispatchRule, throwIfViolations } from '@nielspeter/eess';
7
13
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/presets/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAGhF,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAG9C,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AAGvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAA;AAGlD,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAA;AAGpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/presets/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAG/C,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAA;AAGlD,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAA;AAGpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;AAGlD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AAGvD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAE9C,gFAAgF;AAChF,8EAA8E;AAC9E,iFAAiF;AACjF,+EAA+E;AAC/E,YAAY;AACZ,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAA"}
@@ -1,7 +1,11 @@
1
+ import type { ArchViolation } from '@nielspeter/eess';
2
+ import type { ImportOptions } from '../core/import-options.js';
1
3
  import type { ArchProject } from '../core/project.js';
2
- import type { ArchViolation } from '../core/violation.js';
4
+ import type { RuleBuilderLike } from '@nielspeter/eess';
3
5
  import type { PresetBaseOptions } from './shared.js';
4
- export interface LayeredArchitectureOptions extends PresetBaseOptions {
6
+ /** This preset's rule ids, derived from `RULE_IDS` so the two cannot drift. */
7
+ type LayeredArchitectureRuleId = (typeof RULE_IDS)[number];
8
+ export interface LayeredArchitectureOptions extends PresetBaseOptions<LayeredArchitectureRuleId> {
5
9
  /** Layer name → glob pattern mapping. Order = dependency direction (first depends on second, etc.) */
6
10
  layers: Record<string, string>;
7
11
  /** Glob patterns for shared/utility folders accessible by all layers */
@@ -12,10 +16,50 @@ export interface LayeredArchitectureOptions extends PresetBaseOptions {
12
16
  typeImportsAllowed?: string[];
13
17
  /** Package restriction: glob → list of npm package name patterns. Only those layers may import those packages. */
14
18
  restrictedPackages?: Record<string, string[]>;
19
+ /**
20
+ * This project's answer to "is a type-only edge a dependency?", applied to
21
+ * every rule this preset constructs **whose condition takes one** — plan 0089:
22
+ * `layer-order`, `no-cycles`, `innermost-isolation`, `restricted-packages`.
23
+ * `type-imports-only` is excluded because `onlyHaveTypeImportsFrom` asks about
24
+ * type imports *as its subject* — there is no answer for this bag to give it.
25
+ *
26
+ * The conditions disagree by default, deliberately: `beFreeOfCycles` ignores
27
+ * type-only imports because it asks whether the module is *evaluated*, and an
28
+ * erased import cannot contribute to an initialization cycle; the layer and
29
+ * boundary conditions count them because they ask whether the code is
30
+ * *coupled*. Holding a builder, that distinction is visible and you choose per
31
+ * condition. Through a preset it is invisible, and this option exists because
32
+ * a preset user could not align them even when their project wanted them
33
+ * aligned.
34
+ *
35
+ * So passing it moves exactly one side, and which side depends on the value:
36
+ * `{ ignoreTypeImports: true }` stops the layer rules counting type coupling
37
+ * (the cycle rule already ignored it); `{ ignoreTypeImports: false }` makes
38
+ * the cycle rule count type edges (the layer rules already did). `docs/presets.md`
39
+ * carries that table.
40
+ */
41
+ importOptions?: ImportOptions;
15
42
  }
43
+ declare const RULE_IDS: readonly ["preset/layered/layer-order", "preset/layered/no-cycles", "preset/layered/innermost-isolation", "preset/layered/type-imports-only", "preset/layered/restricted-packages"];
16
44
  /**
17
45
  * Enforce a layered architecture: dependency direction, cycle freedom,
18
46
  * and optional package restrictions.
19
47
  */
48
+ /**
49
+ * `report` names a delivery mode; omitting it returns the un-executed builders.
50
+ *
51
+ * Overloaded so the common call keeps its exact type — a bare union would make
52
+ * every existing `.violations()` call site an error (26 test files, measured).
53
+ *
54
+ * **The reporting overload is declared FIRST, and that ordering is load-bearing.**
55
+ * `Parameters<typeof preset>[1]` resolves to the LAST overload, and several tests
56
+ * type their options helper that way; with the builder overload last, that helper
57
+ * keeps the shape callers actually use. Overload resolution still picks the
58
+ * reporting one for a call that names `report`, because it is the first match.
59
+ */
60
+ export declare function layeredArchitecture(p: ArchProject, options: LayeredArchitectureOptions & {
61
+ report: 'builders';
62
+ }): RuleBuilderLike[];
20
63
  export declare function layeredArchitecture(p: ArchProject, options: LayeredArchitectureOptions): ArchViolation[];
64
+ export {};
21
65
  //# sourceMappingURL=layered.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"layered.d.ts","sourceRoot":"","sources":["../../src/presets/layered.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AACrD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AAKzD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAGpD,MAAM,WAAW,0BAA2B,SAAQ,iBAAiB;IACnE,sGAAsG;IACtG,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC9B,wEAAwE;IACxE,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;IACjB,iEAAiE;IACjE,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,wFAAwF;IACxF,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAA;IAC7B,kHAAkH;IAClH,kBAAkB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAA;CAC9C;AAiFD;;;GAGG;AACH,wBAAgB,mBAAmB,CACjC,CAAC,EAAE,WAAW,EACd,OAAO,EAAE,0BAA0B,GAClC,aAAa,EAAE,CAsEjB"}
1
+ {"version":3,"file":"layered.d.ts","sourceRoot":"","sources":["../../src/presets/layered.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAErD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAA;AAC9D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AACrD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AAKvD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AASpD,+EAA+E;AAC/E,KAAK,yBAAyB,GAAG,CAAC,OAAO,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAA;AAE1D,MAAM,WAAW,0BAA2B,SAAQ,iBAAiB,CAAC,yBAAyB,CAAC;IAC9F,sGAAsG;IACtG,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC9B,wEAAwE;IACxE,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;IACjB,iEAAiE;IACjE,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,wFAAwF;IACxF,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAA;IAC7B,kHAAkH;IAClH,kBAAkB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAA;IAC7C;;;;;;;;;;;;;;;;;;;;;OAqBG;IACH,aAAa,CAAC,EAAE,aAAa,CAAA;CAC9B;AAED,QAAA,MAAM,QAAQ,qLAMJ,CAAA;AAgGV;;;GAGG;AACH;;;;;;;;;;;GAWG;AACH,wBAAgB,mBAAmB,CACjC,CAAC,EAAE,WAAW,EACd,OAAO,EAAE,0BAA0B,GAAG;IAAE,MAAM,EAAE,UAAU,CAAA;CAAE,GAC3D,eAAe,EAAE,CAAA;AACpB,wBAAgB,mBAAmB,CACjC,CAAC,EAAE,WAAW,EACd,OAAO,EAAE,0BAA0B,GAClC,aAAa,EAAE,CAAA"}