ddd-ts-kit 0.2.0 → 0.3.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 (232) hide show
  1. package/README.md +55 -2
  2. package/dist/check/catalogue/architecture-rules.d.ts.map +1 -1
  3. package/dist/check/catalogue/architecture-rules.js +4 -0
  4. package/dist/check/catalogue/architecture-rules.js.map +1 -1
  5. package/dist/check/catalogue/eslint-only-rules.d.ts.map +1 -1
  6. package/dist/check/catalogue/eslint-only-rules.js +12 -0
  7. package/dist/check/catalogue/eslint-only-rules.js.map +1 -1
  8. package/dist/check/errors/builds-through-factories.d.ts +4 -0
  9. package/dist/check/errors/builds-through-factories.d.ts.map +1 -0
  10. package/dist/check/errors/builds-through-factories.js +5 -0
  11. package/dist/check/errors/builds-through-factories.js.map +1 -0
  12. package/dist/check/errors/error-code.d.ts +6 -0
  13. package/dist/check/errors/error-code.d.ts.map +1 -0
  14. package/dist/check/errors/error-code.js +2 -0
  15. package/dist/check/errors/error-code.js.map +1 -0
  16. package/dist/check/errors/error-codes.d.ts +8 -0
  17. package/dist/check/errors/error-codes.d.ts.map +1 -0
  18. package/dist/check/errors/error-codes.js +21 -0
  19. package/dist/check/errors/error-codes.js.map +1 -0
  20. package/dist/check/errors/kit-error-codes.d.ts +3 -0
  21. package/dist/check/errors/kit-error-codes.d.ts.map +1 -0
  22. package/dist/check/errors/kit-error-codes.js +17 -0
  23. package/dist/check/errors/kit-error-codes.js.map +1 -0
  24. package/dist/check/explain/errors-docs.d.ts +3 -0
  25. package/dist/check/explain/errors-docs.d.ts.map +1 -0
  26. package/dist/check/explain/errors-docs.js +30 -0
  27. package/dist/check/explain/errors-docs.js.map +1 -0
  28. package/dist/check/explain/rule-docs.d.ts.map +1 -1
  29. package/dist/check/explain/rule-docs.js +2 -0
  30. package/dist/check/explain/rule-docs.js.map +1 -1
  31. package/dist/check/fixtures/errors-fixtures.d.ts +3 -0
  32. package/dist/check/fixtures/errors-fixtures.d.ts.map +1 -0
  33. package/dist/check/fixtures/errors-fixtures.js +126 -0
  34. package/dist/check/fixtures/errors-fixtures.js.map +1 -0
  35. package/dist/check/fixtures/fixtures.d.ts.map +1 -1
  36. package/dist/check/fixtures/fixtures.js +2 -0
  37. package/dist/check/fixtures/fixtures.js.map +1 -1
  38. package/dist/check/rules/errors-code-unique.d.ts +3 -0
  39. package/dist/check/rules/errors-code-unique.d.ts.map +1 -0
  40. package/dist/check/rules/errors-code-unique.js +34 -0
  41. package/dist/check/rules/errors-code-unique.js.map +1 -0
  42. package/dist/check/rules/errors-known-code.d.ts +3 -0
  43. package/dist/check/rules/errors-known-code.d.ts.map +1 -0
  44. package/dist/check/rules/errors-known-code.js +51 -0
  45. package/dist/check/rules/errors-known-code.js.map +1 -0
  46. package/dist/check/rules/language-glossary-term.d.ts.map +1 -1
  47. package/dist/check/rules/language-glossary-term.js +7 -5
  48. package/dist/check/rules/language-glossary-term.js.map +1 -1
  49. package/dist/commands/error-factories.d.ts +7 -0
  50. package/dist/commands/error-factories.d.ts.map +1 -0
  51. package/dist/commands/error-factories.js +65 -0
  52. package/dist/commands/error-factories.js.map +1 -0
  53. package/dist/commands/init.d.ts.map +1 -1
  54. package/dist/commands/init.js +1 -0
  55. package/dist/commands/init.js.map +1 -1
  56. package/dist/config/index.d.ts +1 -1
  57. package/dist/config/index.d.ts.map +1 -1
  58. package/dist/config/index.js +1 -1
  59. package/dist/config/index.js.map +1 -1
  60. package/dist/config/parse-stack.d.ts.map +1 -1
  61. package/dist/config/parse-stack.js +2 -1
  62. package/dist/config/parse-stack.js.map +1 -1
  63. package/dist/config/stack.d.ts +9 -0
  64. package/dist/config/stack.d.ts.map +1 -1
  65. package/dist/config/stack.js +1 -0
  66. package/dist/config/stack.js.map +1 -1
  67. package/dist/describe/context-description.d.ts +12 -0
  68. package/dist/describe/context-description.d.ts.map +1 -1
  69. package/dist/describe/describe-context.d.ts.map +1 -1
  70. package/dist/describe/describe-context.js +2 -0
  71. package/dist/describe/describe-context.js.map +1 -1
  72. package/dist/describe/format-description.d.ts.map +1 -1
  73. package/dist/describe/format-description.js +5 -0
  74. package/dist/describe/format-description.js.map +1 -1
  75. package/dist/describe/read-errors.d.ts +8 -0
  76. package/dist/describe/read-errors.d.ts.map +1 -0
  77. package/dist/describe/read-errors.js +52 -0
  78. package/dist/describe/read-errors.js.map +1 -0
  79. package/dist/describe/reference-lines.js +14 -1
  80. package/dist/describe/reference-lines.js.map +1 -1
  81. package/dist/generate/errors/add-factory.d.ts +13 -0
  82. package/dist/generate/errors/add-factory.d.ts.map +1 -0
  83. package/dist/generate/errors/add-factory.js +30 -0
  84. package/dist/generate/errors/add-factory.js.map +1 -0
  85. package/dist/generate/errors/add-spec-case.d.ts +6 -0
  86. package/dist/generate/errors/add-spec-case.d.ts.map +1 -0
  87. package/dist/generate/errors/add-spec-case.js +26 -0
  88. package/dist/generate/errors/add-spec-case.js.map +1 -0
  89. package/dist/generate/errors/class-body.d.ts +8 -0
  90. package/dist/generate/errors/class-body.d.ts.map +1 -0
  91. package/dist/generate/errors/class-body.js +11 -0
  92. package/dist/generate/errors/class-body.js.map +1 -0
  93. package/dist/generate/errors/codes-of-context.d.ts +4 -0
  94. package/dist/generate/errors/codes-of-context.d.ts.map +1 -0
  95. package/dist/generate/errors/codes-of-context.js +17 -0
  96. package/dist/generate/errors/codes-of-context.js.map +1 -0
  97. package/dist/generate/errors/refusal-code.d.ts +13 -0
  98. package/dist/generate/errors/refusal-code.d.ts.map +1 -0
  99. package/dist/generate/errors/refusal-code.js +19 -0
  100. package/dist/generate/errors/refusal-code.js.map +1 -0
  101. package/dist/generate/errors/refusal-name.d.ts +4 -0
  102. package/dist/generate/errors/refusal-name.d.ts.map +1 -0
  103. package/dist/generate/errors/refusal-name.js +15 -0
  104. package/dist/generate/errors/refusal-name.js.map +1 -0
  105. package/dist/generate/errors/static-methods.d.ts +10 -0
  106. package/dist/generate/errors/static-methods.d.ts.map +1 -0
  107. package/dist/generate/errors/static-methods.js +13 -0
  108. package/dist/generate/errors/static-methods.js.map +1 -0
  109. package/dist/generate/errors/vague-refusal-names.d.ts +3 -0
  110. package/dist/generate/errors/vague-refusal-names.d.ts.map +1 -0
  111. package/dist/generate/errors/vague-refusal-names.js +15 -0
  112. package/dist/generate/errors/vague-refusal-names.js.map +1 -0
  113. package/dist/generate/kinds/domain-error-kind.d.ts.map +1 -1
  114. package/dist/generate/kinds/domain-error-kind.js +4 -1
  115. package/dist/generate/kinds/domain-error-kind.js.map +1 -1
  116. package/dist/generate/kinds/error-kind.d.ts +3 -0
  117. package/dist/generate/kinds/error-kind.d.ts.map +1 -0
  118. package/dist/generate/kinds/error-kind.js +75 -0
  119. package/dist/generate/kinds/error-kind.js.map +1 -0
  120. package/dist/generate/kinds.d.ts.map +1 -1
  121. package/dist/generate/kinds.js +2 -0
  122. package/dist/generate/kinds.js.map +1 -1
  123. package/dist/init/manifest/versions.js +23 -23
  124. package/dist/init/stack/resolve-stack.d.ts.map +1 -1
  125. package/dist/init/stack/resolve-stack.js +3 -1
  126. package/dist/init/stack/resolve-stack.js.map +1 -1
  127. package/dist/init/stack/stack-options.d.ts +1 -0
  128. package/dist/init/stack/stack-options.d.ts.map +1 -1
  129. package/dist/refusals/apply-plan.d.ts +17 -0
  130. package/dist/refusals/apply-plan.d.ts.map +1 -0
  131. package/dist/refusals/apply-plan.js +118 -0
  132. package/dist/refusals/apply-plan.js.map +1 -0
  133. package/dist/refusals/factory-name-for.d.ts +7 -0
  134. package/dist/refusals/factory-name-for.d.ts.map +1 -0
  135. package/dist/refusals/factory-name-for.js +16 -0
  136. package/dist/refusals/factory-name-for.js.map +1 -0
  137. package/dist/refusals/legacy-error.d.ts +21 -0
  138. package/dist/refusals/legacy-error.d.ts.map +1 -0
  139. package/dist/refusals/legacy-error.js +2 -0
  140. package/dist/refusals/legacy-error.js.map +1 -0
  141. package/dist/refusals/legacy-errors.d.ts +6 -0
  142. package/dist/refusals/legacy-errors.d.ts.map +1 -0
  143. package/dist/refusals/legacy-errors.js +16 -0
  144. package/dist/refusals/legacy-errors.js.map +1 -0
  145. package/dist/refusals/migration-draft.d.ts +15 -0
  146. package/dist/refusals/migration-draft.d.ts.map +1 -0
  147. package/dist/refusals/migration-draft.js +41 -0
  148. package/dist/refusals/migration-draft.js.map +1 -0
  149. package/dist/refusals/migration-plan.d.ts +6 -0
  150. package/dist/refusals/migration-plan.d.ts.map +1 -0
  151. package/dist/refusals/migration-plan.js +2 -0
  152. package/dist/refusals/migration-plan.js.map +1 -0
  153. package/dist/refusals/move.d.ts +15 -0
  154. package/dist/refusals/move.d.ts.map +1 -0
  155. package/dist/refusals/move.js +2 -0
  156. package/dist/refusals/move.js.map +1 -0
  157. package/dist/refusals/nested-cases.d.ts +3 -0
  158. package/dist/refusals/nested-cases.d.ts.map +1 -0
  159. package/dist/refusals/nested-cases.js +9 -0
  160. package/dist/refusals/nested-cases.js.map +1 -0
  161. package/dist/refusals/plan-file.d.ts +3 -0
  162. package/dist/refusals/plan-file.d.ts.map +1 -0
  163. package/dist/refusals/plan-file.js +3 -0
  164. package/dist/refusals/plan-file.js.map +1 -0
  165. package/dist/refusals/planned-factory.d.ts +11 -0
  166. package/dist/refusals/planned-factory.d.ts.map +1 -0
  167. package/dist/refusals/planned-factory.js +2 -0
  168. package/dist/refusals/planned-factory.js.map +1 -0
  169. package/dist/refusals/planned-move.d.ts +8 -0
  170. package/dist/refusals/planned-move.d.ts.map +1 -0
  171. package/dist/refusals/planned-move.js +2 -0
  172. package/dist/refusals/planned-move.js.map +1 -0
  173. package/dist/refusals/project-sources.d.ts +5 -0
  174. package/dist/refusals/project-sources.d.ts.map +1 -0
  175. package/dist/refusals/project-sources.js +13 -0
  176. package/dist/refusals/project-sources.js.map +1 -0
  177. package/dist/refusals/propose-plan.d.ts +16 -0
  178. package/dist/refusals/propose-plan.d.ts.map +1 -0
  179. package/dist/refusals/propose-plan.js +39 -0
  180. package/dist/refusals/propose-plan.js.map +1 -0
  181. package/dist/refusals/read-legacy-error.d.ts +9 -0
  182. package/dist/refusals/read-legacy-error.d.ts.map +1 -0
  183. package/dist/refusals/read-legacy-error.js +75 -0
  184. package/dist/refusals/read-legacy-error.js.map +1 -0
  185. package/dist/refusals/read-plan.d.ts +4 -0
  186. package/dist/refusals/read-plan.d.ts.map +1 -0
  187. package/dist/refusals/read-plan.js +43 -0
  188. package/dist/refusals/read-plan.js.map +1 -0
  189. package/dist/refusals/render-factory.d.ts +5 -0
  190. package/dist/refusals/render-factory.d.ts.map +1 -0
  191. package/dist/refusals/render-factory.js +14 -0
  192. package/dist/refusals/render-factory.js.map +1 -0
  193. package/dist/refusals/replace-in-code.d.ts +16 -0
  194. package/dist/refusals/replace-in-code.d.ts.map +1 -0
  195. package/dist/refusals/replace-in-code.js +20 -0
  196. package/dist/refusals/replace-in-code.js.map +1 -0
  197. package/dist/refusals/rewrite-usages.d.ts +6 -0
  198. package/dist/refusals/rewrite-usages.d.ts.map +1 -0
  199. package/dist/refusals/rewrite-usages.js +80 -0
  200. package/dist/refusals/rewrite-usages.js.map +1 -0
  201. package/dist/refusals/spec-parts.d.ts +8 -0
  202. package/dist/refusals/spec-parts.d.ts.map +1 -0
  203. package/dist/refusals/spec-parts.js +14 -0
  204. package/dist/refusals/spec-parts.js.map +1 -0
  205. package/dist/run.d.ts.map +1 -1
  206. package/dist/run.js +7 -1
  207. package/dist/run.js.map +1 -1
  208. package/dist/stack/stack-vars.d.ts.map +1 -1
  209. package/dist/stack/stack-vars.js +2 -1
  210. package/dist/stack/stack-vars.js.map +1 -1
  211. package/dist/version.d.ts +1 -1
  212. package/dist/version.js +1 -1
  213. package/package.json +2 -2
  214. package/templates/aggregate/aggregate.ts.tpl +5 -0
  215. package/templates/command/handler.declared.ts.tpl +5 -0
  216. package/templates/command/handler.ts.tpl +5 -0
  217. package/templates/docs/openapi.json.tpl +5 -0
  218. package/templates/entity/entity.ts.tpl +5 -0
  219. package/templates/error/case.spec.ts.tpl +8 -0
  220. package/templates/error/concept-error.spec.ts.tpl +7 -0
  221. package/templates/error/concept-error.ts.tpl +5 -0
  222. package/templates/error/factory.ts.tpl +4 -0
  223. package/templates/init/jest.config.js.tpl +7 -0
  224. package/templates/init/rules/domain.md.tpl +11 -0
  225. package/templates/init/rules/presentation.md.tpl +5 -0
  226. package/templates/pipeline/package-scripts.json +1 -1
  227. package/templates/route/route.class-validator.ts.tpl +1 -1
  228. package/templates/route/route.none.ts.tpl +1 -1
  229. package/templates/route/route.search.ts.tpl +1 -1
  230. package/templates/route/route.standard-schema.ts.tpl +1 -1
  231. package/templates/route/route.zod.ts.tpl +1 -1
  232. package/templates/value-object/value-object.ts.tpl +5 -0
