@nielspeter/eess-ts 0.2.1 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (433) hide show
  1. package/README.md +61 -35
  2. package/dist/builders/call-rule-builder.d.ts +66 -26
  3. package/dist/builders/call-rule-builder.d.ts.map +1 -1
  4. package/dist/builders/call-rule-builder.js +73 -31
  5. package/dist/builders/call-rule-builder.js.map +1 -1
  6. package/dist/builders/class-rule-builder.d.ts +125 -26
  7. package/dist/builders/class-rule-builder.d.ts.map +1 -1
  8. package/dist/builders/class-rule-builder.js +134 -30
  9. package/dist/builders/class-rule-builder.js.map +1 -1
  10. package/dist/builders/correspondence-builder.d.ts +287 -0
  11. package/dist/builders/correspondence-builder.d.ts.map +1 -0
  12. package/dist/builders/correspondence-builder.js +393 -0
  13. package/dist/builders/correspondence-builder.js.map +1 -0
  14. package/dist/builders/correspondence-findings.d.ts +104 -0
  15. package/dist/builders/correspondence-findings.d.ts.map +1 -0
  16. package/dist/builders/correspondence-findings.js +301 -0
  17. package/dist/builders/correspondence-findings.js.map +1 -0
  18. package/dist/builders/cross-layer-builder.d.ts +99 -16
  19. package/dist/builders/cross-layer-builder.d.ts.map +1 -1
  20. package/dist/builders/cross-layer-builder.js +181 -35
  21. package/dist/builders/cross-layer-builder.js.map +1 -1
  22. package/dist/builders/function-rule-builder.d.ts +144 -25
  23. package/dist/builders/function-rule-builder.d.ts.map +1 -1
  24. package/dist/builders/function-rule-builder.js +173 -26
  25. package/dist/builders/function-rule-builder.js.map +1 -1
  26. package/dist/builders/jsx-rule-builder.d.ts +70 -14
  27. package/dist/builders/jsx-rule-builder.d.ts.map +1 -1
  28. package/dist/builders/jsx-rule-builder.js +73 -14
  29. package/dist/builders/jsx-rule-builder.js.map +1 -1
  30. package/dist/builders/module-rule-builder.d.ts +2 -2
  31. package/dist/builders/module-rule-builder.d.ts.map +1 -1
  32. package/dist/builders/module-rule-builder.js +12 -3
  33. package/dist/builders/module-rule-builder.js.map +1 -1
  34. package/dist/builders/scoped-function-rule-builder.d.ts +11 -0
  35. package/dist/builders/scoped-function-rule-builder.d.ts.map +1 -1
  36. package/dist/builders/scoped-function-rule-builder.js +12 -0
  37. package/dist/builders/scoped-function-rule-builder.js.map +1 -1
  38. package/dist/builders/slice-discovery-message.d.ts +36 -0
  39. package/dist/builders/slice-discovery-message.d.ts.map +1 -0
  40. package/dist/builders/slice-discovery-message.js +181 -0
  41. package/dist/builders/slice-discovery-message.js.map +1 -0
  42. package/dist/builders/slice-rule-builder.d.ts +151 -12
  43. package/dist/builders/slice-rule-builder.d.ts.map +1 -1
  44. package/dist/builders/slice-rule-builder.js +242 -35
  45. package/dist/builders/slice-rule-builder.js.map +1 -1
  46. package/dist/builders/type-rule-builder.d.ts +95 -24
  47. package/dist/builders/type-rule-builder.d.ts.map +1 -1
  48. package/dist/builders/type-rule-builder.js +105 -29
  49. package/dist/builders/type-rule-builder.js.map +1 -1
  50. package/dist/{helpers → builders}/within.d.ts +2 -2
  51. package/dist/builders/within.d.ts.map +1 -0
  52. package/dist/{helpers → builders}/within.js +1 -1
  53. package/dist/builders/within.js.map +1 -0
  54. package/dist/cli/commands/baseline.d.ts +3 -2
  55. package/dist/cli/commands/baseline.d.ts.map +1 -1
  56. package/dist/cli/commands/baseline.js +68 -6
  57. package/dist/cli/commands/baseline.js.map +1 -1
  58. package/dist/cli/commands/check.d.ts +7 -2
  59. package/dist/cli/commands/check.d.ts.map +1 -1
  60. package/dist/cli/commands/check.js +241 -45
  61. package/dist/cli/commands/check.js.map +1 -1
  62. package/dist/cli/commands/doctor.d.ts +29 -0
  63. package/dist/cli/commands/doctor.d.ts.map +1 -0
  64. package/dist/cli/commands/doctor.js +224 -0
  65. package/dist/cli/commands/doctor.js.map +1 -0
  66. package/dist/cli/commands/explain.d.ts +2 -1
  67. package/dist/cli/commands/explain.d.ts.map +1 -1
  68. package/dist/cli/commands/explain.js +19 -10
  69. package/dist/cli/commands/explain.js.map +1 -1
  70. package/dist/cli/commands/init.d.ts +9 -3
  71. package/dist/cli/commands/init.d.ts.map +1 -1
  72. package/dist/cli/commands/init.js +162 -137
  73. package/dist/cli/commands/init.js.map +1 -1
  74. package/dist/cli/import-rule-module.d.ts +29 -0
  75. package/dist/cli/import-rule-module.d.ts.map +1 -0
  76. package/dist/cli/import-rule-module.js +60 -0
  77. package/dist/cli/import-rule-module.js.map +1 -0
  78. package/dist/cli/index.d.ts +2 -2
  79. package/dist/cli/index.d.ts.map +1 -1
  80. package/dist/cli/index.js +98 -33
  81. package/dist/cli/index.js.map +1 -1
  82. package/dist/cli/load-rules.d.ts +6 -11
  83. package/dist/cli/load-rules.d.ts.map +1 -1
  84. package/dist/cli/load-rules.js +21 -29
  85. package/dist/cli/load-rules.js.map +1 -1
  86. package/dist/cli/resolve-config.d.ts.map +1 -1
  87. package/dist/cli/resolve-config.js +24 -24
  88. package/dist/cli/resolve-config.js.map +1 -1
  89. package/dist/cli/rule-file-findings.d.ts +178 -0
  90. package/dist/cli/rule-file-findings.d.ts.map +1 -0
  91. package/dist/cli/rule-file-findings.js +293 -0
  92. package/dist/cli/rule-file-findings.js.map +1 -0
  93. package/dist/cli/watch.d.ts +20 -7
  94. package/dist/cli/watch.d.ts.map +1 -1
  95. package/dist/cli/watch.js +39 -14
  96. package/dist/cli/watch.js.map +1 -1
  97. package/dist/conditions/body-analysis-function.d.ts.map +1 -1
  98. package/dist/conditions/body-analysis-function.js +16 -7
  99. package/dist/conditions/body-analysis-function.js.map +1 -1
  100. package/dist/conditions/body-analysis-module.d.ts.map +1 -1
  101. package/dist/conditions/body-analysis-module.js +14 -9
  102. package/dist/conditions/body-analysis-module.js.map +1 -1
  103. package/dist/conditions/body-analysis.d.ts.map +1 -1
  104. package/dist/conditions/body-analysis.js +16 -7
  105. package/dist/conditions/body-analysis.js.map +1 -1
  106. package/dist/conditions/call.d.ts.map +1 -1
  107. package/dist/conditions/call.js +38 -17
  108. package/dist/conditions/call.js.map +1 -1
  109. package/dist/conditions/catch-analysis.d.ts +2 -1
  110. package/dist/conditions/catch-analysis.d.ts.map +1 -1
  111. package/dist/conditions/catch-analysis.js.map +1 -1
  112. package/dist/conditions/cross-layer.d.ts +2 -10
  113. package/dist/conditions/cross-layer.d.ts.map +1 -1
  114. package/dist/conditions/cross-layer.js +227 -23
  115. package/dist/conditions/cross-layer.js.map +1 -1
  116. package/dist/conditions/dependency.d.ts +35 -6
  117. package/dist/conditions/dependency.d.ts.map +1 -1
  118. package/dist/conditions/dependency.js +299 -45
  119. package/dist/conditions/dependency.js.map +1 -1
  120. package/dist/conditions/exports.d.ts.map +1 -1
  121. package/dist/conditions/exports.js +10 -0
  122. package/dist/conditions/exports.js.map +1 -1
  123. package/dist/conditions/function.d.ts.map +1 -1
  124. package/dist/conditions/function.js +19 -5
  125. package/dist/conditions/function.js.map +1 -1
  126. package/dist/conditions/helpers.d.ts +2 -1
  127. package/dist/conditions/helpers.d.ts.map +1 -1
  128. package/dist/conditions/helpers.js +4 -1
  129. package/dist/conditions/helpers.js.map +1 -1
  130. package/dist/conditions/jsx.d.ts.map +1 -1
  131. package/dist/conditions/jsx.js +7 -2
  132. package/dist/conditions/jsx.js.map +1 -1
  133. package/dist/conditions/match-identity.d.ts +43 -0
  134. package/dist/conditions/match-identity.d.ts.map +1 -0
  135. package/dist/conditions/match-identity.js +43 -0
  136. package/dist/conditions/match-identity.js.map +1 -0
  137. package/dist/conditions/members.d.ts.map +1 -1
  138. package/dist/conditions/members.js +17 -4
  139. package/dist/conditions/members.js.map +1 -1
  140. package/dist/conditions/reverse-dependency.d.ts +18 -5
  141. package/dist/conditions/reverse-dependency.d.ts.map +1 -1
  142. package/dist/conditions/reverse-dependency.js +109 -92
  143. package/dist/conditions/reverse-dependency.js.map +1 -1
  144. package/dist/conditions/slice.d.ts +86 -2
  145. package/dist/conditions/slice.d.ts.map +1 -1
  146. package/dist/conditions/slice.js +234 -53
  147. package/dist/conditions/slice.js.map +1 -1
  148. package/dist/conditions/structural.d.ts.map +1 -1
  149. package/dist/conditions/structural.js +16 -4
  150. package/dist/conditions/structural.js.map +1 -1
  151. package/dist/core/check-all.d.ts +19 -0
  152. package/dist/core/check-all.d.ts.map +1 -0
  153. package/dist/core/check-all.js +96 -0
  154. package/dist/core/check-all.js.map +1 -0
  155. package/dist/core/combinators.d.ts +48 -0
  156. package/dist/core/combinators.d.ts.map +1 -0
  157. package/dist/core/combinators.js +56 -0
  158. package/dist/core/combinators.js.map +1 -0
  159. package/dist/core/descendant-cache.d.ts +36 -0
  160. package/dist/core/descendant-cache.d.ts.map +1 -0
  161. package/dist/core/descendant-cache.js +119 -0
  162. package/dist/core/descendant-cache.js.map +1 -0
  163. package/dist/core/diagnose.d.ts +234 -0
  164. package/dist/core/diagnose.d.ts.map +1 -0
  165. package/dist/core/diagnose.js +382 -0
  166. package/dist/core/diagnose.js.map +1 -0
  167. package/dist/core/disk-set.d.ts +48 -0
  168. package/dist/core/disk-set.d.ts.map +1 -0
  169. package/dist/core/disk-set.js +218 -0
  170. package/dist/core/disk-set.js.map +1 -0
  171. package/dist/core/element-cache.d.ts +75 -0
  172. package/dist/core/element-cache.d.ts.map +1 -0
  173. package/dist/core/element-cache.js +32 -0
  174. package/dist/core/element-cache.js.map +1 -0
  175. package/dist/core/empty-project-advice.d.ts +75 -0
  176. package/dist/core/empty-project-advice.d.ts.map +1 -0
  177. package/dist/core/empty-project-advice.js +61 -0
  178. package/dist/core/empty-project-advice.js.map +1 -0
  179. package/dist/core/exclusion-comments.d.ts +54 -0
  180. package/dist/core/exclusion-comments.d.ts.map +1 -0
  181. package/dist/core/exclusion-comments.js +310 -0
  182. package/dist/core/exclusion-comments.js.map +1 -0
  183. package/dist/core/execute-rule.d.ts +150 -0
  184. package/dist/core/execute-rule.d.ts.map +1 -0
  185. package/dist/core/execute-rule.js +580 -0
  186. package/dist/core/execute-rule.js.map +1 -0
  187. package/dist/core/glob-diagnosis.d.ts +78 -0
  188. package/dist/core/glob-diagnosis.d.ts.map +1 -0
  189. package/dist/core/glob-diagnosis.js +134 -0
  190. package/dist/core/glob-diagnosis.js.map +1 -0
  191. package/dist/core/glob-evaluator.d.ts +48 -0
  192. package/dist/core/glob-evaluator.d.ts.map +1 -0
  193. package/dist/core/glob-evaluator.js +89 -0
  194. package/dist/core/glob-evaluator.js.map +1 -0
  195. package/dist/core/import-candidates.d.ts +60 -0
  196. package/dist/core/import-candidates.d.ts.map +1 -0
  197. package/dist/core/import-candidates.js +93 -0
  198. package/dist/core/import-candidates.js.map +1 -0
  199. package/dist/core/import-options.d.ts +55 -2
  200. package/dist/core/import-options.d.ts.map +1 -1
  201. package/dist/core/import-options.js +64 -0
  202. package/dist/core/import-options.js.map +1 -1
  203. package/dist/core/line-index.d.ts +3 -0
  204. package/dist/core/line-index.d.ts.map +1 -0
  205. package/dist/core/line-index.js +229 -0
  206. package/dist/core/line-index.js.map +1 -0
  207. package/dist/core/metric-violation.d.ts +86 -0
  208. package/dist/core/metric-violation.d.ts.map +1 -0
  209. package/dist/core/metric-violation.js +132 -0
  210. package/dist/core/metric-violation.js.map +1 -0
  211. package/dist/core/module-edges.d.ts +361 -0
  212. package/dist/core/module-edges.d.ts.map +1 -0
  213. package/dist/core/module-edges.js +592 -0
  214. package/dist/core/module-edges.js.map +1 -0
  215. package/dist/core/object-literal-functions.d.ts +42 -0
  216. package/dist/core/object-literal-functions.d.ts.map +1 -0
  217. package/dist/core/object-literal-functions.js +75 -0
  218. package/dist/core/object-literal-functions.js.map +1 -0
  219. package/dist/core/orphan-exclusions.d.ts +44 -0
  220. package/dist/core/orphan-exclusions.d.ts.map +1 -0
  221. package/dist/core/orphan-exclusions.js +214 -0
  222. package/dist/core/orphan-exclusions.js.map +1 -0
  223. package/dist/core/pair-condition.d.ts +32 -3
  224. package/dist/core/pair-condition.d.ts.map +1 -1
  225. package/dist/core/path-universe.d.ts +54 -0
  226. package/dist/core/path-universe.d.ts.map +1 -0
  227. package/dist/core/path-universe.js +65 -0
  228. package/dist/core/path-universe.js.map +1 -0
  229. package/dist/core/per-root-compiler-options.d.ts +20 -0
  230. package/dist/core/per-root-compiler-options.d.ts.map +1 -0
  231. package/dist/core/per-root-compiler-options.js +57 -0
  232. package/dist/core/per-root-compiler-options.js.map +1 -0
  233. package/dist/core/project-relative.d.ts +98 -0
  234. package/dist/core/project-relative.d.ts.map +1 -0
  235. package/dist/core/project-relative.js +185 -0
  236. package/dist/core/project-relative.js.map +1 -0
  237. package/dist/core/project.d.ts +7 -1
  238. package/dist/core/project.d.ts.map +1 -1
  239. package/dist/core/project.js +24 -0
  240. package/dist/core/project.js.map +1 -1
  241. package/dist/core/rule-builder.d.ts +282 -0
  242. package/dist/core/rule-builder.d.ts.map +1 -0
  243. package/dist/core/rule-builder.js +445 -0
  244. package/dist/core/rule-builder.js.map +1 -0
  245. package/dist/core/rule-declaration.d.ts +32 -0
  246. package/dist/core/rule-declaration.d.ts.map +1 -0
  247. package/dist/core/rule-declaration.js +126 -0
  248. package/dist/core/rule-declaration.js.map +1 -0
  249. package/dist/core/terminal-builder.d.ts +625 -0
  250. package/dist/core/terminal-builder.d.ts.map +1 -0
  251. package/dist/core/terminal-builder.js +787 -0
  252. package/dist/core/terminal-builder.js.map +1 -0
  253. package/dist/core/terminal-execution.d.ts +23 -0
  254. package/dist/core/terminal-execution.d.ts.map +1 -0
  255. package/dist/core/terminal-execution.js +71 -0
  256. package/dist/core/terminal-execution.js.map +1 -0
  257. package/dist/core/vacuity-diagnosis.d.ts +103 -0
  258. package/dist/core/vacuity-diagnosis.d.ts.map +1 -0
  259. package/dist/core/vacuity-diagnosis.js +415 -0
  260. package/dist/core/vacuity-diagnosis.js.map +1 -0
  261. package/dist/core/violation.d.ts +16 -11
  262. package/dist/core/violation.d.ts.map +1 -1
  263. package/dist/core/violation.js +33 -13
  264. package/dist/core/violation.js.map +1 -1
  265. package/dist/graphql/index.js +1 -1
  266. package/dist/graphql/index.js.map +1 -1
  267. package/dist/graphql/resolver-rule-builder.d.ts +98 -23
  268. package/dist/graphql/resolver-rule-builder.d.ts.map +1 -1
  269. package/dist/graphql/resolver-rule-builder.js +151 -21
  270. package/dist/graphql/resolver-rule-builder.js.map +1 -1
  271. package/dist/graphql/schema-loader.d.ts +21 -0
  272. package/dist/graphql/schema-loader.d.ts.map +1 -1
  273. package/dist/graphql/schema-loader.js +81 -12
  274. package/dist/graphql/schema-loader.js.map +1 -1
  275. package/dist/graphql/schema-rule-builder.d.ts +57 -20
  276. package/dist/graphql/schema-rule-builder.d.ts.map +1 -1
  277. package/dist/graphql/schema-rule-builder.js +101 -25
  278. package/dist/graphql/schema-rule-builder.js.map +1 -1
  279. package/dist/helpers/baseline-diagnostics.d.ts +45 -0
  280. package/dist/helpers/baseline-diagnostics.d.ts.map +1 -0
  281. package/dist/helpers/baseline-diagnostics.js +168 -0
  282. package/dist/helpers/baseline-diagnostics.js.map +1 -0
  283. package/dist/helpers/baseline-generator.d.ts +19 -0
  284. package/dist/helpers/baseline-generator.d.ts.map +1 -0
  285. package/dist/helpers/baseline-generator.js +18 -0
  286. package/dist/helpers/baseline-generator.js.map +1 -0
  287. package/dist/helpers/baseline.d.ts +336 -0
  288. package/dist/helpers/baseline.d.ts.map +1 -0
  289. package/dist/helpers/baseline.js +664 -0
  290. package/dist/helpers/baseline.js.map +1 -0
  291. package/dist/helpers/body-traversal.d.ts +27 -2
  292. package/dist/helpers/body-traversal.d.ts.map +1 -1
  293. package/dist/helpers/body-traversal.js +122 -16
  294. package/dist/helpers/body-traversal.js.map +1 -1
  295. package/dist/helpers/callback-extractor.d.ts.map +1 -1
  296. package/dist/helpers/callback-extractor.js +48 -47
  297. package/dist/helpers/callback-extractor.js.map +1 -1
  298. package/dist/helpers/complexity.d.ts +13 -5
  299. package/dist/helpers/complexity.d.ts.map +1 -1
  300. package/dist/helpers/complexity.js +15 -6
  301. package/dist/helpers/complexity.js.map +1 -1
  302. package/dist/helpers/diff-aware.d.ts +44 -0
  303. package/dist/helpers/diff-aware.d.ts.map +1 -0
  304. package/dist/helpers/diff-aware.js +84 -0
  305. package/dist/helpers/diff-aware.js.map +1 -0
  306. package/dist/helpers/matchers.d.ts +68 -7
  307. package/dist/helpers/matchers.d.ts.map +1 -1
  308. package/dist/helpers/matchers.js +114 -20
  309. package/dist/helpers/matchers.js.map +1 -1
  310. package/dist/helpers/slice-graph.d.ts +100 -8
  311. package/dist/helpers/slice-graph.d.ts.map +1 -1
  312. package/dist/helpers/slice-graph.js +126 -34
  313. package/dist/helpers/slice-graph.js.map +1 -1
  314. package/dist/helpers/tarjan.d.ts +0 -14
  315. package/dist/helpers/tarjan.d.ts.map +1 -1
  316. package/dist/helpers/tarjan.js +29 -16
  317. package/dist/helpers/tarjan.js.map +1 -1
  318. package/dist/index.d.ts +56 -17
  319. package/dist/index.d.ts.map +1 -1
  320. package/dist/index.js +57 -13
  321. package/dist/index.js.map +1 -1
  322. package/dist/models/arch-call.d.ts +3 -2
  323. package/dist/models/arch-call.d.ts.map +1 -1
  324. package/dist/models/arch-call.js.map +1 -1
  325. package/dist/models/arch-function.d.ts +28 -6
  326. package/dist/models/arch-function.d.ts.map +1 -1
  327. package/dist/models/arch-function.js +106 -3
  328. package/dist/models/arch-function.js.map +1 -1
  329. package/dist/models/arch-jsx-element.js +2 -2
  330. package/dist/models/arch-jsx-element.js.map +1 -1
  331. package/dist/models/slice.d.ts +33 -9
  332. package/dist/models/slice.d.ts.map +1 -1
  333. package/dist/models/slice.js +129 -19
  334. package/dist/models/slice.js.map +1 -1
  335. package/dist/predicates/call.d.ts.map +1 -1
  336. package/dist/predicates/call.js +5 -0
  337. package/dist/predicates/call.js.map +1 -1
  338. package/dist/predicates/identity.d.ts +21 -0
  339. package/dist/predicates/identity.d.ts.map +1 -1
  340. package/dist/predicates/identity.js +75 -3
  341. package/dist/predicates/identity.js.map +1 -1
  342. package/dist/predicates/index.d.ts +1 -1
  343. package/dist/predicates/index.d.ts.map +1 -1
  344. package/dist/predicates/index.js +1 -1
  345. package/dist/predicates/index.js.map +1 -1
  346. package/dist/predicates/metrics.d.ts +4 -2
  347. package/dist/predicates/metrics.d.ts.map +1 -1
  348. package/dist/predicates/metrics.js +4 -2
  349. package/dist/predicates/metrics.js.map +1 -1
  350. package/dist/predicates/module.d.ts +4 -12
  351. package/dist/predicates/module.d.ts.map +1 -1
  352. package/dist/predicates/module.js +57 -37
  353. package/dist/predicates/module.js.map +1 -1
  354. package/dist/presets/agent-guardrails.d.ts +22 -15
  355. package/dist/presets/agent-guardrails.d.ts.map +1 -1
  356. package/dist/presets/agent-guardrails.js +124 -19
  357. package/dist/presets/agent-guardrails.js.map +1 -1
  358. package/dist/presets/boundaries.d.ts +45 -2
  359. package/dist/presets/boundaries.d.ts.map +1 -1
  360. package/dist/presets/boundaries.js +132 -23
  361. package/dist/presets/boundaries.js.map +1 -1
  362. package/dist/presets/data-layer.d.ts +22 -2
  363. package/dist/presets/data-layer.d.ts.map +1 -1
  364. package/dist/presets/data-layer.js +58 -16
  365. package/dist/presets/data-layer.js.map +1 -1
  366. package/dist/presets/index.d.ts +7 -5
  367. package/dist/presets/index.d.ts.map +1 -1
  368. package/dist/presets/index.js +9 -3
  369. package/dist/presets/index.js.map +1 -1
  370. package/dist/presets/layered.d.ts +46 -2
  371. package/dist/presets/layered.d.ts.map +1 -1
  372. package/dist/presets/layered.js +66 -29
  373. package/dist/presets/layered.js.map +1 -1
  374. package/dist/presets/recommended.d.ts +80 -9
  375. package/dist/presets/recommended.d.ts.map +1 -1
  376. package/dist/presets/recommended.js +25 -23
  377. package/dist/presets/recommended.js.map +1 -1
  378. package/dist/presets/shared.d.ts +270 -2
  379. package/dist/presets/shared.d.ts.map +1 -1
  380. package/dist/presets/shared.js +338 -4
  381. package/dist/presets/shared.js.map +1 -1
  382. package/dist/rules/code-quality.d.ts.map +1 -1
  383. package/dist/rules/code-quality.js +15 -6
  384. package/dist/rules/code-quality.js.map +1 -1
  385. package/dist/rules/hygiene.d.ts +1 -1
  386. package/dist/rules/hygiene.js +1 -1
  387. package/dist/rules/metrics-function.d.ts +2 -1
  388. package/dist/rules/metrics-function.d.ts.map +1 -1
  389. package/dist/rules/metrics-function.js +33 -6
  390. package/dist/rules/metrics-function.js.map +1 -1
  391. package/dist/rules/metrics.d.ts +2 -1
  392. package/dist/rules/metrics.d.ts.map +1 -1
  393. package/dist/rules/metrics.js +39 -9
  394. package/dist/rules/metrics.js.map +1 -1
  395. package/dist/smells/duplicate-bodies.d.ts +58 -5
  396. package/dist/smells/duplicate-bodies.d.ts.map +1 -1
  397. package/dist/smells/duplicate-bodies.js +137 -56
  398. package/dist/smells/duplicate-bodies.js.map +1 -1
  399. package/dist/smells/fingerprint.d.ts +8 -1
  400. package/dist/smells/fingerprint.d.ts.map +1 -1
  401. package/dist/smells/fingerprint.js +21 -3
  402. package/dist/smells/fingerprint.js.map +1 -1
  403. package/dist/smells/inconsistent-siblings.d.ts +128 -7
  404. package/dist/smells/inconsistent-siblings.d.ts.map +1 -1
  405. package/dist/smells/inconsistent-siblings.js +288 -86
  406. package/dist/smells/inconsistent-siblings.js.map +1 -1
  407. package/dist/smells/sibling-files.d.ts +47 -0
  408. package/dist/smells/sibling-files.d.ts.map +1 -0
  409. package/dist/smells/sibling-files.js +104 -0
  410. package/dist/smells/sibling-files.js.map +1 -0
  411. package/dist/smells/similar-pairs.d.ts +27 -0
  412. package/dist/smells/similar-pairs.d.ts.map +1 -0
  413. package/dist/smells/similar-pairs.js +52 -0
  414. package/dist/smells/similar-pairs.js.map +1 -0
  415. package/dist/smells/smell-builder.d.ts +57 -12
  416. package/dist/smells/smell-builder.d.ts.map +1 -1
  417. package/dist/smells/smell-builder.js +111 -14
  418. package/dist/smells/smell-builder.js.map +1 -1
  419. package/dist/tsconfig/index.d.ts +19 -0
  420. package/dist/tsconfig/index.d.ts.map +1 -0
  421. package/dist/tsconfig/index.js +20 -0
  422. package/dist/tsconfig/index.js.map +1 -0
  423. package/dist/tsconfig/tsconfig-builder.d.ts +42 -9
  424. package/dist/tsconfig/tsconfig-builder.d.ts.map +1 -1
  425. package/dist/tsconfig/tsconfig-builder.js +64 -16
  426. package/dist/tsconfig/tsconfig-builder.js.map +1 -1
  427. package/package.json +3 -2
  428. package/dist/core/module-dependencies.d.ts +0 -28
  429. package/dist/core/module-dependencies.d.ts.map +0 -1
  430. package/dist/core/module-dependencies.js +0 -35
  431. package/dist/core/module-dependencies.js.map +0 -1
  432. package/dist/helpers/within.d.ts.map +0 -1
  433. package/dist/helpers/within.js.map +0 -1
