@nielspeter/eess-ts 0.2.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (433) hide show
  1. package/README.md +87 -34
  2. package/dist/builders/call-rule-builder.d.ts +66 -26
  3. package/dist/builders/call-rule-builder.d.ts.map +1 -1
  4. package/dist/builders/call-rule-builder.js +73 -31
  5. package/dist/builders/call-rule-builder.js.map +1 -1
  6. package/dist/builders/class-rule-builder.d.ts +125 -26
  7. package/dist/builders/class-rule-builder.d.ts.map +1 -1
  8. package/dist/builders/class-rule-builder.js +134 -30
  9. package/dist/builders/class-rule-builder.js.map +1 -1
  10. package/dist/builders/correspondence-builder.d.ts +287 -0
  11. package/dist/builders/correspondence-builder.d.ts.map +1 -0
  12. package/dist/builders/correspondence-builder.js +393 -0
  13. package/dist/builders/correspondence-builder.js.map +1 -0
  14. package/dist/builders/correspondence-findings.d.ts +104 -0
  15. package/dist/builders/correspondence-findings.d.ts.map +1 -0
  16. package/dist/builders/correspondence-findings.js +301 -0
  17. package/dist/builders/correspondence-findings.js.map +1 -0
  18. package/dist/builders/cross-layer-builder.d.ts +99 -16
  19. package/dist/builders/cross-layer-builder.d.ts.map +1 -1
  20. package/dist/builders/cross-layer-builder.js +181 -35
  21. package/dist/builders/cross-layer-builder.js.map +1 -1
  22. package/dist/builders/function-rule-builder.d.ts +144 -25
  23. package/dist/builders/function-rule-builder.d.ts.map +1 -1
  24. package/dist/builders/function-rule-builder.js +173 -26
  25. package/dist/builders/function-rule-builder.js.map +1 -1
  26. package/dist/builders/jsx-rule-builder.d.ts +70 -14
  27. package/dist/builders/jsx-rule-builder.d.ts.map +1 -1
  28. package/dist/builders/jsx-rule-builder.js +73 -14
  29. package/dist/builders/jsx-rule-builder.js.map +1 -1
  30. package/dist/builders/module-rule-builder.d.ts +2 -2
  31. package/dist/builders/module-rule-builder.d.ts.map +1 -1
  32. package/dist/builders/module-rule-builder.js +12 -3
  33. package/dist/builders/module-rule-builder.js.map +1 -1
  34. package/dist/builders/scoped-function-rule-builder.d.ts +11 -0
  35. package/dist/builders/scoped-function-rule-builder.d.ts.map +1 -1
  36. package/dist/builders/scoped-function-rule-builder.js +12 -0
  37. package/dist/builders/scoped-function-rule-builder.js.map +1 -1
  38. package/dist/builders/slice-discovery-message.d.ts +36 -0
  39. package/dist/builders/slice-discovery-message.d.ts.map +1 -0
  40. package/dist/builders/slice-discovery-message.js +181 -0
  41. package/dist/builders/slice-discovery-message.js.map +1 -0
  42. package/dist/builders/slice-rule-builder.d.ts +151 -12
  43. package/dist/builders/slice-rule-builder.d.ts.map +1 -1
  44. package/dist/builders/slice-rule-builder.js +242 -35
  45. package/dist/builders/slice-rule-builder.js.map +1 -1
  46. package/dist/builders/type-rule-builder.d.ts +95 -24
  47. package/dist/builders/type-rule-builder.d.ts.map +1 -1
  48. package/dist/builders/type-rule-builder.js +105 -29
  49. package/dist/builders/type-rule-builder.js.map +1 -1
  50. package/dist/{helpers → builders}/within.d.ts +2 -2
  51. package/dist/builders/within.d.ts.map +1 -0
  52. package/dist/{helpers → builders}/within.js +1 -1
  53. package/dist/builders/within.js.map +1 -0
  54. package/dist/cli/commands/baseline.d.ts +3 -2
  55. package/dist/cli/commands/baseline.d.ts.map +1 -1
  56. package/dist/cli/commands/baseline.js +68 -6
  57. package/dist/cli/commands/baseline.js.map +1 -1
  58. package/dist/cli/commands/check.d.ts +7 -2
  59. package/dist/cli/commands/check.d.ts.map +1 -1
  60. package/dist/cli/commands/check.js +241 -45
  61. package/dist/cli/commands/check.js.map +1 -1
  62. package/dist/cli/commands/doctor.d.ts +29 -0
  63. package/dist/cli/commands/doctor.d.ts.map +1 -0
  64. package/dist/cli/commands/doctor.js +224 -0
  65. package/dist/cli/commands/doctor.js.map +1 -0
  66. package/dist/cli/commands/explain.d.ts +2 -1
  67. package/dist/cli/commands/explain.d.ts.map +1 -1
  68. package/dist/cli/commands/explain.js +19 -10
  69. package/dist/cli/commands/explain.js.map +1 -1
  70. package/dist/cli/commands/init.d.ts +9 -3
  71. package/dist/cli/commands/init.d.ts.map +1 -1
  72. package/dist/cli/commands/init.js +162 -137
  73. package/dist/cli/commands/init.js.map +1 -1
  74. package/dist/cli/import-rule-module.d.ts +29 -0
  75. package/dist/cli/import-rule-module.d.ts.map +1 -0
  76. package/dist/cli/import-rule-module.js +60 -0
  77. package/dist/cli/import-rule-module.js.map +1 -0
  78. package/dist/cli/index.d.ts +2 -2
  79. package/dist/cli/index.d.ts.map +1 -1
  80. package/dist/cli/index.js +98 -33
  81. package/dist/cli/index.js.map +1 -1
  82. package/dist/cli/load-rules.d.ts +6 -11
  83. package/dist/cli/load-rules.d.ts.map +1 -1
  84. package/dist/cli/load-rules.js +21 -29
  85. package/dist/cli/load-rules.js.map +1 -1
  86. package/dist/cli/resolve-config.d.ts.map +1 -1
  87. package/dist/cli/resolve-config.js +24 -14
  88. package/dist/cli/resolve-config.js.map +1 -1
  89. package/dist/cli/rule-file-findings.d.ts +178 -0
  90. package/dist/cli/rule-file-findings.d.ts.map +1 -0
  91. package/dist/cli/rule-file-findings.js +293 -0
  92. package/dist/cli/rule-file-findings.js.map +1 -0
  93. package/dist/cli/watch.d.ts +20 -7
  94. package/dist/cli/watch.d.ts.map +1 -1
  95. package/dist/cli/watch.js +39 -14
  96. package/dist/cli/watch.js.map +1 -1
  97. package/dist/conditions/body-analysis-function.d.ts.map +1 -1
  98. package/dist/conditions/body-analysis-function.js +16 -7
  99. package/dist/conditions/body-analysis-function.js.map +1 -1
  100. package/dist/conditions/body-analysis-module.d.ts.map +1 -1
  101. package/dist/conditions/body-analysis-module.js +14 -9
  102. package/dist/conditions/body-analysis-module.js.map +1 -1
  103. package/dist/conditions/body-analysis.d.ts.map +1 -1
  104. package/dist/conditions/body-analysis.js +16 -7
  105. package/dist/conditions/body-analysis.js.map +1 -1
  106. package/dist/conditions/call.d.ts.map +1 -1
  107. package/dist/conditions/call.js +38 -17
  108. package/dist/conditions/call.js.map +1 -1
  109. package/dist/conditions/catch-analysis.d.ts +2 -1
  110. package/dist/conditions/catch-analysis.d.ts.map +1 -1
  111. package/dist/conditions/catch-analysis.js.map +1 -1
  112. package/dist/conditions/cross-layer.d.ts +2 -10
  113. package/dist/conditions/cross-layer.d.ts.map +1 -1
  114. package/dist/conditions/cross-layer.js +227 -23
  115. package/dist/conditions/cross-layer.js.map +1 -1
  116. package/dist/conditions/dependency.d.ts +35 -6
  117. package/dist/conditions/dependency.d.ts.map +1 -1
  118. package/dist/conditions/dependency.js +299 -45
  119. package/dist/conditions/dependency.js.map +1 -1
  120. package/dist/conditions/exports.d.ts.map +1 -1
  121. package/dist/conditions/exports.js +10 -0
  122. package/dist/conditions/exports.js.map +1 -1
  123. package/dist/conditions/function.d.ts.map +1 -1
  124. package/dist/conditions/function.js +19 -5
  125. package/dist/conditions/function.js.map +1 -1
  126. package/dist/conditions/helpers.d.ts +2 -1
  127. package/dist/conditions/helpers.d.ts.map +1 -1
  128. package/dist/conditions/helpers.js +4 -1
  129. package/dist/conditions/helpers.js.map +1 -1
  130. package/dist/conditions/jsx.d.ts.map +1 -1
  131. package/dist/conditions/jsx.js +7 -2
  132. package/dist/conditions/jsx.js.map +1 -1
  133. package/dist/conditions/match-identity.d.ts +43 -0
  134. package/dist/conditions/match-identity.d.ts.map +1 -0
  135. package/dist/conditions/match-identity.js +43 -0
  136. package/dist/conditions/match-identity.js.map +1 -0
  137. package/dist/conditions/members.d.ts.map +1 -1
  138. package/dist/conditions/members.js +17 -4
  139. package/dist/conditions/members.js.map +1 -1
  140. package/dist/conditions/reverse-dependency.d.ts +18 -5
  141. package/dist/conditions/reverse-dependency.d.ts.map +1 -1
  142. package/dist/conditions/reverse-dependency.js +109 -92
  143. package/dist/conditions/reverse-dependency.js.map +1 -1
  144. package/dist/conditions/slice.d.ts +86 -2
  145. package/dist/conditions/slice.d.ts.map +1 -1
  146. package/dist/conditions/slice.js +234 -53
  147. package/dist/conditions/slice.js.map +1 -1
  148. package/dist/conditions/structural.d.ts.map +1 -1
  149. package/dist/conditions/structural.js +16 -4
  150. package/dist/conditions/structural.js.map +1 -1
  151. package/dist/core/check-all.d.ts +19 -0
  152. package/dist/core/check-all.d.ts.map +1 -0
  153. package/dist/core/check-all.js +96 -0
  154. package/dist/core/check-all.js.map +1 -0
  155. package/dist/core/combinators.d.ts +48 -0
  156. package/dist/core/combinators.d.ts.map +1 -0
  157. package/dist/core/combinators.js +56 -0
  158. package/dist/core/combinators.js.map +1 -0
  159. package/dist/core/descendant-cache.d.ts +36 -0
  160. package/dist/core/descendant-cache.d.ts.map +1 -0
  161. package/dist/core/descendant-cache.js +119 -0
  162. package/dist/core/descendant-cache.js.map +1 -0
  163. package/dist/core/diagnose.d.ts +234 -0
  164. package/dist/core/diagnose.d.ts.map +1 -0
  165. package/dist/core/diagnose.js +382 -0
  166. package/dist/core/diagnose.js.map +1 -0
  167. package/dist/core/disk-set.d.ts +48 -0
  168. package/dist/core/disk-set.d.ts.map +1 -0
  169. package/dist/core/disk-set.js +218 -0
  170. package/dist/core/disk-set.js.map +1 -0
  171. package/dist/core/element-cache.d.ts +75 -0
  172. package/dist/core/element-cache.d.ts.map +1 -0
  173. package/dist/core/element-cache.js +32 -0
  174. package/dist/core/element-cache.js.map +1 -0
  175. package/dist/core/empty-project-advice.d.ts +75 -0
  176. package/dist/core/empty-project-advice.d.ts.map +1 -0
  177. package/dist/core/empty-project-advice.js +61 -0
  178. package/dist/core/empty-project-advice.js.map +1 -0
  179. package/dist/core/exclusion-comments.d.ts +54 -0
  180. package/dist/core/exclusion-comments.d.ts.map +1 -0
  181. package/dist/core/exclusion-comments.js +310 -0
  182. package/dist/core/exclusion-comments.js.map +1 -0
  183. package/dist/core/execute-rule.d.ts +150 -0
  184. package/dist/core/execute-rule.d.ts.map +1 -0
  185. package/dist/core/execute-rule.js +580 -0
  186. package/dist/core/execute-rule.js.map +1 -0
  187. package/dist/core/glob-diagnosis.d.ts +78 -0
  188. package/dist/core/glob-diagnosis.d.ts.map +1 -0
  189. package/dist/core/glob-diagnosis.js +134 -0
  190. package/dist/core/glob-diagnosis.js.map +1 -0
  191. package/dist/core/glob-evaluator.d.ts +48 -0
  192. package/dist/core/glob-evaluator.d.ts.map +1 -0
  193. package/dist/core/glob-evaluator.js +89 -0
  194. package/dist/core/glob-evaluator.js.map +1 -0
  195. package/dist/core/import-candidates.d.ts +60 -0
  196. package/dist/core/import-candidates.d.ts.map +1 -0
  197. package/dist/core/import-candidates.js +93 -0
  198. package/dist/core/import-candidates.js.map +1 -0
  199. package/dist/core/import-options.d.ts +55 -2
  200. package/dist/core/import-options.d.ts.map +1 -1
  201. package/dist/core/import-options.js +64 -0
  202. package/dist/core/import-options.js.map +1 -1
  203. package/dist/core/line-index.d.ts +3 -0
  204. package/dist/core/line-index.d.ts.map +1 -0
  205. package/dist/core/line-index.js +229 -0
  206. package/dist/core/line-index.js.map +1 -0
  207. package/dist/core/metric-violation.d.ts +86 -0
  208. package/dist/core/metric-violation.d.ts.map +1 -0
  209. package/dist/core/metric-violation.js +132 -0
  210. package/dist/core/metric-violation.js.map +1 -0
  211. package/dist/core/module-edges.d.ts +361 -0
  212. package/dist/core/module-edges.d.ts.map +1 -0
  213. package/dist/core/module-edges.js +592 -0
  214. package/dist/core/module-edges.js.map +1 -0
  215. package/dist/core/object-literal-functions.d.ts +42 -0
  216. package/dist/core/object-literal-functions.d.ts.map +1 -0
  217. package/dist/core/object-literal-functions.js +75 -0
  218. package/dist/core/object-literal-functions.js.map +1 -0
  219. package/dist/core/orphan-exclusions.d.ts +44 -0
  220. package/dist/core/orphan-exclusions.d.ts.map +1 -0
  221. package/dist/core/orphan-exclusions.js +214 -0
  222. package/dist/core/orphan-exclusions.js.map +1 -0
  223. package/dist/core/pair-condition.d.ts +32 -3
  224. package/dist/core/pair-condition.d.ts.map +1 -1
  225. package/dist/core/path-universe.d.ts +54 -0
  226. package/dist/core/path-universe.d.ts.map +1 -0
  227. package/dist/core/path-universe.js +65 -0
  228. package/dist/core/path-universe.js.map +1 -0
  229. package/dist/core/per-root-compiler-options.d.ts +20 -0
  230. package/dist/core/per-root-compiler-options.d.ts.map +1 -0
  231. package/dist/core/per-root-compiler-options.js +57 -0
  232. package/dist/core/per-root-compiler-options.js.map +1 -0
  233. package/dist/core/project-relative.d.ts +98 -0
  234. package/dist/core/project-relative.d.ts.map +1 -0
  235. package/dist/core/project-relative.js +185 -0
  236. package/dist/core/project-relative.js.map +1 -0
  237. package/dist/core/project.d.ts +7 -1
  238. package/dist/core/project.d.ts.map +1 -1
  239. package/dist/core/project.js +24 -0
  240. package/dist/core/project.js.map +1 -1
  241. package/dist/core/rule-builder.d.ts +282 -0
  242. package/dist/core/rule-builder.d.ts.map +1 -0
  243. package/dist/core/rule-builder.js +445 -0
  244. package/dist/core/rule-builder.js.map +1 -0
  245. package/dist/core/rule-declaration.d.ts +32 -0
  246. package/dist/core/rule-declaration.d.ts.map +1 -0
  247. package/dist/core/rule-declaration.js +126 -0
  248. package/dist/core/rule-declaration.js.map +1 -0
  249. package/dist/core/terminal-builder.d.ts +625 -0
  250. package/dist/core/terminal-builder.d.ts.map +1 -0
  251. package/dist/core/terminal-builder.js +787 -0
  252. package/dist/core/terminal-builder.js.map +1 -0
  253. package/dist/core/terminal-execution.d.ts +23 -0
  254. package/dist/core/terminal-execution.d.ts.map +1 -0
  255. package/dist/core/terminal-execution.js +71 -0
  256. package/dist/core/terminal-execution.js.map +1 -0
  257. package/dist/core/vacuity-diagnosis.d.ts +103 -0
  258. package/dist/core/vacuity-diagnosis.d.ts.map +1 -0
  259. package/dist/core/vacuity-diagnosis.js +415 -0
  260. package/dist/core/vacuity-diagnosis.js.map +1 -0
  261. package/dist/core/violation.d.ts +16 -11
  262. package/dist/core/violation.d.ts.map +1 -1
  263. package/dist/core/violation.js +33 -13
  264. package/dist/core/violation.js.map +1 -1
  265. package/dist/graphql/index.js +1 -1
  266. package/dist/graphql/index.js.map +1 -1
  267. package/dist/graphql/resolver-rule-builder.d.ts +98 -23
  268. package/dist/graphql/resolver-rule-builder.d.ts.map +1 -1
  269. package/dist/graphql/resolver-rule-builder.js +151 -21
  270. package/dist/graphql/resolver-rule-builder.js.map +1 -1
  271. package/dist/graphql/schema-loader.d.ts +21 -0
  272. package/dist/graphql/schema-loader.d.ts.map +1 -1
  273. package/dist/graphql/schema-loader.js +81 -12
  274. package/dist/graphql/schema-loader.js.map +1 -1
  275. package/dist/graphql/schema-rule-builder.d.ts +57 -20
  276. package/dist/graphql/schema-rule-builder.d.ts.map +1 -1
  277. package/dist/graphql/schema-rule-builder.js +101 -25
  278. package/dist/graphql/schema-rule-builder.js.map +1 -1
  279. package/dist/helpers/baseline-diagnostics.d.ts +45 -0
  280. package/dist/helpers/baseline-diagnostics.d.ts.map +1 -0
  281. package/dist/helpers/baseline-diagnostics.js +168 -0
  282. package/dist/helpers/baseline-diagnostics.js.map +1 -0
  283. package/dist/helpers/baseline-generator.d.ts +19 -0
  284. package/dist/helpers/baseline-generator.d.ts.map +1 -0
  285. package/dist/helpers/baseline-generator.js +18 -0
  286. package/dist/helpers/baseline-generator.js.map +1 -0
  287. package/dist/helpers/baseline.d.ts +336 -0
  288. package/dist/helpers/baseline.d.ts.map +1 -0
  289. package/dist/helpers/baseline.js +664 -0
  290. package/dist/helpers/baseline.js.map +1 -0
  291. package/dist/helpers/body-traversal.d.ts +27 -2
  292. package/dist/helpers/body-traversal.d.ts.map +1 -1
  293. package/dist/helpers/body-traversal.js +122 -16
  294. package/dist/helpers/body-traversal.js.map +1 -1
  295. package/dist/helpers/callback-extractor.d.ts.map +1 -1
  296. package/dist/helpers/callback-extractor.js +48 -47
  297. package/dist/helpers/callback-extractor.js.map +1 -1
  298. package/dist/helpers/complexity.d.ts +13 -5
  299. package/dist/helpers/complexity.d.ts.map +1 -1
  300. package/dist/helpers/complexity.js +15 -6
  301. package/dist/helpers/complexity.js.map +1 -1
  302. package/dist/helpers/diff-aware.d.ts +44 -0
  303. package/dist/helpers/diff-aware.d.ts.map +1 -0
  304. package/dist/helpers/diff-aware.js +84 -0
  305. package/dist/helpers/diff-aware.js.map +1 -0
  306. package/dist/helpers/matchers.d.ts +68 -7
  307. package/dist/helpers/matchers.d.ts.map +1 -1
  308. package/dist/helpers/matchers.js +114 -20
  309. package/dist/helpers/matchers.js.map +1 -1
  310. package/dist/helpers/slice-graph.d.ts +100 -8
  311. package/dist/helpers/slice-graph.d.ts.map +1 -1
  312. package/dist/helpers/slice-graph.js +126 -34
  313. package/dist/helpers/slice-graph.js.map +1 -1
  314. package/dist/helpers/tarjan.d.ts +0 -14
  315. package/dist/helpers/tarjan.d.ts.map +1 -1
  316. package/dist/helpers/tarjan.js +29 -16
  317. package/dist/helpers/tarjan.js.map +1 -1
  318. package/dist/index.d.ts +56 -17
  319. package/dist/index.d.ts.map +1 -1
  320. package/dist/index.js +57 -13
  321. package/dist/index.js.map +1 -1
  322. package/dist/models/arch-call.d.ts +3 -2
  323. package/dist/models/arch-call.d.ts.map +1 -1
  324. package/dist/models/arch-call.js.map +1 -1
  325. package/dist/models/arch-function.d.ts +28 -6
  326. package/dist/models/arch-function.d.ts.map +1 -1
  327. package/dist/models/arch-function.js +106 -3
  328. package/dist/models/arch-function.js.map +1 -1
  329. package/dist/models/arch-jsx-element.js +2 -2
  330. package/dist/models/arch-jsx-element.js.map +1 -1
  331. package/dist/models/slice.d.ts +33 -9
  332. package/dist/models/slice.d.ts.map +1 -1
  333. package/dist/models/slice.js +129 -19
  334. package/dist/models/slice.js.map +1 -1
  335. package/dist/predicates/call.d.ts.map +1 -1
  336. package/dist/predicates/call.js +5 -0
  337. package/dist/predicates/call.js.map +1 -1
  338. package/dist/predicates/identity.d.ts +21 -0
  339. package/dist/predicates/identity.d.ts.map +1 -1
  340. package/dist/predicates/identity.js +75 -3
  341. package/dist/predicates/identity.js.map +1 -1
  342. package/dist/predicates/index.d.ts +1 -1
  343. package/dist/predicates/index.d.ts.map +1 -1
  344. package/dist/predicates/index.js +1 -1
  345. package/dist/predicates/index.js.map +1 -1
  346. package/dist/predicates/metrics.d.ts +4 -2
  347. package/dist/predicates/metrics.d.ts.map +1 -1
  348. package/dist/predicates/metrics.js +4 -2
  349. package/dist/predicates/metrics.js.map +1 -1
  350. package/dist/predicates/module.d.ts +4 -12
  351. package/dist/predicates/module.d.ts.map +1 -1
  352. package/dist/predicates/module.js +57 -37
  353. package/dist/predicates/module.js.map +1 -1
  354. package/dist/presets/agent-guardrails.d.ts +22 -15
  355. package/dist/presets/agent-guardrails.d.ts.map +1 -1
  356. package/dist/presets/agent-guardrails.js +124 -19
  357. package/dist/presets/agent-guardrails.js.map +1 -1
  358. package/dist/presets/boundaries.d.ts +45 -2
  359. package/dist/presets/boundaries.d.ts.map +1 -1
  360. package/dist/presets/boundaries.js +132 -23
  361. package/dist/presets/boundaries.js.map +1 -1
  362. package/dist/presets/data-layer.d.ts +22 -2
  363. package/dist/presets/data-layer.d.ts.map +1 -1
  364. package/dist/presets/data-layer.js +58 -16
  365. package/dist/presets/data-layer.js.map +1 -1
  366. package/dist/presets/index.d.ts +7 -5
  367. package/dist/presets/index.d.ts.map +1 -1
  368. package/dist/presets/index.js +9 -3
  369. package/dist/presets/index.js.map +1 -1
  370. package/dist/presets/layered.d.ts +46 -2
  371. package/dist/presets/layered.d.ts.map +1 -1
  372. package/dist/presets/layered.js +66 -29
  373. package/dist/presets/layered.js.map +1 -1
  374. package/dist/presets/recommended.d.ts +80 -9
  375. package/dist/presets/recommended.d.ts.map +1 -1
  376. package/dist/presets/recommended.js +25 -23
  377. package/dist/presets/recommended.js.map +1 -1
  378. package/dist/presets/shared.d.ts +270 -2
  379. package/dist/presets/shared.d.ts.map +1 -1
  380. package/dist/presets/shared.js +338 -4
  381. package/dist/presets/shared.js.map +1 -1
  382. package/dist/rules/code-quality.d.ts.map +1 -1
  383. package/dist/rules/code-quality.js +15 -6
  384. package/dist/rules/code-quality.js.map +1 -1
  385. package/dist/rules/hygiene.d.ts +1 -1
  386. package/dist/rules/hygiene.js +1 -1
  387. package/dist/rules/metrics-function.d.ts +2 -1
  388. package/dist/rules/metrics-function.d.ts.map +1 -1
  389. package/dist/rules/metrics-function.js +33 -6
  390. package/dist/rules/metrics-function.js.map +1 -1
  391. package/dist/rules/metrics.d.ts +2 -1
  392. package/dist/rules/metrics.d.ts.map +1 -1
  393. package/dist/rules/metrics.js +39 -9
  394. package/dist/rules/metrics.js.map +1 -1
  395. package/dist/smells/duplicate-bodies.d.ts +58 -5
  396. package/dist/smells/duplicate-bodies.d.ts.map +1 -1
  397. package/dist/smells/duplicate-bodies.js +137 -56
  398. package/dist/smells/duplicate-bodies.js.map +1 -1
  399. package/dist/smells/fingerprint.d.ts +8 -1
  400. package/dist/smells/fingerprint.d.ts.map +1 -1
  401. package/dist/smells/fingerprint.js +21 -3
  402. package/dist/smells/fingerprint.js.map +1 -1
  403. package/dist/smells/inconsistent-siblings.d.ts +128 -7
  404. package/dist/smells/inconsistent-siblings.d.ts.map +1 -1
  405. package/dist/smells/inconsistent-siblings.js +288 -86
  406. package/dist/smells/inconsistent-siblings.js.map +1 -1
  407. package/dist/smells/sibling-files.d.ts +47 -0
  408. package/dist/smells/sibling-files.d.ts.map +1 -0
  409. package/dist/smells/sibling-files.js +104 -0
  410. package/dist/smells/sibling-files.js.map +1 -0
  411. package/dist/smells/similar-pairs.d.ts +27 -0
  412. package/dist/smells/similar-pairs.d.ts.map +1 -0
  413. package/dist/smells/similar-pairs.js +52 -0
  414. package/dist/smells/similar-pairs.js.map +1 -0
  415. package/dist/smells/smell-builder.d.ts +57 -12
  416. package/dist/smells/smell-builder.d.ts.map +1 -1
  417. package/dist/smells/smell-builder.js +111 -14
  418. package/dist/smells/smell-builder.js.map +1 -1
  419. package/dist/tsconfig/index.d.ts +19 -0
  420. package/dist/tsconfig/index.d.ts.map +1 -0
  421. package/dist/tsconfig/index.js +20 -0
  422. package/dist/tsconfig/index.js.map +1 -0
  423. package/dist/tsconfig/tsconfig-builder.d.ts +42 -9
  424. package/dist/tsconfig/tsconfig-builder.d.ts.map +1 -1
  425. package/dist/tsconfig/tsconfig-builder.js +64 -16
  426. package/dist/tsconfig/tsconfig-builder.js.map +1 -1
  427. package/package.json +3 -2
  428. package/dist/core/module-dependencies.d.ts +0 -28
  429. package/dist/core/module-dependencies.d.ts.map +0 -1
  430. package/dist/core/module-dependencies.js +0 -35
  431. package/dist/core/module-dependencies.js.map +0 -1
  432. package/dist/helpers/within.d.ts.map +0 -1
  433. package/dist/helpers/within.js.map +0 -1
