ddd-ts-kit 0.1.1 → 0.2.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 (609) hide show
  1. package/README.md +81 -21
  2. package/dist/alias/compiler-resolution-of.d.ts +10 -0
  3. package/dist/alias/compiler-resolution-of.d.ts.map +1 -0
  4. package/dist/alias/compiler-resolution-of.js +13 -0
  5. package/dist/alias/compiler-resolution-of.js.map +1 -0
  6. package/dist/alias/compiler-resolution.d.ts +8 -0
  7. package/dist/alias/compiler-resolution.d.ts.map +1 -0
  8. package/dist/alias/compiler-resolution.js +2 -0
  9. package/dist/alias/compiler-resolution.js.map +1 -0
  10. package/dist/alias/index.d.ts +3 -1
  11. package/dist/alias/index.d.ts.map +1 -1
  12. package/dist/alias/index.js +3 -1
  13. package/dist/alias/index.js.map +1 -1
  14. package/dist/alias/module-name-mapper.d.ts +4 -3
  15. package/dist/alias/module-name-mapper.d.ts.map +1 -1
  16. package/dist/alias/module-name-mapper.js +6 -4
  17. package/dist/alias/module-name-mapper.js.map +1 -1
  18. package/dist/alias/specifier-of.d.ts +7 -0
  19. package/dist/alias/specifier-of.d.ts.map +1 -0
  20. package/dist/alias/specifier-of.js +17 -0
  21. package/dist/alias/specifier-of.js.map +1 -0
  22. package/dist/alias/specifier-suffix.d.ts +6 -0
  23. package/dist/alias/specifier-suffix.d.ts.map +1 -0
  24. package/dist/alias/specifier-suffix.js +8 -0
  25. package/dist/alias/specifier-suffix.js.map +1 -0
  26. package/dist/alias/to-alias.d.ts +3 -2
  27. package/dist/alias/to-alias.d.ts.map +1 -1
  28. package/dist/alias/to-alias.js +4 -3
  29. package/dist/alias/to-alias.js.map +1 -1
  30. package/dist/build/emitted-place.d.ts +2 -0
  31. package/dist/build/emitted-place.d.ts.map +1 -1
  32. package/dist/build/emitted-specifier.d.ts +3 -2
  33. package/dist/build/emitted-specifier.d.ts.map +1 -1
  34. package/dist/build/emitted-specifier.js +6 -12
  35. package/dist/build/emitted-specifier.js.map +1 -1
  36. package/dist/build/emitted-target.d.ts +9 -0
  37. package/dist/build/emitted-target.d.ts.map +1 -0
  38. package/dist/build/emitted-target.js +18 -0
  39. package/dist/build/emitted-target.js.map +1 -0
  40. package/dist/build/rewrite-aliases.d.ts +5 -3
  41. package/dist/build/rewrite-aliases.d.ts.map +1 -1
  42. package/dist/build/rewrite-aliases.js +12 -7
  43. package/dist/build/rewrite-aliases.js.map +1 -1
  44. package/dist/build/rewrite-specifiers.d.ts +3 -1
  45. package/dist/build/rewrite-specifiers.d.ts.map +1 -1
  46. package/dist/build/rewrite-specifiers.js +2 -2
  47. package/dist/build/rewrite-specifiers.js.map +1 -1
  48. package/dist/build/unresolved-problem.d.ts +4 -0
  49. package/dist/build/unresolved-problem.d.ts.map +1 -0
  50. package/dist/build/unresolved-problem.js +16 -0
  51. package/dist/build/unresolved-problem.js.map +1 -0
  52. package/dist/check/alias/compiler-resolution.d.ts +10 -0
  53. package/dist/check/alias/compiler-resolution.d.ts.map +1 -0
  54. package/dist/check/alias/compiler-resolution.js +47 -0
  55. package/dist/check/alias/compiler-resolution.js.map +1 -0
  56. package/dist/check/alias/test-runners.js +4 -4
  57. package/dist/check/alias/test-runners.js.map +1 -1
  58. package/dist/check/canonical/roles.d.ts.map +1 -1
  59. package/dist/check/canonical/roles.js +6 -0
  60. package/dist/check/canonical/roles.js.map +1 -1
  61. package/dist/check/catalogue/architecture-rules.d.ts.map +1 -1
  62. package/dist/check/catalogue/architecture-rules.js +4 -0
  63. package/dist/check/catalogue/architecture-rules.js.map +1 -1
  64. package/dist/check/configuration/config-inspection.d.ts +2 -0
  65. package/dist/check/configuration/config-inspection.d.ts.map +1 -1
  66. package/dist/check/configuration/config-inspection.js +11 -1
  67. package/dist/check/configuration/config-inspection.js.map +1 -1
  68. package/dist/check/declarations/classes-of.js +1 -1
  69. package/dist/check/declarations/classes-of.js.map +1 -1
  70. package/dist/check/explain/context-docs.js +7 -7
  71. package/dist/check/explain/context-docs.js.map +1 -1
  72. package/dist/check/explain/imports-docs.d.ts.map +1 -1
  73. package/dist/check/explain/imports-docs.js +24 -9
  74. package/dist/check/explain/imports-docs.js.map +1 -1
  75. package/dist/check/explain/layer-docs.js +7 -7
  76. package/dist/check/explain/layer-docs.js.map +1 -1
  77. package/dist/check/explain/ports-docs.d.ts.map +1 -1
  78. package/dist/check/explain/ports-docs.js +15 -7
  79. package/dist/check/explain/ports-docs.js.map +1 -1
  80. package/dist/check/explain/scheduling-docs.js +1 -1
  81. package/dist/check/explain/wiring-docs.d.ts.map +1 -1
  82. package/dist/check/explain/wiring-docs.js +35 -10
  83. package/dist/check/explain/wiring-docs.js.map +1 -1
  84. package/dist/check/fixtures/alias-declared-fixtures.d.ts.map +1 -1
  85. package/dist/check/fixtures/alias-declared-fixtures.js +32 -1
  86. package/dist/check/fixtures/alias-declared-fixtures.js.map +1 -1
  87. package/dist/check/fixtures/config-fixtures.d.ts.map +1 -1
  88. package/dist/check/fixtures/config-fixtures.js +6 -0
  89. package/dist/check/fixtures/config-fixtures.js.map +1 -1
  90. package/dist/check/fixtures/constructor-injection-fixtures.d.ts +3 -0
  91. package/dist/check/fixtures/constructor-injection-fixtures.d.ts.map +1 -0
  92. package/dist/check/fixtures/constructor-injection-fixtures.js +111 -0
  93. package/dist/check/fixtures/constructor-injection-fixtures.js.map +1 -0
  94. package/dist/check/fixtures/declared-project.d.ts.map +1 -1
  95. package/dist/check/fixtures/declared-project.js +4 -1
  96. package/dist/check/fixtures/declared-project.js.map +1 -1
  97. package/dist/check/fixtures/extension-fixtures.d.ts +3 -0
  98. package/dist/check/fixtures/extension-fixtures.d.ts.map +1 -0
  99. package/dist/check/fixtures/extension-fixtures.js +77 -0
  100. package/dist/check/fixtures/extension-fixtures.js.map +1 -0
  101. package/dist/check/fixtures/fixtures.d.ts.map +1 -1
  102. package/dist/check/fixtures/fixtures.js +4 -0
  103. package/dist/check/fixtures/fixtures.js.map +1 -1
  104. package/dist/check/fixtures/signature-project.d.ts +11 -0
  105. package/dist/check/fixtures/signature-project.d.ts.map +1 -0
  106. package/dist/check/fixtures/signature-project.js +21 -0
  107. package/dist/check/fixtures/signature-project.js.map +1 -0
  108. package/dist/check/fixtures/signature.d.ts +13 -0
  109. package/dist/check/fixtures/signature.d.ts.map +1 -0
  110. package/dist/check/fixtures/signature.js +24 -0
  111. package/dist/check/fixtures/signature.js.map +1 -0
  112. package/dist/check/project/beside-the-sources.d.ts +5 -0
  113. package/dist/check/project/beside-the-sources.d.ts.map +1 -0
  114. package/dist/check/project/beside-the-sources.js +21 -0
  115. package/dist/check/project/beside-the-sources.js.map +1 -0
  116. package/dist/check/project/resolve-import.d.ts.map +1 -1
  117. package/dist/check/project/resolve-import.js +4 -1
  118. package/dist/check/project/resolve-import.js.map +1 -1
  119. package/dist/check/rules/clean-one-export-per-file.d.ts.map +1 -1
  120. package/dist/check/rules/clean-one-export-per-file.js +14 -8
  121. package/dist/check/rules/clean-one-export-per-file.js.map +1 -1
  122. package/dist/check/rules/config-valid.d.ts.map +1 -1
  123. package/dist/check/rules/config-valid.js +2 -1
  124. package/dist/check/rules/config-valid.js.map +1 -1
  125. package/dist/check/rules/declarations-barrel-current.d.ts.map +1 -1
  126. package/dist/check/rules/declarations-barrel-current.js +34 -32
  127. package/dist/check/rules/declarations-barrel-current.js.map +1 -1
  128. package/dist/check/rules/declarations-constructor-injection.d.ts +3 -0
  129. package/dist/check/rules/declarations-constructor-injection.d.ts.map +1 -0
  130. package/dist/check/rules/declarations-constructor-injection.js +58 -0
  131. package/dist/check/rules/declarations-constructor-injection.js.map +1 -0
  132. package/dist/check/rules/imports-alias-declared.d.ts.map +1 -1
  133. package/dist/check/rules/imports-alias-declared.js +3 -1
  134. package/dist/check/rules/imports-alias-declared.js.map +1 -1
  135. package/dist/check/rules/imports-alias-only.d.ts.map +1 -1
  136. package/dist/check/rules/imports-alias-only.js +16 -29
  137. package/dist/check/rules/imports-alias-only.js.map +1 -1
  138. package/dist/check/rules/imports-extension.d.ts +3 -0
  139. package/dist/check/rules/imports-extension.d.ts.map +1 -0
  140. package/dist/check/rules/imports-extension.js +65 -0
  141. package/dist/check/rules/imports-extension.js.map +1 -0
  142. package/dist/check/rules/ports-no-concrete-dependency.d.ts.map +1 -1
  143. package/dist/check/rules/ports-no-concrete-dependency.js +43 -15
  144. package/dist/check/rules/ports-no-concrete-dependency.js.map +1 -1
  145. package/dist/check/rules/tree-closed.js +6 -4
  146. package/dist/check/rules/tree-closed.js.map +1 -1
  147. package/dist/commands/build-aliases.d.ts.map +1 -1
  148. package/dist/commands/build-aliases.js +5 -3
  149. package/dist/commands/build-aliases.js.map +1 -1
  150. package/dist/commands/docs.d.ts.map +1 -1
  151. package/dist/commands/docs.js +17 -2
  152. package/dist/commands/docs.js.map +1 -1
  153. package/dist/commands/init.d.ts.map +1 -1
  154. package/dist/commands/init.js +5 -4
  155. package/dist/commands/init.js.map +1 -1
  156. package/dist/commit/is-derived.d.ts.map +1 -1
  157. package/dist/commit/is-derived.js +5 -2
  158. package/dist/commit/is-derived.js.map +1 -1
  159. package/dist/config/config.d.ts +2 -0
  160. package/dist/config/config.d.ts.map +1 -1
  161. package/dist/config/default-import-extension.d.ts +3 -0
  162. package/dist/config/default-import-extension.d.ts.map +1 -0
  163. package/dist/config/default-import-extension.js +3 -0
  164. package/dist/config/default-import-extension.js.map +1 -0
  165. package/dist/config/import-extensions.d.ts +3 -0
  166. package/dist/config/import-extensions.d.ts.map +1 -0
  167. package/dist/config/import-extensions.js +3 -0
  168. package/dist/config/import-extensions.js.map +1 -0
  169. package/dist/config/index.d.ts +4 -1
  170. package/dist/config/index.d.ts.map +1 -1
  171. package/dist/config/index.js +4 -1
  172. package/dist/config/index.js.map +1 -1
  173. package/dist/config/parse-config.d.ts.map +1 -1
  174. package/dist/config/parse-config.js +2 -0
  175. package/dist/config/parse-config.js.map +1 -1
  176. package/dist/config/parse-stack.d.ts.map +1 -1
  177. package/dist/config/parse-stack.js +2 -1
  178. package/dist/config/parse-stack.js.map +1 -1
  179. package/dist/config/restack-config-text.d.ts +11 -0
  180. package/dist/config/restack-config-text.d.ts.map +1 -0
  181. package/dist/config/restack-config-text.js +31 -0
  182. package/dist/config/restack-config-text.js.map +1 -0
  183. package/dist/config/serialize-config.d.ts.map +1 -1
  184. package/dist/config/serialize-config.js +3 -6
  185. package/dist/config/serialize-config.js.map +1 -1
  186. package/dist/config/stack.d.ts +8 -0
  187. package/dist/config/stack.d.ts.map +1 -1
  188. package/dist/config/stack.js +1 -0
  189. package/dist/config/stack.js.map +1 -1
  190. package/dist/config/unwritten-import-extension.d.ts +3 -0
  191. package/dist/config/unwritten-import-extension.d.ts.map +1 -0
  192. package/dist/config/unwritten-import-extension.js +3 -0
  193. package/dist/config/unwritten-import-extension.js.map +1 -0
  194. package/dist/config/written-stack.d.ts +8 -0
  195. package/dist/config/written-stack.d.ts.map +1 -0
  196. package/dist/config/written-stack.js +10 -0
  197. package/dist/config/written-stack.js.map +1 -0
  198. package/dist/declared/declared-role.d.ts.map +1 -1
  199. package/dist/declared/declared-role.js +1 -0
  200. package/dist/declared/declared-role.js.map +1 -1
  201. package/dist/declared/dependencies-file.d.ts +7 -0
  202. package/dist/declared/dependencies-file.d.ts.map +1 -0
  203. package/dist/declared/dependencies-file.js +9 -0
  204. package/dist/declared/dependencies-file.js.map +1 -0
  205. package/dist/declared/generated-drift.d.ts +7 -0
  206. package/dist/declared/generated-drift.d.ts.map +1 -0
  207. package/dist/declared/generated-drift.js +47 -0
  208. package/dist/declared/generated-drift.js.map +1 -0
  209. package/dist/declared/index.d.ts +8 -1
  210. package/dist/declared/index.d.ts.map +1 -1
  211. package/dist/declared/index.js +6 -1
  212. package/dist/declared/index.js.map +1 -1
  213. package/dist/declared/injection/class-injection.d.ts +19 -0
  214. package/dist/declared/injection/class-injection.d.ts.map +1 -0
  215. package/dist/declared/injection/class-injection.js +2 -0
  216. package/dist/declared/injection/class-injection.js.map +1 -0
  217. package/dist/declared/injection/constructor-of.d.ts +16 -0
  218. package/dist/declared/injection/constructor-of.d.ts.map +1 -0
  219. package/dist/declared/injection/constructor-of.js +33 -0
  220. package/dist/declared/injection/constructor-of.js.map +1 -0
  221. package/dist/declared/injection/context-injections.d.ts +8 -0
  222. package/dist/declared/injection/context-injections.d.ts.map +1 -0
  223. package/dist/declared/injection/context-injections.js +14 -0
  224. package/dist/declared/injection/context-injections.js.map +1 -0
  225. package/dist/declared/injection/declared-kind-of.d.ts +8 -0
  226. package/dist/declared/injection/declared-kind-of.d.ts.map +1 -0
  227. package/dist/declared/injection/declared-kind-of.js +12 -0
  228. package/dist/declared/injection/declared-kind-of.js.map +1 -0
  229. package/dist/declared/injection/exported-name-of.d.ts +4 -0
  230. package/dist/declared/injection/exported-name-of.d.ts.map +1 -0
  231. package/dist/declared/injection/exported-name-of.js +17 -0
  232. package/dist/declared/injection/exported-name-of.js.map +1 -0
  233. package/dist/declared/injection/language-types.d.ts +3 -0
  234. package/dist/declared/injection/language-types.d.ts.map +1 -0
  235. package/dist/declared/injection/language-types.js +32 -0
  236. package/dist/declared/injection/language-types.js.map +1 -0
  237. package/dist/declared/injection/local-names.d.ts +17 -0
  238. package/dist/declared/injection/local-names.d.ts.map +1 -0
  239. package/dist/declared/injection/local-names.js +41 -0
  240. package/dist/declared/injection/local-names.js.map +1 -0
  241. package/dist/declared/injection/parameter-shape.d.ts +11 -0
  242. package/dist/declared/injection/parameter-shape.d.ts.map +1 -0
  243. package/dist/declared/injection/parameter-shape.js +58 -0
  244. package/dist/declared/injection/parameter-shape.js.map +1 -0
  245. package/dist/declared/injection/raw-class-name.d.ts +7 -0
  246. package/dist/declared/injection/raw-class-name.d.ts.map +1 -0
  247. package/dist/declared/injection/raw-class-name.js +28 -0
  248. package/dist/declared/injection/raw-class-name.js.map +1 -0
  249. package/dist/declared/injection/read-constructor.d.ts +10 -0
  250. package/dist/declared/injection/read-constructor.d.ts.map +1 -0
  251. package/dist/declared/injection/read-constructor.js +2 -0
  252. package/dist/declared/injection/read-constructor.js.map +1 -0
  253. package/dist/declared/injection/read-injections.d.ts +6 -0
  254. package/dist/declared/injection/read-injections.d.ts.map +1 -0
  255. package/dist/declared/injection/read-injections.js +75 -0
  256. package/dist/declared/injection/read-injections.js.map +1 -0
  257. package/dist/declared/injection/render-injections.d.ts +11 -0
  258. package/dist/declared/injection/render-injections.d.ts.map +1 -0
  259. package/dist/declared/injection/render-injections.js +51 -0
  260. package/dist/declared/injection/render-injections.js.map +1 -0
  261. package/dist/declared/injection/rendered-injections.d.ts +8 -0
  262. package/dist/declared/injection/rendered-injections.d.ts.map +1 -0
  263. package/dist/declared/injection/rendered-injections.js +2 -0
  264. package/dist/declared/injection/rendered-injections.js.map +1 -0
  265. package/dist/declared/injection/resolve-token.d.ts +18 -0
  266. package/dist/declared/injection/resolve-token.d.ts.map +1 -0
  267. package/dist/declared/injection/resolve-token.js +46 -0
  268. package/dist/declared/injection/resolve-token.js.map +1 -0
  269. package/dist/declared/injection/resolved-token.d.ts +10 -0
  270. package/dist/declared/injection/resolved-token.d.ts.map +1 -0
  271. package/dist/declared/injection/resolved-token.js +2 -0
  272. package/dist/declared/injection/resolved-token.js.map +1 -0
  273. package/dist/declared/injection/sources.d.ts +4 -0
  274. package/dist/declared/injection/sources.d.ts.map +1 -0
  275. package/dist/declared/injection/sources.js +2 -0
  276. package/dist/declared/injection/sources.js.map +1 -0
  277. package/dist/declared/injection/token-reference.d.ts +14 -0
  278. package/dist/declared/injection/token-reference.d.ts.map +1 -0
  279. package/dist/declared/injection/token-reference.js +2 -0
  280. package/dist/declared/injection/token-reference.js.map +1 -0
  281. package/dist/declared/render-barrel.d.ts +8 -5
  282. package/dist/declared/render-barrel.d.ts.map +1 -1
  283. package/dist/declared/render-barrel.js +13 -6
  284. package/dist/declared/render-barrel.js.map +1 -1
  285. package/dist/declared/render-dependencies-file.d.ts +8 -0
  286. package/dist/declared/render-dependencies-file.d.ts.map +1 -0
  287. package/dist/declared/render-dependencies-file.js +12 -0
  288. package/dist/declared/render-dependencies-file.js.map +1 -0
  289. package/dist/depcruise/hygiene-rules.js +2 -1
  290. package/dist/depcruise/hygiene-rules.js.map +1 -1
  291. package/dist/describe/context-description.d.ts +10 -0
  292. package/dist/describe/context-description.d.ts.map +1 -1
  293. package/dist/describe/describe-context.d.ts.map +1 -1
  294. package/dist/describe/describe-context.js +2 -0
  295. package/dist/describe/describe-context.js.map +1 -1
  296. package/dist/describe/format-description.d.ts.map +1 -1
  297. package/dist/describe/format-description.js +4 -0
  298. package/dist/describe/format-description.js.map +1 -1
  299. package/dist/describe/read-projections.d.ts +5 -0
  300. package/dist/describe/read-projections.d.ts.map +1 -0
  301. package/dist/describe/read-projections.js +19 -0
  302. package/dist/describe/read-projections.js.map +1 -0
  303. package/dist/describe/reference-lines.js +9 -0
  304. package/dist/describe/reference-lines.js.map +1 -1
  305. package/dist/dev/refresh-declarations.d.ts +9 -0
  306. package/dist/dev/refresh-declarations.d.ts.map +1 -0
  307. package/dist/dev/refresh-declarations.js +28 -0
  308. package/dist/dev/refresh-declarations.js.map +1 -0
  309. package/dist/generate/access-vars.js +3 -3
  310. package/dist/generate/access-vars.js.map +1 -1
  311. package/dist/generate/kinds/context-plan.d.ts +10 -0
  312. package/dist/generate/kinds/context-plan.d.ts.map +1 -0
  313. package/dist/generate/kinds/context-plan.js +2 -0
  314. package/dist/generate/kinds/context-plan.js.map +1 -0
  315. package/dist/generate/kinds/declare-context-entries.d.ts +3 -1
  316. package/dist/generate/kinds/declare-context-entries.d.ts.map +1 -1
  317. package/dist/generate/kinds/declare-context-entries.js +4 -2
  318. package/dist/generate/kinds/declare-context-entries.js.map +1 -1
  319. package/dist/generate/kinds/extraction/service-selection.js +8 -11
  320. package/dist/generate/kinds/extraction/service-selection.js.map +1 -1
  321. package/dist/generate/kinds/job/job-vars.d.ts.map +1 -1
  322. package/dist/generate/kinds/job/job-vars.js +5 -3
  323. package/dist/generate/kinds/job/job-vars.js.map +1 -1
  324. package/dist/generate/kinds/plan-vars.d.ts +5 -0
  325. package/dist/generate/kinds/plan-vars.d.ts.map +1 -0
  326. package/dist/generate/kinds/plan-vars.js +24 -0
  327. package/dist/generate/kinds/plan-vars.js.map +1 -0
  328. package/dist/generate/kinds/projection-kind.d.ts +3 -0
  329. package/dist/generate/kinds/projection-kind.d.ts.map +1 -0
  330. package/dist/generate/kinds/projection-kind.js +72 -0
  331. package/dist/generate/kinds/projection-kind.js.map +1 -0
  332. package/dist/generate/kinds/publish-in-index.js +2 -2
  333. package/dist/generate/kinds/publish-in-index.js.map +1 -1
  334. package/dist/generate/kinds/route/route-vars.d.ts.map +1 -1
  335. package/dist/generate/kinds/route/route-vars.js +7 -6
  336. package/dist/generate/kinds/route/route-vars.js.map +1 -1
  337. package/dist/generate/kinds/wire-context.d.ts +10 -0
  338. package/dist/generate/kinds/wire-context.d.ts.map +1 -0
  339. package/dist/generate/kinds/wire-context.js +36 -0
  340. package/dist/generate/kinds/wire-context.js.map +1 -0
  341. package/dist/generate/kinds/write-context-files.d.ts +1 -8
  342. package/dist/generate/kinds/write-context-files.d.ts.map +1 -1
  343. package/dist/generate/kinds/write-context-files.js +3 -40
  344. package/dist/generate/kinds/write-context-files.js.map +1 -1
  345. package/dist/generate/kinds.d.ts.map +1 -1
  346. package/dist/generate/kinds.js +2 -0
  347. package/dist/generate/kinds.js.map +1 -1
  348. package/dist/generate/refresh-barrels.d.ts +4 -3
  349. package/dist/generate/refresh-barrels.d.ts.map +1 -1
  350. package/dist/generate/refresh-barrels.js +41 -16
  351. package/dist/generate/refresh-barrels.js.map +1 -1
  352. package/dist/generate/spec-vars.js +4 -4
  353. package/dist/generate/spec-vars.js.map +1 -1
  354. package/dist/generate/storage-vars.d.ts +2 -2
  355. package/dist/generate/storage-vars.d.ts.map +1 -1
  356. package/dist/generate/storage-vars.js +6 -10
  357. package/dist/generate/storage-vars.js.map +1 -1
  358. package/dist/generate/workspace-sources.d.ts +6 -0
  359. package/dist/generate/workspace-sources.d.ts.map +1 -0
  360. package/dist/generate/workspace-sources.js +13 -0
  361. package/dist/generate/workspace-sources.js.map +1 -0
  362. package/dist/init/manifest/scripts-for.js +6 -1
  363. package/dist/init/manifest/scripts-for.js.map +1 -1
  364. package/dist/init/manifest/versions.js +23 -23
  365. package/dist/init/run-init.d.ts.map +1 -1
  366. package/dist/init/run-init.js +32 -3
  367. package/dist/init/run-init.js.map +1 -1
  368. package/dist/init/stack/recorded-options.d.ts +11 -0
  369. package/dist/init/stack/recorded-options.d.ts.map +1 -0
  370. package/dist/init/stack/recorded-options.js +19 -0
  371. package/dist/init/stack/recorded-options.js.map +1 -0
  372. package/dist/init/stack/resolve-stack.d.ts +6 -1
  373. package/dist/init/stack/resolve-stack.d.ts.map +1 -1
  374. package/dist/init/stack/resolve-stack.js +46 -9
  375. package/dist/init/stack/resolve-stack.js.map +1 -1
  376. package/dist/init/stack/resolve-style.d.ts +3 -5
  377. package/dist/init/stack/resolve-style.d.ts.map +1 -1
  378. package/dist/init/stack/resolve-style.js +11 -3
  379. package/dist/init/stack/resolve-style.js.map +1 -1
  380. package/dist/init/stack/stack-options.d.ts +3 -0
  381. package/dist/init/stack/stack-options.d.ts.map +1 -1
  382. package/dist/init/write-agent-settings.js +4 -3
  383. package/dist/init/write-agent-settings.js.map +1 -1
  384. package/dist/init/write-type-script-configs.d.ts +2 -1
  385. package/dist/init/write-type-script-configs.d.ts.map +1 -1
  386. package/dist/init/write-type-script-configs.js +4 -4
  387. package/dist/init/write-type-script-configs.js.map +1 -1
  388. package/dist/refresh-declarations.d.ts +3 -0
  389. package/dist/refresh-declarations.d.ts.map +1 -0
  390. package/dist/refresh-declarations.js +4 -0
  391. package/dist/refresh-declarations.js.map +1 -0
  392. package/dist/run.d.ts.map +1 -1
  393. package/dist/run.js +2 -0
  394. package/dist/run.js.map +1 -1
  395. package/dist/stack/alias-vars.d.ts +2 -1
  396. package/dist/stack/alias-vars.d.ts.map +1 -1
  397. package/dist/stack/alias-vars.js +6 -3
  398. package/dist/stack/alias-vars.js.map +1 -1
  399. package/dist/version.d.ts +1 -1
  400. package/dist/version.js +1 -1
  401. package/package.json +4 -3
  402. package/templates/acl/translator.spec.ts.tpl +1 -1
  403. package/templates/adapter/adapter.declared.ts.tpl +3 -3
  404. package/templates/adapter/adapter.spec.ts.tpl +1 -1
  405. package/templates/adapter/adapter.ts.tpl +1 -1
  406. package/templates/adapter/wiring.tsyringe.tpl +3 -3
  407. package/templates/aggregate/aggregate.spec.ts.tpl +2 -2
  408. package/templates/architecture/extractable.declared.spec.ts.tpl +1 -1
  409. package/templates/architecture/extractable.manual.spec.ts.tpl +4 -4
  410. package/templates/architecture/extractable.tsyringe.spec.ts.tpl +1 -1
  411. package/templates/architecture/wiring.declared.tpl +1 -1
  412. package/templates/architecture/wiring.manual.tpl +1 -1
  413. package/templates/architecture/wiring.tsyringe.tpl +1 -1
  414. package/templates/builder/builder.ts.tpl +1 -1
  415. package/templates/command/handler.declared.ts.tpl +7 -7
  416. package/templates/command/handler.spec.buses.ts.tpl +4 -4
  417. package/templates/command/handler.spec.tsyringe.ts.tpl +5 -5
  418. package/templates/command/handler.ts.tpl +4 -4
  419. package/templates/command/wiring.manual.tpl +2 -2
  420. package/templates/command/wiring.tsyringe.tpl +3 -3
  421. package/templates/context/module.manual.ts.tpl +1 -1
  422. package/templates/context/permission-set.tpl +1 -1
  423. package/templates/context/permissions.spec.ts.tpl +1 -1
  424. package/templates/context/routes.spec.ts.tpl +1 -1
  425. package/templates/context/wiring.declared.tpl +2 -2
  426. package/templates/context/wiring.manual.tpl +1 -1
  427. package/templates/context/wiring.tsyringe.tpl +2 -2
  428. package/templates/domain-error/domain-error.spec.ts.tpl +1 -1
  429. package/templates/domain-event/domain-event.spec.ts.tpl +1 -1
  430. package/templates/domain-service/domain-service.spec.ts.tpl +1 -1
  431. package/templates/e2e/e2e.spec.ts.tpl +2 -2
  432. package/templates/entity/entity.spec.ts.tpl +1 -1
  433. package/templates/event-handler/event-handler.declared.ts.tpl +3 -3
  434. package/templates/event-handler/event-handler.spec.ts.tpl +2 -2
  435. package/templates/event-handler/event-handler.ts.tpl +1 -1
  436. package/templates/event-handler/wiring.manual.tpl +2 -2
  437. package/templates/event-handler/wiring.tsyringe.tpl +2 -2
  438. package/templates/gateway/adapter.declared.ts.tpl +3 -3
  439. package/templates/gateway/adapter.ts.tpl +2 -2
  440. package/templates/gateway/contract.spec.ts.tpl +3 -3
  441. package/templates/gateway/fake.ts.tpl +1 -1
  442. package/templates/gateway/platform-test.declared.tpl +1 -1
  443. package/templates/gateway/platform.declared.tpl +1 -1
  444. package/templates/gateway/wiring.tsyringe.tpl +3 -3
  445. package/templates/init/CLAUDE.md.tpl +5 -2
  446. package/templates/init/README.md.tpl +15 -10
  447. package/templates/init/e2e/create-credentials.jwt.ts.tpl +1 -1
  448. package/templates/init/e2e/create-credentials.keycloak.ts.tpl +1 -1
  449. package/templates/init/e2e/create-credentials.none.ts.tpl +2 -2
  450. package/templates/init/e2e/start-application.database.ts.tpl +16 -16
  451. package/templates/init/e2e/start-application.memory.ts.tpl +16 -16
  452. package/templates/init/e2e/test-environment.ts.tpl +1 -1
  453. package/templates/init/main.ts.tpl +11 -11
  454. package/templates/init/platform/audit/audit.module.manual.ts.tpl +5 -5
  455. package/templates/init/platform/audit/audit.module.tsyringe.ts.tpl +4 -4
  456. package/templates/init/platform/audit/create-audit.ts.tpl +5 -5
  457. package/templates/init/platform/audit/search-audit-entries.handler.ts.tpl +1 -1
  458. package/templates/init/platform/audit/search-audit-entries.route.ts.tpl +1 -1
  459. package/templates/init/platform/auth/authorization.tsyringe.ts.tpl +2 -2
  460. package/templates/init/platform/auth/create-authenticator.jwt.ts.tpl +1 -1
  461. package/templates/init/platform/auth/create-authenticator.keycloak.ts.tpl +1 -1
  462. package/templates/init/platform/auth/create-authenticator.none.ts.tpl +2 -2
  463. package/templates/init/platform/auth/create-authorizer.abac.ts.tpl +1 -1
  464. package/templates/init/platform/auth/create-authorizer.custom.ts.tpl +2 -2
  465. package/templates/init/platform/auth/create-authorizer.rbac.ts.tpl +1 -1
  466. package/templates/init/platform/auth/create-authorizer.rebac.ts.tpl +3 -3
  467. package/templates/init/platform/auth/create-tuple-store.contract.spec.ts.tpl +1 -1
  468. package/templates/init/platform/auth/custom-authorizer.contract.spec.ts.tpl +1 -1
  469. package/templates/init/platform/auth/http-boundary.ts.tpl +1 -1
  470. package/templates/init/platform/auth/permission-mapping.ts.tpl +1 -1
  471. package/templates/init/platform/auth/permissions.ts.tpl +1 -1
  472. package/templates/init/platform/auth/principal-of.none.ts.tpl +1 -1
  473. package/templates/init/platform/auth/relate-system-actors.ts.tpl +1 -1
  474. package/templates/init/platform/auth/relation-tuples.ts.tpl +2 -2
  475. package/templates/init/platform/auth/security-schemes.none.ts.tpl +1 -1
  476. package/templates/init/platform/buses/create-command-bus.ts.tpl +2 -2
  477. package/templates/init/platform/buses/create-query-bus.ts.tpl +1 -1
  478. package/templates/init/platform/compose-application.manual.ts.tpl +6 -6
  479. package/templates/init/platform/compose-application.tsyringe.ts.tpl +10 -10
  480. package/templates/init/platform/config/app-config.ts.tpl +2 -2
  481. package/templates/init/platform/config/load-config.ts.tpl +3 -3
  482. package/templates/init/platform/create-platform.manual.ts.tpl +16 -16
  483. package/templates/init/platform/database/create-client.prisma.ts.tpl +1 -1
  484. package/templates/init/platform/database/create-data-source.typeorm.ts.tpl +1 -1
  485. package/templates/init/platform/database/data-source.typeorm.ts.tpl +1 -1
  486. package/templates/init/platform/database/database.drizzle.ts.tpl +1 -1
  487. package/templates/init/platform/database/database.prisma.ts.tpl +2 -2
  488. package/templates/init/platform/database/inert-persistence.memory.ts.tpl +2 -2
  489. package/templates/init/platform/database/inert-persistence.pooled.ts.tpl +2 -2
  490. package/templates/init/platform/database/inert-persistence.prisma.ts.tpl +3 -3
  491. package/templates/init/platform/database/inert-persistence.typeorm.ts.tpl +3 -3
  492. package/templates/init/platform/database/open-persistence.contract.spec.ts.tpl +1 -1
  493. package/templates/init/platform/database/open-persistence.memory.ts.tpl +1 -1
  494. package/templates/init/platform/database/open-persistence.pooled.ts.tpl +3 -3
  495. package/templates/init/platform/database/open-persistence.prisma.ts.tpl +3 -3
  496. package/templates/init/platform/database/open-persistence.typeorm.ts.tpl +3 -3
  497. package/templates/init/platform/database/open-test-database.drizzle.ts.tpl +4 -4
  498. package/templates/init/platform/database/open-test-database.knex.ts.tpl +5 -5
  499. package/templates/init/platform/database/open-test-database.prisma.ts.tpl +4 -4
  500. package/templates/init/platform/database/open-test-database.typeorm.ts.tpl +3 -3
  501. package/templates/init/platform/database/persistence-over.drizzle.ts.tpl +2 -2
  502. package/templates/init/platform/database/persistence-over.knex.ts.tpl +2 -2
  503. package/templates/init/platform/database/persistence-over.prisma.ts.tpl +2 -2
  504. package/templates/init/platform/database/persistence-over.typeorm.ts.tpl +2 -2
  505. package/templates/init/platform/database/persistence.orm.ts.tpl +1 -1
  506. package/templates/init/platform/errors.ts.tpl +1 -1
  507. package/templates/init/platform/events/create-event-provider.custom.ts.tpl +2 -2
  508. package/templates/init/platform/events/create-event-provider.kafka.ts.tpl +3 -3
  509. package/templates/init/platform/events/create-event-provider.nats.ts.tpl +2 -2
  510. package/templates/init/platform/events/create-event-provider.rabbitmq.ts.tpl +2 -2
  511. package/templates/init/platform/events/create-event-provider.redis.ts.tpl +2 -2
  512. package/templates/init/platform/events/custom-event-bus.contract.spec.ts.tpl +1 -1
  513. package/templates/init/platform/events/in-process-events.ts.tpl +1 -1
  514. package/templates/init/platform/events/start-outbox-relay.ts.tpl +1 -1
  515. package/templates/init/platform/http/create-app-module.ts.tpl +1 -1
  516. package/templates/init/platform/http/start-http-server.express.ts.tpl +4 -4
  517. package/templates/init/platform/http/start-http-server.fastify.ts.tpl +4 -4
  518. package/templates/init/platform/http/start-http-server.nest.ts.tpl +5 -5
  519. package/templates/init/platform/http/with-documentation.ts.tpl +2 -2
  520. package/templates/init/platform/lay-foundations.tsyringe.ts.tpl +5 -5
  521. package/templates/init/platform/platform-test.module.tsyringe.ts.tpl +1 -1
  522. package/templates/init/platform/platform.manual.ts.tpl +3 -3
  523. package/templates/init/platform/platform.module.tsyringe.ts.tpl +8 -8
  524. package/templates/init/platform/resilience/adapter-aspects.ts.tpl +2 -2
  525. package/templates/init/platform/resilience/default-resilience.ts.tpl +1 -1
  526. package/templates/init/platform/resilience/own-policy.ts.tpl +1 -1
  527. package/templates/init/platform/tracing.ts.tpl +2 -2
  528. package/templates/init/rules/application.md.tpl +8 -2
  529. package/templates/init/rules/infrastructure.md.tpl +3 -3
  530. package/templates/init/scripts/openapi.ts.tpl +5 -5
  531. package/templates/integration-event/audited.tpl +1 -1
  532. package/templates/integration-event/integration-event.class-validator.ts.tpl +1 -1
  533. package/templates/integration-event/integration-event.custom.ts.tpl +1 -1
  534. package/templates/integration-event/publisher.declared.ts.tpl +4 -4
  535. package/templates/integration-event/publisher.spec.ts.tpl +2 -2
  536. package/templates/integration-event/publisher.ts.tpl +2 -2
  537. package/templates/integration-event/wiring.manual.tpl +2 -2
  538. package/templates/integration-event/wiring.tsyringe.tpl +2 -2
  539. package/templates/integration-handler/integration-handler.declared.ts.tpl +3 -3
  540. package/templates/integration-handler/integration-handler.spec.ts.tpl +2 -2
  541. package/templates/integration-handler/integration-handler.ts.tpl +1 -1
  542. package/templates/integration-handler/wiring.manual.tpl +3 -3
  543. package/templates/integration-handler/wiring.tsyringe.tpl +2 -2
  544. package/templates/job/job.declared.ts.tpl +3 -3
  545. package/templates/job/job.spec.buses.ts.tpl +2 -2
  546. package/templates/job/job.spec.tsyringe.ts.tpl +2 -2
  547. package/templates/job/job.ts.tpl +1 -1
  548. package/templates/job/wiring.manual.tpl +1 -1
  549. package/templates/job/wiring.tsyringe.tpl +1 -1
  550. package/templates/pipeline/package-scripts.json +1 -1
  551. package/templates/policy/policy.declared.ts.tpl +1 -1
  552. package/templates/policy/policy.spec.declared.ts.tpl +1 -1
  553. package/templates/policy/policy.spec.ts.tpl +1 -1
  554. package/templates/policy/policy.ts.tpl +1 -1
  555. package/templates/policy/registration.tpl +1 -1
  556. package/templates/port/fake.ts.tpl +1 -1
  557. package/templates/projection/projection.spec.ts.tpl +17 -0
  558. package/templates/projection/projection.ts.tpl +11 -0
  559. package/templates/query/handler.declared.ts.tpl +4 -4
  560. package/templates/query/handler.spec.buses.ts.tpl +5 -5
  561. package/templates/query/handler.spec.tsyringe.ts.tpl +6 -6
  562. package/templates/query/handler.ts.tpl +3 -3
  563. package/templates/query/query.ts.tpl +1 -1
  564. package/templates/query/reader.fake.ts.tpl +2 -2
  565. package/templates/query/reader.in-memory.ts.tpl +4 -4
  566. package/templates/query/reader.port.ts.tpl +2 -2
  567. package/templates/query/search.handler.declared.ts.tpl +6 -6
  568. package/templates/query/search.handler.spec.buses.ts.tpl +5 -5
  569. package/templates/query/search.handler.spec.tsyringe.ts.tpl +6 -6
  570. package/templates/query/search.handler.ts.tpl +4 -4
  571. package/templates/query/search.query.ts.tpl +1 -1
  572. package/templates/query/search.reader.fake.ts.tpl +2 -2
  573. package/templates/query/search.reader.in-memory.ts.tpl +3 -3
  574. package/templates/query/search.reader.port.ts.tpl +1 -1
  575. package/templates/query/search.reader.spec.ts.tpl +2 -2
  576. package/templates/query/search.wiring.manual.tpl +3 -3
  577. package/templates/query/search.wiring.tsyringe.tpl +4 -4
  578. package/templates/query/wiring.manual.tpl +3 -3
  579. package/templates/query/wiring.tsyringe.tpl +4 -4
  580. package/templates/repository/contract.spec.ts.tpl +5 -5
  581. package/templates/repository/drizzle/mapper.ts.tpl +2 -2
  582. package/templates/repository/drizzle/repository.ts.tpl +9 -17
  583. package/templates/repository/drizzle/schema-export.tpl +1 -1
  584. package/templates/repository/fake.ts.tpl +2 -2
  585. package/templates/repository/knex/mapper.ts.tpl +2 -2
  586. package/templates/repository/knex/repository.ts.tpl +10 -30
  587. package/templates/repository/knex/schema-export.tpl +1 -1
  588. package/templates/repository/knex/tables.ts.tpl +1 -1
  589. package/templates/repository/none/repository.ts.tpl +3 -3
  590. package/templates/repository/prisma/mapper.ts.tpl +2 -2
  591. package/templates/repository/prisma/repository.ts.tpl +6 -9
  592. package/templates/repository/repository.ts.tpl +1 -1
  593. package/templates/repository/typeorm/mapper.ts.tpl +2 -2
  594. package/templates/repository/typeorm/repository.ts.tpl +9 -12
  595. package/templates/repository/typeorm/schema-export.tpl +1 -1
  596. package/templates/repository/typeorm/table.tpl +1 -1
  597. package/templates/repository/wiring.manual.tpl +1 -1
  598. package/templates/repository/wiring.tsyringe.tpl +2 -2
  599. package/templates/route/route.search.ts.tpl +1 -1
  600. package/templates/route/route.spec.ts.tpl +1 -1
  601. package/templates/route/routes.on-tsyringe.tpl +1 -1
  602. package/templates/route/wiring.manual.tpl +1 -1
  603. package/templates/service/main.ts.tpl +11 -11
  604. package/templates/value-object/value-object.spec.ts.tpl +1 -1
  605. package/templates/worker/main.ts.tpl +9 -9
  606. package/dist/alias/platform-alias.d.ts +0 -4
  607. package/dist/alias/platform-alias.d.ts.map +0 -1
  608. package/dist/alias/platform-alias.js +0 -7
  609. package/dist/alias/platform-alias.js.map +0 -1