@@ -1,33 +1,129 @@
1
1
  import picomatch from 'picomatch';
2
+ import { isProjectRelative, relativeToRoot } from '../core/project-relative.js';
3
+ /**
4
+ * Characters that make a segment non-literal for prefix purposes.
5
+ *
6
+ * Only `*` and `?`. Brackets and braces are excluded deliberately: `[slug]`,
7
+ * `(marketing)` and `{a,b}` occur as real directory names, and a `baseDir` cut
8
+ * before them is located in the path literally — which is what makes those routes
9
+ * resolve correctly. Cutting at `*`/`?` matters for partial wildcards
10
+ * (`src/feature-*\/x/*`), where keeping the segment would put a `*` inside
11
+ * `baseDir` and no path could ever contain it.
12
+ */
13
+ const WILDCARD_CHARS = /[*?]/;
14
+ /**
15
+ * Normalize a `matching()` glob so every spelling of one intent agrees.
16
+ *
17
+ * Redundant and therefore stripped: a leading `**\/` (patterns are matched against
18
+ * absolute paths anyway), a leading `./` (never present in an absolute path), and a
19
+ * trailing `/` once the glob already contains a wildcard segment.
20
+ *
21
+ * A trailing `/` on a wildcard-free glob becomes an explicit `*`, so `'src/features/'`
22
+ * ("the things inside features") is exactly `'src/features/*'`. These are all
23
+ * equivalent — `'src/features/*'`, `'src/features/*\/'`, `'src/features/'`,
24
+ * `'**\/src/features/*'`, `'./src/features/*'` — while `'src/features'` (no slash) is
25
+ * deliberately different: its final segment is a name filter, yielding one slice.
26
+ */
27
+ function parseMatchingGlob(glob) {
28
+ let normalized = glob;
29
+ // Loop over BOTH redundant prefixes together: './' and '**/' can appear in
30
+ // either order ('**/./src/*'), and stripping one kind to exhaustion before the
31
+ // other left a residual that made the whole glob unmatchable.
32
+ while (normalized.startsWith('./') || normalized.startsWith('**/')) {
33
+ normalized = normalized.startsWith('./') ? normalized.slice(2) : normalized.slice(3);
34
+ }
35
+ // A trailing '/' is redundant once the glob already contains a wildcard segment:
36
+ // that wildcard is the slice level, and the pattern appends its own '*/**'. Left
37
+ // in, it demanded one directory MORE than baseDir implies, so every file sitting
38
+ // directly in the matched directory was silently dropped ('src/feature-*/' lost
39
+ // each feature's index.ts; 'packages/*/src/' lost everything directly in src).
40
+ //
41
+ // With no wildcard anywhere the slash is meaningful and stays: 'src/features/'
42
+ // means "the directories inside features". The test is about the glob as a whole,
43
+ // not the final segment's shape — `[slug]` and `(marketing)` are real directory
44
+ // names, and testing them for metacharacters is what broke them before.
45
+ if (normalized.endsWith('/')) {
46
+ const withoutSlash = normalized.slice(0, -1);
47
+ const hasWildcardSegment = withoutSlash.split('/').some((seg) => WILDCARD_CHARS.test(seg));
48
+ // With a wildcard already present that wildcard IS the slice level, so the
49
+ // slash is noise. Otherwise 'dir/' means "the things inside dir", which is
50
+ // exactly 'dir/*' — make it explicit so both spellings take the same path and
51
+ // a flat directory (files, no subdirectories) resolves for both.
52
+ normalized = hasWildcardSegment ? withoutSlash : normalized + '*';
53
+ }
54
+ const segments = normalized.split('/').filter((segment) => segment !== '');
55
+ // The slice level is the first wildcard segment; everything literal before it is
56
+ // the directory prefix we locate in the path. A trailing '/' has already been
57
+ // turned into an explicit '*', so the remaining no-wildcard case is a bare
58
+ // 'src/feature-', where the final segment is a NAME FILTER rather than a
59
+ // directory — which is what distinguishes it from 'src/features/'.
60
+ const wildcardIdx = segments.findIndex((segment) => WILDCARD_CHARS.test(segment));
61
+ const prefixSegments = wildcardIdx >= 0 ? segments.slice(0, wildcardIdx) : segments.slice(0, -1);
62
+ const baseDir = prefixSegments.length > 0 ? prefixSegments.join('/') + '/' : '';
63
+ // The pattern keeps the glob's own shape (interior segments included) so that
64
+ // `packages/*/src/*` still requires the `/src/` level, and `dir/*` still matches
65
+ // files sitting directly in `dir` as well as subdirectories. Only `baseDir` is
66
+ // segment-derived — it is the part that has to be findable in a real path.
67
+ const fullGlob = (normalized.startsWith('/') ? normalized : '**/' + normalized) + '*/**';
68
+ return { fullGlob, baseDir };
69
+ }
70
+ /**
71
+ * The literal directory prefix a `matching()` glob would search for, or `''` when
72
+ * it has none (`'*'`, `'src'`, `'{a,b}/x/*'`). Exposed so the rule builder can
73
+ * state the *actual* cause of an empty result instead of guessing at one.
74
+ */
75
+ export function matchingGlobPrefix(glob) {
76
+ return parseMatchingGlob(glob).baseDir;
77
+ }
78
+ /**
79
+ * The glob `matching()` actually hands to picomatch.
80
+ *
81
+ * Exposed for glob diagnosis (plan 0069), which must declare **the string the
82
+ * matcher receives** — the same rule `GlobKind` states for what a glob is
83
+ * matched against. Declaring the author's spelling instead makes the whole
84
+ * mechanism wrong for this entry point: `'src/features/*'` is rewritten to
85
+ * `'**\/src/features/**\/*'`-shaped, so the author's string matches nothing in
86
+ * either view and every nested-layout `matching()` rule — the shape the docs
87
+ * teach — is reported dead. It also made `'./src/features/*'`, which
88
+ * `parseMatchingGlob` deliberately supports, report a `dot-segment` fault with
89
+ * a remedy that would break a working rule.
90
+ */
91
+ export function matchingGlobPattern(glob) {
92
+ return parseMatchingGlob(glob).fullGlob;
93
+ }
2
94
  /**
3
95
  * Resolve slices by matching a glob pattern against source file paths.
4
- * Each unique directory matching the glob becomes a slice.
5
96
  *
6
- * The glob must contain a wildcard segment that distinguishes slices.
7
- * For example, 'src/features/*\/' matches each subdirectory of src/features/
8
- * as a separate slice.
97
+ * The segment following the glob's literal prefix names each slice. That segment
98
+ * is a **directory** when files are nested under it, and otherwise each matching
99
+ * **file** name — `matching('src/features/*')` over `features/billing/order.ts`
100
+ * yields a `billing` slice, while over a flat `services/order.service.ts` it
101
+ * yields an `order.service.ts` slice.
102
+ *
103
+ * Every spelling of the same intent agrees: `'src/features/*'`,
104
+ * `'src/features/*\/'`, `'src/features/'` and `'**\/src/features/*'` are equivalent.
9
105
  *
10
106
  * @param project - The loaded ArchProject
11
- * @param glob - A glob pattern where the wildcard segment defines slice boundaries
12
- * @returns Array of slices, one per matching directory
107
+ * @param glob - A glob whose literal prefix locates the slices; the next segment names them
108
+ * @returns Array of slices, one per distinct name
13
109
  *
14
110
  * @example
15
- * resolveByMatching(project, 'src/features/*\/')
111
+ * resolveByMatching(project, 'src/features/*')
16
112
  * // => [{ name: 'auth', files: [...] }, { name: 'billing', files: [...] }]
17
113
  */
