ddd-ts-kit 0.15.0 → 0.16.1

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 (144) hide show
  1. package/README.fr.md +1594 -0
  2. package/README.md +426 -6
  3. package/dist/check/catalogue/architecture-rules.d.ts.map +1 -1
  4. package/dist/check/catalogue/architecture-rules.js +2 -0
  5. package/dist/check/catalogue/architecture-rules.js.map +1 -1
  6. package/dist/check/explain/domain-docs.d.ts +3 -0
  7. package/dist/check/explain/domain-docs.d.ts.map +1 -0
  8. package/dist/check/explain/domain-docs.js +30 -0
  9. package/dist/check/explain/domain-docs.js.map +1 -0
  10. package/dist/check/explain/rule-docs.d.ts.map +1 -1
  11. package/dist/check/explain/rule-docs.js +2 -0
  12. package/dist/check/explain/rule-docs.js.map +1 -1
  13. package/dist/check/fixtures/fixtures.d.ts.map +1 -1
  14. package/dist/check/fixtures/fixtures.js +4 -0
  15. package/dist/check/fixtures/fixtures.js.map +1 -1
  16. package/dist/check/fixtures/model-function-fixtures.d.ts +4 -0
  17. package/dist/check/fixtures/model-function-fixtures.d.ts.map +1 -0
  18. package/dist/check/fixtures/model-function-fixtures.js +52 -0
  19. package/dist/check/fixtures/model-function-fixtures.js.map +1 -0
  20. package/dist/check/fixtures/value-object-file-fixtures.d.ts +4 -0
  21. package/dist/check/fixtures/value-object-file-fixtures.d.ts.map +1 -0
  22. package/dist/check/fixtures/value-object-file-fixtures.js +54 -0
  23. package/dist/check/fixtures/value-object-file-fixtures.js.map +1 -0
  24. package/dist/check/fixtures/value-object-files.d.ts +34 -0
  25. package/dist/check/fixtures/value-object-files.d.ts.map +1 -0
  26. package/dist/check/fixtures/value-object-files.js +46 -0
  27. package/dist/check/fixtures/value-object-files.js.map +1 -0
  28. package/dist/check/rules/domain-value-object-class.d.ts +3 -0
  29. package/dist/check/rules/domain-value-object-class.d.ts.map +1 -0
  30. package/dist/check/rules/domain-value-object-class.js +21 -0
  31. package/dist/check/rules/domain-value-object-class.js.map +1 -0
  32. package/dist/check/structure/class-body-brace.d.ts +6 -0
  33. package/dist/check/structure/class-body-brace.d.ts.map +1 -0
  34. package/dist/check/structure/class-body-brace.js +22 -0
  35. package/dist/check/structure/class-body-brace.js.map +1 -0
  36. package/dist/check/structure/read-structure.d.ts.map +1 -1
  37. package/dist/check/structure/read-structure.js +3 -1
  38. package/dist/check/structure/read-structure.js.map +1 -1
  39. package/dist/check/values/answered-literals.d.ts +8 -0
  40. package/dist/check/values/answered-literals.d.ts.map +1 -0
  41. package/dist/check/values/answered-literals.js +20 -0
  42. package/dist/check/values/answered-literals.js.map +1 -0
  43. package/dist/check/values/arrow-body.d.ts +4 -0
  44. package/dist/check/values/arrow-body.d.ts.map +1 -0
  45. package/dist/check/values/arrow-body.js +52 -0
  46. package/dist/check/values/arrow-body.js.map +1 -0
  47. package/dist/check/values/entry-role.d.ts +10 -0
  48. package/dist/check/values/entry-role.d.ts.map +1 -0
  49. package/dist/check/values/entry-role.js +40 -0
  50. package/dist/check/values/entry-role.js.map +1 -0
  51. package/dist/check/values/exported-function-body.d.ts +9 -0
  52. package/dist/check/values/exported-function-body.d.ts.map +1 -0
  53. package/dist/check/values/exported-function-body.js +29 -0
  54. package/dist/check/values/exported-function-body.js.map +1 -0
  55. package/dist/check/values/exported-values.d.ts +9 -0
  56. package/dist/check/values/exported-values.d.ts.map +1 -0
  57. package/dist/check/values/exported-values.js +48 -0
  58. package/dist/check/values/exported-values.js.map +1 -0
  59. package/dist/check/values/extends-value-object.d.ts +9 -0
  60. package/dist/check/values/extends-value-object.d.ts.map +1 -0
  61. package/dist/check/values/extends-value-object.js +25 -0
  62. package/dist/check/values/extends-value-object.js.map +1 -0
  63. package/dist/check/values/function-body.d.ts +10 -0
  64. package/dist/check/values/function-body.d.ts.map +1 -0
  65. package/dist/check/values/function-body.js +2 -0
  66. package/dist/check/values/function-body.js.map +1 -0
  67. package/dist/check/values/generate-hint.d.ts +4 -0
  68. package/dist/check/values/generate-hint.d.ts.map +1 -0
  69. package/dist/check/values/generate-hint.js +8 -0
  70. package/dist/check/values/generate-hint.js.map +1 -0
  71. package/dist/check/values/initializer-of.d.ts +3 -0
  72. package/dist/check/values/initializer-of.d.ts.map +1 -0
  73. package/dist/check/values/initializer-of.js +15 -0
  74. package/dist/check/values/initializer-of.js.map +1 -0
  75. package/dist/check/values/is-model-file.d.ts +8 -0
  76. package/dist/check/values/is-model-file.d.ts.map +1 -0
  77. package/dist/check/values/is-model-file.js +15 -0
  78. package/dist/check/values/is-model-file.js.map +1 -0
  79. package/dist/check/values/is-value-object-file.d.ts +7 -0
  80. package/dist/check/values/is-value-object-file.d.ts.map +1 -0
  81. package/dist/check/values/is-value-object-file.js +14 -0
  82. package/dist/check/values/is-value-object-file.js.map +1 -0
  83. package/dist/check/values/javascript-globals.d.ts +3 -0
  84. package/dist/check/values/javascript-globals.d.ts.map +1 -0
  85. package/dist/check/values/javascript-globals.js +22 -0
  86. package/dist/check/values/javascript-globals.js.map +1 -0
  87. package/dist/check/values/literal-at.d.ts +3 -0
  88. package/dist/check/values/literal-at.d.ts.map +1 -0
  89. package/dist/check/values/literal-at.js +7 -0
  90. package/dist/check/values/literal-at.js.map +1 -0
  91. package/dist/check/values/local-declaration.d.ts +8 -0
  92. package/dist/check/values/local-declaration.d.ts.map +1 -0
  93. package/dist/check/values/local-declaration.js +31 -0
  94. package/dist/check/values/local-declaration.js.map +1 -0
  95. package/dist/check/values/nested-bodies.d.ts +8 -0
  96. package/dist/check/values/nested-bodies.d.ts.map +1 -0
  97. package/dist/check/values/nested-bodies.js +28 -0
  98. package/dist/check/values/nested-bodies.js.map +1 -0
  99. package/dist/check/values/plain-value-functions.d.ts +10 -0
  100. package/dist/check/values/plain-value-functions.d.ts.map +1 -0
  101. package/dist/check/values/plain-value-functions.js +33 -0
  102. package/dist/check/values/plain-value-functions.js.map +1 -0
  103. package/dist/check/values/returns-package-type.d.ts +9 -0
  104. package/dist/check/values/returns-package-type.d.ts.map +1 -0
  105. package/dist/check/values/returns-package-type.js +12 -0
  106. package/dist/check/values/returns-package-type.js.map +1 -0
  107. package/dist/check/values/stands-for-a-value.d.ts +9 -0
  108. package/dist/check/values/stands-for-a-value.d.ts.map +1 -0
  109. package/dist/check/values/stands-for-a-value.js +28 -0
  110. package/dist/check/values/stands-for-a-value.js.map +1 -0
  111. package/dist/check/values/value-object-file-findings.d.ts +5 -0
  112. package/dist/check/values/value-object-file-findings.d.ts.map +1 -0
  113. package/dist/check/values/value-object-file-findings.js +96 -0
  114. package/dist/check/values/value-object-file-findings.js.map +1 -0
  115. package/dist/commands/init.d.ts.map +1 -1
  116. package/dist/commands/init.js +1 -0
  117. package/dist/commands/init.js.map +1 -1
  118. package/dist/config/index.d.ts +1 -1
  119. package/dist/config/index.d.ts.map +1 -1
  120. package/dist/config/index.js +1 -1
  121. package/dist/config/index.js.map +1 -1
  122. package/dist/config/parse-stack.d.ts.map +1 -1
  123. package/dist/config/parse-stack.js +2 -1
  124. package/dist/config/parse-stack.js.map +1 -1
  125. package/dist/config/stack.d.ts +8 -0
  126. package/dist/config/stack.d.ts.map +1 -1
  127. package/dist/config/stack.js +1 -0
  128. package/dist/config/stack.js.map +1 -1
  129. package/dist/help/usage.d.ts +1 -1
  130. package/dist/help/usage.d.ts.map +1 -1
  131. package/dist/help/usage.js +1 -1
  132. package/dist/init/manifest/versions.js +24 -24
  133. package/dist/init/stack/resolve-stack.d.ts.map +1 -1
  134. package/dist/init/stack/resolve-stack.js +3 -1
  135. package/dist/init/stack/resolve-stack.js.map +1 -1
  136. package/dist/init/stack/stack-options.d.ts +2 -0
  137. package/dist/init/stack/stack-options.d.ts.map +1 -1
  138. package/dist/stack/stack-vars.js +2 -1
  139. package/dist/stack/stack-vars.js.map +1 -1
  140. package/dist/version.d.ts +1 -1
  141. package/dist/version.js +1 -1
  142. package/package.json +2 -2
  143. package/templates/init/rules/domain.md.tpl +1 -1
  144. package/templates/pipeline/package-scripts.json +1 -1