@@ -1,26 +1,41 @@
1
1
  export const IMPORTS_DOCS = {
2
2
  'imports/alias-only': {
3
- why: 'An alias names a file from the root of the project: the import reads the same from every file, says which context and which layer it reaches without counting "../", and does not change when the importing file moves. One way of writing an import also means one thing to review and one thing for the boundary rules to read: the checker, ESLint and dependency-cruiser resolve an alias exactly as they resolve a relative path, so no boundary is crossed by choosing the other spelling. The rule holds under the source root, test/ and scripts/, the same directory included, for import, export ... from and import(). The alias is declared once, under "paths" in tsconfig.json, and the build rewrites it into a relative path in the compiled output, which runs with plain `node`. An alias path with a "." or ".." segment is refused too, since it could name a file outside its directory. The compiler reports an alias that names no file; a JavaScript file at the project root (a config, a migration) is not judged. ESLint fixes the import (`eslint --fix`).',
3
+ why: 'An alias names a file from the root of the project: the import reads the same from every file, says which context and which layer it reaches without counting "../", and does not change when the importing file moves. One way of writing an import also means one thing to review and one thing for the boundary rules to read: the checker, ESLint and dependency-cruiser resolve an alias exactly as they resolve a relative path, so no boundary is crossed by choosing the other spelling. The rule holds under the source root, test/ and scripts/, the same directory included, for import, export ... from and import(). The alias is declared once, under "paths" in tsconfig.json, and the build rewrites it into a relative path in the compiled output, which runs with plain `node`. An alias path with a "." or ".." segment is refused too, since it could name a file outside its directory. The compiler reports an alias that names no file; a JavaScript file at the project root (a config, a migration) is not judged. ESLint fixes the import (`eslint --fix`) and writes it with the ending "importExtension" asks for, which `imports/extension` holds.',
4
4
  bad: `// src/contexts/billing/application/commands/issue-invoice/issue-invoice.handler.ts
5
- import { Invoice } from '../../../domain/aggregates/invoice.aggregate.js';
6
- import { IssueInvoiceCommand } from './issue-invoice.command.js';`,
5
+ import { Invoice } from '../../../domain/aggregates/invoice.aggregate';
6
+ import { IssueInvoiceCommand } from './issue-invoice.command';`,
7
7
  good: `// src/contexts/billing/application/commands/issue-invoice/issue-invoice.handler.ts
8
- import { IssueInvoiceCommand } from '@/contexts/billing/application/commands/issue-invoice/issue-invoice.command.js';
9
- import { Invoice } from '@/contexts/billing/domain/aggregates/invoice.aggregate.js';
8
+ import { IssueInvoiceCommand } from '@/contexts/billing/application/commands/issue-invoice/issue-invoice.command';
9
+ import { Invoice } from '@/contexts/billing/domain/aggregates/invoice.aggregate';
10
10
  // test/e2e/issue-invoice.e2e.spec.ts
11
- import { startApplication } from '$test/e2e/support/start-application.js';`,
11
+ import { startApplication } from '$test/e2e/support/start-application';`,
12
+ },
13
+ 'imports/extension': {
14
+ why: 'An import of a file of the project has one spelling, and "importExtension" in ddd-ts-kit.config.json says which. Under "none", the default of a new project, it names the file without an extension: the compiler resolves as a bundler does ("moduleResolution": "Bundler"), which still reports a file that does not exist but would also accept ".js", so this rule is what refuses it. Under "js", which is also what a config without the key means, it ends with the ".js" of the file the compiler emits: the compiler resolves as Node does and refuses any other spelling itself (TS2835); this rule says it in the words of the project and ESLint fixes it. Node needs the extension at run time either way: `ddd-ts-kit build-aliases` rewrites each alias of the compiled output into a relative path ending in ".js". It names one file per specifier and guesses nothing, so under "none" an alias never names a directory: write ".../published-language/index", not ".../published-language"; this checker reports that case, which needs the disk. Only a specifier that starts with an alias of the project is judged: a package subpath that ends like a file name ("zod/v4/core.js") is left alone, and a relative import belongs to imports/alias-only. A dot in a file name is not an extension: "invoice.aggregate" is written without one. To move a project from one spelling to the other: change "importExtension", write the "module" and "moduleResolution" that imports/alias-declared then asks for, run `eslint --fix` and the formatter.',
15
+ bad: `// ddd-ts-kit.config.json
16
+ "importExtension": "none"
17
+ // src/contexts/billing/application/commands/issue-invoice/issue-invoice.handler.ts
18
+ import { Invoice } from '@/contexts/billing/domain/aggregates/invoice.aggregate';
19
+ import { InvoiceIssued } from '@/contexts/billing/published-language';`,
20
+ good: `// ddd-ts-kit.config.json
21
+ "importExtension": "none"
22
+ // src/contexts/billing/application/commands/issue-invoice/issue-invoice.handler.ts
23
+ import { Invoice } from '@/contexts/billing/domain/aggregates/invoice.aggregate';
24
+ import { InvoiceIssued } from '@/contexts/billing/published-language/index';`,
12
25
  },
13
26
  'imports/alias-declared': {
14
- why: 'An alias is declared in one place and resolved by many tools: the compiler, the dev runner, the test runner, ESLint, the checker, dependency-cruiser, knip, and the build that makes the output runnable. If two of them disagree, the type check passes on one file while production loads another, or a boundary rule stops seeing an import. So there is one source a person edits, "importAlias" in ddd-ts-kit.config.json, and one declaration derived from it that the tools read, "paths" in tsconfig.json. Node reads neither: the compiler emits an alias as it was written, so `ddd-ts-kit build-aliases` rewrites each one into a relative path after the compiler, and the output runs with plain `node`. The rule compares "paths" (tsconfig.json and tsconfig.build.json) with "importAlias", refuses a second entry under an alias, a "baseUrl" and a knip "paths"; checks that vitest and dependency-cruiser read tsconfig and that jest, which does not, repeats the same mapping; reports a script that compiles without the rewrite step and a tsx script under another tsconfig. An alias is "@/" or "$<name>/": neither can be the name of a package, so no installed dependency can ever take the place of a file of the project; "#<name>/" (a Node subpath import) and "@<name>/" (the name of a scope) are refused.',
27
+ why: 'An alias is declared in one place and resolved by many tools: the compiler, the dev runner, the test runner, ESLint, the checker, dependency-cruiser, knip, and the build that makes the output runnable. If two of them disagree, the type check passes on one file while production loads another, or a boundary rule stops seeing an import. So there is one source a person edits, "importAlias" in ddd-ts-kit.config.json, and one declaration derived from it that the tools read, "paths" in tsconfig.json. Node reads neither: the compiler emits an alias as it was written, so `ddd-ts-kit build-aliases` rewrites each one into a relative path after the compiler, and the output runs with plain `node`. The rule compares "paths" (tsconfig.json and tsconfig.build.json) with "importAlias", refuses a second entry under an alias, a "baseUrl" and a knip "paths"; checks that vitest and dependency-cruiser read tsconfig and that jest, which does not, repeats the same mapping; reports a script that compiles without the rewrite step and a tsx script under another tsconfig. The ending of an import has one source too, "importExtension", and three declarations follow it: "module" and "moduleResolution" of tsconfig.json ("ESNext" and "Bundler" without an extension, a Node resolution with one), the pattern of each jest mapping, and the build step, which writes the ".js" Node needs. An alias is "@/" or "$<name>/": neither can be the name of a package, so no installed dependency can ever take the place of a file of the project; "#<name>/" (a Node subpath import) and "@<name>/" (the name of a scope) are refused.',
15
28
  bad: `// ddd-ts-kit.config.json
16
- "importAlias": "@/"
29
+ "importAlias": "@/", "importExtension": "none"
17
30
  // tsconfig.json
31
+ "moduleResolution": "NodeNext",
18
32
  "paths": { "@/*": ["./dist/src/*"] }
19
33
  // package.json
20
34
  "build": "tsc -p tsconfig.build.json"`,
21
35
  good: `// ddd-ts-kit.config.json
22
- "importAlias": "@/"
36
+ "importAlias": "@/", "importExtension": "none"
23
37
  // tsconfig.json
38
+ "module": "ESNext", "moduleResolution": "Bundler", "customConditions": ["node"],
24
39
  "paths": { "@/*": ["./src/*"], "$test/*": ["./test/*"], "$scripts/*": ["./scripts/*"] }
25
40
  // package.json
26
41
  "build": "tsc -p tsconfig.build.json && ddd-ts-kit build-aliases"
@@ -1 +1 @@
1
- {"version":3,"file":"imports-docs.js","sourceRoot":"","sources":["../../../src/check/explain/imports-docs.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,YAAY,GAAsC;IAC7D,oBAAoB,EAAE;QACpB,GAAG,EAAE,whCAAwhC;QAC7hC,GAAG,EAAE;;kEAEyD;QAC9D,IAAI,EAAE;;;;2EAIiE;KACxE;IACD,wBAAwB,EAAE;QACxB,GAAG,EAAE,8wCAA8wC;QACnxC,GAAG,EAAE;;;;;sCAK6B;QAClC,IAAI,EAAE;;;;;;;iCAOuB;KAC9B;CACF,CAAC"}
1
+ {"version":3,"file":"imports-docs.js","sourceRoot":"","sources":["../../../src/check/explain/imports-docs.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,YAAY,GAAsC;IAC7D,oBAAoB,EAAE;QACpB,GAAG,EAAE,knCAAknC;QACvnC,GAAG,EAAE;;+DAEsD;QAC3D,IAAI,EAAE;;;;wEAI8D;KACrE;IACD,mBAAmB,EAAE;QACnB,GAAG,EAAE,4+CAA4+C;QACj/C,GAAG,EAAE;;;;uEAI8D;QACnE,IAAI,EAAE;;;;6EAImE;KAC1E;IACD,wBAAwB,EAAE;QACxB,GAAG,EAAE,okDAAokD;QACzkD,GAAG,EAAE;;;;;;sCAM6B;QAClC,IAAI,EAAE;;;;;;;;iCAQuB;KAC9B;CACF,CAAC"}
@@ -8,32 +8,32 @@ import { Logged } from '@ddd-ts-kit/aspects/decorators';
8
8
  import { Repository } from '@ddd-ts-kit/kernel/declarations';`,
9
9
  good: `// domain/aggregates/invoice.aggregate.ts
10
10
  import { AggregateRoot } from '@ddd-ts-kit/kernel';
11
- import { Money } from '@/contexts/billing/domain/value-objects/money.vo.js';`,
11
+ import { Money } from '@/contexts/billing/domain/value-objects/money.vo';`,
12
12
  },
13
13
  'layer/application-inward': {
14
14
  why: 'A use case orchestrates the domain and talks to the outside through ports. If it imports an adapter, a framework or a driver, the technical choice can no longer be replaced or faked, and the handler cannot be unit tested with plain fakes. Cross-cutting behaviour reaches a use case from outside: @ddd-ts-kit/aspects, audit, redis, scheduling, sentry and tracing are refused whatever `applicationAllowedPackages` says, their place is the composition root, a bus middleware or an adapter. The declarations of the kernel (@ddd-ts-kit/kernel/declarations) are part of the kernel and belong here: a handler, a job or a policy says what it is and names the ports it depends on, which are abstract classes, without knowing a container.',
15
15
  bad: `// application/commands/issue-invoice/issue-invoice.handler.ts
16
- import { PgInvoiceRepository } from '@/contexts/billing/infrastructure/persistence/pg-invoice.repository.js';
16
+ import { PgInvoiceRepository } from '@/contexts/billing/infrastructure/persistence/pg-invoice.repository';
17
17
  import { RedisCache } from '@ddd-ts-kit/redis';
18
18
  import { retry } from '@ddd-ts-kit/aspects';`,
19
19
  good: `// application/commands/issue-invoice/issue-invoice.handler.ts
20
20
  import { Cache, Clock } from '@ddd-ts-kit/kernel';
21
21
  import { CommandHandler } from '@ddd-ts-kit/kernel/declarations';
22
- import { InvoiceRepository } from '@/contexts/billing/domain/repositories/invoice.repository.js';`,
22
+ import { InvoiceRepository } from '@/contexts/billing/domain/repositories/invoice.repository';`,
23
23
  },
24
24
  'layer/presentation-no-infrastructure': {
25
25
  why: 'A route translates a transport request into a command or a query and maps the answer back. Reaching an adapter directly skips the use case, so the business rule that guards the operation is skipped too.',
26
26
  bad: `// presentation/http/issue-invoice.route.ts
27
- import { PgInvoiceRepository } from '@/contexts/billing/infrastructure/persistence/pg-invoice.repository.js';`,
27
+ import { PgInvoiceRepository } from '@/contexts/billing/infrastructure/persistence/pg-invoice.repository';`,
28
28
  good: `// presentation/http/issue-invoice.route.ts
29
- import type { IssueInvoiceHandler } from '@/contexts/billing/application/commands/issue-invoice/issue-invoice.handler.js';`,
29
+ import type { IssueInvoiceHandler } from '@/contexts/billing/application/commands/issue-invoice/issue-invoice.handler';`,
30
30
  },
31
31
  'layer/infrastructure-no-presentation': {
32
32
  why: 'Adapters implement ports declared inward. An adapter that knows a DTO or a route depends on one transport, and both outer layers start changing together.',
33
33
  bad: `// infrastructure/persistence/pg-invoice.repository.ts
34
- import type { InvoiceDto } from '@/contexts/billing/presentation/http/invoice.dto.js';`,
34
+ import type { InvoiceDto } from '@/contexts/billing/presentation/http/invoice.dto';`,
35
35
  good: `// infrastructure/persistence/pg-invoice.repository.ts
36
- import { InvoiceRepository } from '@/contexts/billing/domain/repositories/invoice.repository.js';`,
36
+ import { InvoiceRepository } from '@/contexts/billing/domain/repositories/invoice.repository';`,
37
37
  },
38
38
  };
