ddd-ts-kit 0.18.0 → 0.20.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 (95) hide show
  1. package/CHANGELOG.md +1294 -0
  2. package/README.fr.md +11 -6
  3. package/README.md +9 -5
  4. package/dist/check/authz/is-granted.d.ts +8 -0
  5. package/dist/check/authz/is-granted.d.ts.map +1 -0
  6. package/dist/check/authz/is-granted.js +11 -0
  7. package/dist/check/authz/is-granted.js.map +1 -0
  8. package/dist/check/authz/permission-sets.d.ts +13 -0
  9. package/dist/check/authz/permission-sets.d.ts.map +1 -0
  10. package/dist/check/authz/permission-sets.js +19 -0
  11. package/dist/check/authz/permission-sets.js.map +1 -0
  12. package/dist/check/catalogue/architecture-rules.d.ts.map +1 -1
  13. package/dist/check/catalogue/architecture-rules.js +4 -0
  14. package/dist/check/catalogue/architecture-rules.js.map +1 -1
  15. package/dist/check/catalogue/default-severities.d.ts.map +1 -1
  16. package/dist/check/catalogue/default-severities.js +1 -0
  17. package/dist/check/catalogue/default-severities.js.map +1 -1
  18. package/dist/check/explain/authz-docs.d.ts.map +1 -1
  19. package/dist/check/explain/authz-docs.js +15 -0
  20. package/dist/check/explain/authz-docs.js.map +1 -1
  21. package/dist/check/explain/events-docs.d.ts.map +1 -1
  22. package/dist/check/explain/events-docs.js +13 -2
  23. package/dist/check/explain/events-docs.js.map +1 -1
  24. package/dist/check/fixtures/authz-granted-fixtures.d.ts +3 -0
  25. package/dist/check/fixtures/authz-granted-fixtures.d.ts.map +1 -0
  26. package/dist/check/fixtures/authz-granted-fixtures.js +71 -0
  27. package/dist/check/fixtures/authz-granted-fixtures.js.map +1 -0
  28. package/dist/check/fixtures/event-sourcing-fixtures.js +3 -3
  29. package/dist/check/fixtures/event-sourcing-fixtures.js.map +1 -1
  30. package/dist/check/fixtures/events-fixtures.d.ts.map +1 -1
  31. package/dist/check/fixtures/events-fixtures.js +30 -1
  32. package/dist/check/fixtures/events-fixtures.js.map +1 -1
  33. package/dist/check/fixtures/fixtures.d.ts.map +1 -1
  34. package/dist/check/fixtures/fixtures.js +2 -0
  35. package/dist/check/fixtures/fixtures.js.map +1 -1
  36. package/dist/check/fixtures/language-fixtures.d.ts.map +1 -1
  37. package/dist/check/fixtures/language-fixtures.js +1 -1
  38. package/dist/check/fixtures/language-fixtures.js.map +1 -1
  39. package/dist/check/fixtures/vocabulary-fixtures.d.ts.map +1 -1
  40. package/dist/check/fixtures/vocabulary-fixtures.js +4 -0
  41. package/dist/check/fixtures/vocabulary-fixtures.js.map +1 -1
  42. package/dist/check/language/declared-vocabularies.d.ts.map +1 -1
  43. package/dist/check/language/declared-vocabularies.js +8 -28
  44. package/dist/check/language/declared-vocabularies.js.map +1 -1
  45. package/dist/check/rules/authz-granted.d.ts +11 -0
  46. package/dist/check/rules/authz-granted.d.ts.map +1 -0
  47. package/dist/check/rules/authz-granted.js +45 -0
  48. package/dist/check/rules/authz-granted.js.map +1 -0
  49. package/dist/check/rules/events-name-declared-once.d.ts +3 -0
  50. package/dist/check/rules/events-name-declared-once.d.ts.map +1 -0
  51. package/dist/check/rules/events-name-declared-once.js +51 -0
  52. package/dist/check/rules/events-name-declared-once.js.map +1 -0
  53. package/dist/check/text/depth-at.d.ts +3 -0
  54. package/dist/check/text/depth-at.d.ts.map +1 -0
  55. package/dist/check/text/depth-at.js +11 -0
  56. package/dist/check/text/depth-at.js.map +1 -0
  57. package/dist/commands/generate.js +2 -0
  58. package/dist/commands/generate.js.map +1 -1
  59. package/dist/generate/access-vars.d.ts.map +1 -1
  60. package/dist/generate/access-vars.js +5 -0
  61. package/dist/generate/access-vars.js.map +1 -1
  62. package/dist/generate/grant-permission.d.ts +9 -0
  63. package/dist/generate/grant-permission.d.ts.map +1 -0
  64. package/dist/generate/grant-permission.js +111 -0
  65. package/dist/generate/grant-permission.js.map +1 -0
  66. package/dist/generate/kind.d.ts +2 -0
  67. package/dist/generate/kind.d.ts.map +1 -1
  68. package/dist/generate/kinds/command-kind.js +1 -1
  69. package/dist/generate/kinds/command-kind.js.map +1 -1
  70. package/dist/generate/kinds/file-upload-kind.js +2 -2
  71. package/dist/generate/kinds/file-upload-kind.js.map +1 -1
  72. package/dist/generate/kinds/query-kind.js +2 -2
  73. package/dist/generate/kinds/query-kind.js.map +1 -1
  74. package/dist/generate/shared-writes.d.ts.map +1 -1
  75. package/dist/generate/shared-writes.js +10 -3
  76. package/dist/generate/shared-writes.js.map +1 -1
  77. package/dist/init/manifest/versions.js +24 -24
  78. package/dist/init/run-init.js +1 -1
  79. package/dist/init/run-init.js.map +1 -1
  80. package/dist/progress/format-progress.js +4 -0
  81. package/dist/progress/format-progress.js.map +1 -1
  82. package/dist/progress/progress.d.ts +2 -0
  83. package/dist/progress/progress.d.ts.map +1 -1
  84. package/dist/progress/read-progress.js +1 -0
  85. package/dist/progress/read-progress.js.map +1 -1
  86. package/dist/progress/read-slices.d.ts +5 -1
  87. package/dist/progress/read-slices.d.ts.map +1 -1
  88. package/dist/progress/read-slices.js +17 -7
  89. package/dist/progress/read-slices.js.map +1 -1
  90. package/dist/version.d.ts +1 -1
  91. package/dist/version.js +1 -1
  92. package/package.json +6 -4
  93. package/templates/init/rules/application.md.tpl +2 -2
  94. package/templates/init/rules/domain.md.tpl +1 -1
  95. package/templates/pipeline/package-scripts.json +1 -1
package/README.fr.md CHANGED
@@ -1,5 +1,5 @@
1
1
  [English](README.md) · **Français**
2
- <!-- translation-of: README.md sha256:bed804ca4ed40c91 -->
2
+ <!-- translation-of: README.md sha256:18321b84fdc49821 -->
3
3
 
4
4
  # ddd-ts-kit
5
5
 
@@ -30,7 +30,7 @@ Aucune dépendance d'exécution. Node 22.12 ou ultérieur.
30
30
  npx ddd-ts-kit init
31
31
  npx ddd-ts-kit generate context billing --classification core --term "Invoice=A request for payment"
32
32
  npx ddd-ts-kit generate aggregate billing Invoice
33
- npx ddd-ts-kit generate command billing IssueInvoice --aggregate Invoice --permission invoice.issue --term "Issue=To make an invoice final"
33
+ npx ddd-ts-kit generate command billing IssueInvoice --aggregate Invoice --permission invoice.issue --grant accountant --term "Issue=To make an invoice final"
34
34
  npx ddd-ts-kit generate route billing IssueInvoice --method POST --path /invoices
35
35
  npx ddd-ts-kit check