18
114
  export function resolveByMatching(project, glob) {
19
- // Prepend ** if the glob is not already absolute or globbed at the root,
20
- // so it matches anywhere in an absolute file path.
21
- // Append */** to match: the slice directory segment (*) + any files inside (/**)
22
- const fullGlob = glob.startsWith('/') || glob.startsWith('**') ? glob + '*/**' : '**/' + glob + '*/**';
115
+ const { fullGlob, baseDir } = parseMatchingGlob(glob);
116
+ // No literal directory prefix (e.g. '*', '**', 'src' with no '/'). Bail rather
117
+ // than search for '' in the path: `indexOf('')` is 0, so the "slice name" would
118
+ // be the path's first segment — empty on POSIX (harmless by accident) but the
119
+ // drive letter on Windows, which would mint ONE slice holding every file and
120
+ // silently pass every inter-slice condition. Returning no slices makes the
121
+ // discovery guard fire instead (ADR-008).
122
+ if (baseDir === '')
123
+ return [];
23
124
  const isMatch = picomatch(fullGlob);
24
125
  const sourceFiles = project.getSourceFiles();
25
126
  const sliceMap = new Map();
26
- // Extract the base directory (everything up to and including the last / in the original glob)
27
- // For 'src/feature-', basedir is 'src/' so that 'feature-a' is extracted as slice name.
28
- // For 'src/features/*/', basedir is 'src/features/' so that the wildcard dirs are slice names.
29
- const lastSlashIdx = glob.lastIndexOf('/');
30
- const baseDir = lastSlashIdx >= 0 ? glob.slice(0, lastSlashIdx + 1) : '';
31
127
  for (const sf of sourceFiles) {
32
128
  const filePath = sf.getFilePath();
33
129
  if (!isMatch(filePath))
@@ -63,8 +159,8 @@ export function resolveByMatching(project, glob) {
63
159
  *
64
160
  * @example
65
161
  * resolveByDefinition(project, {
66
- * presentation: 'src/controllers/**',
67
- * domain: 'src/domain/**',
162
+ * presentation: 'src/controllers/**', // relative: those folders AT THE ROOT
163
+ * domain: '**\/domain/**', // anchored: a domain/ anywhere
68
164
  * })
69
165
  */
70
166
  export function resolveByDefinition(project, definition) {
@@ -73,12 +169,26 @@ export function resolveByDefinition(project, definition) {
73
169
  const matchers = entries.map(([name, glob]) => ({
74
170
  name,
75
171
  isMatch: picomatch(glob),
172
+ // Bug 0033. A project-relative glob matched nothing here while the path
173
+ // predicates and `matching()` both accepted one — so `layers: { api:
174
+ // 'src/api/**' }` failed beside a `shared: ['src/shared/**']` that worked,
175
+ // in the same preset call. Same rule as the predicates (plan 0067 C):
176
+ // relative means **from the project root**, which is narrower and more
177
+ // accurate than the `'**/src/api/**'` the old advice prescribed.
178
+ relative: isProjectRelative(glob),
76
179
  files: [],
77
180
  }));
78
181
  for (const sf of sourceFiles) {
79
182
  const filePath = sf.getFilePath();
183
+ // Per FILE, not once per project: a workspace has several roots and each
184
+ // file belongs to one of them (bug 0035). `project.tsConfigPath` is only
185
+ // the fallback, for a project built without `project()`/`workspace()` —
186
+ // an in-memory test double, where ts-morph records no config path either.
187
+ const fromRoot = relativeToRoot(sf, filePath, project.tsConfigPath);
80
188
  for (const matcher of matchers) {
81
- if (matcher.isMatch(filePath)) {
189
+ const hit = matcher.isMatch(filePath) ||
190
+ (matcher.relative && fromRoot !== undefined && matcher.isMatch(fromRoot));
191
+ if (hit) {
82
192
  matcher.files.push(sf);
83
193
  break; // first match wins
84
194
  }
@@ -1 +1 @@
1
- {"version":3,"file":"slice.js","sourceRoot":"","sources":["../../src/models/slice.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"slice.js","sourceRoot":"","sources":["../../src/models/slice.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"call.d.ts","sourceRoot":"","sources":["../../src/predicates/call.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AACjD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAA;AAYtD;;;;;;;GAOG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC,QAAQ,CAAC,CAQ1D;AAED;;;;;;;;GAQG;AACH,wBAAgB,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC,QAAQ,CAAC,CAiB5E;AAED;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC,QAAQ,CAAC,CAa5F;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC,QAAQ,CAAC,CAc9E"}
1
+ {"version":3,"file":"call.d.ts","sourceRoot":"","sources":["../../src/predicates/call.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAEjD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAA;AAYtD;;;;;;;GAOG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC,QAAQ,CAAC,CAQ1D;AAED;;;;;;;;GAQG;AACH,wBAAgB,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC,QAAQ,CAAC,CAiB5E;AAED;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC,QAAQ,CAAC,CAa5F;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC,QAAQ,CAAC,CAkB9E"}
@@ -1,5 +1,6 @@
1
1
  import { Node } from 'ts-morph';
2
2
  import picomatch from 'picomatch';
3
+ import { globNode } from '@nielspeter/eess';
3
4
  /**
4
5
  * Normalize text for matching: replace optional chaining `?.` with `.`
5
6
  * so users don't need to account for both forms.
@@ -97,6 +98,10 @@ export function withArgMatching(index, pattern) {
97
98
  export function withStringArg(index, glob) {
98
99
  const isMatch = picomatch(glob);
99
100
  return {
101
+ // `literal`: this glob is matched against a string literal in the source,
102
+ // not a path. Declared anyway so `doctor` can tell "declares nothing" from
103
+ // "declares something that is legitimately not path-checkable".
104
+ globs: globNode({ glob, kind: 'literal' }),
100
105
  description: `with string argument ${String(index)} matching '${glob}'`,
101
106
  test: (call) => {
102
107
  const args = call.getArguments();
@@ -1 +1 @@
1
- {"version":3,"file":"call.js","sourceRoot":"","sources":["../../src/predicates/call.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"call.js","sourceRoot":"","sources":["../../src/predicates/call.ts"],"names":[],"mappings":"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"}
@@ -44,6 +44,27 @@ export declare function resideInFile<T extends Located>(glob: string): Predicate
44
44
  * resideInFolder('** /src/services/**')
45
45
  */
46
46
  export declare function resideInFolder<T extends Located>(glob: string): Predicate<T>;
47
+ /**
48
+ * Matches modules whose file path matches the given glob.
49
+ *
50
+ * Similar to resideInFile but semantically clearer for modules —
51
+ * "modules that have path matching" vs "elements that reside in file".
52
+ *
53
+ * Lives here, beside `resideInFile`/`resideInFolder`, rather than in
54
+ * `predicates/module.ts`: it is an **identity** predicate, and identity
55
+ * predicates are legitimately single-glob — you match one location pattern,
56
+ * not a blacklist. The `api/no-single-glob-predicates` dogfood rule bans
57
+ * single-glob predicates in `module.ts` precisely because a module predicate
58
+ * like `importFrom`/`notImportFrom` must be variadic, and it carved out
59
+ * identity predicates by name in a comment. Moving the function makes that
60
+ * carve-out the rule's own scope instead of a comment beside it — exclusion by
61
+ * construction (ADR-009 rule 3). No public API change: `src/index.ts`
62
+ * re-exports it under the same name, and there is no `./predicates` subpath.
63
+ *
64
+ * @example
65
+ * modules(p).that().havePathMatching('** /services/*.ts')
66
+ */
67
+ export declare function havePathMatching(glob: string): Predicate<SourceFile>;
47
68
  /**
48
69
  * Matches elements that are exported from their module.
49
70
  */
@@ -1 +1 @@
1
- {"version":3,"file":"identity.d.ts","sourceRoot":"","sources":["../../src/predicates/identity.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AAC1C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAEjD,iGAAiG;AACjG,MAAM,WAAW,KAAK;IACpB,OAAO,IAAI,MAAM,GAAG,SAAS,CAAA;CAC9B;AAED,yDAAyD;AACzD,MAAM,WAAW,OAAO;IACtB,aAAa,IAAI,UAAU,CAAA;CAC5B;AAED,qGAAqG;AACrG,MAAM,WAAW,UAAU;IACzB,UAAU,IAAI,OAAO,CAAA;CACtB;AAID;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,SAAS,KAAK,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC,CASxF;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,CAAC,SAAS,KAAK,EAAE,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC,CAQlF;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,CAAC,SAAS,KAAK,EAAE,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC,CAQhF;AAID;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,CAAC,SAAS,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC,CAM1E;AAED;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,CAAC,SAAS,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC,CAU5E;AAID;;GAEG;AACH,wBAAgB,WAAW,CAAC,CAAC,SAAS,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,CAKhE;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,CAAC,SAAS,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,CAKnE"}
1
+ {"version":3,"file":"identity.d.ts","sourceRoot":"","sources":["../../src/predicates/identity.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AAC1C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAIjD,iGAAiG;AACjG,MAAM,WAAW,KAAK;IACpB,OAAO,IAAI,MAAM,GAAG,SAAS,CAAA;CAC9B;AAED,yDAAyD;AACzD,MAAM,WAAW,OAAO;IACtB,aAAa,IAAI,UAAU,CAAA;CAC5B;AAED,qGAAqG;AACrG,MAAM,WAAW,UAAU;IACzB,UAAU,IAAI,OAAO,CAAA;CACtB;AAID;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,SAAS,KAAK,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC,CASxF;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,CAAC,SAAS,KAAK,EAAE,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC,CAQlF;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,CAAC,SAAS,KAAK,EAAE,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC,CAQhF;AAID;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,CAAC,SAAS,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC,CAkB1E;AAED;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,CAAC,SAAS,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC,CA2B5E;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC,UAAU,CAAC,CAcpE;AAID;;GAEG;AACH,wBAAgB,WAAW,CAAC,CAAC,SAAS,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,CAKhE;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,CAAC,SAAS,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,CAKnE"}
@@ -1,4 +1,6 @@
1
1
  import picomatch from 'picomatch';
2
+ import { globNode } from '@nielspeter/eess';
3
+ import { isProjectRelative, relativeToRoot } from '../core/project-relative.js';
2
4
  // --- Name predicates ---
3
5
  /**
4
6
  * Matches elements whose name matches the given pattern.
@@ -50,9 +52,23 @@ export function haveNameEndingWith(suffix) {
50
52
  */
51
53
  export function resideInFile(glob) {
52
54
  const isMatch = picomatch(glob);
55
+ const relative = isProjectRelative(glob);
53
56
  return {
57
+ // `base: 'normalized'` when the glob is project-relative — the anchor check
58
+ // in `syntacticFault` calls an unanchored glob dead against absolute paths,
59
+ // and it stops being dead exactly when it starts working (plan 0067 C).
60
+ globs: globNode({ glob, kind: 'file-path', base: relative ? 'normalized' : 'absolute' }),
54
61
  description: `reside in file matching "${glob}"`,
55
- test: (element) => isMatch(element.getSourceFile().getFilePath()),
62
+ test: (element) => {
63
+ const sourceFile = element.getSourceFile();
64
+ const filePath = sourceFile.getFilePath();
65
+ if (isMatch(filePath))
66
+ return true;
67
+ if (!relative)
68
+ return false;
69
+ const fromRoot = relativeToRoot(sourceFile, filePath);
70
+ return fromRoot !== undefined && isMatch(fromRoot);
71
+ },
56
72
  };
57
73
  }
58
74
  /**
@@ -65,12 +81,68 @@ export function resideInFile(glob) {
65
81
  */
66
82
  export function resideInFolder(glob) {
67
83
  const isMatch = picomatch(glob);
84
+ const relative = isProjectRelative(glob);
68
85
  return {
86
+ // `parent-dir`, not `file-path`: the test below reads the directory
87
+ // portion, so this glob is matched against the immediate parent and
88
+ // nothing else. It is the only selector in src/ that does.
89
+ globs: globNode({
90
+ glob,
91
+ kind: 'parent-dir',
92
+ base: relative ? 'normalized' : 'absolute',
93
+ }),
69
94
  description: `reside in folder matching "${glob}"`,
70
95
  test: (element) => {
71
- const filePath = element.getSourceFile().getFilePath();
96
+ const sourceFile = element.getSourceFile();
97
+ const filePath = sourceFile.getFilePath();
72
98
  const dirPath = filePath.substring(0, filePath.lastIndexOf('/'));
73
- return isMatch(dirPath);
99
+ if (isMatch(dirPath))
100
+ return true;
101
+ // Project-relative: the same directory, named from the project root
102
+ // (plan 0067 C). `'src/domain/**'` means that folder AT THE ROOT, which
103
+ // is narrower and more accurate than the `'**/src/domain/**'` the old
104
+ // advice prescribed.
105
+ if (!relative)
106
+ return false;
107
+ const fromRoot = relativeToRoot(sourceFile, dirPath);
108
+ return fromRoot !== undefined && isMatch(fromRoot);
109
+ },
110
+ };
111
+ }
112
+ /**
113
+ * Matches modules whose file path matches the given glob.
114
+ *
115
+ * Similar to resideInFile but semantically clearer for modules —
116
+ * "modules that have path matching" vs "elements that reside in file".
117
+ *
118
+ * Lives here, beside `resideInFile`/`resideInFolder`, rather than in
119
+ * `predicates/module.ts`: it is an **identity** predicate, and identity
120
+ * predicates are legitimately single-glob — you match one location pattern,
121
+ * not a blacklist. The `api/no-single-glob-predicates` dogfood rule bans
122
+ * single-glob predicates in `module.ts` precisely because a module predicate
123
+ * like `importFrom`/`notImportFrom` must be variadic, and it carved out
124
+ * identity predicates by name in a comment. Moving the function makes that
125
+ * carve-out the rule's own scope instead of a comment beside it — exclusion by
126
+ * construction (ADR-009 rule 3). No public API change: `src/index.ts`
127
+ * re-exports it under the same name, and there is no `./predicates` subpath.
128
+ *
129
+ * @example
130
+ * modules(p).that().havePathMatching('** /services/*.ts')
131
+ */
132
+ export function havePathMatching(glob) {
133
+ const isMatch = picomatch(glob);
134
+ const relative = isProjectRelative(glob);
135
+ return {
136
+ globs: globNode({ glob, kind: 'file-path', base: relative ? 'normalized' : 'absolute' }),
137
+ description: `have path matching "${glob}"`,
138
+ test: (sourceFile) => {
139
+ const filePath = sourceFile.getFilePath();
140
+ if (isMatch(filePath))
141
+ return true;
142
+ if (!relative)
143
+ return false;
144
+ const fromRoot = relativeToRoot(sourceFile, filePath);
145
+ return fromRoot !== undefined && isMatch(fromRoot);
74
146
  },
75
147
  };
76
148
  }
@@ -1 +1 @@
1
- {"version":3,"file":"identity.js","sourceRoot":"","sources":["../../src/predicates/identity.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,WAAW,CAAA;AAmBjC,0BAA0B;AAE1B;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAAkB,OAAwB;IACxE,MAAM,KAAK,GAAG,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAA;IACzE,OAAO;QACL,WAAW,EAAE,sBAAsB,MAAM,CAAC,KAAK,CAAC,EAAE;QAClD,IAAI,EAAE,CAAC,OAAO,EAAE,EAAE;YAChB,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,EAAE,CAAA;YAC9B,OAAO,IAAI,KAAK,SAAS,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAC/C,CAAC;KACF,CAAA;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAkB,MAAc;IAClE,OAAO;QACL,WAAW,EAAE,4BAA4B,MAAM,GAAG;QAClD,IAAI,EAAE,CAAC,OAAO,EAAE,EAAE;YAChB,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,EAAE,CAAA;YAC9B,OAAO,IAAI,EAAE,UAAU,CAAC,MAAM,CAAC,IAAI,KAAK,CAAA;QAC1C,CAAC;KACF,CAAA;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAkB,MAAc;IAChE,OAAO;QACL,WAAW,EAAE,0BAA0B,MAAM,GAAG;QAChD,IAAI,EAAE,CAAC,OAAO,EAAE,EAAE;YAChB,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,EAAE,CAAA;YAC9B,OAAO,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,IAAI,KAAK,CAAA;QACxC,CAAC;KACF,CAAA;AACH,CAAC;AAED,mCAAmC;AAEnC;;;;;;;GAOG;AACH,MAAM,UAAU,YAAY,CAAoB,IAAY;IAC1D,MAAM,OAAO,GAAG,SAAS,CAAC,IAAI,CAAC,CAAA;IAC/B,OAAO;QACL,WAAW,EAAE,4BAA4B,IAAI,GAAG;QAChD,IAAI,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC,WAAW,EAAE,CAAC;KAClE,CAAA;AACH,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,cAAc,CAAoB,IAAY;IAC5D,MAAM,OAAO,GAAG,SAAS,CAAC,IAAI,CAAC,CAAA;IAC/B,OAAO;QACL,WAAW,EAAE,8BAA8B,IAAI,GAAG;QAClD,IAAI,EAAE,CAAC,OAAO,EAAE,EAAE;YAChB,MAAM,QAAQ,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,WAAW,EAAE,CAAA;YACtD,MAAM,OAAO,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC,EAAE,QAAQ,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAA;YAChE,OAAO,OAAO,CAAC,OAAO,CAAC,CAAA;QACzB,CAAC;KACF,CAAA;AACH,CAAC;AAED,4BAA4B;AAE5B;;GAEG;AACH,MAAM,UAAU,WAAW;IACzB,OAAO;QACL,WAAW,EAAE,cAAc;QAC3B,IAAI,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,UAAU,EAAE;KACxC,CAAA;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc;IAC5B,OAAO;QACL,WAAW,EAAE,kBAAkB;QAC/B,IAAI,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE;KACzC,CAAA;AACH,CAAC"}
1
+ {"version":3,"file":"identity.js","sourceRoot":"","sources":["../../src/predicates/identity.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,WAAW,CAAA;AAGjC,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAC3C,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAA;AAiB/E,0BAA0B;AAE1B;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAAkB,OAAwB;IACxE,MAAM,KAAK,GAAG,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAA;IACzE,OAAO;QACL,WAAW,EAAE,sBAAsB,MAAM,CAAC,KAAK,CAAC,EAAE;QAClD,IAAI,EAAE,CAAC,OAAO,EAAE,EAAE;YAChB,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,EAAE,CAAA;YAC9B,OAAO,IAAI,KAAK,SAAS,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAC/C,CAAC;KACF,CAAA;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAkB,MAAc;IAClE,OAAO;QACL,WAAW,EAAE,4BAA4B,MAAM,GAAG;QAClD,IAAI,EAAE,CAAC,OAAO,EAAE,EAAE;YAChB,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,EAAE,CAAA;YAC9B,OAAO,IAAI,EAAE,UAAU,CAAC,MAAM,CAAC,IAAI,KAAK,CAAA;QAC1C,CAAC;KACF,CAAA;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAkB,MAAc;IAChE,OAAO;QACL,WAAW,EAAE,0BAA0B,MAAM,GAAG;QAChD,IAAI,EAAE,CAAC,OAAO,EAAE,EAAE;YAChB,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,EAAE,CAAA;YAC9B,OAAO,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,IAAI,KAAK,CAAA;QACxC,CAAC;KACF,CAAA;AACH,CAAC;AAED,mCAAmC;AAEnC;;;;;;;GAOG;AACH,MAAM,UAAU,YAAY,CAAoB,IAAY;IAC1D,MAAM,OAAO,GAAG,SAAS,CAAC,IAAI,CAAC,CAAA;IAC/B,MAAM,QAAQ,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAA;IACxC,OAAO;QACL,4EAA4E;QAC5E,4EAA4E;QAC5E,wEAAwE;QACxE,KAAK,EAAE,QAAQ,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC;QACxF,WAAW,EAAE,4BAA4B,IAAI,GAAG;QAChD,IAAI,EAAE,CAAC,OAAO,EAAE,EAAE;YAChB,MAAM,UAAU,GAAG,OAAO,CAAC,aAAa,EAAE,CAAA;YAC1C,MAAM,QAAQ,GAAG,UAAU,CAAC,WAAW,EAAE,CAAA;YACzC,IAAI,OAAO,CAAC,QAAQ,CAAC;gBAAE,OAAO,IAAI,CAAA;YAClC,IAAI,CAAC,QAAQ;gBAAE,OAAO,KAAK,CAAA;YAC3B,MAAM,QAAQ,GAAG,cAAc,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAA;YACrD,OAAO,QAAQ,KAAK,SAAS,IAAI,OAAO,CAAC,QAAQ,CAAC,CAAA;QACpD,CAAC;KACF,CAAA;AACH,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,cAAc,CAAoB,IAAY;IAC5D,MAAM,OAAO,GAAG,SAAS,CAAC,IAAI,CAAC,CAAA;IAC/B,MAAM,QAAQ,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAA;IACxC,OAAO;QACL,oEAAoE;QACpE,oEAAoE;QACpE,2DAA2D;QAC3D,KAAK,EAAE,QAAQ,CAAC;YACd,IAAI;YACJ,IAAI,EAAE,YAAY;YAClB,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,UAAU;SAC3C,CAAC;QACF,WAAW,EAAE,8BAA8B,IAAI,GAAG;QAClD,IAAI,EAAE,CAAC,OAAO,EAAE,EAAE;YAChB,MAAM,UAAU,GAAG,OAAO,CAAC,aAAa,EAAE,CAAA;YAC1C,MAAM,QAAQ,GAAG,UAAU,CAAC,WAAW,EAAE,CAAA;YACzC,MAAM,OAAO,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC,EAAE,QAAQ,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAA;YAChE,IAAI,OAAO,CAAC,OAAO,CAAC;gBAAE,OAAO,IAAI,CAAA;YACjC,oEAAoE;YACpE,wEAAwE;YACxE,sEAAsE;YACtE,qBAAqB;YACrB,IAAI,CAAC,QAAQ;gBAAE,OAAO,KAAK,CAAA;YAC3B,MAAM,QAAQ,GAAG,cAAc,CAAC,UAAU,EAAE,OAAO,CAAC,CAAA;YACpD,OAAO,QAAQ,KAAK,SAAS,IAAI,OAAO,CAAC,QAAQ,CAAC,CAAA;QACpD,CAAC;KACF,CAAA;AACH,CAAC;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAY;IAC3C,MAAM,OAAO,GAAG,SAAS,CAAC,IAAI,CAAC,CAAA;IAC/B,MAAM,QAAQ,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAA;IACxC,OAAO;QACL,KAAK,EAAE,QAAQ,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC;QACxF,WAAW,EAAE,uBAAuB,IAAI,GAAG;QAC3C,IAAI,EAAE,CAAC,UAAU,EAAE,EAAE;YACnB,MAAM,QAAQ,GAAG,UAAU,CAAC,WAAW,EAAE,CAAA;YACzC,IAAI,OAAO,CAAC,QAAQ,CAAC;gBAAE,OAAO,IAAI,CAAA;YAClC,IAAI,CAAC,QAAQ;gBAAE,OAAO,KAAK,CAAA;YAC3B,MAAM,QAAQ,GAAG,cAAc,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAA;YACrD,OAAO,QAAQ,KAAK,SAAS,IAAI,OAAO,CAAC,QAAQ,CAAC,CAAA;QACpD,CAAC;KACF,CAAA;AACH,CAAC;AAED,4BAA4B;AAE5B;;GAEG;AACH,MAAM,UAAU,WAAW;IACzB,OAAO;QACL,WAAW,EAAE,cAAc;QAC3B,IAAI,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,UAAU,EAAE;KACxC,CAAA;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc;IAC5B,OAAO;QACL,WAAW,EAAE,kBAAkB;QAC/B,IAAI,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE;KACzC,CAAA;AACH,CAAC"}
@@ -1,4 +1,4 @@
1
1
  export type { Named, Located, Exportable } from './identity.js';
2
- export { haveNameMatching, haveNameStartingWith, haveNameEndingWith, resideInFile, resideInFolder, areExported, areNotExported, } from './identity.js';
2
+ export { haveNameMatching, haveNameStartingWith, haveNameEndingWith, resideInFile, resideInFolder, havePathMatching, areExported, areNotExported, } from './identity.js';
3
3
  export * as classPredicates from './class.js';
4
4
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/predicates/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAC/D,OAAO,EACL,gBAAgB,EAChB,oBAAoB,EACpB,kBAAkB,EAClB,YAAY,EACZ,cAAc,EACd,WAAW,EACX,cAAc,GACf,MAAM,eAAe,CAAA;AAEtB,OAAO,KAAK,eAAe,MAAM,YAAY,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/predicates/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAC/D,OAAO,EACL,gBAAgB,EAChB,oBAAoB,EACpB,kBAAkB,EAClB,YAAY,EACZ,cAAc,EACd,gBAAgB,EAChB,WAAW,EACX,cAAc,GACf,MAAM,eAAe,CAAA;AAEtB,OAAO,KAAK,eAAe,MAAM,YAAY,CAAA"}
@@ -1,3 +1,3 @@
1
- export { haveNameMatching, haveNameStartingWith, haveNameEndingWith, resideInFile, resideInFolder, areExported, areNotExported, } from './identity.js';
1
+ export { haveNameMatching, haveNameStartingWith, haveNameEndingWith, resideInFile, resideInFolder, havePathMatching, areExported, areNotExported, } from './identity.js';
2
2
  export * as classPredicates from './class.js';
3
3
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/predicates/index.ts"],"names":[],"mappings":"AACA,OAAO,EACL,gBAAgB,EAChB,oBAAoB,EACpB,kBAAkB,EAClB,YAAY,EACZ,cAAc,EACd,WAAW,EACX,cAAc,GACf,MAAM,eAAe,CAAA;AAEtB,OAAO,KAAK,eAAe,MAAM,YAAY,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/predicates/index.ts"],"names":[],"mappings":"AACA,OAAO,EACL,gBAAgB,EAChB,oBAAoB,EACpB,kBAAkB,EAClB,YAAY,EACZ,cAAc,EACd,gBAAgB,EAChB,WAAW,EACX,cAAc,GACf,MAAM,eAAe,CAAA;AAEtB,OAAO,KAAK,eAAe,MAAM,YAAY,CAAA"}
@@ -16,11 +16,13 @@ export declare function haveComplexity(opts: {
16
16
  greaterThan: number;
17
17
  }): Predicate<ArchFunction>;
18
18
  /**
19
- * Predicate: class has more than N lines of code (span lines).
19
+ * Predicate: class has more than N lines of code — comments and blank lines
20
+ * excluded (bug 0170).
20
21
  */
21
22
  export declare function haveMoreLinesThan(threshold: number): Predicate<ClassDeclaration>;
22
23
  /**
23
- * Predicate: function has more than N lines of code (span lines).
24
+ * Predicate: function has more than N lines of code — comments and blank lines
25
+ * excluded (bug 0170).
24
26
  */
25
27
  export declare function haveMoreFunctionLinesThan(threshold: number): Predicate<ArchFunction>;
26
28
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"metrics.d.ts","sourceRoot":"","sources":["../../src/predicates/metrics.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAA;AAChD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AACjD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAA;AAG9D;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE;IAC7C,WAAW,EAAE,MAAM,CAAA;CACpB,GAAG,SAAS,CAAC,gBAAgB,CAAC,CAa9B;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE;IAAE,WAAW,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAAC,YAAY,CAAC,CAOrF;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC,gBAAgB,CAAC,CAOhF;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC,YAAY,CAAC,CAOpF;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC,gBAAgB,CAAC,CAOlF"}
1
+ {"version":3,"file":"metrics.d.ts","sourceRoot":"","sources":["../../src/predicates/metrics.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAA;AAChD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AACjD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAA;AAG9D;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE;IAC7C,WAAW,EAAE,MAAM,CAAA;CACpB,GAAG,SAAS,CAAC,gBAAgB,CAAC,CAa9B;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE;IAAE,WAAW,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAAC,YAAY,CAAC,CAOrF;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC,gBAAgB,CAAC,CAOhF;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC,YAAY,CAAC,CAOpF;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC,gBAAgB,CAAC,CAOlF"}
@@ -30,7 +30,8 @@ export function haveComplexity(opts) {
30
30
  };
31
31
  }
32
32
  /**
33
- * Predicate: class has more than N lines of code (span lines).
33
+ * Predicate: class has more than N lines of code — comments and blank lines
34
+ * excluded (bug 0170).
34
35
  */
35
36
  export function haveMoreLinesThan(threshold) {
36
37
  return {
@@ -41,7 +42,8 @@ export function haveMoreLinesThan(threshold) {
41
42
  };
42
43
  }
43
44
  /**
44
- * Predicate: function has more than N lines of code (span lines).
45
+ * Predicate: function has more than N lines of code — comments and blank lines
46
+ * excluded (bug 0170).
45
47
  */
46
48
  export function haveMoreFunctionLinesThan(threshold) {
47
49
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"metrics.js","sourceRoot":"","sources":["../../src/predicates/metrics.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,oBAAoB,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAA;AAEzF;;;GAGG;AACH,MAAM,UAAU,wBAAwB,CAAC,IAExC;IACC,OAAO;QACL,WAAW,EAAE,8CAA8C,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE;QACrF,IAAI,CAAC,GAAqB;YACxB,MAAM,MAAM,GAAG;gBACb,GAAG,GAAG,CAAC,UAAU,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;gBAC3C,GAAG,GAAG,CAAC,eAAe,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;gBAChD,GAAG,GAAG,CAAC,eAAe,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;gBAChD,GAAG,GAAG,CAAC,eAAe,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;aACjD,CAAA;YACD,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,oBAAoB,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,CAAA;QAC7E,CAAC;KACF,CAAA;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,IAA6B;IAC1D,OAAO;QACL,WAAW,EAAE,gCAAgC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE;QACvE,IAAI,CAAC,EAAgB;YACnB,OAAO,oBAAoB,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,IAAI,CAAC,WAAW,CAAA;QAC9D,CAAC;KACF,CAAA;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,SAAiB;IACjD,OAAO;QACL,WAAW,EAAE,kBAAkB,MAAM,CAAC,SAAS,CAAC,QAAQ;QACxD,IAAI,CAAC,GAAqB;YACxB,OAAO,WAAW,CAAC,GAAG,CAAC,GAAG,SAAS,CAAA;QACrC,CAAC;KACF,CAAA;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,yBAAyB,CAAC,SAAiB;IACzD,OAAO;QACL,WAAW,EAAE,kBAAkB,MAAM,CAAC,SAAS,CAAC,QAAQ;QACxD,IAAI,CAAC,EAAgB;YACnB,OAAO,WAAW,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,SAAS,CAAA;QAC9C,CAAC;KACF,CAAA;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,SAAiB;IACnD,OAAO;QACL,WAAW,EAAE,kBAAkB,MAAM,CAAC,SAAS,CAAC,UAAU;QAC1D,IAAI,CAAC,GAAqB;YACxB,OAAO,WAAW,CAAC,GAAG,CAAC,GAAG,SAAS,CAAA;QACrC,CAAC;KACF,CAAA;AACH,CAAC"}
1
+ {"version":3,"file":"metrics.js","sourceRoot":"","sources":["../../src/predicates/metrics.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,oBAAoB,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAA;AAEzF;;;GAGG;AACH,MAAM,UAAU,wBAAwB,CAAC,IAExC;IACC,OAAO;QACL,WAAW,EAAE,8CAA8C,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE;QACrF,IAAI,CAAC,GAAqB;YACxB,MAAM,MAAM,GAAG;gBACb,GAAG,GAAG,CAAC,UAAU,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;gBAC3C,GAAG,GAAG,CAAC,eAAe,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;gBAChD,GAAG,GAAG,CAAC,eAAe,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;gBAChD,GAAG,GAAG,CAAC,eAAe,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;aACjD,CAAA;YACD,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,oBAAoB,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,CAAA;QAC7E,CAAC;KACF,CAAA;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,IAA6B;IAC1D,OAAO;QACL,WAAW,EAAE,gCAAgC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE;QACvE,IAAI,CAAC,EAAgB;YACnB,OAAO,oBAAoB,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,IAAI,CAAC,WAAW,CAAA;QAC9D,CAAC;KACF,CAAA;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,SAAiB;IACjD,OAAO;QACL,WAAW,EAAE,kBAAkB,MAAM,CAAC,SAAS,CAAC,QAAQ;QACxD,IAAI,CAAC,GAAqB;YACxB,OAAO,WAAW,CAAC,GAAG,CAAC,GAAG,SAAS,CAAA;QACrC,CAAC;KACF,CAAA;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,yBAAyB,CAAC,SAAiB;IACzD,OAAO;QACL,WAAW,EAAE,kBAAkB,MAAM,CAAC,SAAS,CAAC,QAAQ;QACxD,IAAI,CAAC,EAAgB;YACnB,OAAO,WAAW,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,SAAS,CAAA;QAC9C,CAAC;KACF,CAAA;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,SAAiB;IACnD,OAAO;QACL,WAAW,EAAE,kBAAkB,MAAM,CAAC,SAAS,CAAC,UAAU;QAC1D,IAAI,CAAC,GAAqB;YACxB,OAAO,WAAW,CAAC,GAAG,CAAC,GAAG,SAAS,CAAA;QACrC,CAAC;KACF,CAAA;AACH,CAAC"}
@@ -4,8 +4,10 @@ import type { ImportOptions } from '../core/import-options.js';
4
4
  /**
5
5
  * Matches modules that import from a path matching any of the given globs.
6
6
  *
7
- * The globs are matched against resolved absolute import paths.
8
- * For external (non-resolvable) imports, they match against the raw specifier.
7
+ * Each import contributes the resolved absolute path **and**, when the
8
+ * specifier is non-relative, the specifier as written; a glob matches the
9
+ * import if it matches either. So a bare package name works whether or not the
10
+ * package is installed. See `importCandidates` for why.
9
11
  *
10
12
  * @example
11
13
  * modules(p).that().importFrom('** /infrastructure/**')
@@ -31,14 +33,4 @@ export declare function notImportFrom(...globs: string[]): Predicate<SourceFile>
31
33
  * modules(p).that().exportSymbolNamed('default')
32
34
  */
33
35
  export declare function exportSymbolNamed(name: string): Predicate<SourceFile>;
34
- /**
35
- * Matches modules whose file path matches the given glob.
36
- *
37
- * Similar to resideInFile but semantically clearer for modules —
38
- * "modules that have path matching" vs "elements that reside in file".
39
- *
40
- * @example
41
- * modules(p).that().havePathMatching('** /services/*.ts')
42
- */
43
- export declare function havePathMatching(glob: string): Predicate<SourceFile>;
44
36
  //# sourceMappingURL=module.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"module.d.ts","sourceRoot":"","sources":["../../src/predicates/module.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AAC1C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AACjD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAA;AAmB9D;;;;;;;;;GASG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,aAAa,GAAG,SAAS,CAAC,UAAU,CAAC,CAAA;AAC1F,wBAAgB,UAAU,CAAC,GAAG,KAAK,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC,UAAU,CAAC,CAAA;AAgBrE;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,aAAa,GAAG,SAAS,CAAC,UAAU,CAAC,CAAA;AAC7F,wBAAgB,aAAa,CAAC,GAAG,KAAK,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC,UAAU,CAAC,CAAA;AAkBxE;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC,UAAU,CAAC,CAKrE;AAED;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC,UAAU,CAAC,CAMpE"}
1
+ {"version":3,"file":"module.d.ts","sourceRoot":"","sources":["../../src/predicates/module.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AAC1C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAEjD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAA;AAsD9D;;;;;;;;;;;GAWG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,aAAa,GAAG,SAAS,CAAC,UAAU,CAAC,CAAA;AAC1F,wBAAgB,UAAU,CAAC,GAAG,KAAK,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC,UAAU,CAAC,CAAA;AAarE;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,aAAa,GAAG,SAAS,CAAC,UAAU,CAAC,CAAA;AAC7F,wBAAgB,aAAa,CAAC,GAAG,KAAK,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC,UAAU,CAAC,CAAA;AAkBxE;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC,UAAU,CAAC,CAKrE"}