ddd-ts-kit 0.17.0 → 0.18.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 (210) hide show
  1. package/README.fr.md +10 -12
  2. package/README.md +9 -10
  3. package/dist/affected/reach-of.js +1 -1
  4. package/dist/affected/reach-of.js.map +1 -1
  5. package/dist/check/catalogue/architecture-rules.d.ts.map +1 -1
  6. package/dist/check/catalogue/architecture-rules.js +2 -0
  7. package/dist/check/catalogue/architecture-rules.js.map +1 -1
  8. package/dist/check/declarations/declared-event-handlers.d.ts +4 -9
  9. package/dist/check/declarations/declared-event-handlers.d.ts.map +1 -1
  10. package/dist/check/declarations/declared-event-handlers.js +5 -5
  11. package/dist/check/declarations/declared-event-handlers.js.map +1 -1
  12. package/dist/check/declarations/option-of.d.ts +0 -2
  13. package/dist/check/declarations/option-of.d.ts.map +1 -1
  14. package/dist/check/declarations/option-of.js +1 -7
  15. package/dist/check/declarations/option-of.js.map +1 -1
  16. package/dist/check/explain/authz-docs.d.ts.map +1 -1
  17. package/dist/check/explain/authz-docs.js +14 -1
  18. package/dist/check/explain/authz-docs.js.map +1 -1
  19. package/dist/check/explain/events-docs.d.ts.map +1 -1
  20. package/dist/check/explain/events-docs.js +31 -11
  21. package/dist/check/explain/events-docs.js.map +1 -1
  22. package/dist/check/explain/ports-docs.d.ts.map +1 -1
  23. package/dist/check/explain/ports-docs.js +11 -9
  24. package/dist/check/explain/ports-docs.js.map +1 -1
  25. package/dist/check/explain/scheduling-docs.d.ts.map +1 -1
  26. package/dist/check/explain/scheduling-docs.js +10 -5
  27. package/dist/check/explain/scheduling-docs.js.map +1 -1
  28. package/dist/check/explain/wiring-docs.js +4 -4
  29. package/dist/check/explain/wiring-docs.js.map +1 -1
  30. package/dist/check/fixtures/authz-policy-fixtures.d.ts +3 -0
  31. package/dist/check/fixtures/authz-policy-fixtures.d.ts.map +1 -0
  32. package/dist/check/fixtures/authz-policy-fixtures.js +97 -0
  33. package/dist/check/fixtures/authz-policy-fixtures.js.map +1 -0
  34. package/dist/check/fixtures/declarations-fixtures.d.ts.map +1 -1
  35. package/dist/check/fixtures/declarations-fixtures.js +2 -42
  36. package/dist/check/fixtures/declarations-fixtures.js.map +1 -1
  37. package/dist/check/fixtures/declared.d.ts.map +1 -1
  38. package/dist/check/fixtures/declared.js +3 -3
  39. package/dist/check/fixtures/declared.js.map +1 -1
  40. package/dist/check/fixtures/domain-events-fixtures.js +1 -1
  41. package/dist/check/fixtures/domain-events-fixtures.js.map +1 -1
  42. package/dist/check/fixtures/fixtures.d.ts.map +1 -1
  43. package/dist/check/fixtures/fixtures.js +2 -0
  44. package/dist/check/fixtures/fixtures.js.map +1 -1
  45. package/dist/check/rules/authz-policy-asked.d.ts +3 -0
  46. package/dist/check/rules/authz-policy-asked.d.ts.map +1 -0
  47. package/dist/check/rules/authz-policy-asked.js +184 -0
  48. package/dist/check/rules/authz-policy-asked.js.map +1 -0
  49. package/dist/check/rules/declarations-role-declared.d.ts.map +1 -1
  50. package/dist/check/rules/declarations-role-declared.js +4 -35
  51. package/dist/check/rules/declarations-role-declared.js.map +1 -1
  52. package/dist/check/rules/events-consumer-idempotent.js +3 -3
  53. package/dist/check/rules/events-consumer-idempotent.js.map +1 -1
  54. package/dist/generate/emit.d.ts.map +1 -1
  55. package/dist/generate/emit.js +2 -14
  56. package/dist/generate/emit.js.map +1 -1
  57. package/dist/generate/kinds/ask-policy-in-generated-use-case.d.ts +9 -0
  58. package/dist/generate/kinds/ask-policy-in-generated-use-case.d.ts.map +1 -0
  59. package/dist/generate/kinds/ask-policy-in-generated-use-case.js +102 -0
  60. package/dist/generate/kinds/ask-policy-in-generated-use-case.js.map +1 -0
  61. package/dist/generate/kinds/assert-declares-its-name.d.ts +9 -0
  62. package/dist/generate/kinds/assert-declares-its-name.d.ts.map +1 -0
  63. package/dist/generate/kinds/assert-declares-its-name.js +16 -0
  64. package/dist/generate/kinds/assert-declares-its-name.js.map +1 -0
  65. package/dist/generate/kinds/command-context.d.ts +12 -0
  66. package/dist/generate/kinds/command-context.d.ts.map +1 -0
  67. package/dist/generate/kinds/command-context.js +18 -0
  68. package/dist/generate/kinds/command-context.js.map +1 -0
  69. package/dist/generate/kinds/command-kind.d.ts.map +1 -1
  70. package/dist/generate/kinds/command-kind.js +7 -24
  71. package/dist/generate/kinds/command-kind.js.map +1 -1
  72. package/dist/generate/kinds/command-outputs.d.ts +6 -0
  73. package/dist/generate/kinds/command-outputs.d.ts.map +1 -0
  74. package/dist/generate/kinds/command-outputs.js +13 -0
  75. package/dist/generate/kinds/command-outputs.js.map +1 -0
  76. package/dist/generate/kinds/declares-its-name.d.ts +5 -0
  77. package/dist/generate/kinds/declares-its-name.d.ts.map +1 -0
  78. package/dist/generate/kinds/declares-its-name.js +7 -0
  79. package/dist/generate/kinds/declares-its-name.js.map +1 -0
  80. package/dist/generate/kinds/event-file-of.d.ts +5 -0
  81. package/dist/generate/kinds/event-file-of.d.ts.map +1 -0
  82. package/dist/generate/kinds/event-file-of.js +5 -0
  83. package/dist/generate/kinds/event-file-of.js.map +1 -0
  84. package/dist/generate/kinds/event-handler-kind.d.ts.map +1 -1
  85. package/dist/generate/kinds/event-handler-kind.js +2 -0
  86. package/dist/generate/kinds/event-handler-kind.js.map +1 -1
  87. package/dist/generate/kinds/event-name-reference.d.ts +4 -3
  88. package/dist/generate/kinds/event-name-reference.d.ts.map +1 -1
  89. package/dist/generate/kinds/event-name-reference.js +6 -6
  90. package/dist/generate/kinds/event-name-reference.js.map +1 -1
  91. package/dist/generate/kinds/integration-event-kind.d.ts.map +1 -1
  92. package/dist/generate/kinds/integration-event-kind.js +2 -0
  93. package/dist/generate/kinds/integration-event-kind.js.map +1 -1
  94. package/dist/generate/kinds/policy-kind.d.ts.map +1 -1
  95. package/dist/generate/kinds/policy-kind.js +2 -0
  96. package/dist/generate/kinds/policy-kind.js.map +1 -1
  97. package/dist/generate/kinds/query-context.d.ts +9 -0
  98. package/dist/generate/kinds/query-context.d.ts.map +1 -0
  99. package/dist/generate/kinds/query-context.js +27 -0
  100. package/dist/generate/kinds/query-context.js.map +1 -0
  101. package/dist/generate/kinds/query-kind.d.ts.map +1 -1
  102. package/dist/generate/kinds/query-kind.js +16 -52
  103. package/dist/generate/kinds/query-kind.js.map +1 -1
  104. package/dist/generate/kinds/query-outputs.d.ts +8 -0
  105. package/dist/generate/kinds/query-outputs.d.ts.map +1 -0
  106. package/dist/generate/kinds/query-outputs.js +20 -0
  107. package/dist/generate/kinds/query-outputs.js.map +1 -0
  108. package/dist/generate/kinds/reader-file.d.ts +8 -0
  109. package/dist/generate/kinds/reader-file.d.ts.map +1 -0
  110. package/dist/generate/kinds/reader-file.js +9 -0
  111. package/dist/generate/kinds/reader-file.js.map +1 -0
  112. package/dist/generate/mark-policy-questions.d.ts +10 -0
  113. package/dist/generate/mark-policy-questions.d.ts.map +1 -0
  114. package/dist/generate/mark-policy-questions.js +76 -0
  115. package/dist/generate/mark-policy-questions.js.map +1 -0
  116. package/dist/generate/permission-pattern.d.ts +4 -0
  117. package/dist/generate/permission-pattern.d.ts.map +1 -0
  118. package/dist/generate/permission-pattern.js +7 -0
  119. package/dist/generate/permission-pattern.js.map +1 -0
  120. package/dist/generate/refined-by-policy.d.ts +4 -0
  121. package/dist/generate/refined-by-policy.d.ts.map +1 -0
  122. package/dist/generate/refined-by-policy.js +9 -0
  123. package/dist/generate/refined-by-policy.js.map +1 -0
  124. package/dist/generate/rendered.d.ts +5 -0
  125. package/dist/generate/rendered.d.ts.map +1 -0
  126. package/dist/generate/rendered.js +18 -0
  127. package/dist/generate/rendered.js.map +1 -0
  128. package/dist/generate/wire.d.ts.map +1 -1
  129. package/dist/generate/wire.js +3 -25
  130. package/dist/generate/wire.js.map +1 -1
  131. package/dist/generate/wirings.d.ts +8 -0
  132. package/dist/generate/wirings.d.ts.map +1 -0
  133. package/dist/generate/wirings.js +28 -0
  134. package/dist/generate/wirings.js.map +1 -0
  135. package/dist/init/copilot-instruction.d.ts +6 -0
  136. package/dist/init/copilot-instruction.d.ts.map +1 -0
  137. package/dist/init/copilot-instruction.js +15 -0
  138. package/dist/init/copilot-instruction.js.map +1 -0
  139. package/dist/init/files/guidance-files.d.ts +1 -0
  140. package/dist/init/files/guidance-files.d.ts.map +1 -1
  141. package/dist/init/files/guidance-files.js +4 -3
  142. package/dist/init/files/guidance-files.js.map +1 -1
  143. package/dist/init/files/layer-rules.d.ts +3 -0
  144. package/dist/init/files/layer-rules.d.ts.map +1 -0
  145. package/dist/init/files/layer-rules.js +11 -0
  146. package/dist/init/files/layer-rules.js.map +1 -0
  147. package/dist/init/files/pipeline-files.d.ts.map +1 -1
  148. package/dist/init/files/pipeline-files.js +2 -0
  149. package/dist/init/files/pipeline-files.js.map +1 -1
  150. package/dist/init/json-object.d.ts +3 -0
  151. package/dist/init/json-object.d.ts.map +1 -0
  152. package/dist/init/json-object.js +12 -0
  153. package/dist/init/json-object.js.map +1 -0
  154. package/dist/init/manifest/versions.js +24 -24
  155. package/dist/init/run-init.d.ts.map +1 -1
  156. package/dist/init/run-init.js +4 -0
  157. package/dist/init/run-init.js.map +1 -1
  158. package/dist/init/write-agent-settings.d.ts.map +1 -1
  159. package/dist/init/write-agent-settings.js +3 -10
  160. package/dist/init/write-agent-settings.js.map +1 -1
  161. package/dist/init/write-copilot-instructions.d.ts +7 -0
  162. package/dist/init/write-copilot-instructions.d.ts.map +1 -0
  163. package/dist/init/write-copilot-instructions.js +16 -0
  164. package/dist/init/write-copilot-instructions.js.map +1 -0
  165. package/dist/init/write-copilot-settings.d.ts +8 -0
  166. package/dist/init/write-copilot-settings.d.ts.map +1 -0
  167. package/dist/init/write-copilot-settings.js +36 -0
  168. package/dist/init/write-copilot-settings.js.map +1 -0
  169. package/dist/markers/index.d.ts +1 -0
  170. package/dist/markers/index.d.ts.map +1 -1
  171. package/dist/markers/index.js +1 -0
  172. package/dist/markers/index.js.map +1 -1
  173. package/dist/markers/replace-in-region.d.ts +10 -0
  174. package/dist/markers/replace-in-region.d.ts.map +1 -0
  175. package/dist/markers/replace-in-region.js +30 -0
  176. package/dist/markers/replace-in-region.js.map +1 -0
  177. package/dist/sdk/agent-instruction.d.ts +1 -1
  178. package/dist/sdk/agent-instruction.js +1 -1
  179. package/dist/sdk/instruct-agents.d.ts +1 -1
  180. package/dist/sdk/instruct-agents.d.ts.map +1 -1
  181. package/dist/sdk/instruct-agents.js +12 -8
  182. package/dist/sdk/instruct-agents.js.map +1 -1
  183. package/dist/version.d.ts +1 -1
  184. package/dist/version.js +1 -1
  185. package/package.json +24 -3
  186. package/templates/command/handler.declared.ts.tpl +29 -0
  187. package/templates/command/handler.spec.buses.ts.tpl +24 -1
  188. package/templates/command/handler.ts.tpl +29 -0
  189. package/templates/command/wiring.manual.tpl +2 -2
  190. package/templates/command/wiring.tsyringe.tpl +5 -2
  191. package/templates/event-handler/event-handler.declared.ts.tpl +1 -1
  192. package/templates/init/AGENTS.md.tpl +46 -0
  193. package/templates/init/CLAUDE.md.tpl +2 -45
  194. package/templates/init/README.md.tpl +1 -1
  195. package/templates/init/rules/application.md.tpl +1 -1
  196. package/templates/integration-event/publisher.declared.ts.tpl +1 -1
  197. package/templates/pipeline/github/workflows/copilot-setup-steps.yml +26 -0
  198. package/templates/pipeline/package-scripts.json +1 -1
  199. package/templates/presets/identity/context/application/integration/publishers/account-deactivated.publisher.ts.tpl +1 -1
  200. package/templates/presets/identity/context/application/integration/publishers/delegation-granted.publisher.ts.tpl +1 -1
  201. package/templates/presets/identity/context/application/integration/publishers/delegation-revoked.publisher.ts.tpl +1 -1
  202. package/templates/presets/identity/context/application/integration/publishers/member-joined.publisher.ts.tpl +1 -1
  203. package/templates/presets/identity/context/application/integration/publishers/member-removed.publisher.ts.tpl +1 -1
  204. package/templates/presets/identity/context/application/integration/publishers/member-role-changed.publisher.ts.tpl +1 -1
  205. package/templates/presets/identity/context/application/integration/publishers/organisation-opened.publisher.ts.tpl +1 -1
  206. package/templates/query/handler.declared.ts.tpl +19 -0
  207. package/templates/query/handler.spec.buses.ts.tpl +21 -0
  208. package/templates/query/handler.ts.tpl +19 -0
  209. package/templates/query/wiring.manual.tpl +1 -1
  210. package/templates/query/wiring.tsyringe.tpl +4 -1
