@luma-layered-ts/eslint-plugin 1.4.0 → 1.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/index.d.ts +76 -12
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +28 -0
- package/lib/index.js.map +1 -1
- package/lib/layers.d.ts +13 -1
- package/lib/layers.d.ts.map +1 -1
- package/lib/layers.js +181 -6
- package/lib/layers.js.map +1 -1
- package/lib/rules/codec-placement.d.ts +7 -0
- package/lib/rules/codec-placement.d.ts.map +1 -0
- package/lib/rules/codec-placement.js +151 -0
- package/lib/rules/codec-placement.js.map +1 -0
- package/lib/rules/next.d.ts +1 -1
- package/lib/rules/next.d.ts.map +1 -1
- package/lib/rules/next.js +11 -1
- package/lib/rules/next.js.map +1 -1
- package/lib/rules/react.d.ts +1 -1
- package/lib/rules/react.d.ts.map +1 -1
- package/lib/rules/react.js +19 -8
- package/lib/rules/react.js.map +1 -1
- package/lib/rules/require-layer.js +1 -1
- package/lib/rules/require-layer.js.map +1 -1
- package/lib/rules/require-unsafe-dir.d.ts +10 -0
- package/lib/rules/require-unsafe-dir.d.ts.map +1 -0
- package/lib/rules/require-unsafe-dir.js +221 -0
- package/lib/rules/require-unsafe-dir.js.map +1 -0
- package/lib/rules/server.d.ts +4 -2
- package/lib/rules/server.d.ts.map +1 -1
- package/lib/rules/server.js +195 -7
- package/lib/rules/server.js.map +1 -1
- package/lib/rules/strict-collection.d.ts +7 -0
- package/lib/rules/strict-collection.d.ts.map +1 -0
- package/lib/rules/strict-collection.js +65 -0
- package/lib/rules/strict-collection.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const utils_1 = require("@typescript-eslint/utils");
|
|
4
|
+
const create_rule_js_1 = require("../create-rule.js");
|
|
5
|
+
const layers_js_1 = require("../layers.js");
|
|
6
|
+
const defaultOptions = {};
|
|
7
|
+
const TYPES_PACKAGE = "@luma-layered-ts/types";
|
|
8
|
+
// Layers that convert between canonical and encoded representations
|
|
9
|
+
const CODEC_LAYERS = new Set(["adapter", "infra"]);
|
|
10
|
+
// `parse`, `parseMove`, `decode_v2` match; `parsed`, `decoder`, `parser` do not
|
|
11
|
+
const CODEC_NAME = /^(?:serialize|deserialize|encode|decode|parse)(?=[A-Z0-9_]|$)/;
|
|
12
|
+
function isFunctionNode(node) {
|
|
13
|
+
return (node?.type === utils_1.AST_NODE_TYPES.ArrowFunctionExpression ||
|
|
14
|
+
node?.type === utils_1.AST_NODE_TYPES.FunctionExpression);
|
|
15
|
+
}
|
|
16
|
+
function keyName(key) {
|
|
17
|
+
if (key.type === utils_1.AST_NODE_TYPES.Identifier)
|
|
18
|
+
return key.name;
|
|
19
|
+
if (key.type === utils_1.AST_NODE_TYPES.Literal && typeof key.value === "string") {
|
|
20
|
+
return key.value;
|
|
21
|
+
}
|
|
22
|
+
return null;
|
|
23
|
+
}
|
|
24
|
+
exports.default = (0, create_rule_js_1.createRule)({
|
|
25
|
+
name: "codec-placement",
|
|
26
|
+
meta: {
|
|
27
|
+
type: "problem",
|
|
28
|
+
docs: {
|
|
29
|
+
description: "String representations are produced in adapter: functions named serialize*/deserialize*/encode*/decode*/parse* are defined only in adapter (or infra), and DisplayText.make is called only in adapter.",
|
|
30
|
+
},
|
|
31
|
+
messages: {
|
|
32
|
+
codecOutsideAdapter: "'{{name}}' is named as a codec (canonical <-> encoded). Define it in adapter, not in '{{layer}}'.",
|
|
33
|
+
displayTextOutsideAdapter: "DisplayText.make is for display formatters in adapter. In '{{layer}}', receive DisplayText from adapter instead of creating it.",
|
|
34
|
+
},
|
|
35
|
+
schema: [],
|
|
36
|
+
},
|
|
37
|
+
defaultOptions: [defaultOptions],
|
|
38
|
+
create(context) {
|
|
39
|
+
const filePath = context.filename;
|
|
40
|
+
if ((0, layers_js_1.isTestFile)(filePath))
|
|
41
|
+
return {};
|
|
42
|
+
const layer = (0, layers_js_1.getLayerFromPath)(filePath);
|
|
43
|
+
if (!layer)
|
|
44
|
+
return {};
|
|
45
|
+
const checkCodecs = !CODEC_LAYERS.has(layer);
|
|
46
|
+
const checkDisplayText = layer !== "adapter";
|
|
47
|
+
if (!checkCodecs && !checkDisplayText)
|
|
48
|
+
return {};
|
|
49
|
+
// Local names bound to DisplayText, or to the whole types package (namespace import)
|
|
50
|
+
const displayTextLocals = new Set();
|
|
51
|
+
const typesNamespaces = new Set();
|
|
52
|
+
function reportDisplayText(node) {
|
|
53
|
+
context.report({
|
|
54
|
+
node,
|
|
55
|
+
messageId: "displayTextOutsideAdapter",
|
|
56
|
+
data: { layer },
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
function check(node, name) {
|
|
60
|
+
if (!checkCodecs || name === null || !CODEC_NAME.test(name))
|
|
61
|
+
return;
|
|
62
|
+
context.report({
|
|
63
|
+
node,
|
|
64
|
+
messageId: "codecOutsideAdapter",
|
|
65
|
+
data: { name, layer },
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
return {
|
|
69
|
+
ImportDeclaration(node) {
|
|
70
|
+
if (!checkDisplayText || node.source.value !== TYPES_PACKAGE)
|
|
71
|
+
return;
|
|
72
|
+
for (const specifier of node.specifiers) {
|
|
73
|
+
if (specifier.type === utils_1.AST_NODE_TYPES.ImportNamespaceSpecifier) {
|
|
74
|
+
typesNamespaces.add(specifier.local.name);
|
|
75
|
+
}
|
|
76
|
+
else if (specifier.type === utils_1.AST_NODE_TYPES.ImportSpecifier &&
|
|
77
|
+
keyName(specifier.imported) === "DisplayText") {
|
|
78
|
+
displayTextLocals.add(specifier.local.name);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
},
|
|
82
|
+
// DisplayText.make(...) / Types.DisplayText.make(...)
|
|
83
|
+
MemberExpression(node) {
|
|
84
|
+
if (!checkDisplayText ||
|
|
85
|
+
node.computed ||
|
|
86
|
+
keyName(node.property) !== "make") {
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
const target = node.object;
|
|
90
|
+
if ((target.type === utils_1.AST_NODE_TYPES.Identifier &&
|
|
91
|
+
displayTextLocals.has(target.name)) ||
|
|
92
|
+
(target.type === utils_1.AST_NODE_TYPES.MemberExpression &&
|
|
93
|
+
!target.computed &&
|
|
94
|
+
keyName(target.property) === "DisplayText" &&
|
|
95
|
+
target.object.type === utils_1.AST_NODE_TYPES.Identifier &&
|
|
96
|
+
typesNamespaces.has(target.object.name))) {
|
|
97
|
+
reportDisplayText(node);
|
|
98
|
+
}
|
|
99
|
+
},
|
|
100
|
+
FunctionDeclaration(node) {
|
|
101
|
+
if (node.id)
|
|
102
|
+
check(node.id, node.id.name);
|
|
103
|
+
},
|
|
104
|
+
VariableDeclarator(node) {
|
|
105
|
+
// const { make } = DisplayText
|
|
106
|
+
if (checkDisplayText &&
|
|
107
|
+
node.id.type === utils_1.AST_NODE_TYPES.ObjectPattern &&
|
|
108
|
+
node.init?.type === utils_1.AST_NODE_TYPES.Identifier &&
|
|
109
|
+
displayTextLocals.has(node.init.name) &&
|
|
110
|
+
node.id.properties.some((p) => p.type === utils_1.AST_NODE_TYPES.Property &&
|
|
111
|
+
!p.computed &&
|
|
112
|
+
keyName(p.key) === "make")) {
|
|
113
|
+
reportDisplayText(node);
|
|
114
|
+
}
|
|
115
|
+
if (node.id.type === utils_1.AST_NODE_TYPES.Identifier &&
|
|
116
|
+
isFunctionNode(node.init)) {
|
|
117
|
+
check(node.id, node.id.name);
|
|
118
|
+
}
|
|
119
|
+
},
|
|
120
|
+
MethodDefinition(node) {
|
|
121
|
+
if (!node.computed)
|
|
122
|
+
check(node.key, keyName(node.key));
|
|
123
|
+
},
|
|
124
|
+
PropertyDefinition(node) {
|
|
125
|
+
if (!node.computed && isFunctionNode(node.value)) {
|
|
126
|
+
check(node.key, keyName(node.key));
|
|
127
|
+
}
|
|
128
|
+
},
|
|
129
|
+
Property(node) {
|
|
130
|
+
if (!node.computed &&
|
|
131
|
+
node.parent.type === utils_1.AST_NODE_TYPES.ObjectExpression &&
|
|
132
|
+
isFunctionNode(node.value)) {
|
|
133
|
+
check(node.key, keyName(node.key));
|
|
134
|
+
}
|
|
135
|
+
},
|
|
136
|
+
// interface Codec { serializeItem(i: Item): string }
|
|
137
|
+
TSMethodSignature(node) {
|
|
138
|
+
if (!node.computed)
|
|
139
|
+
check(node.key, keyName(node.key));
|
|
140
|
+
},
|
|
141
|
+
TSPropertySignature(node) {
|
|
142
|
+
if (!node.computed &&
|
|
143
|
+
node.typeAnnotation?.typeAnnotation.type ===
|
|
144
|
+
utils_1.AST_NODE_TYPES.TSFunctionType) {
|
|
145
|
+
check(node.key, keyName(node.key));
|
|
146
|
+
}
|
|
147
|
+
},
|
|
148
|
+
};
|
|
149
|
+
},
|
|
150
|
+
});
|
|
151
|
+
//# sourceMappingURL=codec-placement.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codec-placement.js","sourceRoot":"","sources":["../../src/rules/codec-placement.ts"],"names":[],"mappings":"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"}
|
package/lib/rules/next.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
type Options = Record<string, never>;
|
|
2
|
-
type MessageId = "importViolation" | "importNonLayer" | "encodedGlobal" | "schemaBoundary" | "encodedMethod";
|
|
2
|
+
type MessageId = "noDate" | "importViolation" | "importNonLayer" | "encodedGlobal" | "schemaBoundary" | "encodedMethod";
|
|
3
3
|
declare const _default: import("@typescript-eslint/utils/dist/ts-eslint/Rule.js").RuleModule<MessageId, [Options], unknown, import("@typescript-eslint/utils/dist/ts-eslint/Rule.js").RuleListener> & {
|
|
4
4
|
name: string;
|
|
5
5
|
};
|
package/lib/rules/next.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"next.d.ts","sourceRoot":"","sources":["../../src/rules/next.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"next.d.ts","sourceRoot":"","sources":["../../src/rules/next.ts"],"names":[],"mappings":"AAiBA,KAAK,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;AAKrC,KAAK,SAAS,GACV,QAAQ,GACR,iBAAiB,GACjB,gBAAgB,GAChB,eAAe,GACf,gBAAgB,GAChB,eAAe,CAAC;;;;AAEpB,wBAkLG"}
|
package/lib/rules/next.js
CHANGED
|
@@ -13,6 +13,7 @@ exports.default = (0, create_rule_js_1.createRule)({
|
|
|
13
13
|
description: "Enforce layered architecture for Next.js app router files. app/api/ has server wiring root constraints (import matrix only). app/ pages/layouts have ui/pages-equivalent constraints.",
|
|
14
14
|
},
|
|
15
15
|
messages: {
|
|
16
|
+
noDate: layers_js_1.NO_DATE_MESSAGE,
|
|
16
17
|
importViolation: "'{{fromLayer}}' cannot import from '{{toLayer}}'.",
|
|
17
18
|
importNonLayer: "Import '{{importPath}}' does not resolve to a recognized layer. Move the target into a layer directory.",
|
|
18
19
|
encodedGlobal: "'{{name}}' is an encoded representation API. Not allowed in '{{layer}}'. Use canonical types (Effect.ts) instead.",
|
|
@@ -31,7 +32,8 @@ exports.default = (0, create_rule_js_1.createRule)({
|
|
|
31
32
|
return {};
|
|
32
33
|
const isApiRoute = layer === "app/api";
|
|
33
34
|
function checkImport(importPath, node) {
|
|
34
|
-
const
|
|
35
|
+
const resolved = (0, layers_js_1.resolveImportPath)(importPath, filePath);
|
|
36
|
+
const toLayer = (0, layers_js_1.getLayerFromImport)(resolved);
|
|
35
37
|
if (!toLayer) {
|
|
36
38
|
if ((0, layers_js_1.isNonLayerAliasImport)(importPath)) {
|
|
37
39
|
context.report({
|
|
@@ -53,6 +55,10 @@ exports.default = (0, create_rule_js_1.createRule)({
|
|
|
53
55
|
// app/api: import matrix only (server-side wiring root)
|
|
54
56
|
if (isApiRoute) {
|
|
55
57
|
return {
|
|
58
|
+
"Identifier[name='Date']"(node) {
|
|
59
|
+
if ((0, layers_js_1.isDateReference)(node))
|
|
60
|
+
context.report({ node, messageId: "noDate" });
|
|
61
|
+
},
|
|
56
62
|
ImportDeclaration(node) {
|
|
57
63
|
checkImport(node.source.value, node);
|
|
58
64
|
},
|
|
@@ -72,6 +78,10 @@ exports.default = (0, create_rule_js_1.createRule)({
|
|
|
72
78
|
}
|
|
73
79
|
// app/pages: same constraints as ui/pages
|
|
74
80
|
return {
|
|
81
|
+
"Identifier[name='Date']"(node) {
|
|
82
|
+
if ((0, layers_js_1.isDateReference)(node))
|
|
83
|
+
context.report({ node, messageId: "noDate" });
|
|
84
|
+
},
|
|
75
85
|
ImportDeclaration(node) {
|
|
76
86
|
checkImport(node.source.value, node);
|
|
77
87
|
},
|
package/lib/rules/next.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"next.js","sourceRoot":"","sources":["../../src/rules/next.ts"],"names":[],"mappings":";;AAAA,oDAAoE;AACpE,sDAA+C;AAC/C,
|
|
1
|
+
{"version":3,"file":"next.js","sourceRoot":"","sources":["../../src/rules/next.ts"],"names":[],"mappings":"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"}
|
package/lib/rules/react.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
type Options = Record<string, never>;
|
|
2
|
-
type MessageId = "importViolation" | "importNonLayer" | "encodedGlobal" | "schemaBoundary" | "encodedMethod" | "componentParseMethod";
|
|
2
|
+
type MessageId = "noDate" | "importViolation" | "importNonLayer" | "encodedGlobal" | "schemaBoundary" | "encodedMethod" | "componentParseMethod";
|
|
3
3
|
declare const _default: import("@typescript-eslint/utils/dist/ts-eslint/Rule.js").RuleModule<MessageId, [Options], unknown, import("@typescript-eslint/utils/dist/ts-eslint/Rule.js").RuleListener> & {
|
|
4
4
|
name: string;
|
|
5
5
|
};
|
package/lib/rules/react.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"react.d.ts","sourceRoot":"","sources":["../../src/rules/react.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"react.d.ts","sourceRoot":"","sources":["../../src/rules/react.ts"],"names":[],"mappings":"AAiBA,KAAK,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;AAarC,KAAK,SAAS,GACV,QAAQ,GACR,iBAAiB,GACjB,gBAAgB,GAChB,eAAe,GACf,gBAAgB,GAChB,eAAe,GACf,sBAAsB,CAAC;;;;AAE3B,wBAuKG"}
|
package/lib/rules/react.js
CHANGED
|
@@ -4,23 +4,29 @@ const utils_1 = require("@typescript-eslint/utils");
|
|
|
4
4
|
const create_rule_js_1 = require("../create-rule.js");
|
|
5
5
|
const layers_js_1 = require("../layers.js");
|
|
6
6
|
const defaultOptions = {};
|
|
7
|
-
const UI_LAYERS = new Set([
|
|
8
|
-
|
|
9
|
-
|
|
7
|
+
const UI_LAYERS = new Set([
|
|
8
|
+
"ui/hooks",
|
|
9
|
+
"ui/components",
|
|
10
|
+
"ui/containers",
|
|
11
|
+
"ui/pages",
|
|
12
|
+
]);
|
|
13
|
+
// components can call .trim(), .toString() — these don't interpret structure
|
|
14
|
+
const COMPONENT_ALLOWED_METHODS = new Set(["trim", "toString"]);
|
|
10
15
|
exports.default = (0, create_rule_js_1.createRule)({
|
|
11
16
|
name: "react",
|
|
12
17
|
meta: {
|
|
13
18
|
type: "problem",
|
|
14
19
|
docs: {
|
|
15
|
-
description: "Enforce layered architecture for React UI layers (ui/hooks, ui/components, ui/pages). Checks imports, encoded representation globals, Schema boundary, and string interpretation.",
|
|
20
|
+
description: "Enforce layered architecture for React UI layers (ui/hooks, ui/components, ui/containers, ui/pages). Checks imports, encoded representation globals, Schema boundary, and string interpretation.",
|
|
16
21
|
},
|
|
17
22
|
messages: {
|
|
23
|
+
noDate: layers_js_1.NO_DATE_MESSAGE,
|
|
18
24
|
importViolation: "'{{fromLayer}}' cannot import from '{{toLayer}}'.",
|
|
19
25
|
importNonLayer: "Import '{{importPath}}' does not resolve to a recognized layer. Move the target into a layer directory.",
|
|
20
26
|
encodedGlobal: "'{{name}}' is an encoded representation API. Not allowed in '{{layer}}'. Use canonical types (Effect.ts) instead.",
|
|
21
27
|
schemaBoundary: "Schema.{{method}}() crosses the canonical/encoded boundary. Not allowed in '{{layer}}'. Decoding belongs in adapter.",
|
|
22
28
|
encodedMethod: "'.{{method}}()' interprets encoded representation. Not allowed in '{{layer}}'.",
|
|
23
|
-
componentParseMethod: "'.{{method}}()' interprets string structure. Components may only call .
|
|
29
|
+
componentParseMethod: "'.{{method}}()' interprets string structure. Components may only call .trim().",
|
|
24
30
|
},
|
|
25
31
|
schema: [],
|
|
26
32
|
},
|
|
@@ -34,7 +40,8 @@ exports.default = (0, create_rule_js_1.createRule)({
|
|
|
34
40
|
return {};
|
|
35
41
|
const isComponent = layer === "ui/components";
|
|
36
42
|
function checkImport(importPath, node) {
|
|
37
|
-
const
|
|
43
|
+
const resolved = (0, layers_js_1.resolveImportPath)(importPath, filePath);
|
|
44
|
+
const toLayer = (0, layers_js_1.getLayerFromImport)(resolved);
|
|
38
45
|
if (!toLayer) {
|
|
39
46
|
if ((0, layers_js_1.isNonLayerAliasImport)(importPath)) {
|
|
40
47
|
context.report({
|
|
@@ -55,6 +62,10 @@ exports.default = (0, create_rule_js_1.createRule)({
|
|
|
55
62
|
}
|
|
56
63
|
return {
|
|
57
64
|
// --- Import checks ---
|
|
65
|
+
"Identifier[name='Date']"(node) {
|
|
66
|
+
if ((0, layers_js_1.isDateReference)(node))
|
|
67
|
+
context.report({ node, messageId: "noDate" });
|
|
68
|
+
},
|
|
58
69
|
ImportDeclaration(node) {
|
|
59
70
|
checkImport(node.source.value, node);
|
|
60
71
|
},
|
|
@@ -109,7 +120,7 @@ exports.default = (0, create_rule_js_1.createRule)({
|
|
|
109
120
|
if (method === "toString")
|
|
110
121
|
return;
|
|
111
122
|
if (isComponent) {
|
|
112
|
-
// Components:
|
|
123
|
+
// Components: trim allowed, parse methods forbidden
|
|
113
124
|
if (COMPONENT_ALLOWED_METHODS.has(method))
|
|
114
125
|
return;
|
|
115
126
|
if (layers_js_1.STRING_INTERPRETATION_METHODS.has(method)) {
|
|
@@ -121,7 +132,7 @@ exports.default = (0, create_rule_js_1.createRule)({
|
|
|
121
132
|
}
|
|
122
133
|
}
|
|
123
134
|
else {
|
|
124
|
-
// hooks/pages: all string interpretation forbidden
|
|
135
|
+
// hooks/containers/pages: all string interpretation forbidden
|
|
125
136
|
if (layers_js_1.STRING_INTERPRETATION_METHODS.has(method)) {
|
|
126
137
|
context.report({
|
|
127
138
|
node,
|
package/lib/rules/react.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"react.js","sourceRoot":"","sources":["../../src/rules/react.ts"],"names":[],"mappings":";;AAAA,oDAAoE;AACpE,sDAA+C;AAC/C,
|
|
1
|
+
{"version":3,"file":"react.js","sourceRoot":"","sources":["../../src/rules/react.ts"],"names":[],"mappings":"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"}
|
|
@@ -11,7 +11,7 @@ exports.default = (0, create_rule_js_1.createRule)({
|
|
|
11
11
|
description: "Require all source files under src/ to belong to a recognized layer directory. Files outside layer directories bypass all layer constraint checks.",
|
|
12
12
|
},
|
|
13
13
|
messages: {
|
|
14
|
-
noLayer: "This file is not in a recognized layer directory (src/{core,service,adapter,infra,ui/{hooks,components,pages},app/}). Move it to the appropriate layer so that import and encoding constraints are enforced.",
|
|
14
|
+
noLayer: "This file is not in a recognized layer directory (src/{core,service,adapter,infra,ui/{hooks,components,containers,pages},app/}). Move it to the appropriate layer so that import and encoding constraints are enforced.",
|
|
15
15
|
},
|
|
16
16
|
schema: [],
|
|
17
17
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"require-layer.js","sourceRoot":"","sources":["../../src/rules/require-layer.ts"],"names":[],"mappings":";;AAAA,sDAA+C;AAC/C,4CAA4D;AAG5D,MAAM,cAAc,GAAY,EAAE,CAAC;AAInC,kBAAe,IAAA,2BAAU,EAAuB;IAC9C,IAAI,EAAE,eAAe;IACrB,IAAI,EAAE;QACJ,IAAI,EAAE,SAAS;QACf,IAAI,EAAE;YACJ,WAAW,EACT,oJAAoJ;SACvJ;QACD,QAAQ,EAAE;YACR,OAAO,EACL,
|
|
1
|
+
{"version":3,"file":"require-layer.js","sourceRoot":"","sources":["../../src/rules/require-layer.ts"],"names":[],"mappings":";;AAAA,sDAA+C;AAC/C,4CAA4D;AAG5D,MAAM,cAAc,GAAY,EAAE,CAAC;AAInC,kBAAe,IAAA,2BAAU,EAAuB;IAC9C,IAAI,EAAE,eAAe;IACrB,IAAI,EAAE;QACJ,IAAI,EAAE,SAAS;QACf,IAAI,EAAE;YACJ,WAAW,EACT,oJAAoJ;SACvJ;QACD,QAAQ,EAAE;YACR,OAAO,EACL,yNAAyN;SAC5N;QACD,MAAM,EAAE,EAAE;KACX;IACD,cAAc,EAAE,CAAC,cAAc,CAAC;IAChC,MAAM,CAAC,OAAO;QACZ,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;QAElC,8BAA8B;QAC9B,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC;YAAE,OAAO,EAAE,CAAC;QAE1C,+DAA+D;QAC/D,IAAI,IAAA,sBAAU,EAAC,QAAQ,CAAC;YAAE,OAAO,EAAE,CAAC;QAEpC,sCAAsC;QACtC,IAAI,QAAQ,CAAC,KAAK,CAAC,qBAAqB,CAAC;YAAE,OAAO,EAAE,CAAC;QAErD,MAAM,KAAK,GAAG,IAAA,4BAAgB,EAAC,QAAQ,CAAC,CAAC;QACzC,IAAI,KAAK;YAAE,OAAO,EAAE,CAAC;QAErB,mEAAmE;QACnE,OAAO;YACL,OAAO,CAAC,IAAI;gBACV,OAAO,CAAC,MAAM,CAAC;oBACb,IAAI;oBACJ,SAAS,EAAE,SAAS;iBACrB,CAAC,CAAC;YACL,CAAC;SACF,CAAC;IACJ,CAAC;CACF,CAAC,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { TSESTree } from "@typescript-eslint/utils";
|
|
2
|
+
type Options = Record<string, never>;
|
|
3
|
+
type MessageId = "directiveOutsideUnsafeDir" | "effectOutsideUnsafeDir" | "lifecycleOutsideUnsafeDir" | "effectEscape" | "reactReexportAll" | "dynamicReactAccess";
|
|
4
|
+
export declare function isUnsafeDirFile(filePath: string): boolean;
|
|
5
|
+
export declare function findDirective(comment: TSESTree.Comment): string | null;
|
|
6
|
+
declare const _default: import("@typescript-eslint/utils/dist/ts-eslint/Rule.js").RuleModule<MessageId, [Options], unknown, import("@typescript-eslint/utils/dist/ts-eslint/Rule.js").RuleListener> & {
|
|
7
|
+
name: string;
|
|
8
|
+
};
|
|
9
|
+
export default _default;
|
|
10
|
+
//# sourceMappingURL=require-unsafe-dir.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"require-unsafe-dir.d.ts","sourceRoot":"","sources":["../../src/rules/require-unsafe-dir.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,QAAQ,EACT,MAAM,0BAA0B,CAAC;AAGlC,KAAK,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;AAGrC,KAAK,SAAS,GACV,2BAA2B,GAC3B,wBAAwB,GACxB,2BAA2B,GAC3B,cAAc,GACd,kBAAkB,GAClB,oBAAoB,CAAC;AAEzB,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAEzD;AAiBD,wBAAgB,aAAa,CAAC,OAAO,EAAE,QAAQ,CAAC,OAAO,GAAG,MAAM,GAAG,IAAI,CAUtE;;;;AAwCD,wBAyKG"}
|
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.isUnsafeDirFile = isUnsafeDirFile;
|
|
4
|
+
exports.findDirective = findDirective;
|
|
5
|
+
const utils_1 = require("@typescript-eslint/utils");
|
|
6
|
+
const create_rule_js_1 = require("../create-rule.js");
|
|
7
|
+
const defaultOptions = {};
|
|
8
|
+
function isUnsafeDirFile(filePath) {
|
|
9
|
+
return /\/_unsafe_\//.test(filePath);
|
|
10
|
+
}
|
|
11
|
+
// Directives that suppress static checks or coverage.
|
|
12
|
+
// `eslint <rule>: <severity>` inline config is only recognized in block comments.
|
|
13
|
+
const DIRECTIVE_PATTERNS = [
|
|
14
|
+
{ pattern: /^eslint-disable(?:-line|-next-line)?(?=\s|$)/, blockOnly: false },
|
|
15
|
+
{ pattern: /^eslint(?=\s)/, blockOnly: true },
|
|
16
|
+
{ pattern: /^@ts-(?:ignore|expect-error|nocheck)\b/, blockOnly: false },
|
|
17
|
+
{ pattern: /^(?:istanbul|c8|v8)\s+ignore\b/, blockOnly: false },
|
|
18
|
+
{ pattern: /^node:coverage\s+(?:ignore|disable)\b/, blockOnly: false },
|
|
19
|
+
{ pattern: /^biome-ignore\S*/, blockOnly: false },
|
|
20
|
+
{ pattern: /^oxlint-disable\S*/, blockOnly: false },
|
|
21
|
+
];
|
|
22
|
+
function findDirective(comment) {
|
|
23
|
+
// Leading `/` covers `/// @ts-ignore`, leading `*` covers `/** @ts-ignore */`
|
|
24
|
+
const text = comment.value.replace(/^[/*\s]+/, "");
|
|
25
|
+
const isBlock = comment.type === utils_1.AST_TOKEN_TYPES.Block;
|
|
26
|
+
for (const { pattern, blockOnly } of DIRECTIVE_PATTERNS) {
|
|
27
|
+
if (blockOnly && !isBlock)
|
|
28
|
+
continue;
|
|
29
|
+
const match = text.match(pattern);
|
|
30
|
+
if (match)
|
|
31
|
+
return match[0];
|
|
32
|
+
}
|
|
33
|
+
return null;
|
|
34
|
+
}
|
|
35
|
+
// React effect hooks: escape hatches that synchronize with the outside of React.
|
|
36
|
+
// Derived state, event handling and data fetching have safer alternatives.
|
|
37
|
+
const EFFECT_HOOKS = new Set([
|
|
38
|
+
"useEffect",
|
|
39
|
+
"useLayoutEffect",
|
|
40
|
+
"useInsertionEffect",
|
|
41
|
+
]);
|
|
42
|
+
const REACT_MODULES = new Set(["react", "preact/hooks", "preact/compat"]);
|
|
43
|
+
// Class component counterparts of effect hooks
|
|
44
|
+
const LIFECYCLE_METHODS = new Set([
|
|
45
|
+
"componentDidMount",
|
|
46
|
+
"componentDidUpdate",
|
|
47
|
+
"componentWillUnmount",
|
|
48
|
+
"getSnapshotBeforeUpdate",
|
|
49
|
+
"componentWillMount",
|
|
50
|
+
"componentWillReceiveProps",
|
|
51
|
+
"componentWillUpdate",
|
|
52
|
+
"UNSAFE_componentWillMount",
|
|
53
|
+
"UNSAFE_componentWillReceiveProps",
|
|
54
|
+
"UNSAFE_componentWillUpdate",
|
|
55
|
+
]);
|
|
56
|
+
function staticName(node) {
|
|
57
|
+
if (node.type === utils_1.AST_NODE_TYPES.Identifier)
|
|
58
|
+
return node.name;
|
|
59
|
+
if (node.type === utils_1.AST_NODE_TYPES.Literal && typeof node.value === "string") {
|
|
60
|
+
return node.value;
|
|
61
|
+
}
|
|
62
|
+
return null;
|
|
63
|
+
}
|
|
64
|
+
function isCallee(node) {
|
|
65
|
+
return (node.parent?.type === utils_1.AST_NODE_TYPES.CallExpression &&
|
|
66
|
+
node.parent.callee === node);
|
|
67
|
+
}
|
|
68
|
+
exports.default = (0, create_rule_js_1.createRule)({
|
|
69
|
+
name: "require-unsafe-dir",
|
|
70
|
+
meta: {
|
|
71
|
+
type: "problem",
|
|
72
|
+
docs: {
|
|
73
|
+
description: "Allow unsafe constructs only in files under a _unsafe_/ directory: check-suppressing directives (eslint-disable, @ts-ignore, coverage ignore, etc.), React effect hooks and class component lifecycle methods.",
|
|
74
|
+
},
|
|
75
|
+
messages: {
|
|
76
|
+
directiveOutsideUnsafeDir: "'{{directive}}' suppresses checks. Move the code that needs it into a _unsafe_/ directory.",
|
|
77
|
+
effectOutsideUnsafeDir: "'{{name}}' is an escape hatch. Move the code that needs it into a _unsafe_/ directory.",
|
|
78
|
+
lifecycleOutsideUnsafeDir: "'{{name}}' is the class component counterpart of an effect. Move the code that needs it into a _unsafe_/ directory.",
|
|
79
|
+
effectEscape: "'{{name}}' must be called directly. Re-exporting or aliasing it lets effects leave _unsafe_/.",
|
|
80
|
+
reactReexportAll: "Re-exporting all of '{{source}}' lets effect hooks leave _unsafe_/. Export by name.",
|
|
81
|
+
dynamicReactAccess: "Computed access on '{{name}}' hides which React API is used. Access it by name.",
|
|
82
|
+
},
|
|
83
|
+
schema: [],
|
|
84
|
+
},
|
|
85
|
+
defaultOptions: [defaultOptions],
|
|
86
|
+
create(context) {
|
|
87
|
+
const inUnsafeDir = isUnsafeDirFile(context.filename);
|
|
88
|
+
// Local names bound to the React module itself (default / namespace imports)
|
|
89
|
+
const reactNamespaces = new Set();
|
|
90
|
+
// Outside _unsafe_/: any use is reported. Inside: only uses other than a direct call.
|
|
91
|
+
function checkEffectUse(node, name, calledDirectly) {
|
|
92
|
+
if (!inUnsafeDir) {
|
|
93
|
+
context.report({
|
|
94
|
+
node,
|
|
95
|
+
messageId: "effectOutsideUnsafeDir",
|
|
96
|
+
data: { name },
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
else if (!calledDirectly) {
|
|
100
|
+
context.report({ node, messageId: "effectEscape", data: { name } });
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
function checkLifecycle(key, computed) {
|
|
104
|
+
if (inUnsafeDir || computed)
|
|
105
|
+
return;
|
|
106
|
+
const name = staticName(key);
|
|
107
|
+
if (name === null || !LIFECYCLE_METHODS.has(name))
|
|
108
|
+
return;
|
|
109
|
+
context.report({
|
|
110
|
+
node: key,
|
|
111
|
+
messageId: "lifecycleOutsideUnsafeDir",
|
|
112
|
+
data: { name },
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
return {
|
|
116
|
+
Program() {
|
|
117
|
+
if (inUnsafeDir)
|
|
118
|
+
return;
|
|
119
|
+
for (const comment of context.sourceCode.getAllComments()) {
|
|
120
|
+
const directive = findDirective(comment);
|
|
121
|
+
if (directive === null)
|
|
122
|
+
continue;
|
|
123
|
+
context.report({
|
|
124
|
+
loc: comment.loc,
|
|
125
|
+
messageId: "directiveOutsideUnsafeDir",
|
|
126
|
+
data: { directive },
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
},
|
|
130
|
+
ImportDeclaration(node) {
|
|
131
|
+
if (!REACT_MODULES.has(node.source.value))
|
|
132
|
+
return;
|
|
133
|
+
for (const specifier of node.specifiers) {
|
|
134
|
+
if (specifier.type !== utils_1.AST_NODE_TYPES.ImportSpecifier) {
|
|
135
|
+
reactNamespaces.add(specifier.local.name);
|
|
136
|
+
continue;
|
|
137
|
+
}
|
|
138
|
+
const name = staticName(specifier.imported);
|
|
139
|
+
if (name === null || !EFFECT_HOOKS.has(name))
|
|
140
|
+
continue;
|
|
141
|
+
if (!inUnsafeDir) {
|
|
142
|
+
checkEffectUse(specifier, name, false);
|
|
143
|
+
continue;
|
|
144
|
+
}
|
|
145
|
+
// import { useEffect } from "react" in _unsafe_/: every reference must be a call
|
|
146
|
+
for (const variable of context.sourceCode.getDeclaredVariables(specifier)) {
|
|
147
|
+
for (const reference of variable.references) {
|
|
148
|
+
// `typeof useEffect` is a value reference but only reads the type
|
|
149
|
+
if (!reference.isValueReference ||
|
|
150
|
+
reference.identifier.parent?.type === utils_1.AST_NODE_TYPES.TSTypeQuery) {
|
|
151
|
+
continue;
|
|
152
|
+
}
|
|
153
|
+
checkEffectUse(reference.identifier, name, isCallee(reference.identifier));
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
},
|
|
158
|
+
// export { useEffect } from "react"
|
|
159
|
+
ExportNamedDeclaration(node) {
|
|
160
|
+
if (node.source === null || !REACT_MODULES.has(node.source.value)) {
|
|
161
|
+
return;
|
|
162
|
+
}
|
|
163
|
+
for (const specifier of node.specifiers) {
|
|
164
|
+
const name = staticName(specifier.local);
|
|
165
|
+
if (name !== null && EFFECT_HOOKS.has(name)) {
|
|
166
|
+
context.report({
|
|
167
|
+
node: specifier,
|
|
168
|
+
messageId: "effectEscape",
|
|
169
|
+
data: { name },
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
},
|
|
174
|
+
// export * from "react"
|
|
175
|
+
ExportAllDeclaration(node) {
|
|
176
|
+
if (!REACT_MODULES.has(node.source.value))
|
|
177
|
+
return;
|
|
178
|
+
context.report({
|
|
179
|
+
node,
|
|
180
|
+
messageId: "reactReexportAll",
|
|
181
|
+
data: { source: node.source.value },
|
|
182
|
+
});
|
|
183
|
+
},
|
|
184
|
+
// React.useEffect / React["useEffect"] / React[key]
|
|
185
|
+
MemberExpression(node) {
|
|
186
|
+
const name = staticName(node.property);
|
|
187
|
+
if (name !== null &&
|
|
188
|
+
(!node.computed || node.property.type === utils_1.AST_NODE_TYPES.Literal)) {
|
|
189
|
+
if (EFFECT_HOOKS.has(name))
|
|
190
|
+
checkEffectUse(node, name, isCallee(node));
|
|
191
|
+
return;
|
|
192
|
+
}
|
|
193
|
+
if (node.computed &&
|
|
194
|
+
node.object.type === utils_1.AST_NODE_TYPES.Identifier &&
|
|
195
|
+
reactNamespaces.has(node.object.name)) {
|
|
196
|
+
context.report({
|
|
197
|
+
node,
|
|
198
|
+
messageId: "dynamicReactAccess",
|
|
199
|
+
data: { name: node.object.name },
|
|
200
|
+
});
|
|
201
|
+
}
|
|
202
|
+
},
|
|
203
|
+
// const { useEffect } = React
|
|
204
|
+
"ObjectPattern > Property"(node) {
|
|
205
|
+
if (node.computed)
|
|
206
|
+
return;
|
|
207
|
+
const name = staticName(node.key);
|
|
208
|
+
if (name !== null && EFFECT_HOOKS.has(name)) {
|
|
209
|
+
checkEffectUse(node, name, false);
|
|
210
|
+
}
|
|
211
|
+
},
|
|
212
|
+
MethodDefinition(node) {
|
|
213
|
+
checkLifecycle(node.key, node.computed);
|
|
214
|
+
},
|
|
215
|
+
PropertyDefinition(node) {
|
|
216
|
+
checkLifecycle(node.key, node.computed);
|
|
217
|
+
},
|
|
218
|
+
};
|
|
219
|
+
},
|
|
220
|
+
});
|
|
221
|
+
//# sourceMappingURL=require-unsafe-dir.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"require-unsafe-dir.js","sourceRoot":"","sources":["../../src/rules/require-unsafe-dir.ts"],"names":[],"mappings":"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"}
|
package/lib/rules/server.d.ts
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
|
-
type Options =
|
|
2
|
-
|
|
1
|
+
type Options = {
|
|
2
|
+
readonly adapterAllowedPackages?: readonly string[];
|
|
3
|
+
};
|
|
4
|
+
type MessageId = "noDate" | "importViolation" | "importNonLayer" | "encodedGlobal" | "ioGlobal" | "schemaBoundary" | "encodedMethod" | "stringConstruction" | "adapterImpure" | "adapterNodeBuiltin" | "adapterPackageNotAllowed" | "adapterAmbientLocale";
|
|
3
5
|
declare const _default: import("@typescript-eslint/utils/dist/ts-eslint/Rule.js").RuleModule<MessageId, [Options], unknown, import("@typescript-eslint/utils/dist/ts-eslint/Rule.js").RuleListener> & {
|
|
4
6
|
name: string;
|
|
5
7
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/rules/server.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/rules/server.ts"],"names":[],"mappings":"AA0BA,KAAK,OAAO,GAAG;IACb,QAAQ,CAAC,sBAAsB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACrD,CAAC;AAWF,KAAK,SAAS,GACV,QAAQ,GACR,iBAAiB,GACjB,gBAAgB,GAChB,eAAe,GACf,UAAU,GACV,gBAAgB,GAChB,eAAe,GACf,oBAAoB,GACpB,eAAe,GACf,oBAAoB,GACpB,0BAA0B,GAC1B,sBAAsB,CAAC;;;;AAE3B,wBAkYG"}
|