@nielspeter/eess-ts 0.2.1 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (467) hide show
  1. package/README.md +61 -35
  2. package/dist/builders/call-rule-builder.d.ts +66 -26
  3. package/dist/builders/call-rule-builder.d.ts.map +1 -1
  4. package/dist/builders/call-rule-builder.js +75 -32
  5. package/dist/builders/call-rule-builder.js.map +1 -1
  6. package/dist/builders/class-rule-builder.d.ts +125 -26
  7. package/dist/builders/class-rule-builder.d.ts.map +1 -1
  8. package/dist/builders/class-rule-builder.js +141 -55
  9. package/dist/builders/class-rule-builder.js.map +1 -1
  10. package/dist/builders/correspondence-builder.d.ts +287 -0
  11. package/dist/builders/correspondence-builder.d.ts.map +1 -0
  12. package/dist/builders/correspondence-builder.js +385 -0
  13. package/dist/builders/correspondence-builder.js.map +1 -0
  14. package/dist/builders/correspondence-findings.d.ts +104 -0
  15. package/dist/builders/correspondence-findings.d.ts.map +1 -0
  16. package/dist/builders/correspondence-findings.js +301 -0
  17. package/dist/builders/correspondence-findings.js.map +1 -0
  18. package/dist/builders/cross-layer-builder.d.ts +99 -16
  19. package/dist/builders/cross-layer-builder.d.ts.map +1 -1
  20. package/dist/builders/cross-layer-builder.js +182 -35
  21. package/dist/builders/cross-layer-builder.js.map +1 -1
  22. package/dist/builders/function-rule-builder.d.ts +144 -25
  23. package/dist/builders/function-rule-builder.d.ts.map +1 -1
  24. package/dist/builders/function-rule-builder.js +177 -39
  25. package/dist/builders/function-rule-builder.js.map +1 -1
  26. package/dist/builders/jsx-rule-builder.d.ts +70 -14
  27. package/dist/builders/jsx-rule-builder.d.ts.map +1 -1
  28. package/dist/builders/jsx-rule-builder.js +73 -14
  29. package/dist/builders/jsx-rule-builder.js.map +1 -1
  30. package/dist/builders/module-rule-builder.d.ts +2 -2
  31. package/dist/builders/module-rule-builder.d.ts.map +1 -1
  32. package/dist/builders/module-rule-builder.js +16 -19
  33. package/dist/builders/module-rule-builder.js.map +1 -1
  34. package/dist/builders/scoped-function-rule-builder.d.ts +11 -0
  35. package/dist/builders/scoped-function-rule-builder.d.ts.map +1 -1
  36. package/dist/builders/scoped-function-rule-builder.js +12 -0
  37. package/dist/builders/scoped-function-rule-builder.js.map +1 -1
  38. package/dist/builders/slice-discovery-message.d.ts +36 -0
  39. package/dist/builders/slice-discovery-message.d.ts.map +1 -0
  40. package/dist/builders/slice-discovery-message.js +181 -0
  41. package/dist/builders/slice-discovery-message.js.map +1 -0
  42. package/dist/builders/slice-rule-builder.d.ts +151 -12
  43. package/dist/builders/slice-rule-builder.d.ts.map +1 -1
  44. package/dist/builders/slice-rule-builder.js +243 -35
  45. package/dist/builders/slice-rule-builder.js.map +1 -1
  46. package/dist/builders/type-rule-builder.d.ts +95 -24
  47. package/dist/builders/type-rule-builder.d.ts.map +1 -1
  48. package/dist/builders/type-rule-builder.js +109 -42
  49. package/dist/builders/type-rule-builder.js.map +1 -1
  50. package/dist/{helpers → builders}/within.d.ts +2 -2
  51. package/dist/builders/within.d.ts.map +1 -0
  52. package/dist/{helpers → builders}/within.js +1 -1
  53. package/dist/builders/within.js.map +1 -0
  54. package/dist/cli/commands/baseline.d.ts +8 -3
  55. package/dist/cli/commands/baseline.d.ts.map +1 -1
  56. package/dist/cli/commands/baseline.js +111 -7
  57. package/dist/cli/commands/baseline.js.map +1 -1
  58. package/dist/cli/commands/check.d.ts +7 -2
  59. package/dist/cli/commands/check.d.ts.map +1 -1
  60. package/dist/cli/commands/check.js +385 -47
  61. package/dist/cli/commands/check.js.map +1 -1
  62. package/dist/cli/commands/doctor.d.ts +29 -0
  63. package/dist/cli/commands/doctor.d.ts.map +1 -0
  64. package/dist/cli/commands/doctor.js +224 -0
  65. package/dist/cli/commands/doctor.js.map +1 -0
  66. package/dist/cli/commands/explain.d.ts +2 -1
  67. package/dist/cli/commands/explain.d.ts.map +1 -1
  68. package/dist/cli/commands/explain.js +19 -10
  69. package/dist/cli/commands/explain.js.map +1 -1
  70. package/dist/cli/commands/init.d.ts +9 -3
  71. package/dist/cli/commands/init.d.ts.map +1 -1
  72. package/dist/cli/commands/init.js +162 -137
  73. package/dist/cli/commands/init.js.map +1 -1
  74. package/dist/cli/import-rule-module.d.ts +29 -0
  75. package/dist/cli/import-rule-module.d.ts.map +1 -0
  76. package/dist/cli/import-rule-module.js +47 -0
  77. package/dist/cli/import-rule-module.js.map +1 -0
  78. package/dist/cli/index.d.ts +2 -2
  79. package/dist/cli/index.d.ts.map +1 -1
  80. package/dist/cli/index.js +101 -43
  81. package/dist/cli/index.js.map +1 -1
  82. package/dist/cli/load-rules.d.ts +6 -11
  83. package/dist/cli/load-rules.d.ts.map +1 -1
  84. package/dist/cli/load-rules.js +25 -32
  85. package/dist/cli/load-rules.js.map +1 -1
  86. package/dist/cli/resolve-config.d.ts +0 -8
  87. package/dist/cli/resolve-config.d.ts.map +1 -1
  88. package/dist/cli/resolve-config.js +25 -55
  89. package/dist/cli/resolve-config.js.map +1 -1
  90. package/dist/cli/rule-file-findings.d.ts +178 -0
  91. package/dist/cli/rule-file-findings.d.ts.map +1 -0
  92. package/dist/cli/rule-file-findings.js +351 -0
  93. package/dist/cli/rule-file-findings.js.map +1 -0
  94. package/dist/cli/watch.d.ts +17 -34
  95. package/dist/cli/watch.d.ts.map +1 -1
  96. package/dist/cli/watch.js +14 -129
  97. package/dist/cli/watch.js.map +1 -1
  98. package/dist/conditions/body-analysis-function.d.ts.map +1 -1
  99. package/dist/conditions/body-analysis-function.js +16 -7
  100. package/dist/conditions/body-analysis-function.js.map +1 -1
  101. package/dist/conditions/body-analysis-module.d.ts.map +1 -1
  102. package/dist/conditions/body-analysis-module.js +14 -9
  103. package/dist/conditions/body-analysis-module.js.map +1 -1
  104. package/dist/conditions/body-analysis.d.ts.map +1 -1
  105. package/dist/conditions/body-analysis.js +16 -7
  106. package/dist/conditions/body-analysis.js.map +1 -1
  107. package/dist/conditions/call.d.ts.map +1 -1
  108. package/dist/conditions/call.js +41 -19
  109. package/dist/conditions/call.js.map +1 -1
  110. package/dist/conditions/catch-analysis.d.ts +2 -1
  111. package/dist/conditions/catch-analysis.d.ts.map +1 -1
  112. package/dist/conditions/catch-analysis.js.map +1 -1
  113. package/dist/conditions/cross-layer.d.ts +2 -10
  114. package/dist/conditions/cross-layer.d.ts.map +1 -1
  115. package/dist/conditions/cross-layer.js +227 -23
  116. package/dist/conditions/cross-layer.js.map +1 -1
  117. package/dist/conditions/dependency.d.ts +35 -6
  118. package/dist/conditions/dependency.d.ts.map +1 -1
  119. package/dist/conditions/dependency.js +299 -45
  120. package/dist/conditions/dependency.js.map +1 -1
  121. package/dist/conditions/exports.d.ts.map +1 -1
  122. package/dist/conditions/exports.js +41 -37
  123. package/dist/conditions/exports.js.map +1 -1
  124. package/dist/conditions/function.d.ts.map +1 -1
  125. package/dist/conditions/function.js +19 -5
  126. package/dist/conditions/function.js.map +1 -1
  127. package/dist/conditions/helpers.d.ts +2 -1
  128. package/dist/conditions/helpers.d.ts.map +1 -1
  129. package/dist/conditions/helpers.js +4 -1
  130. package/dist/conditions/helpers.js.map +1 -1
  131. package/dist/conditions/jsx.d.ts.map +1 -1
  132. package/dist/conditions/jsx.js +7 -2
  133. package/dist/conditions/jsx.js.map +1 -1
  134. package/dist/conditions/match-identity.d.ts +43 -0
  135. package/dist/conditions/match-identity.d.ts.map +1 -0
  136. package/dist/conditions/match-identity.js +43 -0
  137. package/dist/conditions/match-identity.js.map +1 -0
  138. package/dist/conditions/members.d.ts.map +1 -1
  139. package/dist/conditions/members.js +20 -6
  140. package/dist/conditions/members.js.map +1 -1
  141. package/dist/conditions/reverse-dependency.d.ts +18 -5
  142. package/dist/conditions/reverse-dependency.d.ts.map +1 -1
  143. package/dist/conditions/reverse-dependency.js +155 -93
  144. package/dist/conditions/reverse-dependency.js.map +1 -1
  145. package/dist/conditions/slice.d.ts +86 -2
  146. package/dist/conditions/slice.d.ts.map +1 -1
  147. package/dist/conditions/slice.js +234 -53
  148. package/dist/conditions/slice.js.map +1 -1
  149. package/dist/conditions/structural.d.ts.map +1 -1
  150. package/dist/conditions/structural.js +16 -4
  151. package/dist/conditions/structural.js.map +1 -1
  152. package/dist/core/check-all.d.ts +19 -0
  153. package/dist/core/check-all.d.ts.map +1 -0
  154. package/dist/core/check-all.js +150 -0
  155. package/dist/core/check-all.js.map +1 -0
  156. package/dist/core/combinators.d.ts +48 -0
  157. package/dist/core/combinators.d.ts.map +1 -0
  158. package/dist/core/combinators.js +49 -0
  159. package/dist/core/combinators.js.map +1 -0
  160. package/dist/core/descendant-cache.d.ts +36 -0
  161. package/dist/core/descendant-cache.d.ts.map +1 -0
  162. package/dist/core/descendant-cache.js +117 -0
  163. package/dist/core/descendant-cache.js.map +1 -0
  164. package/dist/core/diagnose.d.ts +234 -0
  165. package/dist/core/diagnose.d.ts.map +1 -0
  166. package/dist/core/diagnose.js +390 -0
  167. package/dist/core/diagnose.js.map +1 -0
  168. package/dist/core/disk-set.d.ts +48 -0
  169. package/dist/core/disk-set.d.ts.map +1 -0
  170. package/dist/core/disk-set.js +218 -0
  171. package/dist/core/disk-set.js.map +1 -0
  172. package/dist/core/element-cache.d.ts +75 -0
  173. package/dist/core/element-cache.d.ts.map +1 -0
  174. package/dist/core/element-cache.js +32 -0
  175. package/dist/core/element-cache.js.map +1 -0
  176. package/dist/core/empty-project-advice.d.ts +75 -0
  177. package/dist/core/empty-project-advice.d.ts.map +1 -0
  178. package/dist/core/empty-project-advice.js +61 -0
  179. package/dist/core/empty-project-advice.js.map +1 -0
  180. package/dist/core/exclusion-comments.d.ts +19 -0
  181. package/dist/core/exclusion-comments.d.ts.map +1 -0
  182. package/dist/core/exclusion-comments.js +7 -0
  183. package/dist/core/exclusion-comments.js.map +1 -0
  184. package/dist/core/execute-rule.d.ts +158 -0
  185. package/dist/core/execute-rule.d.ts.map +1 -0
  186. package/dist/core/execute-rule.js +666 -0
  187. package/dist/core/execute-rule.js.map +1 -0
  188. package/dist/core/glob-diagnosis.d.ts +78 -0
  189. package/dist/core/glob-diagnosis.d.ts.map +1 -0
  190. package/dist/core/glob-diagnosis.js +134 -0
  191. package/dist/core/glob-diagnosis.js.map +1 -0
  192. package/dist/core/glob-evaluator.d.ts +48 -0
  193. package/dist/core/glob-evaluator.d.ts.map +1 -0
  194. package/dist/core/glob-evaluator.js +89 -0
  195. package/dist/core/glob-evaluator.js.map +1 -0
  196. package/dist/core/import-candidates.d.ts +60 -0
  197. package/dist/core/import-candidates.d.ts.map +1 -0
  198. package/dist/core/import-candidates.js +93 -0
  199. package/dist/core/import-candidates.js.map +1 -0
  200. package/dist/core/import-options.d.ts +55 -2
  201. package/dist/core/import-options.d.ts.map +1 -1
  202. package/dist/core/import-options.js +64 -0
  203. package/dist/core/import-options.js.map +1 -1
  204. package/dist/core/invalidate-on-modify.d.ts +20 -0
  205. package/dist/core/invalidate-on-modify.d.ts.map +1 -0
  206. package/dist/core/invalidate-on-modify.js +26 -0
  207. package/dist/core/invalidate-on-modify.js.map +1 -0
  208. package/dist/core/line-index.d.ts +3 -0
  209. package/dist/core/line-index.d.ts.map +1 -0
  210. package/dist/core/line-index.js +227 -0
  211. package/dist/core/line-index.js.map +1 -0
  212. package/dist/core/metric-violation.d.ts +86 -0
  213. package/dist/core/metric-violation.d.ts.map +1 -0
  214. package/dist/core/metric-violation.js +132 -0
  215. package/dist/core/metric-violation.js.map +1 -0
  216. package/dist/core/module-edges.d.ts +361 -0
  217. package/dist/core/module-edges.d.ts.map +1 -0
  218. package/dist/core/module-edges.js +593 -0
  219. package/dist/core/module-edges.js.map +1 -0
  220. package/dist/core/object-literal-functions.d.ts +42 -0
  221. package/dist/core/object-literal-functions.d.ts.map +1 -0
  222. package/dist/core/object-literal-functions.js +75 -0
  223. package/dist/core/object-literal-functions.js.map +1 -0
  224. package/dist/core/orphan-exclusions.d.ts +44 -0
  225. package/dist/core/orphan-exclusions.d.ts.map +1 -0
  226. package/dist/core/orphan-exclusions.js +224 -0
  227. package/dist/core/orphan-exclusions.js.map +1 -0
  228. package/dist/core/pair-condition.d.ts +32 -3
  229. package/dist/core/pair-condition.d.ts.map +1 -1
  230. package/dist/core/path-universe.d.ts +22 -0
  231. package/dist/core/path-universe.d.ts.map +1 -0
  232. package/dist/core/path-universe.js +45 -0
  233. package/dist/core/path-universe.js.map +1 -0
  234. package/dist/core/per-root-compiler-options.d.ts +20 -0
  235. package/dist/core/per-root-compiler-options.d.ts.map +1 -0
  236. package/dist/core/per-root-compiler-options.js +57 -0
  237. package/dist/core/per-root-compiler-options.js.map +1 -0
  238. package/dist/core/project-relative.d.ts +98 -0
  239. package/dist/core/project-relative.d.ts.map +1 -0
  240. package/dist/core/project-relative.js +185 -0
  241. package/dist/core/project-relative.js.map +1 -0
  242. package/dist/core/project.d.ts +7 -1
  243. package/dist/core/project.d.ts.map +1 -1
  244. package/dist/core/project.js +29 -4
  245. package/dist/core/project.js.map +1 -1
  246. package/dist/core/rule-builder.d.ts +303 -0
  247. package/dist/core/rule-builder.d.ts.map +1 -0
  248. package/dist/core/rule-builder.js +463 -0
  249. package/dist/core/rule-builder.js.map +1 -0
  250. package/dist/core/rule-declaration.d.ts +32 -0
  251. package/dist/core/rule-declaration.d.ts.map +1 -0
  252. package/dist/core/rule-declaration.js +88 -0
  253. package/dist/core/rule-declaration.js.map +1 -0
  254. package/dist/core/terminal-builder.d.ts +629 -0
  255. package/dist/core/terminal-builder.d.ts.map +1 -0
  256. package/dist/core/terminal-builder.js +807 -0
  257. package/dist/core/terminal-builder.js.map +1 -0
  258. package/dist/core/terminal-execution.d.ts +39 -0
  259. package/dist/core/terminal-execution.d.ts.map +1 -0
  260. package/dist/core/terminal-execution.js +103 -0
  261. package/dist/core/terminal-execution.js.map +1 -0
  262. package/dist/core/ts-comment-mask.d.ts +2 -0
  263. package/dist/core/ts-comment-mask.d.ts.map +1 -0
  264. package/dist/core/ts-comment-mask.js +102 -0
  265. package/dist/core/ts-comment-mask.js.map +1 -0
  266. package/dist/core/vacuity-diagnosis.d.ts +103 -0
  267. package/dist/core/vacuity-diagnosis.d.ts.map +1 -0
  268. package/dist/core/vacuity-diagnosis.js +415 -0
  269. package/dist/core/vacuity-diagnosis.js.map +1 -0
  270. package/dist/core/violation.d.ts +16 -11
  271. package/dist/core/violation.d.ts.map +1 -1
  272. package/dist/core/violation.js +33 -13
  273. package/dist/core/violation.js.map +1 -1
  274. package/dist/graphql/graphql-rule-builder.d.ts +95 -0
  275. package/dist/graphql/graphql-rule-builder.d.ts.map +1 -0
  276. package/dist/graphql/graphql-rule-builder.js +127 -0
  277. package/dist/graphql/graphql-rule-builder.js.map +1 -0
  278. package/dist/graphql/index.d.ts +1 -0
  279. package/dist/graphql/index.d.ts.map +1 -1
  280. package/dist/graphql/index.js +2 -1
  281. package/dist/graphql/index.js.map +1 -1
  282. package/dist/graphql/resolver-rule-builder.d.ts +44 -23
  283. package/dist/graphql/resolver-rule-builder.d.ts.map +1 -1
  284. package/dist/graphql/resolver-rule-builder.js +80 -72
  285. package/dist/graphql/resolver-rule-builder.js.map +1 -1
  286. package/dist/graphql/schema-loader.d.ts +21 -0
  287. package/dist/graphql/schema-loader.d.ts.map +1 -1
  288. package/dist/graphql/schema-loader.js +82 -12
  289. package/dist/graphql/schema-loader.js.map +1 -1
  290. package/dist/graphql/schema-predicates.d.ts.map +1 -1
  291. package/dist/graphql/schema-predicates.js +17 -12
  292. package/dist/graphql/schema-predicates.js.map +1 -1
  293. package/dist/graphql/schema-rule-builder.d.ts +15 -24
  294. package/dist/graphql/schema-rule-builder.d.ts.map +1 -1
  295. package/dist/graphql/schema-rule-builder.js +39 -77
  296. package/dist/graphql/schema-rule-builder.js.map +1 -1
  297. package/dist/helpers/baseline-diagnostics.d.ts +45 -0
  298. package/dist/helpers/baseline-diagnostics.d.ts.map +1 -0
  299. package/dist/helpers/baseline-diagnostics.js +168 -0
  300. package/dist/helpers/baseline-diagnostics.js.map +1 -0
  301. package/dist/helpers/baseline-generator.d.ts +28 -0
  302. package/dist/helpers/baseline-generator.d.ts.map +1 -0
  303. package/dist/helpers/baseline-generator.js +27 -0
  304. package/dist/helpers/baseline-generator.js.map +1 -0
  305. package/dist/helpers/baseline.d.ts +336 -0
  306. package/dist/helpers/baseline.d.ts.map +1 -0
  307. package/dist/helpers/baseline.js +664 -0
  308. package/dist/helpers/baseline.js.map +1 -0
  309. package/dist/helpers/body-traversal.d.ts +27 -2
  310. package/dist/helpers/body-traversal.d.ts.map +1 -1
  311. package/dist/helpers/body-traversal.js +135 -16
  312. package/dist/helpers/body-traversal.js.map +1 -1
  313. package/dist/helpers/callback-extractor.d.ts.map +1 -1
  314. package/dist/helpers/callback-extractor.js +53 -84
  315. package/dist/helpers/callback-extractor.js.map +1 -1
  316. package/dist/helpers/complexity.d.ts +13 -5
  317. package/dist/helpers/complexity.d.ts.map +1 -1
  318. package/dist/helpers/complexity.js +15 -6
  319. package/dist/helpers/complexity.js.map +1 -1
  320. package/dist/helpers/diff-aware.d.ts +16 -0
  321. package/dist/helpers/diff-aware.d.ts.map +1 -0
  322. package/dist/helpers/diff-aware.js +16 -0
  323. package/dist/helpers/diff-aware.js.map +1 -0
  324. package/dist/helpers/matchers.d.ts +68 -7
  325. package/dist/helpers/matchers.d.ts.map +1 -1
  326. package/dist/helpers/matchers.js +164 -86
  327. package/dist/helpers/matchers.js.map +1 -1
  328. package/dist/helpers/slice-graph.d.ts +100 -8
  329. package/dist/helpers/slice-graph.d.ts.map +1 -1
  330. package/dist/helpers/slice-graph.js +126 -34
  331. package/dist/helpers/slice-graph.js.map +1 -1
  332. package/dist/helpers/tarjan.d.ts +0 -14
  333. package/dist/helpers/tarjan.d.ts.map +1 -1
  334. package/dist/helpers/tarjan.js +29 -16
  335. package/dist/helpers/tarjan.js.map +1 -1
  336. package/dist/index.d.ts +55 -19
  337. package/dist/index.d.ts.map +1 -1
  338. package/dist/index.js +67 -15
  339. package/dist/index.js.map +1 -1
  340. package/dist/models/arch-call.d.ts +3 -2
  341. package/dist/models/arch-call.d.ts.map +1 -1
  342. package/dist/models/arch-call.js.map +1 -1
  343. package/dist/models/arch-function.d.ts +54 -8
  344. package/dist/models/arch-function.d.ts.map +1 -1
  345. package/dist/models/arch-function.js +145 -8
  346. package/dist/models/arch-function.js.map +1 -1
  347. package/dist/models/arch-jsx-element.d.ts.map +1 -1
  348. package/dist/models/arch-jsx-element.js +18 -19
  349. package/dist/models/arch-jsx-element.js.map +1 -1
  350. package/dist/models/slice.d.ts +33 -9
  351. package/dist/models/slice.d.ts.map +1 -1
  352. package/dist/models/slice.js +129 -19
  353. package/dist/models/slice.js.map +1 -1
  354. package/dist/predicates/call.d.ts.map +1 -1
  355. package/dist/predicates/call.js +5 -0
  356. package/dist/predicates/call.js.map +1 -1
  357. package/dist/predicates/identity.d.ts +21 -0
  358. package/dist/predicates/identity.d.ts.map +1 -1
  359. package/dist/predicates/identity.js +75 -3
  360. package/dist/predicates/identity.js.map +1 -1
  361. package/dist/predicates/index.d.ts +1 -1
  362. package/dist/predicates/index.d.ts.map +1 -1
  363. package/dist/predicates/index.js +1 -1
  364. package/dist/predicates/index.js.map +1 -1
  365. package/dist/predicates/jsx.d.ts.map +1 -1
  366. package/dist/predicates/jsx.js +2 -1
  367. package/dist/predicates/jsx.js.map +1 -1
  368. package/dist/predicates/metrics.d.ts +4 -2
  369. package/dist/predicates/metrics.d.ts.map +1 -1
  370. package/dist/predicates/metrics.js +4 -2
  371. package/dist/predicates/metrics.js.map +1 -1
  372. package/dist/predicates/module.d.ts +4 -12
  373. package/dist/predicates/module.d.ts.map +1 -1
  374. package/dist/predicates/module.js +57 -37
  375. package/dist/predicates/module.js.map +1 -1
  376. package/dist/presets/agent-guardrails.d.ts +49 -16
  377. package/dist/presets/agent-guardrails.d.ts.map +1 -1
  378. package/dist/presets/agent-guardrails.js +308 -19
  379. package/dist/presets/agent-guardrails.js.map +1 -1
  380. package/dist/presets/boundaries.d.ts +46 -3
  381. package/dist/presets/boundaries.d.ts.map +1 -1
  382. package/dist/presets/boundaries.js +132 -23
  383. package/dist/presets/boundaries.js.map +1 -1
  384. package/dist/presets/data-layer.d.ts +23 -3
  385. package/dist/presets/data-layer.d.ts.map +1 -1
  386. package/dist/presets/data-layer.js +58 -16
  387. package/dist/presets/data-layer.js.map +1 -1
  388. package/dist/presets/index.d.ts +10 -5
  389. package/dist/presets/index.d.ts.map +1 -1
  390. package/dist/presets/index.js +19 -3
  391. package/dist/presets/index.js.map +1 -1
  392. package/dist/presets/layered.d.ts +47 -3
  393. package/dist/presets/layered.d.ts.map +1 -1
  394. package/dist/presets/layered.js +66 -29
  395. package/dist/presets/layered.js.map +1 -1
  396. package/dist/presets/recommended.d.ts +81 -10
  397. package/dist/presets/recommended.d.ts.map +1 -1
  398. package/dist/presets/recommended.js +25 -23
  399. package/dist/presets/recommended.js.map +1 -1
  400. package/dist/presets/shared.d.ts +267 -2
  401. package/dist/presets/shared.d.ts.map +1 -1
  402. package/dist/presets/shared.js +367 -4
  403. package/dist/presets/shared.js.map +1 -1
  404. package/dist/rules/code-quality.d.ts.map +1 -1
  405. package/dist/rules/code-quality.js +15 -6
  406. package/dist/rules/code-quality.js.map +1 -1
  407. package/dist/rules/hygiene.d.ts +1 -1
  408. package/dist/rules/hygiene.js +1 -1
  409. package/dist/rules/metrics-function.d.ts +2 -1
  410. package/dist/rules/metrics-function.d.ts.map +1 -1
  411. package/dist/rules/metrics-function.js +63 -39
  412. package/dist/rules/metrics-function.js.map +1 -1
  413. package/dist/rules/metrics.d.ts +2 -1
  414. package/dist/rules/metrics.d.ts.map +1 -1
  415. package/dist/rules/metrics.js +80 -47
  416. package/dist/rules/metrics.js.map +1 -1
  417. package/dist/smells/clusters.d.ts +78 -0
  418. package/dist/smells/clusters.d.ts.map +1 -0
  419. package/dist/smells/clusters.js +124 -0
  420. package/dist/smells/clusters.js.map +1 -0
  421. package/dist/smells/duplicate-bodies.d.ts +92 -5
  422. package/dist/smells/duplicate-bodies.d.ts.map +1 -1
  423. package/dist/smells/duplicate-bodies.js +203 -73
  424. package/dist/smells/duplicate-bodies.js.map +1 -1
  425. package/dist/smells/duplicate-report.d.ts +90 -0
  426. package/dist/smells/duplicate-report.d.ts.map +1 -0
  427. package/dist/smells/duplicate-report.js +344 -0
  428. package/dist/smells/duplicate-report.js.map +1 -0
  429. package/dist/smells/fingerprint.d.ts +20 -1
  430. package/dist/smells/fingerprint.d.ts.map +1 -1
  431. package/dist/smells/fingerprint.js +27 -3
  432. package/dist/smells/fingerprint.js.map +1 -1
  433. package/dist/smells/inconsistent-siblings.d.ts +128 -7
  434. package/dist/smells/inconsistent-siblings.d.ts.map +1 -1
  435. package/dist/smells/inconsistent-siblings.js +288 -86
  436. package/dist/smells/inconsistent-siblings.js.map +1 -1
  437. package/dist/smells/sibling-files.d.ts +47 -0
  438. package/dist/smells/sibling-files.d.ts.map +1 -0
  439. package/dist/smells/sibling-files.js +104 -0
  440. package/dist/smells/sibling-files.js.map +1 -0
  441. package/dist/smells/similar-pairs.d.ts +28 -0
  442. package/dist/smells/similar-pairs.d.ts.map +1 -0
  443. package/dist/smells/similar-pairs.js +134 -0
  444. package/dist/smells/similar-pairs.js.map +1 -0
  445. package/dist/smells/smell-builder.d.ts +57 -12
  446. package/dist/smells/smell-builder.d.ts.map +1 -1
  447. package/dist/smells/smell-builder.js +112 -14
  448. package/dist/smells/smell-builder.js.map +1 -1
  449. package/dist/smells/variation.d.ts +47 -0
  450. package/dist/smells/variation.d.ts.map +1 -0
  451. package/dist/smells/variation.js +90 -0
  452. package/dist/smells/variation.js.map +1 -0
  453. package/dist/tsconfig/index.d.ts +19 -0
  454. package/dist/tsconfig/index.d.ts.map +1 -0
  455. package/dist/tsconfig/index.js +20 -0
  456. package/dist/tsconfig/index.js.map +1 -0
  457. package/dist/tsconfig/tsconfig-builder.d.ts +42 -9
  458. package/dist/tsconfig/tsconfig-builder.d.ts.map +1 -1
  459. package/dist/tsconfig/tsconfig-builder.js +65 -16
  460. package/dist/tsconfig/tsconfig-builder.js.map +1 -1
  461. package/package.json +4 -2
  462. package/dist/core/module-dependencies.d.ts +0 -28
  463. package/dist/core/module-dependencies.d.ts.map +0 -1
  464. package/dist/core/module-dependencies.js +0 -35
  465. package/dist/core/module-dependencies.js.map +0 -1
  466. package/dist/helpers/within.d.ts.map +0 -1
  467. package/dist/helpers/within.js.map +0 -1
