@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,96 @@
1
+ import type { SourceFile } from 'ts-morph';
2
+ import type { ArchProject } from '../core/project.js';
3
+ import type { PairCondition } from '../core/pair-condition.js';
4
+ import type { Layer, LayerPair } from '../models/cross-layer.js';
5
+ import { TerminalBuilder } from '@nielspeter/eess';
6
+ /**
7
+ * Builder for cross-layer consistency rules.
8
+ *
9
+ * Unlike RuleBuilder<T>, this operates on pairs of elements from different layers.
10
+ * The chain is: `.layer()` -> `.mapping()` -> `.forEachPair()` -> `.should()` -> `.check()`
11
+ *
12
+ * @example
13
+ * crossLayer(project)
14
+ * .layer('routes', 'src/routes/**')
15
+ * .layer('schemas', 'src/schemas/**')
16
+ * .mapping((a, b) => a.getBaseName().replace('Route', '') === b.getBaseName().replace('Schema', ''))
17
+ * .forEachPair()
18
+ * .should(haveMatchingCounterpart())
19
+ * .check()
20
+ */
21
+ export declare class CrossLayerBuilder {
22
+ private readonly project;
23
+ private readonly _layerDefs;
24
+ constructor(project: ArchProject);
25
+ /**
26
+ * Define a layer by name and glob pattern.
27
+ * At least two layers must be defined before calling `.mapping()`.
28
+ */
29
+ layer(name: string, pattern: string): this;
30
+ /**
31
+ * Provide a mapping function that determines which elements form pairs.
32
+ * The function receives one element from each layer and returns `true` if they should be paired.
33
+ *
34
+ * Requires at least 2 layers to have been defined.
35
+ */
36
+ mapping(fn: (a: SourceFile, b: SourceFile) => boolean): MappedCrossLayerBuilder;
37
+ }
38
+ /**
39
+ * Intermediate builder after `.mapping()` has been called.
40
+ * The layers are resolved and pairs computed.
41
+ */
42
+ export declare class MappedCrossLayerBuilder {
43
+ private readonly layers;
44
+ private readonly pairs;
45
+ constructor(layers: Layer[], pairs: LayerPair[]);
46
+ /**
47
+ * Iterate over each matched pair. Returns a builder for attaching conditions.
48
+ */
49
+ forEachPair(): PairConditionBuilder;
50
+ }
51
+ /**
52
+ * Builder after `.forEachPair()` — attach a pair condition via `.should()`.
53
+ */
54
+ export declare class PairConditionBuilder {
55
+ private readonly layers;
56
+ private readonly pairs;
57
+ constructor(layers: Layer[], pairs: LayerPair[]);
58
+ /**
59
+ * Attach a pair condition to evaluate against matched pairs.
60
+ */
61
+ should(condition: PairCondition): PairFinalBuilder;
62
+ }
63
+ /**
64
+ * Terminal builder — call `.check()`, `.warn()`, or `.because()`.
65
+ */
66
+ export declare class PairFinalBuilder extends TerminalBuilder {
67
+ private readonly layers;
68
+ private readonly pairs;
69
+ private readonly condition;
70
+ constructor(layers: Layer[], pairs: LayerPair[], condition: PairCondition);
71
+ protected collectViolations(): import("@nielspeter/eess").ArchViolation[];
72
+ }
73
+ /**
74
+ * Entry point: create a cross-layer consistency rule builder.
75
+ *
76
+ * @param p - The loaded ArchProject
77
+ * @returns A CrossLayerBuilder — call `.layer()` at least twice, then `.mapping()`
78
+ *
79
+ * @example
80
+ * crossLayer(project)
81
+ * .layer('routes', 'src/routes/**')
82
+ * .layer('schemas', 'src/schemas/**')
83
+ * .mapping((a, b) => a.getBaseName().replace('-route', '') === b.getBaseName().replace('-schema', ''))
84
+ * .forEachPair()
85
+ * .should(haveMatchingCounterpart())
86
+ * .check()
87
+ *
88
+ * @deprecated Superseded by the kernel `correspondence()` primitive
89
+ * (`@nielspeter/eess`), which binds two element `Selection`s from *any* loaders
90
+ * (not just two globs within one project) and is the engine `crossLayer` should
91
+ * have been built on. `crossLayer` continues to work; new rules should prefer
92
+ * `correspondence({ left, right }).should().beComplete(...)`. Full internal
93
+ * delegation onto `correspondence()` is a follow-up (see plan 0059, Phase 3).
94
+ */
95
+ export declare function crossLayer(p: ArchProject): CrossLayerBuilder;
96
+ //# sourceMappingURL=cross-layer-builder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cross-layer-builder.d.ts","sourceRoot":"","sources":["../../src/builders/cross-layer-builder.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AAC1C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AACrD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAA;AAE9D,OAAO,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAA;AAChE,OAAO,EAAE,eAAe,EAAmB,MAAM,kBAAkB,CAAA;AAqCnE;;;;;;;;;;;;;;GAcG;AACH,qBAAa,iBAAiB;IAGhB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAFpC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAA+C;gBAE7C,OAAO,EAAE,WAAW;IAEjD;;;OAGG;IACH,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;IAK1C;;;;;OAKG;IACH,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,UAAU,KAAK,OAAO,GAAG,uBAAuB;CAkBhF;AAED;;;GAGG;AAEH,qBAAa,uBAAuB;IAEhC,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,KAAK;gBADL,MAAM,EAAE,KAAK,EAAE,EACf,KAAK,EAAE,SAAS,EAAE;IAGrC;;OAEG;IACH,WAAW,IAAI,oBAAoB;CAGpC;AAED;;GAEG;AAEH,qBAAa,oBAAoB;IAE7B,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,KAAK;gBADL,MAAM,EAAE,KAAK,EAAE,EACf,KAAK,EAAE,SAAS,EAAE;IAGrC;;OAEG;IACH,MAAM,CAAC,SAAS,EAAE,aAAa,GAAG,gBAAgB;CAGnD;AAED;;GAEG;AAEH,qBAAa,gBAAiB,SAAQ,eAAe;IAEjD,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,SAAS;gBAFT,MAAM,EAAE,KAAK,EAAE,EACf,KAAK,EAAE,SAAS,EAAE,EAClB,SAAS,EAAE,aAAa;IAK3C,SAAS,CAAC,iBAAiB;CAY5B;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,UAAU,CAAC,CAAC,EAAE,WAAW,GAAG,iBAAiB,CAE5D"}
@@ -0,0 +1,172 @@
1
+ import picomatch from 'picomatch';
2
+ import { TerminalBuilder, matchSelections } from '@nielspeter/eess';
3
+ /**
4
+ * Resolve a layer by matching its glob against the project's source files.
5
+ */
6
+ function resolveLayer(project, name, pattern) {
7
+ const isMatch = picomatch(pattern);
8
+ const files = [];
9
+ for (const sf of project.getSourceFiles()) {
10
+ if (isMatch(sf.getFilePath())) {
11
+ files.push(sf);
12
+ }
13
+ }
14
+ return { name, pattern, files };
15
+ }
16
+ /**
17
+ * Compute matched pairs between two layers using a mapping function.
18
+ *
19
+ * Delegates the matching to the kernel's shared `matchSelections()` engine (the
20
+ * same one `correspondence()` uses), then wraps each pair with its layer names.
21
+ * There is no separate cross-layer matching implementation.
22
+ */
23
+ function computePairs(leftLayer, rightLayer, mappingFn) {
24
+ const { pairs } = matchSelections(leftLayer.files, rightLayer.files, { matchBy: mappingFn });
25
+ return pairs.map((p) => ({
26
+ left: p.left,
27
+ leftLayer: leftLayer.name,
28
+ right: p.right,
29
+ rightLayer: rightLayer.name,
30
+ }));
31
+ }
32
+ /**
33
+ * Builder for cross-layer consistency rules.
34
+ *
35
+ * Unlike RuleBuilder<T>, this operates on pairs of elements from different layers.
36
+ * The chain is: `.layer()` -> `.mapping()` -> `.forEachPair()` -> `.should()` -> `.check()`
37
+ *
38
+ * @example
39
+ * crossLayer(project)
40
+ * .layer('routes', 'src/routes/**')
41
+ * .layer('schemas', 'src/schemas/**')
42
+ * .mapping((a, b) => a.getBaseName().replace('Route', '') === b.getBaseName().replace('Schema', ''))
43
+ * .forEachPair()
44
+ * .should(haveMatchingCounterpart())
45
+ * .check()
46
+ */
47
+ export class CrossLayerBuilder {
48
+ project;
49
+ _layerDefs = [];
50
+ constructor(project) {
51
+ this.project = project;
52
+ }
53
+ /**
54
+ * Define a layer by name and glob pattern.
55
+ * At least two layers must be defined before calling `.mapping()`.
56
+ */
57
+ layer(name, pattern) {
58
+ this._layerDefs.push({ name, pattern });
59
+ return this;
60
+ }
61
+ /**
62
+ * Provide a mapping function that determines which elements form pairs.
63
+ * The function receives one element from each layer and returns `true` if they should be paired.
64
+ *
65
+ * Requires at least 2 layers to have been defined.
66
+ */
67
+ mapping(fn) {
68
+ if (this._layerDefs.length < 2) {
69
+ throw new RangeError('CrossLayerBuilder requires at least 2 layers before calling .mapping()');
70
+ }
71
+ // Resolve all layers
72
+ const layers = this._layerDefs.map((def) => resolveLayer(this.project, def.name, def.pattern));
73
+ // Compute pairs between consecutive layers
74
+ const allPairs = [];
75
+ for (let i = 0; i < layers.length - 1; i++) {
76
+ const left = layers[i];
77
+ const right = layers[i + 1];
78
+ if (left && right)
79
+ allPairs.push(...computePairs(left, right, fn));
80
+ }
81
+ return new MappedCrossLayerBuilder(layers, allPairs);
82
+ }
83
+ }
84
+ /**
85
+ * Intermediate builder after `.mapping()` has been called.
86
+ * The layers are resolved and pairs computed.
87
+ */
88
+ // eess-exclude eess/no-unused-exports: return type of the exported CrossLayerBuilder.mapping() fluent-chain method (must stay exported for declaration emit)
89
+ export class MappedCrossLayerBuilder {
90
+ layers;
91
+ pairs;
92
+ constructor(layers, pairs) {
93
+ this.layers = layers;
94
+ this.pairs = pairs;
95
+ }
96
+ /**
97
+ * Iterate over each matched pair. Returns a builder for attaching conditions.
98
+ */
99
+ forEachPair() {
100
+ return new PairConditionBuilder(this.layers, this.pairs);
101
+ }
102
+ }
103
+ /**
104
+ * Builder after `.forEachPair()` — attach a pair condition via `.should()`.
105
+ */
106
+ // eess-exclude eess/no-unused-exports: return type of the exported MappedCrossLayerBuilder.forEachPair() fluent-chain method (must stay exported for declaration emit)
107
+ export class PairConditionBuilder {
108
+ layers;
109
+ pairs;
110
+ constructor(layers, pairs) {
111
+ this.layers = layers;
112
+ this.pairs = pairs;
113
+ }
114
+ /**
115
+ * Attach a pair condition to evaluate against matched pairs.
116
+ */
117
+ should(condition) {
118
+ return new PairFinalBuilder(this.layers, this.pairs, condition);
119
+ }
120
+ }
121
+ /**
122
+ * Terminal builder — call `.check()`, `.warn()`, or `.because()`.
123
+ */
124
+ // eess-exclude eess/no-unused-exports: return type of the exported PairConditionBuilder.should() fluent-chain method (must stay exported for declaration emit)
125
+ export class PairFinalBuilder extends TerminalBuilder {
126
+ layers;
127
+ pairs;
128
+ condition;
129
+ constructor(layers, pairs, condition) {
130
+ super();
131
+ this.layers = layers;
132
+ this.pairs = pairs;
133
+ this.condition = condition;
134
+ }
135
+ collectViolations() {
136
+ const layerNames = this.layers.map((l) => l.name);
137
+ const context = {
138
+ rule: `cross-layer [${layerNames.join(', ')}] should ${this.condition.description}`,
139
+ because: this._reason,
140
+ ruleId: this._metadata?.id,
141
+ suggestion: this._metadata?.suggestion,
142
+ docs: this._metadata?.docs,
143
+ };
144
+ return this.condition.evaluate(this.pairs, context);
145
+ }
146
+ }
147
+ /**
148
+ * Entry point: create a cross-layer consistency rule builder.
149
+ *
150
+ * @param p - The loaded ArchProject
151
+ * @returns A CrossLayerBuilder — call `.layer()` at least twice, then `.mapping()`
152
+ *
153
+ * @example
154
+ * crossLayer(project)
155
+ * .layer('routes', 'src/routes/**')
156
+ * .layer('schemas', 'src/schemas/**')
157
+ * .mapping((a, b) => a.getBaseName().replace('-route', '') === b.getBaseName().replace('-schema', ''))
158
+ * .forEachPair()
159
+ * .should(haveMatchingCounterpart())
160
+ * .check()
161
+ *
162
+ * @deprecated Superseded by the kernel `correspondence()` primitive
163
+ * (`@nielspeter/eess`), which binds two element `Selection`s from *any* loaders
164
+ * (not just two globs within one project) and is the engine `crossLayer` should
165
+ * have been built on. `crossLayer` continues to work; new rules should prefer
166
+ * `correspondence({ left, right }).should().beComplete(...)`. Full internal
167
+ * delegation onto `correspondence()` is a follow-up (see plan 0059, Phase 3).
168
+ */
169
+ export function crossLayer(p) {
170
+ return new CrossLayerBuilder(p);
171
+ }
172
+ //# sourceMappingURL=cross-layer-builder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cross-layer-builder.js","sourceRoot":"","sources":["../../src/builders/cross-layer-builder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,198 @@
1
+ import type { ArchProject } from '../core/project.js';
2
+ import type { Condition } from '@nielspeter/eess';
3
+ import { RuleBuilder } from '@nielspeter/eess';
4
+ import type { ExpressionMatcher } from '../helpers/matchers.js';
5
+ import type { ArchFunction } from '../models/arch-function.js';
6
+ import type { ArchPattern } from '../helpers/pattern.js';
7
+ import type { TypeMatcher } from '../helpers/type-matchers.js';
8
+ /**
9
+ * Rule builder for function-level architecture rules.
10
+ *
11
+ * Operates on both FunctionDeclarations and const arrow functions,
12
+ * unified through the ArchFunction model.
13
+ *
14
+ * @example
15
+ * ```typescript
16
+ * // All parseXxxOrder functions should not exist
17
+ * functions(project)
18
+ * .that().haveNameMatching(/^parse\w+Order$/)
19
+ * .should(notExist())
20
+ * .because('use shared parseOrder() utility instead')
21
+ * .check()
22
+ *
23
+ * // No function should have more than 5 parameters
24
+ * functions(project)
25
+ * .that().haveParameterCountGreaterThan(5)
26
+ * .should(notExist())
27
+ * .because('functions with many parameters are hard to use')
28
+ * .check()
29
+ *
30
+ * // All exported async functions should have names starting with a verb
31
+ * functions(project)
32
+ * .that().areExported().and().areAsync()
33
+ * .should().haveNameMatching(/^(get|find|create|update|delete|fetch|load|save)/)
34
+ * .because('async functions should use verb prefixes')
35
+ * .check()
36
+ * ```
37
+ */
38
+ export declare class FunctionRuleBuilder extends RuleBuilder<ArchFunction, ArchProject> {
39
+ protected getElements(): ArchFunction[];
40
+ /**
41
+ * After `.that()`: filter functions whose name matches the pattern.
42
+ * After `.should()`: assert matched functions have names matching the pattern.
43
+ */
44
+ haveNameMatching(pattern: RegExp | string): this;
45
+ /** Filter to functions whose name starts with the given prefix. */
46
+ haveNameStartingWith(prefix: string): this;
47
+ /** Filter to functions whose name ends with the given suffix. */
48
+ haveNameEndingWith(suffix: string): this;
49
+ /**
50
+ * After `.that()`: filter functions in a file matching the glob.
51
+ * After `.should()`: assert functions reside in a file matching the glob.
52
+ */
53
+ resideInFile(glob: string): this;
54
+ /**
55
+ * After `.that()`: filter functions in a folder matching the glob.
56
+ * After `.should()`: assert functions reside in a folder matching the glob.
57
+ */
58
+ resideInFolder(glob: string): this;
59
+ /** Filter to functions that are exported from their module. */
60
+ areExported(): this;
61
+ /** Filter to functions that are NOT exported from their module. */
62
+ areNotExported(): this;
63
+ /**
64
+ * Filter to public functions. Class methods match when `public` or
65
+ * unmarked; standalone and arrow functions are always public.
66
+ */
67
+ arePublic(): this;
68
+ /** Filter to `protected` class methods (standalone functions never match). */
69
+ areProtected(): this;
70
+ /** Filter to `private` class methods (standalone functions never match). */
71
+ arePrivate(): this;
72
+ /** Filter to functions declared with the `async` keyword. */
73
+ areAsync(): this;
74
+ /** Filter to functions NOT declared `async`. */
75
+ areNotAsync(): this;
76
+ /** Filter to functions that declare exactly `n` parameters. */
77
+ haveParameterCount(n: number): this;
78
+ /** Filter to functions that declare more than `n` parameters. */
79
+ haveParameterCountGreaterThan(n: number): this;
80
+ /** Filter to functions that declare fewer than `n` parameters. */
81
+ haveParameterCountLessThan(n: number): this;
82
+ /** Filter to functions that declare a parameter with the given exact name. */
83
+ haveParameterNamed(name: string): this;
84
+ /**
85
+ * Filter to functions whose return type text matches the pattern
86
+ * (e.g. `/Promise</`, `'void'`). A string is compiled to a RegExp.
87
+ */
88
+ haveReturnType(pattern: RegExp | string): this;
89
+ /** Filter to functions that declare a rest parameter (`...args`). */
90
+ haveRestParameter(): this;
91
+ /** Filter to functions with at least one optional (`x?`) or default-valued parameter. */
92
+ haveOptionalParameter(): this;
93
+ /**
94
+ * Filter to functions whose parameter at `index` has a type satisfying
95
+ * the matcher. Out-of-bounds indices never match; for a rest parameter
96
+ * the type is the array type (e.g. `string[]`).
97
+ */
98
+ haveParameterOfType(index: number, matcher: TypeMatcher): this;
99
+ /** Filter to functions with at least one parameter whose name matches the regex. */
100
+ haveParameterNameMatching(pattern: RegExp): this;
101
+ /**
102
+ * Register a condition. Public API for passing standalone conditions
103
+ * (like notExist(), beExported()) into the builder chain.
104
+ */
105
+ withCondition(condition: Condition<ArchFunction>): this;
106
+ /**
107
+ * The filtered function set must be empty.
108
+ */
109
+ notExist(): this;
110
+ /**
111
+ * Functions must be exported from their module.
112
+ */
113
+ beExported(): this;
114
+ /**
115
+ * Functions must be async.
116
+ */
117
+ beAsync(): this;
118
+ /** @deprecated Use `haveNameMatching()` after `.should()` instead. */
119
+ conditionHaveNameMatching(pattern: RegExp): this;
120
+ /**
121
+ * Assert that at least one parameter has a type matching the given matcher.
122
+ *
123
+ * **Scope note:** Scans only the function's own parameter list.
124
+ * Unlike the class-level counterpart, does NOT scan set accessors
125
+ * because `collectFunctions()` excludes them.
126
+ */
127
+ acceptParameterOfType(matcher: TypeMatcher): this;
128
+ /**
129
+ * Assert that NO parameter has a type matching the given matcher.
130
+ * Reports one violation per matching parameter.
131
+ *
132
+ * **Scope note:** Scans only the function's own parameter list.
133
+ * Unlike the class-level counterpart, does NOT scan set accessors
134
+ * because `collectFunctions()` excludes them.
135
+ */
136
+ notAcceptParameterOfType(matcher: TypeMatcher): this;
137
+ /**
138
+ * Assert that the function's return type satisfies the given TypeMatcher.
139
+ *
140
+ * Uses TypeMatcher for composability with `isString()`, `matching()`,
141
+ * `not()`, `exactly()`, etc.
142
+ *
143
+ * @example
144
+ * functions(project)
145
+ * .that().haveNameMatching(/^list/)
146
+ * .should().haveReturnTypeMatching(matching(/Collection/))
147
+ * .check()
148
+ */
149
+ haveReturnTypeMatching(matcher: TypeMatcher): this;
150
+ /**
151
+ * Assert that the function body contains at least one match.
152
+ */
153
+ contain(matcher: ExpressionMatcher): this;
154
+ /**
155
+ * Assert that the function body does NOT contain any match.
156
+ * Produces one violation per matching node found.
157
+ */
158
+ notContain(matcher: ExpressionMatcher): this;
159
+ /**
160
+ * Assert: must NOT contain 'bad' AND must contain 'good'.
161
+ * Better violation messages than combining notContain + contain separately.
162
+ */
163
+ useInsteadOf(bad: ExpressionMatcher, good: ExpressionMatcher): this;
164
+ /**
165
+ * Assert that matched functions do not have empty bodies.
166
+ * Expression-bodied arrows always pass (no block body).
167
+ */
168
+ notHaveEmptyBody(): this;
169
+ /**
170
+ * Assert that matched functions follow an architectural pattern.
171
+ *
172
+ * Checks that return types contain all properties defined in
173
+ * the pattern's returnShape with matching types.
174
+ */
175
+ followPattern(pattern: ArchPattern): this;
176
+ }
177
+ /**
178
+ * Entry point for function-level architecture rules.
179
+ *
180
+ * Scans all source files in the project for both FunctionDeclarations
181
+ * and const arrow functions (VariableDeclaration with ArrowFunction initializer).
182
+ *
183
+ * @example
184
+ * ```typescript
185
+ * import { project, functions } from '@nielspeter/eess-ts'
186
+ *
187
+ * const p = project('tsconfig.json')
188
+ *
189
+ * // All parseXxxOrder functions should not exist
190
+ * functions(p)
191
+ * .that().haveNameMatching(/^parse\w+Order$/)
192
+ * .should(notExist())
193
+ * .because('use shared parseOrder() utility instead')
194
+ * .check()
195
+ * ```
196
+ */
197
+ export declare function functions(p: ArchProject): FunctionRuleBuilder;
198
+ //# sourceMappingURL=function-rule-builder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"function-rule-builder.d.ts","sourceRoot":"","sources":["../../src/builders/function-rule-builder.ts"],"names":[],"mappings":"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"}