@ddd-ts-kit/eslint-plugin 0.3.0 → 0.4.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.
- package/README.md +3 -0
- 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/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 +6 -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/version.d.ts +1 -1
- package/dist/version.js +1 -1
- 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
|
@@ -108,6 +108,9 @@ is an error whatever the configured limit). `strict` sets every rule to `error`.
|
|
|
108
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
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 |
|
|
110
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 |
|
|
111
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 |
|
|
112
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 |
|
|
113
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 |
|
|
@@ -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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"}
|
|
@@ -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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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
type MessageId = 'reachesInside' | 'reachesName';
|
|
2
|
+
export declare const presentationGuardAtTheEdge: import("@typescript-eslint/utils/ts-eslint").RuleModule<MessageId, [], import("../index.js").RuleDocs, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
|
|
3
|
+
export {};
|
|
4
|
+
//# sourceMappingURL=presentation-guard-at-the-edge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"presentation-guard-at-the-edge.d.ts","sourceRoot":"","sources":["../../src/rules/presentation-guard-at-the-edge.ts"],"names":[],"mappings":"AAGA,KAAK,SAAS,GAAG,eAAe,GAAG,aAAa,CAAC;AAMjD,eAAO,MAAM,0BAA0B,mKAyCrC,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 INSIDE = /(?:^|\/)(domain|infrastructure)\//;
|
|
4
|
+
/** What a guard has no business holding, by the name it is imported under. */
|
|
5
|
+
const FORBIDDEN_NAME = /(?:Repository|UnitOfWork)$|^CommandBus$/;
|
|
6
|
+
export const presentationGuardAtTheEdge = defineRule({
|
|
7
|
+
id: 'presentation/guard-at-the-edge',
|
|
8
|
+
type: 'problem',
|
|
9
|
+
recommended: 'error',
|
|
10
|
+
description: 'A guard controls the caller at the edge and nothing else: a `*.guard.ts` file imports nothing from `domain/` or `infrastructure/`, no repository, no unit of work and no command bus.',
|
|
11
|
+
messages: {
|
|
12
|
+
reachesInside: 'This guard imports "{{specifier}}", from {{layer}}/. A guard reads the caller and the request: the role, the tenant, a key, a parameter of the path. A right that depends on an element of the model is a permission of the use case (`@Requires`, a policy), held for every caller of the use case, a job and an event handler included. Remove the import and move the decision there.',
|
|
13
|
+
reachesName: 'This guard imports {{name}}. A guard never loads an aggregate and never changes anything: what needs {{name}} is a decision of the use case (`@Requires`, a policy). A guard may ask a port of application/ports a question about the caller, and nothing more.',
|
|
14
|
+
},
|
|
15
|
+
create({ file, report }) {
|
|
16
|
+
if (file.isTest || !file.path.endsWith('.guard.ts')) {
|
|
17
|
+
return {};
|
|
18
|
+
}
|
|
19
|
+
return {
|
|
20
|
+
ImportDeclaration(node) {
|
|
21
|
+
const specifier = node.source.value;
|
|
22
|
+
const layer = INSIDE.exec(specifier)?.[1];
|
|
23
|
+
if (layer !== undefined) {
|
|
24
|
+
report({ node, messageId: 'reachesInside', data: { specifier, layer } });
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
for (const imported of node.specifiers) {
|
|
28
|
+
const name = imported.type === AST_NODE_TYPES.ImportSpecifier && imported.imported.type === AST_NODE_TYPES.Identifier
|
|
29
|
+
? imported.imported.name
|
|
30
|
+
: imported.local.name;
|
|
31
|
+
if (FORBIDDEN_NAME.test(name)) {
|
|
32
|
+
report({ node: imported, messageId: 'reachesName', data: { name } });
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
},
|
|
36
|
+
};
|
|
37
|
+
},
|
|
38
|
+
});
|
|
39
|
+
//# sourceMappingURL=presentation-guard-at-the-edge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"presentation-guard-at-the-edge.js","sourceRoot":"","sources":["../../src/rules/presentation-guard-at-the-edge.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;AAI5D,MAAM,MAAM,GAAG,mCAAmC,CAAC;AACnD,8EAA8E;AAC9E,MAAM,cAAc,GAAG,yCAAyC,CAAC;AAEjE,MAAM,CAAC,MAAM,0BAA0B,GAAG,UAAU,CAAY;IAC9D,EAAE,EAAE,gCAAgC;IACpC,IAAI,EAAE,SAAS;IACf,WAAW,EAAE,OAAO;IACpB,WAAW,EACT,uLAAuL;IACzL,QAAQ,EAAE;QACR,aAAa,EACX,0XAA0X;QAC5X,WAAW,EACT,iQAAiQ;KACpQ;IACD,MAAM,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE;QACrB,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;YACpD,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,OAAO;YACL,iBAAiB,CAAC,IAAI;gBACpB,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;gBACpC,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;gBAE1C,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;oBACxB,MAAM,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,eAAe,EAAE,IAAI,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;oBAEzE,OAAO;gBACT,CAAC;gBAED,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;oBACvC,MAAM,IAAI,GACR,QAAQ,CAAC,IAAI,KAAK,cAAc,CAAC,eAAe,IAAI,QAAQ,CAAC,QAAQ,CAAC,IAAI,KAAK,cAAc,CAAC,UAAU;wBACtG,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI;wBACxB,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC;oBAE1B,IAAI,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;wBAC9B,MAAM,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,aAAa,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;oBACvE,CAAC;gBACH,CAAC;YACH,CAAC;SACF,CAAC;IACJ,CAAC;CACF,CAAC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rules.d.ts","sourceRoot":"","sources":["../../src/rules/rules.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,KAAK,OAAO,EAAE,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"rules.d.ts","sourceRoot":"","sources":["../../src/rules/rules.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,KAAK,OAAO,EAAE,MAAM,4BAA4B,CAAC;AAoHlE,+HAA+H;AAC/H,eAAO,MAAM,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAEnD,CAAC"}
|
package/dist/rules/rules.js
CHANGED
|
@@ -41,6 +41,9 @@ import { portsImplementsNeverExtends } from './ports-implements-never-extends.js
|
|
|
41
41
|
import { portsNoConcreteDependency } from './ports-no-concrete-dependency.js';
|
|
42
42
|
import { portsNoTokenConstant } from './ports-no-token-constant.js';
|
|
43
43
|
import { portsValueImport } from './ports-value-import.js';
|
|
44
|
+
import { presentationControllerDelegates } from './presentation-controller-delegates.js';
|
|
45
|
+
import { presentationControllerShape } from './presentation-controller-shape.js';
|
|
46
|
+
import { presentationGuardAtTheEdge } from './presentation-guard-at-the-edge.js';
|
|
44
47
|
import { purityNoAmbientRandomness, purityNoEnvironment, purityNoSystemClock } from './purity.js';
|
|
45
48
|
import { schedulingJobName } from './scheduling-job-name.js';
|
|
46
49
|
import { schedulingJobTriggersUseCase } from './scheduling-job-triggers-use-case.js';
|
|
@@ -101,6 +104,9 @@ const ALL = [
|
|
|
101
104
|
schedulingJobName,
|
|
102
105
|
importsAliasOnly,
|
|
103
106
|
importsExtension,
|
|
107
|
+
presentationControllerShape,
|
|
108
|
+
presentationControllerDelegates,
|
|
109
|
+
presentationGuardAtTheEdge,
|
|
104
110
|
];
|
|
105
111
|
/** Keyed by ESLint name: the id of docs/ARCHITECTURE.md with its slash replaced by a dash, or the name of a companion rule. */
|
|
106
112
|
export const rules = Object.fromEntries(ALL.map((rule) => [docsOf(rule).name, rule]));
|
package/dist/rules/rules.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rules.js","sourceRoot":"","sources":["../../src/rules/rules.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"rules.js","sourceRoot":"","sources":["../../src/rules/rules.ts"],"names":[],"mappings":"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"}
|
|
@@ -12,7 +12,7 @@ export interface Declaration {
|
|
|
12
12
|
export type DeclarationReader = (node: ClassNode) => Declaration[];
|
|
13
13
|
/**
|
|
14
14
|
* Reads the declarations of the classes of one program. A decorator counts when its name is
|
|
15
|
-
* imported from the declarations entry of the kernel in that program: `{ Repository }`, an alias
|
|
15
|
+
* imported from the declarations entry of the kernel, or from `@ddd-ts-kit/http` for the edge, in that program: `{ Repository }`, an alias
|
|
16
16
|
* `{ Repository as Repo }` or a namespace `declarations.Repository`.
|
|
17
17
|
*/
|
|
18
18
|
export declare function declarationReader(program: TSESTree.Program): DeclarationReader;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"declaration-reader.d.ts","sourceRoot":"","sources":["../../../src/support/declarations/declaration-reader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,KAAK,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AACzE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAI1D,qEAAqE;AACrE,eAAO,MAAM,kBAAkB,oCAAoC,CAAC;
|
|
1
|
+
{"version":3,"file":"declaration-reader.d.ts","sourceRoot":"","sources":["../../../src/support/declarations/declaration-reader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,KAAK,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AACzE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAI1D,qEAAqE;AACrE,eAAO,MAAM,kBAAkB,oCAAoC,CAAC;AAOpE,0FAA0F;AAC1F,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,SAAS,CAAC;IAClC,oDAAoD;IACpD,QAAQ,CAAC,SAAS,EAAE,SAAS,QAAQ,CAAC,sBAAsB,EAAE,CAAC;CAChE;AAED,MAAM,MAAM,iBAAiB,GAAG,CAAC,IAAI,EAAE,SAAS,KAAK,WAAW,EAAE,CAAC;AAEnE;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,QAAQ,CAAC,OAAO,GAAG,iBAAiB,CAsC9E"}
|
|
@@ -3,14 +3,17 @@ import { propertyName } from '../globals/property-name.js';
|
|
|
3
3
|
import { DECLARED_ROLES } from './declared-roles.js';
|
|
4
4
|
/** The entry of the kernel that holds the declaration decorators. */
|
|
5
5
|
export const DECLARATIONS_ENTRY = '@ddd-ts-kit/kernel/declarations';
|
|
6
|
+
/** The entry the decorators of the edge come from: a controller, a guard, a request mapper, a serializer. */
|
|
7
|
+
const EDGE_ENTRY = '@ddd-ts-kit/http';
|
|
6
8
|
const DECLARATION_DECORATORS = new Set(DECLARED_ROLES.flatMap((role) => role.decorators));
|
|
7
9
|
/**
|
|
8
10
|
* Reads the declarations of the classes of one program. A decorator counts when its name is
|
|
9
|
-
* imported from the declarations entry of the kernel in that program: `{ Repository }`, an alias
|
|
11
|
+
* imported from the declarations entry of the kernel, or from `@ddd-ts-kit/http` for the edge, in that program: `{ Repository }`, an alias
|
|
10
12
|
* `{ Repository as Repo }` or a namespace `declarations.Repository`.
|
|
11
13
|
*/
|
|
12
14
|
export function declarationReader(program) {
|
|
13
|
-
const imports = program.body.filter((statement) => statement.type === AST_NODE_TYPES.ImportDeclaration &&
|
|
15
|
+
const imports = program.body.filter((statement) => statement.type === AST_NODE_TYPES.ImportDeclaration &&
|
|
16
|
+
(statement.source.value === DECLARATIONS_ENTRY || statement.source.value === EDGE_ENTRY));
|
|
14
17
|
const specifiers = imports.flatMap((statement) => statement.type === AST_NODE_TYPES.ImportDeclaration ? statement.specifiers : []);
|
|
15
18
|
const named = new Map(specifiers.flatMap(namedDeclaration));
|
|
16
19
|
const namespaces = new Set(specifiers
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"declaration-reader.js","sourceRoot":"","sources":["../../../src/support/declarations/declaration-reader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAiB,MAAM,0BAA0B,CAAC;AAEzE,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAErD,qEAAqE;AACrE,MAAM,CAAC,MAAM,kBAAkB,GAAG,iCAAiC,CAAC;AAEpE,MAAM,sBAAsB,GAAwB,IAAI,GAAG,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;AAY/G;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAC,OAAyB;IACzD,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,MAAM,CACjC,CAAC,SAAS,EAAE,EAAE,
|
|
1
|
+
{"version":3,"file":"declaration-reader.js","sourceRoot":"","sources":["../../../src/support/declarations/declaration-reader.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"declared-roles.d.ts","sourceRoot":"","sources":["../../../src/support/declarations/declared-roles.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEvD,uFAAuF;AACvF,eAAO,MAAM,cAAc,EAAE,SAAS,YAAY,
|
|
1
|
+
{"version":3,"file":"declared-roles.d.ts","sourceRoot":"","sources":["../../../src/support/declarations/declared-roles.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEvD,uFAAuF;AACvF,eAAO,MAAM,cAAc,EAAE,SAAS,YAAY,EAsBjD,CAAC"}
|
|
@@ -17,5 +17,9 @@ export const DECLARED_ROLES = [
|
|
|
17
17
|
{ suffix: 'repository', folders: ['infrastructure/persistence'], decorators: ['Repository'] },
|
|
18
18
|
{ suffix: 'gateway', folders: ['infrastructure'], decorators: ['Gateway'] },
|
|
19
19
|
{ suffix: 'adapter', folders: ['infrastructure'], decorators: ['Adapter'] },
|
|
20
|
+
{ suffix: 'controller', folders: ['presentation/http'], decorators: ['Controller'] },
|
|
21
|
+
{ suffix: 'guard', folders: ['presentation/http'], decorators: ['Guard'] },
|
|
22
|
+
{ suffix: 'mapper', folders: ['presentation/http'], decorators: ['RequestMapper'] },
|
|
23
|
+
{ suffix: 'serializer', folders: ['presentation/http'], decorators: ['Serializer'] },
|
|
20
24
|
];
|
|
21
25
|
//# sourceMappingURL=declared-roles.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"declared-roles.js","sourceRoot":"","sources":["../../../src/support/declarations/declared-roles.ts"],"names":[],"mappings":"AAEA,uFAAuF;AACvF,MAAM,CAAC,MAAM,cAAc,GAA4B;IACrD,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,sBAAsB,CAAC,EAAE,UAAU,EAAE,CAAC,UAAU,EAAE,QAAQ,CAAC,EAAE;IAC5F,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,qBAAqB,CAAC,EAAE,UAAU,EAAE,CAAC,UAAU,EAAE,QAAQ,CAAC,EAAE;IACzF,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,sBAAsB,CAAC,EAAE,UAAU,EAAE,CAAC,gBAAgB,CAAC,EAAE;IACxF,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,qBAAqB,CAAC,EAAE,UAAU,EAAE,CAAC,cAAc,CAAC,EAAE;IACrF;QACE,MAAM,EAAE,qBAAqB;QAC7B,OAAO,EAAE,CAAC,kCAAkC,CAAC;QAC7C,UAAU,EAAE,CAAC,yBAAyB,CAAC;KACxC;IACD,EAAE,MAAM,EAAE,eAAe,EAAE,OAAO,EAAE,CAAC,4BAA4B,CAAC,EAAE,UAAU,EAAE,CAAC,oBAAoB,CAAC,EAAE;IACxG,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC,oCAAoC,CAAC,EAAE,UAAU,EAAE,CAAC,oBAAoB,CAAC,EAAE;IAC5G,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,2BAA2B,CAAC,EAAE,UAAU,EAAE,CAAC,QAAQ,CAAC,EAAE;IACpF,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,wBAAwB,CAAC,EAAE,UAAU,EAAE,CAAC,WAAW,CAAC,EAAE;IACjF,EAAE,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC,yBAAyB,CAAC,EAAE,UAAU,EAAE,CAAC,YAAY,CAAC,EAAE;IAC1F,EAAE,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC,4BAA4B,CAAC,EAAE,UAAU,EAAE,CAAC,YAAY,CAAC,EAAE;IAC7F,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,gBAAgB,CAAC,EAAE,UAAU,EAAE,CAAC,SAAS,CAAC,EAAE;IAC3E,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,gBAAgB,CAAC,EAAE,UAAU,EAAE,CAAC,SAAS,CAAC,EAAE;
|
|
1
|
+
{"version":3,"file":"declared-roles.js","sourceRoot":"","sources":["../../../src/support/declarations/declared-roles.ts"],"names":[],"mappings":"AAEA,uFAAuF;AACvF,MAAM,CAAC,MAAM,cAAc,GAA4B;IACrD,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,sBAAsB,CAAC,EAAE,UAAU,EAAE,CAAC,UAAU,EAAE,QAAQ,CAAC,EAAE;IAC5F,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,qBAAqB,CAAC,EAAE,UAAU,EAAE,CAAC,UAAU,EAAE,QAAQ,CAAC,EAAE;IACzF,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,sBAAsB,CAAC,EAAE,UAAU,EAAE,CAAC,gBAAgB,CAAC,EAAE;IACxF,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,qBAAqB,CAAC,EAAE,UAAU,EAAE,CAAC,cAAc,CAAC,EAAE;IACrF;QACE,MAAM,EAAE,qBAAqB;QAC7B,OAAO,EAAE,CAAC,kCAAkC,CAAC;QAC7C,UAAU,EAAE,CAAC,yBAAyB,CAAC;KACxC;IACD,EAAE,MAAM,EAAE,eAAe,EAAE,OAAO,EAAE,CAAC,4BAA4B,CAAC,EAAE,UAAU,EAAE,CAAC,oBAAoB,CAAC,EAAE;IACxG,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC,oCAAoC,CAAC,EAAE,UAAU,EAAE,CAAC,oBAAoB,CAAC,EAAE;IAC5G,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,2BAA2B,CAAC,EAAE,UAAU,EAAE,CAAC,QAAQ,CAAC,EAAE;IACpF,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,wBAAwB,CAAC,EAAE,UAAU,EAAE,CAAC,WAAW,CAAC,EAAE;IACjF,EAAE,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC,yBAAyB,CAAC,EAAE,UAAU,EAAE,CAAC,YAAY,CAAC,EAAE;IAC1F,EAAE,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC,4BAA4B,CAAC,EAAE,UAAU,EAAE,CAAC,YAAY,CAAC,EAAE;IAC7F,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,gBAAgB,CAAC,EAAE,UAAU,EAAE,CAAC,SAAS,CAAC,EAAE;IAC3E,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,gBAAgB,CAAC,EAAE,UAAU,EAAE,CAAC,SAAS,CAAC,EAAE;IAC3E,EAAE,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC,mBAAmB,CAAC,EAAE,UAAU,EAAE,CAAC,YAAY,CAAC,EAAE;IACpF,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,mBAAmB,CAAC,EAAE,UAAU,EAAE,CAAC,OAAO,CAAC,EAAE;IAC1E,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,mBAAmB,CAAC,EAAE,UAAU,EAAE,CAAC,eAAe,CAAC,EAAE;IACnF,EAAE,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC,mBAAmB,CAAC,EAAE,UAAU,EAAE,CAAC,YAAY,CAAC,EAAE;CACrF,CAAC"}
|
package/dist/version.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare const VERSION = "0.
|
|
1
|
+
export declare const VERSION = "0.4.1";
|
|
2
2
|
//# sourceMappingURL=version.d.ts.map
|
package/dist/version.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export const VERSION = '0.
|
|
1
|
+
export const VERSION = '0.4.1';
|
|
2
2
|
//# sourceMappingURL=version.js.map
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
# ddd-ts-kit/presentation-controller-delegates
|
|
2
|
+
|
|
3
|
+
Architecture id: `presentation/controller-delegates` (added by this plugin). Default severity: `error` in `recommended`, `error` in `strict`.
|
|
4
|
+
|
|
5
|
+
Applies to: `*.controller.ts` files of a context whose class carries `@Controller` of `@ddd-ts-kit/http`.
|
|
6
|
+
|
|
7
|
+
## Why
|
|
8
|
+
|
|
9
|
+
A controller holds no business logic, and the way to keep it so is to give it nothing to decide with. What it may be given is the bus of its method, a request mapper and a serializer. With a repository, a port or a domain service in its constructor, a rule would be written at the edge, where a job or an event handler calling the same use case does not pass.
|
|
10
|
+
|
|
11
|
+
## Reported
|
|
12
|
+
|
|
13
|
+
- a constructor parameter typed by anything else than `CommandBus`, `QueryBus`, a class named `*Mapper` or a class named `*Serializer`
|
|
14
|
+
- a `POST`, `PUT`, `PATCH` or `DELETE` controller given the `QueryBus`, and a `GET` or `HEAD` controller given the `CommandBus`
|
|
15
|
+
- a controller that is not given the bus of its method
|
|
16
|
+
|
|
17
|
+
Incorrect:
|
|
18
|
+
|
|
19
|
+
```ts
|
|
20
|
+
@Controller({ group: InvoicesRoutes, method: 'GET', path: '/:invoiceId', summary: 'Get invoice', response: { status: 200, body: answer } })
|
|
21
|
+
export class GetInvoiceController {
|
|
22
|
+
constructor(
|
|
23
|
+
private readonly commands: CommandBus,
|
|
24
|
+
private readonly invoices: InvoiceRepository,
|
|
25
|
+
) {}
|
|
26
|
+
}
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
Correct:
|
|
30
|
+
|
|
31
|
+
```ts
|
|
32
|
+
@Controller({ group: InvoicesRoutes, method: 'GET', path: '/:invoiceId', summary: 'Get invoice', response: { status: 200, body: answer } })
|
|
33
|
+
export class GetInvoiceController {
|
|
34
|
+
constructor(
|
|
35
|
+
private readonly queries: QueryBus,
|
|
36
|
+
private readonly serializer: GetInvoiceSerializer,
|
|
37
|
+
) {}
|
|
38
|
+
}
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
## Details
|
|
42
|
+
|
|
43
|
+
The method is read from the string literal of the declaration; a declaration built elsewhere is judged on its dependencies only. A controller without a constructor is reported for the missing bus.
|
|
44
|
+
|
|
45
|
+
## Options
|
|
46
|
+
|
|
47
|
+
None.
|
|
48
|
+
|
|
49
|
+
`rules."presentation/controller-delegates"` in `ddd-ts-kit.config.json` set to `off` silences the rule, and `// ddd-ts-kit-disable-next-line presentation/controller-delegates -- <reason>` silences one line, exactly as for `ddd-ts-kit check`.
|
|
50
|
+
|
|
51
|
+
## Limits
|
|
52
|
+
|
|
53
|
+
- The body of `handle` is not read: a controller that computes in `handle` what a use case should decide is not seen. The dependencies it would need for anything serious are.
|
|
54
|
+
|
|
55
|
+
## With the CLI checker
|
|
56
|
+
|
|
57
|
+
New with this plugin: the CLI checker has no equivalent, because the constructor of a class needs a syntax tree.
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
# ddd-ts-kit/presentation-controller-shape
|
|
2
|
+
|
|
3
|
+
Architecture id: `presentation/controller-shape` (added by this plugin). Default severity: `error` in `recommended`, `error` in `strict`.
|
|
4
|
+
|
|
5
|
+
Applies to: `*.controller.ts` files whose class carries `@Controller` of `@ddd-ts-kit/http`.
|
|
6
|
+
|
|
7
|
+
## Why
|
|
8
|
+
|
|
9
|
+
A controller is one route: one class, called by the pipeline through `handle`. The class is found by the name of its file, read in one sitting, and its declaration is the single statement of the route. A second public method is a second route hiding in the first, or a translation that belongs to a request mapper or a serializer.
|
|
10
|
+
|
|
11
|
+
## Reported
|
|
12
|
+
|
|
13
|
+
- a second exported class in the file of a controller
|
|
14
|
+
- a controller class without a public `handle`
|
|
15
|
+
- any other public method or function property, static ones included
|
|
16
|
+
|
|
17
|
+
Incorrect:
|
|
18
|
+
|
|
19
|
+
```ts
|
|
20
|
+
@Controller({ group: InvoicesRoutes, method: 'POST', path: '/', summary: 'Issue invoice', response: { status: 201, body: accepted } })
|
|
21
|
+
export class IssueInvoiceController {
|
|
22
|
+
async execute(request: HttpRequest): Promise<IssueInvoiceAccepted> {}
|
|
23
|
+
totalOf(body: IssueInvoiceBody): number {}
|
|
24
|
+
}
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
Correct:
|
|
28
|
+
|
|
29
|
+
```ts
|
|
30
|
+
@Controller({ group: InvoicesRoutes, method: 'POST', path: '/', summary: 'Issue invoice', body, response: { status: 201, body: accepted } })
|
|
31
|
+
export class IssueInvoiceController {
|
|
32
|
+
constructor(private readonly commands: CommandBus) {}
|
|
33
|
+
|
|
34
|
+
async handle(request: HttpRequest<{ body: IssueInvoiceBody }>): Promise<IssueInvoiceAccepted> {}
|
|
35
|
+
}
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
## Details
|
|
39
|
+
|
|
40
|
+
A `*.controller.ts` file that declares no controller of the kit, such as a NestJS controller written by hand, is not judged. Types, interfaces, constants and functions that are not exported may stand next to the class. That `handle` receives what the declaration validates and returns what it declares is checked by the compiler, on the decorator.
|
|
41
|
+
|
|
42
|
+
## Options
|
|
43
|
+
|
|
44
|
+
None.
|
|
45
|
+
|
|
46
|
+
`rules."presentation/controller-shape"` in `ddd-ts-kit.config.json` set to `off` silences the rule, and `// ddd-ts-kit-disable-next-line presentation/controller-shape -- <reason>` silences one line, exactly as for `ddd-ts-kit check`.
|
|
47
|
+
|
|
48
|
+
## With the CLI checker
|
|
49
|
+
|
|
50
|
+
New with this plugin: the CLI checker has no equivalent, because the shape of a class needs a syntax tree.
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
# ddd-ts-kit/presentation-guard-at-the-edge
|
|
2
|
+
|
|
3
|
+
Architecture id: `presentation/guard-at-the-edge` (added by this plugin). Default severity: `error` in `recommended`, `error` in `strict`.
|
|
4
|
+
|
|
5
|
+
Applies to: every `*.guard.ts` file, in a context or in the platform.
|
|
6
|
+
|
|
7
|
+
## Why
|
|
8
|
+
|
|
9
|
+
A guard is a control at the edge over a set of routes: is the caller authenticated, does it hold a role, does the tenant of its token match the one of the path, is the key of the request known. A business permission is another thing: it depends on the element (who owns this appointment, is this invoice still a draft) and it is declared on the use case with `@Requires`, so that a job or an event handler sending the same command is held to the same right. A guard that loads an aggregate decides a permission at the one door where not every caller passes.
|
|
10
|
+
|
|
11
|
+
## Reported
|
|
12
|
+
|
|
13
|
+
- an import from `domain/` or `infrastructure/`, of any context
|
|
14
|
+
- an imported name ending in `Repository` or `UnitOfWork`
|
|
15
|
+
- an import of `CommandBus`
|
|
16
|
+
|
|
17
|
+
Incorrect:
|
|
18
|
+
|
|
19
|
+
```ts
|
|
20
|
+
import { AppointmentRepository } from '@/contexts/scheduling/domain/repositories/appointment.repository';
|
|
21
|
+
|
|
22
|
+
@Guard()
|
|
23
|
+
export class OwnAppointmentGuard implements Guard {
|
|
24
|
+
constructor(private readonly appointments: AppointmentRepository) {}
|
|
25
|
+
}
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
Correct:
|
|
29
|
+
|
|
30
|
+
```ts
|
|
31
|
+
@Guard()
|
|
32
|
+
export class SameClinicGuard implements Guard {
|
|
33
|
+
readonly documents = { errors: ['FORBIDDEN'] };
|
|
34
|
+
|
|
35
|
+
check({ actor, params }: GuardRequest): void {
|
|
36
|
+
if (actor.tenantId !== params['clinicId']) {
|
|
37
|
+
throw new ForbiddenError('The caller belongs to another clinic');
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
## Details
|
|
44
|
+
|
|
45
|
+
A guard may depend on a port of `application/ports/` that answers a question about the caller, such as whether an API key exists: the port is the checkable line, an aggregate behind it is not seen.
|
|
46
|
+
|
|
47
|
+
## Options
|
|
48
|
+
|
|
49
|
+
None.
|
|
50
|
+
|
|
51
|
+
`rules."presentation/guard-at-the-edge"` in `ddd-ts-kit.config.json` set to `off` silences the rule, and `// ddd-ts-kit-disable-next-line presentation/guard-at-the-edge -- <reason>` silences one line, exactly as for `ddd-ts-kit check`.
|
|
52
|
+
|
|
53
|
+
## With the CLI checker
|
|
54
|
+
|
|
55
|
+
New with this plugin: the CLI checker has no equivalent.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ddd-ts-kit/eslint-plugin",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.4.1",
|
|
4
4
|
"description": "AST-accurate ESLint rules for DDD and Clean Architecture in TypeScript: layer and context isolation, domain purity, clean code ordering.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|