@ddd-ts-kit/eslint-plugin 0.2.0 → 0.4.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.
- package/README.md +6 -0
- package/dist/project/config.d.ts +2 -0
- package/dist/project/config.d.ts.map +1 -1
- package/dist/project/parse-config.d.ts.map +1 -1
- package/dist/project/parse-config.js +2 -0
- package/dist/project/parse-config.js.map +1 -1
- package/dist/rules/authz-declared.d.ts +1 -1
- package/dist/rules/authz-declared.d.ts.map +1 -1
- package/dist/rules/authz-declared.js +18 -0
- package/dist/rules/authz-declared.js.map +1 -1
- package/dist/rules/domain-no-generic-error.js +1 -1
- package/dist/rules/domain-no-generic-error.js.map +1 -1
- package/dist/rules/errors-constructor-not-public.d.ts +2 -0
- package/dist/rules/errors-constructor-not-public.d.ts.map +1 -0
- package/dist/rules/errors-constructor-not-public.js +41 -0
- package/dist/rules/errors-constructor-not-public.js.map +1 -0
- package/dist/rules/errors-factory-name.d.ts +4 -0
- package/dist/rules/errors-factory-name.d.ts.map +1 -0
- package/dist/rules/errors-factory-name.js +88 -0
- package/dist/rules/errors-factory-name.js.map +1 -0
- package/dist/rules/errors-through-factory.d.ts +2 -0
- package/dist/rules/errors-through-factory.d.ts.map +1 -0
- package/dist/rules/errors-through-factory.js +39 -0
- package/dist/rules/errors-through-factory.js.map +1 -0
- package/dist/rules/presentation-controller-delegates.d.ts +4 -0
- package/dist/rules/presentation-controller-delegates.d.ts.map +1 -0
- package/dist/rules/presentation-controller-delegates.js +85 -0
- package/dist/rules/presentation-controller-delegates.js.map +1 -0
- package/dist/rules/presentation-controller-shape.d.ts +4 -0
- package/dist/rules/presentation-controller-shape.d.ts.map +1 -0
- package/dist/rules/presentation-controller-shape.js +49 -0
- package/dist/rules/presentation-controller-shape.js.map +1 -0
- package/dist/rules/presentation-guard-at-the-edge.d.ts +4 -0
- package/dist/rules/presentation-guard-at-the-edge.d.ts.map +1 -0
- package/dist/rules/presentation-guard-at-the-edge.js +39 -0
- package/dist/rules/presentation-guard-at-the-edge.js.map +1 -0
- package/dist/rules/rules.d.ts.map +1 -1
- package/dist/rules/rules.js +12 -0
- package/dist/rules/rules.js.map +1 -1
- package/dist/support/declarations/declaration-reader.d.ts +1 -1
- package/dist/support/declarations/declaration-reader.d.ts.map +1 -1
- package/dist/support/declarations/declaration-reader.js +5 -2
- package/dist/support/declarations/declaration-reader.js.map +1 -1
- package/dist/support/declarations/declared-roles.d.ts.map +1 -1
- package/dist/support/declarations/declared-roles.js +4 -0
- package/dist/support/declarations/declared-roles.js.map +1 -1
- package/dist/support/errors/constant-case.d.ts +3 -0
- package/dist/support/errors/constant-case.d.ts.map +1 -0
- package/dist/support/errors/constant-case.js +6 -0
- package/dist/support/errors/constant-case.js.map +1 -0
- package/dist/support/errors/is-error-class.d.ts +4 -0
- package/dist/support/errors/is-error-class.d.ts.map +1 -0
- package/dist/support/errors/is-error-class.js +6 -0
- package/dist/support/errors/is-error-class.js.map +1 -0
- package/dist/support/errors/is-error-file.d.ts +4 -0
- package/dist/support/errors/is-error-file.d.ts.map +1 -0
- package/dist/support/errors/is-error-file.js +10 -0
- package/dist/support/errors/is-error-file.js.map +1 -0
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/docs/rules/errors-constructor-not-public.md +53 -0
- package/docs/rules/errors-factory-name.md +50 -0
- package/docs/rules/errors-through-factory.md +45 -0
- package/docs/rules/presentation-controller-delegates.md +57 -0
- package/docs/rules/presentation-controller-shape.md +50 -0
- package/docs/rules/presentation-guard-at-the-edge.md +55 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -104,7 +104,13 @@ is an error whatever the configured limit). `strict` sets every rule to `error`.
|
|
|
104
104
|
| [`domain/aggregate-encapsulation`](docs/rules/domain-aggregate-encapsulation.md) | `ddd-ts-kit/domain-aggregate-encapsulation` | aggregates and entities: no public constructor, no public mutable property, no setter | `error` | custom |
|
|
105
105
|
| [`domain/value-object-immutability`](docs/rules/domain-value-object-immutability.md) | `ddd-ts-kit/domain-value-object-immutability` | value objects: every property `readonly`, no setter, no write to `this` | `error` | custom |
|
|
106
106
|
| [`domain/no-generic-error`](docs/rules/domain-no-generic-error.md) | `ddd-ts-kit/domain-no-generic-error` | no `throw new Error(...)` in `domain/` and `application/` | `error` | custom |
|
|
107
|
+
| [`errors/through-factory`](docs/rules/errors-through-factory.md) | `ddd-ts-kit/errors-through-factory` | under `"stack.refusals": "factories"`, no `new` of a class imported from `domain/errors/`: a refusal is built by a static factory of its concept class | `error` | custom |
|
|
108
|
+
| [`errors/constructor-not-public`](docs/rules/errors-constructor-not-public.md) | `ddd-ts-kit/errors-constructor-not-public` | under `"stack.refusals": "factories"`, an error class of `domain/errors/` has no public constructor, declared or inherited from `DomainError` | `error` | custom |
|
|
109
|
+
| [`errors/factory-name`](docs/rules/errors-factory-name.md) | `ddd-ts-kit/errors-factory-name` | under `"stack.refusals": "factories"`, a factory is not named `create`, `make`, `of` or `error1`, and its code is its name in constant case, alone or with the name of the concept | `error` | custom |
|
|
107
110
|
| [`application/handler-shape`](docs/rules/application-handler-shape.md) | `ddd-ts-kit/application-handler-shape` | a `*.handler.ts` exports one class whose single public method is `execute` | `error` | custom |
|
|
111
|
+
| [`presentation/controller-shape`](docs/rules/presentation-controller-shape.md) | `ddd-ts-kit/presentation-controller-shape` | a `*.controller.ts` carrying `@Controller` exports one class whose single public method is `handle` | `error` | custom |
|
|
112
|
+
| [`presentation/controller-delegates`](docs/rules/presentation-controller-delegates.md) | `ddd-ts-kit/presentation-controller-delegates` | a controller is given the bus of its method, a request mapper and a serializer, nothing else | `error` | custom |
|
|
113
|
+
| [`presentation/guard-at-the-edge`](docs/rules/presentation-guard-at-the-edge.md) | `ddd-ts-kit/presentation-guard-at-the-edge` | a `*.guard.ts` imports nothing from `domain/` or `infrastructure/`, no repository, no unit of work, no command bus | `error` | custom |
|
|
108
114
|
| [`application/command-query-separation`](docs/rules/application-command-query-separation.md) | `ddd-ts-kit/application-command-query-separation` | nothing under `application/queries` calls `save`, `delete`, `publish` on a dependency | `warn` | custom |
|
|
109
115
|
| [`domain-events/dispatched-on-save`](docs/rules/domain-events-dispatched-on-save.md) | `ddd-ts-kit/domain-events-dispatched-on-save` | no `pullEvents()` in `application/` and `infrastructure/`; no `DomainEventDispatcher` imported, listed as a dependency or received by a constructor in `application/commands`, `application/queries` and a repository adapter | `error` | custom |
|
|
110
116
|
| [`domain-events/transactional-before-commit`](docs/rules/domain-events-transactional-before-commit.md) | `ddd-ts-kit/domain-events-transactional-before-commit` | a class carrying `@DomainEventHandler` without `phase: 'after-commit'` depends on no `Cache`, `Lock`, `RateLimiter`, `JobScheduler` or `EventBus` of the kernel and on nothing imported from `infrastructure/`, another context, the platform or a package other than `@ddd-ts-kit/kernel` and `@ddd-ts-kit/auth`; an after-commit handler does not depend on `IntegrationEventPublisher`. The adapters of an `application/ports/` port and the phase of an explicit-style handler are held by the CLI checker | `error` | custom |
|
package/dist/project/config.d.ts
CHANGED
|
@@ -18,6 +18,8 @@ export interface Stack {
|
|
|
18
18
|
readonly assembly: Assembly;
|
|
19
19
|
/** Where a declared class states what it depends on: its constructor signature, or the list of its decorator. A config that does not say is `listed`. */
|
|
20
20
|
readonly dependencies: 'signature' | 'listed';
|
|
21
|
+
/** How a domain error is written: static factories on one class per concept, or a class per error. A config that does not say is `classes`. */
|
|
22
|
+
readonly refusals: 'factories' | 'classes';
|
|
21
23
|
/** Kept as written: with `prisma` the generated client under `generated/` has an import alias of its own. */
|
|
22
24
|
readonly orm: string;
|
|
23
25
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/project/config.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,KAAK,CAAC;AAEhD,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;CAC/B;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,SAAS,EAAE,SAAS,QAAQ,EAAE,CAAC;IACxC,QAAQ,CAAC,gBAAgB,EAAE,SAAS,MAAM,EAAE,CAAC;CAC9C;AAED,MAAM,MAAM,KAAK,GAAG,UAAU,GAAG,UAAU,CAAC;AAE5C,MAAM,MAAM,QAAQ,GAAG,QAAQ,GAAG,WAAW,CAAC;AAE9C,6EAA6E;AAC7E,MAAM,WAAW,KAAK;IACpB,qIAAqI;IACrI,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IACtB,iHAAiH;IACjH,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,yJAAyJ;IACzJ,QAAQ,CAAC,YAAY,EAAE,WAAW,GAAG,QAAQ,CAAC;IAC9C,6GAA6G;IAC7G,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,MAAM;IACrB,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;CACnC;AAED,mFAAmF;AACnF,MAAM,WAAW,WAAW;IAC1B,kGAAkG;IAClG,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,KAAK,EAAE,SAAS,WAAW,EAAE,CAAC;CACxC;AAED,MAAM,WAAW,MAAM;IACrB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,8GAA8G;IAC9G,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC,CAAC;IAC3D,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACjD,QAAQ,CAAC,qBAAqB,EAAE,SAAS,MAAM,EAAE,CAAC;IAClD,QAAQ,CAAC,0BAA0B,EAAE,SAAS,MAAM,EAAE,CAAC;IACvD,QAAQ,CAAC,gCAAgC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC7D,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,kGAAkG;IAClG,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC;IAChC,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IACtB,gJAAgJ;IAChJ,QAAQ,CAAC,kBAAkB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC;CACvE"}
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/project/config.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,KAAK,CAAC;AAEhD,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;CAC/B;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,SAAS,EAAE,SAAS,QAAQ,EAAE,CAAC;IACxC,QAAQ,CAAC,gBAAgB,EAAE,SAAS,MAAM,EAAE,CAAC;CAC9C;AAED,MAAM,MAAM,KAAK,GAAG,UAAU,GAAG,UAAU,CAAC;AAE5C,MAAM,MAAM,QAAQ,GAAG,QAAQ,GAAG,WAAW,CAAC;AAE9C,6EAA6E;AAC7E,MAAM,WAAW,KAAK;IACpB,qIAAqI;IACrI,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IACtB,iHAAiH;IACjH,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,yJAAyJ;IACzJ,QAAQ,CAAC,YAAY,EAAE,WAAW,GAAG,QAAQ,CAAC;IAC9C,+IAA+I;IAC/I,QAAQ,CAAC,QAAQ,EAAE,WAAW,GAAG,SAAS,CAAC;IAC3C,6GAA6G;IAC7G,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,MAAM;IACrB,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;CACnC;AAED,mFAAmF;AACnF,MAAM,WAAW,WAAW;IAC1B,kGAAkG;IAClG,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,KAAK,EAAE,SAAS,WAAW,EAAE,CAAC;CACxC;AAED,MAAM,WAAW,MAAM;IACrB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,8GAA8G;IAC9G,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC,CAAC;IAC3D,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACjD,QAAQ,CAAC,qBAAqB,EAAE,SAAS,MAAM,EAAE,CAAC;IAClD,QAAQ,CAAC,0BAA0B,EAAE,SAAS,MAAM,EAAE,CAAC;IACvD,QAAQ,CAAC,gCAAgC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC7D,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,kGAAkG;IAClG,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC;IAChC,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IACtB,gJAAgJ;IAChJ,QAAQ,CAAC,kBAAkB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC;CACvE"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parse-config.d.ts","sourceRoot":"","sources":["../../src/project/parse-config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAuE,MAAM,EAAE,MAAM,aAAa,CAAC;AAO/G,+GAA+G;AAC/G,eAAO,MAAM,sBAAsB,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"parse-config.d.ts","sourceRoot":"","sources":["../../src/project/parse-config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAuE,MAAM,EAAE,MAAM,aAAa,CAAC;AAO/G,+GAA+G;AAC/G,eAAO,MAAM,sBAAsB,MAAM,CAAC;AAoB1C;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,CAyBhD"}
|
|
@@ -7,6 +7,7 @@ export const FUNCTION_LINES_CEILING = 100;
|
|
|
7
7
|
const STYLES = ['declared', 'explicit'];
|
|
8
8
|
const ASSEMBLIES = ['barrel', 'discovery'];
|
|
9
9
|
const DEPENDENCY_STATEMENTS = ['signature', 'listed'];
|
|
10
|
+
const REFUSAL_FORMS = ['factories', 'classes'];
|
|
10
11
|
const KERNEL = ['@ddd-ts-kit/kernel'];
|
|
11
12
|
/** The application layer declares its permissions and policies with `@ddd-ts-kit/auth`, which imports the kernel only. */
|
|
12
13
|
const APPLICATION = [...KERNEL, '@ddd-ts-kit/auth'];
|
|
@@ -49,6 +50,7 @@ function parseStack(value) {
|
|
|
49
50
|
style: oneOf(STYLES, raw['style'], 'explicit'),
|
|
50
51
|
assembly: oneOf(ASSEMBLIES, raw['assembly'], 'barrel'),
|
|
51
52
|
dependencies: oneOf(DEPENDENCY_STATEMENTS, raw['dependencies'], 'listed'),
|
|
53
|
+
refusals: oneOf(REFUSAL_FORMS, raw['refusals'], 'classes'),
|
|
52
54
|
orm: text(raw['orm'], 'drizzle'),
|
|
53
55
|
};
|
|
54
56
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parse-config.js","sourceRoot":"","sources":["../../src/project/parse-config.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE1C,MAAM,cAAc,GAAW,EAAE,aAAa,EAAE,CAAC,EAAE,gBAAgB,EAAE,EAAE,EAAE,CAAC;AAE1E,+GAA+G;AAC/G,MAAM,CAAC,MAAM,sBAAsB,GAAG,GAAG,CAAC;AAE1C,MAAM,MAAM,GAAqB,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;AAE1D,MAAM,UAAU,GAAwB,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;AAChE,MAAM,qBAAqB,GAAqC,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"parse-config.js","sourceRoot":"","sources":["../../src/project/parse-config.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { type TSESLint } from '@typescript-eslint/utils';
|
|
2
|
-
type MessageId = 'useCase' | 'message' | 'route' | 'emptySecurity' | 'actor';
|
|
2
|
+
type MessageId = 'useCase' | 'message' | 'route' | 'emptySecurity' | 'controller' | 'actor';
|
|
3
3
|
export declare const authzDeclared: TSESLint.RuleModule<MessageId, [], import("../index.js").RuleDocs, TSESLint.RuleListener>;
|
|
4
4
|
export {};
|
|
5
5
|
//# sourceMappingURL=authz-declared.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"authz-declared.d.ts","sourceRoot":"","sources":["../../src/rules/authz-declared.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,KAAK,QAAQ,EAAiB,MAAM,0BAA0B,CAAC;AAmBxF,KAAK,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,GAAG,eAAe,GAAG,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"authz-declared.d.ts","sourceRoot":"","sources":["../../src/rules/authz-declared.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,KAAK,QAAQ,EAAiB,MAAM,0BAA0B,CAAC;AAmBxF,KAAK,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,GAAG,eAAe,GAAG,YAAY,GAAG,OAAO,CAAC;AAQ5F,eAAO,MAAM,aAAa,2FAiDxB,CAAC"}
|
|
@@ -28,6 +28,7 @@ export const authzDeclared = defineRule({
|
|
|
28
28
|
useCase: 'The {{kind}} {{name}} is registered without saying who may send it. Insert `.requires(<a permission of application/authorization>)` before `.{{binding}}(...)`, or `.public()` if anybody may: nothing is reachable by default.',
|
|
29
29
|
message: `The {{kind}} {{className}} says nothing about who may send it. Put \`@Requires(<a permission of application/authorization>)\` from "${DECLARATIONS_ENTRY}" on the class, or \`@Public()\` if anybody may: nothing is reachable by default.`,
|
|
30
30
|
route: "The route {{route}} declares no `security`. Add `security: ['<scheme>']` with the security schemes that apply, or `security: false` if the route is public.",
|
|
31
|
+
controller: 'This controller names no `group` and no `guards`: nothing says who may call its route. Name its route group, whose guards stand before it, or write `guards: [Public]` when anybody may call it.',
|
|
31
32
|
emptySecurity: 'The route {{route}} declares `security: []`: no scheme applies, so it is public by accident. Name the schemes that apply, or write `security: false`.',
|
|
32
33
|
actor: '{{className}} extends {{base}} but does not hand the actor it is given to `super(...)`. Take the actor as the first constructor parameter and pass it on, `constructor(actor: Actor, ...) { super(actor); }`: the caller says who acts, the message never decides it.',
|
|
33
34
|
},
|
|
@@ -51,6 +52,7 @@ export const authzDeclared = defineRule({
|
|
|
51
52
|
}
|
|
52
53
|
tell(undeclaredRoute(node));
|
|
53
54
|
},
|
|
55
|
+
Decorator: (node) => tell(unguardedController(node)),
|
|
54
56
|
ClassDeclaration: judgeClass,
|
|
55
57
|
ClassExpression: judgeClass,
|
|
56
58
|
};
|
|
@@ -105,6 +107,22 @@ function undeclaredRoute(node) {
|
|
|
105
107
|
? undefined
|
|
106
108
|
: { node: propertyOf(spec, 'security') ?? spec, messageId, data: { route: routeLabel(spec) } };
|
|
107
109
|
}
|
|
110
|
+
/** `@Controller({ .. })` of @ddd-ts-kit/http names its group or its guards; a declaration built elsewhere is judged at run time. */
|
|
111
|
+
function unguardedController({ expression }) {
|
|
112
|
+
if (expression.type !== AST_NODE_TYPES.CallExpression || calleeName(expression) !== 'Controller') {
|
|
113
|
+
return undefined;
|
|
114
|
+
}
|
|
115
|
+
const [spec] = expression.arguments;
|
|
116
|
+
if (spec?.type !== AST_NODE_TYPES.ObjectExpression || !isRouteDeclaration(spec)) {
|
|
117
|
+
return undefined;
|
|
118
|
+
}
|
|
119
|
+
return { node: spec, messageId: 'controller' };
|
|
120
|
+
}
|
|
121
|
+
/** A declaration of a route, with a `method` and a `response`, that names neither a group nor guards. */
|
|
122
|
+
function isRouteDeclaration(spec) {
|
|
123
|
+
const has = (key) => propertyOf(spec, key) !== undefined;
|
|
124
|
+
return !hasSpread(spec) && has('method') && has('response') && !has('group') && !has('guards');
|
|
125
|
+
}
|
|
108
126
|
function judgeSecurity(spec) {
|
|
109
127
|
const security = propertyOf(spec, 'security');
|
|
110
128
|
if (security === undefined) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"authz-declared.js","sourceRoot":"","sources":["../../src/rules/authz-declared.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"authz-declared.js","sourceRoot":"","sources":["../../src/rules/authz-declared.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,7 +7,7 @@ export const domainNoGenericError = defineRule({
|
|
|
7
7
|
recommended: 'error',
|
|
8
8
|
description: 'No `throw new Error(...)` in domain/ or application/: an expected failure is a DomainError with a stable code.',
|
|
9
9
|
messages: {
|
|
10
|
-
generic: 'A generic Error says nothing a caller can act on. Throw a DomainError with a stable code (`ddd-ts-kit generate
|
|
10
|
+
generic: 'A generic Error says nothing a caller can act on. Throw a DomainError with a stable code, built by a factory of the error class of its concept (`ddd-ts-kit generate error {{context}} <Concept> <refusal>`): presentation maps the code to a status in one place.',
|
|
11
11
|
},
|
|
12
12
|
create({ file, sourceCode, report }) {
|
|
13
13
|
const { location } = file;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"domain-no-generic-error.js","sourceRoot":"","sources":["../../src/rules/domain-no-generic-error.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,oCAAoC,CAAC;AAEjE,MAAM,CAAC,MAAM,oBAAoB,GAAG,UAAU,CAAY;IACxD,EAAE,EAAE,yBAAyB;IAC7B,IAAI,EAAE,SAAS;IACf,WAAW,EAAE,OAAO;IACpB,WAAW,EACT,gHAAgH;IAClH,QAAQ,EAAE;QACR,OAAO,EACL,
|
|
1
|
+
{"version":3,"file":"domain-no-generic-error.js","sourceRoot":"","sources":["../../src/rules/domain-no-generic-error.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,oCAAoC,CAAC;AAEjE,MAAM,CAAC,MAAM,oBAAoB,GAAG,UAAU,CAAY;IACxD,EAAE,EAAE,yBAAyB;IAC7B,IAAI,EAAE,SAAS;IACf,WAAW,EAAE,OAAO;IACpB,WAAW,EACT,gHAAgH;IAClH,QAAQ,EAAE;QACR,OAAO,EACL,oQAAoQ;KACvQ;IACD,MAAM,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE;QACjC,MAAM,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC;QAE1B,IACE,QAAQ,CAAC,IAAI,KAAK,SAAS;YAC3B,IAAI,CAAC,MAAM;YACX,CAAC,QAAQ,CAAC,KAAK,KAAK,QAAQ,IAAI,QAAQ,CAAC,KAAK,KAAK,aAAa,CAAC,EACjE,CAAC;YACD,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,OAAO;YACL,cAAc,CAAC,IAAI;gBACjB,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC;gBAE7B,IAAI,MAAM,CAAC,IAAI,KAAK,cAAc,CAAC,aAAa,IAAI,MAAM,CAAC,IAAI,KAAK,cAAc,CAAC,cAAc,EAAE,CAAC;oBAClG,OAAO;gBACT,CAAC;gBAED,IAAI,WAAW,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK,OAAO,EAAE,CAAC;oBACvD,MAAM,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;gBACtF,CAAC;YACH,CAAC;SACF,CAAC;IACJ,CAAC;CACF,CAAC,CAAC"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export declare const errorsConstructorNotPublic: import("@typescript-eslint/utils/ts-eslint").RuleModule<"inheritedPublic" | "publicConstructor", [], import("../index.js").RuleDocs, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
|
|
2
|
+
//# sourceMappingURL=errors-constructor-not-public.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors-constructor-not-public.d.ts","sourceRoot":"","sources":["../../src/rules/errors-constructor-not-public.ts"],"names":[],"mappings":"AAQA,eAAO,MAAM,0BAA0B,iMA0CrC,CAAC"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { AST_NODE_TYPES } from '@typescript-eslint/utils';
|
|
2
|
+
import { className } from '../support/classes/class-name.js';
|
|
3
|
+
import { constructorOf } from '../support/classes/constructor-of.js';
|
|
4
|
+
import { visibilityOf } from '../support/classes/visibility-of.js';
|
|
5
|
+
import { isErrorClass } from '../support/errors/is-error-class.js';
|
|
6
|
+
import { isErrorFile } from '../support/errors/is-error-file.js';
|
|
7
|
+
import { defineRule } from '../support/rule/define-rule.js';
|
|
8
|
+
export const errorsConstructorNotPublic = defineRule({
|
|
9
|
+
id: 'errors/constructor-not-public',
|
|
10
|
+
type: 'problem',
|
|
11
|
+
recommended: 'error',
|
|
12
|
+
description: 'Under "stack.refusals": "factories", the constructor of an error class of domain/errors/ is not public: the class extends ConceptError and declares none, or declares it private or protected.',
|
|
13
|
+
messages: {
|
|
14
|
+
publicConstructor: 'The constructor of {{className}} is public: anyone can build a refusal with a code and a message of their own. Extend ConceptError of @ddd-ts-kit/kernel and remove the constructor (its own is protected), then build each refusal in a static factory with `{{className}}.refusal(code, message, facts)`.',
|
|
15
|
+
inheritedPublic: '{{className}} extends DomainError and declares no constructor, so it inherits a public one. Extend ConceptError of @ddd-ts-kit/kernel, whose constructor is protected, and build each refusal in a static factory with `{{className}}.refusal(code, message, facts)`.',
|
|
16
|
+
},
|
|
17
|
+
create({ file, report }) {
|
|
18
|
+
if (!isErrorFile(file)) {
|
|
19
|
+
return {};
|
|
20
|
+
}
|
|
21
|
+
return {
|
|
22
|
+
ClassBody(body) {
|
|
23
|
+
const owner = body.parent;
|
|
24
|
+
if (!isErrorClass(owner) || owner.abstract) {
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
const constructor = constructorOf(body);
|
|
28
|
+
const data = { className: className(owner) };
|
|
29
|
+
if (constructor !== undefined && visibilityOf(constructor) === 'public') {
|
|
30
|
+
report({ node: constructor.key, messageId: 'publicConstructor', data });
|
|
31
|
+
}
|
|
32
|
+
if (constructor === undefined &&
|
|
33
|
+
owner.superClass?.type === AST_NODE_TYPES.Identifier &&
|
|
34
|
+
owner.superClass.name === 'DomainError') {
|
|
35
|
+
report({ node: owner.id ?? owner, messageId: 'inheritedPublic', data });
|
|
36
|
+
}
|
|
37
|
+
},
|
|
38
|
+
};
|
|
39
|
+
},
|
|
40
|
+
});
|
|
41
|
+
//# sourceMappingURL=errors-constructor-not-public.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors-constructor-not-public.js","sourceRoot":"","sources":["../../src/rules/errors-constructor-not-public.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EAAE,SAAS,EAAE,MAAM,kCAAkC,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,MAAM,sCAAsC,CAAC;AACrE,OAAO,EAAE,YAAY,EAAE,MAAM,qCAAqC,CAAC;AACnE,OAAO,EAAE,YAAY,EAAE,MAAM,qCAAqC,CAAC;AACnE,OAAO,EAAE,WAAW,EAAE,MAAM,oCAAoC,CAAC;AACjE,OAAO,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;AAE5D,MAAM,CAAC,MAAM,0BAA0B,GAAG,UAAU,CAA0C;IAC5F,EAAE,EAAE,+BAA+B;IACnC,IAAI,EAAE,SAAS;IACf,WAAW,EAAE,OAAO;IACpB,WAAW,EACT,gMAAgM;IAClM,QAAQ,EAAE;QACR,iBAAiB,EACf,6SAA6S;QAC/S,eAAe,EACb,uQAAuQ;KAC1Q;IACD,MAAM,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE;QACrB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC;YACvB,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,OAAO;YACL,SAAS,CAAC,IAAI;gBACZ,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC;gBAE1B,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;oBAC3C,OAAO;gBACT,CAAC;gBAED,MAAM,WAAW,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;gBACxC,MAAM,IAAI,GAAG,EAAE,SAAS,EAAE,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;gBAE7C,IAAI,WAAW,KAAK,SAAS,IAAI,YAAY,CAAC,WAAW,CAAC,KAAK,QAAQ,EAAE,CAAC;oBACxE,MAAM,CAAC,EAAE,IAAI,EAAE,WAAW,CAAC,GAAG,EAAE,SAAS,EAAE,mBAAmB,EAAE,IAAI,EAAE,CAAC,CAAC;gBAC1E,CAAC;gBAED,IACE,WAAW,KAAK,SAAS;oBACzB,KAAK,CAAC,UAAU,EAAE,IAAI,KAAK,cAAc,CAAC,UAAU;oBACpD,KAAK,CAAC,UAAU,CAAC,IAAI,KAAK,aAAa,EACvC,CAAC;oBACD,MAAM,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,EAAE,IAAI,KAAK,EAAE,SAAS,EAAE,iBAAiB,EAAE,IAAI,EAAE,CAAC,CAAC;gBAC1E,CAAC;YACH,CAAC;SACF,CAAC;IACJ,CAAC;CACF,CAAC,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
type MessageId = 'vagueName' | 'codeNotLiteral' | 'codeFormat' | 'mismatch';
|
|
2
|
+
export declare const errorsFactoryName: import("@typescript-eslint/utils/ts-eslint").RuleModule<MessageId, [], import("../index.js").RuleDocs, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
|
|
3
|
+
export {};
|
|
4
|
+
//# sourceMappingURL=errors-factory-name.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors-factory-name.d.ts","sourceRoot":"","sources":["../../src/rules/errors-factory-name.ts"],"names":[],"mappings":"AAUA,KAAK,SAAS,GAAG,WAAW,GAAG,gBAAgB,GAAG,YAAY,GAAG,UAAU,CAAC;AAY5E,eAAO,MAAM,iBAAiB,mKAmC5B,CAAC"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { AST_NODE_TYPES } from '@typescript-eslint/utils';
|
|
2
|
+
import { className } from '../support/classes/class-name.js';
|
|
3
|
+
import { memberName } from '../support/classes/member-name.js';
|
|
4
|
+
import { visibilityOf } from '../support/classes/visibility-of.js';
|
|
5
|
+
import { descendants } from '../support/descendants.js';
|
|
6
|
+
import { constantCase } from '../support/errors/constant-case.js';
|
|
7
|
+
import { isErrorClass } from '../support/errors/is-error-class.js';
|
|
8
|
+
import { isErrorFile } from '../support/errors/is-error-file.js';
|
|
9
|
+
import { defineRule } from '../support/rule/define-rule.js';
|
|
10
|
+
/** Names that say an error is being made, never which rule of the business refused. */
|
|
11
|
+
const VAGUE_NAMES = ['create', 'make', 'of', 'from', 'build', 'new', 'error', 'failure', 'fail', 'refusal', 'refuse'];
|
|
12
|
+
const ERROR_CODE = /^[A-Z][A-Z0-9]*(_[A-Z0-9]+)*$/;
|
|
13
|
+
export const errorsFactoryName = defineRule({
|
|
14
|
+
id: 'errors/factory-name',
|
|
15
|
+
type: 'problem',
|
|
16
|
+
recommended: 'error',
|
|
17
|
+
description: 'Under "stack.refusals": "factories", a static factory of an error class is named after the refusal, in the words of the business, and its code is that name in constant case, alone or with the name of the concept.',
|
|
18
|
+
messages: {
|
|
19
|
+
vagueName: '`{{className}}.{{name}}` says that an error is built, not which rule refused. Name the factory after the refusal, as a domain expert would say it: `slotTaken`, `alreadyConfirmed`, `notFound`.',
|
|
20
|
+
codeNotLiteral: 'The code `{{className}}.{{name}}` gives to `refusal(...)` is not a string literal. Write it in place, in constant case: the code is the contract of the refusal, read by the HTTP mapping, the OpenAPI document, the audit trail and the tests.',
|
|
21
|
+
codeFormat: 'The code "{{code}}" of `{{className}}.{{name}}` is not in constant case. Write upper-case words separated by underscores, for example {{expected}}.',
|
|
22
|
+
mismatch: 'The factory `{{className}}.{{name}}` sets the code "{{code}}", which says something else. Write {{expected}}, or rename the factory after the code: a reader of the code that refuses and a reader of the contract must meet the same words.',
|
|
23
|
+
},
|
|
24
|
+
create({ file, report }) {
|
|
25
|
+
if (!isErrorFile(file)) {
|
|
26
|
+
return {};
|
|
27
|
+
}
|
|
28
|
+
return {
|
|
29
|
+
ClassBody(body) {
|
|
30
|
+
if (!isErrorClass(body.parent)) {
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
const owner = className(body.parent);
|
|
34
|
+
for (const method of body.body.filter(isFactory)) {
|
|
35
|
+
judge({ name: memberName(method) ?? '', concept: owner, method }, report);
|
|
36
|
+
}
|
|
37
|
+
},
|
|
38
|
+
};
|
|
39
|
+
},
|
|
40
|
+
});
|
|
41
|
+
function isFactory(member) {
|
|
42
|
+
return (member.type === AST_NODE_TYPES.MethodDefinition &&
|
|
43
|
+
member.static &&
|
|
44
|
+
member.kind === 'method' &&
|
|
45
|
+
visibilityOf(member) === 'public' &&
|
|
46
|
+
refusalCallIn(member) !== undefined);
|
|
47
|
+
}
|
|
48
|
+
function refusalCallIn(method) {
|
|
49
|
+
return [...descendants(method.value)].find(isRefusalCall);
|
|
50
|
+
}
|
|
51
|
+
function isRefusalCall(node) {
|
|
52
|
+
return (node.type === AST_NODE_TYPES.CallExpression &&
|
|
53
|
+
node.callee.type === AST_NODE_TYPES.MemberExpression &&
|
|
54
|
+
node.callee.property.type === AST_NODE_TYPES.Identifier &&
|
|
55
|
+
node.callee.property.name === 'refusal');
|
|
56
|
+
}
|
|
57
|
+
function judge(factory, report) {
|
|
58
|
+
const { name, concept, method } = factory;
|
|
59
|
+
const data = { className: concept, name };
|
|
60
|
+
if (VAGUE_NAMES.includes(name.toLowerCase()) || /\d/.test(name)) {
|
|
61
|
+
report({ node: method.key, messageId: 'vagueName', data });
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
const [code] = refusalCallIn(method)?.arguments ?? [];
|
|
65
|
+
if (code?.type !== AST_NODE_TYPES.Literal || typeof code.value !== 'string') {
|
|
66
|
+
report({ node: code ?? method.key, messageId: 'codeNotLiteral', data });
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
judgeCode(factory, { node: code, value: code.value }, report);
|
|
70
|
+
}
|
|
71
|
+
function judgeCode(factory, code, report) {
|
|
72
|
+
const expected = expectedCodes(factory);
|
|
73
|
+
const data = { className: factory.concept, name: factory.name, code: code.value };
|
|
74
|
+
if (!ERROR_CODE.test(code.value)) {
|
|
75
|
+
report({ node: code.node, messageId: 'codeFormat', data: { ...data, expected: expected[0] ?? '' } });
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
if (!expected.includes(code.value)) {
|
|
79
|
+
report({ node: code.node, messageId: 'mismatch', data: { ...data, expected: expected.join(' or ') } });
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
/** `AppointmentError.notFound` may set `NOT_FOUND`, `APPOINTMENT_NOT_FOUND` or `NOT_FOUND_APPOINTMENT`. */
|
|
83
|
+
function expectedCodes({ name, concept }) {
|
|
84
|
+
const refusal = constantCase(name);
|
|
85
|
+
const subject = constantCase(concept.replace(/Error$/, ''));
|
|
86
|
+
return subject === '' ? [refusal] : [refusal, `${subject}_${refusal}`, `${refusal}_${subject}`];
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=errors-factory-name.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors-factory-name.js","sourceRoot":"","sources":["../../src/rules/errors-factory-name.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors-through-factory.d.ts","sourceRoot":"","sources":["../../src/rules/errors-through-factory.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,oBAAoB,uKAkC/B,CAAC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { AST_NODE_TYPES } from '@typescript-eslint/utils';
|
|
2
|
+
import { defineRule } from '../support/rule/define-rule.js';
|
|
3
|
+
const ERRORS_DIRECTORY = /(^|\/)domain\/errors\//;
|
|
4
|
+
export const errorsThroughFactory = defineRule({
|
|
5
|
+
id: 'errors/through-factory',
|
|
6
|
+
type: 'problem',
|
|
7
|
+
recommended: 'error',
|
|
8
|
+
description: 'Under "stack.refusals": "factories", a domain error is built by a static factory of its concept class: no `new` of a class of domain/errors/ outside that class.',
|
|
9
|
+
messages: {
|
|
10
|
+
constructed: '`new {{name}}(...)` builds a refusal outside its error class, with whatever code and message the caller writes. Call the static factory named after the refusal, `throw <Concept>Error.<refusal>(...)`, and add it when it is missing: `ddd-ts-kit generate error {{context}} <Concept> <refusal>`.',
|
|
11
|
+
},
|
|
12
|
+
create({ file, report }) {
|
|
13
|
+
const { location } = file;
|
|
14
|
+
if (file.config.stack.refusals !== 'factories' || location.area !== 'context') {
|
|
15
|
+
return {};
|
|
16
|
+
}
|
|
17
|
+
const errors = new Set();
|
|
18
|
+
return {
|
|
19
|
+
ImportDeclaration(node) {
|
|
20
|
+
if (ERRORS_DIRECTORY.test(node.source.value)) {
|
|
21
|
+
for (const name of importedNames(node)) {
|
|
22
|
+
errors.add(name);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
},
|
|
26
|
+
NewExpression(node) {
|
|
27
|
+
if (node.callee.type === AST_NODE_TYPES.Identifier && errors.has(node.callee.name)) {
|
|
28
|
+
report({ node, messageId: 'constructed', data: { name: node.callee.name, context: location.context } });
|
|
29
|
+
}
|
|
30
|
+
},
|
|
31
|
+
};
|
|
32
|
+
},
|
|
33
|
+
});
|
|
34
|
+
function importedNames(node) {
|
|
35
|
+
return node.specifiers
|
|
36
|
+
.filter((specifier) => specifier.type === AST_NODE_TYPES.ImportSpecifier)
|
|
37
|
+
.map((specifier) => specifier.local.name);
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=errors-through-factory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors-through-factory.js","sourceRoot":"","sources":["../../src/rules/errors-through-factory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAiB,MAAM,0BAA0B,CAAC;AACzE,OAAO,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;AAE5D,MAAM,gBAAgB,GAAG,wBAAwB,CAAC;AAElD,MAAM,CAAC,MAAM,oBAAoB,GAAG,UAAU,CAAgB;IAC5D,EAAE,EAAE,wBAAwB;IAC5B,IAAI,EAAE,SAAS;IACf,WAAW,EAAE,OAAO;IACpB,WAAW,EACT,kKAAkK;IACpK,QAAQ,EAAE;QACR,WAAW,EACT,qSAAqS;KACxS;IACD,MAAM,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE;QACrB,MAAM,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC;QAE1B,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,KAAK,WAAW,IAAI,QAAQ,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAC9E,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,GAAG,EAAU,CAAC;QAEjC,OAAO;YACL,iBAAiB,CAAC,IAAI;gBACpB,IAAI,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;oBAC7C,KAAK,MAAM,IAAI,IAAI,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC;wBACvC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;oBACnB,CAAC;gBACH,CAAC;YACH,CAAC;YACD,aAAa,CAAC,IAAI;gBAChB,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,cAAc,CAAC,UAAU,IAAI,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;oBACnF,MAAM,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,aAAa,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,EAAE,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;gBAC1G,CAAC;YACH,CAAC;SACF,CAAC;IACJ,CAAC;CACF,CAAC,CAAC;AAEH,SAAS,aAAa,CAAC,IAAgC;IACrD,OAAO,IAAI,CAAC,UAAU;SACnB,MAAM,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,KAAK,cAAc,CAAC,eAAe,CAAC;SACxE,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AAC9C,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
type MessageId = 'foreignDependency' | 'wrongBus' | 'missingBus';
|
|
2
|
+
export declare const presentationControllerDelegates: import("@typescript-eslint/utils/ts-eslint").RuleModule<MessageId, [], import("../index.js").RuleDocs, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
|
|
3
|
+
export {};
|
|
4
|
+
//# sourceMappingURL=presentation-controller-delegates.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"presentation-controller-delegates.d.ts","sourceRoot":"","sources":["../../src/rules/presentation-controller-delegates.ts"],"names":[],"mappings":"AAQA,KAAK,SAAS,GAAG,mBAAmB,GAAG,UAAU,GAAG,YAAY,CAAC;AAejE,eAAO,MAAM,+BAA+B,mKAiC1C,CAAC"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { AST_NODE_TYPES } from '@typescript-eslint/utils';
|
|
2
|
+
import { className } from '../support/classes/class-name.js';
|
|
3
|
+
import { constructorOf } from '../support/classes/constructor-of.js';
|
|
4
|
+
import { exportedClasses } from '../support/classes/exported-classes.js';
|
|
5
|
+
import { declarationReader } from '../support/declarations/declaration-reader.js';
|
|
6
|
+
import { defineRule } from '../support/rule/define-rule.js';
|
|
7
|
+
import { parameterTypeName } from '../support/types/parameter-type-name.js';
|
|
8
|
+
const BUS_OF = {
|
|
9
|
+
GET: 'QueryBus',
|
|
10
|
+
HEAD: 'QueryBus',
|
|
11
|
+
POST: 'CommandBus',
|
|
12
|
+
PUT: 'CommandBus',
|
|
13
|
+
PATCH: 'CommandBus',
|
|
14
|
+
DELETE: 'CommandBus',
|
|
15
|
+
};
|
|
16
|
+
const BUSES = ['CommandBus', 'QueryBus'];
|
|
17
|
+
/** What translates for a controller, by the name of its class: its request mapper and its serializer. */
|
|
18
|
+
const TRANSLATOR = /(?:Mapper|Serializer)$/;
|
|
19
|
+
export const presentationControllerDelegates = defineRule({
|
|
20
|
+
id: 'presentation/controller-delegates',
|
|
21
|
+
type: 'problem',
|
|
22
|
+
recommended: 'error',
|
|
23
|
+
description: 'A controller decides nothing: its constructor takes the bus of its method (`CommandBus` for POST, PUT, PATCH and DELETE, `QueryBus` for GET and HEAD), a request mapper and a serializer, and nothing else.',
|
|
24
|
+
messages: {
|
|
25
|
+
foreignDependency: '{{className}} is given {{type}}. A controller calls its bus and nothing else: a repository, a port or a service belongs behind a use case. Send a command or a query, and let a request mapper (`*.mapper.ts`) or a serializer (`*.serializer.ts`) translate.',
|
|
26
|
+
wrongBus: '{{className}} answers {{method}} and is given the {{given}}. A {{method}} route sends through the {{expected}}: a request that changes something is a command, a request that reads is a query. Change the method, or the use case it calls.',
|
|
27
|
+
missingBus: '{{className}} answers {{method}} and is not given the {{expected}}. A controller answers by sending a use case through its bus: take `{{expected}}` in the constructor.',
|
|
28
|
+
},
|
|
29
|
+
create({ file, report }) {
|
|
30
|
+
if (file.isTest || file.location.area !== 'context' || !file.path.endsWith('.controller.ts')) {
|
|
31
|
+
return {};
|
|
32
|
+
}
|
|
33
|
+
return {
|
|
34
|
+
Program(program) {
|
|
35
|
+
const read = declarationReader(program);
|
|
36
|
+
for (const controller of exportedClasses(program)) {
|
|
37
|
+
const declaration = read(controller).find(({ name }) => name === 'Controller');
|
|
38
|
+
if (declaration !== undefined) {
|
|
39
|
+
judgeController(controller, methodOf(declaration), report);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
},
|
|
43
|
+
};
|
|
44
|
+
},
|
|
45
|
+
});
|
|
46
|
+
function judgeController(controller, method, report) {
|
|
47
|
+
const owner = className(controller);
|
|
48
|
+
const parameters = constructorOf(controller.body)?.value.params ?? [];
|
|
49
|
+
const types = parameters.map((parameter) => ({ parameter, type: parameterTypeName(parameter) }));
|
|
50
|
+
const expected = method === undefined ? undefined : BUS_OF[method];
|
|
51
|
+
for (const { parameter, type } of types) {
|
|
52
|
+
const messageId = flawOf(type, expected);
|
|
53
|
+
if (messageId !== undefined) {
|
|
54
|
+
const data = { className: owner, type: type ?? 'an untyped value', method, given: type, expected };
|
|
55
|
+
report({ node: parameter, messageId, data });
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
if (expected !== undefined && !types.some(({ type }) => type === expected)) {
|
|
59
|
+
report({
|
|
60
|
+
node: controller.id ?? controller,
|
|
61
|
+
messageId: 'missingBus',
|
|
62
|
+
data: { className: owner, method, expected },
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
/** What is wrong with one constructor parameter, by the class that types it. */
|
|
67
|
+
function flawOf(type, expected) {
|
|
68
|
+
if (type === undefined || (!BUSES.includes(type) && !TRANSLATOR.test(type))) {
|
|
69
|
+
return 'foreignDependency';
|
|
70
|
+
}
|
|
71
|
+
return expected !== undefined && BUSES.includes(type) && type !== expected ? 'wrongBus' : undefined;
|
|
72
|
+
}
|
|
73
|
+
/** The method the declaration writes as a string literal; a declaration built elsewhere is not read. */
|
|
74
|
+
function methodOf({ arguments: [spec] }) {
|
|
75
|
+
if (spec?.type !== AST_NODE_TYPES.ObjectExpression) {
|
|
76
|
+
return undefined;
|
|
77
|
+
}
|
|
78
|
+
const written = spec.properties.find((property) => property.type === AST_NODE_TYPES.Property &&
|
|
79
|
+
property.key.type === AST_NODE_TYPES.Identifier &&
|
|
80
|
+
property.key.name === 'method');
|
|
81
|
+
return written?.value.type === AST_NODE_TYPES.Literal && typeof written.value.value === 'string'
|
|
82
|
+
? written.value.value
|
|
83
|
+
: undefined;
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=presentation-controller-delegates.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"presentation-controller-delegates.js","sourceRoot":"","sources":["../../src/rules/presentation-controller-delegates.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
type MessageId = 'severalClasses' | 'missingHandle' | 'extraPublicMethod';
|
|
2
|
+
export declare const presentationControllerShape: import("@typescript-eslint/utils/ts-eslint").RuleModule<MessageId, [], import("../index.js").RuleDocs, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
|
|
3
|
+
export {};
|
|
4
|
+
//# sourceMappingURL=presentation-controller-shape.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"presentation-controller-shape.d.ts","sourceRoot":"","sources":["../../src/rules/presentation-controller-shape.ts"],"names":[],"mappings":"AASA,KAAK,SAAS,GAAG,gBAAgB,GAAG,eAAe,GAAG,mBAAmB,CAAC;AAE1E,eAAO,MAAM,2BAA2B,mKAqBtC,CAAC"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { className } from '../support/classes/class-name.js';
|
|
2
|
+
import { exportedClasses } from '../support/classes/exported-classes.js';
|
|
3
|
+
import { isCallable } from '../support/classes/is-callable.js';
|
|
4
|
+
import { memberName } from '../support/classes/member-name.js';
|
|
5
|
+
import { visibilityOf } from '../support/classes/visibility-of.js';
|
|
6
|
+
import { declarationReader } from '../support/declarations/declaration-reader.js';
|
|
7
|
+
import { defineRule } from '../support/rule/define-rule.js';
|
|
8
|
+
export const presentationControllerShape = defineRule({
|
|
9
|
+
id: 'presentation/controller-shape',
|
|
10
|
+
type: 'problem',
|
|
11
|
+
recommended: 'error',
|
|
12
|
+
description: 'A `*.controller.ts` file whose class carries `@Controller` of `@ddd-ts-kit/http` exports that one class, whose single public method is `handle`: one class per route.',
|
|
13
|
+
messages: {
|
|
14
|
+
severalClasses: 'This controller file also exports {{className}}. One class answers one route: move {{className}} to its own folder under presentation/http/, next to its own schemas.',
|
|
15
|
+
missingHandle: '{{className}} carries @Controller and has no public `handle` method. The pipeline calls a controller through `handle(request)`: name its entry point that way.',
|
|
16
|
+
extraPublicMethod: '{{className}} exposes {{name}} besides `handle`. Make it private if it is a step of the answer, move it to the request mapper or the serializer of the route if it translates, or to the use case if it decides: a controller has one entry point.',
|
|
17
|
+
},
|
|
18
|
+
create({ file, report }) {
|
|
19
|
+
if (file.isTest || !file.path.endsWith('.controller.ts')) {
|
|
20
|
+
return {};
|
|
21
|
+
}
|
|
22
|
+
return { Program: (program) => judgeControllerFile(program, report) };
|
|
23
|
+
},
|
|
24
|
+
});
|
|
25
|
+
function judgeControllerFile(program, report) {
|
|
26
|
+
const read = declarationReader(program);
|
|
27
|
+
const classes = exportedClasses(program);
|
|
28
|
+
const controller = classes.find((candidate) => read(candidate).some(({ name }) => name === 'Controller'));
|
|
29
|
+
// A file that declares no controller of the kit (a controller of NestJS, written by hand) is not judged.
|
|
30
|
+
if (controller === undefined) {
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
for (const other of classes.filter((candidate) => candidate !== controller)) {
|
|
34
|
+
report({ node: other.id ?? other, messageId: 'severalClasses', data: { className: className(other) } });
|
|
35
|
+
}
|
|
36
|
+
const owner = className(controller);
|
|
37
|
+
const publicMethods = controller.body.body.filter((member) => isCallable(member) && visibilityOf(member) === 'public');
|
|
38
|
+
if (!publicMethods.some((member) => memberName(member) === 'handle')) {
|
|
39
|
+
report({ node: controller.id ?? controller, messageId: 'missingHandle', data: { className: owner } });
|
|
40
|
+
}
|
|
41
|
+
for (const member of publicMethods.filter((candidate) => memberName(candidate) !== 'handle')) {
|
|
42
|
+
report({
|
|
43
|
+
node: member,
|
|
44
|
+
messageId: 'extraPublicMethod',
|
|
45
|
+
data: { className: owner, name: memberName(member) ?? 'a computed method' },
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=presentation-controller-shape.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"presentation-controller-shape.js","sourceRoot":"","sources":["../../src/rules/presentation-controller-shape.ts"],"names":[],"mappings":"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"}
|