@@ -1,74 +1,240 @@
1
1
  import picomatch from 'picomatch';
2
- import { isTypeOnlyImport } from '../core/import-options.js';
3
- import { getDependencyDecls, resolveDependencyPath, isTypeOnlyDependency, } from '../core/module-dependencies.js';
2
+ import { candidatesFor, matchedCandidate } from '../core/import-candidates.js';
3
+ import { recordEdgeCoverage } from '@nielspeter/eess/internal';
4
+ import { globAnyOf } from '@nielspeter/eess';
5
+ import { edgeTypeOnlyRemedy, edgeDiscriminator, edgeValuePhrase, edgeTypeOnlyNoun, edgeStream, edgeVerb, edgesOf, FORWARD_EDGE_KINDS, } from '../core/module-edges.js';
6
+ import { splitGlobArgs } from '../core/import-options.js';
7
+ import { rootOf } from '../core/project-relative.js';
8
+ import { byCodepoint } from '@nielspeter/eess/internal';
4
9
  /**
5
- * Resolve an import declaration to an absolute path or raw specifier.
10
+ * Which edge kinds a forward dependency condition reports on.
11
+ *
12
+ * **An exhaustive `Record`, not an allowlist filter** (plan 0071 §3). "Each site
13
+ * filters to the kinds it handles" is fail-open for a sixth kind: one added in a
14
+ * later release would be silently excluded everywhere, which is the same false
15
+ * green this release closes. A full `Record<ModuleEdgeKind, boolean>` makes a new
16
+ * union member a compile error here.
17
+ *
18
+ * `require` is **false at every site**. The kind exists so a 4-way branch cannot
19
+ * mark a CJS runtime dependency as erased, not to enforce CJS — that is a
20
+ * different upgrade story, whose reds land in interop and generated `.d.ts` where
21
+ * the remedy is usually "nothing you can do". The trade is a known false
22
+ * negative over a mislabelled true positive, and it is stated in
23
+ * `docs/standard-rules.md` and `docs/modules.md` rather than sold as coverage.
24
+ */
25
+ const DEPENDENCY_KINDS = FORWARD_EDGE_KINDS;
26
+ /**
27
+ * Which kinds `onlyHaveTypeImportsFrom` reports on.
28
+ *
29
+ * Excludes `dynamic` on ADR-009 rule 2: the condition's remedy is "make the
30
+ * dependency erased", and there is **no** way to do that for `await import(…)`.
31
+ * A finding whose remedy cannot be followed is not a finding.
32
+ *
33
+ * Keeps `reexport`, where a remedy does exist but is not purely local — see
34
+ * {@link edgeTypeOnlyRemedy}. Excludes `type-expression` because it is already
35
+ * erased and can never violate a type-only rule, so the row is unreachable
36
+ * rather than a judgement.
37
+ */
38
+ const TYPE_IMPORT_KINDS = {
39
+ import: true,
40
+ reexport: true,
41
+ dynamic: false,
42
+ 'type-expression': false,
43
+ require: false,
44
+ };
45
+ /** The strings this edge's globs may be matched against, primary first. */
46
+ function edgeCandidates(edge, sourceFile) {
47
+ // The IMPORTING file's root. In a workspace the target may live in another
48
+ // package, whose absolute path is not under this root — then no relative
49
+ // candidate is produced and matching falls back to the absolute form, which
50
+ // is the honest answer: `'src/shared/**'` written in one package means that
51
+ // package's `src/shared`.
52
+ return candidatesFor(edge.specifier, edge.resolvedPath, rootOf(sourceFile));
53
+ }
54
+ /**
55
+ * Create a violation for one module edge.
56
+ *
57
+ * `line` comes from the edge, which is the **statement** line — the same value
58
+ * `decl.getStartLineNumber()` produced before this release for `kind ===
59
+ * 'import'`, so no existing finding moves.
6
60
  */