@@ -0,0 +1,30 @@
1
+ export const DOMAIN_DOCS = {
2
+ 'domain/value-object-class': {
3
+ why: 'A value of the model is a class extending ValueObject of the kernel, never a function that builds a plain object. The class compares by value with no identity (equals), checks its invariants once, in the static factory that is the only way in through a private constructor, keeps its behaviour next to its data, refuses an invalid input with the factory of the error of its concept, freezes its props, and is recognised with instanceof by a boundary mapper. A function answering { amount, currency } gives none of that: every caller re-validates, compares field by field, and the operations of the value scatter. So a file of domain/value-objects/ (or a *.vo.ts of the shared kernel) exports one class extending ValueObject, directly or through another value object of the project, with a private or protected constructor and static factories, and no function, arrow constant or object literal; the types of its props may be exported. In domain/ and in the shared kernel outside presentation/, an exported function that answers a record of data (data entries, no spread, nothing a call or new of the model built) is reported. A domain service, a state machine, a specification answering a boolean or an object of functions, a record of value objects the function builds, a record derived by a spread and a function declaring a return type of a package answer something else and are not concerned; a decision answered as a plain record is a value, written as a class or thrown as a refusal. The rule holds under "stack.values": "classes", which init writes; a config that does not say keeps the free form of 0.15.',
4
+ bad: `// domain/value-objects/money.vo.ts
5
+ export type Money = { readonly amount: number; readonly currency: string };
6
+
7
+ export const money = (amount: number, currency: string): Money => ({ amount, currency });`,
8
+ good: `// domain/value-objects/money.vo.ts (npx ddd-ts-kit generate value-object billing Money)
9
+ export type MoneyProps = { readonly amount: number; readonly currency: string };
10
+
11
+ export class Money extends ValueObject<MoneyProps> {
12
+ private constructor(props: MoneyProps) {
13
+ super(props);
14
+ }
15
+
16
+ static of(amount: number, currency: string): Money {
17
+ if (!Number.isInteger(amount)) {
18
+ throw InvoiceError.invalidAmount(amount);
19
+ }
20
+
21
+ return new Money({ amount, currency });
22
+ }
23
+
24
+ add(other: Money): Money {
25
+ return Money.of(this.props.amount + other.props.amount, this.props.currency);
26
+ }
27
+ }`,
28
+ },
29
+ };
30
+ //# sourceMappingURL=domain-docs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"domain-docs.js","sourceRoot":"","sources":["../../../src/check/explain/domain-docs.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,WAAW,GAAsC;IAC5D,2BAA2B,EAAE;QAC3B,GAAG,EAAE,8kDAA8kD;QACnlD,GAAG,EAAE;;;0FAGiF;QACtF,IAAI,EAAE;;;;;;;;;;;;;;;;;;;EAmBR;KACC;CACF,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"rule-docs.d.ts","sourceRoot":"","sources":["../../../src/check/explain/rule-docs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAqBpD,oGAAoG;AACpG,eAAO,MAAM,SAAS,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAoBvD,CAAC"}
1
+ {"version":3,"file":"rule-docs.d.ts","sourceRoot":"","sources":["../../../src/check/explain/rule-docs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAsBpD,oGAAoG;AACpG,eAAO,MAAM,SAAS,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAqBvD,CAAC"}
@@ -1,6 +1,7 @@
1
1
  import { AUTHZ_DOCS } from './authz-docs.js';
2
2
  import { CLEAN_DOCS } from './clean-docs.js';
3
3
  import { CONTEXT_DOCS } from './context-docs.js';
4
+ import { DOMAIN_DOCS } from './domain-docs.js';
4
5
  import { ERRORS_DOCS } from './errors-docs.js';
5
6
  import { EVENT_SOURCING_DOCS } from './event-sourcing-docs.js';
6
7
  import { EVENTS_DOCS } from './events-docs.js';
@@ -22,6 +23,7 @@ export const RULE_DOCS = {
22
23
  ...AUTHZ_DOCS,
23
24
  ...CLEAN_DOCS,
24
25
  ...CONTEXT_DOCS,
26
+ ...DOMAIN_DOCS,
25
27
  ...ERRORS_DOCS,
26
28
  ...EVENT_SOURCING_DOCS,
27
29
  ...EVENTS_DOCS,
@@ -1 +1 @@
1
- {"version":3,"file":"rule-docs.js","sourceRoot":"","sources":["../../../src/check/explain/rule-docs.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,oGAAoG;AACpG,MAAM,CAAC,MAAM,SAAS,GAAsC;IAC1D,GAAG,UAAU;IACb,GAAG,UAAU;IACb,GAAG,YAAY;IACf,GAAG,WAAW;IACd,GAAG,mBAAmB;IACtB,GAAG,WAAW;IACd,GAAG,YAAY;IACf,GAAG,aAAa;IAChB,GAAG,UAAU;IACb,GAAG,WAAW;IACd,GAAG,cAAc;IACjB,GAAG,gBAAgB;IACnB,GAAG,UAAU;IACb,GAAG,eAAe;IAClB,GAAG,WAAW;IACd,GAAG,aAAa;IAChB,GAAG,YAAY;IACf,GAAG,SAAS;IACZ,GAAG,WAAW;CACf,CAAC"}
1
+ {"version":3,"file":"rule-docs.js","sourceRoot":"","sources":["../../../src/check/explain/rule-docs.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,oGAAoG;AACpG,MAAM,CAAC,MAAM,SAAS,GAAsC;IAC1D,GAAG,UAAU;IACb,GAAG,UAAU;IACb,GAAG,YAAY;IACf,GAAG,WAAW;IACd,GAAG,WAAW;IACd,GAAG,mBAAmB;IACtB,GAAG,WAAW;IACd,GAAG,YAAY;IACf,GAAG,aAAa;IAChB,GAAG,UAAU;IACb,GAAG,WAAW;IACd,GAAG,cAAc;IACjB,GAAG,gBAAgB;IACnB,GAAG,UAAU;IACb,GAAG,eAAe;IAClB,GAAG,WAAW;IACd,GAAG,aAAa;IAChB,GAAG,YAAY;IACf,GAAG,SAAS;IACZ,GAAG,WAAW;CACf,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"fixtures.d.ts","sourceRoot":"","sources":["../../../src/check/fixtures/fixtures.ts"],"names":[],"mappings":"AAqCA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAE5C;;;;GAIG;AACH,eAAO,MAAM,QAAQ,EAAE,SAAS,OAAO,EAsCtC,CAAC"}
1
+ {"version":3,"file":"fixtures.d.ts","sourceRoot":"","sources":["../../../src/check/fixtures/fixtures.ts"],"names":[],"mappings":"AAuCA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAE5C;;;;GAIG;AACH,eAAO,MAAM,QAAQ,EAAE,SAAS,OAAO,EAwCtC,CAAC"}
@@ -35,6 +35,8 @@ import { TENANCY_FIXTURES } from './tenancy-fixtures.js';
35
35
  import { TEST_FIXTURES } from './test-fixtures.js';
36
36
  import { TRACING_FIXTURES } from './tracing-fixtures.js';
37
37
  import { TREE_FIXTURES } from './tree-fixtures.js';
38
+ import { MODEL_FUNCTION_FIXTURES } from './model-function-fixtures.js';
39
+ import { VALUE_OBJECT_FILE_FIXTURES } from './value-object-file-fixtures.js';
38
40
  /**
39
41
  * Mini-projects proving each rule both ways. They ship with the CLI so that
40
42
  * `ddd-ts-kit check --self` can verify an installed build, and the test suite
@@ -78,5 +80,7 @@ export const FIXTURES = [
78
80
  ...TEST_FIXTURES,
79
81
  ...TRACING_FIXTURES,
80
82
  ...TREE_FIXTURES,
83
+ ...VALUE_OBJECT_FILE_FIXTURES,
84
+ ...MODEL_FUNCTION_FIXTURES,
81
85
  ];
82
86
  //# sourceMappingURL=fixtures.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"fixtures.js","sourceRoot":"","sources":["../../../src/check/fixtures/fixtures.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"fixtures.js","sourceRoot":"","sources":["../../../src/check/fixtures/fixtures.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { Fixture } from './fixture.js';
2
+ /** What `domain/value-object-class` says of the functions of `domain/` and of the shared kernel. */
3
+ export declare const MODEL_FUNCTION_FIXTURES: readonly Fixture[];
4
+ //# sourceMappingURL=model-function-fixtures.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-function-fixtures.d.ts","sourceRoot":"","sources":["../../../src/check/fixtures/model-function-fixtures.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAqB5C,oGAAoG;AACpG,eAAO,MAAM,uBAAuB,EAAE,SAAS,OAAO,EAsGrD,CAAC"}
@@ -0,0 +1,52 @@
1
+ import { PATHS } from './paths.js';
2
+ import { project } from './project.js';
3
+ import { SAMPLES } from './samples.js';
4
+ import { VALUE_FILES, VALUES } from './value-object-files.js';
5
+ const { RULE, SERVICE, SHARED_PLAIN, PLAIN } = VALUES;
6
+ const { classes, service } = VALUE_FILES;
7
+ const { BILLING } = PATHS;
8
+ const passing = (name, files) => ({ ruleId: RULE, name, expect: 'pass', files });
9
+ const failing = (name, content) => ({
10
+ ruleId: RULE,
11
+ name,
12
+ expect: { file: SERVICE },
13
+ files: classes(service(content)),
14
+ });
15
+ const MACHINE = `${BILLING}/domain/state-machines/invoice.state-machine.ts`;
16
+ /** What `domain/value-object-class` says of the functions of `domain/` and of the shared kernel. */
17
+ export const MODEL_FUNCTION_FIXTURES = [
18
+ passing('domain functions that answer a value object, a boolean, or a plain object only inside a callback', classes(service('export function invoiceTotal(lines: readonly Money[]): Money {\n const rows = lines.map((line) => {\n return { line, cents: 0 };\n });\n\n return rows.reduce((sum, { line }) => sum.add(line), Money.of(0));\n}\n'))),
19
+ passing('a specification answering an object of functions, literal or built from local closures', classes(service('export const invoiceTotal = (floor: Money) => {\n const isSatisfiedBy = (total: Money): boolean => total.equals(floor);\n\n return {\n isSatisfiedBy,\n describe(): string {\n return String(floor);\n },\n };\n};\n'))),
20
+ passing('a function that takes value objects and answers a record of value objects it builds', classes(service('export const invoiceTotal = (total: Money) => ({ first: Money.of(1), rest: total.add(total) });\n'))),
21
+ passing('a function that derives a record from another with a spread, as a reducer does', classes(service('type InvoiceState = { readonly status: string };\n\nexport const invoiceTotal = (state: InvoiceState, status: string): InvoiceState => ({ ...state, status });\n'))),
22
+ passing('a state machine declaration and a domain service class whose method answers an object', classes({
23
+ [MACHINE]: "import { defineStateMachine } from '@ddd-ts-kit/kernel';\n\nexport const invoiceLifecycle = defineStateMachine({\n states: ['draft', 'issued'],\n initial: ['draft'],\n transitions: { issue: { from: ['draft'], to: 'issued' } },\n refused: () => ({ code: 'REFUSED' }),\n});\n",
24
+ [`${BILLING}/test/unit/invoice.state-machine.spec.ts`]: SAMPLES.SPEC,
25
+ [`${BILLING}/domain/services/invoice-issue.service.ts`]: 'export class InvoiceIssueService {\n issue(): { cents: number } {\n return { cents: 0 };\n }\n}\n',
26
+ [`${BILLING}/test/unit/invoice-issue.service.spec.ts`]: SAMPLES.SPEC,
27
+ })),
28
+ passing('a spec and a presentation file of the shared kernel, outside the model, may build a plain object', classes({
29
+ [`${BILLING}/test/unit/money.spec.ts`]: `import { it } from 'vitest';\n\n${PLAIN}\nit('builds', () => money(1, 'EUR'));\n`,
30
+ 'src/shared-kernel/presentation/money.ts': PLAIN,
31
+ })),
32
+ passing('a helper of the shared kernel that answers a type of a package', classes({
33
+ 'src/shared-kernel/storable-stamp.ts': "import type { EventStamp } from '@ddd-ts-kit/kernel';\n\nexport function storableStamp(stamp: EventStamp): EventStamp {\n return { eventId: stamp.eventId, occurredAt: new Date(0), version: 1 };\n}\n",
34
+ })),
35
+ passing('a domain function written as a value, in a project whose config does not say "values"', project(service(PLAIN))),
36
+ failing('a domain function that builds a plain object', 'export function invoiceTotal(lines: readonly Money[], currency: string) {\n const cents = Math.round(lines.length);\n\n return { cents, currency };\n}\n'),
37
+ failing('a domain arrow function that answers a plain object', 'export const invoiceTotal = (line: Money, currency: string) => ({ line, currency });\n'),
38
+ failing('a domain constant bound to a function expression that builds a plain object', 'export const invoiceTotal = function (cents: number) {\n return { cents, currency: 0 };\n};\n'),
39
+ failing('a generic domain arrow function that answers a plain object', 'export const invoiceTotal = <T,>(cents: T) => ({ cents, currency: 0 });\n'),
40
+ failing('a domain function exported by an export list', 'export { invoiceTotal };\n\nfunction invoiceTotal(cents: number, currency: string) {\n return { cents, currency };\n}\n'),
41
+ failing('a domain arrow function exported by an export list', 'const invoiceTotal = (cents: number, currency: string) => ({ cents, currency });\n\nexport { invoiceTotal };\n'),
42
+ failing('a domain arrow function exported by default', 'export default (cents: number) => ({ cents, currency: 0 });\n'),
43
+ failing('a decision answered as a plain record', "export const invoiceTotal = (reason: string) => {\n return { kind: 'refused' as const, reason };\n};\n"),
44
+ failing('a value written as a record of data and closures', 'export const invoiceTotal = (cents: number) => ({ cents, doubled: (): number => cents * 2 });\n'),
45
+ {
46
+ ruleId: RULE,
47
+ name: 'a value of the shared kernel written as a function in a file not named *.vo.ts',
48
+ expect: { file: SHARED_PLAIN },
49
+ files: classes({ [SHARED_PLAIN]: PLAIN }),
50
+ },
51
+ ];
52
+ //# sourceMappingURL=model-function-fixtures.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-function-fixtures.js","sourceRoot":"","sources":["../../../src/check/fixtures/model-function-fixtures.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { Fixture } from './fixture.js';
2
+ /** What `domain/value-object-class` says of the files of `domain/value-objects/` and of the `*.vo.ts` of the shared kernel. */
3
+ export declare const VALUE_OBJECT_FILE_FIXTURES: readonly Fixture[];
4
+ //# sourceMappingURL=value-object-file-fixtures.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"value-object-file-fixtures.d.ts","sourceRoot":"","sources":["../../../src/check/fixtures/value-object-file-fixtures.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAsB5C,+HAA+H;AAC/H,eAAO,MAAM,0BAA0B,EAAE,SAAS,OAAO,EA2FxD,CAAC"}
@@ -0,0 +1,54 @@
1
+ import { PATHS } from './paths.js';
2
+ import { project } from './project.js';
3
+ import { SAMPLES } from './samples.js';
4
+ import { VALUE_FILES, VALUES } from './value-object-files.js';
5
+ const { RULE, MONEY, INVOICE_MONEY, SHARED, PROPS, PRIVATE, OF, PLAIN, KERNEL } = VALUES;
6
+ const { classes, money, VALUE_OBJECT, valueObject } = VALUE_FILES;
7
+ const passing = (name, files) => ({ ruleId: RULE, name, expect: 'pass', files });
8
+ /** A value object file holding `content`: the rule reports it in that file. */
9
+ const failing = (name, content, also) => ({
10
+ ruleId: RULE,
11
+ name,
12
+ expect: { file: MONEY },
13
+ ...(also === undefined ? {} : { also }),
14
+ files: classes(valueObject(content)),
15
+ });
16
+ const PROTECTED = ' protected constructor(props: MoneyProps) {\n super(props);\n }\n\n';
17
+ /** What `domain/value-object-class` says of the files of `domain/value-objects/` and of the `*.vo.ts` of the shared kernel. */
18
+ export const VALUE_OBJECT_FILE_FIXTURES = [
19
+ passing('a value object class with a private constructor, a static factory and the type of its props', classes(valueObject(VALUE_OBJECT))),
20
+ passing('a value object extending another one of the project, and one of the shared kernel', classes({
21
+ ...valueObject(money(PROTECTED, '').replace('export class Money', 'export abstract class Money')),
22
+ [INVOICE_MONEY]: `${VALUES.IMPORT_MONEY}export class InvoiceMoney extends Money {\n static due(cents: number): InvoiceMoney {\n return new InvoiceMoney({ cents });\n }\n}\n`,
23
+ [`${PATHS.BILLING}/test/unit/invoice-money.vo.spec.ts`]: SAMPLES.SPEC,
24
+ [SHARED]: VALUE_OBJECT,
25
+ })),
26
+ passing('a concrete value object with a protected constructor, and one that declares none', classes({
27
+ ...valueObject(money(PROTECTED, VALUES.OF)),
28
+ [INVOICE_MONEY]: `${KERNEL}\nexport class InvoiceMoney extends ValueObject<{ readonly cents: number }> {\n static zero(): InvoiceMoney {\n return new InvoiceMoney({ cents: 0 });\n }\n}\n`,
29
+ [`${PATHS.BILLING}/test/unit/invoice-money.vo.spec.ts`]: SAMPLES.SPEC,
30
+ })),
31
+ passing('a value object class exported after its declaration, by `export default`', classes(valueObject(`${VALUE_OBJECT.replace('export class Money', 'class Money')}\nexport default Money;\n`))),
32
+ passing('a value object file written as a function, in a project whose config does not say "values"', project(valueObject(`${PROPS}\n${PLAIN}`))),
33
+ failing('a value object file holding an arrow function that builds a plain object', `${PROPS}\n${PLAIN}`),
34
+ failing('a value object class that does not extend ValueObject', money(' private constructor(private readonly props: MoneyProps) {}\n\n', OF, '')),
35
+ failing('a value object class with a public constructor', money(' constructor(props: MoneyProps) {\n super(props);\n }\n\n', OF)),
36
+ failing('a value object class without a static factory', money(PRIVATE, '')),
37
+ failing('a value object file that also exports a function', `${VALUE_OBJECT}\nexport function zero(): Money {\n return Money.of(0);\n}\n`, ['clean/one-export-per-file']),
38
+ failing('a value object file that exports a function by an export list', `${VALUE_OBJECT}\nexport { zero };\n\nfunction zero(): Money {\n return Money.of(0);\n}\n`, ['clean/one-export-per-file']),
39
+ failing('a value object file that exports an arrow constant by an export list', `${VALUE_OBJECT}\nconst zero = (): Money => Money.of(0);\n\nexport { zero };\n`, ['clean/one-export-per-file']),
40
+ failing('a value object file that exports a constant bound to a function expression', `${VALUE_OBJECT}\nexport const zero = function (): Money {\n return Money.of(0);\n};\n`, ['clean/one-export-per-file']),
41
+ failing('a value object file that also exports an object literal', `${VALUE_OBJECT}\nexport const ZERO = { cents: 0 };\n`),
42
+ failing('a value object file that exports a parenthesized object literal', `${VALUE_OBJECT}\nexport const ZERO = ({ cents: 0 });\n`),
43
+ failing('a value object file that exports an object literal `as const`', `${VALUE_OBJECT}\nexport const ZERO = { cents: 0 } as const;\n`),
44
+ failing('a value object file that exports an object literal that `satisfies` its props', `${VALUE_OBJECT}\nexport const ZERO = { cents: 0 } satisfies MoneyProps;\n`),
45
+ failing('a value object file whose default export is an object literal', `${VALUE_OBJECT}\nexport default { cents: 0 };\n`),
46
+ failing('a value object file that exports a second class', `${VALUE_OBJECT}\nexport class InvoiceMoney extends ValueObject<MoneyProps> {\n static of(): InvoiceMoney {\n return new InvoiceMoney({ cents: 0 });\n }\n}\n`, ['clean/one-export-per-file', 'naming/one-concept-per-file']),
47
+ {
48
+ ruleId: RULE,
49
+ name: 'a value object of the shared kernel written as a function',
50
+ expect: { file: SHARED },
51
+ files: classes({ [SHARED]: PLAIN }),
52
+ },
53
+ ];
54
+ //# sourceMappingURL=value-object-file-fixtures.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"value-object-file-fixtures.js","sourceRoot":"","sources":["../../../src/check/fixtures/value-object-file-fixtures.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ import type { FixtureFiles } from './fixture-files.js';
2
+ /** The files and sources the fixtures of `domain/value-object-class` share. */
3
+ export declare const VALUES: {
4
+ readonly RULE: 'domain/value-object-class';
5
+ readonly MONEY: "src/contexts/billing/domain/value-objects/money.vo.ts";
6
+ readonly INVOICE_MONEY: "src/contexts/billing/domain/value-objects/invoice-money.vo.ts";
7
+ readonly SERVICE: "src/contexts/billing/domain/services/invoice-total.service.ts";
8
+ readonly SHARED: 'src/shared-kernel/money.vo.ts';
9
+ readonly SHARED_PLAIN: 'src/shared-kernel/money.ts';
10
+ readonly KERNEL: "import { ValueObject } from '@ddd-ts-kit/kernel';\n";
11
+ readonly PROPS: 'export type MoneyProps = {\n readonly cents: number;\n};\n';
12
+ readonly PRIVATE: ' private constructor(props: MoneyProps) {\n super(props);\n }\n\n';
13
+ readonly OF: ' static of(cents: number): Money {\n return new Money({ cents });\n }\n\n';
14
+ readonly PLAIN: 'export const money = (cents: number, currency: string) => ({ cents, currency });\n';
15
+ readonly IMPORT_MONEY: "import { Money } from '@/contexts/billing/domain/value-objects/money.vo.js';\n\n";
16
+ };
17
+ /** The builders of the fixtures of `domain/value-object-class`. */
18
+ export declare const VALUE_FILES: {
19
+ money: typeof money;
20
+ classes: typeof classes;
21
+ service: typeof service;
22
+ valueObject: typeof valueObject;
23
+ VALUE_OBJECT: string;
24
+ };
25
+ /** `Money`, a class of `money.vo.ts` with the constructor, the factories and the heritage given. */
26
+ declare function money(constructor: string, factory: string, base?: string): string;
27
+ /** A project that writes its values as classes, as `init` writes it, holding `files`. */
28
+ declare function classes(files: FixtureFiles): FixtureFiles;
29
+ /** The value object and a domain service holding `content`, each with its spec. */
30
+ declare function service(content: string): FixtureFiles;
31
+ /** `money.vo.ts` holding `content`, with its spec. */
32
+ declare function valueObject(content: string): FixtureFiles;
33
+ export {};
34
+ //# sourceMappingURL=value-object-files.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"value-object-files.d.ts","sourceRoot":"","sources":["../../../src/check/fixtures/value-object-files.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAOvD,+EAA+E;AAC/E,eAAO,MAAM,MAAM;aACjB,IAAI,EAAE,2BAA2B;aACjC,KAAK;aACL,aAAa;aACb,OAAO;aACP,MAAM,EAAE,+BAA+B;aACvC,YAAY,EAAE,4BAA4B;aAC1C,MAAM,EAAE,qDAAqD;aAC7D,KAAK,EAAE,6DAA6D;aACpE,OAAO,EAAE,wEAAwE;aACjF,EAAE,EAAE,gFAAgF;aACpF,KAAK,EAAE,oFAAoF;aAC3F,YAAY,EAAE,kFAAkF;CACxF,CAAC;AAKX,mEAAmE;AACnE,eAAO,MAAM,WAAW;;;;;;CAAyD,CAAC;AAElF,oGAAoG;AACpG,iBAAS,KAAK,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,SAAqC,GAAG,MAAM,CAEtG;AAED,yFAAyF;AACzF,iBAAS,OAAO,CAAC,KAAK,EAAE,YAAY,GAAG,YAAY,CAElD;AAED,mFAAmF;AACnF,iBAAS,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,YAAY,CAM9C;AAED,sDAAsD;AACtD,iBAAS,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,YAAY,CAElD"}
@@ -0,0 +1,46 @@
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 { SAMPLES } from './samples.js';
6
+ const { BILLING } = PATHS;
7
+ /** The files and sources the fixtures of `domain/value-object-class` share. */
8
+ export const VALUES = {
9
+ RULE: 'domain/value-object-class',
10
+ MONEY: `${BILLING}/domain/value-objects/money.vo.ts`,
11
+ INVOICE_MONEY: `${BILLING}/domain/value-objects/invoice-money.vo.ts`,
12
+ SERVICE: `${BILLING}/domain/services/invoice-total.service.ts`,
13
+ SHARED: 'src/shared-kernel/money.vo.ts',
14
+ SHARED_PLAIN: 'src/shared-kernel/money.ts',
15
+ KERNEL: "import { ValueObject } from '@ddd-ts-kit/kernel';\n",
16
+ PROPS: 'export type MoneyProps = {\n readonly cents: number;\n};\n',
17
+ PRIVATE: ' private constructor(props: MoneyProps) {\n super(props);\n }\n\n',
18
+ OF: ' static of(cents: number): Money {\n return new Money({ cents });\n }\n\n',
19
+ PLAIN: 'export const money = (cents: number, currency: string) => ({ cents, currency });\n',
20
+ IMPORT_MONEY: "import { Money } from '@/contexts/billing/domain/value-objects/money.vo.js';\n\n",
21
+ };
22
+ /** The value object every passing fixture starts from: a private constructor and a static factory. */
23
+ const VALUE_OBJECT = money(VALUES.PRIVATE, VALUES.OF);
24
+ /** The builders of the fixtures of `domain/value-object-class`. */
25
+ export const VALUE_FILES = { money, classes, service, valueObject, VALUE_OBJECT };
26
+ /** `Money`, a class of `money.vo.ts` with the constructor, the factories and the heritage given. */
27
+ function money(constructor, factory, base = 'extends ValueObject<MoneyProps> ') {
28
+ return `${VALUES.KERNEL}\n${VALUES.PROPS}\nexport class Money ${base}{\n${constructor}${factory} add(other: Money): Money {\n return Money.of(this.props.cents + other.props.cents);\n }\n}\n`;
29
+ }
30
+ /** A project that writes its values as classes, as `init` writes it, holding `files`. */
31
+ function classes(files) {
32
+ return project(files, { [CONFIG_FILE]: config({ stack: { values: 'classes' } }) });
33
+ }
34
+ /** The value object and a domain service holding `content`, each with its spec. */
35
+ function service(content) {
36
+ return {
37
+ ...valueObject(VALUE_OBJECT),
38
+ [VALUES.SERVICE]: `${VALUES.IMPORT_MONEY}${content}`,
39
+ [`${BILLING}/test/unit/invoice-total.service.spec.ts`]: SAMPLES.SPEC,
40
+ };
41
+ }
42
+ /** `money.vo.ts` holding `content`, with its spec. */
43
+ function valueObject(content) {
44
+ return { [VALUES.MONEY]: content, [`${BILLING}/test/unit/money.vo.spec.ts`]: SAMPLES.SPEC };
45
+ }
46
+ //# sourceMappingURL=value-object-files.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"value-object-files.js","sourceRoot":"","sources":["../../../src/check/fixtures/value-object-files.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC,MAAM,EAAE,OAAO,EAAE,GAAG,KAAK,CAAC;AAE1B,+EAA+E;AAC/E,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,IAAI,EAAE,2BAA2B;IACjC,KAAK,EAAE,GAAG,OAAO,mCAAmC;IACpD,aAAa,EAAE,GAAG,OAAO,2CAA2C;IACpE,OAAO,EAAE,GAAG,OAAO,2CAA2C;IAC9D,MAAM,EAAE,+BAA+B;IACvC,YAAY,EAAE,4BAA4B;IAC1C,MAAM,EAAE,qDAAqD;IAC7D,KAAK,EAAE,6DAA6D;IACpE,OAAO,EAAE,wEAAwE;IACjF,EAAE,EAAE,gFAAgF;IACpF,KAAK,EAAE,oFAAoF;IAC3F,YAAY,EAAE,kFAAkF;CACxF,CAAC;AAEX,sGAAsG;AACtG,MAAM,YAAY,GAAG,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;AAEtD,mEAAmE;AACnE,MAAM,CAAC,MAAM,WAAW,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,CAAC;AAElF,oGAAoG;AACpG,SAAS,KAAK,CAAC,WAAmB,EAAE,OAAe,EAAE,IAAI,GAAG,kCAAkC;IAC5F,OAAO,GAAG,MAAM,CAAC,MAAM,KAAK,MAAM,CAAC,KAAK,wBAAwB,IAAI,MAAM,WAAW,GAAG,OAAO,oGAAoG,CAAC;AACtM,CAAC;AAED,yFAAyF;AACzF,SAAS,OAAO,CAAC,KAAmB;IAClC,OAAO,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;AACrF,CAAC;AAED,mFAAmF;AACnF,SAAS,OAAO,CAAC,OAAe;IAC9B,OAAO;QACL,GAAG,WAAW,CAAC,YAAY,CAAC;QAC5B,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,GAAG,MAAM,CAAC,YAAY,GAAG,OAAO,EAAE;QACpD,CAAC,GAAG,OAAO,0CAA0C,CAAC,EAAE,OAAO,CAAC,IAAI;KACrE,CAAC;AACJ,CAAC;AAED,sDAAsD;AACtD,SAAS,WAAW,CAAC,OAAe;IAClC,OAAO,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,CAAC,GAAG,OAAO,6BAA6B,CAAC,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC;AAC9F,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Rule } from '../model/rule.js';
2
+ export declare const domainValueObjectClass: Rule;
3
+ //# sourceMappingURL=domain-value-object-class.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"domain-value-object-class.d.ts","sourceRoot":"","sources":["../../../src/check/rules/domain-value-object-class.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAQ7C,eAAO,MAAM,sBAAsB,EAAE,IAQpC,CAAC"}
@@ -0,0 +1,21 @@
1
+ import { perFile } from '../support/per-file.js';
2
+ import { isModelFile } from '../values/is-model-file.js';
3
+ import { isValueObjectFile } from '../values/is-value-object-file.js';
4
+ import { plainValueFunctions } from '../values/plain-value-functions.js';
5
+ import { valueObjectFileFindings } from '../values/value-object-file-findings.js';
6
+ export const domainValueObjectClass = {
7
+ id: 'domain/value-object-class',
8
+ description: 'Under "stack.values": "classes", a value object is a class: a file of domain/value-objects/ (or a *.vo.ts of the shared kernel) exports one class extending ValueObject, with a private or protected constructor and static factories, and no function or object literal; no exported function of domain/ or of the shared kernel answers a record of data (no spread, nothing a call of the model built).',
9
+ scope: 'file',
10
+ run(project) {
11
+ return project.config.stack.values === 'classes' ? perFile(project, this.id, (file) => judge(project, file)) : [];
12
+ },
13
+ };
14
+ function judge(project, file) {
15
+ const { sharedKernelDir } = project.config;
16
+ if (isValueObjectFile(file.path, file.location, sharedKernelDir)) {
17
+ return valueObjectFileFindings(file, sharedKernelDir);
18
+ }
19
+ return isModelFile(file.path, file.location, sharedKernelDir) && !file.isTest ? plainValueFunctions(file) : [];
20
+ }
21
+ //# sourceMappingURL=domain-value-object-class.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"domain-value-object-class.js","sourceRoot":"","sources":["../../../src/check/rules/domain-value-object-class.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACzD,OAAO,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AACtE,OAAO,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AACzE,OAAO,EAAE,uBAAuB,EAAE,MAAM,yCAAyC,CAAC;AAElF,MAAM,CAAC,MAAM,sBAAsB,GAAS;IAC1C,EAAE,EAAE,2BAA2B;IAC/B,WAAW,EACT,4YAA4Y;IAC9Y,KAAK,EAAE,MAAM;IACb,GAAG,CAAC,OAAO;QACT,OAAO,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACpH,CAAC;CACF,CAAC;AAEF,SAAS,KAAK,CAAC,OAAgB,EAAE,IAAgB;IAC/C,MAAM,EAAE,eAAe,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IAE3C,IAAI,iBAAiB,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,eAAe,CAAC,EAAE,CAAC;QACjE,OAAO,uBAAuB,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC;IACxD,CAAC;IAED,OAAO,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AACjH,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * The brace opening the body of a class whose heritage starts at `from`, past the object types
3
+ * its type arguments may hold: `class Money extends ValueObject<{ readonly cents: number }> {`.
4
+ */
5
+ export declare function classBodyBrace(code: string, from: number): number;
6
+ //# sourceMappingURL=class-body-brace.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"class-body-brace.d.ts","sourceRoot":"","sources":["../../../src/check/structure/class-body-brace.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAkBjE"}
@@ -0,0 +1,22 @@
1
+ import { matchingBracket } from '../text/matching-bracket.js';
2
+ /**
3
+ * The brace opening the body of a class whose heritage starts at `from`, past the object types
4
+ * its type arguments may hold: `class Money extends ValueObject<{ readonly cents: number }> {`.
5
+ */
6
+ export function classBodyBrace(code, from) {
7
+ let angles = 0;
8
+ for (let i = from; i < code.length; i += 1) {
9
+ const char = code.charAt(i);
10
+ if (char === '{' && angles === 0) {
11
+ return i;
12
+ }
13
+ if (char === '<' || (char === '>' && code.charAt(i - 1) !== '=')) {
14
+ angles += char === '<' ? 1 : -1;
15
+ }
16
+ else if ('({['.includes(char)) {
17
+ i = matchingBracket(code, i);
18
+ }
19
+ }
20
+ return code.length - 1;
21
+ }
22
+ //# sourceMappingURL=class-body-brace.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"class-body-brace.js","sourceRoot":"","sources":["../../../src/check/structure/class-body-brace.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAE9D;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,IAAY,EAAE,IAAY;IACvD,IAAI,MAAM,GAAG,CAAC,CAAC;IAEf,KAAK,IAAI,CAAC,GAAG,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QAC3C,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAE5B,IAAI,IAAI,KAAK,GAAG,IAAI,MAAM,KAAK,CAAC,EAAE,CAAC;YACjC,OAAO,CAAC,CAAC;QACX,CAAC;QAED,IAAI,IAAI,KAAK,GAAG,IAAI,CAAC,IAAI,KAAK,GAAG,IAAI,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC;YACjE,MAAM,IAAI,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAClC,CAAC;aAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YAChC,CAAC,GAAG,eAAe,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QAC/B,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;AACzB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"read-structure.d.ts","sourceRoot":"","sources":["../../../src/check/structure/read-structure.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAG5C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAGnD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAEhE,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,OAAO,EAAE,SAAS,UAAU,EAAE,CAAC;IACxC,QAAQ,CAAC,SAAS,EAAE,SAAS,gBAAgB,EAAE,CAAC;CACjD;AAQD;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,IAAI,GAAG,SAAS,CAKnD"}
1
+ {"version":3,"file":"read-structure.d.ts","sourceRoot":"","sources":["../../../src/check/structure/read-structure.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAI5C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAGnD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAEhE,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,OAAO,EAAE,SAAS,UAAU,EAAE,CAAC;IACxC,QAAQ,CAAC,SAAS,EAAE,SAAS,gBAAgB,EAAE,CAAC;CACjD;AAQD;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,IAAI,GAAG,SAAS,CAKnD"}
@@ -1,4 +1,5 @@
1
1
  import { braceDepthAt } from '../text/brace-depth-at.js';
2
+ import { classBodyBrace } from './class-body-brace.js';
2
3
  import { matchingBracket } from '../text/matching-bracket.js';
3
4
  import { methodsOf } from './methods-of.js';
4
5
  import { signatureAt } from './signature-at.js';
@@ -18,7 +19,8 @@ export function readStructure(scan) {
18
19
  }
19
20
  function classShape(scan, match) {
20
21
  const { code } = scan;
21
- const bodyStart = match.index + match[0].length - 1;
22
+ const named = /^class\s+[\w$]+/.exec(match[0])?.[0].length ?? 0;
23
+ const bodyStart = classBodyBrace(code, match.index + named);
22
24
  const bodyClose = matchingBracket(code, bodyStart);
23
25
  const before = BEFORE_CLASS.exec(code.slice(Math.max(0, match.index - 40), match.index));
24
26
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"read-structure.js","sourceRoot":"","sources":["../../../src/check/structure/read-structure.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"read-structure.js","sourceRoot":"","sources":["../../../src/check/structure/read-structure.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { FunctionBody } from './function-body.js';
2
+ /**
3
+ * The object literals a function answers by itself, as the offsets of their `{`: the expression
4
+ * of an arrow, or what a `return` of its own block gives back. A `return` of a function nested
5
+ * in it answers for that function, not for this one.
6
+ */
7
+ export declare function answeredLiterals(code: string, body: FunctionBody): number[];
8
+ //# sourceMappingURL=answered-literals.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"answered-literals.d.ts","sourceRoot":"","sources":["../../../src/check/values/answered-literals.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAMvD;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,GAAG,MAAM,EAAE,CAa3E"}
@@ -0,0 +1,20 @@
1
+ import { literalAt } from './literal-at.js';
2
+ import { nestedBodies } from './nested-bodies.js';
3
+ const RETURN = /(?<![\w$.])return\b/g;
4
+ /**
5
+ * The object literals a function answers by itself, as the offsets of their `{`: the expression
6
+ * of an arrow, or what a `return` of its own block gives back. A `return` of a function nested
7
+ * in it answers for that function, not for this one.
8
+ */
9
+ export function answeredLiterals(code, body) {
10
+ if (body.kind === 'expression') {
11
+ const literal = literalAt(code, body.start);
12
+ return literal === undefined ? [] : [literal];
13
+ }
14
+ const nested = nestedBodies(code, body.open, body.close);
15
+ const own = (index) => !nested.some(([open, close]) => index > open && index < close);
16
+ return [...code.matchAll(RETURN)]
17
+ .filter(({ index }) => index > body.open && index < body.close && own(index))
18
+ .flatMap(({ index, 0: keyword }) => literalAt(code, index + keyword.length) ?? []);
19
+ }
20
+ //# sourceMappingURL=answered-literals.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"answered-literals.js","sourceRoot":"","sources":["../../../src/check/values/answered-literals.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,MAAM,MAAM,GAAG,sBAAsB,CAAC;AAEtC;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAY,EAAE,IAAkB;IAC/D,IAAI,IAAI,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;QAC/B,MAAM,OAAO,GAAG,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;QAE5C,OAAO,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;IAChD,CAAC;IAED,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;IACzD,MAAM,GAAG,GAAG,CAAC,KAAa,EAAW,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,KAAK,GAAG,IAAI,IAAI,KAAK,GAAG,KAAK,CAAC,CAAC;IAEvG,OAAO,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;SAC9B,MAAM,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,KAAK,GAAG,IAAI,CAAC,IAAI,IAAI,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC;SAC5E,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,EAAE,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;AACvF,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { FunctionBody } from './function-body.js';
2
+ /** The body of the arrow function the expression at `from` is; undefined when the expression is not one. */
3
+ export declare function arrowBody(code: string, from: number): FunctionBody | undefined;
4
+ //# sourceMappingURL=arrow-body.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"arrow-body.d.ts","sourceRoot":"","sources":["../../../src/check/values/arrow-body.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAKvD,4GAA4G;AAC5G,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS,CAY9E"}
@@ -0,0 +1,52 @@
1
+ import { BRACKETS } from '../text/brackets.js';
2
+ import { matchingBracket } from '../text/matching-bracket.js';
3
+ /** What may stand before the arrow of an arrow function: its type parameters, its parameters and its return type. */
4
+ const PARAMETERS = /^(?:async\s*)?(?:<[\s\S]*>\s*)?(?:\([\s\S]*\)|[\w$]+)(?:\s*:[\s\S]*)?$/;
5
+ /** The body of the arrow function the expression at `from` is; undefined when the expression is not one. */
6
+ export function arrowBody(code, from) {
7
+ const arrow = arrowAtDepthZero(code, afterTypeParameters(code, from));
8
+ if (arrow === undefined || !PARAMETERS.test(code.slice(from, arrow).trim())) {
9
+ return undefined;
10
+ }
11
+ const start = arrow + 2 + (/^\s*/.exec(code.slice(arrow + 2))?.[0].length ?? 0);
12
+ return code.charAt(start) === '{'
13
+ ? { kind: 'block', open: start, close: matchingBracket(code, start) }
14
+ : { kind: 'expression', start };
15
+ }
16
+ /** Past the type parameters an arrow may open with, `<T,>` included, whose commas do not end the expression. */
17
+ function afterTypeParameters(code, from) {
18
+ const start = from + (/^(?:async\s*)?/.exec(code.slice(from))?.[0].length ?? 0);
19
+ let angles = 0;
20
+ for (let i = start; code.charAt(start) === '<' && i < code.length; i += 1) {
21
+ angles += code.charAt(i) === '<' ? 1 : 0;
22
+ angles -= code.charAt(i) === '>' && code.charAt(i - 1) !== '=' ? 1 : 0;
23
+ if (angles === 0) {
24
+ return i + 1;
25
+ }
26
+ }
27
+ return from;
28
+ }
29
+ /** The first `=>` outside any bracket before the expression ends. */
30
+ function arrowAtDepthZero(code, from) {
31
+ let depth = 0;
32
+ for (let i = from; i < code.length - 1 && depth >= 0; i += 1) {
33
+ const char = code.charAt(i);
34
+ if (depth === 0 && endsBefore(code, i)) {
35
+ return char === '=' ? i : undefined;
36
+ }
37
+ depth += depthChange(char);
38
+ }
39
+ return undefined;
40
+ }
41
+ /** At depth zero: the arrow found, or the end of the expression without one. */
42
+ function endsBefore(code, at) {
43
+ const char = code.charAt(at);
44
+ return (char === '=' && code.charAt(at + 1) === '>') || char === ';' || char === ',';
45
+ }
46
+ function depthChange(char) {
47
+ if (BRACKETS.openers.includes(char)) {
48
+ return 1;
49
+ }
50
+ return BRACKETS.closers.includes(char) ? -1 : 0;
51
+ }
52
+ //# sourceMappingURL=arrow-body.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"arrow-body.js","sourceRoot":"","sources":["../../../src/check/values/arrow-body.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * What an entry of an object literal holds: `behaviour`, a function; `built`, what a call or
3
+ * `new` of the model built (`Money.of(1)`, `total.add(tax)`, `new Slot(..)`), a call of the
4
+ * language aside (`Math.round(..)`, `new Date(..)`); `data`, anything else: a literal, a
5
+ * parameter, an operation on them.
6
+ */
7
+ export type EntryRole = 'behaviour' | 'built' | 'data';
8
+ /** The role of an expression, in blanked code; a name is read from its first declaration in `module`, found by name. */
9
+ export declare function expressionRole(expression: string, module: string, seen?: ReadonlySet<string>): EntryRole;
10
+ //# sourceMappingURL=entry-role.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entry-role.d.ts","sourceRoot":"","sources":["../../../src/check/values/entry-role.ts"],"names":[],"mappings":"AAKA;;;;;GAKG;AACH,MAAM,MAAM,SAAS,GAAG,WAAW,GAAG,OAAO,GAAG,MAAM,CAAC;AAOvD,wHAAwH;AACxH,wBAAgB,cAAc,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,GAAE,WAAW,CAAC,MAAM,CAAa,GAAG,SAAS,CAenH"}