36
36
  ```
@@ -642,12 +642,12 @@ Next, in this order: the language of the context first, then the business decisi
642
642
  | `domain-service` | `<context> <Name>` | service, *spec* |
643
643
  | `state-machine` | `<context> <Aggregate> [--value <state>]... [--transition "<intention>:<from>[,<from>]...[><to>]"]...` | le vocabulaire `<Aggregate>Status` (créé depuis `--value`, deux états au moins, ou complété des valeurs qui lui manquent), `domain/state-machines/<aggregate>.state-machine.ts` (`<aggregate>Lifecycle` : chaque valeur un état, la première initiale, les transitions demandées, un `TODO(domain)` pour le refus de l'erreur du concept) et `test/unit/<aggregate>.state-machine.spec.ts` (chaque transition là où elle mène, un refus depuis un état qu'elle ne quitte pas) ; c'est à l'agrégat de l'utiliser |
644
644
  | `repository` | `<context> <Aggregate> [--tenant-scoped]` | le port `domain/repositories/<name>.repository.ts` (`abstract class <Name>Repository extends Repository<<Name>>`), l'adaptateur de l'ORM du projet (qui `implements` le port) avec son *mapper* et sa table (ou son modèle), un *fake*, une *spec* `repositoryContract` exécutée sur les deux, l'enregistrement |
645
- | `command` | `<context> <UseCaseName> (--permission <aggregate>.<action> \| --public) [--aggregate <Name>]` | `<use-case>.command.ts` sur `AuthorizedCommand` (simple `Command` quand elle est publique), `<use-case>.handler.ts` (il construit l'agrégat, le sauvegarde et répond : les événements partent avec la sauvegarde), une *spec* par le bus avec le refus d'un acteur à qui manque la permission, l'enregistrement avec `.requires(...)` ou `.public()` (et le *repository* s'il manque). Une commande générée répond `void` ou l'identifiant de son agrégat, si bien qu'aucun `<use-case>.result.ts` n'est écrit |
646
- | `query` | `<context> <UseCaseName> (--permission <aggregate>.<action> \| --public) [--search]` | `<use-case>.query.ts` sur `AuthorizedQuery` (simple `Query` quand elle est publique), `<use-case>.result.ts`, `<use-case>.handler.ts`, le port de lecture `application/ports/<use-case>-reader.port.ts` (une classe abstraite), son adaptateur en mémoire, un *fake*, une *spec*, l'enregistrement sur le bus de requêtes. Avec `--search` (demande `--permission`) : une `PageRequest` du kernel dans la requête, l'élément, le tri et `Page<Item>` dans le fichier de résultat, un gestionnaire qui demande `Access.scope` et remet le périmètre au port de lecture, un lecteur en mémoire qui pagine par décalage ou par curseur |
645
+ | `command` | `<context> <UseCaseName> (--permission <aggregate>.<action> [--grant <role>] \| --public) [--aggregate <Name>]` | `<use-case>.command.ts` sur `AuthorizedCommand` (simple `Command` quand elle est publique), `<use-case>.handler.ts` (il construit l'agrégat, le sauvegarde et répond : les événements partent avec la sauvegarde), une *spec* par le bus avec le refus d'un acteur à qui manque la permission, l'enregistrement avec `.requires(...)` ou `.public()` (et le *repository* s'il manque). Une commande générée répond `void` ou l'identifiant de son agrégat, si bien qu'aucun `<use-case>.result.ts` n'est écrit |
646
+ | `query` | `<context> <UseCaseName> (--permission <aggregate>.<action> [--grant <role>] \| --public) [--search]` | `<use-case>.query.ts` sur `AuthorizedQuery` (simple `Query` quand elle est publique), `<use-case>.result.ts`, `<use-case>.handler.ts`, le port de lecture `application/ports/<use-case>-reader.port.ts` (une classe abstraite), son adaptateur en mémoire, un *fake*, une *spec*, l'enregistrement sur le bus de requêtes. Avec `--search` (demande `--permission`) : une `PageRequest` du kernel dans la requête, l'élément, le tri et `Page<Item>` dans le fichier de résultat, un gestionnaire qui demande `Access.scope` et remet le périmètre au port de lecture, un lecteur en mémoire qui pagine par décalage ou par curseur |
647
647
  | `port` | `<context> <Name>` | `application/ports/<name>.port.ts`, une classe abstraite, et son *fake* |
648
648
  | `route` | `<context> <UseCaseName> --method <GET\|POST\|PUT\|PATCH\|DELETE> --path <p> [--command\|--query] [--group <Name>] [--mapper] [--serializer] [--cache public\|private\|no-store]` | sous `"stack.routes": "controllers"` : une classe contrôleur dans `presentation/http/<resource>/<use-case>/` (la ressource est le premier segment du chemin), qui dépend de `CommandBus` ou de `QueryBus`, derrière le groupe de routes de sa ressource, écrit avec elle quand il est nouveau (`<resource>.routes.ts` : préfixe, étiquette, `Authenticated`) ; un cas d'usage public ne se tient dans aucun groupe et dit `guards: [Public]` ; avec class-validator, une classe par fichier (`<use-case>.params.ts`, `.body.ts`, `.answer.ts`, `.accepted.ts`, `.line.ts`) ; `--mapper` et `--serializer` ajoutent un *mapper* de requête HTTP et un sérialiseur que reçoit le contrôleur ; une *spec* ; aucun enregistrement dans un projet déclaré, un contrôleur construit à la main dans `<context>.routes.ts` (le fichier de module en câblage manuel) dans un projet explicite. Sous `"functions"` : une fonction `defineRoute`, sa *spec*, son enregistrement dans `<context>.routes.ts`, et des classes `<use-case>-<role>.dto.ts` |
649
649
  | `controller` | les mêmes arguments que `route` | la classe contrôleur, quoi que dise `stack.routes` : pour un projet de routes en fonctions qui écrit sa prochaine route comme une classe. `--cache` écrit sa politique de cache : `private` (un `GET` d'un appelant, `max-age=0`, `must-revalidate`, `ETag` fort), `public` (un `GET` d'un cas d'usage public, `max-age` 1m, `s-maxage` 5m, étiqueté avec les ressources de son chemin), `no-store` ; refusé sur une écriture, et `public` derrière un groupe de routes |
650
- | `file-upload` | `<context> <UseCaseName> --path <p> (--permission <aggregate>.<action> \| --public) [--method POST\|PUT] [--group <Name>]` | un téléversement : un contrôleur qui déclare le fichier qu'il reçoit (sa taille et ses types de média dans le contrat, vérifiés au fil du flux), la commande qui le porte comme un `FileUpload`, mis en attente par le bus de commandes avant la transaction, le gestionnaire qui l'enregistre et le promeut avec la validation (commit), et leurs *specs*. Refusé sans `stack.storage` ou sans *stack* HTTP, avec le `init --force --storage local` à lancer |
650
+ | `file-upload` | `<context> <UseCaseName> --path <p> (--permission <aggregate>.<action> [--grant <role>] \| --public) [--method POST\|PUT] [--group <Name>]` | un téléversement : un contrôleur qui déclare le fichier qu'il reçoit (sa taille et ses types de média dans le contrat, vérifiés au fil du flux), la commande qui le porte comme un `FileUpload`, mis en attente par le bus de commandes avant la transaction, le gestionnaire qui l'enregistre et le promeut avec la validation (commit), et leurs *specs*. Refusé sans `stack.storage` ou sans *stack* HTTP, avec le `init --force --storage local` à lancer |
651
651
  | `route-group` (`group`) | `<context> <Name> [--prefix <path>] [--group <ParentName>] [--public \| --role <role>]` | `presentation/http/<name>.routes.ts` : une classe vide qui porte `@RouteGroup`, derrière `Authenticated` sauf si `--public` ou `--role` dit autre chose (`HasRole(Role.Admin)`, le rôle lu dans le vocabulaire de la plateforme, `<platformDir>/auth/role.ts`, qui le reçoit s'il ne le contient pas) ; avec `--group`, il affine ce groupe et en hérite |
652
652
  | `guard` | `<context> <Name>` | `presentation/http/guards/<name>.guard.ts` : une classe de garde déclarée à remplir, et sa *spec* |
653
653
  | `representation` | `<context> <UseCase> <xml\|csv\|media/type>[,...]` | ajoute `produces` au `@Controller` du cas d'usage, et `consumes: ['application/xml']` à celui qui reçoit un corps quand XML est demandé ; dit quand CSV a besoin d'une page ou d'une liste en flux, et quand `stack.representations` n'est pas `negotiated` |
@@ -739,7 +739,10 @@ Next, in this order: the language of the context first, then the business decisi
739
739
  - **Refus par défaut.** `command` et `query` sont refusés sans `--permission` ou `--public`. Une
740
740
  nouvelle permission rejoint `<context>.permissions.ts` ; ses mots sont vérifiés dans le
741
741
  glossaire comme tout autre nom. Avec `--authz rebac`, l'exigence nomme le contexte comme sa
742
- ressource, un point de départ à remplacer par l'élément sur lequel porte le droit.
742
+ ressource, un point de départ à remplacer par l'élément sur lequel porte le droit. Avec
743
+ `--authz rbac`, `--grant <role>` accorde la permission au rôle dans `platform/auth/roles.ts`
744
+ (le rôle rejoint `role.ts` s'il est nouveau) ; sans lui, une étape `next` dit que
745
+ l'attribution reste à faire (`authz/granted`).
743
746
  - `route` remet `actorOf(context.principal)` à un cas d'usage protégé et pose `security` (le
744
747
  schéma de `--authn`, ou `false` pour un cas d'usage public). `integration-handler` porte
745
748
  `systemActor('<context>.<name>')` pour la commande qu'il construit ; derrière un *broker*, il
@@ -1265,6 +1268,7 @@ règle.
1265
1268
  | `test/no-mocks` | `vi.mock`, `vi.fn`, `vi.spyOn`, leurs jumeaux `jest`, ou une bibliothèque de *mocks* dans les tests d'un contexte |
1266
1269
  | `test/builder-required` | un agrégat sans `test/builders/<name>.builder.ts` |
1267
1270
  | `events/name-format` | un nom d'événement qui n'est pas `<context>.<aggregate>.<fact>` en kebab-case avec le bon contexte |
1271
+ | `events/name-declared-once` | une classe de `domain/events/` sans `static readonly eventName`, ou dont le `readonly name` écrit le nom une seconde fois au lieu de le lire |
1268
1272
  | `events/defined-in-published-language` | `defineIntegrationEvent` hors d'un langage publié, sans charge utile, deux fois pour une même version ; un événement décrit à la main |
1269
1273
  | `language/glossary-term` | une classe du modèle nommée avec un mot que le glossaire de son contexte ne définit pas ; un glossaire vide ; sous `"stack.refusals": "factories"`, une classe d'erreur de `domain/errors/` aussi |
1270
1274
  | `language/declared-vocabulary` | une chaîne littérale dont la valeur est une valeur d'un vocabulaire fermé que le projet déclare (un objet `as const` exporté avec le type union de son nom, un ensemble de permissions de `definePermissions`), hors du fichier qui le déclare, à l'endroit qui parle son langage (son contexte ; la plateforme et les groupes de routes pour la plateforme ; partout pour un identifiant de permission ou le noyau partagé) ; les tests, les langages publiés et le schéma de relations ne sont pas jugés ; sous `"stack.literals": "named"` |
@@ -1290,6 +1294,7 @@ règle.
1290
1294
  | `config/valid` | un amont, une classification, une relation, un identifiant de règle, un mode de `guard` ou un `importExtension` inconnu ; un contexte absent du disque ou de la configuration ; une limite de `commit` qui n'est pas un entier positif |
1291
1295
  | `config/suppression-needs-reason` | une désactivation sans identifiant de règle ou sans raison (gardée comme alias à côté de `governance/recorded-deviation`, qui juge la raison) |
1292
1296
  | `authz/declared` | dans un fichier de module, `builder.command(X)` ou `builder.query(X)` sans `.requires(` ni `.public(` dans sa chaîne, sauf si la classe du message porte `@Requires` ou `@Public` de `@ddd-ts-kit/kernel/declarations` ; en câblage manuel ou nest, une classe de commande ou de requête absente de tous les `requires(X, ...)` et `publicUseCase(X)` du fichier de module et de `application/authorization/` ; un `defineRoute` sans `security` (le type de la route le refuse déjà, et une liste vide aussi : c'est le filet au niveau du texte pour une définition construite de façon lâche) ; dans le style déclaré, la classe exportée d'un fichier `*.command.ts` ou `*.query.ts` qui ne porte ni `@Requires` ni `@Public` |
1297
+ | `authz/granted` | avec `stack.authz` `rbac`, une permission du `definePermissions` d'un contexte que ni `platform/auth/roles.ts` ni `platform/auth/signed-in-grants.ts` n'accorde par son nom (par l'entrée de son ensemble, son identifiant ou `<contexte>:*`) ; le `*` du super-administrateur ne compte pas (un avertissement) |
1293
1298
  | `authz/in-application` | `presentation/` : un test sur les rôles, `isAdmin`, l'import d'un autorisateur ou de `Access` ; `infrastructure/` : `authorize(` ou `check(` sur un autorisateur ou un accès, `ForbiddenError` ; `domain/` : tout import de `@ddd-ts-kit/auth`, des types d'acteur du kernel (`Actor`, `ActorContext`, `Session`, `ExecutionContext`, les messages autorisés), une lecture de `.roles` ou `.permissions` sur un acteur. La glu de requête HTTP de `@ddd-ts-kit/auth` (`actorOf`, `sessionOf`, `resolveSession`, `SessionAuthenticator`) est libre dans `presentation/`. `presentation/` et `infrastructure/` : l'import de `Requires`, `Public` ou `Policy` depuis `@ddd-ts-kit/kernel/declarations`, ou des ports `Access` et `PolicyAccess` depuis `@ddd-ts-kit/auth` ; ils sont libres dans `application/` |
1294
1299
  | `authz/actor-explicit` | dans `domain/` et `application/` : `ActorContext`, `ExecutionScope` (comme type ou comme valeur : la classe est le jeton d'une liste de dépendances), `AsyncLocalStorageExecutionScope`, `ScopedActorContext`, `AsyncLocalStorage` ; `.current()` ou `.require()` sur un contexte d'acteur ou sur quelque chose nommé `scope`, `scopes` ou `...executionScope` ; un import de `stampCreation`, `stampUpdate` ou `tenantScopeOf` |
1295
1300
  | `authz/fields-by-schema` | sous `application/queries/` : `roles.includes(`, `.some(`, `.every(`, `.find(`, `.indexOf(`, une comparaison avec un `role`, `isAdmin` |
package/README.md CHANGED
@@ -28,7 +28,7 @@ No runtime dependency. Node 22.12 or later.
28
28
  npx ddd-ts-kit init
29
29
  npx ddd-ts-kit generate context billing --classification core --term "Invoice=A request for payment"
30
30
  npx ddd-ts-kit generate aggregate billing Invoice
31
- npx ddd-ts-kit generate command billing IssueInvoice --aggregate Invoice --permission invoice.issue --term "Issue=To make an invoice final"
31
+ npx ddd-ts-kit generate command billing IssueInvoice --aggregate Invoice --permission invoice.issue --grant accountant --term "Issue=To make an invoice final"
32
32
  npx ddd-ts-kit generate route billing IssueInvoice --method POST --path /invoices
33
33
  npx ddd-ts-kit check
34
34
  ```
@@ -622,12 +622,12 @@ Next, in this order: the language of the context first, then the business decisi
622
622
  | `domain-service` | `<context> <Name>` | service, spec |
623
623
  | `state-machine` | `<context> <Aggregate> [--value <state>]... [--transition "<intention>:<from>[,<from>]...[><to>]"]...` | the vocabulary `<Aggregate>Status` (created from `--value`, two states at least, or given the values it misses), `domain/state-machines/<aggregate>.state-machine.ts` (`<aggregate>Lifecycle`: every value a state, the first one initial, the transitions asked, a `TODO(domain)` for the refusal of the concept error) and `test/unit/<aggregate>.state-machine.spec.ts` (each transition where it leads, a refusal from a state it does not leave); the aggregate is left to use it |
624
624
  | `repository` | `<context> <Aggregate> [--tenant-scoped]` | the port `domain/repositories/<name>.repository.ts` (`abstract class <Name>Repository extends Repository<<Name>>`), the adapter of the project's ORM (`implements` the port) with its mapper and table (or model), a fake, one `repositoryContract` spec run on both, registration |
625
- | `command` | `<context> <UseCaseName> (--permission <aggregate>.<action> \| --public) [--aggregate <Name>]` | `<use-case>.command.ts` on `AuthorizedCommand` (plain `Command` when public), `<use-case>.handler.ts` (it builds the aggregate, saves it and answers: the events leave with the save), spec through the bus with the refusal of an actor who lacks the permission, registration with `.requires(...)` or `.public()` (and the repository when missing). A generated command answers `void` or the identifier of its aggregate, so no `<use-case>.result.ts` is written |
626
- | `query` | `<context> <UseCaseName> (--permission <aggregate>.<action> \| --public) [--search]` | `<use-case>.query.ts` on `AuthorizedQuery` (plain `Query` when public), `<use-case>.result.ts`, `<use-case>.handler.ts`, the read port `application/ports/<use-case>-reader.port.ts` (an abstract class), its in-memory adapter, fake, spec, registration on the query bus. With `--search` (needs `--permission`): a kernel `PageRequest` in the query, the item, the sort and `Page<Item>` in the result file, a handler that asks `Access.scope` and hands the scope to the read port, an in-memory reader paging by offset or cursor |
625
+ | `command` | `<context> <UseCaseName> (--permission <aggregate>.<action> [--grant <role>] \| --public) [--aggregate <Name>]` | `<use-case>.command.ts` on `AuthorizedCommand` (plain `Command` when public), `<use-case>.handler.ts` (it builds the aggregate, saves it and answers: the events leave with the save), spec through the bus with the refusal of an actor who lacks the permission, registration with `.requires(...)` or `.public()` (and the repository when missing). A generated command answers `void` or the identifier of its aggregate, so no `<use-case>.result.ts` is written |
626
+ | `query` | `<context> <UseCaseName> (--permission <aggregate>.<action> [--grant <role>] \| --public) [--search]` | `<use-case>.query.ts` on `AuthorizedQuery` (plain `Query` when public), `<use-case>.result.ts`, `<use-case>.handler.ts`, the read port `application/ports/<use-case>-reader.port.ts` (an abstract class), its in-memory adapter, fake, spec, registration on the query bus. With `--search` (needs `--permission`): a kernel `PageRequest` in the query, the item, the sort and `Page<Item>` in the result file, a handler that asks `Access.scope` and hands the scope to the read port, an in-memory reader paging by offset or cursor |
627
627
  | `port` | `<context> <Name>` | `application/ports/<name>.port.ts`, one abstract class, and its fake |
628
628
  | `route` | `<context> <UseCaseName> --method <GET\|POST\|PUT\|PATCH\|DELETE> --path <p> [--command\|--query] [--group <Name>] [--mapper] [--serializer] [--cache public\|private\|no-store]` | under `"stack.routes": "controllers"`: a controller class in `presentation/http/<resource>/<use-case>/` (the resource is the first segment of the path), depending on `CommandBus` or `QueryBus`, behind the route group of its resource, written with it when it is new (`<resource>.routes.ts`: prefix, tag, `Authenticated`); a public use case stands in no group and says `guards: [Public]`; with class-validator one class per file (`<use-case>.params.ts`, `.body.ts`, `.answer.ts`, `.accepted.ts`, `.line.ts`); `--mapper` and `--serializer` add a request mapper and a serializer the controller is given; a spec; no registration in a declared project, a controller built by hand in `<context>.routes.ts` (the module file with hand wiring) in an explicit one. Under `"functions"`: a `defineRoute` function, its spec, its registration in `<context>.routes.ts`, and `<use-case>-<role>.dto.ts` classes |
629
629
  | `controller` | the same arguments as `route` | the controller class, whatever `stack.routes` says: for a project of function routes that writes its next route as a class. `--cache` writes its cache policy: `private` (a `GET` of a caller, `max-age=0`, `must-revalidate`, strong `ETag`), `public` (a `GET` of a public use case, `max-age` 1m, `s-maxage` 5m, tagged with the resources of its path), `no-store`; refused on a write, and `public` behind a route group |
630
- | `file-upload` | `<context> <UseCaseName> --path <p> (--permission <aggregate>.<action> \| --public) [--method POST\|PUT] [--group <Name>]` | an upload: a controller that declares the file it receives (its size and media types in the contract, checked as it streams), the command that carries it as a `FileUpload`, staged by the command bus before the transaction, the handler that records it and promotes it with the commit, and their specs. Refused without `stack.storage` or without an HTTP stack, with the `init --force --storage local` to run |
630
+ | `file-upload` | `<context> <UseCaseName> --path <p> (--permission <aggregate>.<action> [--grant <role>] \| --public) [--method POST\|PUT] [--group <Name>]` | an upload: a controller that declares the file it receives (its size and media types in the contract, checked as it streams), the command that carries it as a `FileUpload`, staged by the command bus before the transaction, the handler that records it and promotes it with the commit, and their specs. Refused without `stack.storage` or without an HTTP stack, with the `init --force --storage local` to run |
631
631
  | `route-group` (`group`) | `<context> <Name> [--prefix <path>] [--group <ParentName>] [--public \| --role <role>]` | `presentation/http/<name>.routes.ts`: an empty class carrying `@RouteGroup`, behind `Authenticated` unless `--public` or `--role` says otherwise (`HasRole(Role.Admin)`, the role read from the vocabulary of the platform, `<platformDir>/auth/role.ts`, which gets it when it does not hold it); with `--group` it refines that group and inherits from it |
632
632
  | `guard` | `<context> <Name>` | `presentation/http/guards/<name>.guard.ts`: a declared guard class to fill, and its spec |
633
633
  | `representation` | `<context> <UseCase> <xml\|csv\|media/type>[,...]` | adds `produces` to the `@Controller` of the use case, and `consumes: ['application/xml']` to one that receives a body when XML is asked; says when CSV needs a page or a streamed list, and when `stack.representations` is not `negotiated` |
@@ -713,7 +713,9 @@ Next, in this order: the language of the context first, then the business decisi
713
713
  - **Deny by default.** `command` and `query` are refused without `--permission` or `--public`. A new
714
714
  permission joins `<context>.permissions.ts`; its words are checked against the glossary like any
715
715
  other name. With `--authz rebac` the requirement names the context as its resource, a starting
716
- point to replace by the element the right bears on.
716
+ point to replace by the element the right bears on. With `--authz rbac`, `--grant <role>` gives
717
+ the permission to the role in `platform/auth/roles.ts` (the role joins `role.ts` when it is
718
+ new); without it, a `next` step says the grant is left to do (`authz/granted`).
717
719
  - `route` hands `actorOf(context.principal)` to a protected use case and sets `security` (the scheme
718
720
  of `--authn`, or `false` for a public one). `integration-handler` carries `systemActor('<context>.<name>')`
719
721
  for the command it builds; behind a broker it listens on the subscriber of its context
@@ -1208,6 +1210,7 @@ const due = handler.isDueNow(new Reminder(new Date('2026-03-01T09:00:00Z'))); //
1208
1210
  | `test/no-mocks` | `vi.mock`, `vi.fn`, `vi.spyOn`, their `jest` twins, or a mocking library in a context's tests |
1209
1211
  | `test/builder-required` | an aggregate without `test/builders/<name>.builder.ts` |
1210
1212
  | `events/name-format` | an event name that is not `<context>.<aggregate>.<fact>` in kebab-case with the right context |
1213
+ | `events/name-declared-once` | a class of `domain/events/` without `static readonly eventName`, or whose `readonly name` writes the name again instead of reading it |
1211
1214
  | `events/defined-in-published-language` | `defineIntegrationEvent` outside a published language, without a payload, twice for one version; an event described by hand |
1212
1215
  | `language/glossary-term` | a class of the model named with a word the glossary of its context does not define; an empty glossary; under `"stack.refusals": "factories"`, an error class of `domain/errors/` too |
1213
1216
  | `language/declared-vocabulary` | a string literal whose value is a value of a closed vocabulary the project declares (an object `as const` exported with the union type of its name, a permission set of `definePermissions`), outside the file that declares it, in the place that speaks its language (its context; the platform and the route groups for the platform; everywhere for a permission id or the shared kernel); tests, published languages and the relationship schema are not judged; under `"stack.literals": "named"` |
@@ -1233,6 +1236,7 @@ const due = handler.isDueNow(new Reminder(new Date('2026-03-01T09:00:00Z'))); //
1233
1236
  | `config/valid` | unknown upstream, classification, relationship, rule id, `guard` mode or `importExtension`; a context missing on disk or in the config; a `commit` limit that is not a positive integer |
1234
1237
  | `config/suppression-needs-reason` | a suppression without a rule id or a reason (kept as an alias next to `governance/recorded-deviation`, which judges the reason) |
1235
1238
  | `authz/declared` | in a module file, `builder.command(X)` or `builder.query(X)` without `.requires(` or `.public(` in its chain, unless the message class carries `@Requires` or `@Public` of `@ddd-ts-kit/kernel/declarations`; with manual or nest wiring, a command or query class absent from every `requires(X, ...)` and `publicUseCase(X)` of the module file and of `application/authorization/`; a `defineRoute` without `security` (the route type refuses it already, and an empty list too: this is the text-level net for a definition built loosely); in the declared style, the exported class of a `*.command.ts` or `*.query.ts` file carrying neither `@Requires` nor `@Public` |
1239
+ | `authz/granted` | with `stack.authz` `rbac`, a permission of a context's `definePermissions` that neither `platform/auth/roles.ts` nor `platform/auth/signed-in-grants.ts` grants by name (by the entry of its set, its id or `<context>:*`); the super-admin `*` does not count (a warning) |
1236
1240
  | `authz/in-application` | `presentation/`: a test on roles, `isAdmin`, the import of an authorizer or of `Access`; `infrastructure/`: `authorize(` or `check(` on an authorizer or access, `ForbiddenError`; `domain/`: any import of `@ddd-ts-kit/auth`, of the actor types of the kernel (`Actor`, `ActorContext`, `Session`, `ExecutionContext`, the authorized messages), a read of `.roles` or `.permissions` on an actor. The request glue of `@ddd-ts-kit/auth` (`actorOf`, `sessionOf`, `resolveSession`, `SessionAuthenticator`) is free in `presentation/`. `presentation/` and `infrastructure/`: the import of `Requires`, `Public` or `Policy` from `@ddd-ts-kit/kernel/declarations`, or of the ports `Access` and `PolicyAccess` from `@ddd-ts-kit/auth`; they are free in `application/` |
1237
1241
  | `authz/actor-explicit` | in `domain/` and `application/`: `ActorContext`, `ExecutionScope` (as a type or as a value: the class is the token of a dependency list), `AsyncLocalStorageExecutionScope`, `ScopedActorContext`, `AsyncLocalStorage`; `.current()` or `.require()` on an actor context or on something named `scope`, `scopes` or `...executionScope`; an import of `stampCreation`, `stampUpdate` or `tenantScopeOf` |
1238
1242
  | `authz/fields-by-schema` | under `application/queries/`: `roles.includes(`, `.some(`, `.every(`, `.find(`, `.indexOf(`, a comparison with a `role`, `isAdmin` |
@@ -0,0 +1,8 @@
1
+ import type { Scan } from '../scan/scan.js';
2
+ import type { PermissionSet } from './permission-sets.js';
3
+ /**
4
+ * Whether code grants a permission by name: by the entry of its set, `billingPermissions['invoice.issue']`;
5
+ * by its id, `'billing:invoice.issue'`; or by the wildcard of its context, `'billing:*'`. A comment grants nothing.
6
+ */
7
+ export declare function isGranted({ code, strings }: Scan, { set, context }: Omit<PermissionSet, 'keys'>, key: string): boolean;
8
+ //# sourceMappingURL=is-granted.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"is-granted.d.ts","sourceRoot":"","sources":["../../../src/check/authz/is-granted.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAE5C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAE1D;;;GAGG;AACH,wBAAgB,SAAS,CACvB,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,IAAI,EACvB,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE,IAAI,CAAC,aAAa,EAAE,MAAM,CAAC,EAC7C,GAAG,EAAE,MAAM,GACV,OAAO,CAST"}
@@ -0,0 +1,11 @@
1
+ import { escapeRegExp } from '../text/escape-reg-exp.js';
2
+ /**
3
+ * Whether code grants a permission by name: by the entry of its set, `billingPermissions['invoice.issue']`;
4
+ * by its id, `'billing:invoice.issue'`; or by the wildcard of its context, `'billing:*'`. A comment grants nothing.
5
+ */
6
+ export function isGranted({ code, strings }, { set, context }, key) {
7
+ const ids = new Set([`${context}:${key}`, `${context}:*`]);
8
+ const entries = [...code.matchAll(new RegExp(`(?<![\\w$.])${escapeRegExp(set)}\\s*\\[\\s*`, 'g'))];
9
+ return (entries.some((entry) => strings.some(({ start, value }) => start === entry.index + entry[0].length && value === key)) || strings.some(({ value }) => ids.has(value)));
10
+ }
11
+ //# sourceMappingURL=is-granted.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"is-granted.js","sourceRoot":"","sources":["../../../src/check/authz/is-granted.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAGzD;;;GAGG;AACH,MAAM,UAAU,SAAS,CACvB,EAAE,IAAI,EAAE,OAAO,EAAQ,EACvB,EAAE,GAAG,EAAE,OAAO,EAA+B,EAC7C,GAAW;IAEX,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,OAAO,IAAI,GAAG,EAAE,EAAE,GAAG,OAAO,IAAI,CAAC,CAAC,CAAC;IAC3D,MAAM,OAAO,GAAG,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC,eAAe,YAAY,CAAC,GAAG,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;IAEnG,OAAO,CACL,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CACrB,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,KAAK,KAAK,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,IAAI,KAAK,KAAK,GAAG,CAAC,CAC7F,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CACjD,CAAC;AACJ,CAAC"}
@@ -0,0 +1,13 @@
1
+ import type { SourceFile } from '../model/source-file.js';
2
+ import type { StringRecord } from '../scan/string-record.js';
3
+ /** `export const billingPermissions = definePermissions('billing', { 'invoice.issue': .. })`, as the checker reads it. */
4
+ export interface PermissionSet {
5
+ /** The name code reads the set by: `billingPermissions`. */
6
+ readonly set: string;
7
+ readonly context: string;
8
+ /** The key of each permission, where it is written. */
9
+ readonly keys: readonly StringRecord[];
10
+ }
11
+ /** The permission sets a file declares, each with the keys of its first level. */
12
+ export declare function permissionSets(file: SourceFile): PermissionSet[];
13
+ //# sourceMappingURL=permission-sets.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"permission-sets.d.ts","sourceRoot":"","sources":["../../../src/check/authz/permission-sets.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAM7D,0HAA0H;AAC1H,MAAM,WAAW,aAAa;IAC5B,4DAA4D;IAC5D,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,uDAAuD;IACvD,QAAQ,CAAC,IAAI,EAAE,SAAS,YAAY,EAAE,CAAC;CACxC;AAED,kFAAkF;AAClF,wBAAgB,cAAc,CAAC,IAAI,EAAE,UAAU,GAAG,aAAa,EAAE,CAqBhE"}
@@ -0,0 +1,19 @@
1
+ import { depthAt } from '../text/depth-at.js';
2
+ import { matchingBracket } from '../text/matching-bracket.js';
3
+ const PERMISSION_SET = /export\s+const\s+([a-z][\w$]*)\s*=\s*definePermissions\(\s*/g;
4
+ /** The permission sets a file declares, each with the keys of its first level. */
5
+ export function permissionSets(file) {
6
+ const { code, strings } = file.scan;
7
+ return [...code.matchAll(PERMISSION_SET)].flatMap((found) => {
8
+ const at = found.index + found[0].length;
9
+ const context = strings.find(({ start }) => start === at)?.value;
10
+ const open = code.indexOf('{', at);
11
+ if (context === undefined || open === -1) {
12
+ return [];
13
+ }
14
+ const close = matchingBracket(code, open);
15
+ const keys = strings.filter(({ start, end }) => start > open && end < close && /^\s*:/.test(code.slice(end)) && depthAt(code, open, start) === 1);
16
+ return [{ set: found[1] ?? '', context, keys }];
17
+ });
18
+ }
19
+ //# sourceMappingURL=permission-sets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"permission-sets.js","sourceRoot":"","sources":["../../../src/check/authz/permission-sets.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAE9D,MAAM,cAAc,GAAG,8DAA8D,CAAC;AAWtF,kFAAkF;AAClF,MAAM,UAAU,cAAc,CAAC,IAAgB;IAC7C,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC;IAEpC,OAAO,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;QAC1D,MAAM,EAAE,GAAG,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;QACzC,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,KAAK,KAAK,EAAE,CAAC,EAAE,KAAK,CAAC;QACjE,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QAEnC,IAAI,OAAO,KAAK,SAAS,IAAI,IAAI,KAAK,CAAC,CAAC,EAAE,CAAC;YACzC,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,MAAM,KAAK,GAAG,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAE1C,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CACzB,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,EAAE,CACjB,KAAK,GAAG,IAAI,IAAI,GAAG,GAAG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,CACnG,CAAC;QAEF,OAAO,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"architecture-rules.d.ts","sourceRoot":"","sources":["../../../src/check/catalogue/architecture-rules.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAmF7C,gHAAgH;AAChH,eAAO,MAAM,kBAAkB,EAAE,SAAS,IAAI,EAkF7C,CAAC"}
1
+ {"version":3,"file":"architecture-rules.d.ts","sourceRoot":"","sources":["../../../src/check/catalogue/architecture-rules.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAqF7C,gHAAgH;AAChH,eAAO,MAAM,kBAAkB,EAAE,SAAS,IAAI,EAoF7C,CAAC"}
@@ -2,6 +2,7 @@ import { aspectsOutsideIn } from '../rules/aspects-outside-in.js';
2
2
  import { authzActorExplicit } from '../rules/authz-actor-explicit.js';
3
3
  import { authzFieldsBySchema } from '../rules/authz-fields-by-schema.js';
4
4
  import { authzDeclared } from '../rules/authz-declared.js';
5
+ import { authzGranted } from '../rules/authz-granted.js';
5
6
  import { authzInApplication } from '../rules/authz-in-application.js';
6
7
  import { authzPolicyAsked } from '../rules/authz-policy-asked.js';
7
8
  import { cleanBlankLines } from '../rules/clean-blank-lines.js';
@@ -37,6 +38,7 @@ import { errorsKnownCode } from '../rules/errors-known-code.js';
37
38
  import { filesPortNotConnector } from '../rules/files-port-not-connector.js';
38
39
  import { eventsConsumerIdempotent } from '../rules/events-consumer-idempotent.js';
39
40
  import { eventsDefinedInPublishedLanguage } from '../rules/events-defined-in-published-language.js';
41
+ import { eventsNameDeclaredOnce } from '../rules/events-name-declared-once.js';
40
42
  import { eventsNameFormat } from '../rules/events-name-format.js';
41
43
  import { eventsOutboxRequired } from '../rules/events-outbox-required.js';
42
44
  import { governanceRecordedDeviation } from '../rules/governance-recorded-deviation.js';
@@ -99,6 +101,7 @@ export const ARCHITECTURE_RULES = [
99
101
  schemaNoDuplicateShape,
100
102
  testSpecRequired,
101
103
  eventsNameFormat,
104
+ eventsNameDeclaredOnce,
102
105
  eventsDefinedInPublishedLanguage,
103
106
  testNoMocks,
104
107
  testBuilderRequired,
@@ -136,6 +139,7 @@ export const ARCHITECTURE_RULES = [
136
139
  authzActorExplicit,
137
140
  authzFieldsBySchema,
138
141
  authzPolicyAsked,
142
+ authzGranted,
139
143
  aspectsOutsideIn,
140
144
  tracingPlatformOnly,
141
145
  tenancyScopedStatement,
@@ -1 +1 @@
1
- {"version":3,"file":"architecture-rules.js","sourceRoot":"","sources":["../../../src/check/catalogue/architecture-rules.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"architecture-rules.js","sourceRoot":"","sources":["../../../src/check/catalogue/architecture-rules.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"default-severities.d.ts","sourceRoot":"","sources":["../../../src/check/catalogue/default-severities.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAEtD,0GAA0G;AAC1G,eAAO,MAAM,kBAAkB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAQjE,CAAC"}
1
+ {"version":3,"file":"default-severities.d.ts","sourceRoot":"","sources":["../../../src/check/catalogue/default-severities.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAEtD,0GAA0G;AAC1G,eAAO,MAAM,kBAAkB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CASjE,CAAC"}
@@ -1,5 +1,6 @@
1
1
  /** Rules that advise instead of blocking unless the config says otherwise (ARCHITECTURE.md section 3). */
2
2
  export const DEFAULT_SEVERITIES = {
3
+ 'authz/granted': 'warn',
3
4
  'test/no-mocks': 'warn',
4
5
  'test/builder-required': 'warn',
5
6
  'clean/function-size': 'warn',
@@ -1 +1 @@
1
- {"version":3,"file":"default-severities.js","sourceRoot":"","sources":["../../../src/check/catalogue/default-severities.ts"],"names":[],"mappings":"AAEA,0GAA0G;AAC1G,MAAM,CAAC,MAAM,kBAAkB,GAAuC;IACpE,eAAe,EAAE,MAAM;IACvB,uBAAuB,EAAE,MAAM;IAC/B,qBAAqB,EAAE,MAAM;IAC7B,wBAAwB,EAAE,MAAM;IAChC,wBAAwB,EAAE,MAAM;IAChC,sCAAsC,EAAE,MAAM;IAC9C,gCAAgC,EAAE,MAAM;CACzC,CAAC"}
1
+ {"version":3,"file":"default-severities.js","sourceRoot":"","sources":["../../../src/check/catalogue/default-severities.ts"],"names":[],"mappings":"AAEA,0GAA0G;AAC1G,MAAM,CAAC,MAAM,kBAAkB,GAAuC;IACpE,eAAe,EAAE,MAAM;IACvB,eAAe,EAAE,MAAM;IACvB,uBAAuB,EAAE,MAAM;IAC/B,qBAAqB,EAAE,MAAM;IAC7B,wBAAwB,EAAE,MAAM;IAChC,wBAAwB,EAAE,MAAM;IAChC,sCAAsC,EAAE,MAAM;IAC9C,gCAAgC,EAAE,MAAM;CACzC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"authz-docs.d.ts","sourceRoot":"","sources":["../../../src/check/explain/authz-docs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAEpD,eAAO,MAAM,UAAU,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAqExD,CAAC"}
1
+ {"version":3,"file":"authz-docs.d.ts","sourceRoot":"","sources":["../../../src/check/explain/authz-docs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAEpD,eAAO,MAAM,UAAU,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAoFxD,CAAC"}
@@ -27,6 +27,21 @@ await this.access.authorize(command.actor, billingPermissions['invoice.void'], i
27
27
  // application/authorization/only-issuer-voids.policy.ts
28
28
  @Policy(billingPermissions['invoice.void'], { name: 'billing.only-issuer-voids' })
29
29
  export class OnlyIssuerVoidsPolicy {}`,
30
+ },
31
+ 'authz/granted': {
32
+ why: "In a project whose rights are roles (stack.authz rbac), a permission does two things: a use case requires it, and a role holds it. The generator declares the first; the grant lives in the roles of the platform. The super-admin holds the wildcard `*`, so a permission no role names is reachable by administrators only, the checks stay green and the people the use case was written for are refused at run time. It fails closed, which is safe, but silently. Judged: every key of every `definePermissions` set of a context is named in `<platformDir>/auth/roles.ts` or in what every signed-in person holds (`signed-in-grants.ts`, which a context preset writes), by the entry of its set (`billingPermissions['invoice.issue']`), by its id (`'billing:invoice.issue'`) or by the wildcard of its context (`'billing:*'`); the bare `*` does not count, and a grant to `Role.System` does. A permission meant for administrators only is granted to `Role.Admin` by name, so that the intent is read in review. Silent when the rights are attributes, relationships or an authorizer of the project, and when the platform has no roles file. A warning: it fails closed.",
33
+ bad: `// contexts/billing/application/authorization/billing.permissions.ts
34
+ export const billingPermissions = definePermissions('billing', {
35
+ 'invoice.void': { description: 'Void invoice' },
36
+ });
37
+ // platform/auth/roles.ts
38
+ export const roles = { [Role.Admin]: ['*'] };`,
39
+ good: `// platform/auth/roles.ts
40
+ export const roles = {
41
+ [Role.Admin]: ['*'],
42
+ [Role.Accountant]: [billingPermissions['invoice.void']],
43
+ };
44
+ // or, when generating the use case: --permission invoice.void --grant accountant`,
30
45
  },
31
46
  'authz/policy-asked': {
32
47
  why: 'The bus checks the permission of a use case before its handler runs, with the identifier of the element at most: it cannot read the element. A policy is the part of the right that needs the element (only the issuer, not after closing), and it is evaluated only when the handler asks Access once the element is loaded. A handler that forgets to ask leaves the policy declared, tested and never applied, and nothing at run time says so. Judged: for every permission refined by a policy (@Policy or definePolicy in application/authorization/), the handlers in the folder of each command or query that requires it (@Requires, .requires(...) or requires(X, ...)) call authorize, decide or decideOn and name that permission in their code. The TODO(domain) the generator leaves in such a handler, naming the permission, is accepted: `ddd-ts-kit todo` lists it, and until it is done the authorization module refuses the result of the handler at run time (PolicyNotAskedError).',
@@ -1 +1 @@
1
- {"version":3,"file":"authz-docs.js","sourceRoot":"","sources":["../../../src/check/explain/authz-docs.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,UAAU,GAAsC;IAC3D,gBAAgB,EAAE;QAChB,GAAG,EAAE,mvBAAmvB;QACxvB,GAAG,EAAE;;;mEAG0D;QAC/D,IAAI,EAAE;;;;;mEAKyD;KAChE;IACD,sBAAsB,EAAE;QACtB,GAAG,EAAE,q0BAAq0B;QAC10B,GAAG,EAAE;;;;;4DAKmD;QACxD,IAAI,EAAE;;;;;;sCAM4B;KACnC;IACD,oBAAoB,EAAE;QACpB,GAAG,EAAE,08BAA08B;QAC/8B,GAAG,EAAE;;;;;gCAKuB;QAC5B,IAAI,EAAE;;;gCAGsB;KAC7B;IACD,sBAAsB,EAAE;QACtB,GAAG,EAAE,ykBAAykB;QAC9kB,GAAG,EAAE;;;;qDAI4C;QACjD,IAAI,EAAE;;;;;2GAKiG;KACxG;IACD,wBAAwB,EAAE;QACxB,GAAG,EAAE,i1BAAi1B;QACt1B,GAAG,EAAE;;+FAEsF;QAC3F,IAAI,EAAE;;;;;IAKN;KACD;CACF,CAAC"}
1
+ {"version":3,"file":"authz-docs.js","sourceRoot":"","sources":["../../../src/check/explain/authz-docs.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,UAAU,GAAsC;IAC3D,gBAAgB,EAAE;QAChB,GAAG,EAAE,mvBAAmvB;QACxvB,GAAG,EAAE;;;mEAG0D;QAC/D,IAAI,EAAE;;;;;mEAKyD;KAChE;IACD,sBAAsB,EAAE;QACtB,GAAG,EAAE,q0BAAq0B;QAC10B,GAAG,EAAE;;;;;4DAKmD;QACxD,IAAI,EAAE;;;;;;sCAM4B;KACnC;IACD,eAAe,EAAE;QACf,GAAG,EAAE,4nCAA4nC;QACjoC,GAAG,EAAE;;;;;8CAKqC;QAC1C,IAAI,EAAE;;;;;kFAKwE;KAC/E;IACD,oBAAoB,EAAE;QACpB,GAAG,EAAE,08BAA08B;QAC/8B,GAAG,EAAE;;;;;gCAKuB;QAC5B,IAAI,EAAE;;;gCAGsB;KAC7B;IACD,sBAAsB,EAAE;QACtB,GAAG,EAAE,ykBAAykB;QAC9kB,GAAG,EAAE;;;;qDAI4C;QACjD,IAAI,EAAE;;;;;2GAKiG;KACxG;IACD,wBAAwB,EAAE;QACxB,GAAG,EAAE,i1BAAi1B;QACt1B,GAAG,EAAE;;+FAEsF;QAC3F,IAAI,EAAE;;;;;IAKN;KACD;CACF,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"events-docs.d.ts","sourceRoot":"","sources":["../../../src/check/explain/events-docs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAEpD,eAAO,MAAM,WAAW,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CA6FzD,CAAC"}
1
+ {"version":3,"file":"events-docs.d.ts","sourceRoot":"","sources":["../../../src/check/explain/events-docs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAEpD,eAAO,MAAM,WAAW,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAwGzD,CAAC"}
@@ -1,8 +1,19 @@
1
1
  export const EVENTS_DOCS = {
2
2
  'events/name-format': {
3
3
  why: 'Event names are routing keys and part of the public contract. A uniform <context>.<aggregate>.<fact> name tells who owns the event and what happened, and never collides across contexts.',
4
- bad: `readonly name = 'InvoiceIssued';`,
5
- good: `readonly name = 'billing.invoice.issued';`,
4
+ bad: `static readonly eventName = 'InvoiceIssued';`,
5
+ good: `static readonly eventName = 'billing.invoice.issued';`,
6
+ },
7
+ 'events/name-declared-once': {
8
+ why: 'A domain event handler and a projection are attached under the name the event class declares, static readonly eventName: the compiler refuses a reaction to an event class without it. Checked on every domain event, a missing name is found when the event is written, not later when someone first reacts to it. A name written a second time, as a literal in readonly name, drifts from the one the reactions read.',
9
+ bad: `export class InvoiceIssued implements DomainEvent {
10
+ readonly name = 'billing.invoice.issued';
11
+ }`,
12
+ good: `export class InvoiceIssued implements DomainEvent {
13
+ static readonly eventName = 'billing.invoice.issued';
14
+
15
+ readonly name = InvoiceIssued.eventName;
16
+ }`,
6
17
  },
7
18
  'events/defined-in-published-language': {
8
19
  why: 'Integration events are the only way two contexts communicate, so their shape is a public contract. One declaration with a payload schema gives the type, validates what is published and consumed, and feeds the generated catalog and AsyncAPI document. An event described by hand, or declared twice, drifts from what is really sent.',
@@ -1 +1 @@
1
- {"version":3,"file":"events-docs.js","sourceRoot":"","sources":["../../../src/check/explain/events-docs.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,WAAW,GAAsC;IAC5D,oBAAoB,EAAE;QACpB,GAAG,EAAE,2LAA2L;QAChM,GAAG,EAAE,kCAAkC;QACvC,IAAI,EAAE,2CAA2C;KAClD;IACD,sCAAsC,EAAE;QACtC,GAAG,EAAE,2UAA2U;QAChV,GAAG,EAAE;uEAC8D;QACnE,IAAI,EAAE;;;IAGN;KACD;IACD,wBAAwB,EAAE;QACxB,GAAG,EAAE,wVAAwV;QAC7V,GAAG,EAAE;;;qDAG4C;QACjD,IAAI,EAAE;;;yDAG+C;KACtD;IACD,4BAA4B,EAAE;QAC5B,GAAG,EAAE,mlBAAmlB;QACxlB,GAAG,EAAE;;;uEAG8D;QACnE,IAAI,EAAE;;;;;;;;EAQR;KACC;IACD,kCAAkC,EAAE;QAClC,GAAG,EAAE,svBAAsvB;QAC3vB,GAAG,EAAE;;;;sDAI6C;QAClD,IAAI,EAAE;;;;;qCAK2B;KAClC;IACD,2CAA2C,EAAE;QAC3C,GAAG,EAAE,uxDAAuxD;QAC5xD,GAAG,EAAE;;;;;;;;;;sFAU6E;QAClF,IAAI,EAAE;;;;;;;;;;;;;;;;;;;;;;EAsBR;KACC;CACF,CAAC"}
1
+ {"version":3,"file":"events-docs.js","sourceRoot":"","sources":["../../../src/check/explain/events-docs.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,WAAW,GAAsC;IAC5D,oBAAoB,EAAE;QACpB,GAAG,EAAE,2LAA2L;QAChM,GAAG,EAAE,8CAA8C;QACnD,IAAI,EAAE,uDAAuD;KAC9D;IACD,2BAA2B,EAAE;QAC3B,GAAG,EAAE,0ZAA0Z;QAC/Z,GAAG,EAAE;;EAEP;QACE,IAAI,EAAE;;;;EAIR;KACC;IACD,sCAAsC,EAAE;QACtC,GAAG,EAAE,2UAA2U;QAChV,GAAG,EAAE;uEAC8D;QACnE,IAAI,EAAE;;;IAGN;KACD;IACD,wBAAwB,EAAE;QACxB,GAAG,EAAE,wVAAwV;QAC7V,GAAG,EAAE;;;qDAG4C;QACjD,IAAI,EAAE;;;yDAG+C;KACtD;IACD,4BAA4B,EAAE;QAC5B,GAAG,EAAE,mlBAAmlB;QACxlB,GAAG,EAAE;;;uEAG8D;QACnE,IAAI,EAAE;;;;;;;;EAQR;KACC;IACD,kCAAkC,EAAE;QAClC,GAAG,EAAE,svBAAsvB;QAC3vB,GAAG,EAAE;;;;sDAI6C;QAClD,IAAI,EAAE;;;;;qCAK2B;KAClC;IACD,2CAA2C,EAAE;QAC3C,GAAG,EAAE,uxDAAuxD;QAC5xD,GAAG,EAAE;;;;;;;;;;sFAU6E;QAClF,IAAI,EAAE;;;;;;;;;;;;;;;;;;;;;;EAsBR;KACC;CACF,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Fixture } from './fixture.js';
2
+ export declare const AUTHZ_GRANTED_FIXTURES: readonly Fixture[];
3
+ //# sourceMappingURL=authz-granted-fixtures.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"authz-granted-fixtures.d.ts","sourceRoot":"","sources":["../../../src/check/fixtures/authz-granted-fixtures.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AA+B5C,eAAO,MAAM,sBAAsB,EAAE,SAAS,OAAO,EAuDpD,CAAC"}
@@ -0,0 +1,71 @@
1
+ import { CONFIG_FILE } from '../../config/index.js';
2
+ import { config } from './config.js';
3
+ import { PATHS } from './paths.js';
4
+ import { project } from './project.js';
5
+ import { source } from './source.js';
6
+ const { BILLING } = PATHS;
7
+ const PERMISSIONS = `${BILLING}/application/authorization/billing.permissions.ts`;
8
+ const ROLES = 'src/platform/auth/roles.ts';
9
+ const ROLE = 'src/platform/auth/role.ts';
10
+ const SIGNED_IN = 'src/platform/auth/signed-in-grants.ts';
11
+ const DECLARED = source("import { definePermissions } from '@ddd-ts-kit/auth';", '', "export const billingPermissions = definePermissions('billing', {", " 'invoice.issue': { description: 'Issue invoice' },", '});');
12
+ const ROLE_VOCABULARY = source('export const Role = {', " Admin: 'admin',", " Accountant: 'accountant',", '} as const;', '', 'export type Role = (typeof Role)[keyof typeof Role];');
13
+ const rule = 'authz/granted';
14
+ export const AUTHZ_GRANTED_FIXTURES = [
15
+ {
16
+ ruleId: rule,
17
+ name: 'a permission granted to a role by the entry of its set',
18
+ expect: 'pass',
19
+ files: granting("[Role.Accountant]: [billingPermissions['invoice.issue']],"),
20
+ },
21
+ {
22
+ ruleId: rule,
23
+ name: 'a permission granted through the wildcard of its context',
24
+ expect: 'pass',
25
+ files: granting("[Role.Accountant]: ['billing:*'],"),
26
+ },
27
+ {
28
+ ruleId: rule,
29
+ name: 'a permission granted by its id',
30
+ expect: 'pass',
31
+ files: granting("[Role.Accountant]: ['billing:invoice.issue'],"),
32
+ },
33
+ {
34
+ ruleId: rule,
35
+ name: 'a permission every signed-in person holds through the wildcard of its context',
36
+ expect: 'pass',
37
+ files: {
38
+ ...granting(),
39
+ [SIGNED_IN]: source('export const signedInGrants: readonly string[] = [', ' // ddd-ts-kit:signed-in-grants', " 'billing:*',", ' // /ddd-ts-kit:signed-in-grants', '];'),
40
+ },
41
+ },
42
+ {
43
+ ruleId: rule,
44
+ name: 'a permission no role names, in a project whose rights are attributes',
45
+ expect: 'pass',
46
+ files: {
47
+ ...granting(),
48
+ [CONFIG_FILE]: config({ stack: { authz: 'abac' } }),
49
+ },
50
+ },
51
+ {
52
+ ruleId: rule,
53
+ name: 'a permission only the super-admin wildcard reaches',
54
+ expect: { file: PERMISSIONS },
55
+ files: granting(),
56
+ },
57
+ {
58
+ ruleId: rule,
59
+ name: 'a permission granted in a comment only',
60
+ expect: { file: PERMISSIONS },
61
+ files: granting("// [Role.Accountant]: [billingPermissions['invoice.issue']],"),
62
+ },
63
+ ];
64
+ function granting(...grants) {
65
+ return project({ [PERMISSIONS]: DECLARED, [ROLE]: ROLE_VOCABULARY, [ROLES]: roles(...grants) });
66
+ }
67
+ /** A roles file of the platform whose grants are the lines given, after the super-admin. */
68
+ function roles(...grants) {
69
+ return source("import type { Grant } from '@ddd-ts-kit/auth';", "import { billingPermissions } from '@/contexts/billing/application/authorization/billing.permissions.js';", "import { Role } from '@/platform/auth/role.js';", '', 'export const roles: Readonly<Record<string, readonly Grant[]>> = {', " [Role.Admin]: ['*'],", ...grants.map((grant) => ` ${grant}`), '};', '', 'export const issuing = billingPermissions;');
70
+ }
71
+ //# sourceMappingURL=authz-granted-fixtures.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"authz-granted-fixtures.js","sourceRoot":"","sources":["../../../src/check/fixtures/authz-granted-fixtures.ts"],"names":[],"mappings":"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"}
@@ -20,8 +20,8 @@ const PRESENT_EVENT = `${BILLING}/domain/events/issue-invoice.event.ts`;
20
20
  const CODEC = `${BILLING}/infrastructure/persistence/invoice-events.mapper.ts`;
21
21
  const STORE_ADAPTER = `${BILLING}/infrastructure/persistence/event-store-invoice.repository.ts`;
22
22
  const EVENTS = {
23
- [EVENT]: source("export class InvoiceIssued {\n readonly name = 'billing.invoice.issued';\n\n constructor(\n readonly aggregateId: string,\n readonly amount: number,\n ) {}\n}"),
24
- [PRESENT_EVENT]: source("export class IssueInvoice {\n readonly name = 'billing.invoice.issued';\n\n constructor(readonly aggregateId: string) {}\n}"),
23
+ [EVENT]: source("export class InvoiceIssued {\n static readonly eventName = 'billing.invoice.issued';\n\n readonly name = InvoiceIssued.eventName;\n\n constructor(\n readonly aggregateId: string,\n readonly amount: number,\n ) {}\n}"),
24
+ [PRESENT_EVENT]: source("export class IssueInvoice {\n static readonly eventName = 'billing.invoice.issued';\n\n readonly name = IssueInvoice.eventName;\n\n constructor(readonly aggregateId: string) {}\n}"),
25
25
  };
26
26
  const RECORDING = ['this.record(new InvoiceIssued(this.id, amount));'];
27
27
  const APPLYING = ['this.amount = event.amount;'];
@@ -74,7 +74,7 @@ function namedEvent(name, eventClass, expect) {
74
74
  name,
75
75
  expect,
76
76
  files: project({
77
- [`${BILLING}/domain/events/${file}.event.ts`]: source(`export class ${eventClass} {\n readonly name = 'billing.invoice.price-set';\n\n constructor(readonly aggregateId: string) {}\n}`),
77
+ [`${BILLING}/domain/events/${file}.event.ts`]: source(`export class ${eventClass} {\n static readonly eventName = 'billing.invoice.price-set';\n\n readonly name = ${eventClass}.eventName;\n\n constructor(readonly aggregateId: string) {}\n}`),
78
78
  ...invoice([`this.record(new ${eventClass}(this.id));`], APPLYING, imported),
79
79
  }, { [`${BILLING}/CONTEXT.md`]: contextDoc('core', undefined, PRICED_GLOSSARY) }),
80
80
  };
@@ -1 +1 @@
1
- {"version":3,"file":"event-sourcing-fixtures.js","sourceRoot":"","sources":["../../../src/check/fixtures/event-sourcing-fixtures.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"event-sourcing-fixtures.js","sourceRoot":"","sources":["../../../src/check/fixtures/event-sourcing-fixtures.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"events-fixtures.d.ts","sourceRoot":"","sources":["../../../src/check/fixtures/events-fixtures.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAQ5C,eAAO,MAAM,eAAe,EAAE,SAAS,OAAO,EA+E7C,CAAC"}
1
+ {"version":3,"file":"events-fixtures.d.ts","sourceRoot":"","sources":["../../../src/check/fixtures/events-fixtures.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAQ5C,eAAO,MAAM,eAAe,EAAE,SAAS,OAAO,EA8G7C,CAAC"}
@@ -10,7 +10,7 @@ export const EVENTS_FIXTURES = [
10
10
  name: 'context.aggregate.fact names',
11
11
  expect: 'pass',
12
12
  files: project({
13
- [EVENT]: "export class InvoiceIssued {\n readonly name = 'billing.invoice.issued';\n readonly label: string = 'Invoice issued';\n}\n",
13
+ [EVENT]: "export class InvoiceIssued {\n static readonly eventName = 'billing.invoice.issued';\n\n readonly name = InvoiceIssued.eventName;\n readonly label: string = 'Invoice issued';\n}\n",
14
14
  [PUBLISHED]: `${DECLARE}${declaration('billing.invoice.marked-as-paid')}`,
15
15
  [`${BILLING}/published-language/invoice-summary.ts`]: "export interface InvoiceSummary { readonly type: 'standard' | 'credit-note' }\n",
16
16
  }),
@@ -19,6 +19,7 @@ export const EVENTS_FIXTURES = [
19
19
  ruleId: 'events/name-format',
20
20
  name: 'a domain event named like its class',
21
21
  expect: { file: EVENT },
22
+ also: ['events/name-declared-once'],
22
23
  files: project({ [EVENT]: "export class InvoiceIssued {\n readonly name = 'InvoiceIssued';\n}\n" }),
23
24
  },
24
25
  {
@@ -35,6 +36,34 @@ export const EVENTS_FIXTURES = [
35
36
  expect: { file: PUBLISHED },
36
37
  files: project({ [PUBLISHED]: `${DECLARE}${declaration('catalog.invoice.issued')}` }),
37
38
  },
39
+ {
40
+ ruleId: 'events/name-declared-once',
41
+ name: 'a domain event declaring its name once, read by its name property',
42
+ expect: 'pass',
43
+ files: project({
44
+ [EVENT]: "export class InvoiceIssued {\n static readonly eventName = 'billing.invoice.issued';\n\n readonly name = InvoiceIssued.eventName;\n}\n",
45
+ }),
46
+ },
47
+ {
48
+ ruleId: 'events/name-declared-once',
49
+ name: 'a domain event that names itself nowhere',
50
+ expect: { file: EVENT },
51
+ files: project({ [EVENT]: 'export class InvoiceIssued {\n readonly total: number = 0;\n}\n' }),
52
+ },
53
+ {
54
+ ruleId: 'events/name-declared-once',
55
+ name: 'a domain event naming itself in readonly name alone, as 0.5 wrote it',
56
+ expect: { file: EVENT },
57
+ files: project({ [EVENT]: "export class InvoiceIssued {\n readonly name = 'billing.invoice.issued';\n}\n" }),
58
+ },
59
+ {
60
+ ruleId: 'events/name-declared-once',
61
+ name: 'a domain event writing its name twice',
62
+ expect: { file: EVENT },
63
+ files: project({
64
+ [EVENT]: "export class InvoiceIssued {\n static readonly eventName = 'billing.invoice.issued';\n\n readonly name = 'billing.invoice.issued';\n}\n",
65
+ }),
66
+ },
38
67
  {
39
68
  ruleId: 'events/defined-in-published-language',
40
69
  name: 'two versions of an event, each declared once with a payload schema',