@pjts/eslint-style-rules 0.0.11 → 0.0.13
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 +2 -0
- package/dist/index.js +16 -1
- package/dist/index.js.map +1 -1
- package/dist/rules/dto-constructor-data.d.ts +11 -0
- package/dist/rules/dto-constructor-data.js +78 -0
- package/dist/rules/dto-constructor-data.js.map +1 -0
- package/dist/rules/no-domain-top-level-values.d.ts +2 -0
- package/dist/rules/no-domain-top-level-values.js +150 -0
- package/dist/rules/no-domain-top-level-values.js.map +1 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -64,6 +64,7 @@ exception is an inline disable with a reason:
|
|
|
64
64
|
|---|---|
|
|
65
65
|
| `event-sourced-aggregate` | `extends EventSourceable<XEvent>`: `@trackable`, typed event union, `protected apply` with a `case` for every emitted `MessageNames.X`, `apply` replay-safe (no emit / throw / clock / id minting / randomness). Option `stateChangesInApply`: `this.x = …` only in the constructor and `apply` |
|
|
66
66
|
| `no-async-in-domain` | no `async`, `await` or `Promise<…>` — except awaiting/returning a call from `allowedModules` (`bcrypt`) |
|
|
67
|
+
| `no-domain-top-level-values` | a file under a `domainFolder` (`domain`) segment holds only imports, `export … from`, classes (incl. `export default class`), interfaces, type aliases, `export { … }` / `export type { … }` and `declare` ambient statements. Reported: every `const`/`let`/`var` declarator (exported or file-private), function declarations (overloads once), `enum` / `const enum`, value namespaces, expression statements, `export default <value>` / `export = <value>`. Constants become static members or an injected `…Config`, functions static methods of the owning class, enums value classes. `allow`: names still permitted. Re-exported values are reported where declared; `*.test.ts` / `*.spec.ts` are skipped (the preset applies it to `src/**/domain/**`) |
|
|
67
68
|
| `entity-constructor-data` | entity constructors take one `<Entity>Data` object, typed exactly `<Entity>Data` as a plain type reference — no type arguments (`TaskData<T>`, `Partial<TaskData>`), no union / intersection (`TaskData \| null`), no inline object type — and the entity class is not generic (decorated primitives, `…Error`s skipped; the preset leaves out `domain/values`, `domain/services`, `domain/events`). `<Entity>Data` members: `domain-primitive-properties` |
|
|
68
69
|
| `decorated-class-contract` | classes with a configured decorator implement the listed methods (`@StringDomainPrimitive` → `toJSON`) |
|
|
69
70
|
| `no-reconstitute` | no `reconstitute` definition or call — repositories deserialize, services call `existing.update()` |
|
|
@@ -114,6 +115,7 @@ package or generic type it is accepted, otherwise plain.
|
|
|
114
115
|
|---|---|
|
|
115
116
|
| `app-class-suffix` | app-layer classes end with `Service` \| `Handler` \| `View` |
|
|
116
117
|
| `app-service-endpoints` | every public method of an `@AppService` has exactly one `@Get`/`@Post`/`@Put`/`@Patch`/`@Delete` and every parameter a request-binding decorator (`@Auth`, `@Body`, `@UrlParam`, `@QueryParam(s)`, `@Header`, `@Ip`, `@File`); non-public methods carry none |
|
|
118
|
+
| `dto-constructor-data` | DTO constructors take one `<Dto>Data` object: the single parameter is typed exactly `<Dto>Data` as a plain type reference — no inline object type (`constructor(data: { key: string })`), no type arguments (`Partial<SaveDtoData>`), no union / intersection — and `<Dto>Data` is an `interface` declared in the same file (not imported, not a `type` alias). The parameter may be optional (`data?: SaveDtoData`) or defaulted (`data: SaveDtoData = {}`); the DTO class is not generic. Unlike `entity-constructor-data`, decorated classes are checked, and the interface's members may be primitives or nested inline object types (the SDK generator expands the top-level `<Dto>Data` but not names referenced inside it). The preset applies it to `app/dto/**` |
|
|
117
119
|
| `return-entities` | no `.toJSON()` and no `Promise<…ResponseDto/Response/JSON>` — return entities, the framework serializes |
|
|
118
120
|
| `no-entity-assembly-in-app` | no `new Entity({...})` / `Entity.create({...})` from domain imports (classes declared in `domain/values` or `domain/views` exempt, index re-exports resolved) — use `Entity.fromDTO(...)` |
|
|
119
121
|
| `find-one-naming` | the private owner-scoped fetch helper (`AuthToken` first, returns `Promise<Entity>`, every `throw` is `AppError.notFound` — other throws mark a guard) is `findOne` (rename suggestion) |
|
package/dist/index.js
CHANGED
|
@@ -18,6 +18,7 @@ const domain_primitive_params_1 = tslib_1.__importDefault(require("./rules/domai
|
|
|
18
18
|
const domain_primitive_properties_1 = tslib_1.__importDefault(require("./rules/domain-primitive-properties"));
|
|
19
19
|
const decorated_class_contract_1 = tslib_1.__importDefault(require("./rules/decorated-class-contract"));
|
|
20
20
|
const decorators_on_own_lines_1 = tslib_1.__importDefault(require("./rules/decorators-on-own-lines"));
|
|
21
|
+
const dto_constructor_data_1 = tslib_1.__importDefault(require("./rules/dto-constructor-data"));
|
|
21
22
|
const entity_constructor_data_1 = tslib_1.__importDefault(require("./rules/entity-constructor-data"));
|
|
22
23
|
const find_one_naming_1 = tslib_1.__importDefault(require("./rules/find-one-naming"));
|
|
23
24
|
const implements_ports_only_1 = tslib_1.__importDefault(require("./rules/implements-ports-only"));
|
|
@@ -31,6 +32,7 @@ const config_provider_only_1 = tslib_1.__importDefault(require("./rules/config-p
|
|
|
31
32
|
const unique_class_names_1 = tslib_1.__importDefault(require("./rules/unique-class-names"));
|
|
32
33
|
const subclass_declares_constructor_1 = tslib_1.__importDefault(require("./rules/subclass-declares-constructor"));
|
|
33
34
|
const no_async_in_domain_1 = tslib_1.__importDefault(require("./rules/no-async-in-domain"));
|
|
35
|
+
const no_domain_top_level_values_1 = tslib_1.__importDefault(require("./rules/no-domain-top-level-values"));
|
|
34
36
|
const no_duplicate_sdk_types_1 = tslib_1.__importDefault(require("./rules/no-duplicate-sdk-types"));
|
|
35
37
|
const no_entity_assembly_in_app_1 = tslib_1.__importDefault(require("./rules/no-entity-assembly-in-app"));
|
|
36
38
|
const no_reconstitute_1 = tslib_1.__importDefault(require("./rules/no-reconstitute"));
|
|
@@ -63,6 +65,7 @@ const rules = {
|
|
|
63
65
|
'decorators-on-own-lines': decorators_on_own_lines_1.default,
|
|
64
66
|
'domain-primitive-params': domain_primitive_params_1.default,
|
|
65
67
|
'domain-primitive-properties': domain_primitive_properties_1.default,
|
|
68
|
+
'dto-constructor-data': dto_constructor_data_1.default,
|
|
66
69
|
'entity-constructor-data': entity_constructor_data_1.default,
|
|
67
70
|
'find-one-naming': find_one_naming_1.default,
|
|
68
71
|
'implements-ports-only': implements_ports_only_1.default,
|
|
@@ -76,6 +79,7 @@ const rules = {
|
|
|
76
79
|
'unique-class-names': unique_class_names_1.default,
|
|
77
80
|
'subclass-declares-constructor': subclass_declares_constructor_1.default,
|
|
78
81
|
'no-async-in-domain': no_async_in_domain_1.default,
|
|
82
|
+
'no-domain-top-level-values': no_domain_top_level_values_1.default,
|
|
79
83
|
'no-duplicate-sdk-types': no_duplicate_sdk_types_1.default,
|
|
80
84
|
'no-entity-assembly-in-app': no_entity_assembly_in_app_1.default,
|
|
81
85
|
'no-reconstitute': no_reconstitute_1.default,
|
|
@@ -125,7 +129,11 @@ const createDddConfig = (options = {}) => {
|
|
|
125
129
|
{
|
|
126
130
|
// pjts DTOs: constructor(data) first, then the validated (decorated) fields, then toJSON.
|
|
127
131
|
files: [`${module}/app/dto/**/*.ts`],
|
|
128
|
-
rules: {
|
|
132
|
+
rules: {
|
|
133
|
+
'@typescript-eslint/member-ordering': ['error', { default: ['constructor', 'field', 'static-method', 'instance-method'] }],
|
|
134
|
+
// constructor(data: <Dto>Data) with `interface <Dto>Data` in the same file — never an inline object type.
|
|
135
|
+
'pjts/dto-constructor-data': 'error',
|
|
136
|
+
},
|
|
129
137
|
},
|
|
130
138
|
// ── Cross-cutting: database, errors, identifiers ──────────────────────────
|
|
131
139
|
{
|
|
@@ -226,6 +234,13 @@ const createDddConfig = (options = {}) => {
|
|
|
226
234
|
}],
|
|
227
235
|
},
|
|
228
236
|
},
|
|
237
|
+
{
|
|
238
|
+
// A domain file holds imports, classes, interfaces, types and re-exports — no top-level values
|
|
239
|
+
// (constants, functions, enums): they become static members or an injected …Config.
|
|
240
|
+
files: [`${src}/**/domain/**/*.ts`],
|
|
241
|
+
ignores: exclude,
|
|
242
|
+
rules: { 'pjts/no-domain-top-level-values': 'error' },
|
|
243
|
+
},
|
|
229
244
|
{
|
|
230
245
|
// Value objects, domain services and events aren't entities.
|
|
231
246
|
files: [`${module}/domain/values/**/*.ts`, `${module}/domain/services/**/*.ts`, `${module}/domain/events/**/*.ts`],
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DTO constructors take one `<Dto>Data` object: the single parameter's type is exactly `<Dto>Data` as a
|
|
3
|
+
* plain type reference — no inline object type, no type arguments (`Partial<XDtoData>`), no union /
|
|
4
|
+
* intersection — and `<Dto>Data` is an `interface` declared in the same file, so the SDK generator
|
|
5
|
+
* expands it next to the DTO. The parameter may be optional (`data?: XDtoData`) or defaulted
|
|
6
|
+
* (`data: XDtoData = {}`), and the DTO class is not generic. Unlike entities, decorated classes are
|
|
7
|
+
* checked (pjts DTOs are `@ObjectDomainPrimitive`s) and the `Data` members may be primitives or nested
|
|
8
|
+
* inline object types.
|
|
9
|
+
*/
|
|
10
|
+
declare const _default: import("@typescript-eslint/utils/dist/ts-eslint").RuleModule<string, any[], unknown, import("@typescript-eslint/utils/dist/ts-eslint").RuleListener>;
|
|
11
|
+
export default _default;
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const rule_1 = require("../lib/rule");
|
|
4
|
+
/**
|
|
5
|
+
* DTO constructors take one `<Dto>Data` object: the single parameter's type is exactly `<Dto>Data` as a
|
|
6
|
+
* plain type reference — no inline object type, no type arguments (`Partial<XDtoData>`), no union /
|
|
7
|
+
* intersection — and `<Dto>Data` is an `interface` declared in the same file, so the SDK generator
|
|
8
|
+
* expands it next to the DTO. The parameter may be optional (`data?: XDtoData`) or defaulted
|
|
9
|
+
* (`data: XDtoData = {}`), and the DTO class is not generic. Unlike entities, decorated classes are
|
|
10
|
+
* checked (pjts DTOs are `@ObjectDomainPrimitive`s) and the `Data` members may be primitives or nested
|
|
11
|
+
* inline object types.
|
|
12
|
+
*/
|
|
13
|
+
exports.default = (0, rule_1.defineRule)({
|
|
14
|
+
meta: {
|
|
15
|
+
type: 'suggestion',
|
|
16
|
+
docs: { description: 'Require DTO constructors to take a single `<Dto>Data` interface parameter', url: 'https://github.com/PiotrJozefow/pjx/tree/master/modules/eslint-style-rules#dto-constructor-data' },
|
|
17
|
+
messages: {
|
|
18
|
+
data: 'Constructor of "{{name}}" must take a single `data: {{name}}Data` parameter.',
|
|
19
|
+
inline: 'Constructor of "{{name}}": declare `interface {{name}}Data` in this file and type the parameter with it instead of an inline object type.',
|
|
20
|
+
shape: 'Constructor of "{{name}}": the parameter type must be exactly `{{name}}Data` (a plain type reference), not `{{type}}`.',
|
|
21
|
+
local: '`{{name}}Data` must be an interface declared in this file{{found}}.',
|
|
22
|
+
generic: '"{{name}}" must not be generic: a DTO\'s `{{name}}Data` shape is fixed.',
|
|
23
|
+
},
|
|
24
|
+
schema: [],
|
|
25
|
+
},
|
|
26
|
+
create(context) {
|
|
27
|
+
const source = context.sourceCode;
|
|
28
|
+
const declarations = () => {
|
|
29
|
+
const kinds = new Map();
|
|
30
|
+
for (const statement of source.ast.body) {
|
|
31
|
+
const node = statement.type === 'ExportNamedDeclaration' || statement.type === 'ExportDefaultDeclaration' ? statement.declaration : statement;
|
|
32
|
+
if (node?.type === 'TSInterfaceDeclaration' || node?.type === 'TSTypeAliasDeclaration')
|
|
33
|
+
kinds.set(node.id.name, node.type);
|
|
34
|
+
}
|
|
35
|
+
return kinds;
|
|
36
|
+
};
|
|
37
|
+
return {
|
|
38
|
+
ClassDeclaration(classNode) {
|
|
39
|
+
if (classNode.id && classNode.typeParameters) {
|
|
40
|
+
context.report({ node: classNode.typeParameters, messageId: 'generic', data: { name: classNode.id.name } });
|
|
41
|
+
}
|
|
42
|
+
},
|
|
43
|
+
'ClassDeclaration > ClassBody > MethodDefinition[kind="constructor"]'(constructor) {
|
|
44
|
+
const classNode = constructor.parent.parent;
|
|
45
|
+
if (!classNode.id)
|
|
46
|
+
return;
|
|
47
|
+
const params = constructor.value.params
|
|
48
|
+
.map((param) => (param.type === 'TSParameterProperty' ? param.parameter : param))
|
|
49
|
+
.map((param) => (param.type === 'AssignmentPattern' ? param.left : param));
|
|
50
|
+
if (params.length === 0)
|
|
51
|
+
return;
|
|
52
|
+
const name = classNode.id.name;
|
|
53
|
+
const first = params[0];
|
|
54
|
+
const type = 'typeAnnotation' in first ? first.typeAnnotation?.typeAnnotation : undefined;
|
|
55
|
+
if (params.length !== 1 || !type || first.type === 'RestElement') {
|
|
56
|
+
context.report({ node: constructor.key, messageId: 'data', data: { name } });
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
if (type.type === 'TSTypeLiteral') {
|
|
60
|
+
context.report({ node: type, messageId: 'inline', data: { name } });
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
const exact = type.type === 'TSTypeReference' && type.typeName.type === 'Identifier' && type.typeName.name === `${name}Data` && !type.typeArguments;
|
|
64
|
+
if (!exact) {
|
|
65
|
+
context.report(source.getText(type).includes(`${name}Data`)
|
|
66
|
+
? { node: type, messageId: 'shape', data: { name, type: source.getText(type).replace(/\s+/g, ' ') } }
|
|
67
|
+
: { node: constructor.key, messageId: 'data', data: { name } });
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
const kind = declarations().get(`${name}Data`);
|
|
71
|
+
if (kind !== 'TSInterfaceDeclaration') {
|
|
72
|
+
context.report({ node: type, messageId: 'local', data: { name, found: kind ? ', not a type alias' : '' } });
|
|
73
|
+
}
|
|
74
|
+
},
|
|
75
|
+
};
|
|
76
|
+
},
|
|
77
|
+
});
|
|
78
|
+
//# sourceMappingURL=dto-constructor-data.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dto-constructor-data.js","sourceRoot":"","sources":["../../src/rules/dto-constructor-data.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const rule_1 = require("../lib/rule");
|
|
4
|
+
const HINTS = {
|
|
5
|
+
variable: 'move it into the class that owns it (`private static readonly`, a static factory) or inject it as a `…Config`',
|
|
6
|
+
function: 'make it a static method of the class that owns the concept',
|
|
7
|
+
enum: 'TS enums are values — make it a value class (`private static readonly VALUES` + `static all()`)',
|
|
8
|
+
namespace: 'namespaces are values — use a class with static members',
|
|
9
|
+
statement: 'a domain file holds only imports, classes, interfaces, type aliases and re-exports',
|
|
10
|
+
};
|
|
11
|
+
const ALWAYS_ALLOWED = new Set([
|
|
12
|
+
'ImportDeclaration',
|
|
13
|
+
'TSImportEqualsDeclaration',
|
|
14
|
+
'ExportAllDeclaration',
|
|
15
|
+
'ClassDeclaration',
|
|
16
|
+
'TSInterfaceDeclaration',
|
|
17
|
+
'TSTypeAliasDeclaration',
|
|
18
|
+
'TSNamespaceExportDeclaration',
|
|
19
|
+
'EmptyStatement',
|
|
20
|
+
]);
|
|
21
|
+
/** Names bound by a declarator's id (`a`, `{ a, b: c }` → a, c, `[x, ...y]` → x, y). */
|
|
22
|
+
const boundNames = (node) => {
|
|
23
|
+
if (!node)
|
|
24
|
+
return [];
|
|
25
|
+
switch (node.type) {
|
|
26
|
+
case 'Identifier': return [node.name];
|
|
27
|
+
case 'ObjectPattern': return node.properties.flatMap((property) => boundNames(property.type === 'Property' ? property.value : property));
|
|
28
|
+
case 'ArrayPattern': return node.elements.flatMap((element) => boundNames(element));
|
|
29
|
+
case 'RestElement': return boundNames(node.argument);
|
|
30
|
+
case 'AssignmentPattern': return boundNames(node.left);
|
|
31
|
+
default: return [];
|
|
32
|
+
}
|
|
33
|
+
};
|
|
34
|
+
exports.default = (0, rule_1.defineRule)({
|
|
35
|
+
meta: {
|
|
36
|
+
type: 'suggestion',
|
|
37
|
+
docs: {
|
|
38
|
+
description: 'Forbid top-level values (const/let/var, functions, enums, statements) in domain files',
|
|
39
|
+
url: 'https://github.com/PiotrJozefow/pjx/tree/master/modules/eslint-style-rules#no-domain-top-level-values',
|
|
40
|
+
},
|
|
41
|
+
messages: { topLevel: 'Top-level {{what}} in a domain file — {{hint}}.' },
|
|
42
|
+
schema: [{
|
|
43
|
+
type: 'object',
|
|
44
|
+
properties: {
|
|
45
|
+
allow: { type: 'array', items: { type: 'string' } },
|
|
46
|
+
domainFolder: { type: 'string' },
|
|
47
|
+
},
|
|
48
|
+
additionalProperties: false,
|
|
49
|
+
}],
|
|
50
|
+
},
|
|
51
|
+
create(context) {
|
|
52
|
+
const allow = new Set(context.options[0]?.allow ?? []);
|
|
53
|
+
const domainFolder = context.options[0]?.domainFolder ?? 'domain';
|
|
54
|
+
const segments = context.filename.split(/[\\/]/);
|
|
55
|
+
if (!segments.slice(0, -1).includes(domainFolder) || /\.(test|spec)\.[cm]?[jt]sx?$/.test(segments[segments.length - 1]))
|
|
56
|
+
return {};
|
|
57
|
+
const report = (node, kind, what) => context.report({ node, messageId: 'topLevel', data: { what, hint: HINTS[kind] } });
|
|
58
|
+
const check = (statement, reportOn) => {
|
|
59
|
+
if (ALWAYS_ALLOWED.has(statement.type))
|
|
60
|
+
return;
|
|
61
|
+
if ('declare' in statement && statement.declare)
|
|
62
|
+
return; // ambient: types only
|
|
63
|
+
switch (statement.type) {
|
|
64
|
+
case 'VariableDeclaration':
|
|
65
|
+
for (const declarator of statement.declarations) {
|
|
66
|
+
const names = boundNames(declarator.id);
|
|
67
|
+
if (names.length && names.every((name) => allow.has(name)))
|
|
68
|
+
continue;
|
|
69
|
+
const label = declarator.id.type === 'Identifier' ? declarator.id.name : context.sourceCode.getText(declarator.id);
|
|
70
|
+
report(declarator, 'variable', `\`${statement.kind} ${label}\``);
|
|
71
|
+
}
|
|
72
|
+
return;
|
|
73
|
+
case 'FunctionDeclaration':
|
|
74
|
+
if (statement.id && allow.has(statement.id.name))
|
|
75
|
+
return;
|
|
76
|
+
report(reportOn, 'function', statement.id ? `function \`${statement.id.name}\`` : 'function');
|
|
77
|
+
return;
|
|
78
|
+
// Overload signatures belong to the implementation, reported once.
|
|
79
|
+
case 'TSDeclareFunction':
|
|
80
|
+
return;
|
|
81
|
+
case 'TSEnumDeclaration':
|
|
82
|
+
if (allow.has(statement.id.name))
|
|
83
|
+
return;
|
|
84
|
+
report(reportOn, 'enum', `${statement.const ? 'const enum' : 'enum'} \`${statement.id.name}\``);
|
|
85
|
+
return;
|
|
86
|
+
case 'TSModuleDeclaration':
|
|
87
|
+
// `declare module '…'` / `declare global` are ambient (handled above); a type-only namespace emits nothing.
|
|
88
|
+
if (statement.kind === 'global' || statement.id.type === 'Literal')
|
|
89
|
+
return;
|
|
90
|
+
if (statement.body && statement.body.body.every(isTypeOnly))
|
|
91
|
+
return;
|
|
92
|
+
if (allow.has(statement.id.type === 'Identifier' ? statement.id.name : ''))
|
|
93
|
+
return;
|
|
94
|
+
report(reportOn, 'namespace', `namespace \`${context.sourceCode.getText(statement.id)}\``);
|
|
95
|
+
return;
|
|
96
|
+
case 'ExpressionStatement':
|
|
97
|
+
if (statement.directive)
|
|
98
|
+
return;
|
|
99
|
+
report(reportOn, 'statement', 'expression statement');
|
|
100
|
+
return;
|
|
101
|
+
default:
|
|
102
|
+
report(reportOn, 'statement', `\`${statement.type}\``);
|
|
103
|
+
}
|
|
104
|
+
};
|
|
105
|
+
return {
|
|
106
|
+
Program(program) {
|
|
107
|
+
for (const statement of program.body) {
|
|
108
|
+
if (statement.type === 'ExportNamedDeclaration') {
|
|
109
|
+
// `export { a }`, `export type { A }`, `export { a } from '…'`: the value is reported where declared.
|
|
110
|
+
if (statement.declaration)
|
|
111
|
+
check(statement.declaration, statement);
|
|
112
|
+
continue;
|
|
113
|
+
}
|
|
114
|
+
if (statement.type === 'ExportDefaultDeclaration') {
|
|
115
|
+
const declaration = statement.declaration;
|
|
116
|
+
if (declaration.type === 'ClassDeclaration' || declaration.type === 'TSInterfaceDeclaration')
|
|
117
|
+
continue;
|
|
118
|
+
if (declaration.type === 'FunctionDeclaration' || declaration.type === 'TSDeclareFunction') {
|
|
119
|
+
check(declaration, statement);
|
|
120
|
+
continue;
|
|
121
|
+
}
|
|
122
|
+
// `export default <identifier>` re-exports a declaration; anything else is a value.
|
|
123
|
+
if (declaration.type === 'Identifier')
|
|
124
|
+
continue;
|
|
125
|
+
report(statement, 'variable', '`export default` value');
|
|
126
|
+
continue;
|
|
127
|
+
}
|
|
128
|
+
if (statement.type === 'TSExportAssignment') {
|
|
129
|
+
if (statement.expression.type === 'Identifier')
|
|
130
|
+
continue;
|
|
131
|
+
report(statement, 'variable', '`export =` value');
|
|
132
|
+
continue;
|
|
133
|
+
}
|
|
134
|
+
check(statement, statement);
|
|
135
|
+
}
|
|
136
|
+
},
|
|
137
|
+
};
|
|
138
|
+
},
|
|
139
|
+
});
|
|
140
|
+
const isTypeOnly = (statement) => {
|
|
141
|
+
const node = statement.type === 'ExportNamedDeclaration' ? statement.declaration : statement;
|
|
142
|
+
if (!node)
|
|
143
|
+
return true;
|
|
144
|
+
if (node.type === 'TSInterfaceDeclaration' || node.type === 'TSTypeAliasDeclaration')
|
|
145
|
+
return true;
|
|
146
|
+
if (node.type === 'TSModuleDeclaration')
|
|
147
|
+
return !node.body || node.body.body.every(isTypeOnly);
|
|
148
|
+
return 'declare' in node && !!node.declare;
|
|
149
|
+
};
|
|
150
|
+
//# sourceMappingURL=no-domain-top-level-values.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"no-domain-top-level-values.js","sourceRoot":"","sources":["../../src/rules/no-domain-top-level-values.ts"],"names":[],"mappings":"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"}
|