@luma-layered-ts/eslint-plugin 1.5.0 → 2.0.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 +11 -0
- package/lib/layers.d.ts.map +1 -1
- package/lib/layers.js +152 -3
- 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 +9 -0
- 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 +9 -4
- package/lib/rules/react.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 +193 -6
- 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 +2 -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.",
|
|
@@ -54,6 +55,10 @@ exports.default = (0, create_rule_js_1.createRule)({
|
|
|
54
55
|
// app/api: import matrix only (server-side wiring root)
|
|
55
56
|
if (isApiRoute) {
|
|
56
57
|
return {
|
|
58
|
+
"Identifier[name='Date']"(node) {
|
|
59
|
+
if ((0, layers_js_1.isDateReference)(node))
|
|
60
|
+
context.report({ node, messageId: "noDate" });
|
|
61
|
+
},
|
|
57
62
|
ImportDeclaration(node) {
|
|
58
63
|
checkImport(node.source.value, node);
|
|
59
64
|
},
|
|
@@ -73,6 +78,10 @@ exports.default = (0, create_rule_js_1.createRule)({
|
|
|
73
78
|
}
|
|
74
79
|
// app/pages: same constraints as ui/pages
|
|
75
80
|
return {
|
|
81
|
+
"Identifier[name='Date']"(node) {
|
|
82
|
+
if ((0, layers_js_1.isDateReference)(node))
|
|
83
|
+
context.report({ node, messageId: "noDate" });
|
|
84
|
+
},
|
|
76
85
|
ImportDeclaration(node) {
|
|
77
86
|
checkImport(node.source.value, node);
|
|
78
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
|
@@ -10,8 +10,8 @@ const UI_LAYERS = new Set([
|
|
|
10
10
|
"ui/containers",
|
|
11
11
|
"ui/pages",
|
|
12
12
|
]);
|
|
13
|
-
// components can call .
|
|
14
|
-
const COMPONENT_ALLOWED_METHODS = new Set(["
|
|
13
|
+
// components can call .trim(), .toString() — these don't interpret structure
|
|
14
|
+
const COMPONENT_ALLOWED_METHODS = new Set(["trim", "toString"]);
|
|
15
15
|
exports.default = (0, create_rule_js_1.createRule)({
|
|
16
16
|
name: "react",
|
|
17
17
|
meta: {
|
|
@@ -20,12 +20,13 @@ exports.default = (0, create_rule_js_1.createRule)({
|
|
|
20
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.",
|
|
21
21
|
},
|
|
22
22
|
messages: {
|
|
23
|
+
noDate: layers_js_1.NO_DATE_MESSAGE,
|
|
23
24
|
importViolation: "'{{fromLayer}}' cannot import from '{{toLayer}}'.",
|
|
24
25
|
importNonLayer: "Import '{{importPath}}' does not resolve to a recognized layer. Move the target into a layer directory.",
|
|
25
26
|
encodedGlobal: "'{{name}}' is an encoded representation API. Not allowed in '{{layer}}'. Use canonical types (Effect.ts) instead.",
|
|
26
27
|
schemaBoundary: "Schema.{{method}}() crosses the canonical/encoded boundary. Not allowed in '{{layer}}'. Decoding belongs in adapter.",
|
|
27
28
|
encodedMethod: "'.{{method}}()' interprets encoded representation. Not allowed in '{{layer}}'.",
|
|
28
|
-
componentParseMethod: "'.{{method}}()' interprets string structure. Components may only call .
|
|
29
|
+
componentParseMethod: "'.{{method}}()' interprets string structure. Components may only call .trim().",
|
|
29
30
|
},
|
|
30
31
|
schema: [],
|
|
31
32
|
},
|
|
@@ -61,6 +62,10 @@ exports.default = (0, create_rule_js_1.createRule)({
|
|
|
61
62
|
}
|
|
62
63
|
return {
|
|
63
64
|
// --- Import checks ---
|
|
65
|
+
"Identifier[name='Date']"(node) {
|
|
66
|
+
if ((0, layers_js_1.isDateReference)(node))
|
|
67
|
+
context.report({ node, messageId: "noDate" });
|
|
68
|
+
},
|
|
64
69
|
ImportDeclaration(node) {
|
|
65
70
|
checkImport(node.source.value, node);
|
|
66
71
|
},
|
|
@@ -115,7 +120,7 @@ exports.default = (0, create_rule_js_1.createRule)({
|
|
|
115
120
|
if (method === "toString")
|
|
116
121
|
return;
|
|
117
122
|
if (isComponent) {
|
|
118
|
-
// Components:
|
|
123
|
+
// Components: trim allowed, parse methods forbidden
|
|
119
124
|
if (COMPONENT_ALLOWED_METHODS.has(method))
|
|
120
125
|
return;
|
|
121
126
|
if (layers_js_1.STRING_INTERPRETATION_METHODS.has(method)) {
|
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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"}
|
|
@@ -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"}
|