7
- function resolveImportPath(decl) {
8
- const resolved = decl.getModuleSpecifierSourceFile();
9
- return resolved ? resolved.getFilePath() : decl.getModuleSpecifierValue();
61
+ function edgeViolation(sourceFile, edge, message, context) {
62
+ return {
63
+ rule: context.rule,
64
+ element: sourceFile.getBaseName(),
65
+ file: sourceFile.getFilePath(),
66
+ line: edge.line,
67
+ message,
68
+ because: context.because,
69
+ // `identity` — the canonical form that supersedes `element::message` in the
70
+ // baseline hash. [ts-archunit Bug 0028](https://github.com/nielspeter/ts-archunit/blob/main/bugs/fixed/0028-two-findings-in-one-file-can-share-a-baseline-identity.md).
71
+ //
72
+ // The message carries the basename and the resolved target and nothing else, so
73
+ // two edges from one file to one module are byte-identical and share a hash.
74
+ // Measured on this repo's own barrel after v0.28.0 made barrels
75
+ // dependency-bearing: `src/index.ts` produced **114 findings and 87 identities —
76
+ // 26 colliding groups, 46.5% of findings sharing**. You could not accept one and
77
+ // keep failing on its sibling, and a re-export added later was silently
78
+ // pre-accepted by an entry written before it existed.
79
+ //
80
+ // **`names` is the discriminator, and the line is not.** Measured, adding `names`
81
+ // takes those 114 edges to 114 distinct identities; adding the line does too, and
82
+ // is rejected for the reason `baseline.ts` already excludes it — an accepted
83
+ // violation has to survive its code moving. A sample colliding pair shows why
84
+ // names work: same file, same target, same kind, `[project, workspace,
85
+ // resetProjectCache]` against `[ArchProject]`.
86
+ //
87
+ // This is `ModuleEdge.names`' first production consumer. Until now its only
88
+ // reader was the runtime independence test, which is a fair criticism of a field
89
+ // that costs a per-kind rule to compute.
90
+ //
91
+ // **A residual, stated.** For `kind === 'import'` `names` is the INWARD name, so
92
+ // `import { X } from 'm'` and `import { X as Y } from 'm'` in one file both carry
93
+ // `['X']` and still share an identity. Separating them needs the local binding,
94
+ // which `ModuleEdge` deliberately does not carry — the same reason
95
+ // `notHaveAliasedImports` was never routed through the edge walk. That shape is
96
+ // legal and unusual; the shape this fixes is the barrel, where re-exports use the
97
+ // OUTWARD name and aliases therefore differ. Measured: 26 colliding groups on this
98
+ // repo's barrel go to 0, and the aliased-import pair is what remains.
99
+ identity: [
100
+ // The FULL PATH, not the basename — [bug 0063](https://github.com/nielspeter/ts-archunit/blob/main/bugs/fixed/0063-a-dependency-identity-collides-across-files-sharing-a-basename.md).
101
+ //
102
+ // Every other component here is a property of the EDGE, so the basename was the only
103
+ // thing identifying the file, and it does not: two sibling folders each with an
104
+ // `index.ts` importing the same target produced ONE identity for TWO violations, and
105
+ // one baseline entry accepted both. Measured `findings=2 distinctHashes=1`, on the
106
+ // commonest layout there is. `ArchViolation.identity` requires uniqueness per finding
107
+ // within a rule, in those words.
108
+ //
109
+ // An absolute path is not a new bet: `edgeCandidates(...)[0]` below is already the
110
+ // resolved absolute path of the TARGET, and `hashViolation` normalises the repository
111
+ // root out of identity text (`src/core/identity-root.ts`) with a root that defaults to
112
+ // `discoverIdentityRoot`.
113
+ sourceFile.getFilePath(),
114
+ edge.kind,
115
+ // No root here: `[0]` is the primary candidate either way, and this string
116
+ // is a baseline identity — feeding it anything new would rewrite every
117
+ // existing dependency entry for no gain.
118
+ edgeCandidates(edge, sourceFile)[0],
119
+ // See `edgeDiscriminator`. This family HAS reported `dynamic` and
120
+ // `type-expression` all along, so the collision was live here — and it was live in
121
+ // the slice family too, for the `import`/`reexport` spellings that carry no names.
122
+ //
123
+ // **Nothing moves.** The first edge of each `kind::specifier` group emits `''`,
124
+ // which is byte-for-byte what the pre-ordinal formula produced; only the second and
125
+ // later siblings gain `#n`, and those groups had one hash for two findings before.
126
+ // Measured against `main` across all seven `import`/`reexport` spellings plus
127
+ // `dynamic` and `type-expression`: zero diff.
128
+ edgeDiscriminator(edge),
129
+ ].join('::'),
130
+ };
10
131
  }
11
132
  /**
12
- * Create a violation for a source file with a specific offending dependency edge
13
- * (an `import … from` or an `export … from` re-export).
133
+ * Create a violation for a source file with a specific offending import.
14
134
  */
15
- function importViolation(sourceFile, importDecl, message, context) {
135
+ function importViolation(sourceFile, importDecl, message, context,
136
+ /**
137
+ * What distinguishes this finding from a sibling, WITHOUT the file — the caller knows,
138
+ * this function adds the path.
139
+ *
140
+ * [ts-archunit Bug 0063](https://github.com/nielspeter/ts-archunit/blob/main/bugs/fixed/0063-a-dependency-identity-collides-across-files-sharing-a-basename.md)'s
141
+ * third mechanism, and the one my own corrected scope got wrong twice. This constructor
142
+ * set no identity, so findings fell back to `element::message` — and for
143
+ * `notHaveAliasedImports` the message is `"<basename> aliases \"x\" as \"y\""`, identical
144
+ * for two sibling files aliasing the same import. I had asserted it was unaffected on the
145
+ * ground that the message "names the specifier"; it names the *alias*, which is equally
146
+ * shared. The control row written to pin the scope disproved it instead.
147
+ */
148
+ subject) {
16
149
  return {
17
150
  rule: context.rule,
18
151
  element: sourceFile.getBaseName(),
19
152
  file: sourceFile.getFilePath(),
20
153
  line: importDecl.getStartLineNumber(),
154
+ // The path, then what the caller says distinguishes it. Not the message: a message is
155
+ // prose and may be reworded, which is the whole reason `identity` exists.
156
+ identity: `${sourceFile.getFilePath()}::${subject}`,
21
157
  message,
22
158
  because: context.because,
23
159
  };
24
160
  }
25
161
  export function onlyImportFrom(...args) {
26
- // ADR-005: as casts required — TS cannot narrow tuple union rest params after Array.isArray
27
- // eess-exclude eess/adr005-no-type-assertions: tuple-union rest param — TS cannot narrow [string[], ImportOptions] | string[] to string[] from Array.isArray(args[0])
28
- const globs = Array.isArray(args[0]) ? args[0] : args;
29
- // eess-exclude eess/adr005-no-type-assertions: tuple-union rest param — args[1] is ImportOptions only in the [globs, options] overload
30
- const options = Array.isArray(args[0]) && args.length > 1 ? args[1] : undefined;
162
+ const { globs, options } = splitGlobArgs(args);
31
163
  const ignoreType = options?.ignoreTypeImports === true;
32
164
  const matchers = globs.map((g) => picomatch(g));
33
165
  const quotedGlobs = globs.map((g) => `"${g}"`).join(', ');
34
166
  return {
167
+ // Declared so the glob is visible to `explain`, `doctor` and 0069's glob model
168
+ // (plan 0073). `globAnyOf` because the variadic family is `matchers.some`, so the
169
+ // set is dead only when every glob in it is — `all` here would read a set with one
170
+ // live glob as dead, which is the 0.18.1 withdrawal in the other direction
171
+ // (`glob-site.ts:185`).
172
+ //
173
+ // `import-target` has no path-universe views by design (`path-universe.ts:72`), so
174
+ // declaring changes no verdict — a bare specifier legitimately matches no project
175
+ // path, which is what bug 0014 was fixed to support.
176
+ globs: globAnyOf(globs, 'import-target'),
35
177
  description: `only import from ${quotedGlobs}`,
36
178
  evaluate(sourceFiles, context) {
37
179
  const violations = [];
180
+ // Bug 0015: an allowlist constrains EDGES, so a subject with none passes
181
+ // however broken the allowlist. Counted after the same filters the check
182
+ // applies — including `ignoreType`, since an edge this rule skips is an
183
+ // edge it did not test.
184
+ let tested = 0;
185
+ // Counted separately so the disclosure can name the right cause: a subject
186
+ // whose imports were all filtered by `ignoreTypeImports` is NOT a
187
+ // dependency-free module, and saying so sends the reader to a folder full
188
+ // of imports to look for the ones the tool says are missing.
189
+ let seen = 0;
38
190
  for (const sf of sourceFiles) {
39
- for (const decl of getDependencyDecls(sf)) {
40
- if (ignoreType && isTypeOnlyDependency(decl))
191
+ for (const edge of edgesOf(sf)) {
192
+ if (!DEPENDENCY_KINDS[edge.kind])
193
+ continue;
194
+ seen++;
195
+ if (ignoreType && edge.typeOnly)
41
196
  continue;
42
- const importPath = resolveDependencyPath(decl);
43
- if (!matchers.some((m) => m(importPath))) {
44
- violations.push(importViolation(sf, decl, `${sf.getBaseName()} imports "${importPath}" which does not match any of [${globs.join(', ')}]`, context));
197
+ tested++;
198
+ const candidates = edgeCandidates(edge, sf);
199
+ const importPath = candidates[0];
200
+ if (matchedCandidate(candidates, matchers) === undefined) {
201
+ violations.push(edgeViolation(sf, edge, `${sf.getBaseName()} ${edgeVerb(edge.kind)} "${importPath}" which does not match any of [${globs.join(', ')}]`, context));
45
202
  }
46
203
  }
47
204
  }
205
+ recordEdgeCoverage(context.rule, sourceFiles.length, tested, seen > 0 ? 'all-filtered' : 'no-edges');
48
206
  return violations;
49
207
  },
50
208
  };
51
209
  }
52
210
  export function notImportFrom(...args) {
53
- // ADR-005: as casts required — TS cannot narrow tuple union rest params after Array.isArray
54
- // eess-exclude eess/adr005-no-type-assertions: tuple-union rest param — TS cannot narrow [string[], ImportOptions] | string[] to string[] from Array.isArray(args[0])
55
- const globs = Array.isArray(args[0]) ? args[0] : args;
56
- // eess-exclude eess/adr005-no-type-assertions: tuple-union rest param — args[1] is ImportOptions only in the [globs, options] overload
57
- const options = Array.isArray(args[0]) && args.length > 1 ? args[1] : undefined;
211
+ const { globs, options } = splitGlobArgs(args);
58
212
  const ignoreType = options?.ignoreTypeImports === true;
59
213
  const matchers = globs.map((g) => picomatch(g));
60
214
  const quotedGlobs = globs.map((g) => `"${g}"`).join(', ');
61
215
  return {
216
+ // Declared so the glob is visible to `explain`, `doctor` and 0069's glob model
217
+ // (plan 0073). `globAnyOf` because the variadic family is `matchers.some`, so the
218
+ // set is dead only when every glob in it is — `all` here would read a set with one
219
+ // live glob as dead, which is the 0.18.1 withdrawal in the other direction
220
+ // (`glob-site.ts:185`).
221
+ //
222
+ // `import-target` has no path-universe views by design (`path-universe.ts:72`), so
223
+ // declaring changes no verdict — a bare specifier legitimately matches no project
224
+ // path, which is what bug 0014 was fixed to support.
225
+ globs: globAnyOf(globs, 'import-target'),
62
226
  description: `not import from ${quotedGlobs}`,
63
227
  evaluate(sourceFiles, context) {
64
228
  const violations = [];
65
229
  for (const sf of sourceFiles) {
66
- for (const decl of getDependencyDecls(sf)) {
67
- if (ignoreType && isTypeOnlyDependency(decl))
230
+ for (const edge of edgesOf(sf)) {
231
+ if (!DEPENDENCY_KINDS[edge.kind])
68
232
  continue;
69
- const importPath = resolveDependencyPath(decl);
70
- if (matchers.some((m) => m(importPath))) {
71
- violations.push(importViolation(sf, decl, `${sf.getBaseName()} imports "${importPath}" which matches forbidden [${globs.join(', ')}]`, context));
233
+ if (ignoreType && edge.typeOnly)
234
+ continue;
235
+ const importPath = matchedCandidate(edgeCandidates(edge, sf), matchers);
236
+ if (importPath !== undefined) {
237
+ violations.push(edgeViolation(sf, edge, `${sf.getBaseName()} ${edgeVerb(edge.kind)} "${importPath}" which matches forbidden [${globs.join(', ')}]`, context));
72
238
  }
73
239
  }
74
240
  }
@@ -77,31 +243,76 @@ export function notImportFrom(...args) {
77
243
  };
78
244
  }
79
245
  export function dependOn(...args) {
80
- // ADR-005: as casts required — TS cannot narrow tuple union rest params after Array.isArray
81
- // eess-exclude eess/adr005-no-type-assertions: tuple-union rest param — TS cannot narrow [string[], ImportOptions] | string[] to string[] from Array.isArray(args[0])
82
- const globs = Array.isArray(args[0]) ? args[0] : args;
83
- // eess-exclude eess/adr005-no-type-assertions: tuple-union rest param — args[1] is ImportOptions only in the [globs, options] overload
84
- const options = Array.isArray(args[0]) && args.length > 1 ? args[1] : undefined;
246
+ const { globs, options } = splitGlobArgs(args);
85
247
  const ignoreType = options?.ignoreTypeImports === true;
86
248
  const matchers = globs.map((g) => picomatch(g));
87
249
  const quotedGlobs = globs.map((g) => `"${g}"`).join(', ');
88
250
  return {
251
+ // Declared so the glob is visible to `explain`, `doctor` and 0069's glob model
252
+ // (plan 0073). `globAnyOf` because the variadic family is `matchers.some`, so the
253
+ // set is dead only when every glob in it is — `all` here would read a set with one
254
+ // live glob as dead, which is the 0.18.1 withdrawal in the other direction
255
+ // (`glob-site.ts:185`).
256
+ //
257
+ // `import-target` has no path-universe views by design (`path-universe.ts:72`), so
258
+ // declaring changes no verdict — a bare specifier legitimately matches no project
259
+ // path, which is what bug 0014 was fixed to support.
260
+ globs: globAnyOf(globs, 'import-target'),
89
261
  description: globs.length === 1 ? `depend on ${quotedGlobs}` : `depend on at least one of ${quotedGlobs}`,
90
262
  evaluate(sourceFiles, context) {
91
263
  const violations = [];
92
264
  for (const sf of sourceFiles) {
93
- const hasMatch = getDependencyDecls(sf).some((decl) => {
94
- if (ignoreType && isTypeOnlyDependency(decl))
95
- return false;
96
- const importPath = resolveDependencyPath(decl);
97
- return matchers.some((m) => m(importPath));
98
- });
265
+ // A `for … of` over `edgeStream`, not `edgesOf(sf).some(...)`.
266
+ //
267
+ // `edgesOf` builds and RESOLVES every edge in the file before returning, so
268
+ // `.some()` on its result pays a `getSymbol()` per literal even when the
269
+ // first one answers the question — 100 checker calls on a 100-import file
270
+ // where the pre-0.28.0 code made 1. Spreading the generator
271
+ // (`[...edgeStream(sf)].some(...)`) has the same defect and looks lazy, so
272
+ // the loop is written out.
273
+ let hasMatch = false;
274
+ for (const edge of edgeStream(sf)) {
275
+ if (!DEPENDENCY_KINDS[edge.kind])
276
+ continue;
277
+ // `typeOnly` means something DIFFERENT per kind on this one condition,
278
+ // and that asymmetry is deliberate (plan 0071 §3).
279
+ //
280
+ // For `import`, behaviour is exactly as before: an `import type` of the
281
+ // target SATISFIES `dependOn`, and `{ ignoreTypeImports: true }` is the
282
+ // shipped opt-in that makes it fail. Requiring runtime here would be a
283
+ // green→red change to a contract that already has an opt-out — a docs
284
+ // gap, not a behaviour gap.
285
+ //
286
+ // For the new kinds it must require runtime, or this release CREATES a
287
+ // false green: `export type { SecurityConfig } from './security.js'`
288
+ // would satisfy `dependOn('**/security/**')` while the server installs
289
+ // nothing. Measured against `docs/modules.md`'s own teaching example, a
290
+ // naive widening turns a real violation into a pass — and on the
291
+ // baseline side that reads as "the violation was fixed".
292
+ if (edge.kind === 'import' ? ignoreType && edge.typeOnly : edge.typeOnly)
293
+ continue;
294
+ if (matchedCandidate(edgeCandidates(edge, sf), matchers) !== undefined) {
295
+ hasMatch = true;
296
+ break;
297
+ }
298
+ }
99
299
  if (!hasMatch) {
100
300
  violations.push({
101
301
  rule: context.rule,
102
302
  element: sf.getBaseName(),
103
303
  file: sf.getFilePath(),
104
304
  line: 1,
305
+ // An identity, ADDED rather than corrected — bug 0063's worse half. This finding
306
+ // had none, so it fell back to `element::message`; the element is a basename and
307
+ // the message never names the file, so two sibling folders each with an
308
+ // `index.ts` were one finding to the baseline. Measured
309
+ // `findings=2 distinct=1`, with nothing in the identity to blame because there
310
+ // was no identity.
311
+ //
312
+ // The globs are part of it because this finding is about a REQUIREMENT not met,
313
+ // not about an edge: the same file failing two different `dependOn` rules is two
314
+ // findings, and `rule` alone would not separate them if one rule carried both.
315
+ identity: `${sf.getFilePath()}::depends-on::${[...globs].sort(byCodepoint).join(',')}`,
105
316
  message: `${sf.getBaseName()} does not import from any path matching [${globs.join(', ')}]`,
106
317
  because: context.because,
107
318
  });
@@ -136,7 +347,10 @@ export function notHaveAliasedImports() {
136
347
  for (const specifier of decl.getNamedImports()) {
137
348
  const alias = specifier.getAliasNode();
138
349
  if (alias) {
139
- violations.push(importViolation(sf, decl, `${sf.getBaseName()} aliases "${specifier.getName()}" as "${alias.getText()}"`, context));
350
+ violations.push(importViolation(sf, decl, `${sf.getBaseName()} aliases "${specifier.getName()}" as "${alias.getText()}"`, context,
351
+ // The aliased name and the alias — the two things that make one aliased
352
+ // specifier different from another in the same file.
353
+ `aliased::${specifier.getName()}::${alias.getText()}`));
140
354
  }
141
355
  }
142
356
  }
@@ -159,17 +373,57 @@ export function onlyHaveTypeImportsFrom(...globs) {
159
373
  const matchers = globs.map((g) => picomatch(g));
160
374
  const quotedGlobs = globs.map((g) => `"${g}"`).join(', ');
161
375
  return {
376
+ // Declared so the glob is visible to `explain`, `doctor` and 0069's glob model
377
+ // (plan 0073). `globAnyOf` because the variadic family is `matchers.some`, so the
378
+ // set is dead only when every glob in it is — `all` here would read a set with one
379
+ // live glob as dead, which is the 0.18.1 withdrawal in the other direction
380
+ // (`glob-site.ts:185`).
381
+ //
382
+ // `import-target` has no path-universe views by design (`path-universe.ts:72`), so
383
+ // declaring changes no verdict — a bare specifier legitimately matches no project
384
+ // path, which is what bug 0014 was fixed to support.
385
+ globs: globAnyOf(globs, 'import-target'),
162
386
  description: `only have type imports from ${quotedGlobs}`,
163
387
  evaluate(sourceFiles, context) {
164
388
  const violations = [];
389
+ // Bug 0015: same shape — the allowlist scopes which imports must be
390
+ // type-only, so a subject with no matching import tests nothing.
391
+ let tested = 0;
392
+ // Same distinction as `onlyImportFrom`, for the other reason: here an edge
393
+ // is out of scope because the GLOB did not name it, and that is the case
394
+ // worth surfacing — the glob may be a typo.
395
+ let seen = 0;
165
396
  for (const sf of sourceFiles) {
166
- for (const decl of sf.getImportDeclarations()) {
167
- const importPath = resolveImportPath(decl);
168
- if (matchers.some((m) => m(importPath)) && !isTypeOnlyImport(decl)) {
169
- violations.push(importViolation(sf, decl, `${sf.getBaseName()} has a value import from "${importPath}" which should be a type-only import`, context));
397
+ for (const edge of edgesOf(sf)) {
398
+ if (!TYPE_IMPORT_KINDS[edge.kind])
399
+ continue;
400
+ seen++;
401
+ const importPath = matchedCandidate(edgeCandidates(edge, sf), matchers);
402
+ // In scope only when the allowlist matched it: an edge the glob does
403
+ // not name is one this rule never had an opinion about.
404
+ if (importPath !== undefined)
405
+ tested++;
406
+ if (importPath !== undefined && !edge.typeOnly) {
407
+ const violation = edgeViolation(sf, edge, `${sf.getBaseName()} has ${edgeValuePhrase(edge.kind)} "${importPath}" which should be a type-only ${edgeTypeOnlyNoun(edge.kind)}`, context);
408
+ // A producer-set `suggestion` WINS over the rule author's, because
409
+ // `execute-rule.ts` resolves `v.suggestion ?? meta?.suggestion`. So it
410
+ // is set only for the kinds this release introduces, where no remedy
411
+ // existed before and a per-kind one is strictly better.
412
+ //
413
+ // NOT for `kind === 'import'`. Doing so replaced the shipped
414
+ // `layered/type-imports-only` remedy — which offers "or move the value
415
+ // you need into a layer this one is allowed to depend on", the only
416
+ // followable action when the value is needed at runtime — with a
417
+ // one-option remedy, and silently discarded any consumer's own
418
+ // `.rule({ suggestion })`. Invisible to the message-identity guards
419
+ // because `suggestion` is not hashed.
420
+ violations.push(edge.kind === 'import'
421
+ ? violation
422
+ : { ...violation, suggestion: edgeTypeOnlyRemedy(edge) });
170
423
  }
171
424
  }
172
425
  }
426
+ recordEdgeCoverage(context.rule, sourceFiles.length, tested, seen > 0 ? 'none-matched' : 'no-edges');
173
427
  return violations;
174
428
  },
175
429
  };
@@ -1 +1 @@
1
- {"version":3,"file":"dependency.js","sourceRoot":"","sources":["../../src/conditions/dependency.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"dependency.js","sourceRoot":"","sources":["../../src/conditions/dependency.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"exports.d.ts","sourceRoot":"","sources":["../../src/conditions/exports.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AAC1C,OAAO,KAAK,EAAE,SAAS,EAAoB,MAAM,kBAAkB,CAAA;AAGnE;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,IAAI,SAAS,CAAC,UAAU,CAAC,CAoB5D;AAED;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,IAAI,SAAS,CAAC,UAAU,CAAC,CAoBzD;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,CAAC,UAAU,CAAC,CA6BjE"}
1
+ {"version":3,"file":"exports.d.ts","sourceRoot":"","sources":["../../src/conditions/exports.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AAC1C,OAAO,KAAK,EAAE,SAAS,EAAoB,MAAM,kBAAkB,CAAA;AAGnE;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,IAAI,SAAS,CAAC,UAAU,CAAC,CAM5D;AAED;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,IAAI,SAAS,CAAC,UAAU,CAAC,CAMzD;AAqCD;;;;;;;;;;GAUG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,CAAC,UAAU,CAAC,CA0CjE"}
@@ -1,3 +1,4 @@
1
+ import { ArchConfigError } from '@nielspeter/eess';
1
2
  /**
2
3
  * Module must NOT have a default export.
3
4
  *
@@ -7,25 +8,7 @@
7
8
  * .check()
8
9
  */
9
10
  export function notHaveDefaultExport() {
10
- return {
11
- description: 'not have a default export',
12
- evaluate(elements, context) {
13
- const violations = [];
14
- for (const sf of elements) {
15
- if (sf.getDefaultExportSymbol()) {
16
- violations.push({
17
- rule: context.rule,
18
- element: sf.getBaseName(),
19
- file: sf.getFilePath(),
20
- line: 1,
21
- message: `${sf.getBaseName()} has a default export`,
22
- because: context.because,
23
- });
24
- }
25
- }
26
- return violations;
27
- },
28
- };
11
+ return moduleCondition('not have a default export', (sf) => sf.getDefaultExportSymbol() !== undefined, (sf) => `${sf.getBaseName()} has a default export`);
29
12
  }
30
13
  /**
31
14
  * Module must have a default export.
@@ -36,24 +19,35 @@ export function notHaveDefaultExport() {
36
19
  * .check()
37
20
  */
38
21
  export function haveDefaultExport() {
22
+ return moduleCondition('have a default export', (sf) => sf.getDefaultExportSymbol() === undefined, (sf) => `${sf.getBaseName()} does not have a default export`);
23
+ }
24
+ /**
25
+ * A module-level condition: one violation per file that fails the test.
26
+ *
27
+ * `haveDefaultExport` and `notHaveDefaultExport` were byte-identical but for
28
+ * the polarity of one `if` and the wording of two strings — `no-copy-paste`
29
+ * reported them as literally the same text.
30
+ *
31
+ * They stay two exported functions and cannot become one. `not()` composes
32
+ * predicates, which answer a boolean; a condition owns its violation MESSAGE,
33
+ * and the negation of "does not have a default export" is not a mechanical
34
+ * inversion of that sentence — it is "has a default export", which only the
35
+ * author can write. A generic negation would emit the wrong remedy, which is
36
+ * ADR-009 rule 2's whole subject. So the loop is shared and the sentence is not.
37
+ *
38
+ * `line: 1` because the finding is about the module, not a position in it.
39
+ */
40
+ function moduleCondition(description, violatesWhen, message) {
39
41
  return {
40
- description: 'have a default export',
41
- evaluate(elements, context) {
42
- const violations = [];
43
- for (const sf of elements) {
44
- if (!sf.getDefaultExportSymbol()) {
45
- violations.push({
46
- rule: context.rule,
47
- element: sf.getBaseName(),
48
- file: sf.getFilePath(),
49
- line: 1,
50
- message: `${sf.getBaseName()} does not have a default export`,
51
- because: context.because,
52
- });
53
- }
54
- }
55
- return violations;
56
- },
42
+ description,
43
+ evaluate: (elements, context) => elements.filter(violatesWhen).map((sf) => ({
44
+ rule: context.rule,
45
+ element: sf.getBaseName(),
46
+ file: sf.getFilePath(),
47
+ line: 1,
48
+ message: message(sf),
49
+ because: context.because,
50
+ })),
57
51
  };
58
52
  }
59
53
  /**
@@ -69,7 +63,7 @@ export function haveDefaultExport() {
69
63
  */
70
64
  export function haveMaxExports(max) {
71
65
  if (!Number.isInteger(max) || max < 0) {
72
- throw new Error(`haveMaxExports: max must be a non-negative integer, got ${String(max)}`);
66
+ throw new ArchConfigError('haveMaxExports', `haveMaxExports: max must be a non-negative integer, got ${String(max)}`);
73
67
  }
74
68
  return {
75
69
  description: `have at most ${String(max)} export(s)`,
@@ -91,6 +85,16 @@ export function haveMaxExports(max) {
91
85
  line: 1,
92
86
  message: `${sf.getBaseName()} has ${String(count)} named export(s), exceeding the limit of ${String(max)}`,
93
87
  because: context.because,
88
+ // Hand-built rather than through `metricViolation`, because this
89
+ // site has no `Node` to derive an element name from — it reports
90
+ // against the file. Same two fields, same contract (bug 0012).
91
+ identity: `${sf.getFilePath()}::${sf.getBaseName()}::named-exports`,
92
+ measured: count,
93
+ // Stamped by hand because this is the one metric finding that does not
94
+ // go through `metricViolation` (there is no `Node` to derive from), and
95
+ // the unit must not depend on which constructor a producer happened to
96
+ // use — bug 0171.
97
+ measuredUnit: 'named-exports',
94
98
  });
95
99
  }
96
100
  }
@@ -1 +1 @@
1
- {"version":3,"file":"exports.js","sourceRoot":"","sources":["../../src/conditions/exports.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"exports.js","sourceRoot":"","sources":["../../src/conditions/exports.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AAKlD;;;;;;;GAOG;AACH,MAAM,UAAU,oBAAoB;IAClC,OAAO,eAAe,CACpB,2BAA2B,EAC3B,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,sBAAsB,EAAE,KAAK,SAAS,EACjD,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE,uBAAuB,CACnD,CAAA;AACH,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,iBAAiB;IAC/B,OAAO,eAAe,CACpB,uBAAuB,EACvB,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,sBAAsB,EAAE,KAAK,SAAS,EACjD,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE,iCAAiC,CAC7D,CAAA;AACH,CAAC;AAED;;;;;;;;;;;;;;;GAeG;AACH,SAAS,eAAe,CACtB,WAAmB,EACnB,YAAyC,EACzC,OAAmC;IAEnC,OAAO;QACL,WAAW;QACX,QAAQ,EAAE,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,CAC9B,QAAQ,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;YACzC,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,OAAO,EAAE,EAAE,CAAC,WAAW,EAAE;YACzB,IAAI,EAAE,EAAE,CAAC,WAAW,EAAE;YACtB,IAAI,EAAE,CAAC;YACP,OAAO,EAAE,OAAO,CAAC,EAAE,CAAC;YACpB,OAAO,EAAE,OAAO,CAAC,OAAO;SACzB,CAAC,CAAC;KACN,CAAA;AACH,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,cAAc,CAAC,GAAW;IACxC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,EAAE,CAAC;QACtC,MAAM,IAAI,eAAe,CACvB,gBAAgB,EAChB,2DAA2D,MAAM,CAAC,GAAG,CAAC,EAAE,CACzE,CAAA;IACH,CAAC;IACD,OAAO;QACL,WAAW,EAAE,gBAAgB,MAAM,CAAC,GAAG,CAAC,YAAY;QACpD,QAAQ,CAAC,QAAsB,EAAE,OAAyB;YACxD,MAAM,UAAU,GAAoB,EAAE,CAAA;YACtC,KAAK,MAAM,EAAE,IAAI,QAAQ,EAAE,CAAC;gBAC1B,MAAM,SAAS,GAAG,EAAE,CAAC,uBAAuB,EAAE,CAAA;gBAC9C,8CAA8C;gBAC9C,IAAI,KAAK,GAAG,CAAC,CAAA;gBACb,KAAK,MAAM,GAAG,IAAI,SAAS,CAAC,IAAI,EAAE,EAAE,CAAC;oBACnC,IAAI,GAAG,KAAK,SAAS;wBAAE,KAAK,EAAE,CAAA;gBAChC,CAAC;gBACD,IAAI,KAAK,GAAG,GAAG,EAAE,CAAC;oBAChB,UAAU,CAAC,IAAI,CAAC;wBACd,IAAI,EAAE,OAAO,CAAC,IAAI;wBAClB,OAAO,EAAE,EAAE,CAAC,WAAW,EAAE;wBACzB,IAAI,EAAE,EAAE,CAAC,WAAW,EAAE;wBACtB,IAAI,EAAE,CAAC;wBACP,OAAO,EAAE,GAAG,EAAE,CAAC,WAAW,EAAE,QAAQ,MAAM,CAAC,KAAK,CAAC,4CAA4C,MAAM,CAAC,GAAG,CAAC,EAAE;wBAC1G,OAAO,EAAE,OAAO,CAAC,OAAO;wBACxB,iEAAiE;wBACjE,iEAAiE;wBACjE,+DAA+D;wBAC/D,QAAQ,EAAE,GAAG,EAAE,CAAC,WAAW,EAAE,KAAK,EAAE,CAAC,WAAW,EAAE,iBAAiB;wBACnE,QAAQ,EAAE,KAAK;wBACf,uEAAuE;wBACvE,wEAAwE;wBACxE,uEAAuE;wBACvE,kBAAkB;wBAClB,YAAY,EAAE,eAAe;qBAC9B,CAAC,CAAA;gBACJ,CAAC;YACH,CAAC;YACD,OAAO,UAAU,CAAA;QACnB,CAAC;KACF,CAAA;AACH,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"function.d.ts","sourceRoot":"","sources":["../../src/conditions/function.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAoB,MAAM,kBAAkB,CAAA;AAEnE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAA;AAC9D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAA;AA+B9D;;;;;;;;;;;GAWG;AACH,wBAAgB,QAAQ,IAAI,SAAS,CAAC,YAAY,CAAC,CAclD;AAED;;GAEG;AACH,wBAAgB,UAAU,IAAI,SAAS,CAAC,YAAY,CAAC,CAMpD;AAED;;GAEG;AACH,wBAAgB,OAAO,IAAI,SAAS,CAAC,YAAY,CAAC,CAMjD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC,YAAY,CAAC,CASzE;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,WAAW,GAAG,SAAS,CAAC,YAAY,CAAC,CAMnF;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,WAAW,GAAG,SAAS,CAAC,YAAY,CAAC,CAyBtF;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,WAAW,GAAG,SAAS,CAAC,YAAY,CAAC,CAOpF;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC,YAAY,CAAC,CAQlE;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC,YAAY,CAAC,CAepE"}
1
+ {"version":3,"file":"function.d.ts","sourceRoot":"","sources":["../../src/conditions/function.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAoB,MAAM,kBAAkB,CAAA;AAInE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAA;AAC9D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAA;AAqC9D;;;;;;;;;;;GAWG;AACH,wBAAgB,QAAQ,IAAI,SAAS,CAAC,YAAY,CAAC,CAkBlD;AAED;;GAEG;AACH,wBAAgB,UAAU,IAAI,SAAS,CAAC,YAAY,CAAC,CAMpD;AAED;;GAEG;AACH,wBAAgB,OAAO,IAAI,SAAS,CAAC,YAAY,CAAC,CAMjD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC,YAAY,CAAC,CASzE;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,WAAW,GAAG,SAAS,CAAC,YAAY,CAAC,CAMnF;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,WAAW,GAAG,SAAS,CAAC,YAAY,CAAC,CAyBtF;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,WAAW,GAAG,SAAS,CAAC,YAAY,CAAC,CAOpF;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC,YAAY,CAAC,CASlE;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC,YAAY,CAAC,CAmBpE"}