@@ -0,0 +1,393 @@
1
+ import { duplicateKeyFindings, materializeSides, resolveSides, emptinessFindings, matchFindings, unboundDeclarationFindings, } from './correspondence-findings.js';
2
+ import { selectionMemo } from '@nielspeter/eess';
3
+ import { RuleBuilder } from '../core/rule-builder.js';
4
+ import { TerminalBuilder } from '../core/terminal-builder.js';
5
+ import { setCorrespondence } from '@nielspeter/eess';
6
+ function toKeyArray(key) {
7
+ return typeof key === 'string' ? [key] : key;
8
+ }
9
+ /** Model wrappers (ArchCall, ArchFunction, …) expose getNode(): Node. */
10
+ function keyedFromSelection(source, keyFn) {
11
+ const map = new Map();
12
+ for (const subject of source.subjects()) {
13
+ for (const key of toKeyArray(keyFn(subject))) {
14
+ const bucket = map.get(key);
15
+ if (bucket)
16
+ bucket.push(subject);
17
+ else
18
+ map.set(key, [subject]);
19
+ }
20
+ }
21
+ return map;
22
+ }
23
+ function keyedFromKeys(keys) {
24
+ const map = new Map();
25
+ for (const key of keys) {
26
+ if (!map.has(key))
27
+ map.set(key, []);
28
+ }
29
+ return map;
30
+ }
31
+ /**
32
+ * Assert a correspondence between two independently-derived key sets:
33
+ * "every X has a matching Y" (and/or the reverse). This is ADR-008 Rule 5 as a
34
+ * primitive — two derivations plus a disagreement test — so identity-not-count
35
+ * and non-vacuity are impossible to get wrong.
36
+ *
37
+ * The chain: `.side()` twice → `.beComplete()` / `.haveNoOrphans()` /
38
+ * `.beBijective()` → `.check()`.
39
+ *
40
+ * @example
41
+ * crossProject(p)
42
+ * .side('routes', calls(p).that().onObject('app'), byArg(0))
43
+ * .side('matrix', Object.keys(ROUTE_PERMISSIONS))
44
+ * .should()
45
+ * .beComplete()
46
+ * .rule({ id: 'auth/route-matrix', suggestion: 'Add the route to ROUTE_PERMISSIONS.' })
47
+ * .check()
48
+ */
49
+ export const sidesOf = selectionMemo();
50
+ /**
51
+ * The two-sided join: bind two artifacts by key and fail on the difference.
52
+ *
53
+ * Where every other builder selects subjects and asserts something about each,
54
+ * this one declares two (or more) named SIDES, derives a key set from each, and
55
+ * reports the set difference. It is the kernel's answer to "these two things must
56
+ * agree" — a route table against its permission map, a diagram against the code,
57
+ * a README table against the workspace.
58
+ *
59
+ * ```ts
60
+ * crossProject(project)
61
+ * .side('routes', classes(project).that().haveDecorator('Controller'), routeKey)
62
+ * .side('matrix', Object.keys(ROUTE_PERMISSIONS))
63
+ * .should()
64
+ * .beComplete()
65
+ * .check()
66
+ * ```
67
+ *
68
+ * `beComplete()` reports keys the second side is missing, `haveNoOrphans()` the
69
+ * reverse, and `beBijective()` both. A builder with fewer than two sides has
70
+ * compared nothing, and `examinedUnits()` reports that as zero rather than
71
+ * letting it pass vacuously (ADR-010).
72
+ */
73
+ export class CrossProjectBuilder extends TerminalBuilder {
74
+ _sides = [];
75
+ _checkComplete = false;
76
+ _checkNoOrphans = false;
77
+ _expectEmptySides = new Set();
78
+ _distinctKeys = new Set();
79
+ // `_project` is accepted for API symmetry with the other entry points
80
+ // (modules/classes/…); crossProject's sides carry their own project.
81
+ constructor(_project) {
82
+ super();
83
+ }
84
+ /**
85
+ * Declare one side of the pairing.
86
+ *
87
+ * `source` is either a `RuleBuilder` selection — in which case `keyFn` is
88
+ * REQUIRED, because a subject has no inherent key and guessing one silently
89
+ * mis-joins the two sides — or a ready-made key source.
90
+ *
91
+ * Call it twice; a builder with fewer than two sides has compared nothing,
92
+ * which `examinedUnits()` reports as zero rather than passing vacuously.
93
+ */
94
+ side(name, source, keyFn) {
95
+ const next = this.copy();
96
+ if (source instanceof RuleBuilder) {
97
+ if (!keyFn) {
98
+ throw new TypeError(`crossProject side '${name}' from a selection requires a keyFn (subject -> key).`);
99
+ }
100
+ next._sides.push({ name, materialize: () => keyedFromSelection(source, keyFn) });
101
+ }
102
+ else {
103
+ next._sides.push({ name, materialize: () => keyedFromKeys(source) });
104
+ }
105
+ return next;
106
+ }
107
+ /**
108
+ * An independent copy, carrying the sides and both opt-out sets.
109
+ *
110
+ * `collectViolations` throws unless there are exactly two sides, so a leaked
111
+ * `_sides` push does not fail silently here — but a leaked declaration does:
112
+ * it is what stands between a vacuous side and a finding, and inheriting it
113
+ * turns a later rule's empty side green.
114
+ */
115
+ copy() {
116
+ const clone = super.copy();
117
+ clone._sides = [...this._sides];
118
+ clone._expectEmptySides = new Set(this._expectEmptySides);
119
+ clone._distinctKeys = new Set(this._distinctKeys);
120
+ return clone;
121
+ }
122
+ /** Optional readability markers — the assertion terminals may be called directly. */
123
+ should() {
124
+ return this;
125
+ }
126
+ /**
127
+ * Reads as English between two conditions (`.beComplete().andShould()…`) and
128
+ * changes nothing — the builder is already in its condition phase.
129
+ */
130
+ andShould() {
131
+ return this;
132
+ }
133
+ /** Every key of the first side must have a match in the second (A ⊆ B). */
134
+ beComplete() {
135
+ const next = this.copy();
136
+ next._checkComplete = true;
137
+ return next;
138
+ }
139
+ /** Every key of the second side must have a source in the first (B ⊆ A). */
140
+ haveNoOrphans() {
141
+ const next = this.copy();
142
+ next._checkNoOrphans = true;
143
+ return next;
144
+ }
145
+ /** Both directions — the two key sets must be identical. */
146
+ beBijective() {
147
+ const next = this.copy();
148
+ next._checkComplete = true;
149
+ next._checkNoOrphans = true;
150
+ return next;
151
+ }
152
+ /**
153
+ * Declare that a NAMED side is empty — plan 0097, replacing `allowEmpty()`.
154
+ *
155
+ * The difference is the whole point, and it is not a rename. `allowEmpty()`
156
+ * PERMITTED a side to be empty and never spoke again: a permanent, silent
157
+ * opt-out that stayed green the day the side filled up and the rule started
158
+ * certifying nothing about it. This ASSERTS the side is empty, and fails the
159
+ * day it stops being — an intent that expires and reports itself, which is
160
+ * the property ADR-010 part 3 requires of every declaration. Plan 0069's
161
+ * appendix rejected the permanent form for the rule family with receipts; a
162
+ * sibling family had it shipped and documented.
163
+ *
164
+ * **The zero-argument form throws here**, and that is the correction of a
165
+ * defect this method shipped with. The parameter has to be optional — a
166
+ * required one is not a valid override of `TerminalBuilder`'s zero-arg
167
+ * `expectEmpty()` — but the OVERRIDE VALIDITY argument justifies the
168
+ * signature, not the semantics. Inheriting the base meaning gave
169
+ * `crossProject().expectEmpty()` a whole-rule flag that suppressed the
170
+ * empty-side finding for BOTH sides and that the expiry branch never read:
171
+ * `allowEmpty` restored, permanent and silent, in fewer characters than
172
+ * before, on the release that deleted it. Measured green over two populated
173
+ * sides, forever.
174
+ *
175
+ * A crossProject compares two named sides, so "this rule is empty" has no
176
+ * meaning that is not per-side. Refusing at build time is the same answer
177
+ * this class already gives a contradiction, and it is loud where the
178
+ * inherited semantics were silent.
179
+ */
180
+ expectEmpty(side) {
181
+ if (side === undefined) {
182
+ throw new TypeError('crossProject() declares emptiness per side: call .expectEmpty(sideName) for each side ' +
183
+ 'you expect to be empty. A crossProject compares two named sides, so a whole-rule ' +
184
+ 'declaration would suppress both and expire on neither.');
185
+ }
186
+ const next = this.copy();
187
+ next._expectEmptySides.add(side);
188
+ return next;
189
+ }
190
+ /**
191
+ * Units this rule examined — plan 0096: the keys of both sides, summed.
192
+ *
193
+ * Zero means the comparison had nothing to compare, which for this family is
194
+ * two empty sides. One empty side is already its own finding and is not this
195
+ * question.
196
+ */
197
+ /**
198
+ * This family counts keys — the keys of both sides, summed.
199
+ *
200
+ * Plan 0099: `CollectResult.examined` is unit-typed per family (ADR-009 part
201
+ * 1), and the zero-examined message prints the noun. Inheriting the base
202
+ * `'subjects'` is a category error in a sentence whose whole job is naming what
203
+ * was and was not looked at.
204
+ */
205
+ examinedUnitNoun() {
206
+ return 'keys';
207
+ }
208
+ /**
209
+ * How many units this rule actually examined — ADR-010's evidence that a pass
210
+ * was constructed rather than defaulted.
211
+ *
212
+ * Both materialized sides, summed — zero until two sides are declared, which is itself the evidence that nothing was compared.
213
+ */
214
+ examinedUnits() {
215
+ const [first, second] = this._sides;
216
+ // Zero is the honest answer for an under-declared pairing: nothing was
217
+ // compared, and ADR-010 wants that visible rather than defaulted away.
218
+ if (first === undefined || second === undefined)
219
+ return 0;
220
+ const [a, b] = materializeSides(this, first, second);
221
+ return a.size + b.size;
222
+ }
223
+ /**
224
+ * Declared when EVERY side is — plan 0097.
225
+ *
226
+ * The base implementation reads the whole-rule flag, which this class refuses
227
+ * to let anyone set. Without this override, 0098's floor would red a rule
228
+ * whose every side the author declared, with a finding telling them to
229
+ * declare. The per-side loop in `collectViolations` does not need this — its
230
+ * membership test covers each side directly — which is exactly why the
231
+ * previous private version was dead code and was removed. This one is for
232
+ * the root, which asks the question about the rule rather than about a side.
233
+ *
234
+ * **This was recorded as unobservable-until-0098, and that equivalence EXPIRED**
235
+ * the moment plan 0096 made `diagnose()` its first reader. Reverting this
236
+ * override to the base body — which for this class can never be true, since the
237
+ * zero-arg `expectEmpty()` throws — makes a rule whose every side is declared
238
+ * report `zero-subjects` again, telling the author to declare what they
239
+ * declared. A recorded equivalence is a claim with a lifetime, and this one's
240
+ * ended one commit after it was written; it is guarded now.
241
+ */
242
+ emptyDeclarationAdvice() {
243
+ return '.expectEmpty(sideName) for each side';
244
+ }
245
+ /**
246
+ * Whether the author declared this rule's empty result intentional.
247
+ *
248
+ * Overrides `TerminalBuilder`'s `.expectEmpty()` reading, because this builder
249
+ * has more than one side and each can be declared empty independently.
250
+ */
251
+ declaresEmpty() {
252
+ return this._sides.length > 0 && this._sides.every((s) => this._expectEmptySides.has(s.name));
253
+ }
254
+ /** Fail if a side maps two distinct subjects to one key (over-normalization guard). */
255
+ distinctKeysOn(sideName) {
256
+ const next = this.copy();
257
+ next._distinctKeys.add(sideName);
258
+ return next;
259
+ }
260
+ /**
261
+ * Wrong arity counts as asserting nothing, **whatever assertion was chosen**.
262
+ *
263
+ * `.beComplete()` on a one-sided crossProject cannot assert anything: there
264
+ * is no second side to compare against, so the call is a claim about a
265
+ * comparison that does not exist. Reading only the assertion flags let that
266
+ * pair through the gate and into `collectViolations()`, where the arity check
267
+ * throws a `RangeError` — and until bug 0025 that error escaped the CLI and
268
+ * dropped every remaining rule file's findings.
269
+ *
270
+ * So the same fault now reports the same way whether or not an assertion was
271
+ * chosen, and `assertionAdvice()` below already names the right remedy for it
272
+ * (another `.side(...)`, never `.beComplete()`). The arity throw stays as an
273
+ * invariant on `collectViolations()`, unreachable through the terminals.
274
+ */
275
+ assertsSomething() {
276
+ return this._sides.length === 2 && (this._checkComplete || this._checkNoOrphans);
277
+ }
278
+ /**
279
+ * The remedy for this builder's assertion-less state, as one string.
280
+ *
281
+ * One channel, so `diagnose()`'s advice and the finding's own message cannot
282
+ * disagree. Overrides `TerminalBuilder`'s generic text with wording specific to
283
+ * what this builder is missing.
284
+ */
285
+ assertionAdvice() {
286
+ // Two distinct faults reach here, and naming the wrong one is the ADR-008
287
+ // rule 2 defect this plan is partly about: with fewer than two sides the
288
+ // fix is another `.side(...)`, not an assertion — adding `.beComplete()`
289
+ // would leave the rule exactly as broken (measured in review).
290
+ if (this._sides.length !== 2) {
291
+ return (`this crossProject has ${String(this._sides.length)} side(s) and needs exactly two, ` +
292
+ 'so it compares nothing. Add the missing .side(name, ...) call.');
293
+ }
294
+ return 'this crossProject asserts nothing: call .beComplete(), .haveNoOrphans(), or .beBijective().';
295
+ }
296
+ /** Named by id or by its sides, not 'unnamed' (plan 0070 §4). */
297
+ describeRule() {
298
+ const sides = this._sides.map((side) => side.name).join(' <-> ');
299
+ return {
300
+ ...super.describeRule(),
301
+ rule: this._metadata?.id ?? (sides ? `crossProject [${sides}]` : 'crossProject'),
302
+ };
303
+ }
304
+ /** What this rule declared, as a value the findings functions can read. */
305
+ declared() {
306
+ return {
307
+ sides: this._sides,
308
+ distinctKeys: this._distinctKeys,
309
+ expectEmptySides: this._expectEmptySides,
310
+ checkComplete: this._checkComplete,
311
+ checkNoOrphans: this._checkNoOrphans,
312
+ metadata: this._metadata,
313
+ reason: this._reason,
314
+ };
315
+ }
316
+ /** Materialize both sides and pair their keys — the input every finding reads. */
317
+ pairingFor(sideA, sideB, meta) {
318
+ const [aKeyed, bKeyed] = materializeSides(this, sideA, sideB);
319
+ return {
320
+ sideA,
321
+ sideB,
322
+ aKeyed,
323
+ bKeyed,
324
+ result: setCorrespondence(aKeyed.keys(), bKeyed.keys()),
325
+ meta,
326
+ declared: this.declared(),
327
+ };
328
+ }
329
+ collectViolations() {
330
+ const { sideA, sideB, meta } = resolveSides(this._sides, this._reason, this._metadata);
331
+ const unbound = unboundDeclarationFindings(this.declared(), sideA, sideB);
332
+ // A configuration fault: the sides were never materialized, so nothing was
333
+ // examined. Plan 0098 — 0 here is the honest number, not a placeholder.
334
+ if (unbound.length > 0)
335
+ return { violations: unbound, examined: 0 };
336
+ const pairing = this.pairingFor(sideA, sideB, meta);
337
+ // Emptiness first: a side that resolved nothing makes every later question
338
+ // vacuous, so its finding replaces them rather than joining them.
339
+ const { emptyFindings, falseDeclarations } = emptinessFindings(pairing);
340
+ if (emptyFindings.length > 0) {
341
+ return {
342
+ violations: [...emptyFindings, ...falseDeclarations],
343
+ examined: this.examinedUnits(),
344
+ };
345
+ }
346
+ return {
347
+ violations: [
348
+ ...falseDeclarations,
349
+ ...matchFindings(pairing),
350
+ ...duplicateKeyFindings(pairing),
351
+ ],
352
+ examined: this.examinedUnits(),
353
+ };
354
+ }
355
+ }
356
+ /**
357
+ * Entry point: assert a correspondence between two independently-derived key
358
+ * sets. Call `.side(...)` twice, then an assertion terminal.
359
+ */
360
+ export function crossProject(p) {
361
+ return new CrossProjectBuilder(p);
362
+ }
363
+ // --- keyFn vocabulary (the common cases; keyFn stays a raw escape hatch) ---
364
+ /** Key a subject by its name (`getName()`); anonymous subjects fall back to `<anonymous>`. */
365
+ export function byName() {
366
+ return (subject) => subject.getName() ?? '<anonymous>';
367
+ }
368
+ /**
369
+ * Key a call-like subject by its argument at `index`. String/template literal
370
+ * arguments are unquoted so keys match plain sides (e.g. `Object.keys(map)`) —
371
+ * `app.get("/x", …)` keys as `/x`, not `"/x"`. Non-literal args key by raw text.
372
+ */
373
+ export function byArg(index) {
374
+ return (subject) => {
375
+ const arg = subject.getArguments()[index];
376
+ return arg ? unquote(arg.getText()) : '<no-arg>';
377
+ };
378
+ }
379
+ /** Strip a single pair of matching surrounding quotes/backticks, if present. */
380
+ function unquote(text) {
381
+ const first = text[0];
382
+ if ((first === '"' || first === "'" || first === '`') &&
383
+ text.length >= 2 &&
384
+ text.endsWith(first)) {
385
+ return text.slice(1, -1);
386
+ }
387
+ return text;
388
+ }
389
+ /** Key a type-like subject by each of its property names (one subject → many keys). */
390
+ export function byPropertyNames() {
391
+ return (subject) => subject.getProperties().map((property) => property.getName());
392
+ }
393
+ //# sourceMappingURL=correspondence-builder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"correspondence-builder.js","sourceRoot":"","sources":["../../src/builders/correspondence-builder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,104 @@
1
+ import type { ArchViolation } from '@nielspeter/eess';
2
+ import type { Declared, Pairing, Side } from './correspondence-builder.js';
3
+ export interface ViolationMeta {
4
+ readonly rule: string;
5
+ readonly because?: string;
6
+ readonly ruleId?: string;
7
+ readonly suggestion?: string;
8
+ readonly docs?: string;
9
+ }
10
+ /**
11
+ * Declarations — `.expectEmpty(name)` / `.withDistinctKeys(name)` — that name a
12
+ * side this crossProject does not have.
13
+ *
14
+ * A declaration that binds to no side is a configuration finding, not a no-op
15
+ * (plan 0097, correcting the same defect the shipped version had).
16
+ * `.expectEmpty('servcies')` was accepted silently and asserted nothing
17
+ * forever: the exact hazard this class's own docstring rejects the permanent
18
+ * form for ("one word, silent forever, TYPO OR NOT, and nothing revisits it"),
19
+ * inherited whole by the replacement.
20
+ *
21
+ * ADR-010 part 3 already ruled the structurally identical preset case — a
22
+ * declaration binding to no constructed rule is a FAILING finding, never a
23
+ * warning — so this follows settled precedent rather than deciding anew.
24
+ *
25
+ * Here rather than in the setter: `.expectEmpty(name)` may legally precede
26
+ * `.side(name, …)`, so the setter cannot know yet.
27
+ *
28
+ * A Set, not a concatenation: a name in BOTH sets produced two findings with
29
+ * identical element, message, file and line — the identity shape bugs 0064,
30
+ * 0065 and 0067 were filed for. And membership is tested against the side LIST
31
+ * rather than two name comparisons, so it cannot rot if arity ever changes.
32
+ */
33
+ export declare function unboundDeclarationFindings(declared: Declared, sideA: Side, sideB: Side): ArchViolation[];
34
+ /**
35
+ * Findings about each side being empty, and about a declaration that says so
36
+ * while the side is not.
37
+ */
38
+ export declare function emptinessFindings(p: Pairing): {
39
+ emptyFindings: ArchViolation[];
40
+ falseDeclarations: ArchViolation[];
41
+ };
42
+ /**
43
+ * Findings from the pairing itself — keys on one side with no partner
44
+ * on the other, in whichever directions the rule asked about.
45
+ */
46
+ export declare function matchFindings(p: Pairing): ArchViolation[];
47
+ /**
48
+ * Findings for a side whose key function maps several distinct subjects onto
49
+ * one key — over-normalization can mask a real mismatch.
50
+ */
51
+ export declare function duplicateKeyFindings(p: Pairing): ArchViolation[];
52
+ /**
53
+ * Run the pairing and collect its findings, in four phases:
54
+ * unbound declarations, emptiness, the match itself, then duplicate keys.
55
+ *
56
+ * ## The arity throw is an invariant, not an error path
57
+ *
58
+ * Unreachable through `.check()` / `.warn()` / `.violations()` as of the
59
+ * bug-0025 fix: `assertsSomething()` is false for wrong arity, so the gate
60
+ * reports it as a configuration finding before this method is called. Kept as
61
+ * the invariant it always was — this method indexes `_sides[0]` and
62
+ * `_sides[1]` below, and a direct subclass caller deserves the named error
63
+ * rather than an undefined read. Do not treat it as the answer to "what
64
+ * happens with the wrong number of sides": the loud answer is the gate, and if
65
+ * this ever throws again through a terminal, the gate is gone.
66
+ *
67
+ * There is deliberately NO missing-assertion throw: the gate reports that as a
68
+ * configuration finding before this runs (bug 0019), which is why the gate sits
69
+ * ahead of this method — a `RangeError` from here escaped the CLI's
70
+ * `ArchRuleError`-only catch and dropped every remaining rule file. The
71
+ * sides-count check stays, because wrong arity is a different fault from a
72
+ * missing assertion and its remedy is another `.side(...)`.
73
+ */
74
+ /**
75
+ * The two sides and the metadata every finding from them carries.
76
+ *
77
+ * Extracted so `collectViolations` reads as the decision sequence it is —
78
+ * unbound, then emptiness, then matching — rather than opening with a guard
79
+ * and a literal. The arity check lives here because it is the precondition
80
+ * for the metadata: the rule name is built from both side names.
81
+ */
82
+ export declare function resolveSides(sides: readonly Side[], reason: string | undefined, metadata: {
83
+ id?: string;
84
+ suggestion?: string;
85
+ docs?: string;
86
+ } | undefined): {
87
+ sideA: Side;
88
+ sideB: Side;
89
+ meta: ViolationMeta;
90
+ };
91
+ /**
92
+ * Both sides, materialized once — plan 0096, and the ONE method both readers
93
+ * call.
94
+ *
95
+ * CrossProject has no corpus of its own: its sides ARE its input, so the
96
+ * examined unit is their keys and the "selection" is the materialization
97
+ * itself. Sharing it matters more here than anywhere else, because
98
+ * `Side.materialize` is a bare closure over a user-supplied `keyFn` and a full
99
+ * rule selection — so a second derivation would re-run arbitrary user code,
100
+ * and `diagnose()` calling the accessor before `check()` would pay for the
101
+ * whole thing twice.
102
+ */
103
+ export declare function materializeSides(owner: object, a: Side, b: Side): [Map<string, unknown[]>, Map<string, unknown[]>];
104
+ //# sourceMappingURL=correspondence-findings.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"correspondence-findings.d.ts","sourceRoot":"","sources":["../../src/builders/correspondence-findings.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAErD,OAAO,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,6BAA6B,CAAA;AAyB1E,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAA;IAC5B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CACvB;AAoJD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,0BAA0B,CACxC,QAAQ,EAAE,QAAQ,EAClB,KAAK,EAAE,IAAI,EACX,KAAK,EAAE,IAAI,GACV,aAAa,EAAE,CAOjB;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,OAAO,GAAG;IAC7C,aAAa,EAAE,aAAa,EAAE,CAAA;IAC9B,iBAAiB,EAAE,aAAa,EAAE,CAAA;CACnC,CA2BA;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,CAAC,EAAE,OAAO,GAAG,aAAa,EAAE,CAsBzD;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,CAAC,EAAE,OAAO,GAAG,aAAa,EAAE,CA8BhE;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAC1B,KAAK,EAAE,SAAS,IAAI,EAAE,EACtB,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,QAAQ,EAAE;IAAE,EAAE,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,GACxE;IAAE,KAAK,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,aAAa,CAAA;CAAE,CAkBnD;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,MAAM,EACb,CAAC,EAAE,IAAI,EACP,CAAC,EAAE,IAAI,GACN,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC,CAclD"}