@nielspeter/eess-ts 0.1.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 (371) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +364 -0
  3. package/dist/builders/call-rule-builder.d.ts +199 -0
  4. package/dist/builders/call-rule-builder.d.ts.map +1 -0
  5. package/dist/builders/call-rule-builder.js +254 -0
  6. package/dist/builders/call-rule-builder.js.map +1 -0
  7. package/dist/builders/class-rule-builder.d.ts +136 -0
  8. package/dist/builders/class-rule-builder.d.ts.map +1 -0
  9. package/dist/builders/class-rule-builder.js +253 -0
  10. package/dist/builders/class-rule-builder.js.map +1 -0
  11. package/dist/builders/cross-layer-builder.d.ts +96 -0
  12. package/dist/builders/cross-layer-builder.d.ts.map +1 -0
  13. package/dist/builders/cross-layer-builder.js +172 -0
  14. package/dist/builders/cross-layer-builder.js.map +1 -0
  15. package/dist/builders/function-rule-builder.d.ts +198 -0
  16. package/dist/builders/function-rule-builder.d.ts.map +1 -0
  17. package/dist/builders/function-rule-builder.js +287 -0
  18. package/dist/builders/function-rule-builder.js.map +1 -0
  19. package/dist/builders/jsx-rule-builder.d.ts +113 -0
  20. package/dist/builders/jsx-rule-builder.d.ts.map +1 -0
  21. package/dist/builders/jsx-rule-builder.js +150 -0
  22. package/dist/builders/jsx-rule-builder.js.map +1 -0
  23. package/dist/builders/module-rule-builder.d.ts +159 -0
  24. package/dist/builders/module-rule-builder.d.ts.map +1 -0
  25. package/dist/builders/module-rule-builder.js +237 -0
  26. package/dist/builders/module-rule-builder.js.map +1 -0
  27. package/dist/builders/scoped-function-rule-builder.d.ts +21 -0
  28. package/dist/builders/scoped-function-rule-builder.d.ts.map +1 -0
  29. package/dist/builders/scoped-function-rule-builder.js +26 -0
  30. package/dist/builders/scoped-function-rule-builder.js.map +1 -0
  31. package/dist/builders/slice-rule-builder.d.ts +85 -0
  32. package/dist/builders/slice-rule-builder.d.ts.map +1 -0
  33. package/dist/builders/slice-rule-builder.js +134 -0
  34. package/dist/builders/slice-rule-builder.js.map +1 -0
  35. package/dist/builders/type-rule-builder.d.ts +103 -0
  36. package/dist/builders/type-rule-builder.d.ts.map +1 -0
  37. package/dist/builders/type-rule-builder.js +170 -0
  38. package/dist/builders/type-rule-builder.js.map +1 -0
  39. package/dist/cli/bin.d.ts +3 -0
  40. package/dist/cli/bin.d.ts.map +1 -0
  41. package/dist/cli/bin.js +4 -0
  42. package/dist/cli/bin.js.map +1 -0
  43. package/dist/cli/commands/baseline.d.ts +11 -0
  44. package/dist/cli/commands/baseline.d.ts.map +1 -0
  45. package/dist/cli/commands/baseline.js +16 -0
  46. package/dist/cli/commands/baseline.js.map +1 -0
  47. package/dist/cli/commands/check.d.ts +21 -0
  48. package/dist/cli/commands/check.d.ts.map +1 -0
  49. package/dist/cli/commands/check.js +94 -0
  50. package/dist/cli/commands/check.js.map +1 -0
  51. package/dist/cli/commands/explain.d.ts +9 -0
  52. package/dist/cli/commands/explain.d.ts.map +1 -0
  53. package/dist/cli/commands/explain.js +49 -0
  54. package/dist/cli/commands/explain.js.map +1 -0
  55. package/dist/cli/config.d.ts +31 -0
  56. package/dist/cli/config.d.ts.map +1 -0
  57. package/dist/cli/config.js +20 -0
  58. package/dist/cli/config.js.map +1 -0
  59. package/dist/cli/index.d.ts +21 -0
  60. package/dist/cli/index.d.ts.map +1 -0
  61. package/dist/cli/index.js +168 -0
  62. package/dist/cli/index.js.map +1 -0
  63. package/dist/cli/load-rules.d.ts +20 -0
  64. package/dist/cli/load-rules.d.ts.map +1 -0
  65. package/dist/cli/load-rules.js +97 -0
  66. package/dist/cli/load-rules.js.map +1 -0
  67. package/dist/cli/resolve-config.d.ts +11 -0
  68. package/dist/cli/resolve-config.d.ts.map +1 -0
  69. package/dist/cli/resolve-config.js +61 -0
  70. package/dist/cli/resolve-config.js.map +1 -0
  71. package/dist/cli/watch.d.ts +49 -0
  72. package/dist/cli/watch.d.ts.map +1 -0
  73. package/dist/cli/watch.js +138 -0
  74. package/dist/cli/watch.js.map +1 -0
  75. package/dist/conditions/body-analysis-function.d.ts +23 -0
  76. package/dist/conditions/body-analysis-function.d.ts.map +1 -0
  77. package/dist/conditions/body-analysis-function.js +103 -0
  78. package/dist/conditions/body-analysis-function.js.map +1 -0
  79. package/dist/conditions/body-analysis-module.d.ts +27 -0
  80. package/dist/conditions/body-analysis-module.d.ts.map +1 -0
  81. package/dist/conditions/body-analysis-module.js +99 -0
  82. package/dist/conditions/body-analysis-module.js.map +1 -0
  83. package/dist/conditions/body-analysis.d.ts +34 -0
  84. package/dist/conditions/body-analysis.d.ts.map +1 -0
  85. package/dist/conditions/body-analysis.js +95 -0
  86. package/dist/conditions/body-analysis.js.map +1 -0
  87. package/dist/conditions/call.d.ts +62 -0
  88. package/dist/conditions/call.d.ts.map +1 -0
  89. package/dist/conditions/call.js +267 -0
  90. package/dist/conditions/call.js.map +1 -0
  91. package/dist/conditions/catch-analysis.d.ts +31 -0
  92. package/dist/conditions/catch-analysis.d.ts.map +1 -0
  93. package/dist/conditions/catch-analysis.js +78 -0
  94. package/dist/conditions/catch-analysis.js.map +1 -0
  95. package/dist/conditions/class.d.ts +33 -0
  96. package/dist/conditions/class.d.ts.map +1 -0
  97. package/dist/conditions/class.js +110 -0
  98. package/dist/conditions/class.js.map +1 -0
  99. package/dist/conditions/cross-layer.d.ts +28 -0
  100. package/dist/conditions/cross-layer.d.ts.map +1 -0
  101. package/dist/conditions/cross-layer.js +105 -0
  102. package/dist/conditions/cross-layer.js.map +1 -0
  103. package/dist/conditions/dependency.d.ts +73 -0
  104. package/dist/conditions/dependency.d.ts.map +1 -0
  105. package/dist/conditions/dependency.js +177 -0
  106. package/dist/conditions/dependency.js.map +1 -0
  107. package/dist/conditions/exports.d.ts +33 -0
  108. package/dist/conditions/exports.d.ts.map +1 -0
  109. package/dist/conditions/exports.js +101 -0
  110. package/dist/conditions/exports.js.map +1 -0
  111. package/dist/conditions/function.d.ts +79 -0
  112. package/dist/conditions/function.d.ts.map +1 -0
  113. package/dist/conditions/function.js +167 -0
  114. package/dist/conditions/function.js.map +1 -0
  115. package/dist/conditions/helpers.d.ts +14 -0
  116. package/dist/conditions/helpers.d.ts.map +1 -0
  117. package/dist/conditions/helpers.js +26 -0
  118. package/dist/conditions/helpers.js.map +1 -0
  119. package/dist/conditions/jsx.d.ts +40 -0
  120. package/dist/conditions/jsx.d.ts.map +1 -0
  121. package/dist/conditions/jsx.js +133 -0
  122. package/dist/conditions/jsx.js.map +1 -0
  123. package/dist/conditions/members.d.ts +74 -0
  124. package/dist/conditions/members.d.ts.map +1 -0
  125. package/dist/conditions/members.js +224 -0
  126. package/dist/conditions/members.js.map +1 -0
  127. package/dist/conditions/pattern.d.ts +20 -0
  128. package/dist/conditions/pattern.d.ts.map +1 -0
  129. package/dist/conditions/pattern.js +108 -0
  130. package/dist/conditions/pattern.js.map +1 -0
  131. package/dist/conditions/reverse-dependency.d.ts +28 -0
  132. package/dist/conditions/reverse-dependency.d.ts.map +1 -0
  133. package/dist/conditions/reverse-dependency.js +275 -0
  134. package/dist/conditions/reverse-dependency.js.map +1 -0
  135. package/dist/conditions/slice.d.ts +49 -0
  136. package/dist/conditions/slice.d.ts.map +1 -0
  137. package/dist/conditions/slice.js +153 -0
  138. package/dist/conditions/slice.js.map +1 -0
  139. package/dist/conditions/structural.d.ts +58 -0
  140. package/dist/conditions/structural.d.ts.map +1 -0
  141. package/dist/conditions/structural.js +102 -0
  142. package/dist/conditions/structural.js.map +1 -0
  143. package/dist/conditions/type-level.d.ts +29 -0
  144. package/dist/conditions/type-level.d.ts.map +1 -0
  145. package/dist/conditions/type-level.js +48 -0
  146. package/dist/conditions/type-level.js.map +1 -0
  147. package/dist/core/import-options.d.ts +32 -0
  148. package/dist/core/import-options.d.ts.map +1 -0
  149. package/dist/core/import-options.js +29 -0
  150. package/dist/core/import-options.js.map +1 -0
  151. package/dist/core/module-dependencies.d.ts +28 -0
  152. package/dist/core/module-dependencies.d.ts.map +1 -0
  153. package/dist/core/module-dependencies.js +35 -0
  154. package/dist/core/module-dependencies.js.map +1 -0
  155. package/dist/core/pair-condition.d.ts +10 -0
  156. package/dist/core/pair-condition.d.ts.map +1 -0
  157. package/dist/core/pair-condition.js +2 -0
  158. package/dist/core/pair-condition.js.map +1 -0
  159. package/dist/core/project.d.ts +68 -0
  160. package/dist/core/project.d.ts.map +1 -0
  161. package/dist/core/project.js +127 -0
  162. package/dist/core/project.js.map +1 -0
  163. package/dist/core/type-matcher.d.ts +10 -0
  164. package/dist/core/type-matcher.d.ts.map +1 -0
  165. package/dist/core/type-matcher.js +2 -0
  166. package/dist/core/type-matcher.js.map +1 -0
  167. package/dist/core/violation.d.ts +38 -0
  168. package/dist/core/violation.d.ts.map +1 -0
  169. package/dist/core/violation.js +130 -0
  170. package/dist/core/violation.js.map +1 -0
  171. package/dist/graphql/index.d.ts +76 -0
  172. package/dist/graphql/index.d.ts.map +1 -0
  173. package/dist/graphql/index.js +108 -0
  174. package/dist/graphql/index.js.map +1 -0
  175. package/dist/graphql/resolver-rule-builder.d.ts +75 -0
  176. package/dist/graphql/resolver-rule-builder.d.ts.map +1 -0
  177. package/dist/graphql/resolver-rule-builder.js +146 -0
  178. package/dist/graphql/resolver-rule-builder.js.map +1 -0
  179. package/dist/graphql/schema-conditions.d.ts +31 -0
  180. package/dist/graphql/schema-conditions.d.ts.map +1 -0
  181. package/dist/graphql/schema-conditions.js +119 -0
  182. package/dist/graphql/schema-conditions.js.map +1 -0
  183. package/dist/graphql/schema-loader.d.ts +75 -0
  184. package/dist/graphql/schema-loader.d.ts.map +1 -0
  185. package/dist/graphql/schema-loader.js +113 -0
  186. package/dist/graphql/schema-loader.js.map +1 -0
  187. package/dist/graphql/schema-predicates.d.ts +42 -0
  188. package/dist/graphql/schema-predicates.d.ts.map +1 -0
  189. package/dist/graphql/schema-predicates.js +74 -0
  190. package/dist/graphql/schema-predicates.js.map +1 -0
  191. package/dist/graphql/schema-rule-builder.d.ts +74 -0
  192. package/dist/graphql/schema-rule-builder.d.ts.map +1 -0
  193. package/dist/graphql/schema-rule-builder.js +188 -0
  194. package/dist/graphql/schema-rule-builder.js.map +1 -0
  195. package/dist/helpers/body-traversal.d.ts +58 -0
  196. package/dist/helpers/body-traversal.d.ts.map +1 -0
  197. package/dist/helpers/body-traversal.js +180 -0
  198. package/dist/helpers/body-traversal.js.map +1 -0
  199. package/dist/helpers/callback-extractor.d.ts +28 -0
  200. package/dist/helpers/callback-extractor.d.ts.map +1 -0
  201. package/dist/helpers/callback-extractor.js +159 -0
  202. package/dist/helpers/callback-extractor.js.map +1 -0
  203. package/dist/helpers/complexity.d.ts +26 -0
  204. package/dist/helpers/complexity.d.ts.map +1 -0
  205. package/dist/helpers/complexity.js +64 -0
  206. package/dist/helpers/complexity.js.map +1 -0
  207. package/dist/helpers/matchers.d.ts +206 -0
  208. package/dist/helpers/matchers.d.ts.map +1 -0
  209. package/dist/helpers/matchers.js +470 -0
  210. package/dist/helpers/matchers.js.map +1 -0
  211. package/dist/helpers/pattern.d.ts +37 -0
  212. package/dist/helpers/pattern.d.ts.map +1 -0
  213. package/dist/helpers/pattern.js +22 -0
  214. package/dist/helpers/pattern.js.map +1 -0
  215. package/dist/helpers/slice-graph.d.ts +32 -0
  216. package/dist/helpers/slice-graph.d.ts.map +1 -0
  217. package/dist/helpers/slice-graph.js +89 -0
  218. package/dist/helpers/slice-graph.js.map +1 -0
  219. package/dist/helpers/tarjan.d.ts +21 -0
  220. package/dist/helpers/tarjan.d.ts.map +1 -0
  221. package/dist/helpers/tarjan.js +71 -0
  222. package/dist/helpers/tarjan.js.map +1 -0
  223. package/dist/helpers/type-matchers.d.ts +67 -0
  224. package/dist/helpers/type-matchers.d.ts.map +1 -0
  225. package/dist/helpers/type-matchers.js +108 -0
  226. package/dist/helpers/type-matchers.js.map +1 -0
  227. package/dist/helpers/within.d.ts +41 -0
  228. package/dist/helpers/within.d.ts.map +1 -0
  229. package/dist/helpers/within.js +32 -0
  230. package/dist/helpers/within.js.map +1 -0
  231. package/dist/index.d.ts +101 -0
  232. package/dist/index.d.ts.map +1 -0
  233. package/dist/index.js +116 -0
  234. package/dist/index.js.map +1 -0
  235. package/dist/models/arch-call.d.ts +83 -0
  236. package/dist/models/arch-call.d.ts.map +1 -0
  237. package/dist/models/arch-call.js +90 -0
  238. package/dist/models/arch-call.js.map +1 -0
  239. package/dist/models/arch-function.d.ts +76 -0
  240. package/dist/models/arch-function.d.ts.map +1 -0
  241. package/dist/models/arch-function.js +122 -0
  242. package/dist/models/arch-function.js.map +1 -0
  243. package/dist/models/arch-jsx-element.d.ts +75 -0
  244. package/dist/models/arch-jsx-element.d.ts.map +1 -0
  245. package/dist/models/arch-jsx-element.js +231 -0
  246. package/dist/models/arch-jsx-element.js.map +1 -0
  247. package/dist/models/cross-layer.d.ts +15 -0
  248. package/dist/models/cross-layer.d.ts.map +1 -0
  249. package/dist/models/cross-layer.js +2 -0
  250. package/dist/models/cross-layer.js.map +1 -0
  251. package/dist/models/slice.d.ts +60 -0
  252. package/dist/models/slice.d.ts.map +1 -0
  253. package/dist/models/slice.js +89 -0
  254. package/dist/models/slice.js.map +1 -0
  255. package/dist/predicates/call.d.ts +49 -0
  256. package/dist/predicates/call.d.ts.map +1 -0
  257. package/dist/predicates/call.js +115 -0
  258. package/dist/predicates/call.js.map +1 -0
  259. package/dist/predicates/class.d.ts +42 -0
  260. package/dist/predicates/class.d.ts.map +1 -0
  261. package/dist/predicates/class.js +83 -0
  262. package/dist/predicates/class.js.map +1 -0
  263. package/dist/predicates/function.d.ts +81 -0
  264. package/dist/predicates/function.d.ts.map +1 -0
  265. package/dist/predicates/function.js +157 -0
  266. package/dist/predicates/function.js.map +1 -0
  267. package/dist/predicates/identity.d.ts +55 -0
  268. package/dist/predicates/identity.d.ts.map +1 -0
  269. package/dist/predicates/identity.js +96 -0
  270. package/dist/predicates/identity.js.map +1 -0
  271. package/dist/predicates/index.d.ts +4 -0
  272. package/dist/predicates/index.d.ts.map +1 -0
  273. package/dist/predicates/index.js +3 -0
  274. package/dist/predicates/index.js.map +1 -0
  275. package/dist/predicates/jsx.d.ts +41 -0
  276. package/dist/predicates/jsx.d.ts.map +1 -0
  277. package/dist/predicates/jsx.js +84 -0
  278. package/dist/predicates/jsx.js.map +1 -0
  279. package/dist/predicates/metrics.d.ts +30 -0
  280. package/dist/predicates/metrics.d.ts.map +1 -0
  281. package/dist/predicates/metrics.js +65 -0
  282. package/dist/predicates/metrics.js.map +1 -0
  283. package/dist/predicates/module.d.ts +44 -0
  284. package/dist/predicates/module.d.ts.map +1 -0
  285. package/dist/predicates/module.js +70 -0
  286. package/dist/predicates/module.js.map +1 -0
  287. package/dist/predicates/type.d.ts +48 -0
  288. package/dist/predicates/type.d.ts.map +1 -0
  289. package/dist/predicates/type.js +107 -0
  290. package/dist/predicates/type.js.map +1 -0
  291. package/dist/presets/boundaries.d.ts +19 -0
  292. package/dist/presets/boundaries.d.ts.map +1 -0
  293. package/dist/presets/boundaries.js +93 -0
  294. package/dist/presets/boundaries.js.map +1 -0
  295. package/dist/presets/data-layer.d.ts +20 -0
  296. package/dist/presets/data-layer.d.ts.map +1 -0
  297. package/dist/presets/data-layer.js +30 -0
  298. package/dist/presets/data-layer.js.map +1 -0
  299. package/dist/presets/index.d.ts +9 -0
  300. package/dist/presets/index.d.ts.map +1 -0
  301. package/dist/presets/index.js +5 -0
  302. package/dist/presets/index.js.map +1 -0
  303. package/dist/presets/layered.d.ts +21 -0
  304. package/dist/presets/layered.d.ts.map +1 -0
  305. package/dist/presets/layered.js +103 -0
  306. package/dist/presets/layered.js.map +1 -0
  307. package/dist/presets/shared.d.ts +3 -0
  308. package/dist/presets/shared.d.ts.map +1 -0
  309. package/dist/presets/shared.js +5 -0
  310. package/dist/presets/shared.js.map +1 -0
  311. package/dist/rules/architecture.d.ts +10 -0
  312. package/dist/rules/architecture.d.ts.map +1 -0
  313. package/dist/rules/architecture.js +14 -0
  314. package/dist/rules/architecture.js.map +1 -0
  315. package/dist/rules/code-quality.d.ts +55 -0
  316. package/dist/rules/code-quality.d.ts.map +1 -0
  317. package/dist/rules/code-quality.js +116 -0
  318. package/dist/rules/code-quality.js.map +1 -0
  319. package/dist/rules/dependencies.d.ts +32 -0
  320. package/dist/rules/dependencies.d.ts.map +1 -0
  321. package/dist/rules/dependencies.js +37 -0
  322. package/dist/rules/dependencies.js.map +1 -0
  323. package/dist/rules/errors.d.ts +31 -0
  324. package/dist/rules/errors.d.ts.map +1 -0
  325. package/dist/rules/errors.js +97 -0
  326. package/dist/rules/errors.js.map +1 -0
  327. package/dist/rules/hygiene.d.ts +54 -0
  328. package/dist/rules/hygiene.d.ts.map +1 -0
  329. package/dist/rules/hygiene.js +62 -0
  330. package/dist/rules/hygiene.js.map +1 -0
  331. package/dist/rules/metrics-function.d.ts +45 -0
  332. package/dist/rules/metrics-function.d.ts.map +1 -0
  333. package/dist/rules/metrics-function.js +87 -0
  334. package/dist/rules/metrics-function.js.map +1 -0
  335. package/dist/rules/metrics.d.ts +64 -0
  336. package/dist/rules/metrics.d.ts.map +1 -0
  337. package/dist/rules/metrics.js +157 -0
  338. package/dist/rules/metrics.js.map +1 -0
  339. package/dist/rules/naming.d.ts +24 -0
  340. package/dist/rules/naming.d.ts.map +1 -0
  341. package/dist/rules/naming.js +51 -0
  342. package/dist/rules/naming.js.map +1 -0
  343. package/dist/rules/security.d.ts +59 -0
  344. package/dist/rules/security.d.ts.map +1 -0
  345. package/dist/rules/security.js +92 -0
  346. package/dist/rules/security.js.map +1 -0
  347. package/dist/rules/typescript.d.ts +73 -0
  348. package/dist/rules/typescript.d.ts.map +1 -0
  349. package/dist/rules/typescript.js +105 -0
  350. package/dist/rules/typescript.js.map +1 -0
  351. package/dist/smells/duplicate-bodies.d.ts +24 -0
  352. package/dist/smells/duplicate-bodies.d.ts.map +1 -0
  353. package/dist/smells/duplicate-bodies.js +131 -0
  354. package/dist/smells/duplicate-bodies.js.map +1 -0
  355. package/dist/smells/fingerprint.d.ts +27 -0
  356. package/dist/smells/fingerprint.d.ts.map +1 -0
  357. package/dist/smells/fingerprint.js +50 -0
  358. package/dist/smells/fingerprint.js.map +1 -0
  359. package/dist/smells/inconsistent-siblings.d.ts +21 -0
  360. package/dist/smells/inconsistent-siblings.d.ts.map +1 -0
  361. package/dist/smells/inconsistent-siblings.js +135 -0
  362. package/dist/smells/inconsistent-siblings.js.map +1 -0
  363. package/dist/smells/index.d.ts +12 -0
  364. package/dist/smells/index.d.ts.map +1 -0
  365. package/dist/smells/index.js +15 -0
  366. package/dist/smells/index.js.map +1 -0
  367. package/dist/smells/smell-builder.d.ts +37 -0
  368. package/dist/smells/smell-builder.d.ts.map +1 -0
  369. package/dist/smells/smell-builder.js +51 -0
  370. package/dist/smells/smell-builder.js.map +1 -0
  371. package/package.json +121 -0
