@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,231 @@
1
+ import { Node, } from 'ts-morph';
2
+ /**
3
+ * Standard HTML tag names per the WHATWG HTML Living Standard.
4
+ * Use with `areHtmlElements(...STANDARD_HTML_TAGS)`
5
+ * for unambiguous "all standard HTML elements" matching (excludes custom
6
+ * elements like `<my-widget>`).
7
+ */
8
+ export const STANDARD_HTML_TAGS = [
9
+ 'a',
10
+ 'abbr',
11
+ 'address',
12
+ 'area',
13
+ 'article',
14
+ 'aside',
15
+ 'audio',
16
+ 'b',
17
+ 'base',
18
+ 'bdi',
19
+ 'bdo',
20
+ 'blockquote',
21
+ 'body',
22
+ 'br',
23
+ 'button',
24
+ 'canvas',
25
+ 'caption',
26
+ 'cite',
27
+ 'code',
28
+ 'col',
29
+ 'colgroup',
30
+ 'data',
31
+ 'datalist',
32
+ 'dd',
33
+ 'del',
34
+ 'details',
35
+ 'dfn',
36
+ 'dialog',
37
+ 'div',
38
+ 'dl',
39
+ 'dt',
40
+ 'em',
41
+ 'embed',
42
+ 'fieldset',
43
+ 'figcaption',
44
+ 'figure',
45
+ 'footer',
46
+ 'form',
47
+ 'h1',
48
+ 'h2',
49
+ 'h3',
50
+ 'h4',
51
+ 'h5',
52
+ 'h6',
53
+ 'head',
54
+ 'header',
55
+ 'hgroup',
56
+ 'hr',
57
+ 'html',
58
+ 'i',
59
+ 'iframe',
60
+ 'img',
61
+ 'input',
62
+ 'ins',
63
+ 'kbd',
64
+ 'label',
65
+ 'legend',
66
+ 'li',
67
+ 'link',
68
+ 'main',
69
+ 'map',
70
+ 'mark',
71
+ 'menu',
72
+ 'meta',
73
+ 'meter',
74
+ 'nav',
75
+ 'noscript',
76
+ 'object',
77
+ 'ol',
78
+ 'optgroup',
79
+ 'option',
80
+ 'output',
81
+ 'p',
82
+ 'picture',
83
+ 'pre',
84
+ 'progress',
85
+ 'q',
86
+ 'rp',
87
+ 'rt',
88
+ 'ruby',
89
+ 's',
90
+ 'samp',
91
+ 'script',
92
+ 'search',
93
+ 'section',
94
+ 'select',
95
+ 'slot',
96
+ 'small',
97
+ 'source',
98
+ 'span',
99
+ 'strong',
100
+ 'style',
101
+ 'sub',
102
+ 'summary',
103
+ 'sup',
104
+ 'table',
105
+ 'tbody',
106
+ 'td',
107
+ 'template',
108
+ 'textarea',
109
+ 'tfoot',
110
+ 'th',
111
+ 'thead',
112
+ 'time',
113
+ 'title',
114
+ 'tr',
115
+ 'track',
116
+ 'u',
117
+ 'ul',
118
+ 'var',
119
+ 'video',
120
+ 'wbr',
121
+ ];
122
+ /**
123
+ * Classify a tag name as HTML intrinsic or component.
124
+ * - Dot-notation (contains '.') → always component
125
+ * - Lowercase first char → HTML intrinsic
126
+ * - Uppercase first char → component
127
+ */
128
+ function isHtmlTag(tagName) {
129
+ if (tagName.includes('.'))
130
+ return false;
131
+ const firstChar = tagName[0];
132
+ return firstChar !== undefined && firstChar === firstChar.toLowerCase();
133
+ }
134
+ /**
135
+ * Type predicate for filtering JsxAttribute from JsxAttributeLike.
136
+ * Narrows the type so downstream code doesn't need redundant checks.
137
+ */
138
+ function isNamedAttribute(a) {
139
+ return Node.isJsxAttribute(a);
140
+ }
141
+ /**
142
+ * Shared attribute accessors for both JsxElement and JsxSelfClosingElement.
143
+ * Extracts attribute-access logic into a single place to avoid duplication.
144
+ */
145
+ function buildAttributeAccessors(getAttrs) {
146
+ function namedAttrs() {
147
+ return getAttrs().filter(isNamedAttribute);
148
+ }
149
+ return {
150
+ getAttribute(name) {
151
+ const attr = namedAttrs().find((a) => a.getNameNode().getText() === name);
152
+ if (!attr)
153
+ return undefined;
154
+ const init = attr.getInitializer();
155
+ if (!init)
156
+ return undefined; // valueless attribute
157
+ if (Node.isStringLiteral(init))
158
+ return init.getLiteralValue();
159
+ return init.getText();
160
+ },
161
+ hasAttribute(name) {
162
+ return namedAttrs().some((a) => a.getNameNode().getText() === name);
163
+ },
164
+ getAttributeNames() {
165
+ return namedAttrs().map((a) => a.getNameNode().getText());
166
+ },
167
+ };
168
+ }
169
+ /**
170
+ * Create an ArchJsxElement from a JsxElement (has opening + closing tags).
171
+ */
172
+ // eess-exclude eess/no-unused-exports: consumed by the test suite (tests are outside the build project)
173
+ export function fromJsxElement(el) {
174
+ const opening = el.getOpeningElement();
175
+ const tagName = opening.getTagNameNode().getText();
176
+ const htmlTag = isHtmlTag(tagName);
177
+ const attrs = buildAttributeAccessors(() => opening.getAttributes());
178
+ return {
179
+ getName: () => tagName,
180
+ getSourceFile: () => el.getSourceFile(),
181
+ isHtmlElement: () => htmlTag,
182
+ isComponent: () => !htmlTag,
183
+ ...attrs,
184
+ hasChildren: () => true,
185
+ getNode: () => el,
186
+ getStartLineNumber: () => el.getStartLineNumber(),
187
+ };
188
+ }
189
+ /**
190
+ * Create an ArchJsxElement from a JsxSelfClosingElement (no children).
191
+ */
192
+ // eess-exclude eess/no-unused-exports: consumed by the test suite (tests are outside the build project)
193
+ export function fromJsxSelfClosingElement(el) {
194
+ const tagName = el.getTagNameNode().getText();
195
+ const htmlTag = isHtmlTag(tagName);
196
+ const attrs = buildAttributeAccessors(() => el.getAttributes());
197
+ return {
198
+ getName: () => tagName,
199
+ getSourceFile: () => el.getSourceFile(),
200
+ isHtmlElement: () => htmlTag,
201
+ isComponent: () => !htmlTag,
202
+ ...attrs,
203
+ hasChildren: () => false,
204
+ getNode: () => el,
205
+ getStartLineNumber: () => el.getStartLineNumber(),
206
+ };
207
+ }
208
+ /**
209
+ * Scan a source file for all JSX elements.
210
+ *
211
+ * Short-circuits on non-.tsx/.jsx files. Uses single-pass traversal.
212
+ * Collects both JsxElement (has children) and JsxSelfClosingElement (no children).
213
+ * JsxFragment nodes are intentionally excluded — they have no tag name or attributes.
214
+ * Nested JSX elements ARE collected (consistent with collectCalls).
215
+ */
216
+ export function collectJsxElements(sourceFile) {
217
+ const filePath = sourceFile.getFilePath();
218
+ if (!filePath.endsWith('.tsx') && !filePath.endsWith('.jsx'))
219
+ return [];
220
+ const elements = [];
221
+ sourceFile.forEachDescendant((node) => {
222
+ if (Node.isJsxElement(node)) {
223
+ elements.push(fromJsxElement(node));
224
+ }
225
+ else if (Node.isJsxSelfClosingElement(node)) {
226
+ elements.push(fromJsxSelfClosingElement(node));
227
+ }
228
+ });
229
+ return elements;
230
+ }
231
+ //# sourceMappingURL=arch-jsx-element.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"arch-jsx-element.js","sourceRoot":"","sources":["../../src/models/arch-jsx-element.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import type { SourceFile } from 'ts-morph';
2
+ /** A named layer resolved to its source files. */
3
+ export interface Layer {
4
+ readonly name: string;
5
+ readonly pattern: string;
6
+ readonly files: SourceFile[];
7
+ }
8
+ /** A matched pair of elements from two layers. */
9
+ export interface LayerPair<A = SourceFile, B = SourceFile> {
10
+ readonly left: A;
11
+ readonly leftLayer: string;
12
+ readonly right: B;
13
+ readonly rightLayer: string;
14
+ }
15
+ //# sourceMappingURL=cross-layer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cross-layer.d.ts","sourceRoot":"","sources":["../../src/models/cross-layer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AAE1C,kDAAkD;AAClD,MAAM,WAAW,KAAK;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,KAAK,EAAE,UAAU,EAAE,CAAA;CAC7B;AAED,kDAAkD;AAClD,MAAM,WAAW,SAAS,CAAC,CAAC,GAAG,UAAU,EAAE,CAAC,GAAG,UAAU;IACvD,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAA;IAChB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAA;IACjB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;CAC5B"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=cross-layer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cross-layer.js","sourceRoot":"","sources":["../../src/models/cross-layer.ts"],"names":[],"mappings":""}
@@ -0,0 +1,60 @@
1
+ import type { SourceFile } from 'ts-morph';
2
+ import type { ArchProject } from '../core/project.js';
3
+ /**
4
+ * A slice groups source files into a logical unit.
5
+ * Slices are the nodes in the slice dependency graph.
6
+ */
7
+ export interface Slice {
8
+ /** Slice name — directory name for matching(), key name for assignedFrom() */
9
+ readonly name: string;
10
+ /** Source files belonging to this slice */
11
+ readonly files: SourceFile[];
12
+ }
13
+ /**
14
+ * A mapping of slice names to glob patterns.
15
+ * Used by `assignedFrom()` to define slices explicitly.
16
+ *
17
+ * @example
18
+ * const layers: SliceDefinition = {
19
+ * presentation: 'src/controllers/**',
20
+ * application: 'src/services/**',
21
+ * domain: 'src/domain/**',
22
+ * }
23
+ */
24
+ export type SliceDefinition = Record<string, string>;
25
+ /**
26
+ * Resolve slices by matching a glob pattern against source file paths.
27
+ * Each unique directory matching the glob becomes a slice.
28
+ *
29
+ * The glob must contain a wildcard segment that distinguishes slices.
30
+ * For example, 'src/features/*\/' matches each subdirectory of src/features/
31
+ * as a separate slice.
32
+ *
33
+ * @param project - The loaded ArchProject
34
+ * @param glob - A glob pattern where the wildcard segment defines slice boundaries
35
+ * @returns Array of slices, one per matching directory
36
+ *
37
+ * @example
38
+ * resolveByMatching(project, 'src/features/*\/')
39
+ * // => [{ name: 'auth', files: [...] }, { name: 'billing', files: [...] }]
40
+ */
41
+ export declare function resolveByMatching(project: ArchProject, glob: string): Slice[];
42
+ /**
43
+ * Resolve slices from an explicit name-to-glob mapping.
44
+ * Each key becomes a slice name, and files matching its glob are assigned to it.
45
+ *
46
+ * A file matching multiple globs is assigned to the FIRST matching slice.
47
+ * Files matching no glob are excluded from all slices.
48
+ *
49
+ * @param project - The loaded ArchProject
50
+ * @param definition - Map of slice names to glob patterns
51
+ * @returns Array of slices in definition key order
52
+ *
53
+ * @example
54
+ * resolveByDefinition(project, {
55
+ * presentation: 'src/controllers/**',
56
+ * domain: 'src/domain/**',
57
+ * })
58
+ */
59
+ export declare function resolveByDefinition(project: ArchProject, definition: SliceDefinition): Slice[];
60
+ //# sourceMappingURL=slice.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slice.d.ts","sourceRoot":"","sources":["../../src/models/slice.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AAC1C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAErD;;;GAGG;AACH,MAAM,WAAW,KAAK;IACpB,8EAA8E;IAC9E,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,2CAA2C;IAC3C,QAAQ,CAAC,KAAK,EAAE,UAAU,EAAE,CAAA;CAC7B;AAED;;;;;;;;;;GAUG;AACH,MAAM,MAAM,eAAe,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;AAEpD;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,GAAG,KAAK,EAAE,CAoC7E;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,eAAe,GAAG,KAAK,EAAE,CAsB9F"}
@@ -0,0 +1,89 @@
1
+ import picomatch from 'picomatch';
2
+ /**
3
+ * Resolve slices by matching a glob pattern against source file paths.
4
+ * Each unique directory matching the glob becomes a slice.
5
+ *
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.
9
+ *
10
+ * @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
13
+ *
14
+ * @example
15
+ * resolveByMatching(project, 'src/features/*\/')
16
+ * // => [{ name: 'auth', files: [...] }, { name: 'billing', files: [...] }]
17
+ */
18
+ 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 + '*/**';
23
+ const isMatch = picomatch(fullGlob);
24
+ const sourceFiles = project.getSourceFiles();
25
+ 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
+ for (const sf of sourceFiles) {
32
+ const filePath = sf.getFilePath();
33
+ if (!isMatch(filePath))
34
+ continue;
35
+ // Extract the slice name: the first directory segment after baseDir
36
+ const baseDirIdx = filePath.indexOf(baseDir);
37
+ if (baseDirIdx === -1)
38
+ continue;
39
+ const relativePart = filePath.slice(baseDirIdx + baseDir.length);
40
+ const sliceName = relativePart.split('/')[0];
41
+ if (!sliceName)
42
+ continue;
43
+ const existing = sliceMap.get(sliceName);
44
+ if (existing) {
45
+ existing.push(sf);
46
+ }
47
+ else {
48
+ sliceMap.set(sliceName, [sf]);
49
+ }
50
+ }
51
+ return Array.from(sliceMap.entries()).map(([name, files]) => ({ name, files }));
52
+ }
53
+ /**
54
+ * Resolve slices from an explicit name-to-glob mapping.
55
+ * Each key becomes a slice name, and files matching its glob are assigned to it.
56
+ *
57
+ * A file matching multiple globs is assigned to the FIRST matching slice.
58
+ * Files matching no glob are excluded from all slices.
59
+ *
60
+ * @param project - The loaded ArchProject
61
+ * @param definition - Map of slice names to glob patterns
62
+ * @returns Array of slices in definition key order
63
+ *
64
+ * @example
65
+ * resolveByDefinition(project, {
66
+ * presentation: 'src/controllers/**',
67
+ * domain: 'src/domain/**',
68
+ * })
69
+ */
70
+ export function resolveByDefinition(project, definition) {
71
+ const sourceFiles = project.getSourceFiles();
72
+ const entries = Object.entries(definition);
73
+ const matchers = entries.map(([name, glob]) => ({
74
+ name,
75
+ isMatch: picomatch(glob),
76
+ files: [],
77
+ }));
78
+ for (const sf of sourceFiles) {
79
+ const filePath = sf.getFilePath();
80
+ for (const matcher of matchers) {
81
+ if (matcher.isMatch(filePath)) {
82
+ matcher.files.push(sf);
83
+ break; // first match wins
84
+ }
85
+ }
86
+ }
87
+ return matchers.map(({ name, files }) => ({ name, files }));
88
+ }
89
+ //# sourceMappingURL=slice.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slice.js","sourceRoot":"","sources":["../../src/models/slice.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ import type { Predicate } from '@nielspeter/eess';
2
+ import type { ArchCall } from '../models/arch-call.js';
3
+ /**
4
+ * Matches calls on an object with the given name.
5
+ *
6
+ * For `app.get(...)`, onObject('app') matches.
7
+ * For `router.route.get(...)`, onObject('router.route') matches.
8
+ *
9
+ * @param name - Exact object name (after optional-chaining normalization)
10
+ */
11
+ export declare function onObject(name: string): Predicate<ArchCall>;
12
+ /**
13
+ * Matches calls whose method name matches the given pattern.
14
+ *
15
+ * For `app.get(...)`, withMethod('get') matches.
16
+ * For `app.get(...)`, withMethod(/^(get|post)$/) matches.
17
+ * For `handleError(...)` (bare call), withMethod('handleError') matches.
18
+ *
19
+ * @param nameOrRegex - Exact method name or regex pattern
20
+ */
21
+ export declare function withMethod(nameOrRegex: string | RegExp): Predicate<ArchCall>;
22
+ /**
23
+ * Matches calls where the argument at the given index matches a pattern.
24
+ *
25
+ * The pattern is matched against the argument's getText() output.
26
+ * Use for flexible argument matching (e.g., variable references, expressions).
27
+ *
28
+ * @param index - Zero-based argument position
29
+ * @param pattern - Regex or exact string to match against argument text
30
+ */
31
+ export declare function withArgMatching(index: number, pattern: string | RegExp): Predicate<ArchCall>;
32
+ /**
33
+ * Matches calls where the argument at the given index is a string literal
34
+ * matching the given glob pattern.
35
+ *
36
+ * Only matches when the argument is an actual string literal (quoted).
37
+ * The glob is matched against the string content (without quotes).
38
+ *
39
+ * @param index - Zero-based argument position
40
+ * @param glob - Glob pattern matched against the string literal value
41
+ *
42
+ * @example
43
+ * // Match: router.get('/api/users', handler)
44
+ * // Match: router.get('/api/users/:id', handler)
45
+ * // No match: router.get(pathVariable, handler)
46
+ * withStringArg(0, '/api/users/**')
47
+ */
48
+ export declare function withStringArg(index: number, glob: string): Predicate<ArchCall>;
49
+ //# sourceMappingURL=call.d.ts.map
@@ -0,0 +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"}
@@ -0,0 +1,115 @@
1
+ import { Node } from 'ts-morph';
2
+ import picomatch from 'picomatch';
3
+ /**
4
+ * Normalize text for matching: replace optional chaining `?.` with `.`
5
+ * so users don't need to account for both forms.
6
+ *
7
+ * Same normalization as src/helpers/matchers.ts.
8
+ */
9
+ function normalizeText(text) {
10
+ return text.replace(/\?\./g, '.');
11
+ }
12
+ /**
13
+ * Matches calls on an object with the given name.
14
+ *
15
+ * For `app.get(...)`, onObject('app') matches.
16
+ * For `router.route.get(...)`, onObject('router.route') matches.
17
+ *
18
+ * @param name - Exact object name (after optional-chaining normalization)
19
+ */
20
+ export function onObject(name) {
21
+ return {
22
+ description: `on object '${name}'`,
23
+ test: (call) => {
24
+ const obj = call.getObjectName();
25
+ return obj !== undefined && normalizeText(obj) === name;
26
+ },
27
+ };
28
+ }
29
+ /**
30
+ * Matches calls whose method name matches the given pattern.
31
+ *
32
+ * For `app.get(...)`, withMethod('get') matches.
33
+ * For `app.get(...)`, withMethod(/^(get|post)$/) matches.
34
+ * For `handleError(...)` (bare call), withMethod('handleError') matches.
35
+ *
36
+ * @param nameOrRegex - Exact method name or regex pattern
37
+ */
38
+ export function withMethod(nameOrRegex) {
39
+ if (typeof nameOrRegex === 'string') {
40
+ return {
41
+ description: `with method '${nameOrRegex}'`,
42
+ test: (call) => {
43
+ const method = call.getMethodName();
44
+ return method !== undefined && normalizeText(method) === nameOrRegex;
45
+ },
46
+ };
47
+ }
48
+ return {
49
+ description: `with method matching ${String(nameOrRegex)}`,
50
+ test: (call) => {
51
+ const method = call.getMethodName();
52
+ return method !== undefined && nameOrRegex.test(normalizeText(method));
53
+ },
54
+ };
55
+ }
56
+ /**
57
+ * Matches calls where the argument at the given index matches a pattern.
58
+ *
59
+ * The pattern is matched against the argument's getText() output.
60
+ * Use for flexible argument matching (e.g., variable references, expressions).
61
+ *
62
+ * @param index - Zero-based argument position
63
+ * @param pattern - Regex or exact string to match against argument text
64
+ */
65
+ export function withArgMatching(index, pattern) {
66
+ const regex = typeof pattern === 'string' ? new RegExp(pattern) : pattern;
67
+ return {
68
+ description: `with argument ${String(index)} matching ${String(regex)}`,
69
+ test: (call) => {
70
+ const args = call.getArguments();
71
+ if (index >= args.length)
72
+ return false;
73
+ const argNode = args[index];
74
+ if (!argNode)
75
+ return false;
76
+ const argText = argNode.getText();
77
+ return regex.test(argText);
78
+ },
79
+ };
80
+ }
81
+ /**
82
+ * Matches calls where the argument at the given index is a string literal
83
+ * matching the given glob pattern.
84
+ *
85
+ * Only matches when the argument is an actual string literal (quoted).
86
+ * The glob is matched against the string content (without quotes).
87
+ *
88
+ * @param index - Zero-based argument position
89
+ * @param glob - Glob pattern matched against the string literal value
90
+ *
91
+ * @example
92
+ * // Match: router.get('/api/users', handler)
93
+ * // Match: router.get('/api/users/:id', handler)
94
+ * // No match: router.get(pathVariable, handler)
95
+ * withStringArg(0, '/api/users/**')
96
+ */
97
+ export function withStringArg(index, glob) {
98
+ const isMatch = picomatch(glob);
99
+ return {
100
+ description: `with string argument ${String(index)} matching '${glob}'`,
101
+ test: (call) => {
102
+ const args = call.getArguments();
103
+ if (index >= args.length)
104
+ return false;
105
+ const arg = args[index];
106
+ if (!arg)
107
+ return false;
108
+ // Use ts-morph type guard (ADR-005: no duck typing or as casts)
109
+ if (!Node.isStringLiteral(arg))
110
+ return false;
111
+ return isMatch(arg.getLiteralValue());
112
+ },
113
+ };
114
+ }
115
+ //# sourceMappingURL=call.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"call.js","sourceRoot":"","sources":["../../src/predicates/call.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ import type { ClassDeclaration } from 'ts-morph';
2
+ import type { Predicate } from '@nielspeter/eess';
3
+ /**
4
+ * Matches classes that extend the named base class.
5
+ *
6
+ * Uses the extends clause expression text, e.g. `class Foo extends Bar`
7
+ * matches `extend('Bar')`.
8
+ */
9
+ export declare function extend(className: string): Predicate<ClassDeclaration>;
10
+ /**
11
+ * Matches classes that have an explicit `implements` clause for the named interface.
12
+ *
13
+ * Checks `getImplements()` expression texts.
14
+ */
15
+ export declare function implement(interfaceName: string): Predicate<ClassDeclaration>;
16
+ /**
17
+ * Matches classes that have a decorator with the given name.
18
+ *
19
+ * @example haveDecorator('Controller') matches `@Controller class Foo {}`
20
+ */
21
+ export declare function haveDecorator(name: string): Predicate<ClassDeclaration>;
22
+ /**
23
+ * Matches classes that have a decorator whose name matches the regex.
24
+ */
25
+ export declare function haveDecoratorMatching(regex: RegExp): Predicate<ClassDeclaration>;
26
+ /**
27
+ * Matches abstract classes.
28
+ */
29
+ export declare function areAbstract(): Predicate<ClassDeclaration>;
30
+ /**
31
+ * Matches classes that have a method with the given name.
32
+ */
33
+ export declare function haveMethodNamed(name: string): Predicate<ClassDeclaration>;
34
+ /**
35
+ * Matches classes that have a method whose name matches the regex.
36
+ */
37
+ export declare function haveMethodMatching(regex: RegExp): Predicate<ClassDeclaration>;
38
+ /**
39
+ * Matches classes that have a property with the given name.
40
+ */
41
+ export declare function havePropertyNamed(name: string): Predicate<ClassDeclaration>;
42
+ //# sourceMappingURL=class.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"class.d.ts","sourceRoot":"","sources":["../../src/predicates/class.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAA;AAChD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAEjD;;;;;GAKG;AACH,wBAAgB,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC,gBAAgB,CAAC,CAKrE;AAED;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,aAAa,EAAE,MAAM,GAAG,SAAS,CAAC,gBAAgB,CAAC,CAM5E;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC,gBAAgB,CAAC,CAKvE;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC,gBAAgB,CAAC,CAKhF;AAED;;GAEG;AACH,wBAAgB,WAAW,IAAI,SAAS,CAAC,gBAAgB,CAAC,CAKzD;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC,gBAAgB,CAAC,CAKzE;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC,gBAAgB,CAAC,CAS7E;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC,gBAAgB,CAAC,CAK3E"}