39
39
  //# sourceMappingURL=layer-docs.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"layer-docs.js","sourceRoot":"","sources":["../../../src/check/explain/layer-docs.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,UAAU,GAAsC;IAC3D,qBAAqB,EAAE;QACrB,GAAG,EAAE,ksBAAksB;QACvsB,GAAG,EAAE;;;;8DAIqD;QAC1D,IAAI,EAAE;;6EAEmE;KAC1E;IACD,0BAA0B,EAAE;QAC1B,GAAG,EAAE,0tBAA0tB;QAC/tB,GAAG,EAAE;;;6CAGoC;QACzC,IAAI,EAAE;;;kGAGwF;KAC/F;IACD,sCAAsC,EAAE;QACtC,GAAG,EAAE,4MAA4M;QACjN,GAAG,EAAE;8GACqG;QAC1G,IAAI,EAAE;2HACiH;KACxH;IACD,sCAAsC,EAAE;QACtC,GAAG,EAAE,2JAA2J;QAChK,GAAG,EAAE;uFAC8E;QACnF,IAAI,EAAE;kGACwF;KAC/F;CACF,CAAC"}
1
+ {"version":3,"file":"layer-docs.js","sourceRoot":"","sources":["../../../src/check/explain/layer-docs.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,UAAU,GAAsC;IAC3D,qBAAqB,EAAE;QACrB,GAAG,EAAE,ksBAAksB;QACvsB,GAAG,EAAE;;;;8DAIqD;QAC1D,IAAI,EAAE;;0EAEgE;KACvE;IACD,0BAA0B,EAAE;QAC1B,GAAG,EAAE,0tBAA0tB;QAC/tB,GAAG,EAAE;;;6CAGoC;QACzC,IAAI,EAAE;;;+FAGqF;KAC5F;IACD,sCAAsC,EAAE;QACtC,GAAG,EAAE,4MAA4M;QACjN,GAAG,EAAE;2GACkG;QACvG,IAAI,EAAE;wHAC8G;KACrH;IACD,sCAAsC,EAAE;QACtC,GAAG,EAAE,2JAA2J;QAChK,GAAG,EAAE;oFAC2E;QAChF,IAAI,EAAE;+FACqF;KAC5F;CACF,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"ports-docs.d.ts","sourceRoot":"","sources":["../../../src/check/explain/ports-docs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAEpD,eAAO,MAAM,UAAU,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAkExD,CAAC"}
1
+ {"version":3,"file":"ports-docs.d.ts","sourceRoot":"","sources":["../../../src/check/explain/ports-docs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAEpD,eAAO,MAAM,UAAU,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CA0ExD,CAAC"}
@@ -43,24 +43,32 @@ export abstract class InvoiceRepository extends Repository<Invoice> {}
43
43
  builder.bind(PaymentGateway).toClass(StripePaymentGateway, [PaymentSettings]);`,
44
44
  },
45
45
  'ports/no-concrete-dependency': {
46
- why: 'A dependency list says what a class needs, not who provides it. A list that names an adapter of infrastructure/ or a fake of test/fakes/ ties the use case to one implementation: the adapter can no longer be replaced at the composition root, and a test can no longer give its fake. The list names the port, the constructor parameter is typed by it, and the choice of the implementation stays in one place.',
46
+ why: 'What a class is given says what it needs, not who provides it. A constructor parameter typed by an adapter of infrastructure/ or by a fake of test/fakes/, or a dependency list that names one, ties the class to one implementation: the adapter can no longer be replaced at the composition root, and a test can no longer give its fake. The parameter is typed by the port, a list names the port, and the choice of the implementation stays in one place. In the declared style the constructor of a class that lists nothing is its statement of dependencies, so its parameter types are held like the entries of a list.',
47
47
  bad: `// application/commands/issue-invoice/issue-invoice.handler.ts
48
- import { KnexInvoiceRepository } from '@/contexts/billing/infrastructure/persistence/knex-invoice.repository.js';
48
+ import type { KnexInvoiceRepository } from '@/contexts/billing/infrastructure/persistence/knex-invoice.repository';
49
49
 
50
- @CommandHandler(IssueInvoiceCommand, [KnexInvoiceRepository, Clock])`,
50
+ @CommandHandler(IssueInvoiceCommand)
51
+ export class IssueInvoiceHandler {
52
+ constructor(private readonly invoices: KnexInvoiceRepository) {}
53
+ }
54
+ // billing.module.ts, explicit style
55
+ builder.command(IssueInvoiceCommand).handledBy(IssueInvoiceHandler, [KnexInvoiceRepository, Clock]);`,
51
56
  good: `// application/commands/issue-invoice/issue-invoice.handler.ts
52
- import { InvoiceRepository } from '@/contexts/billing/domain/repositories/invoice.repository.js';
57
+ import type { InvoiceRepository } from '@/contexts/billing/domain/repositories/invoice.repository';
53
58
 
54
- @CommandHandler(IssueInvoiceCommand, [InvoiceRepository, Clock])`,
59
+ @CommandHandler(IssueInvoiceCommand)
60
+ export class IssueInvoiceHandler {
61
+ constructor(private readonly invoices: InvoiceRepository) {}
62
+ }`,
55
63
  },
56
64
  'ports/value-import': {
57
65
  why: 'A port named in a dependency list or given to bind is used as a value: the class itself is looked up in the container. `import type` erases the import when the file is compiled, so the list would hold undefined at run time, or the file would not compile. The import of a token is a plain import; `import type` stays right for a class that only types a parameter.',
58
- bad: `import type { InvoiceRepository } from '@/contexts/billing/domain/repositories/invoice.repository.js';
66
+ bad: `import type { InvoiceRepository } from '@/contexts/billing/domain/repositories/invoice.repository';
59
67
  import { type Clock } from '@ddd-ts-kit/kernel';
60
68
 
61
69
  @CommandHandler(IssueInvoiceCommand, [InvoiceRepository, Clock])`,
62
70
  good: `import { Clock } from '@ddd-ts-kit/kernel';
63
- import { InvoiceRepository } from '@/contexts/billing/domain/repositories/invoice.repository.js';
71
+ import { InvoiceRepository } from '@/contexts/billing/domain/repositories/invoice.repository';
64
72
 
65
73
  @CommandHandler(IssueInvoiceCommand, [InvoiceRepository, Clock])`,
66
74
  },
@@ -1 +1 @@
1
- {"version":3,"file":"ports-docs.js","sourceRoot":"","sources":["../../../src/check/explain/ports-docs.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,UAAU,GAAsC;IAC3D,sBAAsB,EAAE;QACtB,GAAG,EAAE,kmBAAkmB;QACvmB,GAAG,EAAE;;;;;EAKP;QACE,IAAI,EAAE;;;;;uEAK6D;KACpE;IACD,gCAAgC,EAAE;QAChC,GAAG,EAAE,shBAAshB;QAC3hB,GAAG,EAAE;;;;kHAIyG;QAC9G,IAAI,EAAE;;;;+DAIqD;KAC5D;IACD,yBAAyB,EAAE;QACzB,GAAG,EAAE,+bAA+b;QACpc,GAAG,EAAE;;;;;sFAK6E;QAClF,IAAI,EAAE;;;;;+EAKqE;KAC5E;IACD,8BAA8B,EAAE;QAC9B,GAAG,EAAE,sZAAsZ;QAC3Z,GAAG,EAAE;;;qEAG4D;QACjE,IAAI,EAAE;;;iEAGuD;KAC9D;IACD,oBAAoB,EAAE;QACpB,GAAG,EAAE,4WAA4W;QACjX,GAAG,EAAE;;;iEAGwD;QAC7D,IAAI,EAAE;;;iEAGuD;KAC9D;CACF,CAAC"}
1
+ {"version":3,"file":"ports-docs.js","sourceRoot":"","sources":["../../../src/check/explain/ports-docs.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,UAAU,GAAsC;IAC3D,sBAAsB,EAAE;QACtB,GAAG,EAAE,kmBAAkmB;QACvmB,GAAG,EAAE;;;;;EAKP;QACE,IAAI,EAAE;;;;;uEAK6D;KACpE;IACD,gCAAgC,EAAE;QAChC,GAAG,EAAE,shBAAshB;QAC3hB,GAAG,EAAE;;;;kHAIyG;QAC9G,IAAI,EAAE;;;;+DAIqD;KAC5D;IACD,yBAAyB,EAAE;QACzB,GAAG,EAAE,+bAA+b;QACpc,GAAG,EAAE;;;;;sFAK6E;QAClF,IAAI,EAAE;;;;;+EAKqE;KAC5E;IACD,8BAA8B,EAAE;QAC9B,GAAG,EAAE,omBAAomB;QACzmB,GAAG,EAAE;;;;;;;;qGAQ4F;QACjG,IAAI,EAAE;;;;;;EAMR;KACC;IACD,oBAAoB,EAAE;QACpB,GAAG,EAAE,4WAA4W;QACjX,GAAG,EAAE;;;iEAGwD;QAC7D,IAAI,EAAE;;;iEAGuD;KAC9D;CACF,CAAC"}
@@ -2,7 +2,7 @@ export const SCHEDULING_DOCS = {
2
2
  'scheduling/job-triggers-use-case': {
3
3
  why: 'A job says when something happens, a use case says what. A job that loads an aggregate, calls a repository or an adapter is a use case nobody can send by another way: no permission, no unit of work, no audit entry, no test through the bus. Kept to one command sent through the CommandBus port, the job is a line of schedule, and the work is a handler like any other. It lives in application/scheduling/*.job.ts, implements ScheduledJob, and depends on buses and ports only.',
4
4
  bad: `// application/scheduling/send-reminders.job.ts
5
- import { Invoice } from '@/contexts/billing/domain/aggregates/invoice.aggregate.js';
5
+ import { Invoice } from '@/contexts/billing/domain/aggregates/invoice.aggregate';
6
6
 
7
7
  @Scheduled('billing.send-reminders', { every: '15m' }, [InvoiceRepository, Mailer])
8
8
  export class SendRemindersJob {
@@ -1 +1 @@
1
- {"version":3,"file":"wiring-docs.d.ts","sourceRoot":"","sources":["../../../src/check/explain/wiring-docs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAEpD,eAAO,MAAM,WAAW,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAuDzD,CAAC"}
1
+ {"version":3,"file":"wiring-docs.d.ts","sourceRoot":"","sources":["../../../src/check/explain/wiring-docs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAEpD,eAAO,MAAM,WAAW,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAgFzD,CAAC"}
@@ -9,7 +9,7 @@ builder.include(billingDeclarations);`,
9
9
  const invoiceRepository = new PgInvoiceRepository();
10
10
  const issueInvoiceHandler = new IssueInvoiceHandler(invoiceRepository);
11
11
  // declared style: infrastructure/persistence/pg-invoice.repository.ts and src/main.ts
12
- @Repository(InvoiceRepository, [Database, ExecutionScope, Clock])
12
+ @Repository(InvoiceRepository)
13
13
  export class PgInvoiceRepository implements InvoiceRepository {}
14
14
  contextModule('billing', billingDeclarations);`,
15
15
  },
@@ -23,21 +23,46 @@ export class IssueInvoiceHandler {}
23
23
  @Repository(InvoiceRepository)
24
24
  export class Invoice {}`,
25
25
  good: `// application/commands/issue-invoice/issue-invoice.handler.ts
26
- @CommandHandler(IssueInvoiceCommand, [InvoiceRepository, Clock])
26
+ @CommandHandler(IssueInvoiceCommand)
27
27
  export class IssueInvoiceHandler {}
28
28
  // application/event-handlers/invoice-issued.event-handler.ts
29
29
  @DomainEventHandler(InvoiceIssued, { name: 'billing.invoice.issued' })
30
30
  export class InvoiceIssuedEventHandler {}`,
31
31
  },
32
32
  'declarations/barrel-current': {
33
- why: 'With stack.assembly set to barrel, the composition root assembles a context from <context>.declarations.ts and from nothing else. A role file added by hand and missing from the barrel compiles, passes its unit tests and is never registered. The barrel is derived from the tree, one export per role file sorted by path, so it is compared with what the tree says; with stack.assembly set to discovery the role files are found at startup and a barrel left behind is reported instead.',
34
- bad: `// billing.declarations.ts, while application/authorization/only-issuer-voids.policy.ts exists
35
- export * from '@/contexts/billing/application/commands/issue-invoice/issue-invoice.command.js';
36
- export * from '@/contexts/billing/application/commands/issue-invoice/issue-invoice.handler.js';`,
37
- good: `// billing.declarations.ts, rewritten by \`ddd-ts-kit generate\` and \`ddd-ts-kit docs\`
38
- export * from '@/contexts/billing/application/authorization/only-issuer-voids.policy.js';
39
- export * from '@/contexts/billing/application/commands/issue-invoice/issue-invoice.command.js';
40
- export * from '@/contexts/billing/application/commands/issue-invoice/issue-invoice.handler.js';`,
33
+ why: 'With stack.assembly set to barrel, the composition root assembles a context from <context>.declarations.ts and from nothing else. A role file added by hand and missing from the barrel compiles, passes its unit tests and is never registered. The same file registers what each constructor is injected, read from its signature: a constructor changed without regenerating would be given the dependencies of the old one. The file is derived from the tree, one export per role file sorted by path then one injected(Class, [Tokens]) per class that takes something, so it is compared with what the tree says, and the message names the class whose list is stale. With stack.assembly set to discovery the role files are found at startup, <context>.dependencies.ts holds the lists alone and is compared the same way, and a barrel left behind is reported.',
34
+ bad: `// billing.declarations.ts, while only-issuer-voids.policy.ts exists and IssueInvoiceHandler now also takes a Clock
35
+ export * from '@/contexts/billing/application/commands/issue-invoice/issue-invoice.command';
36
+ export * from '@/contexts/billing/application/commands/issue-invoice/issue-invoice.handler';
37
+
38
+ injected(IssueInvoiceHandler, [InvoiceRepository]);`,
39
+ good: `// billing.declarations.ts, rewritten by \`ddd-ts-kit generate\`, \`ddd-ts-kit docs\` and \`npm run dev\`
40
+ export * from '@/contexts/billing/application/authorization/only-issuer-voids.policy';
41
+ export * from '@/contexts/billing/application/commands/issue-invoice/issue-invoice.command';
42
+ export * from '@/contexts/billing/application/commands/issue-invoice/issue-invoice.handler';
43
+
44
+ injected(IssueInvoiceHandler, [InvoiceRepository, Clock]);`,
45
+ },
46
+ 'declarations/constructor-injection': {
47
+ why: 'The constructor signature is the one statement of what a declared class depends on: `ddd-ts-kit docs` reads it and writes the list the composition root injects, so nothing is repeated in the decorator and nothing can disagree with the constructor. That only works when each parameter names exactly one injection token, and a token is a class: an interface, a type alias or a primitive is erased by the compiler, a union names two things, an optional or defaulted parameter says the container might not give a value, which it always does. A constructor inherited from a class of a package cannot be read at all. The compiler is not asked for the types at run time: `emitDecoratorMetadata` exists only with legacy decorators compiled by tsc or swc, not with standard decorators nor under tsx or esbuild. Under "stack.dependencies": "signature" a list left in a decorator is a second statement: it wins at run time, so it is removed when it repeats the constructor (ESLint fixes it) and reported when it differs. A project whose config does not say lists its dependencies in its decorators, as 0.1 did, and may keep doing so.',
48
+ bad: `@CommandHandler(IssueInvoiceCommand)
49
+ export class IssueInvoiceHandler {
50
+ constructor(
51
+ private readonly invoices: InvoiceRepository | undefined,
52
+ private readonly settings: InvoiceSettings, // an interface
53
+ private readonly retries = 3,
54
+ ) {}
55
+ }
56
+ // "stack.dependencies": "signature"
57
+ @CommandHandler(IssueInvoiceCommand, [InvoiceRepository, Clock])`,
58
+ good: `@CommandHandler(IssueInvoiceCommand)
59
+ export class IssueInvoiceHandler {
60
+ constructor(
61
+ private readonly invoices: InvoiceRepository,
62
+ private readonly settings: InvoiceSettings, // an abstract class of application/ports, bound to a value in the platform
63
+ private readonly clock: Clock,
64
+ ) {}
65
+ }`,
41
66
  },
42
67
  'config/valid': {
43
68
  why: 'Every other rule reads the config: a misspelled upstream or rule id silently disables a check. The contexts on disk and in the config have to be the same set, or part of the code is not checked at all. A function limit above the ceiling of 100 lines and an allowance without a file or a reason are read as something else than what is written, so they are reported too.',
@@ -1 +1 @@
1
- {"version":3,"file":"wiring-docs.js","sourceRoot":"","sources":["../../../src/check/explain/wiring-docs.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,WAAW,GAAsC;IAC5D,4BAA4B,EAAE;QAC5B,GAAG,EAAE,qnBAAqnB;QAC1nB,GAAG,EAAE;;;sCAG6B;QAClC,IAAI,EAAE;;;;;;+CAMqC;KAC5C;IACD,4BAA4B,EAAE;QAC5B,GAAG,EAAE,0oBAA0oB;QAC/oB,GAAG,EAAE;;;;;;wBAMe;QACpB,IAAI,EAAE;;;;;0CAKgC;KACvC;IACD,6BAA6B,EAAE;QAC7B,GAAG,EAAE,keAAke;QACve,GAAG,EAAE;;gGAEuF;QAC5F,IAAI,EAAE;;;gGAGsF;KAC7F;IACD,cAAc,EAAE;QACd,GAAG,EAAE,kXAAkX;QACvX,GAAG,EAAE;;uEAE8D;QACnE,IAAI,EAAE;;2IAEiI;KACxI;IACD,iCAAiC,EAAE;QACjC,GAAG,EAAE,qMAAqM;QAC1M,GAAG,EAAE,qDAAqD;QAC1D,IAAI,EAAE,qGAAqG;KAC5G;CACF,CAAC"}
1
+ {"version":3,"file":"wiring-docs.js","sourceRoot":"","sources":["../../../src/check/explain/wiring-docs.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,WAAW,GAAsC;IAC5D,4BAA4B,EAAE;QAC5B,GAAG,EAAE,qnBAAqnB;QAC1nB,GAAG,EAAE;;;sCAG6B;QAClC,IAAI,EAAE;;;;;;+CAMqC;KAC5C;IACD,4BAA4B,EAAE;QAC5B,GAAG,EAAE,0oBAA0oB;QAC/oB,GAAG,EAAE;;;;;;wBAMe;QACpB,IAAI,EAAE;;;;;0CAKgC;KACvC;IACD,6BAA6B,EAAE;QAC7B,GAAG,EAAE,60BAA60B;QACl1B,GAAG,EAAE;;;;oDAI2C;QAChD,IAAI,EAAE;;;;;2DAKiD;KACxD;IACD,oCAAoC,EAAE;QACpC,GAAG,EAAE,omCAAomC;QACzmC,GAAG,EAAE;;;;;;;;;iEASwD;QAC7D,IAAI,EAAE;;;;;;;EAOR;KACC;IACD,cAAc,EAAE;QACd,GAAG,EAAE,kXAAkX;QACvX,GAAG,EAAE;;uEAE8D;QACnE,IAAI,EAAE;;2IAEiI;KACxI;IACD,iCAAiC,EAAE;QACjC,GAAG,EAAE,qMAAqM;QAC1M,GAAG,EAAE,qDAAqD;QAC1D,IAAI,EAAE,qGAAqG;KAC5G;CACF,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"alias-declared-fixtures.d.ts","sourceRoot":"","sources":["../../../src/check/fixtures/alias-declared-fixtures.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAQ5C,eAAO,MAAM,uBAAuB,EAAE,SAAS,OAAO,EAoErD,CAAC"}
1
+ {"version":3,"file":"alias-declared-fixtures.d.ts","sourceRoot":"","sources":["../../../src/check/fixtures/alias-declared-fixtures.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAW5C,eAAO,MAAM,uBAAuB,EAAE,SAAS,OAAO,EAmHrD,CAAC"}
@@ -6,6 +6,8 @@ const PATHS = { '@/*': ['./src/*'], '$test/*': ['./test/*'], '$scripts/*': ['./s
6
6
  const COMPILE = 'node node_modules/@typescript/native/bin/tsc -p tsconfig.build.json';
7
7
  const BUILD = `${COMPILE} && ddd-ts-kit build-aliases`;
8
8
  const JEST_MAPPER = String.raw `moduleNameMapper: { '^\\$app/(.*)\\.js$': '<rootDir>/src/$1.ts', '^\\$test/(.*)\\.js$': '<rootDir>/test/$1.ts', '^\\$scripts/(.*)\\.js$': '<rootDir>/scripts/$1.ts' }`;
9
+ const BARE_JEST_MAPPER = String.raw `moduleNameMapper: { '^@/(.*)$': '<rootDir>/src/$1.ts', '^\\$test/(.*)$': '<rootDir>/test/$1.ts', '^\\$scripts/(.*)$': '<rootDir>/scripts/$1.ts' }`;
10
+ const BUNDLER = { module: 'ESNext', moduleResolution: 'Bundler', customConditions: ['node'] };
9
11
  export const ALIAS_DECLARED_FIXTURES = [
10
12
  { ruleId: RULE, name: 'one declaration, and every tool pointed at it', expect: 'pass', files: aliasDeclarations() },
11
13
  {
@@ -19,6 +21,16 @@ export const ALIAS_DECLARED_FIXTURES = [
19
21
  'jest.e2e.config.js': "import base from './jest.config.js';\nexport default { ...base };\n",
20
22
  }),
21
23
  },
24
+ {
25
+ ruleId: RULE,
26
+ name: 'imports written without an extension: the compiler resolves as a bundler, jest maps the specifier as written',
27
+ expect: 'pass',
28
+ files: aliasDeclarations({
29
+ [CONFIG_FILE]: config({ importAlias: '@/', importExtension: 'none' }),
30
+ 'tsconfig.json': tsconfig(PATHS, BUNDLER),
31
+ 'jest.config.js': `export default { ${BARE_JEST_MAPPER}, ...governedJestCoverage() };\n`,
32
+ }),
33
+ },
22
34
  failing('a Node subpath import as the alias', CONFIG_FILE, config({ importAlias: '#app/' })),
23
35
  failing('an alias that could be any package', CONFIG_FILE, config({ importAlias: 'app/' })),
24
36
  failing('an alias that is the name of a scope', CONFIG_FILE, config({ importAlias: '@app/' })),
@@ -38,9 +50,28 @@ export const ALIAS_DECLARED_FIXTURES = [
38
50
  '\n'),
39
51
  failing('a dependency-cruiser config that does not read tsconfig', '.dependency-cruiser.cjs', "module.exports = { options: { enhancedResolveOptions: { conditionNames: ['import'] } } };\n"),
40
52
  failing('a knip config that maps the alias', 'knip.json', json({ paths: { '@/*': ['./src/*'] } })),
53
+ failing('imports written with ".js" and a compiler that resolves as a bundler', 'tsconfig.json', tsconfig(PATHS, BUNDLER)),
54
+ failing('imports written with ".js" and a module resolution that does not require it', 'tsconfig.json', tsconfig(PATHS, { moduleResolution: 'Bundler' })),
55
+ bare('a compiler that resolves as Node does', 'tsconfig.json', tsconfig(PATHS)),
56
+ bare('a module resolution that requires the extension', 'tsconfig.json', tsconfig(PATHS, { ...BUNDLER, moduleResolution: 'NodeNext' })),
57
+ bare('a bundler resolution that no longer reads the entry a package has for Node', 'tsconfig.json', tsconfig(PATHS, { ...BUNDLER, customConditions: [] })),
58
+ bare('a module format that is not the one the build completes', 'tsconfig.json', tsconfig(PATHS, { ...BUNDLER, module: 'CommonJS' })),
59
+ bare('a build config that resolves another way than the type check', 'tsconfig.build.json', json({ extends: './tsconfig.json', compilerOptions: { module: 'NodeNext', moduleResolution: 'NodeNext' } })),
60
+ bare('a jest config that still maps the specifier with ".js"', 'jest.config.js', `export default { ${JEST_MAPPER.replace(String.raw `\\$app`, '@')}, ...governedJestCoverage() };\n`),
61
+ bare('a build that compiles and does not rewrite the aliases', 'package.json', manifest({ build: COMPILE })),
41
62
  ];
42
63
  function tsconfig(paths, more = {}) {
43
- return json({ compilerOptions: { rootDir: '.', outDir: 'dist', paths, ...more } });
64
+ return json({ compilerOptions: { module: 'NodeNext', rootDir: '.', outDir: 'dist', paths, ...more } });
65
+ }
66
+ /** A failing fixture of a project that writes its imports without an extension, everything else as `init` writes it. */
67
+ function bare(name, file, content) {
68
+ const files = aliasDeclarations({
69
+ [CONFIG_FILE]: config({ importAlias: '@/', importExtension: 'none' }),
70
+ 'tsconfig.json': tsconfig(PATHS, BUNDLER),
71
+ 'jest.config.js': `export default { ${BARE_JEST_MAPPER}, ...governedJestCoverage() };\n`,
72
+ [file]: content,
73
+ });
74
+ return { ruleId: RULE, name: `without an extension: ${name}`, expect: { file }, files };
44
75
  }
45
76
  function manifest(scripts) {
46
77
  return json({ name: 'fixture', type: 'module', scripts });
@@ -1 +1 @@
1
- {"version":3,"file":"alias-declared-fixtures.js","sourceRoot":"","sources":["../../../src/check/fixtures/alias-declared-fixtures.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"alias-declared-fixtures.js","sourceRoot":"","sources":["../../../src/check/fixtures/alias-declared-fixtures.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"config-fixtures.d.ts","sourceRoot":"","sources":["../../../src/check/fixtures/config-fixtures.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAQ5C,eAAO,MAAM,eAAe,EAAE,SAAS,OAAO,EAwG7C,CAAC"}
1
+ {"version":3,"file":"config-fixtures.d.ts","sourceRoot":"","sources":["../../../src/check/fixtures/config-fixtures.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAQ5C,eAAO,MAAM,eAAe,EAAE,SAAS,OAAO,EA8G7C,CAAC"}
@@ -54,6 +54,12 @@ export const CONFIG_FIXTURES = [
54
54
  expect: { file: CONFIG_FILE },
55
55
  files: project({}, { [CONFIG_FILE]: config({ guard: 'strict' }) }),
56
56
  },
57
+ {
58
+ ruleId: 'config/valid',
59
+ name: 'an unknown import extension',
60
+ expect: { file: CONFIG_FILE },
61
+ files: project({}, { [CONFIG_FILE]: config({ importExtension: 'ts' }) }),
62
+ },
57
63
  {
58
64
  ruleId: 'config/valid',
59
65
  name: 'an unknown rule id',
@@ -1 +1 @@
1
- {"version":3,"file":"config-fixtures.js","sourceRoot":"","sources":["../../../src/check/fixtures/config-fixtures.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config-fixtures.js","sourceRoot":"","sources":["../../../src/check/fixtures/config-fixtures.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,GAAG,KAAK,CAAC;AACzC,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;AAE3B,MAAM,CAAC,MAAM,eAAe,GAAuB;IACjD;QACE,MAAM,EAAE,cAAc;QACtB,IAAI,EAAE,+EAA+E;QACrF,MAAM,EAAE,MAAM;QACd,KAAK,EAAE,OAAO,CACZ,EAAE,EACF;YACE,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;gBACpB,KAAK,EAAE,EAAE,eAAe,EAAE,MAAM,EAAE,oBAAoB,EAAE,KAAK,EAAE,yBAAyB,EAAE,MAAM,EAAE;gBAClG,KAAK,EAAE,QAAQ;gBACf,MAAM,EAAE,EAAE,gBAAgB,EAAE,GAAG,EAAE;gBACjC,UAAU,EAAE;oBACV,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,wBAAwB,EAAE,MAAM,EAAE,sDAAsD,EAAE,CAAC;iBAC5G;aACF,CAAC;SACH,CACF;KACF;IACD;QACE,MAAM,EAAE,cAAc;QACtB,IAAI,EAAE,iDAAiD;QACvD,MAAM,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE;QAC7B,KAAK,EAAE,OAAO,CAAC,EAAE,EAAE,EAAE,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,EAAE,gBAAgB,EAAE,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC;KACrF;IACD;QACE,MAAM,EAAE,cAAc;QACtB,IAAI,EAAE,6CAA6C;QACnD,MAAM,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE;QAC7B,KAAK,EAAE,OAAO,CAAC,EAAE,EAAE,EAAE,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC,EAAE,UAAU,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,6BAA6B,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;KACpH;IACD;QACE,MAAM,EAAE,cAAc;QACtB,IAAI,EAAE,qBAAqB;QAC3B,MAAM,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE;QAC7B,KAAK,EAAE,OAAO,CACZ,EAAE,EACF;YACE,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;gBACpB,QAAQ,EAAE;oBACR,OAAO,EAAE,EAAE,cAAc,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,EAAE;oBACxE,OAAO,EAAE,EAAE,cAAc,EAAE,YAAY,EAAE,SAAS,EAAE,EAAE,EAAE;iBACzD;aACF,CAAC;SACH,CACF;KACF;IACD;QACE,MAAM,EAAE,cAAc;QACtB,IAAI,EAAE,uBAAuB;QAC7B,MAAM,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE;QAC7B,KAAK,EAAE,OAAO,CAAC,EAAE,EAAE,EAAE,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;KACnE;IACD;QACE,MAAM,EAAE,cAAc;QACtB,IAAI,EAAE,6BAA6B;QACnC,MAAM,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE;QAC7B,KAAK,EAAE,OAAO,CAAC,EAAE,EAAE,EAAE,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC,EAAE,eAAe,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;KACzE;IACD;QACE,MAAM,EAAE,cAAc;QACtB,IAAI,EAAE,oBAAoB;QAC1B,MAAM,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE;QAC7B,KAAK,EAAE,OAAO,CAAC,EAAE,EAAE,EAAE,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC,EAAE,KAAK,EAAE,EAAE,cAAc,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC;KACrF;IACD;QACE,MAAM,EAAE,cAAc;QACtB,IAAI,EAAE,oDAAoD;QAC1D,MAAM,EAAE,EAAE,IAAI,EAAE,uBAAuB,EAAE;QACzC,KAAK,EAAE,OAAO,CAAC,EAAE,kCAAkC,EAAE,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;KAC9E;IACD;QACE,MAAM,EAAE,cAAc;QACtB,IAAI,EAAE,gDAAgD;QACtD,MAAM,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE;QAC7B,KAAK,EAAE,OAAO,CACZ,EAAE,EACF;YACE,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;gBACpB,QAAQ,EAAE;oBACR,OAAO,EAAE,EAAE,cAAc,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,SAAS,CAAC,EAAE;oBAC3D,OAAO,EAAE,EAAE,cAAc,EAAE,YAAY,EAAE,SAAS,EAAE,EAAE,EAAE;oBACxD,QAAQ,EAAE,EAAE,cAAc,EAAE,SAAS,EAAE,SAAS,EAAE,EAAE,EAAE;iBACvD;aACF,CAAC;SACH,CACF;KACF;IACD;QACE,MAAM,EAAE,iCAAiC;QACzC,IAAI,EAAE,oDAAoD;QAC1D,MAAM,EAAE,MAAM;QACd,KAAK,EAAE,OAAO,CAAC;YACb,GAAG,SAAS,CACV,qLAAqL,CACtL;YACD,CAAC,WAAW,CAAC,EAAE,MAAM;SACtB,CAAC;KACH;IACD;QACE,MAAM,EAAE,iCAAiC;QACzC,IAAI,EAAE,gCAAgC;QACtC,MAAM,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;QAC3B,IAAI,EAAE,CAAC,qBAAqB,CAAC;QAC7B,KAAK,EAAE,OAAO,CACZ,SAAS,CACP,4IAA4I,CAC7I,CACF;KACF;CACF,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Fixture } from './fixture.js';
2
+ export declare const CONSTRUCTOR_INJECTION_FIXTURES: readonly Fixture[];
3
+ //# sourceMappingURL=constructor-injection-fixtures.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constructor-injection-fixtures.d.ts","sourceRoot":"","sources":["../../../src/check/fixtures/constructor-injection-fixtures.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAwB5C,eAAO,MAAM,8BAA8B,EAAE,SAAS,OAAO,EA6H5D,CAAC"}
@@ -0,0 +1,111 @@
1
+ import { PATHS } from './paths.js';
2
+ import { SIGNATURE } from './signature.js';
3
+ import { signatureProject } from './signature-project.js';
4
+ import { source } from './source.js';
5
+ const { BARREL, BILLING, HANDLER } = PATHS;
6
+ const RULE = 'declarations/constructor-injection';
7
+ const BARE = '@CommandHandler(IssueInvoiceCommand)';
8
+ const SETTINGS = `${BILLING}/application/ports/invoice-settings.port.ts`;
9
+ const DEPENDENCIES = `${BILLING}/billing.dependencies.ts`;
10
+ const takingInstead = (parameter, imports = SIGNATURE.ports) => SIGNATURE.handlerOf(BARE, imports, [SIGNATURE.taken[0] ?? '', parameter]);
11
+ const REFUSED_PARAMETERS = [
12
+ ['a union of two classes', 'private readonly clock: Clock | InvoiceRepository'],
13
+ ['an optional parameter', 'private readonly clock?: Clock'],
14
+ ['a default value', 'private readonly clock: Clock = fallbackClock'],
15
+ ['a type of the language', 'private readonly retries: number'],
16
+ ['a rest parameter', '...clocks: Clock[]'],
17
+ ['a destructured parameter', '{ now }: Clock'],
18
+ ];
19
+ export const CONSTRUCTOR_INJECTION_FIXTURES = [
20
+ {
21
+ ruleId: RULE,
22
+ name: 'a handler that lists nothing and types each constructor parameter by a port, its barrel registering what was read',
23
+ expect: 'pass',
24
+ files: signatureProject(SIGNATURE.handler, { [BARREL]: SIGNATURE.barrel }),
25
+ },
26
+ {
27
+ ruleId: RULE,
28
+ name: 'a parameter typed by a generic class, whose raw class is the token',
29
+ expect: 'pass',
30
+ files: signatureProject(takingInstead('private readonly clock: Clock<Date>'), { [BARREL]: SIGNATURE.barrel }),
31
+ },
32
+ ...REFUSED_PARAMETERS.map(([name, parameter]) => ({
33
+ ruleId: RULE,
34
+ name: `a constructor parameter that names no single class: ${name}`,
35
+ expect: { file: HANDLER },
36
+ files: signatureProject(takingInstead(parameter)),
37
+ })),
38
+ {
39
+ ruleId: RULE,
40
+ name: 'a parameter typed by an interface the file declares',
41
+ expect: { file: HANDLER },
42
+ files: signatureProject(`${takingInstead('private readonly settings: InvoiceSettings')}\ninterface InvoiceSettings {\n readonly currency: string;\n}\n`),
43
+ },
44
+ {
45
+ ruleId: RULE,
46
+ name: 'a parameter typed by an interface of another file of the project',
47
+ expect: { file: HANDLER },
48
+ also: ['ports/abstract-class'],
49
+ files: signatureProject(takingInstead('private readonly settings: InvoiceSettings', [
50
+ ...SIGNATURE.ports,
51
+ "import type { InvoiceSettings } from '@/contexts/billing/application/ports/invoice-settings.port.js';",
52
+ ]), { [SETTINGS]: source('export interface InvoiceSettings {', ' readonly currency: string;', '}') }),
53
+ },
54
+ {
55
+ ruleId: RULE,
56
+ name: 'a class that inherits its constructor from a class of a package',
57
+ expect: { file: HANDLER },
58
+ files: signatureProject(source("import { RecordedHandler } from '@ddd-ts-kit/kernel';", "import { CommandHandler } from '@ddd-ts-kit/kernel/declarations';", "import { IssueInvoiceCommand } from '@/contexts/billing/application/commands/issue-invoice/issue-invoice.command.js';", '', BARE, 'export class IssueInvoiceHandler extends RecordedHandler {}')),
59
+ },
60
+ {
61
+ ruleId: RULE,
62
+ name: 'a signature project whose decorator repeats what the constructor states',
63
+ expect: { file: HANDLER },
64
+ files: signatureProject(SIGNATURE.handlerOf('@CommandHandler(IssueInvoiceCommand, [InvoiceRepository, Clock])', SIGNATURE.ports.map((line) => line.replace('import type', 'import')), SIGNATURE.taken)),
65
+ },
66
+ {
67
+ ruleId: RULE,
68
+ name: 'a signature project whose decorator lists another class than the constructor is typed by',
69
+ expect: { file: HANDLER },
70
+ files: signatureProject(SIGNATURE.handlerOf('@CommandHandler(IssueInvoiceCommand, [InvoiceRepository, IdGenerator])', [
71
+ "import { IdGenerator, type Clock } from '@ddd-ts-kit/kernel';",
72
+ (SIGNATURE.ports[1] ?? '').replace('import type', 'import'),
73
+ ], SIGNATURE.taken)),
74
+ },
75
+ {
76
+ ruleId: 'ports/no-concrete-dependency',
77
+ name: 'a constructor parameter typed by the adapter instead of its port',
78
+ expect: { file: HANDLER },
79
+ also: ['layer/application-inward', 'declarations/barrel-current'],
80
+ files: signatureProject(SIGNATURE.handlerOf(BARE, [
81
+ "import type { InMemoryInvoiceRepository } from '@/contexts/billing/infrastructure/persistence/in-memory-invoice.repository.js';",
82
+ ], ['private readonly invoiceRepository: InMemoryInvoiceRepository'])),
83
+ },
84
+ {
85
+ ruleId: 'declarations/barrel-current',
86
+ name: 'a barrel whose dependency list was read from a constructor that has changed since',
87
+ expect: { file: BARREL },
88
+ files: signatureProject(SIGNATURE.handler, {
89
+ [BARREL]: SIGNATURE.barrel.replace('[InvoiceRepository, Clock]', '[InvoiceRepository]'),
90
+ }),
91
+ },
92
+ {
93
+ ruleId: 'declarations/barrel-current',
94
+ name: 'a barrel that registers no dependency list for a constructor that takes something',
95
+ expect: { file: BARREL },
96
+ files: signatureProject(SIGNATURE.handler),
97
+ },
98
+ {
99
+ ruleId: 'declarations/barrel-current',
100
+ name: 'assembly by discovery: the dependencies file registers what each constructor takes',
101
+ expect: 'pass',
102
+ files: signatureProject(SIGNATURE.handler, { [DEPENDENCIES]: SIGNATURE.dependencies }, 'discovery'),
103
+ },
104
+ {
105
+ ruleId: 'declarations/barrel-current',
106
+ name: 'assembly by discovery: a constructor takes something and no dependencies file registers it',
107
+ expect: { file: DEPENDENCIES },
108
+ files: signatureProject(SIGNATURE.handler, {}, 'discovery'),
109
+ },
110
+ ];
111
+ //# sourceMappingURL=constructor-injection-fixtures.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constructor-injection-fixtures.js","sourceRoot":"","sources":["../../../src/check/fixtures/constructor-injection-fixtures.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"declared-project.d.ts","sourceRoot":"","sources":["../../../src/check/fixtures/declared-project.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAGvD,uGAAuG;AACvG,wBAAgB,eAAe,CAAC,KAAK,EAAE,YAAY,EAAE,SAAS,GAAE,YAAiB,GAAG,YAAY,CAc/F"}
1
+ {"version":3,"file":"declared-project.d.ts","sourceRoot":"","sources":["../../../src/check/fixtures/declared-project.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAGvD,uGAAuG;AACvG,wBAAgB,eAAe,CAAC,KAAK,EAAE,YAAY,EAAE,SAAS,GAAE,YAAiB,GAAG,YAAY,CAiB/F"}
@@ -8,7 +8,10 @@ export function declaredProject(files, overrides = {}) {
8
8
  const barrels = ['billing', 'catalog'].map((context) => {
9
9
  const directory = `src/contexts/${context}/`;
10
10
  const inside = Object.keys(written).flatMap((file) => file.startsWith(directory) ? [file.slice(directory.length)] : []);
11
- return [`${directory}${barrelFile(context)}`, renderBarrel(inside, `@/contexts/${context}`)];
11
+ return [
12
+ `${directory}${barrelFile(context)}`,
13
+ renderBarrel(inside, (entry) => `@/contexts/${context}/${entry.replace(/\.ts$/, '.js')}`),
14
+ ];
12
15
  });
13
16
  return { ...written, ...Object.fromEntries(barrels), ...overrides };
14
17
  }
@@ -1 +1 @@
1
- {"version":3,"file":"declared-project.js","sourceRoot":"","sources":["../../../src/check/fixtures/declared-project.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC,uGAAuG;AACvG,MAAM,UAAU,eAAe,CAAC,KAAmB,EAAE,SAAS,GAAiB,EAAE;IAC/E,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;IAE5F,MAAM,OAAO,GAAG,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,EAAoB,EAAE;QACvE,MAAM,SAAS,GAAG,gBAAgB,OAAO,GAAG,CAAC;QAE7C,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CACnD,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CACjE,CAAC;QAEF,OAAO,CAAC,GAAG,SAAS,GAAG,UAAU,CAAC,OAAO,CAAC,EAAE,EAAE,YAAY,CAAC,MAAM,EAAE,cAAc,OAAO,EAAE,CAAC,CAAC,CAAC;IAC/F,CAAC,CAAC,CAAC;IAEH,OAAO,EAAE,GAAG,OAAO,EAAE,GAAG,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,GAAG,SAAS,EAAE,CAAC;AACtE,CAAC"}
1
+ {"version":3,"file":"declared-project.js","sourceRoot":"","sources":["../../../src/check/fixtures/declared-project.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC,uGAAuG;AACvG,MAAM,UAAU,eAAe,CAAC,KAAmB,EAAE,SAAS,GAAiB,EAAE;IAC/E,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;IAE5F,MAAM,OAAO,GAAG,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,EAAoB,EAAE;QACvE,MAAM,SAAS,GAAG,gBAAgB,OAAO,GAAG,CAAC;QAE7C,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CACnD,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CACjE,CAAC;QAEF,OAAO;YACL,GAAG,SAAS,GAAG,UAAU,CAAC,OAAO,CAAC,EAAE;YACpC,YAAY,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,cAAc,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE,CAAC;SAC1F,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,OAAO,EAAE,GAAG,OAAO,EAAE,GAAG,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,GAAG,SAAS,EAAE,CAAC;AACtE,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Fixture } from './fixture.js';
2
+ export declare const EXTENSION_FIXTURES: readonly Fixture[];
3
+ //# sourceMappingURL=extension-fixtures.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extension-fixtures.d.ts","sourceRoot":"","sources":["../../../src/check/fixtures/extension-fixtures.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAc5C,eAAO,MAAM,kBAAkB,EAAE,SAAS,OAAO,EA+DhD,CAAC"}