@pjts/eslint-style-rules 0.0.8 → 0.0.9
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/LICENSE +21 -0
- package/README.md +38 -8
- package/dist/index.js +35 -4
- package/dist/index.js.map +1 -1
- package/dist/lib/ast.d.ts +27 -13
- package/dist/lib/ast.js +33 -7
- package/dist/lib/ast.js.map +1 -1
- package/dist/lib/db.d.ts +5 -4
- package/dist/lib/db.js +2 -2
- package/dist/lib/db.js.map +1 -1
- package/dist/lib/rule.d.ts +8 -6
- package/dist/lib/rule.js +3 -3
- package/dist/lib/rule.js.map +1 -1
- package/dist/lib/types.d.ts +69 -0
- package/dist/lib/types.js +270 -0
- package/dist/lib/types.js.map +1 -0
- package/dist/lib/wiring.d.ts +5 -3
- package/dist/lib/wiring.js +8 -4
- package/dist/lib/wiring.js.map +1 -1
- package/dist/rules/app-class-suffix.d.ts +1 -1
- package/dist/rules/app-class-suffix.js +1 -1
- package/dist/rules/app-class-suffix.js.map +1 -1
- package/dist/rules/app-service-endpoints.d.ts +3 -1
- package/dist/rules/app-service-endpoints.js +9 -8
- package/dist/rules/app-service-endpoints.js.map +1 -1
- package/dist/rules/auth-access.d.ts +2 -2
- package/dist/rules/auth-access.js +11 -10
- package/dist/rules/auth-access.js.map +1 -1
- package/dist/rules/config-provider-only.d.ts +1 -1
- package/dist/rules/config-provider-only.js +5 -3
- package/dist/rules/config-provider-only.js.map +1 -1
- package/dist/rules/db-client-dependency.d.ts +1 -1
- package/dist/rules/db-client-dependency.js +11 -7
- package/dist/rules/db-client-dependency.js.map +1 -1
- package/dist/rules/db-writes-in-repositories.d.ts +1 -1
- package/dist/rules/db-writes-in-repositories.js +12 -8
- package/dist/rules/db-writes-in-repositories.js.map +1 -1
- package/dist/rules/decorated-class-contract.d.ts +1 -1
- package/dist/rules/decorated-class-contract.js +1 -1
- package/dist/rules/decorated-class-contract.js.map +1 -1
- package/dist/rules/domain-primitive-params.d.ts +17 -0
- package/dist/rules/domain-primitive-params.js +116 -0
- package/dist/rules/domain-primitive-params.js.map +1 -0
- package/dist/rules/entity-constructor-data.d.ts +1 -1
- package/dist/rules/entity-constructor-data.js +4 -3
- package/dist/rules/entity-constructor-data.js.map +1 -1
- package/dist/rules/event-sourced-aggregate.d.ts +2 -2
- package/dist/rules/event-sourced-aggregate.js +8 -8
- package/dist/rules/event-sourced-aggregate.js.map +1 -1
- package/dist/rules/find-one-naming.d.ts +3 -2
- package/dist/rules/find-one-naming.js +35 -8
- package/dist/rules/find-one-naming.js.map +1 -1
- package/dist/rules/implements-ports-only.d.ts +10 -0
- package/dist/rules/implements-ports-only.js +74 -0
- package/dist/rules/implements-ports-only.js.map +1 -0
- package/dist/rules/import-only-in.d.ts +1 -1
- package/dist/rules/import-only-in.js +7 -3
- package/dist/rules/import-only-in.js.map +1 -1
- package/dist/rules/knex-first.d.ts +2 -1
- package/dist/rules/knex-first.js +11 -4
- package/dist/rules/knex-first.js.map +1 -1
- package/dist/rules/message-file.d.ts +1 -1
- package/dist/rules/message-file.js +3 -2
- package/dist/rules/message-file.js.map +1 -1
- package/dist/rules/message-handler.d.ts +1 -1
- package/dist/rules/message-handler.js +7 -6
- package/dist/rules/message-handler.js.map +1 -1
- package/dist/rules/message-name-reference.d.ts +2 -1
- package/dist/rules/message-name-reference.js +24 -5
- package/dist/rules/message-name-reference.js.map +1 -1
- package/dist/rules/message-names.d.ts +1 -1
- package/dist/rules/message-names.js +2 -2
- package/dist/rules/message-names.js.map +1 -1
- package/dist/rules/module-layout.d.ts +1 -1
- package/dist/rules/module-layout.js +1 -1
- package/dist/rules/module-layout.js.map +1 -1
- package/dist/rules/module-service-getters.d.ts +1 -1
- package/dist/rules/module-service-getters.js +11 -9
- package/dist/rules/module-service-getters.js.map +1 -1
- package/dist/rules/module-shape.d.ts +1 -1
- package/dist/rules/module-shape.js +6 -7
- package/dist/rules/module-shape.js.map +1 -1
- package/dist/rules/no-async-in-domain.d.ts +1 -1
- package/dist/rules/no-async-in-domain.js +2 -2
- package/dist/rules/no-async-in-domain.js.map +1 -1
- package/dist/rules/no-duplicate-sdk-types.d.ts +1 -1
- package/dist/rules/no-duplicate-sdk-types.js +1 -1
- package/dist/rules/no-duplicate-sdk-types.js.map +1 -1
- package/dist/rules/no-entity-assembly-in-app.d.ts +4 -2
- package/dist/rules/no-entity-assembly-in-app.js +24 -8
- package/dist/rules/no-entity-assembly-in-app.js.map +1 -1
- package/dist/rules/no-entity-mutation-outside-domain.d.ts +1 -1
- package/dist/rules/no-entity-mutation-outside-domain.js +1 -1
- package/dist/rules/no-entity-mutation-outside-domain.js.map +1 -1
- package/dist/rules/no-manual-wiring.d.ts +1 -1
- package/dist/rules/no-manual-wiring.js +5 -2
- package/dist/rules/no-manual-wiring.js.map +1 -1
- package/dist/rules/no-message-construction-outside-domain.d.ts +1 -1
- package/dist/rules/no-message-construction-outside-domain.js +1 -1
- package/dist/rules/no-message-construction-outside-domain.js.map +1 -1
- package/dist/rules/no-reconstitute.d.ts +1 -1
- package/dist/rules/no-reconstitute.js +1 -1
- package/dist/rules/no-reconstitute.js.map +1 -1
- package/dist/rules/one-class-per-file.d.ts +7 -0
- package/dist/rules/one-class-per-file.js +55 -0
- package/dist/rules/one-class-per-file.js.map +1 -0
- package/dist/rules/port-file.d.ts +1 -1
- package/dist/rules/port-file.js +3 -2
- package/dist/rules/port-file.js.map +1 -1
- package/dist/rules/port-has-adapters.d.ts +1 -1
- package/dist/rules/port-has-adapters.js +1 -1
- package/dist/rules/port-has-adapters.js.map +1 -1
- package/dist/rules/repository-naming.d.ts +1 -1
- package/dist/rules/repository-naming.js +2 -2
- package/dist/rules/repository-naming.js.map +1 -1
- package/dist/rules/repository-return-types.d.ts +10 -0
- package/dist/rules/repository-return-types.js +67 -0
- package/dist/rules/repository-return-types.js.map +1 -0
- package/dist/rules/repository-serialization.d.ts +13 -3
- package/dist/rules/repository-serialization.js +108 -12
- package/dist/rules/repository-serialization.js.map +1 -1
- package/dist/rules/return-entities.d.ts +1 -1
- package/dist/rules/return-entities.js +3 -3
- package/dist/rules/return-entities.js.map +1 -1
- package/dist/rules/save-contract.d.ts +5 -3
- package/dist/rules/save-contract.js +18 -5
- package/dist/rules/save-contract.js.map +1 -1
- package/dist/rules/subclass-declares-constructor.d.ts +1 -1
- package/dist/rules/subclass-declares-constructor.js +1 -1
- package/dist/rules/subclass-declares-constructor.js.map +1 -1
- package/dist/rules/test-location.d.ts +1 -1
- package/dist/rules/test-location.js +1 -1
- package/dist/rules/test-location.js.map +1 -1
- package/dist/rules/throw-app-error.d.ts +1 -1
- package/dist/rules/throw-app-error.js +4 -3
- package/dist/rules/throw-app-error.js.map +1 -1
- package/dist/rules/trackable-repository.d.ts +1 -1
- package/dist/rules/trackable-repository.js +4 -4
- package/dist/rules/trackable-repository.js.map +1 -1
- package/dist/rules/unique-class-names.d.ts +1 -1
- package/dist/rules/unique-class-names.js +5 -4
- package/dist/rules/unique-class-names.js.map +1 -1
- package/package.json +18 -6
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"find-one-naming.js","sourceRoot":"","sources":["../../src/rules/find-one-naming.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"find-one-naming.js","sourceRoot":"","sources":["../../src/rules/find-one-naming.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Infrastructure classes implement ports only: every name in an `implements` clause ends with
|
|
3
|
+
* `portSuffix` (`Port`), and a `…Repository` class implements at least one port — with
|
|
4
|
+
* `requireRepositoryPort` a `…RepositoryPort` (lookup repositories behind a `…DirectoryPort` fail then).
|
|
5
|
+
* Interfaces imported from packages (`OnBoot` from `@pjts/server`) are framework contracts and are
|
|
6
|
+
* skipped unless `ignorePackageTypes` is false; a source counts as a package when it is neither
|
|
7
|
+
* relative nor one of `pathAliases`. Abstract classes are not asked for a repository port.
|
|
8
|
+
*/
|
|
9
|
+
declare const _default: import("@typescript-eslint/utils/dist/ts-eslint").RuleModule<string, any[], unknown, import("@typescript-eslint/utils/dist/ts-eslint").RuleListener>;
|
|
10
|
+
export default _default;
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const rule_1 = require("../lib/rule");
|
|
4
|
+
const types_1 = require("../lib/types");
|
|
5
|
+
/**
|
|
6
|
+
* Infrastructure classes implement ports only: every name in an `implements` clause ends with
|
|
7
|
+
* `portSuffix` (`Port`), and a `…Repository` class implements at least one port — with
|
|
8
|
+
* `requireRepositoryPort` a `…RepositoryPort` (lookup repositories behind a `…DirectoryPort` fail then).
|
|
9
|
+
* Interfaces imported from packages (`OnBoot` from `@pjts/server`) are framework contracts and are
|
|
10
|
+
* skipped unless `ignorePackageTypes` is false; a source counts as a package when it is neither
|
|
11
|
+
* relative nor one of `pathAliases`. Abstract classes are not asked for a repository port.
|
|
12
|
+
*/
|
|
13
|
+
exports.default = (0, rule_1.defineRule)({
|
|
14
|
+
meta: {
|
|
15
|
+
type: 'suggestion',
|
|
16
|
+
docs: { description: 'Require infrastructure classes to implement only ports', url: 'https://github.com/PiotrJozefow/pjx/tree/master/modules/eslint-style-rules#implements-ports-only' },
|
|
17
|
+
messages: {
|
|
18
|
+
notPort: '"{{name}}" implements "{{type}}", which is not a port — rename it to …{{suffix}} (app/ports) or drop the clause.',
|
|
19
|
+
noRepositoryPort: 'Repository "{{name}}" must implement a …{{expected}}.',
|
|
20
|
+
},
|
|
21
|
+
schema: [{
|
|
22
|
+
type: 'object',
|
|
23
|
+
properties: {
|
|
24
|
+
portSuffix: { type: 'string' },
|
|
25
|
+
repositoryPattern: { type: 'string' },
|
|
26
|
+
ignorePackageTypes: { type: 'boolean' },
|
|
27
|
+
requireRepositoryPort: { type: 'boolean' },
|
|
28
|
+
pathAliases: { type: 'object', additionalProperties: { type: 'string' } },
|
|
29
|
+
},
|
|
30
|
+
additionalProperties: false,
|
|
31
|
+
}],
|
|
32
|
+
},
|
|
33
|
+
create(context) {
|
|
34
|
+
const { portSuffix = 'Port', repositoryPattern = 'Repository$', ignorePackageTypes = true, requireRepositoryPort = false, pathAliases = types_1.DEFAULT_PATH_ALIASES, } = context.options[0] ?? {};
|
|
35
|
+
const repository = new RegExp(repositoryPattern);
|
|
36
|
+
const aliasPrefixes = Object.keys(pathAliases).map((pattern) => pattern.replace(/\*$/, ''));
|
|
37
|
+
const isPackage = (source) => !source.startsWith('.') && !aliasPrefixes.some((prefix) => source.startsWith(prefix));
|
|
38
|
+
const fromPackages = new Set();
|
|
39
|
+
/** `Foo`, `ns.Foo`, `Foo<T>` → { name: 'Foo', root: 'Foo' | 'ns' }. */
|
|
40
|
+
const implemented = (clause) => {
|
|
41
|
+
let expression = clause.expression;
|
|
42
|
+
const last = expression.type === 'MemberExpression' ? (expression.property.type === 'Identifier' ? expression.property.name : '') : expression.type === 'Identifier' ? expression.name : '';
|
|
43
|
+
while (expression.type === 'MemberExpression')
|
|
44
|
+
expression = expression.object;
|
|
45
|
+
return { name: last, root: expression.type === 'Identifier' ? expression.name : '' };
|
|
46
|
+
};
|
|
47
|
+
const check = (node) => {
|
|
48
|
+
if (!node.id)
|
|
49
|
+
return;
|
|
50
|
+
const clauses = (node.implements ?? []).map(implemented);
|
|
51
|
+
for (const [index, clause] of clauses.entries()) {
|
|
52
|
+
if (ignorePackageTypes && fromPackages.has(clause.root))
|
|
53
|
+
continue;
|
|
54
|
+
if (!clause.name.endsWith(portSuffix)) {
|
|
55
|
+
context.report({ node: node.implements[index], messageId: 'notPort', data: { name: node.id.name, type: clause.name, suffix: portSuffix } });
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
const expected = requireRepositoryPort ? `Repository${portSuffix}` : portSuffix;
|
|
59
|
+
if (repository.test(node.id.name) && !node.abstract && !clauses.some((clause) => clause.name.endsWith(expected))) {
|
|
60
|
+
context.report({ node: node.id, messageId: 'noRepositoryPort', data: { name: node.id.name, expected } });
|
|
61
|
+
}
|
|
62
|
+
};
|
|
63
|
+
return {
|
|
64
|
+
ImportDeclaration(node) {
|
|
65
|
+
if (!isPackage(node.source.value))
|
|
66
|
+
return;
|
|
67
|
+
for (const specifier of node.specifiers)
|
|
68
|
+
fromPackages.add(specifier.local.name);
|
|
69
|
+
},
|
|
70
|
+
ClassDeclaration: check,
|
|
71
|
+
};
|
|
72
|
+
},
|
|
73
|
+
});
|
|
74
|
+
//# sourceMappingURL=implements-ports-only.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"implements-ports-only.js","sourceRoot":"","sources":["../../src/rules/implements-ports-only.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,5 +3,5 @@
|
|
|
3
3
|
* — importing (or requiring) `uuid` from a file whose path contains none of the listed fragments is
|
|
4
4
|
* an error. Sub-paths count (`uuid/v4`).
|
|
5
5
|
*/
|
|
6
|
-
declare const _default: import("eslint").
|
|
6
|
+
declare const _default: import("@typescript-eslint/utils/dist/ts-eslint").RuleModule<string, any[], unknown, import("@typescript-eslint/utils/dist/ts-eslint").RuleListener>;
|
|
7
7
|
export default _default;
|
|
@@ -10,7 +10,7 @@ const rule_1 = require("../lib/rule");
|
|
|
10
10
|
exports.default = (0, rule_1.defineRule)({
|
|
11
11
|
meta: {
|
|
12
12
|
type: 'problem',
|
|
13
|
-
docs: { description: 'Restrict packages to the layers allowed to use them' },
|
|
13
|
+
docs: { description: 'Restrict packages to the layers allowed to use them', url: 'https://github.com/PiotrJozefow/pjx/tree/master/modules/eslint-style-rules#import-only-in' },
|
|
14
14
|
messages: { restricted: '"{{module}}" may only be used in {{allowed}} — {{why}}' },
|
|
15
15
|
schema: [{
|
|
16
16
|
type: 'object',
|
|
@@ -43,8 +43,12 @@ exports.default = (0, rule_1.defineRule)({
|
|
|
43
43
|
return {
|
|
44
44
|
ImportDeclaration: (node) => check(node, node.source.value),
|
|
45
45
|
ExportAllDeclaration: (node) => check(node, node.source.value),
|
|
46
|
-
'ExportNamedDeclaration[source]': (node) => check(node, node.source.value),
|
|
47
|
-
'CallExpression[callee.name="require"][arguments.0.type="Literal"]': (node) =>
|
|
46
|
+
'ExportNamedDeclaration[source]': (node) => node.source && check(node, node.source.value),
|
|
47
|
+
'CallExpression[callee.name="require"][arguments.0.type="Literal"]': (node) => {
|
|
48
|
+
const argument = node.arguments[0];
|
|
49
|
+
if (argument?.type === 'Literal')
|
|
50
|
+
check(node, String(argument.value));
|
|
51
|
+
},
|
|
48
52
|
ImportExpression: (node) => node.source.type === 'Literal' && check(node, String(node.source.value)),
|
|
49
53
|
};
|
|
50
54
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"import-only-in.js","sourceRoot":"","sources":["../../src/rules/import-only-in.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"import-only-in.js","sourceRoot":"","sources":["../../src/rules/import-only-in.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { TSESLint } from '@typescript-eslint/utils';
|
|
1
2
|
/** single-record reads end the knex query with `.first()` instead of destructuring an array. */
|
|
2
|
-
declare const _default:
|
|
3
|
+
declare const _default: TSESLint.RuleModule<string, any[], unknown, TSESLint.RuleListener>;
|
|
3
4
|
export default _default;
|
package/dist/rules/knex-first.js
CHANGED
|
@@ -5,7 +5,8 @@ const rule_1 = require("../lib/rule");
|
|
|
5
5
|
exports.default = (0, rule_1.defineRule)({
|
|
6
6
|
meta: {
|
|
7
7
|
type: 'suggestion',
|
|
8
|
-
|
|
8
|
+
fixable: 'code',
|
|
9
|
+
docs: { description: 'Require knex `.first()` for single-record reads', url: 'https://github.com/PiotrJozefow/pjx/tree/master/modules/eslint-style-rules#knex-first' },
|
|
9
10
|
messages: { first: 'Single-record read: end the query with .first() instead of destructuring the result.' },
|
|
10
11
|
schema: [],
|
|
11
12
|
},
|
|
@@ -14,12 +15,18 @@ exports.default = (0, rule_1.defineRule)({
|
|
|
14
15
|
const knexQuery = /^(this\.)?(db|knex|trx)\s*(<[^>]*>)?\(/;
|
|
15
16
|
return {
|
|
16
17
|
'VariableDeclarator[id.type="ArrayPattern"][init.type="AwaitExpression"]'(node) {
|
|
17
|
-
if (node.id.elements.length !== 1)
|
|
18
|
+
if (node.id.type !== 'ArrayPattern' || node.init?.type !== 'AwaitExpression' || node.id.elements.length !== 1)
|
|
18
19
|
return;
|
|
19
|
-
const
|
|
20
|
+
const { id, init } = node;
|
|
21
|
+
const query = source.getText(init.argument);
|
|
20
22
|
// Writes that genuinely return rows (`RETURNING`) are fine to destructure.
|
|
21
23
|
if (knexQuery.test(query) && !/\.(returning|insert|update|del|delete)\(/.test(query)) {
|
|
22
|
-
|
|
24
|
+
const [element] = id.elements;
|
|
25
|
+
// `[row]` with a plain identifier (no default, no rest) rewrites mechanically; anything else is reported only.
|
|
26
|
+
const fix = element?.type === 'Identifier'
|
|
27
|
+
? (fixer) => [fixer.replaceText(id, source.getText(element)), fixer.insertTextAfter(init.argument, '.first()')]
|
|
28
|
+
: undefined;
|
|
29
|
+
context.report({ node, messageId: 'first', fix });
|
|
23
30
|
}
|
|
24
31
|
},
|
|
25
32
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"knex-first.js","sourceRoot":"","sources":["../../src/rules/knex-first.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"knex-first.js","sourceRoot":"","sources":["../../src/rules/knex-first.ts"],"names":[],"mappings":";;AACA,sCAAyC;AACzC,gGAAgG;AAChG,kBAAe,IAAA,iBAAU,EAAC;IACxB,IAAI,EAAE;QACJ,IAAI,EAAE,YAAY;QAClB,OAAO,EAAE,MAAM;QACf,IAAI,EAAE,EAAE,WAAW,EAAE,iDAAiD,EAAE,GAAG,EAAE,uFAAuF,EAAE;QACtK,QAAQ,EAAE,EAAE,KAAK,EAAE,sFAAsF,EAAE;QAC3G,MAAM,EAAE,EAAE;KACX;IACD,MAAM,CAAC,OAAO;QACZ,MAAM,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;QAClC,MAAM,SAAS,GAAG,wCAAwC,CAAC;QAC3D,OAAO;YACL,yEAAyE,CAAC,IAAiC;gBACzG,IAAI,IAAI,CAAC,EAAE,CAAC,IAAI,KAAK,cAAc,IAAI,IAAI,CAAC,IAAI,EAAE,IAAI,KAAK,iBAAiB,IAAI,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC;oBAAE,OAAO;gBACtH,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC;gBAC1B,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBAC5C,2EAA2E;gBAC3E,IAAI,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,0CAA0C,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;oBACrF,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC;oBAC9B,+GAA+G;oBAC/G,MAAM,GAAG,GAAG,OAAO,EAAE,IAAI,KAAK,YAAY;wBACxC,CAAC,CAAC,CAAC,KAAyB,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,EAAE,EAAE,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,EAAE,KAAK,CAAC,eAAe,CAAC,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;wBACnI,CAAC,CAAC,SAAS,CAAC;oBACd,OAAO,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC;gBACpD,CAAC;YACH,CAAC;SACF,CAAC;IACJ,CAAC;CACF,CAAC,CAAC"}
|
|
@@ -14,5 +14,5 @@
|
|
|
14
14
|
* uses (`OrderItem`) may sit next to it; another message or runtime code may not. Base files (`basePattern`) only
|
|
15
15
|
* extend `Message` and have no `name`. `index.ts` is checked by `message-names`.
|
|
16
16
|
*/
|
|
17
|
-
declare const _default: import("eslint").
|
|
17
|
+
declare const _default: import("@typescript-eslint/utils/dist/ts-eslint").RuleModule<string, any[], unknown, import("@typescript-eslint/utils/dist/ts-eslint").RuleListener>;
|
|
18
18
|
export default _default;
|
|
@@ -23,7 +23,7 @@ const messages_1 = require("../lib/messages");
|
|
|
23
23
|
exports.default = (0, rule_1.defineRule)({
|
|
24
24
|
meta: {
|
|
25
25
|
type: 'problem',
|
|
26
|
-
docs: { description: 'One message interface per file, named and typed after the file' },
|
|
26
|
+
docs: { description: 'One message interface per file, named and typed after the file', url: 'https://github.com/PiotrJozefow/pjx/tree/master/modules/eslint-style-rules#message-file' },
|
|
27
27
|
messages: {
|
|
28
28
|
onePerFile: 'One message per file — move "{{name}}" to its own file (unions go in index.ts; only helper payload types may stay).',
|
|
29
29
|
missing: '"{{file}}.ts" must declare `export interface {{file}} extends Message`.',
|
|
@@ -56,7 +56,8 @@ exports.default = (0, rule_1.defineRule)({
|
|
|
56
56
|
if (statement.type !== 'ImportDeclaration')
|
|
57
57
|
continue;
|
|
58
58
|
for (const specifier of statement.specifiers) {
|
|
59
|
-
|
|
59
|
+
const imported = specifier.type === 'ImportSpecifier' ? (specifier.imported.type === 'Identifier' ? specifier.imported.name : specifier.imported.value) : specifier.local.name;
|
|
60
|
+
if (messageModules.includes(statement.source.value) && imported === 'Message')
|
|
60
61
|
messageImports.add(specifier.local.name);
|
|
61
62
|
}
|
|
62
63
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"message-file.js","sourceRoot":"","sources":["../../src/rules/message-file.ts"],"names":[],"mappings":";;;AAAA,wDAAwB;AACxB,sCAAyC;AACzC,8CAAgD;AAEhD;;;;;;;;;;;;;;;GAeG;AACH,kBAAe,IAAA,iBAAU,EAAC;IACxB,IAAI,EAAE;QACJ,IAAI,EAAE,SAAS;QACf,IAAI,EAAE,EAAE,WAAW,EAAE,gEAAgE,EAAE;
|
|
1
|
+
{"version":3,"file":"message-file.js","sourceRoot":"","sources":["../../src/rules/message-file.ts"],"names":[],"mappings":"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"}
|
|
@@ -15,5 +15,5 @@
|
|
|
15
15
|
* - depends only on ports (`…Port`) or application classes imported from the app layer — the
|
|
16
16
|
* infrastructure is wired in by the module's `…MessageHandlers` composition root.
|
|
17
17
|
*/
|
|
18
|
-
declare const _default: import("eslint").
|
|
18
|
+
declare const _default: import("@typescript-eslint/utils/dist/ts-eslint").RuleModule<string, any[], unknown, import("@typescript-eslint/utils/dist/ts-eslint").RuleListener>;
|
|
19
19
|
export default _default;
|
|
@@ -24,7 +24,7 @@ const messages_1 = require("../lib/messages");
|
|
|
24
24
|
exports.default = (0, rule_1.defineRule)({
|
|
25
25
|
meta: {
|
|
26
26
|
type: 'problem',
|
|
27
|
-
docs: { description: 'Enforce the shape and dependencies of message handlers' },
|
|
27
|
+
docs: { description: 'Enforce the shape and dependencies of message handlers', url: 'https://github.com/PiotrJozefow/pjx/tree/master/modules/eslint-style-rules#message-handler' },
|
|
28
28
|
messages: {
|
|
29
29
|
suffix: 'Message handler "{{name}}" must end with "Handler".',
|
|
30
30
|
location: 'Message handler "{{name}}" belongs in {{paths}}.',
|
|
@@ -60,7 +60,7 @@ exports.default = (0, rule_1.defineRule)({
|
|
|
60
60
|
imports.set(specifier.local.name, node.source.value);
|
|
61
61
|
},
|
|
62
62
|
ClassDeclaration(node) {
|
|
63
|
-
if (!bases.includes(node.superClass
|
|
63
|
+
if (node.superClass?.type !== 'Identifier' || !bases.includes(node.superClass.name))
|
|
64
64
|
return;
|
|
65
65
|
const name = node.id?.name ?? '(anonymous)';
|
|
66
66
|
const at = node.id ?? node;
|
|
@@ -68,7 +68,7 @@ exports.default = (0, rule_1.defineRule)({
|
|
|
68
68
|
context.report({ node: at, messageId: 'suffix', data: { name } });
|
|
69
69
|
if (!paths.some((fragment) => file.includes(fragment)))
|
|
70
70
|
context.report({ node: at, messageId: 'location', data: { name, paths: paths.join(' or ') } });
|
|
71
|
-
const members =
|
|
71
|
+
const members = (0, ast_1.methods)(node);
|
|
72
72
|
const constructor = members.find((member) => member.kind === 'constructor');
|
|
73
73
|
const superCall = constructor?.value.body?.body
|
|
74
74
|
.map((statement) => statement.expression)
|
|
@@ -78,13 +78,13 @@ exports.default = (0, rule_1.defineRule)({
|
|
|
78
78
|
if (!list || list.type !== 'ArrayExpression' || subscribed.length === 0 || subscribed.some((n) => !n)) {
|
|
79
79
|
context.report({ node: superCall ?? constructor?.key ?? at, messageId: 'subscription', data: { name, enumName } });
|
|
80
80
|
}
|
|
81
|
-
const handle = members.find((member) => (
|
|
81
|
+
const handle = members.find((member) => (0, ast_1.memberName)(member) === 'handleMessage');
|
|
82
82
|
if (!handle || handle.accessibility !== 'protected') {
|
|
83
83
|
context.report({ node: handle?.key ?? at, messageId: 'handleMessage', data: { name } });
|
|
84
84
|
}
|
|
85
85
|
else {
|
|
86
86
|
const param = handle.value.params[0] && (0, db_1.paramBinding)(handle.value.params[0]);
|
|
87
|
-
if (!param
|
|
87
|
+
if (!param || !('typeAnnotation' in param) || !param.typeAnnotation)
|
|
88
88
|
context.report({ node: param ?? handle.key, messageId: 'untyped' });
|
|
89
89
|
const handled = (0, messages_1.switchCaseNames)(handle.value.body, enumName);
|
|
90
90
|
if (handled.size > 0) {
|
|
@@ -99,7 +99,8 @@ exports.default = (0, rule_1.defineRule)({
|
|
|
99
99
|
}
|
|
100
100
|
}
|
|
101
101
|
for (const param of constructor?.value.params ?? []) {
|
|
102
|
-
const
|
|
102
|
+
const binding = (0, db_1.paramBinding)(param);
|
|
103
|
+
const type = 'typeAnnotation' in binding ? binding.typeAnnotation?.typeAnnotation : undefined;
|
|
103
104
|
const typeName = type?.type === 'TSTypeReference' && type.typeName.type === 'Identifier' ? type.typeName.name : null;
|
|
104
105
|
if (!typeName)
|
|
105
106
|
continue;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"message-handler.js","sourceRoot":"","sources":["../../src/rules/message-handler.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"message-handler.js","sourceRoot":"","sources":["../../src/rules/message-handler.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
|
+
import type { TSESLint } from '@typescript-eslint/utils';
|
|
1
2
|
/**
|
|
2
3
|
* Message names are referenced through the enum (`MessageNames.CalendarBooked`), never as string
|
|
3
4
|
* literals: in a `name:` property, a `case` label of a `switch (x.name)`, or the names a `MessageHandlerBase` subclass
|
|
4
5
|
* passes to `super([...])`. A literal skips the compiler's check that the message exists.
|
|
5
6
|
*/
|
|
6
|
-
declare const _default:
|
|
7
|
+
declare const _default: TSESLint.RuleModule<string, any[], unknown, TSESLint.RuleListener>;
|
|
7
8
|
export default _default;
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const ast_1 = require("../lib/ast");
|
|
3
4
|
const rule_1 = require("../lib/rule");
|
|
4
5
|
/**
|
|
5
6
|
* Message names are referenced through the enum (`MessageNames.CalendarBooked`), never as string
|
|
@@ -9,7 +10,8 @@ const rule_1 = require("../lib/rule");
|
|
|
9
10
|
exports.default = (0, rule_1.defineRule)({
|
|
10
11
|
meta: {
|
|
11
12
|
type: 'problem',
|
|
12
|
-
|
|
13
|
+
fixable: 'code',
|
|
14
|
+
docs: { description: 'Reference message names through the MessageNames enum', url: 'https://github.com/PiotrJozefow/pjx/tree/master/modules/eslint-style-rules#message-name-reference' },
|
|
13
15
|
messages: { literal: 'Use {{enumName}}.{{suggestion}} instead of the string \'{{value}}\'.' },
|
|
14
16
|
schema: [{
|
|
15
17
|
type: 'object',
|
|
@@ -21,16 +23,33 @@ exports.default = (0, rule_1.defineRule)({
|
|
|
21
23
|
const { enumName = 'MessageNames', pattern = '^[A-Z][A-Z0-9]*(_[A-Z0-9]+)+$', handlerBases = ['MessageHandlerBase'] } = context.options[0] ?? {};
|
|
22
24
|
const isName = (node) => node?.type === 'Literal' && typeof node.value === 'string' && new RegExp(pattern).test(node.value);
|
|
23
25
|
const pascal = (value) => value.toLowerCase().replace(/(^|_)([a-z0-9])/g, (_m, _s, c) => c.toUpperCase());
|
|
24
|
-
|
|
26
|
+
// The literal can be replaced only when the enum is reachable in this file (imported or declared here).
|
|
27
|
+
let enumInScope = false;
|
|
28
|
+
const report = (node) => {
|
|
29
|
+
const suggestion = pascal(node.value);
|
|
30
|
+
const member = `${enumName}.${suggestion}`;
|
|
31
|
+
const isTypePosition = node.parent?.type === 'TSLiteralType';
|
|
32
|
+
context.report({
|
|
33
|
+
node,
|
|
34
|
+
messageId: 'literal',
|
|
35
|
+
data: { enumName, value: node.value, suggestion },
|
|
36
|
+
fix: enumInScope ? (fixer) => fixer.replaceText(isTypePosition ? node.parent : node, member) : undefined,
|
|
37
|
+
});
|
|
38
|
+
};
|
|
25
39
|
return {
|
|
40
|
+
Program(program) {
|
|
41
|
+
enumInScope = program.body.some((statement) => (statement.type === 'ImportDeclaration' && statement.specifiers.some((s) => (s.local?.name) === enumName))
|
|
42
|
+
|| (statement.type === 'TSEnumDeclaration' && statement.id.name === enumName)
|
|
43
|
+
|| (statement.type === 'ExportNamedDeclaration' && statement.declaration?.type === 'TSEnumDeclaration' && statement.declaration.id.name === enumName));
|
|
44
|
+
},
|
|
26
45
|
'Property[computed=false]'(node) {
|
|
27
|
-
if ((
|
|
46
|
+
if ((0, ast_1.keyName)(node.key) === 'name' && isName(node.value))
|
|
28
47
|
report(node.value);
|
|
29
48
|
},
|
|
30
49
|
'TSPropertySignature'(node) {
|
|
31
50
|
// `name: 'CALENDAR_BOOKED'` as a type in a message interface.
|
|
32
51
|
const type = node.typeAnnotation?.typeAnnotation;
|
|
33
|
-
if ((
|
|
52
|
+
if ((0, ast_1.keyName)(node.key) === 'name' && type?.type === 'TSLiteralType' && isName(type.literal))
|
|
34
53
|
report(type.literal);
|
|
35
54
|
},
|
|
36
55
|
// Only switches on a message's name — `switch (status) { case 'PART_CAPTURED': … }` is someone else's enum.
|
|
@@ -39,7 +58,7 @@ exports.default = (0, rule_1.defineRule)({
|
|
|
39
58
|
report(node.test);
|
|
40
59
|
},
|
|
41
60
|
'CallExpression[callee.type="Super"]'(node) {
|
|
42
|
-
const owner = context.sourceCode.getAncestors(node).reverse().find((a) => a.type === 'ClassDeclaration' || a.type === 'ClassExpression');
|
|
61
|
+
const owner = [...context.sourceCode.getAncestors(node)].reverse().find((a) => a.type === 'ClassDeclaration' || a.type === 'ClassExpression');
|
|
43
62
|
if (!handlerBases.includes(owner?.superClass?.name))
|
|
44
63
|
return;
|
|
45
64
|
const list = node.arguments[0];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"message-name-reference.js","sourceRoot":"","sources":["../../src/rules/message-name-reference.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"message-name-reference.js","sourceRoot":"","sources":["../../src/rules/message-name-reference.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,5 +3,5 @@
|
|
|
3
3
|
* files next to it: every `MessageNames` key has a `<Key>.ts`, every message file has a key and a
|
|
4
4
|
* re-export, and every value is the key in SCREAMING_SNAKE_CASE (`CalendarBooked = 'CALENDAR_BOOKED'`).
|
|
5
5
|
*/
|
|
6
|
-
declare const _default: import("eslint").
|
|
6
|
+
declare const _default: import("@typescript-eslint/utils/dist/ts-eslint").RuleModule<string, any[], unknown, import("@typescript-eslint/utils/dist/ts-eslint").RuleListener>;
|
|
7
7
|
export default _default;
|
|
@@ -13,7 +13,7 @@ const messages_1 = require("../lib/messages");
|
|
|
13
13
|
exports.default = (0, rule_1.defineRule)({
|
|
14
14
|
meta: {
|
|
15
15
|
type: 'problem',
|
|
16
|
-
docs: { description: 'Keep MessageNames, message files and re-exports in step' },
|
|
16
|
+
docs: { description: 'Keep MessageNames, message files and re-exports in step', url: 'https://github.com/PiotrJozefow/pjx/tree/master/modules/eslint-style-rules#message-names' },
|
|
17
17
|
messages: {
|
|
18
18
|
noEnum: 'The messages index must declare `export enum {{enumName}}`.',
|
|
19
19
|
noFile: '{{enumName}}.{{key}} has no message file "{{key}}.ts".',
|
|
@@ -64,7 +64,7 @@ exports.default = (0, rule_1.defineRule)({
|
|
|
64
64
|
exportsAll = true;
|
|
65
65
|
if (statement.type === 'ExportNamedDeclaration' && statement.source) {
|
|
66
66
|
for (const specifier of statement.specifiers)
|
|
67
|
-
reExported.add(specifier.exported.name
|
|
67
|
+
reExported.add(specifier.exported.type === 'Identifier' ? specifier.exported.name : specifier.exported.value);
|
|
68
68
|
}
|
|
69
69
|
}
|
|
70
70
|
for (const file of files) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"message-names.js","sourceRoot":"","sources":["../../src/rules/message-names.ts"],"names":[],"mappings":";;;AAAA,oDAAoB;AACpB,wDAAwB;AACxB,sCAAyC;AACzC,8CAAiD;AAEjD;;;;GAIG;AACH,kBAAe,IAAA,iBAAU,EAAC;IACxB,IAAI,EAAE;QACJ,IAAI,EAAE,SAAS;QACf,IAAI,EAAE,EAAE,WAAW,EAAE,yDAAyD,EAAE;
|
|
1
|
+
{"version":3,"file":"message-names.js","sourceRoot":"","sources":["../../src/rules/message-names.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,5 +5,5 @@
|
|
|
5
5
|
* <module>/app/{dto,ports}/… (app-layer classes sit directly in app/; tests next to them)
|
|
6
6
|
* The `<Module>Module.ts` file additionally checks that the required entries exist on disk.
|
|
7
7
|
*/
|
|
8
|
-
declare const _default: import("eslint").
|
|
8
|
+
declare const _default: import("@typescript-eslint/utils/dist/ts-eslint").RuleModule<string, any[], unknown, import("@typescript-eslint/utils/dist/ts-eslint").RuleListener>;
|
|
9
9
|
export default _default;
|
|
@@ -15,7 +15,7 @@ const rule_1 = require("../lib/rule");
|
|
|
15
15
|
exports.default = (0, rule_1.defineRule)({
|
|
16
16
|
meta: {
|
|
17
17
|
type: 'suggestion',
|
|
18
|
-
docs: { description: 'Enforce the DDD module folder layout' },
|
|
18
|
+
docs: { description: 'Enforce the DDD module folder layout', url: 'https://github.com/PiotrJozefow/pjx/tree/master/modules/eslint-style-rules#module-layout' },
|
|
19
19
|
messages: {
|
|
20
20
|
rootFile: '"{{file}}" must not sit in the module root — only {{allowed}} live there.',
|
|
21
21
|
folder: 'Folder "{{folder}}/" is not part of the module layout ({{allowed}}).',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"module-layout.js","sourceRoot":"","sources":["../../src/rules/module-layout.ts"],"names":[],"mappings":";;;AAAA,8DAAyB;AACzB,kEAA6B;AAC7B,oCAAwD;AACxD,sCAAyC;AAEzC;;;;;;GAMG;AACH,kBAAe,IAAA,iBAAU,EAAC;IACxB,IAAI,EAAE;QACJ,IAAI,EAAE,YAAY;QAClB,IAAI,EAAE,EAAE,WAAW,EAAE,sCAAsC,EAAE;
|
|
1
|
+
{"version":3,"file":"module-layout.js","sourceRoot":"","sources":["../../src/rules/module-layout.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
declare const _default: import("eslint").
|
|
1
|
+
declare const _default: import("@typescript-eslint/utils/dist/ts-eslint").RuleModule<string, any[], unknown, import("@typescript-eslint/utils/dist/ts-eslint").RuleListener>;
|
|
2
2
|
export default _default;
|