ddd-ts-kit 0.17.0 → 0.19.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 (234) hide show
  1. package/CHANGELOG.md +1273 -0
  2. package/README.fr.md +11 -12
  3. package/README.md +10 -10
  4. package/dist/affected/reach-of.js +1 -1
  5. package/dist/affected/reach-of.js.map +1 -1
  6. package/dist/check/catalogue/architecture-rules.d.ts.map +1 -1
  7. package/dist/check/catalogue/architecture-rules.js +4 -0
  8. package/dist/check/catalogue/architecture-rules.js.map +1 -1
  9. package/dist/check/declarations/declared-event-handlers.d.ts +4 -9
  10. package/dist/check/declarations/declared-event-handlers.d.ts.map +1 -1
  11. package/dist/check/declarations/declared-event-handlers.js +5 -5
  12. package/dist/check/declarations/declared-event-handlers.js.map +1 -1
  13. package/dist/check/declarations/option-of.d.ts +0 -2
  14. package/dist/check/declarations/option-of.d.ts.map +1 -1
  15. package/dist/check/declarations/option-of.js +1 -7
  16. package/dist/check/declarations/option-of.js.map +1 -1
  17. package/dist/check/explain/authz-docs.d.ts.map +1 -1
  18. package/dist/check/explain/authz-docs.js +14 -1
  19. package/dist/check/explain/authz-docs.js.map +1 -1
  20. package/dist/check/explain/events-docs.d.ts.map +1 -1
  21. package/dist/check/explain/events-docs.js +44 -13
  22. package/dist/check/explain/events-docs.js.map +1 -1
  23. package/dist/check/explain/ports-docs.d.ts.map +1 -1
  24. package/dist/check/explain/ports-docs.js +11 -9
  25. package/dist/check/explain/ports-docs.js.map +1 -1
  26. package/dist/check/explain/scheduling-docs.d.ts.map +1 -1
  27. package/dist/check/explain/scheduling-docs.js +10 -5
  28. package/dist/check/explain/scheduling-docs.js.map +1 -1
  29. package/dist/check/explain/wiring-docs.js +4 -4
  30. package/dist/check/explain/wiring-docs.js.map +1 -1
  31. package/dist/check/fixtures/authz-policy-fixtures.d.ts +3 -0
  32. package/dist/check/fixtures/authz-policy-fixtures.d.ts.map +1 -0
  33. package/dist/check/fixtures/authz-policy-fixtures.js +97 -0
  34. package/dist/check/fixtures/authz-policy-fixtures.js.map +1 -0
  35. package/dist/check/fixtures/declarations-fixtures.d.ts.map +1 -1
  36. package/dist/check/fixtures/declarations-fixtures.js +2 -42
  37. package/dist/check/fixtures/declarations-fixtures.js.map +1 -1
  38. package/dist/check/fixtures/declared.d.ts.map +1 -1
  39. package/dist/check/fixtures/declared.js +3 -3
  40. package/dist/check/fixtures/declared.js.map +1 -1
  41. package/dist/check/fixtures/domain-events-fixtures.js +1 -1
  42. package/dist/check/fixtures/domain-events-fixtures.js.map +1 -1
  43. package/dist/check/fixtures/event-sourcing-fixtures.js +3 -3
  44. package/dist/check/fixtures/event-sourcing-fixtures.js.map +1 -1
  45. package/dist/check/fixtures/events-fixtures.d.ts.map +1 -1
  46. package/dist/check/fixtures/events-fixtures.js +30 -1
  47. package/dist/check/fixtures/events-fixtures.js.map +1 -1
  48. package/dist/check/fixtures/fixtures.d.ts.map +1 -1
  49. package/dist/check/fixtures/fixtures.js +2 -0
  50. package/dist/check/fixtures/fixtures.js.map +1 -1
  51. package/dist/check/fixtures/language-fixtures.d.ts.map +1 -1
  52. package/dist/check/fixtures/language-fixtures.js +1 -1
  53. package/dist/check/fixtures/language-fixtures.js.map +1 -1
  54. package/dist/check/rules/authz-policy-asked.d.ts +3 -0
  55. package/dist/check/rules/authz-policy-asked.d.ts.map +1 -0
  56. package/dist/check/rules/authz-policy-asked.js +184 -0
  57. package/dist/check/rules/authz-policy-asked.js.map +1 -0
  58. package/dist/check/rules/declarations-role-declared.d.ts.map +1 -1
  59. package/dist/check/rules/declarations-role-declared.js +4 -35
  60. package/dist/check/rules/declarations-role-declared.js.map +1 -1
  61. package/dist/check/rules/events-consumer-idempotent.js +3 -3
  62. package/dist/check/rules/events-consumer-idempotent.js.map +1 -1
  63. package/dist/check/rules/events-name-declared-once.d.ts +3 -0
  64. package/dist/check/rules/events-name-declared-once.d.ts.map +1 -0
  65. package/dist/check/rules/events-name-declared-once.js +51 -0
  66. package/dist/check/rules/events-name-declared-once.js.map +1 -0
  67. package/dist/generate/emit.d.ts.map +1 -1
  68. package/dist/generate/emit.js +2 -14
  69. package/dist/generate/emit.js.map +1 -1
  70. package/dist/generate/kinds/ask-policy-in-generated-use-case.d.ts +9 -0
  71. package/dist/generate/kinds/ask-policy-in-generated-use-case.d.ts.map +1 -0
  72. package/dist/generate/kinds/ask-policy-in-generated-use-case.js +102 -0
  73. package/dist/generate/kinds/ask-policy-in-generated-use-case.js.map +1 -0
  74. package/dist/generate/kinds/assert-declares-its-name.d.ts +9 -0
  75. package/dist/generate/kinds/assert-declares-its-name.d.ts.map +1 -0
  76. package/dist/generate/kinds/assert-declares-its-name.js +16 -0
  77. package/dist/generate/kinds/assert-declares-its-name.js.map +1 -0
  78. package/dist/generate/kinds/command-context.d.ts +12 -0
  79. package/dist/generate/kinds/command-context.d.ts.map +1 -0
  80. package/dist/generate/kinds/command-context.js +18 -0
  81. package/dist/generate/kinds/command-context.js.map +1 -0
  82. package/dist/generate/kinds/command-kind.d.ts.map +1 -1
  83. package/dist/generate/kinds/command-kind.js +7 -24
  84. package/dist/generate/kinds/command-kind.js.map +1 -1
  85. package/dist/generate/kinds/command-outputs.d.ts +6 -0
  86. package/dist/generate/kinds/command-outputs.d.ts.map +1 -0
  87. package/dist/generate/kinds/command-outputs.js +13 -0
  88. package/dist/generate/kinds/command-outputs.js.map +1 -0
  89. package/dist/generate/kinds/declares-its-name.d.ts +5 -0
  90. package/dist/generate/kinds/declares-its-name.d.ts.map +1 -0
  91. package/dist/generate/kinds/declares-its-name.js +7 -0
  92. package/dist/generate/kinds/declares-its-name.js.map +1 -0
  93. package/dist/generate/kinds/event-file-of.d.ts +5 -0
  94. package/dist/generate/kinds/event-file-of.d.ts.map +1 -0
  95. package/dist/generate/kinds/event-file-of.js +5 -0
  96. package/dist/generate/kinds/event-file-of.js.map +1 -0
  97. package/dist/generate/kinds/event-handler-kind.d.ts.map +1 -1
  98. package/dist/generate/kinds/event-handler-kind.js +2 -0
  99. package/dist/generate/kinds/event-handler-kind.js.map +1 -1
  100. package/dist/generate/kinds/event-name-reference.d.ts +4 -3
  101. package/dist/generate/kinds/event-name-reference.d.ts.map +1 -1
  102. package/dist/generate/kinds/event-name-reference.js +6 -6
  103. package/dist/generate/kinds/event-name-reference.js.map +1 -1
  104. package/dist/generate/kinds/integration-event-kind.d.ts.map +1 -1
  105. package/dist/generate/kinds/integration-event-kind.js +2 -0
  106. package/dist/generate/kinds/integration-event-kind.js.map +1 -1
  107. package/dist/generate/kinds/policy-kind.d.ts.map +1 -1
  108. package/dist/generate/kinds/policy-kind.js +2 -0
  109. package/dist/generate/kinds/policy-kind.js.map +1 -1
  110. package/dist/generate/kinds/query-context.d.ts +9 -0
  111. package/dist/generate/kinds/query-context.d.ts.map +1 -0
  112. package/dist/generate/kinds/query-context.js +27 -0
  113. package/dist/generate/kinds/query-context.js.map +1 -0
  114. package/dist/generate/kinds/query-kind.d.ts.map +1 -1
  115. package/dist/generate/kinds/query-kind.js +16 -52
  116. package/dist/generate/kinds/query-kind.js.map +1 -1
  117. package/dist/generate/kinds/query-outputs.d.ts +8 -0
  118. package/dist/generate/kinds/query-outputs.d.ts.map +1 -0
  119. package/dist/generate/kinds/query-outputs.js +20 -0
  120. package/dist/generate/kinds/query-outputs.js.map +1 -0
  121. package/dist/generate/kinds/reader-file.d.ts +8 -0
  122. package/dist/generate/kinds/reader-file.d.ts.map +1 -0
  123. package/dist/generate/kinds/reader-file.js +9 -0
  124. package/dist/generate/kinds/reader-file.js.map +1 -0
  125. package/dist/generate/mark-policy-questions.d.ts +10 -0
  126. package/dist/generate/mark-policy-questions.d.ts.map +1 -0
  127. package/dist/generate/mark-policy-questions.js +76 -0
  128. package/dist/generate/mark-policy-questions.js.map +1 -0
  129. package/dist/generate/permission-pattern.d.ts +4 -0
  130. package/dist/generate/permission-pattern.d.ts.map +1 -0
  131. package/dist/generate/permission-pattern.js +7 -0
  132. package/dist/generate/permission-pattern.js.map +1 -0
  133. package/dist/generate/refined-by-policy.d.ts +4 -0
  134. package/dist/generate/refined-by-policy.d.ts.map +1 -0
  135. package/dist/generate/refined-by-policy.js +9 -0
  136. package/dist/generate/refined-by-policy.js.map +1 -0
  137. package/dist/generate/rendered.d.ts +5 -0
  138. package/dist/generate/rendered.d.ts.map +1 -0
  139. package/dist/generate/rendered.js +18 -0
  140. package/dist/generate/rendered.js.map +1 -0
  141. package/dist/generate/wire.d.ts.map +1 -1
  142. package/dist/generate/wire.js +3 -25
  143. package/dist/generate/wire.js.map +1 -1
  144. package/dist/generate/wirings.d.ts +8 -0
  145. package/dist/generate/wirings.d.ts.map +1 -0
  146. package/dist/generate/wirings.js +28 -0
  147. package/dist/generate/wirings.js.map +1 -0
  148. package/dist/init/copilot-instruction.d.ts +6 -0
  149. package/dist/init/copilot-instruction.d.ts.map +1 -0
  150. package/dist/init/copilot-instruction.js +15 -0
  151. package/dist/init/copilot-instruction.js.map +1 -0
  152. package/dist/init/files/guidance-files.d.ts +1 -0
  153. package/dist/init/files/guidance-files.d.ts.map +1 -1
  154. package/dist/init/files/guidance-files.js +4 -3
  155. package/dist/init/files/guidance-files.js.map +1 -1
  156. package/dist/init/files/layer-rules.d.ts +3 -0
  157. package/dist/init/files/layer-rules.d.ts.map +1 -0
  158. package/dist/init/files/layer-rules.js +11 -0
  159. package/dist/init/files/layer-rules.js.map +1 -0
  160. package/dist/init/files/pipeline-files.d.ts.map +1 -1
  161. package/dist/init/files/pipeline-files.js +2 -0
  162. package/dist/init/files/pipeline-files.js.map +1 -1
  163. package/dist/init/json-object.d.ts +3 -0
  164. package/dist/init/json-object.d.ts.map +1 -0
  165. package/dist/init/json-object.js +12 -0
  166. package/dist/init/json-object.js.map +1 -0
  167. package/dist/init/manifest/versions.js +24 -24
  168. package/dist/init/run-init.d.ts.map +1 -1
  169. package/dist/init/run-init.js +4 -0
  170. package/dist/init/run-init.js.map +1 -1
  171. package/dist/init/write-agent-settings.d.ts.map +1 -1
  172. package/dist/init/write-agent-settings.js +3 -10
  173. package/dist/init/write-agent-settings.js.map +1 -1
  174. package/dist/init/write-copilot-instructions.d.ts +7 -0
  175. package/dist/init/write-copilot-instructions.d.ts.map +1 -0
  176. package/dist/init/write-copilot-instructions.js +16 -0
  177. package/dist/init/write-copilot-instructions.js.map +1 -0
  178. package/dist/init/write-copilot-settings.d.ts +8 -0
  179. package/dist/init/write-copilot-settings.d.ts.map +1 -0
  180. package/dist/init/write-copilot-settings.js +36 -0
  181. package/dist/init/write-copilot-settings.js.map +1 -0
  182. package/dist/markers/index.d.ts +1 -0
  183. package/dist/markers/index.d.ts.map +1 -1
  184. package/dist/markers/index.js +1 -0
  185. package/dist/markers/index.js.map +1 -1
  186. package/dist/markers/replace-in-region.d.ts +10 -0
  187. package/dist/markers/replace-in-region.d.ts.map +1 -0
  188. package/dist/markers/replace-in-region.js +30 -0
  189. package/dist/markers/replace-in-region.js.map +1 -0
  190. package/dist/progress/format-progress.js +4 -0
  191. package/dist/progress/format-progress.js.map +1 -1
  192. package/dist/progress/progress.d.ts +2 -0
  193. package/dist/progress/progress.d.ts.map +1 -1
  194. package/dist/progress/read-progress.js +1 -0
  195. package/dist/progress/read-progress.js.map +1 -1
  196. package/dist/progress/read-slices.d.ts +5 -1
  197. package/dist/progress/read-slices.d.ts.map +1 -1
  198. package/dist/progress/read-slices.js +17 -7
  199. package/dist/progress/read-slices.js.map +1 -1
  200. package/dist/sdk/agent-instruction.d.ts +1 -1
  201. package/dist/sdk/agent-instruction.js +1 -1
  202. package/dist/sdk/instruct-agents.d.ts +1 -1
  203. package/dist/sdk/instruct-agents.d.ts.map +1 -1
  204. package/dist/sdk/instruct-agents.js +12 -8
  205. package/dist/sdk/instruct-agents.js.map +1 -1
  206. package/dist/version.d.ts +1 -1
  207. package/dist/version.js +1 -1
  208. package/package.json +27 -4
  209. package/templates/command/handler.declared.ts.tpl +29 -0
  210. package/templates/command/handler.spec.buses.ts.tpl +24 -1
  211. package/templates/command/handler.ts.tpl +29 -0
  212. package/templates/command/wiring.manual.tpl +2 -2
  213. package/templates/command/wiring.tsyringe.tpl +5 -2
  214. package/templates/event-handler/event-handler.declared.ts.tpl +1 -1
  215. package/templates/init/AGENTS.md.tpl +46 -0
  216. package/templates/init/CLAUDE.md.tpl +2 -45
  217. package/templates/init/README.md.tpl +1 -1
  218. package/templates/init/rules/application.md.tpl +1 -1
  219. package/templates/init/rules/domain.md.tpl +1 -1
  220. package/templates/integration-event/publisher.declared.ts.tpl +1 -1
  221. package/templates/pipeline/github/workflows/copilot-setup-steps.yml +26 -0
  222. package/templates/pipeline/package-scripts.json +1 -1
  223. package/templates/presets/identity/context/application/integration/publishers/account-deactivated.publisher.ts.tpl +1 -1
  224. package/templates/presets/identity/context/application/integration/publishers/delegation-granted.publisher.ts.tpl +1 -1
  225. package/templates/presets/identity/context/application/integration/publishers/delegation-revoked.publisher.ts.tpl +1 -1
  226. package/templates/presets/identity/context/application/integration/publishers/member-joined.publisher.ts.tpl +1 -1
  227. package/templates/presets/identity/context/application/integration/publishers/member-removed.publisher.ts.tpl +1 -1
  228. package/templates/presets/identity/context/application/integration/publishers/member-role-changed.publisher.ts.tpl +1 -1
  229. package/templates/presets/identity/context/application/integration/publishers/organisation-opened.publisher.ts.tpl +1 -1
  230. package/templates/query/handler.declared.ts.tpl +19 -0
  231. package/templates/query/handler.spec.buses.ts.tpl +21 -0
  232. package/templates/query/handler.ts.tpl +19 -0
  233. package/templates/query/wiring.manual.tpl +1 -1
  234. package/templates/query/wiring.tsyringe.tpl +4 -1