@@ -0,0 +1,83 @@
1
+ /**
2
+ * Matches classes that extend the named base class.
3
+ *
4
+ * Uses the extends clause expression text, e.g. `class Foo extends Bar`
5
+ * matches `extend('Bar')`.
6
+ */
7
+ export function extend(className) {
8
+ return {
9
+ description: `extend "${className}"`,
10
+ test: (cls) => cls.getExtends()?.getExpression().getText() === className,
11
+ };
12
+ }
13
+ /**
14
+ * Matches classes that have an explicit `implements` clause for the named interface.
15
+ *
16
+ * Checks `getImplements()` expression texts.
17
+ */
18
+ export function implement(interfaceName) {
19
+ return {
20
+ description: `implement "${interfaceName}"`,
21
+ test: (cls) => cls.getImplements().some((impl) => impl.getExpression().getText() === interfaceName),
22
+ };
23
+ }
24
+ /**
25
+ * Matches classes that have a decorator with the given name.
26
+ *
27
+ * @example haveDecorator('Controller') matches `@Controller class Foo {}`
28
+ */
29
+ export function haveDecorator(name) {
30
+ return {
31
+ description: `have decorator @${name}`,
32
+ test: (cls) => cls.getDecorators().some((d) => d.getName() === name),
33
+ };
34
+ }
35
+ /**
36
+ * Matches classes that have a decorator whose name matches the regex.
37
+ */
38
+ export function haveDecoratorMatching(regex) {
39
+ return {
40
+ description: `have decorator matching ${String(regex)}`,
41
+ test: (cls) => cls.getDecorators().some((d) => regex.test(d.getName())),
42
+ };
43
+ }
44
+ /**
45
+ * Matches abstract classes.
46
+ */
47
+ export function areAbstract() {
48
+ return {
49
+ description: 'are abstract',
50
+ test: (cls) => cls.isAbstract(),
51
+ };
52
+ }
53
+ /**
54
+ * Matches classes that have a method with the given name.
55
+ */
56
+ export function haveMethodNamed(name) {
57
+ return {
58
+ description: `have method named "${name}"`,
59
+ test: (cls) => cls.getMethod(name) !== undefined,
60
+ };
61
+ }
62
+ /**
63
+ * Matches classes that have a method whose name matches the regex.
64
+ */
65
+ export function haveMethodMatching(regex) {
66
+ return {
67
+ description: `have method matching ${String(regex)}`,
68
+ test: (cls) => cls.getMethods().some((m) => {
69
+ const name = m.getName();
70
+ return regex.test(name);
71
+ }),
72
+ };
73
+ }
74
+ /**
75
+ * Matches classes that have a property with the given name.
76
+ */
77
+ export function havePropertyNamed(name) {
78
+ return {
79
+ description: `have property named "${name}"`,
80
+ test: (cls) => cls.getProperty(name) !== undefined,
81
+ };
82
+ }
83
+ //# sourceMappingURL=class.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"class.js","sourceRoot":"","sources":["../../src/predicates/class.ts"],"names":[],"mappings":"AAGA;;;;;GAKG;AACH,MAAM,UAAU,MAAM,CAAC,SAAiB;IACtC,OAAO;QACL,WAAW,EAAE,WAAW,SAAS,GAAG;QACpC,IAAI,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,UAAU,EAAE,EAAE,aAAa,EAAE,CAAC,OAAO,EAAE,KAAK,SAAS;KACzE,CAAA;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,SAAS,CAAC,aAAqB;IAC7C,OAAO;QACL,WAAW,EAAE,cAAc,aAAa,GAAG;QAC3C,IAAI,EAAE,CAAC,GAAG,EAAE,EAAE,CACZ,GAAG,CAAC,aAAa,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,OAAO,EAAE,KAAK,aAAa,CAAC;KACvF,CAAA;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,OAAO;QACL,WAAW,EAAE,mBAAmB,IAAI,EAAE;QACtC,IAAI,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,KAAK,IAAI,CAAC;KACrE,CAAA;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,qBAAqB,CAAC,KAAa;IACjD,OAAO;QACL,WAAW,EAAE,2BAA2B,MAAM,CAAC,KAAK,CAAC,EAAE;QACvD,IAAI,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;KACxE,CAAA;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW;IACzB,OAAO;QACL,WAAW,EAAE,cAAc;QAC3B,IAAI,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,UAAU,EAAE;KAChC,CAAA;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,IAAY;IAC1C,OAAO;QACL,WAAW,EAAE,sBAAsB,IAAI,GAAG;QAC1C,IAAI,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,SAAS;KACjD,CAAA;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,KAAa;IAC9C,OAAO;QACL,WAAW,EAAE,wBAAwB,MAAM,CAAC,KAAK,CAAC,EAAE;QACpD,IAAI,EAAE,CAAC,GAAG,EAAE,EAAE,CACZ,GAAG,CAAC,UAAU,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE;YAC1B,MAAM,IAAI,GAAG,CAAC,CAAC,OAAO,EAAE,CAAA;YACxB,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACzB,CAAC,CAAC;KACL,CAAA;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAAY;IAC5C,OAAO;QACL,WAAW,EAAE,wBAAwB,IAAI,GAAG;QAC5C,IAAI,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,SAAS;KACnD,CAAA;AACH,CAAC"}
@@ -0,0 +1,81 @@
1
+ import type { Predicate } from '@nielspeter/eess';
2
+ import type { ArchFunction } from '../models/arch-function.js';
3
+ import type { TypeMatcher } from '../helpers/type-matchers.js';
4
+ /**
5
+ * Matches functions/methods with public visibility.
6
+ *
7
+ * - Class methods: matches explicitly `public` or no access modifier (implicitly public).
8
+ * - Standalone functions / arrow functions: always match (module-level, no visibility concept).
9
+ */
10
+ export declare function arePublic(): Predicate<ArchFunction>;
11
+ /**
12
+ * Matches class methods with `protected` visibility.
13
+ *
14
+ * Standalone functions and arrow functions never match (they have no visibility modifier).
15
+ */
16
+ export declare function areProtected(): Predicate<ArchFunction>;
17
+ /**
18
+ * Matches class methods with `private` visibility.
19
+ *
20
+ * Standalone functions and arrow functions never match (they have no visibility modifier).
21
+ */
22
+ export declare function arePrivate(): Predicate<ArchFunction>;
23
+ /**
24
+ * Matches async functions (declared with the `async` keyword).
25
+ */
26
+ export declare function areAsync(): Predicate<ArchFunction>;
27
+ /**
28
+ * Matches functions that are NOT async.
29
+ */
30
+ export declare function areNotAsync(): Predicate<ArchFunction>;
31
+ /**
32
+ * Matches functions with exactly `n` parameters.
33
+ */
34
+ export declare function haveParameterCount(n: number): Predicate<ArchFunction>;
35
+ /**
36
+ * Matches functions with more than `n` parameters.
37
+ */
38
+ export declare function haveParameterCountGreaterThan(n: number): Predicate<ArchFunction>;
39
+ /**
40
+ * Matches functions with fewer than `n` parameters.
41
+ */
42
+ export declare function haveParameterCountLessThan(n: number): Predicate<ArchFunction>;
43
+ /**
44
+ * Matches functions that have a parameter with the given name.
45
+ */
46
+ export declare function haveParameterNamed(name: string): Predicate<ArchFunction>;
47
+ /**
48
+ * Matches functions whose return type text matches the given pattern.
49
+ *
50
+ * The pattern is matched against the type checker's text representation
51
+ * of the return type (e.g. "Promise<number>", "string", "void").
52
+ *
53
+ * @param pattern - RegExp or string (converted to RegExp)
54
+ */
55
+ export declare function haveReturnType(pattern: RegExp | string): Predicate<ArchFunction>;
56
+ /**
57
+ * Matches functions that have at least one rest parameter (...args).
58
+ */
59
+ export declare function haveRestParameter(): Predicate<ArchFunction>;
60
+ /**
61
+ * Matches functions that have at least one optional or default-valued parameter.
62
+ *
63
+ * Includes both `x?: string` (optional) and `x = 10` (default value).
64
+ */
65
+ export declare function haveOptionalParameter(): Predicate<ArchFunction>;
66
+ /**
67
+ * Matches functions that have a parameter at the given index
68
+ * whose type matches the given TypeMatcher.
69
+ *
70
+ * Note: For rest parameters (...args: string[]), the type is string[] not string.
71
+ * Use arrayOf(isString()) or exactly('string[]') to match rest param types.
72
+ * For optional parameters (x?: string), TypeMatcher strips undefined automatically.
73
+ * Out-of-bounds or negative indices return false.
74
+ */
75
+ export declare function haveParameterOfType(index: number, matcher: TypeMatcher): Predicate<ArchFunction>;
76
+ /**
77
+ * Matches functions that have a parameter whose name matches the given regex.
78
+ * Unlike haveParameterNamed (exact match), this accepts a regex.
79
+ */
80
+ export declare function haveParameterNameMatching(pattern: RegExp): Predicate<ArchFunction>;
81
+ //# sourceMappingURL=function.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"function.d.ts","sourceRoot":"","sources":["../../src/predicates/function.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AACjD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAA;AAC9D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAA;AAI9D;;;;;GAKG;AACH,wBAAgB,SAAS,IAAI,SAAS,CAAC,YAAY,CAAC,CAKnD;AAED;;;;GAIG;AACH,wBAAgB,YAAY,IAAI,SAAS,CAAC,YAAY,CAAC,CAKtD;AAED;;;;GAIG;AACH,wBAAgB,UAAU,IAAI,SAAS,CAAC,YAAY,CAAC,CAKpD;AAID;;GAEG;AACH,wBAAgB,QAAQ,IAAI,SAAS,CAAC,YAAY,CAAC,CAKlD;AAED;;GAEG;AACH,wBAAgB,WAAW,IAAI,SAAS,CAAC,YAAY,CAAC,CAKrD;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC,YAAY,CAAC,CAKrE;AAED;;GAEG;AACH,wBAAgB,6BAA6B,CAAC,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC,YAAY,CAAC,CAKhF;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CAAC,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC,YAAY,CAAC,CAK7E;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC,YAAY,CAAC,CAKxE;AAED;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC,YAAY,CAAC,CAMhF;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,SAAS,CAAC,YAAY,CAAC,CAK3D;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,IAAI,SAAS,CAAC,YAAY,CAAC,CAK/D;AAED;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,SAAS,CAAC,YAAY,CAAC,CAUhG;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC,YAAY,CAAC,CAKlF"}
@@ -0,0 +1,157 @@
1
+ // --- Visibility predicates (plan 0032) ---
2
+ /**
3
+ * Matches functions/methods with public visibility.
4
+ *
5
+ * - Class methods: matches explicitly `public` or no access modifier (implicitly public).
6
+ * - Standalone functions / arrow functions: always match (module-level, no visibility concept).
7
+ */
8
+ export function arePublic() {
9
+ return {
10
+ description: 'are public',
11
+ test: (fn) => fn.getScope() === 'public',
12
+ };
13
+ }
14
+ /**
15
+ * Matches class methods with `protected` visibility.
16
+ *
17
+ * Standalone functions and arrow functions never match (they have no visibility modifier).
18
+ */
19
+ export function areProtected() {
20
+ return {
21
+ description: 'are protected',
22
+ test: (fn) => fn.getScope() === 'protected',
23
+ };
24
+ }
25
+ /**
26
+ * Matches class methods with `private` visibility.
27
+ *
28
+ * Standalone functions and arrow functions never match (they have no visibility modifier).
29
+ */
30
+ export function arePrivate() {
31
+ return {
32
+ description: 'are private',
33
+ test: (fn) => fn.getScope() === 'private',
34
+ };
35
+ }
36
+ // --- Async predicates ---
37
+ /**
38
+ * Matches async functions (declared with the `async` keyword).
39
+ */
40
+ export function areAsync() {
41
+ return {
42
+ description: 'are async',
43
+ test: (fn) => fn.isAsync(),
44
+ };
45
+ }
46
+ /**
47
+ * Matches functions that are NOT async.
48
+ */
49
+ export function areNotAsync() {
50
+ return {
51
+ description: 'are not async',
52
+ test: (fn) => !fn.isAsync(),
53
+ };
54
+ }
55
+ /**
56
+ * Matches functions with exactly `n` parameters.
57
+ */
58
+ export function haveParameterCount(n) {
59
+ return {
60
+ description: `have ${String(n)} parameter${n === 1 ? '' : 's'}`,
61
+ test: (fn) => fn.getParameters().length === n,
62
+ };
63
+ }
64
+ /**
65
+ * Matches functions with more than `n` parameters.
66
+ */
67
+ export function haveParameterCountGreaterThan(n) {
68
+ return {
69
+ description: `have more than ${String(n)} parameter${n === 1 ? '' : 's'}`,
70
+ test: (fn) => fn.getParameters().length > n,
71
+ };
72
+ }
73
+ /**
74
+ * Matches functions with fewer than `n` parameters.
75
+ */
76
+ export function haveParameterCountLessThan(n) {
77
+ return {
78
+ description: `have fewer than ${String(n)} parameter${n === 1 ? '' : 's'}`,
79
+ test: (fn) => fn.getParameters().length < n,
80
+ };
81
+ }
82
+ /**
83
+ * Matches functions that have a parameter with the given name.
84
+ */
85
+ export function haveParameterNamed(name) {
86
+ return {
87
+ description: `have a parameter named "${name}"`,
88
+ test: (fn) => fn.getParameters().some((p) => p.getName() === name),
89
+ };
90
+ }
91
+ /**
92
+ * Matches functions whose return type text matches the given pattern.
93
+ *
94
+ * The pattern is matched against the type checker's text representation
95
+ * of the return type (e.g. "Promise<number>", "string", "void").
96
+ *
97
+ * @param pattern - RegExp or string (converted to RegExp)
98
+ */
99
+ export function haveReturnType(pattern) {
100
+ const regex = typeof pattern === 'string' ? new RegExp(pattern) : pattern;
101
+ return {
102
+ description: `have return type matching ${String(regex)}`,
103
+ test: (fn) => regex.test(fn.getReturnType().getText()),
104
+ };
105
+ }
106
+ /**
107
+ * Matches functions that have at least one rest parameter (...args).
108
+ */
109
+ export function haveRestParameter() {
110
+ return {
111
+ description: 'have a rest parameter',
112
+ test: (fn) => fn.getParameters().some((p) => p.isRestParameter()),
113
+ };
114
+ }
115
+ /**
116
+ * Matches functions that have at least one optional or default-valued parameter.
117
+ *
118
+ * Includes both `x?: string` (optional) and `x = 10` (default value).
119
+ */
120
+ export function haveOptionalParameter() {
121
+ return {
122
+ description: 'have an optional or default-valued parameter',
123
+ test: (fn) => fn.getParameters().some((p) => p.isOptional() || p.hasInitializer()),
124
+ };
125
+ }
126
+ /**
127
+ * Matches functions that have a parameter at the given index
128
+ * whose type matches the given TypeMatcher.
129
+ *
130
+ * Note: For rest parameters (...args: string[]), the type is string[] not string.
131
+ * Use arrayOf(isString()) or exactly('string[]') to match rest param types.
132
+ * For optional parameters (x?: string), TypeMatcher strips undefined automatically.
133
+ * Out-of-bounds or negative indices return false.
134
+ */
135
+ export function haveParameterOfType(index, matcher) {
136
+ return {
137
+ description: `have parameter at index ${String(index)} with matching type`,
138
+ test: (fn) => {
139
+ const params = fn.getParameters();
140
+ const param = params[index];
141
+ if (!param)
142
+ return false;
143
+ return matcher(param.getType());
144
+ },
145
+ };
146
+ }
147
+ /**
148
+ * Matches functions that have a parameter whose name matches the given regex.
149
+ * Unlike haveParameterNamed (exact match), this accepts a regex.
150
+ */
151
+ export function haveParameterNameMatching(pattern) {
152
+ return {
153
+ description: `have a parameter name matching ${String(pattern)}`,
154
+ test: (fn) => fn.getParameters().some((p) => pattern.test(p.getName())),
155
+ };
156
+ }
157
+ //# sourceMappingURL=function.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"function.js","sourceRoot":"","sources":["../../src/predicates/function.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,55 @@
1
+ import type { SourceFile } from 'ts-morph';
2
+ import type { Predicate } from '@nielspeter/eess';
3
+ /** Types that have a name — ClassDeclaration, FunctionDeclaration, InterfaceDeclaration, etc. */
4
+ export interface Named {
5
+ getName(): string | undefined;
6
+ }
7
+ /** Types that have a source file — any ts-morph Node. */
8
+ export interface Located {
9
+ getSourceFile(): SourceFile;
10
+ }
11
+ /** Types that can be exported — ClassDeclaration, FunctionDeclaration, InterfaceDeclaration, etc. */
12
+ export interface Exportable {
13
+ isExported(): boolean;
14
+ }
15
+ /**
16
+ * Matches elements whose name matches the given pattern.
17
+ * - RegExp: tested against the name directly
18
+ * - string: converted to RegExp (e.g. 'Service$' becomes /Service$/)
19
+ */
20
+ export declare function haveNameMatching<T extends Named>(pattern: RegExp | string): Predicate<T>;
21
+ /**
22
+ * Matches elements whose name starts with the given prefix.
23
+ */
24
+ export declare function haveNameStartingWith<T extends Named>(prefix: string): Predicate<T>;
25
+ /**
26
+ * Matches elements whose name ends with the given suffix.
27
+ */
28
+ export declare function haveNameEndingWith<T extends Named>(suffix: string): Predicate<T>;
29
+ /**
30
+ * Matches elements that reside in a file matching the given glob.
31
+ * The glob is matched against the absolute file path using picomatch.
32
+ *
33
+ * @example
34
+ * resideInFile('** /routes.ts') // matches /abs/path/src/routes.ts
35
+ * resideInFile('** /src/*.ts') // matches any .ts file directly in src/
36
+ */
37
+ export declare function resideInFile<T extends Located>(glob: string): Predicate<T>;
38
+ /**
39
+ * Matches elements that reside in a folder matching the given glob.
40
+ * The glob is matched against the directory portion of the absolute file path.
41
+ *
42
+ * @example
43
+ * resideInFolder('** /routes/**') // matches files anywhere under a routes/ folder
44
+ * resideInFolder('** /src/services/**')
45
+ */
46
+ export declare function resideInFolder<T extends Located>(glob: string): Predicate<T>;
47
+ /**
48
+ * Matches elements that are exported from their module.
49
+ */
50
+ export declare function areExported<T extends Exportable>(): Predicate<T>;
51
+ /**
52
+ * Matches elements that are NOT exported from their module.
53
+ */
54
+ export declare function areNotExported<T extends Exportable>(): Predicate<T>;
55
+ //# sourceMappingURL=identity.d.ts.map
@@ -0,0 +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"}
@@ -0,0 +1,96 @@
1
+ import picomatch from 'picomatch';
2
+ // --- Name predicates ---
3
+ /**
4
+ * Matches elements whose name matches the given pattern.
5
+ * - RegExp: tested against the name directly
6
+ * - string: converted to RegExp (e.g. 'Service$' becomes /Service$/)
7
+ */
8
+ export function haveNameMatching(pattern) {
9
+ const regex = typeof pattern === 'string' ? new RegExp(pattern) : pattern;
10
+ return {
11
+ description: `have name matching ${String(regex)}`,
12
+ test: (element) => {
13
+ const name = element.getName();
14
+ return name !== undefined && regex.test(name);
15
+ },
16
+ };
17
+ }
18
+ /**
19
+ * Matches elements whose name starts with the given prefix.
20
+ */
21
+ export function haveNameStartingWith(prefix) {
22
+ return {
23
+ description: `have name starting with "${prefix}"`,
24
+ test: (element) => {
25
+ const name = element.getName();
26
+ return name?.startsWith(prefix) ?? false;
27
+ },
28
+ };
29
+ }
30
+ /**
31
+ * Matches elements whose name ends with the given suffix.
32
+ */
33
+ export function haveNameEndingWith(suffix) {
34
+ return {
35
+ description: `have name ending with "${suffix}"`,
36
+ test: (element) => {
37
+ const name = element.getName();
38
+ return name?.endsWith(suffix) ?? false;
39
+ },
40
+ };
41
+ }
42
+ // --- File & Folder predicates ---
43
+ /**
44
+ * Matches elements that reside in a file matching the given glob.
45
+ * The glob is matched against the absolute file path using picomatch.
46
+ *
47
+ * @example
48
+ * resideInFile('** /routes.ts') // matches /abs/path/src/routes.ts
49
+ * resideInFile('** /src/*.ts') // matches any .ts file directly in src/
50
+ */
51
+ export function resideInFile(glob) {
52
+ const isMatch = picomatch(glob);
53
+ return {
54
+ description: `reside in file matching "${glob}"`,
55
+ test: (element) => isMatch(element.getSourceFile().getFilePath()),
56
+ };
57
+ }
58
+ /**
59
+ * Matches elements that reside in a folder matching the given glob.
60
+ * The glob is matched against the directory portion of the absolute file path.
61
+ *
62
+ * @example
63
+ * resideInFolder('** /routes/**') // matches files anywhere under a routes/ folder
64
+ * resideInFolder('** /src/services/**')
65
+ */
66
+ export function resideInFolder(glob) {
67
+ const isMatch = picomatch(glob);
68
+ return {
69
+ description: `reside in folder matching "${glob}"`,
70
+ test: (element) => {
71
+ const filePath = element.getSourceFile().getFilePath();
72
+ const dirPath = filePath.substring(0, filePath.lastIndexOf('/'));
73
+ return isMatch(dirPath);
74
+ },
75
+ };
76
+ }
77
+ // --- Export predicates ---
78
+ /**
79
+ * Matches elements that are exported from their module.
80
+ */
81
+ export function areExported() {
82
+ return {
83
+ description: 'are exported',
84
+ test: (element) => element.isExported(),
85
+ };
86
+ }
87
+ /**
88
+ * Matches elements that are NOT exported from their module.
89
+ */
90
+ export function areNotExported() {
91
+ return {
92
+ description: 'are not exported',
93
+ test: (element) => !element.isExported(),
94
+ };
95
+ }
96
+ //# sourceMappingURL=identity.js.map
@@ -0,0 +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"}
@@ -0,0 +1,4 @@
1
+ export type { Named, Located, Exportable } from './identity.js';
2
+ export { haveNameMatching, haveNameStartingWith, haveNameEndingWith, resideInFile, resideInFolder, areExported, areNotExported, } from './identity.js';
3
+ export * as classPredicates from './class.js';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +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"}
@@ -0,0 +1,3 @@
1
+ export { haveNameMatching, haveNameStartingWith, haveNameEndingWith, resideInFile, resideInFolder, areExported, areNotExported, } from './identity.js';
2
+ export * as classPredicates from './class.js';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +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"}
@@ -0,0 +1,41 @@
1
+ import type { Predicate } from '@nielspeter/eess';
2
+ import type { ArchJsxElement } from '../models/arch-jsx-element.js';
3
+ /**
4
+ * Matches HTML intrinsic elements with the given tag names.
5
+ * At least one tag name is required — throws if called with zero tags.
6
+ *
7
+ * @example
8
+ * areHtmlElements('button', 'input', 'select')
9
+ * areHtmlElements(...STANDARD_HTML_TAGS)
10
+ */
11
+ export declare function areHtmlElements(...tags: string[]): Predicate<ArchJsxElement>;
12
+ /**
13
+ * Matches component elements (uppercase first char or dot-notation).
14
+ * No args = all components. With args = only those component names.
15
+ * Use full dotted names for namespaced components (e.g. 'Icons.Check').
16
+ *
17
+ * @example
18
+ * areComponents() // all component elements
19
+ * areComponents('Button', 'Input') // only these components
20
+ * areComponents('Icons.Check') // dotted component name
21
+ */
22
+ export declare function areComponents(...names: string[]): Predicate<ArchJsxElement>;
23
+ /**
24
+ * Filter to elements that have the named attribute (any value).
25
+ * Predicate-only — use `haveAttribute` for the condition equivalent.
26
+ *
27
+ * @example
28
+ * withAttribute('onClick') // elements with onClick
29
+ * withAttribute('data-testid') // elements with data-testid
30
+ */
31
+ export declare function withAttribute(name: string): Predicate<ArchJsxElement>;
32
+ /**
33
+ * Filter to elements where the named attribute matches a string or regex.
34
+ * Predicate-only — use `haveAttributeMatching` for the condition equivalent.
35
+ *
36
+ * @example
37
+ * withAttributeMatching('type', 'submit') // type="submit"
38
+ * withAttributeMatching('className', /error/) // className contains "error"
39
+ */
40
+ export declare function withAttributeMatching(name: string, value: string | RegExp): Predicate<ArchJsxElement>;
41
+ //# sourceMappingURL=jsx.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jsx.d.ts","sourceRoot":"","sources":["../../src/predicates/jsx.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AACjD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAA;AAEnE;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,GAAG,IAAI,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC,cAAc,CAAC,CAgB5E;AAED;;;;;;;;;GASG;AACH,wBAAgB,aAAa,CAAC,GAAG,KAAK,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC,cAAc,CAAC,CAe3E;AAED;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC,cAAc,CAAC,CAKrE;AAED;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,GAAG,MAAM,GACrB,SAAS,CAAC,cAAc,CAAC,CAW3B"}
@@ -0,0 +1,84 @@
1
+ /**
2
+ * Matches HTML intrinsic elements with the given tag names.
3
+ * At least one tag name is required — throws if called with zero tags.
4
+ *
5
+ * @example
6
+ * areHtmlElements('button', 'input', 'select')
7
+ * areHtmlElements(...STANDARD_HTML_TAGS)
8
+ */
9
+ export function areHtmlElements(...tags) {
10
+ if (tags.length === 0) {
11
+ throw new Error('areHtmlElements() requires at least one tag name. ' +
12
+ 'Use areHtmlElements(...STANDARD_HTML_TAGS) for all standard HTML elements.');
13
+ }
14
+ const tagSet = new Set(tags);
15
+ const desc = tags.length <= 5
16
+ ? `are <${tags.join('>, <')}> elements`
17
+ : `are <${tags.slice(0, 5).join('>, <')}> and ${String(tags.length - 5)} more HTML elements`;
18
+ return {
19
+ description: desc,
20
+ test: (element) => element.isHtmlElement() && tagSet.has(element.getName()),
21
+ };
22
+ }
23
+ /**
24
+ * Matches component elements (uppercase first char or dot-notation).
25
+ * No args = all components. With args = only those component names.
26
+ * Use full dotted names for namespaced components (e.g. 'Icons.Check').
27
+ *
28
+ * @example
29
+ * areComponents() // all component elements
30
+ * areComponents('Button', 'Input') // only these components
31
+ * areComponents('Icons.Check') // dotted component name
32
+ */
33
+ export function areComponents(...names) {
34
+ if (names.length === 0) {
35
+ return {
36
+ description: 'are component elements',
37
+ test: (element) => element.isComponent(),
38
+ };
39
+ }
40
+ const nameSet = new Set(names);
41
+ return {
42
+ description: names.length === 1
43
+ ? `are <${names[0]}> components`
44
+ : `are <${names.join('>, <')}> components`,
45
+ test: (element) => element.isComponent() && nameSet.has(element.getName()),
46
+ };
47
+ }
48
+ /**
49
+ * Filter to elements that have the named attribute (any value).
50
+ * Predicate-only — use `haveAttribute` for the condition equivalent.
51
+ *
52
+ * @example
53
+ * withAttribute('onClick') // elements with onClick
54
+ * withAttribute('data-testid') // elements with data-testid
55
+ */
56
+ export function withAttribute(name) {
57
+ return {
58
+ description: `have attribute "${name}"`,
59
+ test: (element) => element.hasAttribute(name),
60
+ };
61
+ }
62
+ /**
63
+ * Filter to elements where the named attribute matches a string or regex.
64
+ * Predicate-only — use `haveAttributeMatching` for the condition equivalent.
65
+ *
66
+ * @example
67
+ * withAttributeMatching('type', 'submit') // type="submit"
68
+ * withAttributeMatching('className', /error/) // className contains "error"
69
+ */
70
+ export function withAttributeMatching(name, value) {
71
+ const valueDesc = typeof value === 'string' ? `"${value}"` : String(value);
72
+ return {
73
+ description: `have attribute "${name}" matching ${valueDesc}`,
74
+ test(element) {
75
+ const attrValue = element.getAttribute(name);
76
+ if (attrValue === undefined)
77
+ return false;
78
+ if (typeof value === 'string')
79
+ return attrValue === value;
80
+ return value.test(attrValue);
81
+ },
82
+ };
83
+ }
84
+ //# sourceMappingURL=jsx.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jsx.js","sourceRoot":"","sources":["../../src/predicates/jsx.ts"],"names":[],"mappings":"AAGA;;;;;;;GAOG;AACH,MAAM,UAAU,eAAe,CAAC,GAAG,IAAc;IAC/C,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,MAAM,IAAI,KAAK,CACb,oDAAoD;YAClD,4EAA4E,CAC/E,CAAA;IACH,CAAC;IACD,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,CAAA;IAC5B,MAAM,IAAI,GACR,IAAI,CAAC,MAAM,IAAI,CAAC;QACd,CAAC,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY;QACvC,CAAC,CAAC,QAAQ,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,MAAM,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,qBAAqB,CAAA;IAChG,OAAO;QACL,WAAW,EAAE,IAAI;QACjB,IAAI,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,aAAa,EAAE,IAAI,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;KAC5E,CAAA;AACH,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,aAAa,CAAC,GAAG,KAAe;IAC9C,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO;YACL,WAAW,EAAE,wBAAwB;YACrC,IAAI,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,WAAW,EAAE;SACzC,CAAA;IACH,CAAC;IACD,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAA;IAC9B,OAAO;QACL,WAAW,EACT,KAAK,CAAC,MAAM,KAAK,CAAC;YAChB,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC,CAAC,cAAc;YAChC,CAAC,CAAC,QAAQ,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,cAAc;QAC9C,IAAI,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,WAAW,EAAE,IAAI,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;KAC3E,CAAA;AACH,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,OAAO;QACL,WAAW,EAAE,mBAAmB,IAAI,GAAG;QACvC,IAAI,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC;KAC9C,CAAA;AACH,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,qBAAqB,CACnC,IAAY,EACZ,KAAsB;IAEtB,MAAM,SAAS,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;IAC1E,OAAO;QACL,WAAW,EAAE,mBAAmB,IAAI,cAAc,SAAS,EAAE;QAC7D,IAAI,CAAC,OAAO;YACV,MAAM,SAAS,GAAG,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,CAAA;YAC5C,IAAI,SAAS,KAAK,SAAS;gBAAE,OAAO,KAAK,CAAA;YACzC,IAAI,OAAO,KAAK,KAAK,QAAQ;gBAAE,OAAO,SAAS,KAAK,KAAK,CAAA;YACzD,OAAO,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;QAC9B,CAAC;KACF,CAAA;AACH,CAAC"}