@@ -1,6 +1,11 @@
1
1
  import { describe, expect, it } from '{{tests.module}}';
2
2
  {{#if access.protected}}
3
+ {{#if access.policy}}
4
+ import { AuthorizationMap, PolicyAccess, RoleBasedAuthorizer, authorizationMiddleware, requires } from '@ddd-ts-kit/auth';
5
+ {{/if}}
6
+ {{#unless access.policy}}
3
7
  import { AuthorizationMap, RoleBasedAuthorizer, authorizationMiddleware, requires } from '@ddd-ts-kit/auth';
8
+ {{/unless}}
4
9
  import { anActor } from '@ddd-ts-kit/auth/testing';
5
10
  {{/if}}
6
11
  import { createTestBuses } from '@ddd-ts-kit/testing';
@@ -13,12 +18,22 @@ import type { {{name.pascal}}Result } from '{{alias.context}}/application/querie
13
18
  import { Fake{{name.pascal}}Reader } from '{{alias.context}}/test/fakes/{{name.kebab}}-reader.fake{{alias.ext}}';
14
19
  {{#if access.protected}}
15
20
 
21
+ {{#if access.policy}}
22
+ const authorizer = new RoleBasedAuthorizer({ roles: { holder: [{{context.camel}}Permissions['{{access.permission}}']] } });
23
+
24
+ const holders = authorizationMiddleware({
25
+ authorizer,
26
+ map: AuthorizationMap.of(requires({{name.pascal}}Query, {{context.camel}}Permissions['{{access.permission}}'])),
27
+ });
28
+ {{/if}}
29
+ {{#unless access.policy}}
16
30
  const holders = authorizationMiddleware({
17
31
  authorizer: new RoleBasedAuthorizer({
18
32
  roles: { holder: [{{context.camel}}Permissions['{{access.permission}}']] },
19
33
  }),
20
34
  map: AuthorizationMap.of(requires({{name.pascal}}Query, {{context.camel}}Permissions['{{access.permission}}'])),
21
35
  });
36
+ {{/unless}}
22
37
 
23
38
  const holder = anActor().withRole('holder').build();
24
39
  {{/if}}
@@ -47,8 +62,14 @@ describe('{{name.title}}', () => {
47
62
  });
48
63
 
49
64
  function arrange(answer: {{name.pascal}}Result) {
65
+ {{#if access.policy}}
66
+ const { queryBus, clock } = createTestBuses();
67
+ const handler = new {{name.pascal}}Handler(new Fake{{name.pascal}}Reader(answer), new PolicyAccess({ authorizer, clock }));
68
+ {{/if}}
69
+ {{#unless access.policy}}
50
70
  const { queryBus } = createTestBuses();
51
71
  const handler = new {{name.pascal}}Handler(new Fake{{name.pascal}}Reader(answer));
72
+ {{/unless}}
52
73
 
53
74
  return queryBus{{spec.guard}}.register({{name.pascal}}Query, handler);
54
75
  }
@@ -1,12 +1,31 @@
1
+ {{#if access.policy}}
2
+ import type { Access } from '@ddd-ts-kit/auth';
3
+ {{/if}}
1
4
  import type { QueryHandler } from '@ddd-ts-kit/kernel';
5
+ {{#if access.policy}}
6
+ {{access.useCasePermissionsImport}}
7
+ {{/if}}
2
8
  import type { {{name.pascal}}Reader } from '{{alias.context}}/application/ports/{{name.kebab}}-reader.port{{alias.ext}}';
3
9
  import type { {{name.pascal}}Query } from '{{alias.context}}/application/queries/{{name.kebab}}/{{name.kebab}}.query{{alias.ext}}';
4
10
  import type { {{name.pascal}}Result } from '{{alias.context}}/application/queries/{{name.kebab}}/{{name.kebab}}.result{{alias.ext}}';
5
11
 
6
12
  export class {{name.pascal}}Handler implements QueryHandler<{{name.pascal}}Query> {
13
+ {{#if access.policy}}
14
+ constructor(
15
+ private readonly reader: {{name.pascal}}Reader,
16
+ private readonly access: Access,
17
+ ) {}
18
+ {{/if}}
19
+ {{#unless access.policy}}
7
20
  constructor(private readonly reader: {{name.pascal}}Reader) {}
21
+ {{/unless}}
8
22
 
9
23
  async execute(query: {{name.pascal}}Query): Promise<{{name.pascal}}Result> {
24
+ {{#if access.policy}}
25
+ // TODO(domain): a policy refines {{access.reference}}: ask it about the element "{{name.words}}" reads once it is read, in place of `query`.
26
+ await this.access.authorize(query.actor, {{access.reference}}, query);
27
+
28
+ {{/if}}
10
29
  // TODO(domain): narrow what is read to what the asker may see: ask `Access.scope(query.actor, permission, '<type>')` for the scope and hand it to the reader, never filter in memory after loading; a query never changes state.
11
30
  return this.reader.read(query);
12
31
  }
@@ -7,6 +7,6 @@ import { InMemory{{name.pascal}}Reader } from '{{alias.context}}/infrastructure/
7
7
  @@registrations
8
8
  const {{name.camel}}Reader = platform.adapter(new InMemory{{name.pascal}}Reader(), { kind: 'repository', context: '{{context.kebab}}' });
9
9
 
10
- platform.queries.register({{name.pascal}}Query, new {{name.pascal}}Handler({{name.camel}}Reader), { context: '{{context.kebab}}' });
10
+ platform.queries.register({{name.pascal}}Query, new {{name.pascal}}Handler({{name.camel}}Reader{{#if access.policy}}, platform.access{{/if}}), { context: '{{context.kebab}}' });
11
11
  @@authorization
12
12
  {{access.manualDeclaration}}
@@ -1,4 +1,7 @@
1
1
  @@imports
2
+ {{#if access.policy}}
3
+ import { Access } from '@ddd-ts-kit/auth';
4
+ {{/if}}
2
5
  {{access.permissionsImport}}
3
6
  import { {{name.pascal}}Reader } from '{{alias.context}}/application/ports/{{name.kebab}}-reader.port{{alias.ext}}';
4
7
  import { {{name.pascal}}Handler } from '{{alias.context}}/application/queries/{{name.kebab}}/{{name.kebab}}.handler{{alias.ext}}';
@@ -6,4 +9,4 @@ import { {{name.pascal}}Query } from '{{alias.context}}/application/queries/{{na
6
9
  import { InMemory{{name.pascal}}Reader } from '{{alias.context}}/infrastructure/persistence/{{reader.file}}{{alias.ext}}';
7
10
  @@registrations
8
11
  builder.bind({{name.pascal}}Reader).toClass(InMemory{{name.pascal}}Reader).as('repository');
9
- builder.query({{name.pascal}}Query){{access.declaration}}.handledBy({{name.pascal}}Handler, [{{name.pascal}}Reader]);
12
+ builder.query({{name.pascal}}Query){{access.declaration}}.handledBy({{name.pascal}}Handler, [{{name.pascal}}Reader{{#if access.policy}}, Access{{/if}}]);