@@ -0,0 +1,184 @@
1
+ import { argumentsOf } from '../declarations/arguments-of.js';
2
+ import { classesOf } from '../declarations/classes-of.js';
3
+ import { inLayer } from '../support/in-layer.js';
4
+ import { reporter } from '../support/reporter.js';
5
+ import { sourceDeclaring } from '../support/source-declaring.js';
6
+ import { toViolations } from '../support/to-violations.js';
7
+ import { callArguments } from '../text/call-arguments.js';
8
+ import { escapeRegExp } from '../text/escape-reg-exp.js';
9
+ import { exportedClass } from '../text/exported-class.js';
10
+ import { statementEnd } from '../text/statement-end.js';
11
+ const PERMISSION_REF = /^([A-Za-z_$][\w$]*)\s*(?:\[\s*(['"`])([^'"`]+)\2\s*\]|\.\s*([A-Za-z_$][\w$]*))$/;
12
+ const DEFINE_POLICY = /(?<![\w$.])definePolicy\s*(?:<[^<>()]*>)?\s*\(/g;
13
+ const PERMISSION_ENTRY = /^permission\s*:\s*/;
14
+ const REGISTRATION = /\.\s*(?:command|query)\s*\(\s*([A-Z][\w$]*)\s*\)/g;
15
+ const CHAINED_REQUIRES = /\.\s*requires\s*\(/;
16
+ const MAP_REQUIRES = /(?<![\w$.])requires\s*\(/g;
17
+ const ASKS_ACCESS = /\.\s*(?:authorize|decide|decideOn)\s*\(/;
18
+ const STILL_GENERATED = 'TODO(domain)';
19
+ export const authzPolicyAsked = {
20
+ id: 'authz/policy-asked',
21
+ description: 'A use case whose permission has a policy has a handler that asks it through Access, with that permission.',
22
+ scope: 'project',
23
+ run(project) {
24
+ const refined = refinedPermissions(project);
25
+ const report = reporter(project, this.id);
26
+ if (refined.size === 0) {
27
+ return [];
28
+ }
29
+ return requirements(project)
30
+ .filter(({ permission }) => refined.has(permission.key))
31
+ .flatMap((requirement) => handlersOf(project, requirement).flatMap((handler) => toViolations(report, handler.path, unasked(handler, requirement))));
32
+ },
33
+ };
34
+ /** The permissions some policy refines, by `@Policy(<permission>, ...)` or `definePolicy({ permission, ... })`. */
35
+ function refinedPermissions(project) {
36
+ const refined = new Set();
37
+ for (const file of project.files) {
38
+ if (inLayer(file, 'application')?.inside[0] !== 'authorization') {
39
+ continue;
40
+ }
41
+ for (const permission of [...decoratedPolicies(file), ...definedPolicies(file)]) {
42
+ refined.add(permission.key);
43
+ }
44
+ }
45
+ return refined;
46
+ }
47
+ function decoratedPolicies(file) {
48
+ return classesOf(file.scan).flatMap(({ decorations }) => decorations.flatMap((decoration) => {
49
+ const [permission] = decoration.name === 'Policy' ? argumentsOf(file.scan, decoration) : [];
50
+ return refOf(file, permission);
51
+ }));
52
+ }
53
+ function definedPolicies(file) {
54
+ const { code } = file.scan;
55
+ return [...code.matchAll(DEFINE_POLICY)].flatMap((match) => {
56
+ const open = code.indexOf('{', match.index + match[0].length - 1);
57
+ const entry = open === -1 ? undefined : callArguments(code, open).find((part) => PERMISSION_ENTRY.test(part.code));
58
+ if (entry === undefined) {
59
+ return [];
60
+ }
61
+ const value = PERMISSION_ENTRY.exec(entry.code)?.[0].length ?? 0;
62
+ return refOf(file, { code: entry.code.slice(value), start: entry.start + value });
63
+ });
64
+ }
65
+ /** Every use case that requires a permission: `@Requires` on its class, or its registration in a module or a map. */
66
+ function requirements(project) {
67
+ return project.files.flatMap((file) => {
68
+ if (file.isTest || file.location.area !== 'context') {
69
+ return [];
70
+ }
71
+ return [...decoratedRequirements(file), ...registeredRequirements(file), ...mappedRequirements(file)];
72
+ });
73
+ }
74
+ function decoratedRequirements(file) {
75
+ return classesOf(file.scan).flatMap(({ name, decorations }) => decorations.flatMap((decoration) => {
76
+ const [permission] = decoration.name === 'Requires' ? argumentsOf(file.scan, decoration) : [];
77
+ return refOf(file, permission).map((ref) => ({ message: name, permission: ref, declaredIn: file }));
78
+ }));
79
+ }
80
+ /** `.command(X).requires(<permission>)` in a module wired by hand with the builder. */
81
+ function registeredRequirements(file) {
82
+ const { code } = file.scan;
83
+ if (file.location.area !== 'context' || file.location.layer !== 'module') {
84
+ return [];
85
+ }
86
+ const registrations = [...code.matchAll(REGISTRATION)];
87
+ return registrations.flatMap((match, index) => {
88
+ const next = registrations[index + 1]?.index ?? code.length;
89
+ const end = Math.min(next, statementEnd(code, match.index));
90
+ const chained = CHAINED_REQUIRES.exec(code.slice(match.index, end));
91
+ if (chained === null) {
92
+ return [];
93
+ }
94
+ const open = match.index + chained.index + chained[0].length - 1;
95
+ const [permission] = callArguments(code, open);
96
+ return refOf(file, permission).map((ref) => ({ message: match[1] ?? '', permission: ref, declaredIn: file }));
97
+ });
98
+ }
99
+ /** `requires(X, <permission>)` in the authorization map of a module wired by hand. */
100
+ function mappedRequirements(file) {
101
+ const { code } = file.scan;
102
+ const here = file.location;
103
+ if (here.area !== 'context' || (here.layer !== 'module' && !isAuthorizationFolder(file))) {
104
+ return [];
105
+ }
106
+ return [...code.matchAll(MAP_REQUIRES)].flatMap((match) => {
107
+ const [message, permission] = callArguments(code, match.index + match[0].length - 1);
108
+ if (message === undefined || !/^[A-Z][\w$]*$/.test(message.code)) {
109
+ return [];
110
+ }
111
+ return refOf(file, permission).map((ref) => ({ message: message.code, permission: ref, declaredIn: file }));
112
+ });
113
+ }
114
+ function isAuthorizationFolder(file) {
115
+ return inLayer(file, 'application')?.inside[0] === 'authorization';
116
+ }
117
+ /** The permission an argument names, read from the source: the code has the contents of its strings blanked. */
118
+ function refOf(file, argument) {
119
+ if (argument === undefined) {
120
+ return [];
121
+ }
122
+ const written = file.text.slice(argument.start, argument.start + argument.code.length).trim();
123
+ const match = PERMISSION_REF.exec(written);
124
+ const set = match?.[1];
125
+ const id = match?.[3] ?? match?.[4];
126
+ return set === undefined || id === undefined ? [] : [{ set, id, key: `${set}[${id}]`, written }];
127
+ }
128
+ /** The handlers in the folder of the use case: `commands/<use-case>/` or `queries/<use-case>/`. */
129
+ function handlersOf(project, { message, declaredIn }) {
130
+ const source = messageSource(project, declaredIn, message);
131
+ if (source === undefined) {
132
+ return [];
133
+ }
134
+ const folder = source.path.slice(0, source.path.lastIndexOf('/') + 1);
135
+ return project.files.filter((file) => !file.isTest &&
136
+ file.path.startsWith(folder) &&
137
+ !file.path.slice(folder.length).includes('/') &&
138
+ file.path.endsWith('.handler.ts'));
139
+ }
140
+ function messageSource(project, declaredIn, message) {
141
+ const declaring = sourceDeclaring(project, declaredIn, message);
142
+ if (declares(declaring, message)) {
143
+ return declaring;
144
+ }
145
+ const context = declaredIn.location.area === 'context' ? declaredIn.location.context : undefined;
146
+ return project.files.find((file) => !file.isTest &&
147
+ file.location.area === 'context' &&
148
+ file.location.context === context &&
149
+ /\.(?:command|query)\.ts$/.test(file.path) &&
150
+ declares(file, message));
151
+ }
152
+ function declares(file, name) {
153
+ return classesOf(file.scan).some((candidate) => candidate.name === name);
154
+ }
155
+ function unasked(handler, { message, permission }) {
156
+ if (asks(handler, permission)) {
157
+ return [];
158
+ }
159
+ const handlerClass = exportedClass(handler);
160
+ return [
161
+ {
162
+ line: handlerClass?.line ?? 1,
163
+ message: `A policy refines ${permission.written}, which ${message} requires, and ${handlerClass?.name ?? 'its handler'} never asks it: the bus checked the permission without the element, and the rule of the policy is skipped.`,
164
+ fix: `Load the element, then call \`await this.access.authorize(${/Query$/.test(message) ? 'query' : 'command'}.actor, ${permission.written}, <aggregate>)\` with the Access port of @ddd-ts-kit/auth, before the change.`,
165
+ },
166
+ ];
167
+ }
168
+ /**
169
+ * A call to `authorize`, `decide` or `decideOn` of `Access`, and the permission named in the
170
+ * code, not in a comment; or the `TODO(domain)` the generator leaves there, which `ddd-ts-kit
171
+ * todo` lists and the authorization module enforces at run time until it is done.
172
+ */
173
+ function asks(handler, permission) {
174
+ const { code, comments } = handler.scan;
175
+ const set = escapeRegExp(permission.set);
176
+ const id = escapeRegExp(permission.id);
177
+ const named = new RegExp(`(?<![\\w$.])${set}\\s*(?:\\[\\s*(['"\`])${id}\\1\\s*\\]|\\.\\s*${id}(?![\\w$]))`, 'g');
178
+ if (comments.some(({ text }) => text.includes(STILL_GENERATED) && new RegExp(named.source).test(text))) {
179
+ return true;
180
+ }
181
+ return (ASKS_ACCESS.test(code) &&
182
+ [...handler.text.matchAll(named)].some((match) => code.slice(match.index, match.index + permission.set.length) === permission.set));
183
+ }
184
+ //# sourceMappingURL=authz-policy-asked.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"authz-policy-asked.js","sourceRoot":"","sources":["../../../src/check/rules/authz-policy-asked.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"declarations-role-declared.d.ts","sourceRoot":"","sources":["../../../src/check/rules/declarations-role-declared.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAwB7C,eAAO,MAAM,wBAAwB,EAAE,IAkBtC,CAAC"}
1
+ {"version":3,"file":"declarations-role-declared.d.ts","sourceRoot":"","sources":["../../../src/check/rules/declarations-role-declared.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAqB7C,eAAO,MAAM,wBAAwB,EAAE,IAkBtC,CAAC"}
@@ -1,28 +1,22 @@
1
1
  import path from 'node:path';
2
2
  import { DECLARED_ROLES, declaredRoleOf } from '../../declared/index.js';
3
- import { argumentsOf } from '../declarations/arguments-of.js';
4
3
  import { classesOf } from '../declarations/classes-of.js';
5
4
  import { DECLARATIONS_ENTRY } from '../declarations/declarations-entry.js';
6
- import { declaredEventHandlers } from '../declarations/declared-event-handlers.js';
7
5
  import { optionOf } from '../declarations/option-of.js';
8
- import { nameOfEventClass } from '../events/name-of-event-class.js';
9
6
  import { inContext } from '../support/in-context.js';
10
7
  import { isDeclaredStyle } from '../support/is-declared-style.js';
11
8
  import { pathInContext } from '../support/path-in-context.js';
12
9
  import { perFile } from '../support/per-file.js';
13
- import { sourceDeclaring } from '../support/source-declaring.js';
14
10
  /** The option of each decorator that names what it declares, written once and never derived. */
15
11
  const WRITTEN_NAMES = {
16
12
  IntegrationEventHandler: 'consumer',
17
- DomainEventHandler: 'name',
18
13
  Policy: 'name',
19
14
  };
20
15
  /** `authz/declared` holds the messages: a command or a query says who may send it, or is reported there. */
21
16
  const MESSAGE_SUFFIXES = ['command', 'query'];
22
- const IDENTIFIER = /^[A-Za-z_$][\w$]*$/;
23
17
  export const declarationsRoleDeclared = {
24
18
  id: 'declarations/role-declared',
25
- description: 'In the declared style, a role file exports a class carrying the decorator of its role, with its names written as string literals (the name of a domain event handler may read the name its event class declares, `{ name: InvoiceIssued.eventName }`), and domain/ declares nothing.',
19
+ description: 'In the declared style, a role file exports a class carrying the decorator of its role, with its names written as string literals (a domain event handler writes none: it is attached under the name its event class declares), and domain/ declares nothing.',
26
20
  scope: 'file',
27
21
  run(project) {
28
22
  if (!isDeclaredStyle(project)) {
@@ -50,7 +44,7 @@ function outsideTheDomain(file, project) {
50
44
  const inside = pathInContext(project, file) ?? '';
51
45
  const role = declaredRoleOf(inside);
52
46
  const place = role === undefined ? misplaced(file) : undeclaredRole(file, role, inside);
53
- return [...place, ...unwrittenNames(file), ...renamedEvents(file, project)];
47
+ return [...place, ...unwrittenNames(file)];
54
48
  }
55
49
  /** A declared class outside a role file is read by neither the barrel nor discovery; the module file may hold what it wants. */
56
50
  function misplaced(file) {
@@ -101,44 +95,19 @@ function unwrittenNames(file) {
101
95
  return decorated(file).flatMap(({ declared, decoration }) => {
102
96
  const key = WRITTEN_NAMES[decoration.name];
103
97
  const value = key === undefined ? undefined : optionOf(file.scan, decoration, key);
104
- if (key === undefined || isWritten(value) || readsEventName(file, decoration, value)) {
98
+ if (key === undefined || isWritten(value)) {
105
99
  return [];
106
100
  }
107
101
  return [
108
102
  {
109
103
  line: value?.line ?? decoration.line,
110
104
  message: `The ${key} of @${decoration.name} on ${declared.name} is ${value?.literal === '' ? 'empty' : 'not a string literal'}.`,
111
- fix: decoration.name === 'DomainEventHandler' ? READ_EVENT_NAME : writeInPlace(key, context),
105
+ fix: `Write it in place as a string literal, { ${key}: '${context}.<name>' }: a name that is written survives the renaming of the class and is read without running the code.`,
112
106
  },
113
107
  ];
114
108
  });
115
109
  }
116
- const READ_EVENT_NAME = 'Read the name the event class declares, { name: <Event>.eventName }, or write it in place as a string literal: a handler is attached under the name its event carries.';
117
- function writeInPlace(key, context) {
118
- return `Write it in place as a string literal, { ${key}: '${context}.<name>' }: a name that is written survives the renaming of the class and is read without running the code.`;
119
- }
120
110
  function isWritten(value) {
121
111
  return value?.literal !== undefined && value.literal !== '';
122
112
  }
123
- /** `@DomainEventHandler(InvoiceIssued, { name: InvoiceIssued.eventName })`: the name the event class declares, read where it is written. */
124
- function readsEventName(file, decoration, value) {
125
- const event = argumentsOf(file.scan, decoration)[0]?.code.trim();
126
- return decoration.name === 'DomainEventHandler' && event !== undefined && value?.reference === `${event}.eventName`;
127
- }
128
- /** A domain event handler is attached under the name it writes: it has to be the name the event class carries. */
129
- function renamedEvents(file, project) {
130
- return declaredEventHandlers(file.scan, 'DomainEventHandler').flatMap(({ event, name }) => {
131
- const carried = IDENTIFIER.test(event) ? nameOfEventClass(sourceDeclaring(project, file, event), event) : undefined;
132
- if (carried === undefined || name?.literal === undefined || name.literal === '' || name.literal === carried) {
133
- return [];
134
- }
135
- return [
136
- {
137
- line: name.line,
138
- message: `@DomainEventHandler is named "${name.literal}" but ${event} is named "${carried}".`,
139
- fix: `Write { name: '${carried}' }, the name ${event} carries: a handler attached under another name is never called.`,
140
- },
141
- ];
142
- });
143
- }
144
113
  //# sourceMappingURL=declarations-role-declared.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"declarations-role-declared.js","sourceRoot":"","sources":["../../../src/check/rules/declarations-role-declared.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"declarations-role-declared.js","sourceRoot":"","sources":["../../../src/check/rules/declarations-role-declared.ts"],"names":[],"mappings":"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"}
@@ -40,13 +40,13 @@ function flawedRegistrations(file) {
40
40
  /** The consumer names a file gives, in a registration or in an `@IntegrationEventHandler` declaration, in source order. */
41
41
  function consumerNames(file) {
42
42
  const registered = consumerRegistrations(file).flatMap(({ name, nameLine }) => name === undefined ? [] : [{ name, line: nameLine }]);
43
- const declared = declaredEventHandlers(file.scan, 'IntegrationEventHandler').flatMap(({ name }) => name?.literal === undefined ? [] : [{ name: name.literal, line: name.line }]);
43
+ const declared = declaredEventHandlers(file.scan).flatMap(({ name }) => name?.literal === undefined ? [] : [{ name: name.literal, line: name.line }]);
44
44
  return [...registered, ...declared].sort((left, right) => left.line - right.line);
45
45
  }
46
46
  /** A declared handler carries its consumer name itself: the store deduplicates per name, so it has to be readable where it is declared. */
47
47
  function unnamedHandlers(file) {
48
48
  const context = inContext(file.location) ? file.location.context : '<context>';
49
- return declaredEventHandlers(file.scan, 'IntegrationEventHandler')
49
+ return declaredEventHandlers(file.scan)
50
50
  .filter(({ name }) => name?.literal === undefined || name.literal === '')
51
51
  .map(({ className, line, name }) => ({
52
52
  line: name?.line ?? line,
@@ -68,7 +68,7 @@ function unregistered(file, project) {
68
68
  return [];
69
69
  }
70
70
  // A handler that declares itself needs no registration: its decorator carries the name.
71
- if (declaredEventHandlers(file.scan, 'IntegrationEventHandler').length > 0) {
71
+ if (declaredEventHandlers(file.scan).length > 0) {
72
72
  return [];
73
73
  }
74
74
  const instance = handler.name.charAt(0).toLowerCase() + handler.name.slice(1);
@@ -1 +1 @@
1
- {"version":3,"file":"events-consumer-idempotent.js","sourceRoot":"","sources":["../../../src/check/rules/events-consumer-idempotent.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"events-consumer-idempotent.js","sourceRoot":"","sources":["../../../src/check/rules/events-consumer-idempotent.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Rule } from '../model/rule.js';
2
+ export declare const eventsNameDeclaredOnce: Rule;
3
+ //# sourceMappingURL=events-name-declared-once.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events-name-declared-once.d.ts","sourceRoot":"","sources":["../../../src/check/rules/events-name-declared-once.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAY7C,eAAO,MAAM,sBAAsB,EAAE,IAsBpC,CAAC"}
@@ -0,0 +1,51 @@
1
+ import { inContext } from '../support/in-context.js';
2
+ import { perFile } from '../support/per-file.js';
3
+ /** `static readonly eventName = '...'`, typed or not. */
4
+ const STATIC_NAME = /(?<![\w$.])static\s+readonly\s+eventName\s*(?::[^=;\n'"]+)?=\s*$/;
5
+ /** `name = '...'`, `name: '...'`, `name: string = '...'`: the name written a second time. */
6
+ const NAME_LITERAL = /(?<![\w$.])name\s*\??\s*(?:[:=]|:[^=;\n'"]+=)\s*$/;
7
+ export const eventsNameDeclaredOnce = {
8
+ id: 'events/name-declared-once',
9
+ description: 'Every domain event class declares its name once, `static readonly eventName`, and its `readonly name` reads it.',
10
+ scope: 'file',
11
+ run(project) {
12
+ return perFile(project, this.id, (file) => {
13
+ if (!inContext(file.location) || file.isTest) {
14
+ return [];
15
+ }
16
+ const { layer, inside, context } = file.location;
17
+ if (layer !== 'domain' || inside[0] !== 'events') {
18
+ return [];
19
+ }
20
+ return file.structure.classes
21
+ .filter((declared) => declared.depth === 0 && !declared.isAbstract)
22
+ .flatMap((declared) => judge(file, declared, context));
23
+ });
24
+ },
25
+ };
26
+ function judge(file, declared, context) {
27
+ const declaredOnce = literalsAfter(file, declared, STATIC_NAME)[0];
28
+ const written = literalsAfter(file, declared, NAME_LITERAL);
29
+ if (declaredOnce === undefined) {
30
+ const name = written[0]?.value ?? `${context}.<aggregate>.<fact>`;
31
+ return [
32
+ {
33
+ line: written[0]?.line ?? declared.line,
34
+ message: `The domain event ${declared.name} does not declare its name once: it has no static readonly eventName.`,
35
+ fix: `Write \`static readonly eventName = '${name}';\` in ${declared.name} and \`readonly name = ${declared.name}.eventName;\`: handlers and projections are attached under that static name.`,
36
+ },
37
+ ];
38
+ }
39
+ return written.map(({ line, value }) => ({
40
+ line,
41
+ message: `The domain event ${declared.name} writes its name "${value}" a second time instead of reading its eventName.`,
42
+ fix: `Write \`readonly name = ${declared.name}.eventName;\`: the name is declared once, on the class.`,
43
+ }));
44
+ }
45
+ function literalsAfter(file, declared, pattern) {
46
+ const { code, strings } = file.scan;
47
+ return strings.filter((literal) => literal.start > declared.bodyStart &&
48
+ literal.start < declared.end &&
49
+ pattern.test(code.slice(Math.max(0, literal.start - 200), literal.start)));
50
+ }
51
+ //# sourceMappingURL=events-name-declared-once.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events-name-declared-once.js","sourceRoot":"","sources":["../../../src/check/rules/events-name-declared-once.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AACrD,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAEjD,yDAAyD;AACzD,MAAM,WAAW,GAAG,kEAAkE,CAAC;AACvF,6FAA6F;AAC7F,MAAM,YAAY,GAAG,mDAAmD,CAAC;AAEzE,MAAM,CAAC,MAAM,sBAAsB,GAAS;IAC1C,EAAE,EAAE,2BAA2B;IAC/B,WAAW,EACT,iHAAiH;IACnH,KAAK,EAAE,MAAM;IACb,GAAG,CAAC,OAAO;QACT,OAAO,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE;YACxC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;gBAC7C,OAAO,EAAE,CAAC;YACZ,CAAC;YAED,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC;YAEjD,IAAI,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,QAAQ,EAAE,CAAC;gBACjD,OAAO,EAAE,CAAC;YACZ,CAAC;YAED,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO;iBAC1B,MAAM,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC;iBAClE,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;QAC3D,CAAC,CAAC,CAAC;IACL,CAAC;CACF,CAAC;AAEF,SAAS,KAAK,CAAC,IAAgB,EAAE,QAAoB,EAAE,OAAe;IACpE,MAAM,YAAY,GAAG,aAAa,CAAC,IAAI,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;IACnE,MAAM,OAAO,GAAG,aAAa,CAAC,IAAI,EAAE,QAAQ,EAAE,YAAY,CAAC,CAAC;IAE5D,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;QAC/B,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,GAAG,OAAO,qBAAqB,CAAC;QAElE,OAAO;YACL;gBACE,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,IAAI,QAAQ,CAAC,IAAI;gBACvC,OAAO,EAAE,oBAAoB,QAAQ,CAAC,IAAI,uEAAuE;gBACjH,GAAG,EAAE,wCAAwC,IAAI,WAAW,QAAQ,CAAC,IAAI,0BAA0B,QAAQ,CAAC,IAAI,8EAA8E;aAC/L;SACF,CAAC;IACJ,CAAC;IAED,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;QACvC,IAAI;QACJ,OAAO,EAAE,oBAAoB,QAAQ,CAAC,IAAI,qBAAqB,KAAK,mDAAmD;QACvH,GAAG,EAAE,2BAA2B,QAAQ,CAAC,IAAI,yDAAyD;KACvG,CAAC,CAAC,CAAC;AACN,CAAC;AAED,SAAS,aAAa,CAAC,IAAgB,EAAE,QAAoB,EAAE,OAAe;IAC5E,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC;IAEpC,OAAO,OAAO,CAAC,MAAM,CACnB,CAAC,OAAO,EAAE,EAAE,CACV,OAAO,CAAC,KAAK,GAAG,QAAQ,CAAC,SAAS;QAClC,OAAO,CAAC,KAAK,GAAG,QAAQ,CAAC,GAAG;QAC5B,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,KAAK,GAAG,GAAG,CAAC,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,CAC5E,CAAC;AACJ,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"emit.d.ts","sourceRoot":"","sources":["../../src/generate/emit.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAG5D,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAExC,sFAAsF;AACtF,MAAM,MAAM,MAAM,GAAG,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;AAEjE,oEAAoE;AACpE,wBAAgB,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAI3F"}
1
+ {"version":3,"file":"emit.d.ts","sourceRoot":"","sources":["../../src/generate/emit.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAE5D,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAExC,sFAAsF;AACtF,MAAM,MAAM,MAAM,GAAG,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;AAEjE,oEAAoE;AACpE,wBAAgB,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAI3F"}
@@ -1,20 +1,8 @@
1
- import { renderTemplate, templateExists } from '../templating/index.js';
2
- import { isDeclared } from './is-declared.js';
1
+ import { rendered } from './rendered.js';
3
2
  /** Renders templates to paths relative to the context directory. */
4
3
  export function emit(scope, context, outputs) {
5
4
  for (const [template, target] of outputs) {
6
- scope.ws.create(`${scope.dir}/${target}`, renderTemplate(styled(scope.config, template), context));
5
+ scope.ws.create(`${scope.dir}/${target}`, rendered(scope, template, context));
7
6
  }
8
7
  }
9
- /**
10
- * The template of the style of the project: where a file differs too much between the two
11
- * styles to share one template, its declared twin sits next to it as `<name>.declared.<ext>.tpl`.
12
- */
13
- function styled(config, template) {
14
- if (!isDeclared(config)) {
15
- return template;
16
- }
17
- const twin = template.replace(/((?:\.[a-z]+)?\.tpl)$/, '.declared$1');
18
- return templateExists(twin) ? twin : template;
19
- }
20
8
  //# sourceMappingURL=emit.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"emit.js","sourceRoot":"","sources":["../../src/generate/emit.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxE,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAM9C,oEAAoE;AACpE,MAAM,UAAU,IAAI,CAAC,KAAY,EAAE,OAAsB,EAAE,OAA0B;IACnF,KAAK,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACzC,KAAK,CAAC,EAAE,CAAC,MAAM,CAAC,GAAG,KAAK,CAAC,GAAG,IAAI,MAAM,EAAE,EAAE,cAAc,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,QAAQ,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;IACrG,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,SAAS,MAAM,CAAC,MAAc,EAAE,QAAgB;IAC9C,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QACxB,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,uBAAuB,EAAE,aAAa,CAAC,CAAC;IAEtE,OAAO,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC;AAChD,CAAC"}
1
+ {"version":3,"file":"emit.js","sourceRoot":"","sources":["../../src/generate/emit.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAMzC,oEAAoE;AACpE,MAAM,UAAU,IAAI,CAAC,KAAY,EAAE,OAAsB,EAAE,OAA0B;IACnF,KAAK,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACzC,KAAK,CAAC,EAAE,CAAC,MAAM,CAAC,GAAG,KAAK,CAAC,GAAG,IAAI,MAAM,EAAE,EAAE,QAAQ,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;IAChF,CAAC;AACH,CAAC"}
@@ -0,0 +1,9 @@
1
+ import type { Scope } from '../scope.js';
2
+ /**
3
+ * Writes again, asking the policy of its permission, a command or a plain query whose files are
4
+ * still as the generator wrote them (layout aside): its handler, its spec and its registration.
5
+ * False when one of them was changed since, or for a search: the code is then the team's, and
6
+ * only a marker is left.
7
+ */
8
+ export declare function askPolicyInGeneratedUseCase(scope: Scope, useCase: string, kind: string): boolean;
9
+ //# sourceMappingURL=ask-policy-in-generated-use-case.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ask-policy-in-generated-use-case.d.ts","sourceRoot":"","sources":["../../../src/generate/kinds/ask-policy-in-generated-use-case.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAwBzC;;;;;GAKG;AACH,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAmChG"}
@@ -0,0 +1,102 @@
1
+ import { insertInRegion, parseWiring, replaceInRegion } from '../../markers/index.js';
2
+ import { toName } from '../../naming/index.js';
3
+ import { rendered } from '../rendered.js';
4
+ import { wirings } from '../wirings.js';
5
+ import { commandContext } from './command-context.js';
6
+ import { commandOutputs } from './command-outputs.js';
7
+ import { queryContext } from './query-context.js';
8
+ import { queryOutputs } from './query-outputs.js';
9
+ const AGGREGATE_IMPORT = /\/domain\/aggregates\/([a-z0-9-]+)\.aggregate/;
10
+ /**
11
+ * Writes again, asking the policy of its permission, a command or a plain query whose files are
12
+ * still as the generator wrote them (layout aside): its handler, its spec and its registration.
13
+ * False when one of them was changed since, or for a search: the code is then the team's, and
14
+ * only a marker is left.
15
+ */
16
+ export function askPolicyInGeneratedUseCase(scope, useCase, kind) {
17
+ const generated = generatedUseCase(scope, toName(useCase), kind);
18
+ if (generated === undefined) {
19
+ return false;
20
+ }
21
+ const plain = generated.contextOf(false);
22
+ const asking = generated.contextOf(true);
23
+ const files = generated.outputs
24
+ .filter(([, target]) => /\.handler(?:\.spec)?\.ts$/.test(target))
25
+ .map(([template, target]) => ({
26
+ file: `${scope.dir}/${target}`,
27
+ was: scope.ws.spoken(rendered(scope, template, plain)),
28
+ becomes: scope.ws.spoken(rendered(scope, template, asking)),
29
+ }));
30
+ const registrations = rewired(scope, generated.kind, { plain, asking });
31
+ if (registrations === undefined || files.some(({ file, was }) => !sameCode(scope.ws.read(file) ?? '', was))) {
32
+ return false;
33
+ }
34
+ for (const { file, becomes } of [...files, ...registrations]) {
35
+ scope.ws.update(file, becomes);
36
+ }
37
+ scope.ws.step({
38
+ file: `${scope.dir}/${generated.folder}/${useCase}.handler.ts`,
39
+ anchor: 'TODO(domain): a policy refines',
40
+ text: `ask the policy about the element the ${kind} acts on once it is loaded, in place of \`${kind}\`.`,
41
+ });
42
+ return true;
43
+ }
44
+ function generatedUseCase(scope, name, kind) {
45
+ if (kind === 'command') {
46
+ const folder = `application/commands/${name.kebab}`;
47
+ const handler = scope.ws.read(`${scope.dir}/${folder}/${name.kebab}.handler.ts`) ?? '';
48
+ const aggregate = AGGREGATE_IMPORT.exec(handler)?.[1];
49
+ const of = { name, aggregate: aggregate === undefined ? undefined : toName(aggregate) };
50
+ return {
51
+ folder,
52
+ kind: 'command',
53
+ contextOf: (asksPolicy) => commandContext(scope, of, asksPolicy),
54
+ outputs: commandOutputs(scope, name),
55
+ };
56
+ }
57
+ const folder = `application/queries/${name.kebab}`;
58
+ const handler = scope.ws.read(`${scope.dir}/${folder}/${name.kebab}.handler.ts`) ?? '';
59
+ // A search asks the access scope of its actor: no element, no policy to ask.
60
+ return handler.includes('access.scope(')
61
+ ? undefined
62
+ : {
63
+ folder,
64
+ kind: 'query',
65
+ contextOf: (asksPolicy) => queryContext(scope, name, asksPolicy),
66
+ outputs: queryOutputs(scope, name, ''),
67
+ };
68
+ }
69
+ /** The files of the wiring with the registration of the use case changed, or undefined when one is not found as written. */
70
+ function rewired(scope, kind, { plain, asking }) {
71
+ const after = wirings(scope, kind, asking);
72
+ const rewrites = [];
73
+ for (const [index, { file, wiring }] of wirings(scope, kind, plain).entries()) {
74
+ const was = scope.ws.read(file) ?? '';
75
+ const becomes = withBlocks(was, scope.ws.spoken(wiring), scope.ws.spoken(after[index]?.wiring ?? ''));
76
+ if (becomes === undefined) {
77
+ return undefined;
78
+ }
79
+ rewrites.push({ file, was, becomes });
80
+ }
81
+ return rewrites;
82
+ }
83
+ function withBlocks(content, plain, asking) {
84
+ const blocks = parseWiring(asking);
85
+ let written = content;
86
+ for (const [region, block] of parseWiring(plain)) {
87
+ const next = blocks.get(region) ?? '';
88
+ if (written === undefined || block === next) {
89
+ continue;
90
+ }
91
+ written =
92
+ region === 'imports'
93
+ ? insertInRegion(written, region, next)
94
+ : replaceInRegion(written, region, { replaced: block, by: next });
95
+ }
96
+ return written;
97
+ }
98
+ /** The same code, whatever the layout a formatter gave it. */
99
+ function sameCode(one, other) {
100
+ return one.replace(/\s+/g, '') === other.replace(/\s+/g, '');
101
+ }
102
+ //# sourceMappingURL=ask-policy-in-generated-use-case.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ask-policy-in-generated-use-case.js","sourceRoot":"","sources":["../../../src/generate/kinds/ask-policy-in-generated-use-case.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { EventNames } from '../event-names.js';
2
+ import type { Scope } from '../scope.js';
3
+ /**
4
+ * In the declared style a reaction is attached under the name its event class declares,
5
+ * `@DomainEventHandler(InvoiceIssued)`: an event class generated before 0.7 has to declare it
6
+ * first, or the reaction does not compile.
7
+ */
8
+ export declare function assertDeclaresItsName(scope: Scope, names: EventNames): void;
9
+ //# sourceMappingURL=assert-declares-its-name.d.ts.map