@@ -0,0 +1,39 @@
1
+ import { splitWords, toName } from '../naming/index.js';
2
+ import { factoryNameFor } from './factory-name-for.js';
3
+ /**
4
+ * A proposal: each class per error goes to the aggregate its name or its code starts or ends
5
+ * with, and to nothing when none does. Which concept a refusal is about is a decision of the
6
+ * model: the proposal is edited before it is applied.
7
+ */
8
+ export function proposePlan(errors, tree) {
9
+ const contexts = {};
10
+ for (const error of errors) {
11
+ const concept = conceptOf(error, aggregatesOf(tree, error.context));
12
+ (contexts[error.context] ??= []).push({
13
+ class: error.className,
14
+ file: error.file,
15
+ code: error.code,
16
+ concept,
17
+ factory: factoryNameFor(error.code, concept),
18
+ });
19
+ }
20
+ return { contexts };
21
+ }
22
+ function aggregatesOf({ ws, config }, context) {
23
+ return ws
24
+ .list(`${config.contextsDir}/${context}/domain/aggregates`)
25
+ .filter((name) => name.endsWith('.aggregate.ts'))
26
+ .map((name) => toName(name.replace(/\.aggregate\.ts$/, '')).pascal);
27
+ }
28
+ /** The longest aggregate name the words of the class start or end with. */
29
+ function conceptOf(error, aggregates) {
30
+ const words = splitWords(error.className.replace(/Error$/, '')).join(' ');
31
+ const named = aggregates
32
+ .filter((aggregate) => {
33
+ const subject = splitWords(aggregate).join(' ');
34
+ return words === subject || words.startsWith(`${subject} `) || words.endsWith(` ${subject}`);
35
+ })
36
+ .sort((a, b) => b.length - a.length);
37
+ return named[0] ?? '';
38
+ }
39
+ //# sourceMappingURL=propose-plan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"propose-plan.js","sourceRoot":"","sources":["../../src/refusals/propose-plan.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAExD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAUvD;;;;GAIG;AACH,MAAM,UAAU,WAAW,CAAC,MAA8B,EAAE,IAAU;IACpE,MAAM,QAAQ,GAAqC,EAAE,CAAC;IAEtD,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,MAAM,OAAO,GAAG,SAAS,CAAC,KAAK,EAAE,YAAY,CAAC,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;QAEpE,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC;YACpC,KAAK,EAAE,KAAK,CAAC,SAAS;YACtB,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,OAAO;YACP,OAAO,EAAE,cAAc,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC;SAC7C,CAAC,CAAC;IACL,CAAC;IAED,OAAO,EAAE,QAAQ,EAAE,CAAC;AACtB,CAAC;AAED,SAAS,YAAY,CAAC,EAAE,EAAE,EAAE,MAAM,EAAQ,EAAE,OAAe;IACzD,OAAO,EAAE;SACN,IAAI,CAAC,GAAG,MAAM,CAAC,WAAW,IAAI,OAAO,oBAAoB,CAAC;SAC1D,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC;SAChD,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;AACxE,CAAC;AAED,2EAA2E;AAC3E,SAAS,SAAS,CAAC,KAAkB,EAAE,UAA6B;IAClE,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAE1E,MAAM,KAAK,GAAG,UAAU;SACrB,MAAM,CAAC,CAAC,SAAS,EAAE,EAAE;QACpB,MAAM,OAAO,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAEhD,OAAO,KAAK,KAAK,OAAO,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,OAAO,GAAG,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,OAAO,EAAE,CAAC,CAAC;IAC/F,CAAC,CAAC;SACD,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC;IAEvC,OAAO,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;AACxB,CAAC"}
@@ -0,0 +1,9 @@
1
+ import type { LegacyError } from './legacy-error.js';
2
+ interface Origin {
3
+ readonly file: string;
4
+ readonly context: string;
5
+ }
6
+ /** Reads a class per error: its code, the parameters of its constructor and the message it gives to `super`. Undefined when the file holds none. */
7
+ export declare function readLegacyError(source: string, origin: Origin): LegacyError | undefined;
8
+ export {};
9
+ //# sourceMappingURL=read-legacy-error.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"read-legacy-error.d.ts","sourceRoot":"","sources":["../../src/refusals/read-legacy-error.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,WAAW,EAAmB,MAAM,mBAAmB,CAAC;AAQtE,UAAU,MAAM;IACd,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED,oJAAoJ;AACpJ,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS,CAcvF"}
@@ -0,0 +1,75 @@
1
+ import { errorCodes } from '../check/errors/error-codes.js';
2
+ import { scan } from '../check/scan/scan.js';
3
+ import { callArguments } from '../check/text/call-arguments.js';
4
+ import { matchingBracket } from '../check/text/matching-bracket.js';
5
+ import { splitTopLevel } from '../check/text/split-top-level.js';
6
+ const CLASS = /export\s+class\s+([A-Za-z_$][\w$]*)\s+extends\s+DomainError\b/;
7
+ const CONSTRUCTOR = /(?<![\w$.])constructor\s*\(/;
8
+ const SUPER = /(?<![\w$.])super\s*\(/;
9
+ const MODIFIERS = /^(?:(?:public|private|protected|readonly|override)\s+)*/;
10
+ const MEMBER = /^\s{2}(?!readonly code\b|constructor\b)[A-Za-z_$#]/m;
11
+ /** Reads a class per error: its code, the parameters of its constructor and the message it gives to `super`. Undefined when the file holds none. */
12
+ export function readLegacyError(source, origin) {
13
+ const scanned = scan(source);
14
+ const declared = CLASS.exec(scanned.code);
15
+ const [code] = errorCodes(scanned);
16
+ if (declared === null || code === undefined) {
17
+ return undefined;
18
+ }
19
+ const head = { ...origin, className: declared[1] ?? '', code: code.code };
20
+ const open = scanned.code.indexOf('{', declared.index);
21
+ const body = { text: source, scanned, open, close: matchingBracket(scanned.code, open) };
22
+ return { ...head, ...constructorOf(body), ...manualReason(body) };
23
+ }
24
+ /** A class without a constructor inherits the one of `DomainError`: the caller writes the message. */
25
+ function constructorOf({ text, scanned, open, close, }) {
26
+ const { code } = scanned;
27
+ const declared = CONSTRUCTOR.exec(code.slice(open, close));
28
+ if (declared === null) {
29
+ return { parameters: [{ name: 'message', type: 'string' }], properties: [], message: 'message' };
30
+ }
31
+ const list = open + declared.index + declared[0].length - 1;
32
+ const block = code.indexOf('{', matchingBracket(code, list));
33
+ const called = SUPER.exec(code.slice(block, matchingBracket(code, block)));
34
+ const given = called === null ? [] : callArguments(code, block + called.index + called[0].length - 1);
35
+ const [message] = given;
36
+ const written = splitTopLevel(code.slice(list + 1, matchingBracket(code, list))).map((part) => part.code);
37
+ return {
38
+ parameters: written.flatMap(parameterOf),
39
+ properties: written
40
+ .filter((part) => MODIFIERS.exec(part)?.[0] !== '')
41
+ .flatMap(parameterOf)
42
+ .map(({ name }) => name),
43
+ message: message === undefined ? "''" : text.slice(message.start, message.start + message.code.length),
44
+ };
45
+ }
46
+ function parameterOf(written) {
47
+ const bare = written.replace(MODIFIERS, '').trim();
48
+ const [, name, type] = /^([A-Za-z_$][\w$]*)\??\s*(?::\s*([^=]+))?/.exec(bare) ?? [];
49
+ return name === undefined ? [] : [{ name, type: type?.trim() ?? 'unknown' }];
50
+ }
51
+ function manualReason({ text, scanned, open, close }) {
52
+ const { code } = scanned;
53
+ const inside = code.slice(open + 1, close);
54
+ const called = SUPER.exec(inside);
55
+ const given = called === null ? [] : callArguments(code, open + 1 + called.index + called[0].length - 1);
56
+ if (given.length > 1) {
57
+ return { manual: 'its constructor gives options to super(..): write the factory by hand, with .causedBy(..)' };
58
+ }
59
+ if (/\bthis\./.test(inside)) {
60
+ return { manual: 'its constructor reads or writes `this`: write the factory by hand' };
61
+ }
62
+ // A member other than the code and the constructor: text is read so that a field holding a string counts.
63
+ return MEMBER.test(withoutConstructor(text.slice(open + 1, close)))
64
+ ? { manual: 'it has members of its own: write the factory by hand and decide where they go' }
65
+ : {};
66
+ }
67
+ function withoutConstructor(body) {
68
+ const at = body.search(CONSTRUCTOR);
69
+ if (at === -1) {
70
+ return body;
71
+ }
72
+ const block = body.indexOf('{', matchingBracket(body, body.indexOf('(', at)));
73
+ return body.slice(0, at) + body.slice(matchingBracket(body, block) + 1);
74
+ }
75
+ //# sourceMappingURL=read-legacy-error.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"read-legacy-error.js","sourceRoot":"","sources":["../../src/refusals/read-legacy-error.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { MigrationPlan } from './migration-plan.js';
2
+ /** The decisions of the plan file, each one checked: a concept, a factory name that says the code. */
3
+ export declare function readPlan(text: string | undefined): MigrationPlan;
4
+ //# sourceMappingURL=read-plan.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"read-plan.d.ts","sourceRoot":"","sources":["../../src/refusals/read-plan.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAMzD,sGAAsG;AACtG,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,aAAa,CAgBhE"}
@@ -0,0 +1,43 @@
1
+ import { isRecord } from '../check/support/is-record.js';
2
+ import { CliError } from '../cli-error.js';
3
+ import { refusalCode } from '../generate/errors/refusal-code.js';
4
+ import { refusalName } from '../generate/errors/refusal-name.js';
5
+ import { toName } from '../naming/index.js';
6
+ import { PLAN_FILE } from './plan-file.js';
7
+ const FIX = `Run \`ddd-ts-kit error-factories --plan\` to write ${PLAN_FILE} again, then give each entry its concept.`;
8
+ /** The decisions of the plan file, each one checked: a concept, a factory name that says the code. */
9
+ export function readPlan(text) {
10
+ const raw = text === undefined ? undefined : JSON.parse(text);
11
+ const contexts = isRecord(raw) && isRecord(raw['contexts']) ? raw['contexts'] : undefined;
12
+ if (contexts === undefined) {
13
+ throw new CliError(`${PLAN_FILE} holds no plan.`, FIX);
14
+ }
15
+ return {
16
+ contexts: Object.fromEntries(Object.entries(contexts).map(([context, entries]) => [
17
+ context,
18
+ (Array.isArray(entries) ? entries : []).map(entryOf),
19
+ ])),
20
+ };
21
+ }
22
+ function entryOf(raw) {
23
+ const text = (key) => (isRecord(raw) && typeof raw[key] === 'string' ? raw[key] : '');
24
+ const entry = {
25
+ class: text('class'),
26
+ file: text('file'),
27
+ code: text('code'),
28
+ concept: text('concept'),
29
+ factory: text('factory'),
30
+ };
31
+ if (entry.class === '' || entry.file === '' || entry.code === '') {
32
+ throw new CliError(`${PLAN_FILE} has an entry without its class, file or code.`, FIX);
33
+ }
34
+ if (entry.concept === '') {
35
+ throw new CliError(`${PLAN_FILE}: ${entry.class} has no concept.`, `Set "concept" to the term of the glossary this refusal is about (for example the aggregate it is refused on): ${entry.class} becomes a factory of <Concept>Error.`);
36
+ }
37
+ const concept = toName(entry.concept.replace(/Error$/, ''));
38
+ const refusal = refusalName(entry.factory);
39
+ // Refuses a name that does not say the code, with the names that would.
40
+ refusalCode({ concept, refusal }, entry.code);
41
+ return { ...entry, concept: concept.pascal, factory: refusal.camel };
42
+ }
43
+ //# sourceMappingURL=read-plan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"read-plan.js","sourceRoot":"","sources":["../../src/refusals/read-plan.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { LegacyError } from './legacy-error.js';
2
+ import type { Move } from './move.js';
3
+ /** The static factory that replaces the constructor of a class per error: same parameters, same message, its plain parameters as facts. */
4
+ export declare function renderFactory(error: LegacyError, move: Move): string;
5
+ //# sourceMappingURL=render-factory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render-factory.d.ts","sourceRoot":"","sources":["../../src/refusals/render-factory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAKtC,2IAA2I;AAC3I,wBAAgB,aAAa,CAAC,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,IAAI,GAAG,MAAM,CAUpE"}
@@ -0,0 +1,14 @@
1
+ /** A type a fact may have: plain data, as `RefusalFact` of the kernel says. */
2
+ const FACT_TYPE = /^(?:readonly\s+)?(?:string|number|boolean|Date)(?:\[\])?$/;
3
+ /** The static factory that replaces the constructor of a class per error: same parameters, same message, its plain parameters as facts. */
4
+ export function renderFactory(error, move) {
5
+ const parameters = error.parameters.map(({ name, type }) => `${name}: ${type}`).join(', ');
6
+ const facts = error.parameters.filter(({ type }) => FACT_TYPE.test(type)).map(({ name }) => name);
7
+ const given = facts.length === 0 ? '' : `, { ${facts.join(', ')} }`;
8
+ return [
9
+ ` static ${move.factory}(${parameters}) {`,
10
+ ` return ${move.conceptClass}.refusal('${move.code}', ${error.message}${given});`,
11
+ ' }',
12
+ ].join('\n');
13
+ }
14
+ //# sourceMappingURL=render-factory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render-factory.js","sourceRoot":"","sources":["../../src/refusals/render-factory.ts"],"names":[],"mappings":"AAGA,+EAA+E;AAC/E,MAAM,SAAS,GAAG,2DAA2D,CAAC;AAE9E,2IAA2I;AAC3I,MAAM,UAAU,aAAa,CAAC,KAAkB,EAAE,IAAU;IAC1D,MAAM,UAAU,GAAG,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,GAAG,IAAI,KAAK,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC3F,MAAM,KAAK,GAAG,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC;IAClG,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;IAEpE,OAAO;QACL,YAAY,IAAI,CAAC,OAAO,IAAI,UAAU,KAAK;QAC3C,cAAc,IAAI,CAAC,YAAY,aAAa,IAAI,CAAC,IAAI,MAAM,KAAK,CAAC,OAAO,GAAG,KAAK,IAAI;QACpF,KAAK;KACN,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC"}
@@ -0,0 +1,16 @@
1
+ import { type Scan } from '../check/scan/scan.js';
2
+ export interface CodeMatch {
3
+ readonly match: RegExpExecArray;
4
+ readonly scanned: Scan;
5
+ /** The source between two offsets: what a group matched in the code, with its strings. */
6
+ slice(start: number, end: number): string;
7
+ }
8
+ /**
9
+ * Replaces what `pattern` matches in the code of a source, comments and the contents of strings
10
+ * left alone. A replacement answers the text and where it ends, or undefined to keep the match.
11
+ */
12
+ export declare function replaceInCode(source: string, pattern: RegExp, replace: (found: CodeMatch) => {
13
+ text: string;
14
+ end?: number;
15
+ } | undefined): string;
16
+ //# sourceMappingURL=replace-in-code.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"replace-in-code.d.ts","sourceRoot":"","sources":["../../src/refusals/replace-in-code.ts"],"names":[],"mappings":"AAAA,OAAO,EAAQ,KAAK,IAAI,EAAE,MAAM,uBAAuB,CAAC;AAExD,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,KAAK,EAAE,eAAe,CAAC;IAChC,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC;IACvB,0FAA0F;IAC1F,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC;CAC3C;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAC3B,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,GACxE,MAAM,CAgBR"}
@@ -0,0 +1,20 @@
1
+ import { scan } from '../check/scan/scan.js';
2
+ /**
3
+ * Replaces what `pattern` matches in the code of a source, comments and the contents of strings
4
+ * left alone. A replacement answers the text and where it ends, or undefined to keep the match.
5
+ */
6
+ export function replaceInCode(source, pattern, replace) {
7
+ const scanned = scan(source);
8
+ const slice = (start, end) => source.slice(start, end);
9
+ let result = '';
10
+ let cursor = 0;
11
+ for (const match of scanned.code.matchAll(pattern)) {
12
+ const replaced = match.index < cursor ? undefined : replace({ match, scanned, slice });
13
+ if (replaced !== undefined) {
14
+ result += source.slice(cursor, match.index) + replaced.text;
15
+ cursor = replaced.end ?? match.index + match[0].length;
16
+ }
17
+ }
18
+ return result + source.slice(cursor);
19
+ }
20
+ //# sourceMappingURL=replace-in-code.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"replace-in-code.js","sourceRoot":"","sources":["../../src/refusals/replace-in-code.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAa,MAAM,uBAAuB,CAAC;AASxD;;;GAGG;AACH,MAAM,UAAU,aAAa,CAC3B,MAAc,EACd,OAAe,EACf,OAAyE;IAEzE,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC;IAC7B,MAAM,KAAK,GAAG,CAAC,KAAa,EAAE,GAAW,EAAU,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAC/E,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,IAAI,MAAM,GAAG,CAAC,CAAC;IAEf,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QACnD,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;QAEvF,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YAC3B,MAAM,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC;YAC5D,MAAM,GAAG,QAAQ,CAAC,GAAG,IAAI,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;QACzD,CAAC;IACH,CAAC;IAED,OAAO,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;AACvC,CAAC"}
@@ -0,0 +1,6 @@
1
+ import type { Move } from './move.js';
2
+ /** Told when a class per error stood as a value where nothing above knew what to write: the concept class stands there now. */
3
+ export type OnValue = (className: string, conceptClass: string) => void;
4
+ /** A file where no class per error is named any more: constructions, assertions, imports and types follow the moves. */
5
+ export declare function rewriteUsages(source: string, moves: readonly Move[], onValue?: OnValue): string;
6
+ //# sourceMappingURL=rewrite-usages.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rewrite-usages.d.ts","sourceRoot":"","sources":["../../src/refusals/rewrite-usages.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAOtC,+HAA+H;AAC/H,MAAM,MAAM,OAAO,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,KAAK,IAAI,CAAC;AAExE,wHAAwH;AACxH,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,IAAI,EAAE,EAAE,OAAO,GAAE,OAAyB,GAAG,MAAM,CAWhH"}
@@ -0,0 +1,80 @@
1
+ import { escapeRegExp } from '../check/text/escape-reg-exp.js';
2
+ import { replaceInCode } from './replace-in-code.js';
3
+ const NOT_IN_A_NAME = '(?<![\\w$.])';
4
+ /** A file where no class per error is named any more: constructions, assertions, imports and types follow the moves. */
5
+ export function rewriteUsages(source, moves, onValue = () => undefined) {
6
+ const named = moves.filter((move) => source.includes(move.className));
7
+ const rewritten = named.reduce((text, move) => {
8
+ const name = escapeRegExp(move.className);
9
+ const known = PASSES.reduce((current, pass) => pass(current, move, name), text);
10
+ return renamed(known, move, onValue);
11
+ }, source);
12
+ return named.length === 0 ? source : tidyImports(rewritten, new Set(named.map((move) => move.conceptClass)));
13
+ }
14
+ const PASSES = [
15
+ (source, move, name) => replaceInCode(source, new RegExp(`${NOT_IN_A_NAME}new\\s+${name}\\s*\\(`, 'g'), () => ({
16
+ text: `${move.conceptClass}.${move.factory}(`,
17
+ })),
18
+ (source, move, name) => replaceInCode(source, new RegExp(`\\.thenError\\(\\s*${name}\\s*(?:,[^()]*)?\\)`, 'g'), () => ({
19
+ text: `.thenError('${move.code}')`,
20
+ })),
21
+ (source, move, name) => replaceInCode(source, new RegExp(`\\.toThrow(?:Error)?\\(\\s*${name}\\s*,?\\s*\\)`, 'g'), () => ({
22
+ text: `.toThrow(expect.objectContaining({ code: '${move.code}' }))`,
23
+ })),
24
+ (source, move, name) => replaceInCode(source, new RegExp(`(?<![\\w$])expect\\.any\\(\\s*${name}\\s*,?\\s*\\)`, 'g'), () => ({
25
+ text: `expect.objectContaining({ code: '${move.code}' })`,
26
+ })),
27
+ (source, move, name) => replaceInCode(source, new RegExp(`\\.toBeInstanceOf\\(\\s*${name}\\s*,?\\s*\\)`, 'g'), () => ({
28
+ text: `.toMatchObject({ code: '${move.code}' })`,
29
+ })),
30
+ (source, move, name) => replaceInCode(source, new RegExp(`([A-Za-z_$][\\w$.]*)\\s+instanceof\\s+${name}(?![\\w$])`, 'g'), ({ match }) => ({
31
+ text: `${move.conceptClass}.is(${match[1] ?? ''}, '${move.code}')`,
32
+ })),
33
+ (source, move, name) => replaceInCode(source, new RegExp(`import\\s+(type\\s+)?\\{\\s*${name}\\s*\\}\\s*from\\s*`, 'g'), (found) => importOf(found, move)),
34
+ ];
35
+ /** What is left names a type, and takes the name of the concept class; a value left there asserts less than it did, and is told. */
36
+ function renamed(source, move, onValue) {
37
+ const pattern = new RegExp(`${NOT_IN_A_NAME}${escapeRegExp(move.className)}(?![\\w$])`, 'g');
38
+ return replaceInCode(source, pattern, ({ match, scanned }) => {
39
+ const before = scanned.code.slice(0, match.index).trimEnd().at(-1) ?? '';
40
+ const after = scanned.code
41
+ .slice(match.index + match[0].length)
42
+ .trimStart()
43
+ .charAt(0);
44
+ if (!':<|&'.includes(before) && !(before === ',' && '>|&'.includes(after))) {
45
+ onValue(move.className, move.conceptClass);
46
+ }
47
+ return { text: move.conceptClass };
48
+ });
49
+ }
50
+ /** The import of the class becomes the import of its concept class, from the file next to it. */
51
+ function importOf({ match, scanned }, move) {
52
+ const start = match.index + match[0].length;
53
+ const specifier = scanned.strings.find((literal) => literal.start === start);
54
+ if (specifier === undefined) {
55
+ return undefined;
56
+ }
57
+ const target = specifier.value.replace(/[^/]+?\.error((?:\.js)?)$/, `${move.conceptFile}$1`);
58
+ const end = scanned.code.charAt(specifier.end) === ';' ? specifier.end + 1 : specifier.end;
59
+ return { text: `import ${match[1] ?? ''}{ ${move.conceptClass} } from '${target}';`, end };
60
+ }
61
+ /** Several classes moved to one: its import is written once, a union names it once, and an import nothing reads goes. */
62
+ function tidyImports(source, concepts) {
63
+ let text = source;
64
+ for (const concept of concepts) {
65
+ const name = escapeRegExp(concept);
66
+ const imported = new RegExp(`^import (type )?\\{ ${name} \\} from '[^']+';\\n`, 'gm');
67
+ const lines = [...text.matchAll(imported)];
68
+ const kept = lines.find((line) => line[1] === undefined) ?? lines[0];
69
+ const used = text.replace(imported, '').match(new RegExp(`${NOT_IN_A_NAME}${name}(?![\\w$])`, 'g')) !== null;
70
+ let written = false;
71
+ text = text.replace(imported, (line) => {
72
+ const keep = used && !written && line === kept?.[0];
73
+ written ||= keep;
74
+ return keep ? line : '';
75
+ });
76
+ text = text.replace(new RegExp(`\\b${name}(?:\\s*\\|\\s*${name}\\b)+`, 'g'), concept);
77
+ }
78
+ return text;
79
+ }
80
+ //# sourceMappingURL=rewrite-usages.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rewrite-usages.js","sourceRoot":"","sources":["../../src/refusals/rewrite-usages.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /** The spec of a class per error, cut in two: its imports, and the cases of its first `describe`. */
2
+ export interface SpecParts {
3
+ readonly imports: readonly string[];
4
+ /** The body of the `describe`, as written; undefined when the spec has none. */
5
+ readonly cases: string | undefined;
6
+ }
7
+ export declare function specParts(source: string): SpecParts;
8
+ //# sourceMappingURL=spec-parts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spec-parts.d.ts","sourceRoot":"","sources":["../../src/refusals/spec-parts.ts"],"names":[],"mappings":"AAMA,qGAAqG;AACrG,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,gFAAgF;IAChF,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;CACpC;AAED,wBAAgB,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CASnD"}
@@ -0,0 +1,14 @@
1
+ import { scan } from '../check/scan/scan.js';
2
+ import { matchingBracket } from '../check/text/matching-bracket.js';
3
+ const DESCRIBE = /(?<![\w$.])describe\s*\(/;
4
+ const IMPORT = /^import [^;]+;\n/gm;
5
+ export function specParts(source) {
6
+ const { code } = scan(source);
7
+ const described = DESCRIBE.exec(code);
8
+ const open = described === null ? -1 : code.indexOf('{', described.index);
9
+ return {
10
+ imports: source.match(IMPORT) ?? [],
11
+ cases: open === -1 ? undefined : source.slice(open + 1, matchingBracket(code, open)).replace(/^\n+|\s+$/g, ''),
12
+ };
13
+ }
14
+ //# sourceMappingURL=spec-parts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spec-parts.js","sourceRoot":"","sources":["../../src/refusals/spec-parts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,uBAAuB,CAAC;AAC7C,OAAO,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AAEpE,MAAM,QAAQ,GAAG,0BAA0B,CAAC;AAC5C,MAAM,MAAM,GAAG,oBAAoB,CAAC;AASpC,MAAM,UAAU,SAAS,CAAC,MAAc;IACtC,MAAM,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC;IAC9B,MAAM,SAAS,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtC,MAAM,IAAI,GAAG,SAAS,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,SAAS,CAAC,KAAK,CAAC,CAAC;IAE1E,OAAO;QACL,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE;QACnC,KAAK,EAAE,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,EAAE,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC;KAC/G,CAAC;AACJ,CAAC"}
package/dist/run.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../src/run.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAC;AA4F3C,wBAAgB,GAAG,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,EAAE,EAAE,GAAE,EAAc,GAAG,MAAM,CAkCvE"}
1
+ {"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../src/run.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAC;AAkG3C,wBAAgB,GAAG,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,EAAE,EAAE,GAAE,EAAc,GAAG,MAAM,CAkCvE"}
package/dist/run.js CHANGED
@@ -5,6 +5,7 @@ import { checksCommand } from './commands/checks.js';
5
5
  import { depcruiseConfigCommand } from './commands/depcruise-config.js';
6
6
  import { describeCommand } from './commands/describe.js';
7
7
  import { docsCommand } from './commands/docs.js';
8
+ import { errorFactoriesCommand } from './commands/error-factories.js';
8
9
  import { generateCommand } from './commands/generate.js';
9
10
  import { initCommand } from './commands/init.js';
10
11
  import { listCommand } from './commands/list.js';
@@ -28,6 +29,7 @@ const COMMANDS = {
28
29
  docs: docsCommand,
29
30
  'depcruise-config': depcruiseConfigCommand,
30
31
  'build-aliases': buildAliasesCommand,
32
+ 'error-factories': errorFactoriesCommand,
31
33
  check: checksCommand,
32
34
  'check-file': checkFileCommand,
33
35
  rules: rulesCommand,
@@ -41,7 +43,7 @@ const USAGE = `Usage
41
43
  [--ci github|gitlab|both|none] [--authn jwt|keycloak|none] [--authz rbac|abac|rebac|custom]
42
44
  [--broker none|rabbitmq|kafka|nats|redis|custom] [--cache none|redis] [--audit on|off]
43
45
  [--errors none|sentry] [--logger stdout|pino|winston] [--style declared|explicit] [--assembly barrel|discovery]
44
- [--dependencies signature|listed]
46
+ [--dependencies signature|listed] [--refusals factories|classes]
45
47
  [--package-manager npm|pnpm] [--allow-no-outbox "<reason>"] [--import-alias '$<name>/']
46
48
  [--import-extension none|js]
47
49
  [--context <name>:<core|supporting|generic>]... [--dry-run] [--force]
@@ -55,6 +57,7 @@ const USAGE = `Usage
55
57
  ddd-ts-kit docs [--check]
56
58
  ddd-ts-kit depcruise-config [--check|--write]
57
59
  ddd-ts-kit build-aliases [--project <tsconfig>]
60
+ ddd-ts-kit error-factories --plan | --apply [--dry-run]
58
61
  ddd-ts-kit affected [--base <git-ref>] [--head <git-ref>] [--format text|json|github|env]
59
62
  ddd-ts-kit check [paths...] [--rule <id>]... [--format text|json|github|gitlab] [--changed-since <git-ref>] [--self]
60
63
  ddd-ts-kit check --clean-only <dir>... [--rule <id>]... [--format text|json|github]
@@ -69,6 +72,9 @@ const NOTES = ` affected what a pull request has to run: the contexts a
69
72
  runner and the linter; everything when a shared path changed or without --base
70
73
  build-aliases after the compiler: rewrites the import aliases left in the emitted .js and .d.ts files
71
74
  into relative paths, so that plain node runs the output (tsconfig.build.json by default)
75
+ error-factories moves a project from one class per error to static factories on one error class per
76
+ concept: --plan writes error-factories.plan.json, where each class is given its concept;
77
+ --apply follows it (classes, specs, every usage, "stack.refusals" in the config)
72
78
  describe one context as facts: use cases, routes, events, ports, policies, gateways, dependencies
73
79
  status the next step of docs/architecture/plan.md, the slices of docs/architecture/slices.md by
74
80
  status and by owner, and the TODO(domain), TODO(platform) and it.todo left in each context
package/dist/run.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"run.js","sourceRoot":"","sources":["../src/run.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACrF,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AACxE,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AACrD,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC,MAAM,QAAQ,GAAsC;IAClD,QAAQ,EAAE,eAAe;IACzB,IAAI,EAAE,WAAW;IACjB,QAAQ,EAAE,eAAe;IACzB,CAAC,EAAE,eAAe;IAClB,IAAI,EAAE,WAAW;IACjB,QAAQ,EAAE,eAAe;IACzB,MAAM,EAAE,aAAa;IACrB,IAAI,EAAE,WAAW;IACjB,cAAc,EAAE,kBAAkB;IAClC,IAAI,EAAE,WAAW;IACjB,kBAAkB,EAAE,sBAAsB;IAC1C,eAAe,EAAE,mBAAmB;IACpC,KAAK,EAAE,aAAa;IACpB,YAAY,EAAE,gBAAgB;IAC9B,KAAK,EAAE,YAAY;IACnB,OAAO,EAAE,cAAc;CACxB,CAAC;AAEF,MAAM,KAAK,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;uFA8ByE,CAAC;AAExF,MAAM,KAAK,GAAG;;;;;;;;;;;;;;;gEAekD,CAAC;AAEjE,MAAM,SAAS,GAAO;IACpB,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,IAAI,CAAC;IACrD,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,IAAI,CAAC;CACtD,CAAC;AAEF,MAAM,UAAU,GAAG,CAAC,IAAuB,EAAE,EAAE,GAAO,SAAS;IAC7D,MAAM,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;IAEhC,IAAI,CAAC;QACH,IAAI,OAAO,KAAK,WAAW,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;YAChD,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YAEhB,OAAO,CAAC,CAAC;QACX,CAAC;QAED,IACE,OAAO,KAAK,SAAS;YACrB,OAAO,KAAK,MAAM;YAClB,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,KAAK,QAAQ,IAAI,QAAQ,KAAK,IAAI,CAAC,EACjF,CAAC;YACD,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;YAEtB,OAAO,CAAC,CAAC;QACX,CAAC;QAED,OAAO,YAAY,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IACzC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,CAAC,CAAC,KAAK,YAAY,QAAQ,CAAC,EAAE,CAAC;YACjC,MAAM,KAAK,CAAC;QACd,CAAC;QAED,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC5B,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QACzF,CAAC;aAAM,CAAC;YACN,EAAE,CAAC,GAAG,CAAC,UAAU,KAAK,CAAC,OAAO,YAAY,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC;QACzD,CAAC;QAED,OAAO,KAAK,CAAC,QAAQ,CAAC;IACxB,CAAC;AACH,CAAC;AAED,SAAS,YAAY,CAAC,IAAY;IAChC,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;IAE/B,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QAC1B,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,MAAM,IAAI,QAAQ,CAAC,oBAAoB,IAAI,IAAI,EAAE,eAAe,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACvG,CAAC;AAED,4GAA4G;AAC5G,SAAS,OAAO,CAAC,IAAuB;IACtC,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,UAAU,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAErF,OAAO,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,SAAS,CAAC,KAAK,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;AAC/E,CAAC;AAED,SAAS,IAAI;IACX,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CACrB,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,cAAc,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CACtG,CAAC;IAEF,OAAO,cAAc,OAAO;;EAE5B,KAAK;;EAEL,KAAK;;;EAGL,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;AACrB,CAAC"}
1
+ {"version":3,"file":"run.js","sourceRoot":"","sources":["../src/run.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"stack-vars.d.ts","sourceRoot":"","sources":["../../src/stack/stack-vars.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAa5D,6GAA6G;AAC7G,wBAAgB,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,aAAa,CA2BvD"}
1
+ {"version":3,"file":"stack-vars.d.ts","sourceRoot":"","sources":["../../src/stack/stack-vars.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAa5D,6GAA6G;AAC7G,wBAAgB,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,aAAa,CA4BvD"}
@@ -11,7 +11,7 @@ import { redisVars } from './redis-vars.js';
11
11
  import { usesLegacyDecorators } from './uses-legacy-decorators.js';
12
12
  /** The choices of the stack as template variables: what every template of `init` and of `generate` reads. */
13
13
  export function stackVars(config) {
14
- const { validation, di, tests, orm, authz, style, logger } = config.stack;
14
+ const { validation, di, tests, orm, authz, style, logger, refusals } = config.stack;
15
15
  const legacy = usesLegacyDecorators(config);
16
16
  return {
17
17
  style: one(style, ['declared', 'explicit']),
@@ -29,6 +29,7 @@ export function stackVars(config) {
29
29
  redis: redisVars(config),
30
30
  audit: auditVars(config),
31
31
  errors: errorVars(config),
32
+ refusals: one(refusals, ['factories', 'classes']),
32
33
  logger: one(logger, ['stdout', 'pino', 'winston']),
33
34
  tests: { ...one(tests, ['vitest', 'jest']), module: tests === 'jest' ? '@jest/globals' : 'vitest' },
34
35
  worker: { on: config.worker, off: !config.worker },
@@ -1 +1 @@
1
- {"version":3,"file":"stack-vars.js","sourceRoot":"","sources":["../../src/stack/stack-vars.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"stack-vars.js","sourceRoot":"","sources":["../../src/stack/stack-vars.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAC/B,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AAEnE,6GAA6G;AAC7G,MAAM,UAAU,SAAS,CAAC,MAAc;IACtC,MAAM,EAAE,UAAU,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC;IACpF,MAAM,MAAM,GAAG,oBAAoB,CAAC,MAAM,CAAC,CAAC;IAE5C,OAAO;QACL,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;QAC3C,QAAQ,EAAE,YAAY,CAAC,MAAM,CAAC;QAC9B,UAAU,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,MAAM,EAAE;QACzC,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC;QACtB,UAAU,EAAE,GAAG,CAAC,UAAU,EAAE,CAAC,KAAK,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,CAAC,CAAC;QAClF,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;QAC3C,GAAG,EAAE,EAAE,GAAG,GAAG,CAAC,GAAG,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,KAAK,MAAM,EAAE;QACrG,MAAM,EAAE,SAAS,CAAC,MAAM,CAAC;QACzB,KAAK,EAAE,kBAAkB,CAAC,MAAM,CAAC;QACjC,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;QACtD,MAAM,EAAE,UAAU,CAAC,MAAM,CAAC;QAC1B,KAAK,EAAE,SAAS,CAAC,MAAM,CAAC;QACxB,KAAK,EAAE,SAAS,CAAC,MAAM,CAAC;QACxB,KAAK,EAAE,SAAS,CAAC,MAAM,CAAC;QACxB,MAAM,EAAE,SAAS,CAAC,MAAM,CAAC;QACzB,QAAQ,EAAE,GAAG,CAAC,QAAQ,EAAE,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;QACjD,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;QAClD,KAAK,EAAE,EAAE,GAAG,GAAG,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,QAAQ,EAAE;QACnG,MAAM,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,MAAM,EAAE;QAClD,MAAM,EAAE,aAAa,CAAC,MAAM,CAAC;QAC7B,KAAK,EAAE,SAAS,CAAC,MAAM,CAAC;QACxB,WAAW,EAAE,eAAe,CAAC,MAAM,CAAC;KACrC,CAAC;AACJ,CAAC;AAED,SAAS,YAAY,CAAC,MAAc;IAClC,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC;IAEzC,OAAO;QACL,MAAM,EAAE,KAAK,KAAK,UAAU,IAAI,QAAQ,KAAK,QAAQ;QACrD,SAAS,EAAE,KAAK,KAAK,UAAU,IAAI,QAAQ,KAAK,WAAW;KAC5D,CAAC;AACJ,CAAC;AAED,SAAS,QAAQ,CAAC,MAAc;IAC9B,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC;IAE9B,OAAO;QACL,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;QACpD,GAAG,EAAE,IAAI,KAAK,MAAM;QACpB,KAAK,EAAE,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,SAAS;KAChD,CAAC;AACJ,CAAC;AAED,SAAS,aAAa,CAAC,MAAc;IACnC,OAAO;QACL,UAAU,EAAE,MAAM,CAAC,UAAU;QAC7B,WAAW,EAAE,MAAM,CAAC,WAAW;QAC/B,eAAe,EAAE,MAAM,CAAC,eAAe;QACvC,WAAW,EAAE,MAAM,CAAC,WAAW;QAC/B,WAAW,EAAE,MAAM,CAAC,WAAW;KAChC,CAAC;AACJ,CAAC"}
package/dist/version.d.ts CHANGED
@@ -1,2 +1,2 @@
1
- export declare const VERSION = "0.2.0";
1
+ export declare const VERSION = "0.3.0";
2
2
  //# sourceMappingURL=version.d.ts.map
package/dist/version.js CHANGED
@@ -1,2 +1,2 @@
1
- export const VERSION = '0.2.0';
1
+ export const VERSION = '0.3.0';
2
2
  //# sourceMappingURL=version.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ddd-ts-kit",
3
- "version": "0.2.0",
3
+ "version": "0.3.0",
4
4
  "description": "Bootstrap, scaffold and verify DDD and Clean Architecture TypeScript projects.",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -29,6 +29,6 @@
29
29
  "clean:packages": "node dist/bin.js check --clean-only ../kernel/src ../validation/src ../http/src ../tracing/src ../di/src ../events/src ../testing/src ../drizzle/src ../knex/src ../prisma/src ../typeorm/src ../aspects/src ../rabbitmq/src ../auth/src ../audit/src ../redis/src ../scheduling/src ../pino/src ../winston/src ../sentry/src ../kafka/src ../nats/src ../eslint-plugin/src"
30
30
  },
31
31
  "devDependencies": {
32
- "@ddd-ts-kit/kernel": "^0.2.0"
32
+ "@ddd-ts-kit/kernel": "^0.3.0"
33
33
  }
34
34
  }
@@ -14,7 +14,12 @@ export class {{name.pascal}} extends AggregateRoot<string> {
14
14
  }
15
15
 
16
16
  static create(id: string, now: Date): {{name.pascal}} {
17
+ {{#if refusals.factories}}
18
+ // TODO(domain): take the facts known at birth as parameters, check each birth invariant and throw the refusal of its error class when one is violated: `throw {{name.pascal}}Error.<refusal>(...)`, added with `ddd-ts-kit generate error {{context.kebab}} {{name.pascal}} <refusal>`.
19
+ {{/if}}
20
+ {{#if refusals.classes}}
17
21
  // TODO(domain): take the facts known at birth as parameters, check each birth invariant and throw a DomainError of ../errors when one is violated.
22
+ {{/if}}
18
23
  const created = new {{name.pascal}}(id, { registeredAt: now });
19
24
 
20
25
  // TODO(domain): record the birth fact with `created.record(new {{name.pascal}}Created(id, now))` after `ddd-ts-kit generate domain-event {{context.kebab}} {{name.pascal}} Created`.
@@ -14,7 +14,12 @@ export class {{name.pascal}}Handler implements CommandHandler<{{name.pascal}}Com
14
14
  ) {}
15
15
 
16
16
  async execute(command: {{name.pascal}}Command): Promise<string> {
17
+ {{#if refusals.factories}}
18
+ // TODO(domain): decide what "{{name.words}}" does to a {{aggregate.pascal}}: either it gives birth to one (keep `create`, pass the facts of `command` as value objects), or it changes an existing one (load it with `findById`, throw its not-found refusal, `{{aggregate.pascal}}Error.notFound(id)` (`ddd-ts-kit generate error {{context.kebab}} {{aggregate.pascal}} notFound`), call ONE intention method). The events it records leave with the save: nothing else to do here.
19
+ {{/if}}
20
+ {{#if refusals.classes}}
17
21
  // TODO(domain): decide what "{{name.words}}" does to a {{aggregate.pascal}}: either it gives birth to one (keep `create`, pass the facts of `command` as value objects), or it changes an existing one (load it with `findById`, throw a not-found DomainError, call ONE intention method). The events it records leave with the save: nothing else to do here.
22
+ {{/if}}
18
23
  const target = {{aggregate.pascal}}.create(this.ids.next(), this.clock.now());
19
24
 
20
25
  await this.{{aggregate.camel}}Repository.save(target);
@@ -12,7 +12,12 @@ export class {{name.pascal}}Handler implements CommandHandler<{{name.pascal}}Com
12
12
  ) {}
13
13
 
14
14
  async execute(command: {{name.pascal}}Command): Promise<string> {
15
+ {{#if refusals.factories}}
16
+ // TODO(domain): decide what "{{name.words}}" does to a {{aggregate.pascal}}: either it gives birth to one (keep `create`, pass the facts of `command` as value objects), or it changes an existing one (load it with `findById`, throw its not-found refusal, `{{aggregate.pascal}}Error.notFound(id)` (`ddd-ts-kit generate error {{context.kebab}} {{aggregate.pascal}} notFound`), call ONE intention method). The events it records leave with the save: nothing else to do here.
17
+ {{/if}}
18
+ {{#if refusals.classes}}
15
19
  // TODO(domain): decide what "{{name.words}}" does to a {{aggregate.pascal}}: either it gives birth to one (keep `create`, pass the facts of `command` as value objects), or it changes an existing one (load it with `findById`, throw a not-found DomainError, call ONE intention method). The events it records leave with the save: nothing else to do here.
20
+ {{/if}}
16
21
  const target = {{aggregate.pascal}}.create(this.ids.next(), this.clock.now());
17
22
 
18
23
  await this.{{aggregate.camel}}Repository.save(target);