eslint-plugin-react-dom 2.0.0-next.58 → 2.0.0-next.61
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/dist/index.d.ts +19 -73
- package/dist/index.js +2005 -1958
- package/package.json +16 -17
package/dist/index.js
CHANGED
|
@@ -1,2071 +1,2118 @@
|
|
|
1
|
-
import { getDocsUrl, getSettingsFromContext
|
|
2
|
-
import * as ER from
|
|
3
|
-
import { ESLintUtils } from
|
|
4
|
-
import { unit } from
|
|
5
|
-
import
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import { RegExp, Reporter } from '@eslint-react/kit';
|
|
1
|
+
import { DEFAULT_ESLINT_REACT_SETTINGS, getConfigAdapters, getDocsUrl, getSettingsFromContext } from "@eslint-react/shared";
|
|
2
|
+
import * as ER from "@eslint-react/core";
|
|
3
|
+
import { ESLintUtils } from "@typescript-eslint/utils";
|
|
4
|
+
import { unit } from "@eslint-react/eff";
|
|
5
|
+
import { AST_NODE_TYPES } from "@typescript-eslint/types";
|
|
6
|
+
import { compare } from "compare-versions";
|
|
7
|
+
import { RegExp, Reporter } from "@eslint-react/kit";
|
|
9
8
|
|
|
9
|
+
//#region rolldown:runtime
|
|
10
10
|
var __defProp = Object.defineProperty;
|
|
11
11
|
var __export = (target, all) => {
|
|
12
|
-
|
|
13
|
-
|
|
12
|
+
for (var name$2 in all) __defProp(target, name$2, {
|
|
13
|
+
get: all[name$2],
|
|
14
|
+
enumerable: true
|
|
15
|
+
});
|
|
14
16
|
};
|
|
15
17
|
|
|
16
|
-
|
|
18
|
+
//#endregion
|
|
19
|
+
//#region src/configs/recommended.ts
|
|
17
20
|
var recommended_exports = {};
|
|
18
21
|
__export(recommended_exports, {
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
+
name: () => name$1,
|
|
23
|
+
rules: () => rules,
|
|
24
|
+
settings: () => settings
|
|
22
25
|
});
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
var settings = {
|
|
42
|
-
"react-x": DEFAULT_ESLINT_REACT_SETTINGS
|
|
26
|
+
const name$1 = "react-dom/recommended";
|
|
27
|
+
const rules = {
|
|
28
|
+
"react-dom/no-dangerously-set-innerhtml": "warn",
|
|
29
|
+
"react-dom/no-dangerously-set-innerhtml-with-children": "error",
|
|
30
|
+
"react-dom/no-find-dom-node": "error",
|
|
31
|
+
"react-dom/no-flush-sync": "error",
|
|
32
|
+
"react-dom/no-hydrate": "error",
|
|
33
|
+
"react-dom/no-missing-button-type": "warn",
|
|
34
|
+
"react-dom/no-missing-iframe-sandbox": "warn",
|
|
35
|
+
"react-dom/no-namespace": "error",
|
|
36
|
+
"react-dom/no-render": "error",
|
|
37
|
+
"react-dom/no-render-return-value": "error",
|
|
38
|
+
"react-dom/no-script-url": "warn",
|
|
39
|
+
"react-dom/no-string-style-prop": "error",
|
|
40
|
+
"react-dom/no-unsafe-iframe-sandbox": "warn",
|
|
41
|
+
"react-dom/no-unsafe-target-blank": "warn",
|
|
42
|
+
"react-dom/no-use-form-state": "error",
|
|
43
|
+
"react-dom/no-void-elements-with-children": "error"
|
|
43
44
|
};
|
|
45
|
+
const settings = { "react-x": DEFAULT_ESLINT_REACT_SETTINGS };
|
|
46
|
+
|
|
47
|
+
//#endregion
|
|
48
|
+
//#region package.json
|
|
49
|
+
var name = "eslint-plugin-react-dom";
|
|
50
|
+
var version = "2.0.0-next.61";
|
|
44
51
|
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
var version = "2.0.0-next.58";
|
|
52
|
+
//#endregion
|
|
53
|
+
//#region src/utils/create-jsx-element-resolver.ts
|
|
48
54
|
function createJsxElementResolver(context) {
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
const polymorphicPropValue = ER.getAttributeValue(
|
|
71
|
-
context,
|
|
72
|
-
polymorphicPropAttr,
|
|
73
|
-
polymorphicPropName
|
|
74
|
-
);
|
|
75
|
-
if (polymorphicPropValue.kind === "some" && typeof polymorphicPropValue.value === "string") {
|
|
76
|
-
return {
|
|
77
|
-
...result,
|
|
78
|
-
domElementType: polymorphicPropValue.value
|
|
79
|
-
};
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
return result;
|
|
83
|
-
}
|
|
84
|
-
};
|
|
55
|
+
const { components, polymorphicPropName } = getSettingsFromContext(context);
|
|
56
|
+
return { resolve(node) {
|
|
57
|
+
const name$2 = ER.getElementType(context, node);
|
|
58
|
+
const component = components.findLast((c) => c.name === name$2 || c.re.test(name$2));
|
|
59
|
+
const result = {
|
|
60
|
+
attributes: component?.attributes ?? [],
|
|
61
|
+
domElementType: component?.as ?? name$2,
|
|
62
|
+
jsxElementType: name$2
|
|
63
|
+
};
|
|
64
|
+
if (name$2 === name$2.toLowerCase() || component != null || polymorphicPropName == null) return result;
|
|
65
|
+
const initialScope = context.sourceCode.getScope(node);
|
|
66
|
+
const polymorphicPropAttr = ER.getAttribute(context, polymorphicPropName, node.openingElement.attributes, initialScope);
|
|
67
|
+
if (polymorphicPropAttr != null) {
|
|
68
|
+
const polymorphicPropValue = ER.getAttributeValue(context, polymorphicPropAttr, polymorphicPropName);
|
|
69
|
+
if (polymorphicPropValue.kind === "some" && typeof polymorphicPropValue.value === "string") return {
|
|
70
|
+
...result,
|
|
71
|
+
domElementType: polymorphicPropValue.value
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
return result;
|
|
75
|
+
} };
|
|
85
76
|
}
|
|
86
|
-
var createRule = ESLintUtils.RuleCreator(getDocsUrl("dom"));
|
|
87
77
|
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
78
|
+
//#endregion
|
|
79
|
+
//#region src/utils/create-rule.ts
|
|
80
|
+
const createRule = ESLintUtils.RuleCreator(getDocsUrl("dom"));
|
|
81
|
+
|
|
82
|
+
//#endregion
|
|
83
|
+
//#region src/utils/find-custom-component.ts
|
|
84
|
+
/**
|
|
85
|
+
* Finds a custom component prop by its "as" name.
|
|
86
|
+
*
|
|
87
|
+
* @param name - The name to match against the prop's "as" property
|
|
88
|
+
* @param props - Array of normalized custom component props to search through
|
|
89
|
+
* @returns The matching prop if found, undefined otherwise
|
|
90
|
+
*/
|
|
91
|
+
function findCustomComponentProp(name$2, props) {
|
|
92
|
+
return props.findLast((a) => a.as === name$2);
|
|
91
93
|
}
|
|
94
|
+
|
|
95
|
+
//#endregion
|
|
96
|
+
//#region src/utils/resolve-attribute.ts
|
|
92
97
|
function resolveAttribute(context, attributes, elementNode, attributeName) {
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
attributeValueString: attributeValue.value
|
|
116
|
-
};
|
|
117
|
-
}
|
|
118
|
-
return {
|
|
119
|
-
attribute,
|
|
120
|
-
attributeName: propNameOnJsx,
|
|
121
|
-
attributeValue: unit,
|
|
122
|
-
attributeValueString: customComponentProp?.defaultValue ?? unit
|
|
123
|
-
};
|
|
98
|
+
const customComponentProp = findCustomComponentProp(attributeName, attributes);
|
|
99
|
+
const propNameOnJsx = customComponentProp?.name ?? attributeName;
|
|
100
|
+
const attribute = ER.getAttribute(context, propNameOnJsx, elementNode.openingElement.attributes, context.sourceCode.getScope(elementNode));
|
|
101
|
+
if (attribute == null) return {
|
|
102
|
+
attribute: unit,
|
|
103
|
+
attributeName: propNameOnJsx,
|
|
104
|
+
attributeValue: unit,
|
|
105
|
+
attributeValueString: customComponentProp?.defaultValue
|
|
106
|
+
};
|
|
107
|
+
const attributeValue = ER.getAttributeValue(context, attribute, propNameOnJsx);
|
|
108
|
+
if (attributeValue.kind === "some" && typeof attributeValue.value === "string") return {
|
|
109
|
+
attribute,
|
|
110
|
+
attributeName: propNameOnJsx,
|
|
111
|
+
attributeValue,
|
|
112
|
+
attributeValueString: attributeValue.value
|
|
113
|
+
};
|
|
114
|
+
return {
|
|
115
|
+
attribute,
|
|
116
|
+
attributeName: propNameOnJsx,
|
|
117
|
+
attributeValue: unit,
|
|
118
|
+
attributeValueString: customComponentProp?.defaultValue ?? unit
|
|
119
|
+
};
|
|
124
120
|
}
|
|
125
121
|
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
122
|
+
//#endregion
|
|
123
|
+
//#region src/rules/no-dangerously-set-innerhtml.ts
|
|
124
|
+
const RULE_NAME$16 = "no-dangerously-set-innerhtml";
|
|
125
|
+
const RULE_FEATURES$15 = [];
|
|
129
126
|
var no_dangerously_set_innerhtml_default = createRule({
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
create,
|
|
143
|
-
defaultOptions: []
|
|
127
|
+
meta: {
|
|
128
|
+
type: "problem",
|
|
129
|
+
docs: {
|
|
130
|
+
description: "Disallow `dangerouslySetInnerHTML`.",
|
|
131
|
+
[Symbol.for("rule_features")]: RULE_FEATURES$15
|
|
132
|
+
},
|
|
133
|
+
messages: { noDangerouslySetInnerhtml: "Using 'dangerouslySetInnerHTML' may have security implications." },
|
|
134
|
+
schema: []
|
|
135
|
+
},
|
|
136
|
+
name: RULE_NAME$16,
|
|
137
|
+
create: create$16,
|
|
138
|
+
defaultOptions: []
|
|
144
139
|
});
|
|
145
|
-
|
|
146
|
-
function create(context) {
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
if (attribute == null) return;
|
|
157
|
-
context.report({
|
|
158
|
-
messageId: "noDangerouslySetInnerhtml",
|
|
159
|
-
node: attribute
|
|
160
|
-
});
|
|
161
|
-
}
|
|
162
|
-
};
|
|
140
|
+
const dangerouslySetInnerHTML$1 = "dangerouslySetInnerHTML";
|
|
141
|
+
function create$16(context) {
|
|
142
|
+
if (!context.sourceCode.text.includes(dangerouslySetInnerHTML$1)) return {};
|
|
143
|
+
return { JSXElement(node) {
|
|
144
|
+
const attribute = ER.getAttribute(context, dangerouslySetInnerHTML$1, node.openingElement.attributes, context.sourceCode.getScope(node));
|
|
145
|
+
if (attribute == null) return;
|
|
146
|
+
context.report({
|
|
147
|
+
messageId: "noDangerouslySetInnerhtml",
|
|
148
|
+
node: attribute
|
|
149
|
+
});
|
|
150
|
+
} };
|
|
163
151
|
}
|
|
164
|
-
|
|
165
|
-
|
|
152
|
+
|
|
153
|
+
//#endregion
|
|
154
|
+
//#region src/rules/no-dangerously-set-innerhtml-with-children.ts
|
|
155
|
+
const RULE_NAME$15 = "no-dangerously-set-innerhtml-with-children";
|
|
156
|
+
const RULE_FEATURES$14 = [];
|
|
166
157
|
var no_dangerously_set_innerhtml_with_children_default = createRule({
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
create: create2,
|
|
180
|
-
defaultOptions: []
|
|
158
|
+
meta: {
|
|
159
|
+
type: "problem",
|
|
160
|
+
docs: {
|
|
161
|
+
description: "Disallow `dangerouslySetInnerHTML` and `children` at the same time.",
|
|
162
|
+
[Symbol.for("rule_features")]: RULE_FEATURES$14
|
|
163
|
+
},
|
|
164
|
+
messages: { noDangerouslySetInnerhtmlWithChildren: "A DOM component cannot use both 'children' and 'dangerouslySetInnerHTML'." },
|
|
165
|
+
schema: []
|
|
166
|
+
},
|
|
167
|
+
name: RULE_NAME$15,
|
|
168
|
+
create: create$15,
|
|
169
|
+
defaultOptions: []
|
|
181
170
|
});
|
|
182
|
-
|
|
183
|
-
function
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
});
|
|
195
|
-
}
|
|
196
|
-
}
|
|
197
|
-
};
|
|
171
|
+
const dangerouslySetInnerHTML = "dangerouslySetInnerHTML";
|
|
172
|
+
function create$15(context) {
|
|
173
|
+
if (!context.sourceCode.text.includes(dangerouslySetInnerHTML)) return {};
|
|
174
|
+
return { JSXElement(node) {
|
|
175
|
+
const attributes = node.openingElement.attributes;
|
|
176
|
+
const initialScope = context.sourceCode.getScope(node);
|
|
177
|
+
const hasChildren = node.children.some(isSignificantChildren) || ER.hasAttribute(context, "children", attributes, initialScope);
|
|
178
|
+
if (hasChildren && ER.hasAttribute(context, dangerouslySetInnerHTML, attributes, initialScope)) context.report({
|
|
179
|
+
messageId: "noDangerouslySetInnerhtmlWithChildren",
|
|
180
|
+
node
|
|
181
|
+
});
|
|
182
|
+
} };
|
|
198
183
|
}
|
|
199
|
-
|
|
200
|
-
|
|
184
|
+
/**
|
|
185
|
+
* Check if a Literal or JSXText node is whitespace
|
|
186
|
+
* @param node The AST node to check
|
|
187
|
+
* @returns boolean `true` if the node is whitespace
|
|
188
|
+
*/
|
|
189
|
+
function isWhiteSpace(node) {
|
|
190
|
+
return typeof node.value === "string" && node.raw.trim() === "";
|
|
201
191
|
}
|
|
202
|
-
|
|
203
|
-
|
|
192
|
+
/**
|
|
193
|
+
* Check if a Literal or JSXText node is padding spaces
|
|
194
|
+
* @param node The AST node to check
|
|
195
|
+
* @returns boolean
|
|
196
|
+
*/
|
|
197
|
+
function isPaddingSpaces(node) {
|
|
198
|
+
return ER.isJsxText(node) && isWhiteSpace(node) && node.raw.includes("\n");
|
|
199
|
+
}
|
|
200
|
+
function isSignificantChildren(node) {
|
|
201
|
+
return node.type !== AST_NODE_TYPES.JSXText || !isPaddingSpaces(node);
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
//#endregion
|
|
205
|
+
//#region src/rules/no-find-dom-node.ts
|
|
206
|
+
const RULE_NAME$14 = "no-find-dom-node";
|
|
207
|
+
const RULE_FEATURES$13 = [];
|
|
204
208
|
var no_find_dom_node_default = createRule({
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
create: create3,
|
|
218
|
-
defaultOptions: []
|
|
209
|
+
meta: {
|
|
210
|
+
type: "problem",
|
|
211
|
+
docs: {
|
|
212
|
+
description: "Disallow `findDOMNode`.",
|
|
213
|
+
[Symbol.for("rule_features")]: RULE_FEATURES$13
|
|
214
|
+
},
|
|
215
|
+
messages: { noFindDomNode: "[Deprecated] Use alternatives instead." },
|
|
216
|
+
schema: []
|
|
217
|
+
},
|
|
218
|
+
name: RULE_NAME$14,
|
|
219
|
+
create: create$14,
|
|
220
|
+
defaultOptions: []
|
|
219
221
|
});
|
|
220
|
-
|
|
221
|
-
function
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
222
|
+
const findDOMNode = "findDOMNode";
|
|
223
|
+
function create$14(context) {
|
|
224
|
+
if (!context.sourceCode.text.includes(findDOMNode)) return {};
|
|
225
|
+
return { CallExpression(node) {
|
|
226
|
+
const { callee } = node;
|
|
227
|
+
switch (callee.type) {
|
|
228
|
+
case AST_NODE_TYPES.Identifier:
|
|
229
|
+
if (callee.name === findDOMNode) context.report({
|
|
230
|
+
messageId: "noFindDomNode",
|
|
231
|
+
node
|
|
232
|
+
});
|
|
233
|
+
return;
|
|
234
|
+
case AST_NODE_TYPES.MemberExpression:
|
|
235
|
+
if (callee.property.type === AST_NODE_TYPES.Identifier && callee.property.name === findDOMNode) context.report({
|
|
236
|
+
messageId: "noFindDomNode",
|
|
237
|
+
node
|
|
238
|
+
});
|
|
239
|
+
return;
|
|
240
|
+
}
|
|
241
|
+
} };
|
|
240
242
|
}
|
|
241
|
-
|
|
242
|
-
|
|
243
|
+
|
|
244
|
+
//#endregion
|
|
245
|
+
//#region src/rules/no-flush-sync.ts
|
|
246
|
+
const RULE_NAME$13 = "no-flush-sync";
|
|
247
|
+
const RULE_FEATURES$12 = [];
|
|
243
248
|
var no_flush_sync_default = createRule({
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
create: create4,
|
|
257
|
-
defaultOptions: []
|
|
249
|
+
meta: {
|
|
250
|
+
type: "problem",
|
|
251
|
+
docs: {
|
|
252
|
+
description: "Disallow `flushSync`.",
|
|
253
|
+
[Symbol.for("rule_features")]: RULE_FEATURES$12
|
|
254
|
+
},
|
|
255
|
+
messages: { noFlushSync: "Using 'flushSync' is uncommon and can hurt the performance of your app." },
|
|
256
|
+
schema: []
|
|
257
|
+
},
|
|
258
|
+
name: RULE_NAME$13,
|
|
259
|
+
create: create$13,
|
|
260
|
+
defaultOptions: []
|
|
258
261
|
});
|
|
259
|
-
|
|
260
|
-
function
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
262
|
+
const flushSync = "flushSync";
|
|
263
|
+
function create$13(context) {
|
|
264
|
+
if (!context.sourceCode.text.includes(flushSync)) return {};
|
|
265
|
+
return { CallExpression(node) {
|
|
266
|
+
const { callee } = node;
|
|
267
|
+
switch (callee.type) {
|
|
268
|
+
case AST_NODE_TYPES.Identifier:
|
|
269
|
+
if (callee.name === flushSync) context.report({
|
|
270
|
+
messageId: "noFlushSync",
|
|
271
|
+
node
|
|
272
|
+
});
|
|
273
|
+
return;
|
|
274
|
+
case AST_NODE_TYPES.MemberExpression:
|
|
275
|
+
if (callee.property.type === AST_NODE_TYPES.Identifier && callee.property.name === flushSync) context.report({
|
|
276
|
+
messageId: "noFlushSync",
|
|
277
|
+
node
|
|
278
|
+
});
|
|
279
|
+
return;
|
|
280
|
+
}
|
|
281
|
+
} };
|
|
279
282
|
}
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
283
|
+
|
|
284
|
+
//#endregion
|
|
285
|
+
//#region src/rules/no-hydrate.ts
|
|
286
|
+
const RULE_NAME$12 = "no-hydrate";
|
|
287
|
+
const RULE_FEATURES$11 = ["MOD"];
|
|
284
288
|
var no_hydrate_default = createRule({
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
create: create5,
|
|
299
|
-
defaultOptions: []
|
|
289
|
+
meta: {
|
|
290
|
+
type: "problem",
|
|
291
|
+
docs: {
|
|
292
|
+
description: "Replaces usages of `ReactDom.hydrate()` with `hydrateRoot()`.",
|
|
293
|
+
[Symbol.for("rule_features")]: RULE_FEATURES$11
|
|
294
|
+
},
|
|
295
|
+
fixable: "code",
|
|
296
|
+
messages: { noHydrate: "[Deprecated] Use 'hydrateRoot()' instead." },
|
|
297
|
+
schema: []
|
|
298
|
+
},
|
|
299
|
+
name: RULE_NAME$12,
|
|
300
|
+
create: create$12,
|
|
301
|
+
defaultOptions: []
|
|
300
302
|
});
|
|
301
|
-
|
|
302
|
-
function
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
}
|
|
343
|
-
}
|
|
344
|
-
}
|
|
345
|
-
};
|
|
303
|
+
const hydrate = "hydrate";
|
|
304
|
+
function create$12(context) {
|
|
305
|
+
if (!context.sourceCode.text.includes(hydrate)) return {};
|
|
306
|
+
const settings$1 = getSettingsFromContext(context);
|
|
307
|
+
if (compare(settings$1.version, "18.0.0", "<")) return {};
|
|
308
|
+
const reactDomNames = /* @__PURE__ */ new Set();
|
|
309
|
+
const hydrateNames = /* @__PURE__ */ new Set();
|
|
310
|
+
return {
|
|
311
|
+
CallExpression(node) {
|
|
312
|
+
switch (true) {
|
|
313
|
+
case node.callee.type === AST_NODE_TYPES.Identifier && hydrateNames.has(node.callee.name):
|
|
314
|
+
context.report({
|
|
315
|
+
messageId: "noHydrate",
|
|
316
|
+
node,
|
|
317
|
+
fix: getFix$2(context, node)
|
|
318
|
+
});
|
|
319
|
+
return;
|
|
320
|
+
case node.callee.type === AST_NODE_TYPES.MemberExpression && node.callee.object.type === AST_NODE_TYPES.Identifier && node.callee.property.type === AST_NODE_TYPES.Identifier && node.callee.property.name === hydrate && reactDomNames.has(node.callee.object.name):
|
|
321
|
+
context.report({
|
|
322
|
+
messageId: "noHydrate",
|
|
323
|
+
node,
|
|
324
|
+
fix: getFix$2(context, node)
|
|
325
|
+
});
|
|
326
|
+
return;
|
|
327
|
+
}
|
|
328
|
+
},
|
|
329
|
+
ImportDeclaration(node) {
|
|
330
|
+
const [baseSource] = node.source.value.split("/");
|
|
331
|
+
if (baseSource !== "react-dom") return;
|
|
332
|
+
for (const specifier of node.specifiers) switch (specifier.type) {
|
|
333
|
+
case AST_NODE_TYPES.ImportSpecifier:
|
|
334
|
+
if (specifier.imported.type !== AST_NODE_TYPES.Identifier) continue;
|
|
335
|
+
if (specifier.imported.name === hydrate) hydrateNames.add(specifier.local.name);
|
|
336
|
+
continue;
|
|
337
|
+
case AST_NODE_TYPES.ImportDefaultSpecifier:
|
|
338
|
+
case AST_NODE_TYPES.ImportNamespaceSpecifier:
|
|
339
|
+
reactDomNames.add(specifier.local.name);
|
|
340
|
+
continue;
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
};
|
|
346
344
|
}
|
|
347
|
-
function getFix(context, node) {
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
fixer.replaceText(node, `hydrateRoot(${getText2(arg1)}, ${getText2(arg0)})`)
|
|
355
|
-
];
|
|
356
|
-
};
|
|
345
|
+
function getFix$2(context, node) {
|
|
346
|
+
const getText$1 = (n) => context.sourceCode.getText(n);
|
|
347
|
+
return (fixer) => {
|
|
348
|
+
const [arg0, arg1] = node.arguments;
|
|
349
|
+
if (arg0 == null || arg1 == null) return null;
|
|
350
|
+
return [fixer.insertTextBefore(context.sourceCode.ast, "import { hydrateRoot } from \"react-dom/client\";\n"), fixer.replaceText(node, `hydrateRoot(${getText$1(arg1)}, ${getText$1(arg0)})`)];
|
|
351
|
+
};
|
|
357
352
|
}
|
|
358
353
|
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
354
|
+
//#endregion
|
|
355
|
+
//#region src/rules/no-missing-button-type.ts
|
|
356
|
+
const RULE_NAME$11 = "no-missing-button-type";
|
|
357
|
+
const RULE_FEATURES$10 = ["FIX"];
|
|
358
|
+
const BUTTON_TYPES = [
|
|
359
|
+
"button",
|
|
360
|
+
"submit",
|
|
361
|
+
"reset"
|
|
363
362
|
];
|
|
364
|
-
var BUTTON_TYPES = ["button", "submit", "reset"];
|
|
365
363
|
var no_missing_button_type_default = createRule({
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
364
|
+
meta: {
|
|
365
|
+
type: "problem",
|
|
366
|
+
docs: {
|
|
367
|
+
description: "Enforces explicit `type` attribute for `button` elements.",
|
|
368
|
+
[Symbol.for("rule_features")]: RULE_FEATURES$10
|
|
369
|
+
},
|
|
370
|
+
hasSuggestions: true,
|
|
371
|
+
messages: {
|
|
372
|
+
addButtonType: "Add 'type' attribute with value '{{type}}'.",
|
|
373
|
+
noMissingButtonType: "Add missing 'type' attribute on 'button' component."
|
|
374
|
+
},
|
|
375
|
+
schema: []
|
|
376
|
+
},
|
|
377
|
+
name: RULE_NAME$11,
|
|
378
|
+
create: create$11,
|
|
379
|
+
defaultOptions: []
|
|
382
380
|
});
|
|
383
|
-
function
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
}
|
|
410
|
-
};
|
|
381
|
+
function create$11(context) {
|
|
382
|
+
const resolver = createJsxElementResolver(context);
|
|
383
|
+
return { JSXElement(node) {
|
|
384
|
+
const { attributes, domElementType } = resolver.resolve(node);
|
|
385
|
+
if (domElementType !== "button") return;
|
|
386
|
+
const typeAttribute = resolveAttribute(context, attributes, node, "type");
|
|
387
|
+
if (typeAttribute.attributeValueString != null) return;
|
|
388
|
+
if (typeAttribute.attribute == null) {
|
|
389
|
+
context.report({
|
|
390
|
+
messageId: "noMissingButtonType",
|
|
391
|
+
node: node.openingElement,
|
|
392
|
+
suggest: getSuggest((type) => (fixer) => {
|
|
393
|
+
return fixer.insertTextAfter(node.openingElement.name, ` ${typeAttribute.attributeName}="${type}"`);
|
|
394
|
+
})
|
|
395
|
+
});
|
|
396
|
+
return;
|
|
397
|
+
}
|
|
398
|
+
context.report({
|
|
399
|
+
messageId: "noMissingButtonType",
|
|
400
|
+
node: typeAttribute.attributeValue?.node ?? typeAttribute.attribute,
|
|
401
|
+
suggest: getSuggest((type) => (fixer) => {
|
|
402
|
+
if (typeAttribute.attribute == null) return null;
|
|
403
|
+
return fixer.replaceText(typeAttribute.attribute, `${typeAttribute.attributeName}="${type}"`);
|
|
404
|
+
})
|
|
405
|
+
});
|
|
406
|
+
} };
|
|
411
407
|
}
|
|
412
|
-
function getSuggest(
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
408
|
+
function getSuggest(getFix$3) {
|
|
409
|
+
return BUTTON_TYPES.map((type) => ({
|
|
410
|
+
messageId: "addButtonType",
|
|
411
|
+
data: { type },
|
|
412
|
+
fix: getFix$3(type)
|
|
413
|
+
}));
|
|
418
414
|
}
|
|
419
415
|
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
];
|
|
416
|
+
//#endregion
|
|
417
|
+
//#region src/rules/no-missing-iframe-sandbox.ts
|
|
418
|
+
const RULE_NAME$10 = "no-missing-iframe-sandbox";
|
|
419
|
+
const RULE_FEATURES$9 = ["FIX"];
|
|
425
420
|
var no_missing_iframe_sandbox_default = createRule({
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
421
|
+
meta: {
|
|
422
|
+
type: "problem",
|
|
423
|
+
docs: {
|
|
424
|
+
description: "Enforces explicit `sandbox` attribute for `iframe` elements.",
|
|
425
|
+
[Symbol.for("rule_features")]: RULE_FEATURES$9
|
|
426
|
+
},
|
|
427
|
+
fixable: "code",
|
|
428
|
+
hasSuggestions: true,
|
|
429
|
+
messages: {
|
|
430
|
+
addIframeSandbox: "Add 'sandbox' attribute with value '{{value}}'.",
|
|
431
|
+
noMissingIframeSandbox: "Add missing 'sandbox' attribute on 'iframe' component."
|
|
432
|
+
},
|
|
433
|
+
schema: []
|
|
434
|
+
},
|
|
435
|
+
name: RULE_NAME$10,
|
|
436
|
+
create: create$10,
|
|
437
|
+
defaultOptions: []
|
|
443
438
|
});
|
|
444
|
-
function
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
}
|
|
479
|
-
};
|
|
439
|
+
function create$10(context) {
|
|
440
|
+
const resolver = createJsxElementResolver(context);
|
|
441
|
+
return { JSXElement(node) {
|
|
442
|
+
const { attributes, domElementType } = resolver.resolve(node);
|
|
443
|
+
if (domElementType !== "iframe") return;
|
|
444
|
+
const sandboxAttribute = resolveAttribute(context, attributes, node, "sandbox");
|
|
445
|
+
if (sandboxAttribute.attributeValueString != null) return;
|
|
446
|
+
if (sandboxAttribute.attribute == null) {
|
|
447
|
+
context.report({
|
|
448
|
+
messageId: "noMissingIframeSandbox",
|
|
449
|
+
node: node.openingElement,
|
|
450
|
+
suggest: [{
|
|
451
|
+
messageId: "addIframeSandbox",
|
|
452
|
+
data: { value: "" },
|
|
453
|
+
fix(fixer) {
|
|
454
|
+
return fixer.insertTextAfter(node.openingElement.name, ` ${sandboxAttribute.attributeName}=""`);
|
|
455
|
+
}
|
|
456
|
+
}]
|
|
457
|
+
});
|
|
458
|
+
return;
|
|
459
|
+
}
|
|
460
|
+
context.report({
|
|
461
|
+
messageId: "noMissingIframeSandbox",
|
|
462
|
+
node: sandboxAttribute.attributeValue?.node ?? sandboxAttribute.attribute,
|
|
463
|
+
suggest: [{
|
|
464
|
+
messageId: "addIframeSandbox",
|
|
465
|
+
data: { value: "" },
|
|
466
|
+
fix(fixer) {
|
|
467
|
+
if (sandboxAttribute.attribute == null) return null;
|
|
468
|
+
return fixer.replaceText(sandboxAttribute.attribute, `${sandboxAttribute.attributeName}=""`);
|
|
469
|
+
}
|
|
470
|
+
}]
|
|
471
|
+
});
|
|
472
|
+
} };
|
|
480
473
|
}
|
|
481
|
-
|
|
482
|
-
|
|
474
|
+
|
|
475
|
+
//#endregion
|
|
476
|
+
//#region src/rules/no-namespace.ts
|
|
477
|
+
const RULE_NAME$9 = "no-namespace";
|
|
478
|
+
const RULE_FEATURES$8 = [];
|
|
483
479
|
var no_namespace_default = createRule({
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
create: create8,
|
|
497
|
-
defaultOptions: []
|
|
480
|
+
meta: {
|
|
481
|
+
type: "problem",
|
|
482
|
+
docs: {
|
|
483
|
+
description: "Enforces the absence of a `namespace` in React elements.",
|
|
484
|
+
[Symbol.for("rule_features")]: RULE_FEATURES$8
|
|
485
|
+
},
|
|
486
|
+
messages: { noNamespace: "A React component '{{name}}' must not be in a namespace, as React does not support them." },
|
|
487
|
+
schema: []
|
|
488
|
+
},
|
|
489
|
+
name: RULE_NAME$9,
|
|
490
|
+
create: create$9,
|
|
491
|
+
defaultOptions: []
|
|
498
492
|
});
|
|
499
|
-
function
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
data: {
|
|
510
|
-
name: name3
|
|
511
|
-
}
|
|
512
|
-
});
|
|
513
|
-
}
|
|
514
|
-
};
|
|
493
|
+
function create$9(context) {
|
|
494
|
+
return { JSXElement(node) {
|
|
495
|
+
const name$2 = ER.getElementType(context, node);
|
|
496
|
+
if (typeof name$2 !== "string" || !name$2.includes(":")) return;
|
|
497
|
+
context.report({
|
|
498
|
+
messageId: "noNamespace",
|
|
499
|
+
node: node.openingElement.name,
|
|
500
|
+
data: { name: name$2 }
|
|
501
|
+
});
|
|
502
|
+
} };
|
|
515
503
|
}
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
504
|
+
|
|
505
|
+
//#endregion
|
|
506
|
+
//#region src/rules/no-render.ts
|
|
507
|
+
const RULE_NAME$8 = "no-render";
|
|
508
|
+
const RULE_FEATURES$7 = ["MOD"];
|
|
520
509
|
var no_render_default = createRule({
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
create: create9,
|
|
535
|
-
defaultOptions: []
|
|
510
|
+
meta: {
|
|
511
|
+
type: "problem",
|
|
512
|
+
docs: {
|
|
513
|
+
description: "Replaces usages of `ReactDom.render()` with `createRoot(node).render()`.",
|
|
514
|
+
[Symbol.for("rule_features")]: RULE_FEATURES$7
|
|
515
|
+
},
|
|
516
|
+
fixable: "code",
|
|
517
|
+
messages: { noRender: "[Deprecated] Use 'createRoot(node).render()' instead." },
|
|
518
|
+
schema: []
|
|
519
|
+
},
|
|
520
|
+
name: RULE_NAME$8,
|
|
521
|
+
create: create$8,
|
|
522
|
+
defaultOptions: []
|
|
536
523
|
});
|
|
537
|
-
function
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
}
|
|
578
|
-
}
|
|
579
|
-
}
|
|
580
|
-
};
|
|
524
|
+
function create$8(context) {
|
|
525
|
+
if (!context.sourceCode.text.includes("render")) return {};
|
|
526
|
+
const settings$1 = getSettingsFromContext(context);
|
|
527
|
+
if (compare(settings$1.version, "18.0.0", "<")) return {};
|
|
528
|
+
const reactDomNames = new Set(["ReactDOM", "ReactDom"]);
|
|
529
|
+
const renderNames = /* @__PURE__ */ new Set();
|
|
530
|
+
return {
|
|
531
|
+
CallExpression(node) {
|
|
532
|
+
switch (true) {
|
|
533
|
+
case node.callee.type === AST_NODE_TYPES.Identifier && renderNames.has(node.callee.name):
|
|
534
|
+
context.report({
|
|
535
|
+
messageId: "noRender",
|
|
536
|
+
node,
|
|
537
|
+
fix: getFix$1(context, node)
|
|
538
|
+
});
|
|
539
|
+
return;
|
|
540
|
+
case node.callee.type === AST_NODE_TYPES.MemberExpression && node.callee.object.type === AST_NODE_TYPES.Identifier && node.callee.property.type === AST_NODE_TYPES.Identifier && node.callee.property.name === "render" && reactDomNames.has(node.callee.object.name):
|
|
541
|
+
context.report({
|
|
542
|
+
messageId: "noRender",
|
|
543
|
+
node,
|
|
544
|
+
fix: getFix$1(context, node)
|
|
545
|
+
});
|
|
546
|
+
return;
|
|
547
|
+
}
|
|
548
|
+
},
|
|
549
|
+
ImportDeclaration(node) {
|
|
550
|
+
const [baseSource] = node.source.value.split("/");
|
|
551
|
+
if (baseSource !== "react-dom") return;
|
|
552
|
+
for (const specifier of node.specifiers) switch (specifier.type) {
|
|
553
|
+
case AST_NODE_TYPES.ImportSpecifier:
|
|
554
|
+
if (specifier.imported.type !== AST_NODE_TYPES.Identifier) continue;
|
|
555
|
+
if (specifier.imported.name === "render") renderNames.add(specifier.local.name);
|
|
556
|
+
continue;
|
|
557
|
+
case AST_NODE_TYPES.ImportDefaultSpecifier:
|
|
558
|
+
case AST_NODE_TYPES.ImportNamespaceSpecifier:
|
|
559
|
+
reactDomNames.add(specifier.local.name);
|
|
560
|
+
continue;
|
|
561
|
+
}
|
|
562
|
+
}
|
|
563
|
+
};
|
|
581
564
|
}
|
|
582
|
-
function
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
fixer.replaceText(node, `createRoot(${getText2(arg1)}).render(${getText2(arg0)})`)
|
|
590
|
-
];
|
|
591
|
-
};
|
|
565
|
+
function getFix$1(context, node) {
|
|
566
|
+
const getText$1 = (n) => context.sourceCode.getText(n);
|
|
567
|
+
return (fixer) => {
|
|
568
|
+
const [arg0, arg1] = node.arguments;
|
|
569
|
+
if (arg0 == null || arg1 == null) return null;
|
|
570
|
+
return [fixer.insertTextBefore(context.sourceCode.ast, "import { createRoot } from \"react-dom/client\";\n"), fixer.replaceText(node, `createRoot(${getText$1(arg1)}).render(${getText$1(arg0)})`)];
|
|
571
|
+
};
|
|
592
572
|
}
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
573
|
+
|
|
574
|
+
//#endregion
|
|
575
|
+
//#region src/rules/no-render-return-value.ts
|
|
576
|
+
const RULE_NAME$7 = "no-render-return-value";
|
|
577
|
+
const RULE_FEATURES$6 = [];
|
|
578
|
+
const banParentTypes = [
|
|
579
|
+
AST_NODE_TYPES.VariableDeclarator,
|
|
580
|
+
AST_NODE_TYPES.Property,
|
|
581
|
+
AST_NODE_TYPES.ReturnStatement,
|
|
582
|
+
AST_NODE_TYPES.ArrowFunctionExpression,
|
|
583
|
+
AST_NODE_TYPES.AssignmentExpression
|
|
601
584
|
];
|
|
602
585
|
var no_render_return_value_default = createRule({
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
create: create10,
|
|
616
|
-
defaultOptions: []
|
|
586
|
+
meta: {
|
|
587
|
+
type: "problem",
|
|
588
|
+
docs: {
|
|
589
|
+
description: "Disallow the return value of `ReactDOM.render`.",
|
|
590
|
+
[Symbol.for("rule_features")]: RULE_FEATURES$6
|
|
591
|
+
},
|
|
592
|
+
messages: { noRenderReturnValue: "Do not depend on the return value from 'ReactDOM.render'." },
|
|
593
|
+
schema: []
|
|
594
|
+
},
|
|
595
|
+
name: RULE_NAME$7,
|
|
596
|
+
create: create$7,
|
|
597
|
+
defaultOptions: []
|
|
617
598
|
});
|
|
618
|
-
function
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
}
|
|
654
|
-
}
|
|
655
|
-
}
|
|
656
|
-
};
|
|
599
|
+
function create$7(context) {
|
|
600
|
+
const reactDomNames = new Set(["ReactDOM", "ReactDom"]);
|
|
601
|
+
const renderNames = /* @__PURE__ */ new Set();
|
|
602
|
+
return {
|
|
603
|
+
CallExpression(node) {
|
|
604
|
+
switch (true) {
|
|
605
|
+
case node.callee.type === AST_NODE_TYPES.Identifier && renderNames.has(node.callee.name) && banParentTypes.includes(node.parent.type):
|
|
606
|
+
context.report({
|
|
607
|
+
messageId: "noRenderReturnValue",
|
|
608
|
+
node
|
|
609
|
+
});
|
|
610
|
+
return;
|
|
611
|
+
case node.callee.type === AST_NODE_TYPES.MemberExpression && node.callee.object.type === AST_NODE_TYPES.Identifier && node.callee.property.type === AST_NODE_TYPES.Identifier && node.callee.property.name === "render" && reactDomNames.has(node.callee.object.name) && banParentTypes.includes(node.parent.type):
|
|
612
|
+
context.report({
|
|
613
|
+
messageId: "noRenderReturnValue",
|
|
614
|
+
node
|
|
615
|
+
});
|
|
616
|
+
return;
|
|
617
|
+
}
|
|
618
|
+
},
|
|
619
|
+
ImportDeclaration(node) {
|
|
620
|
+
const [baseSource] = node.source.value.split("/");
|
|
621
|
+
if (baseSource !== "react-dom") return;
|
|
622
|
+
for (const specifier of node.specifiers) switch (specifier.type) {
|
|
623
|
+
case AST_NODE_TYPES.ImportSpecifier:
|
|
624
|
+
if (specifier.imported.type !== AST_NODE_TYPES.Identifier) continue;
|
|
625
|
+
if (specifier.imported.name === "render") renderNames.add(specifier.local.name);
|
|
626
|
+
continue;
|
|
627
|
+
case AST_NODE_TYPES.ImportDefaultSpecifier:
|
|
628
|
+
case AST_NODE_TYPES.ImportNamespaceSpecifier:
|
|
629
|
+
reactDomNames.add(specifier.local.name);
|
|
630
|
+
continue;
|
|
631
|
+
}
|
|
632
|
+
}
|
|
633
|
+
};
|
|
657
634
|
}
|
|
658
|
-
|
|
659
|
-
|
|
635
|
+
|
|
636
|
+
//#endregion
|
|
637
|
+
//#region src/rules/no-script-url.ts
|
|
638
|
+
const RULE_NAME$6 = "no-script-url";
|
|
639
|
+
const RULE_FEATURES$5 = [];
|
|
640
|
+
/**
|
|
641
|
+
* This rule is adapted from eslint-plugin-solid's jsx-no-script-url rule under the MIT license.
|
|
642
|
+
* Thank you for your work!
|
|
643
|
+
*/
|
|
660
644
|
var no_script_url_default = createRule({
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
create: create11,
|
|
674
|
-
defaultOptions: []
|
|
645
|
+
meta: {
|
|
646
|
+
type: "problem",
|
|
647
|
+
docs: {
|
|
648
|
+
description: "Disallow `javascript:` URLs as attribute values.",
|
|
649
|
+
[Symbol.for("rule_features")]: RULE_FEATURES$5
|
|
650
|
+
},
|
|
651
|
+
messages: { noScriptUrl: "Using a `javascript:` URL is a security risk and should be avoided." },
|
|
652
|
+
schema: []
|
|
653
|
+
},
|
|
654
|
+
name: RULE_NAME$6,
|
|
655
|
+
create: create$6,
|
|
656
|
+
defaultOptions: []
|
|
675
657
|
});
|
|
676
|
-
function
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
messageId: "noScriptUrl",
|
|
687
|
-
node: node.value
|
|
688
|
-
});
|
|
689
|
-
}
|
|
690
|
-
}
|
|
691
|
-
};
|
|
658
|
+
function create$6(context) {
|
|
659
|
+
return { JSXAttribute(node) {
|
|
660
|
+
if (node.name.type !== AST_NODE_TYPES.JSXIdentifier || node.value == null) return;
|
|
661
|
+
const attributeValue = ER.getAttributeValue(context, node, ER.getAttributeName(context, node));
|
|
662
|
+
if (attributeValue.kind === "none" || typeof attributeValue.value !== "string") return;
|
|
663
|
+
if (RegExp.JAVASCRIPT_PROTOCOL.test(attributeValue.value)) context.report({
|
|
664
|
+
messageId: "noScriptUrl",
|
|
665
|
+
node: node.value
|
|
666
|
+
});
|
|
667
|
+
} };
|
|
692
668
|
}
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
669
|
+
|
|
670
|
+
//#endregion
|
|
671
|
+
//#region src/rules/no-string-style-prop.ts
|
|
672
|
+
const RULE_NAME$5 = "no-string-style-prop";
|
|
673
|
+
const RULE_FEATURES$4 = [];
|
|
674
|
+
var no_string_style_prop_default = createRule({
|
|
675
|
+
meta: {
|
|
676
|
+
type: "problem",
|
|
677
|
+
docs: {
|
|
678
|
+
description: "Disallows the use of string style prop.",
|
|
679
|
+
[Symbol.for("rule_features")]: RULE_FEATURES$4
|
|
680
|
+
},
|
|
681
|
+
messages: { noStringStyleProp: "Do not use string style prop. Use an object instead." },
|
|
682
|
+
schema: []
|
|
683
|
+
},
|
|
684
|
+
name: RULE_NAME$5,
|
|
685
|
+
create: create$5,
|
|
686
|
+
defaultOptions: []
|
|
687
|
+
});
|
|
688
|
+
function create$5(context) {
|
|
689
|
+
return { JSXAttribute(node) {
|
|
690
|
+
if (node.name.name !== "style") return;
|
|
691
|
+
const styleText = getAttributeValueText(context, node.value);
|
|
692
|
+
if (styleText == null) return;
|
|
693
|
+
context.report({
|
|
694
|
+
messageId: "noStringStyleProp",
|
|
695
|
+
node
|
|
696
|
+
});
|
|
697
|
+
} };
|
|
698
|
+
}
|
|
699
|
+
function getAttributeValueText(context, node) {
|
|
700
|
+
if (node == null) return null;
|
|
701
|
+
switch (true) {
|
|
702
|
+
case node.type === AST_NODE_TYPES.Literal && typeof node.value === "string": return context.sourceCode.getText(node);
|
|
703
|
+
case node.type === AST_NODE_TYPES.JSXExpressionContainer && node.expression.type === AST_NODE_TYPES.Literal && typeof node.expression.value === "string": return context.sourceCode.getText(node.expression);
|
|
704
|
+
case node.type === AST_NODE_TYPES.JSXExpressionContainer && node.expression.type === AST_NODE_TYPES.TemplateLiteral: return context.sourceCode.getText(node.expression);
|
|
705
|
+
default: return null;
|
|
706
|
+
}
|
|
707
|
+
}
|
|
708
|
+
|
|
709
|
+
//#endregion
|
|
710
|
+
//#region src/rules/no-unknown-property.ts
|
|
711
|
+
const RULE_NAME$4 = "no-unknown-property";
|
|
712
|
+
const DEFAULTS = {
|
|
713
|
+
ignore: [],
|
|
714
|
+
requireDataLowercase: false
|
|
697
715
|
};
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
|
|
704
|
-
|
|
716
|
+
/**
|
|
717
|
+
* Map of standard HTML attributes to their React counterparts
|
|
718
|
+
*/
|
|
719
|
+
const DOM_ATTRIBUTE_NAMES = {
|
|
720
|
+
"accept-charset": "acceptCharset",
|
|
721
|
+
class: "className",
|
|
722
|
+
crossorigin: "crossOrigin",
|
|
723
|
+
for: "htmlFor",
|
|
724
|
+
"http-equiv": "httpEquiv",
|
|
725
|
+
nomodule: "noModule"
|
|
705
726
|
};
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
|
|
717
|
-
|
|
718
|
-
|
|
719
|
-
|
|
720
|
-
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
|
|
726
|
-
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
|
|
736
|
-
|
|
737
|
-
|
|
738
|
-
|
|
739
|
-
|
|
740
|
-
|
|
741
|
-
|
|
742
|
-
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
|
|
748
|
-
|
|
749
|
-
|
|
750
|
-
|
|
751
|
-
|
|
752
|
-
|
|
753
|
-
|
|
754
|
-
|
|
755
|
-
|
|
756
|
-
|
|
757
|
-
|
|
758
|
-
|
|
759
|
-
|
|
760
|
-
|
|
761
|
-
|
|
762
|
-
|
|
763
|
-
|
|
764
|
-
|
|
765
|
-
|
|
766
|
-
|
|
767
|
-
|
|
768
|
-
|
|
769
|
-
|
|
770
|
-
|
|
771
|
-
|
|
772
|
-
|
|
773
|
-
|
|
774
|
-
|
|
775
|
-
|
|
776
|
-
|
|
777
|
-
|
|
778
|
-
|
|
779
|
-
|
|
780
|
-
|
|
781
|
-
|
|
782
|
-
|
|
783
|
-
|
|
784
|
-
|
|
785
|
-
|
|
786
|
-
|
|
787
|
-
|
|
788
|
-
|
|
789
|
-
|
|
790
|
-
|
|
791
|
-
|
|
792
|
-
onProgress: ["audio", "video"],
|
|
793
|
-
onRateChange: ["audio", "video"],
|
|
794
|
-
onResize: ["audio", "video"],
|
|
795
|
-
onSeeked: ["audio", "video"],
|
|
796
|
-
onSeeking: ["audio", "video"],
|
|
797
|
-
onStalled: ["audio", "video"],
|
|
798
|
-
onSuspend: ["audio", "video"],
|
|
799
|
-
onTimeUpdate: ["audio", "video"],
|
|
800
|
-
onVolumeChange: ["audio", "video"],
|
|
801
|
-
onWaiting: ["audio", "video"],
|
|
802
|
-
playsInline: ["video"],
|
|
803
|
-
poster: ["video"],
|
|
804
|
-
preload: ["audio", "video"],
|
|
805
|
-
property: ["meta"],
|
|
806
|
-
returnValue: ["dialog"],
|
|
807
|
-
scrolling: ["iframe"],
|
|
808
|
-
valign: ["tr", "td", "th", "thead", "tbody", "tfoot", "colgroup", "col"],
|
|
809
|
-
// deprecated, but known
|
|
810
|
-
viewBox: ["marker", "pattern", "svg", "symbol", "view"],
|
|
811
|
-
webkitAllowFullScreen: ["iframe", "video"],
|
|
812
|
-
webkitDirectory: ["input"]
|
|
727
|
+
/**
|
|
728
|
+
* Map of SVG attributes to their React camelCase equivalents
|
|
729
|
+
*/
|
|
730
|
+
const SVGDOM_ATTRIBUTE_NAMES = {
|
|
731
|
+
"accent-height": "accentHeight",
|
|
732
|
+
"alignment-baseline": "alignmentBaseline",
|
|
733
|
+
"arabic-form": "arabicForm",
|
|
734
|
+
"baseline-shift": "baselineShift",
|
|
735
|
+
"cap-height": "capHeight",
|
|
736
|
+
"clip-path": "clipPath",
|
|
737
|
+
"clip-rule": "clipRule",
|
|
738
|
+
"color-interpolation": "colorInterpolation",
|
|
739
|
+
"color-interpolation-filters": "colorInterpolationFilters",
|
|
740
|
+
"color-profile": "colorProfile",
|
|
741
|
+
"color-rendering": "colorRendering",
|
|
742
|
+
"dominant-baseline": "dominantBaseline",
|
|
743
|
+
"enable-background": "enableBackground",
|
|
744
|
+
"fill-opacity": "fillOpacity",
|
|
745
|
+
"fill-rule": "fillRule",
|
|
746
|
+
"flood-color": "floodColor",
|
|
747
|
+
"flood-opacity": "floodOpacity",
|
|
748
|
+
"font-family": "fontFamily",
|
|
749
|
+
"font-size": "fontSize",
|
|
750
|
+
"font-size-adjust": "fontSizeAdjust",
|
|
751
|
+
"font-stretch": "fontStretch",
|
|
752
|
+
"font-style": "fontStyle",
|
|
753
|
+
"font-variant": "fontVariant",
|
|
754
|
+
"font-weight": "fontWeight",
|
|
755
|
+
"glyph-name": "glyphName",
|
|
756
|
+
"glyph-orientation-horizontal": "glyphOrientationHorizontal",
|
|
757
|
+
"glyph-orientation-vertical": "glyphOrientationVertical",
|
|
758
|
+
"horiz-adv-x": "horizAdvX",
|
|
759
|
+
"horiz-origin-x": "horizOriginX",
|
|
760
|
+
"image-rendering": "imageRendering",
|
|
761
|
+
"letter-spacing": "letterSpacing",
|
|
762
|
+
"lighting-color": "lightingColor",
|
|
763
|
+
"marker-end": "markerEnd",
|
|
764
|
+
"marker-mid": "markerMid",
|
|
765
|
+
"marker-start": "markerStart",
|
|
766
|
+
"overline-position": "overlinePosition",
|
|
767
|
+
"overline-thickness": "overlineThickness",
|
|
768
|
+
"paint-order": "paintOrder",
|
|
769
|
+
"panose-1": "panose1",
|
|
770
|
+
"pointer-events": "pointerEvents",
|
|
771
|
+
"rendering-intent": "renderingIntent",
|
|
772
|
+
"shape-rendering": "shapeRendering",
|
|
773
|
+
"stop-color": "stopColor",
|
|
774
|
+
"stop-opacity": "stopOpacity",
|
|
775
|
+
"strikethrough-position": "strikethroughPosition",
|
|
776
|
+
"strikethrough-thickness": "strikethroughThickness",
|
|
777
|
+
"stroke-dasharray": "strokeDasharray",
|
|
778
|
+
"stroke-dashoffset": "strokeDashoffset",
|
|
779
|
+
"stroke-linecap": "strokeLinecap",
|
|
780
|
+
"stroke-linejoin": "strokeLinejoin",
|
|
781
|
+
"stroke-miterlimit": "strokeMiterlimit",
|
|
782
|
+
"stroke-opacity": "strokeOpacity",
|
|
783
|
+
"stroke-width": "strokeWidth",
|
|
784
|
+
"text-anchor": "textAnchor",
|
|
785
|
+
"text-decoration": "textDecoration",
|
|
786
|
+
"text-rendering": "textRendering",
|
|
787
|
+
"underline-position": "underlinePosition",
|
|
788
|
+
"underline-thickness": "underlineThickness",
|
|
789
|
+
"unicode-bidi": "unicodeBidi",
|
|
790
|
+
"unicode-range": "unicodeRange",
|
|
791
|
+
"units-per-em": "unitsPerEm",
|
|
792
|
+
"v-alphabetic": "vAlphabetic",
|
|
793
|
+
"v-hanging": "vHanging",
|
|
794
|
+
"v-ideographic": "vIdeographic",
|
|
795
|
+
"v-mathematical": "vMathematical",
|
|
796
|
+
"vector-effect": "vectorEffect",
|
|
797
|
+
"vert-adv-y": "vertAdvY",
|
|
798
|
+
"vert-origin-x": "vertOriginX",
|
|
799
|
+
"vert-origin-y": "vertOriginY",
|
|
800
|
+
"word-spacing": "wordSpacing",
|
|
801
|
+
"writing-mode": "writingMode",
|
|
802
|
+
"x-height": "xHeight",
|
|
803
|
+
"xlink:actuate": "xlinkActuate",
|
|
804
|
+
"xlink:arcrole": "xlinkArcrole",
|
|
805
|
+
"xlink:href": "xlinkHref",
|
|
806
|
+
"xlink:role": "xlinkRole",
|
|
807
|
+
"xlink:show": "xlinkShow",
|
|
808
|
+
"xlink:title": "xlinkTitle",
|
|
809
|
+
"xlink:type": "xlinkType",
|
|
810
|
+
"xml:base": "xmlBase",
|
|
811
|
+
"xml:lang": "xmlLang",
|
|
812
|
+
"xml:space": "xmlSpace"
|
|
813
813
|
};
|
|
814
|
-
|
|
815
|
-
|
|
816
|
-
|
|
817
|
-
|
|
818
|
-
|
|
819
|
-
|
|
820
|
-
|
|
821
|
-
|
|
822
|
-
|
|
823
|
-
|
|
824
|
-
|
|
825
|
-
|
|
826
|
-
|
|
827
|
-
|
|
828
|
-
|
|
829
|
-
|
|
830
|
-
|
|
831
|
-
|
|
832
|
-
|
|
833
|
-
|
|
834
|
-
|
|
835
|
-
|
|
836
|
-
|
|
837
|
-
|
|
838
|
-
|
|
839
|
-
|
|
840
|
-
|
|
841
|
-
|
|
842
|
-
|
|
843
|
-
|
|
844
|
-
|
|
845
|
-
|
|
846
|
-
|
|
847
|
-
|
|
848
|
-
|
|
849
|
-
|
|
850
|
-
|
|
851
|
-
|
|
852
|
-
|
|
853
|
-
|
|
854
|
-
|
|
855
|
-
|
|
856
|
-
|
|
857
|
-
|
|
858
|
-
|
|
859
|
-
|
|
860
|
-
|
|
861
|
-
|
|
862
|
-
|
|
863
|
-
|
|
864
|
-
|
|
865
|
-
|
|
866
|
-
|
|
867
|
-
|
|
868
|
-
|
|
869
|
-
|
|
870
|
-
|
|
871
|
-
|
|
872
|
-
|
|
873
|
-
|
|
874
|
-
|
|
875
|
-
|
|
876
|
-
|
|
877
|
-
|
|
878
|
-
|
|
879
|
-
|
|
880
|
-
|
|
881
|
-
|
|
882
|
-
|
|
883
|
-
|
|
884
|
-
|
|
885
|
-
|
|
886
|
-
|
|
887
|
-
|
|
888
|
-
|
|
889
|
-
|
|
890
|
-
|
|
891
|
-
|
|
892
|
-
|
|
893
|
-
|
|
894
|
-
|
|
895
|
-
|
|
896
|
-
|
|
814
|
+
/**
|
|
815
|
+
* Map of attributes that are only valid on specific HTML tags
|
|
816
|
+
*/
|
|
817
|
+
const ATTRIBUTE_TAGS_MAP = {
|
|
818
|
+
as: ["link"],
|
|
819
|
+
abbr: ["th", "td"],
|
|
820
|
+
align: [
|
|
821
|
+
"applet",
|
|
822
|
+
"caption",
|
|
823
|
+
"col",
|
|
824
|
+
"colgroup",
|
|
825
|
+
"hr",
|
|
826
|
+
"iframe",
|
|
827
|
+
"img",
|
|
828
|
+
"table",
|
|
829
|
+
"tbody",
|
|
830
|
+
"td",
|
|
831
|
+
"tfoot",
|
|
832
|
+
"th",
|
|
833
|
+
"thead",
|
|
834
|
+
"tr"
|
|
835
|
+
],
|
|
836
|
+
allowFullScreen: ["iframe", "video"],
|
|
837
|
+
autoPictureInPicture: ["video"],
|
|
838
|
+
charset: ["meta"],
|
|
839
|
+
checked: ["input"],
|
|
840
|
+
controls: ["audio", "video"],
|
|
841
|
+
controlsList: ["audio", "video"],
|
|
842
|
+
crossOrigin: [
|
|
843
|
+
"script",
|
|
844
|
+
"img",
|
|
845
|
+
"video",
|
|
846
|
+
"audio",
|
|
847
|
+
"link",
|
|
848
|
+
"image"
|
|
849
|
+
],
|
|
850
|
+
disablePictureInPicture: ["video"],
|
|
851
|
+
disableRemotePlayback: ["audio", "video"],
|
|
852
|
+
displaystyle: ["math"],
|
|
853
|
+
download: ["a", "area"],
|
|
854
|
+
fill: [
|
|
855
|
+
"altGlyph",
|
|
856
|
+
"circle",
|
|
857
|
+
"ellipse",
|
|
858
|
+
"g",
|
|
859
|
+
"line",
|
|
860
|
+
"marker",
|
|
861
|
+
"mask",
|
|
862
|
+
"path",
|
|
863
|
+
"polygon",
|
|
864
|
+
"polyline",
|
|
865
|
+
"rect",
|
|
866
|
+
"svg",
|
|
867
|
+
"symbol",
|
|
868
|
+
"text",
|
|
869
|
+
"textPath",
|
|
870
|
+
"tref",
|
|
871
|
+
"tspan",
|
|
872
|
+
"use",
|
|
873
|
+
"animate",
|
|
874
|
+
"animateColor",
|
|
875
|
+
"animateMotion",
|
|
876
|
+
"animateTransform",
|
|
877
|
+
"set"
|
|
878
|
+
],
|
|
879
|
+
focusable: ["svg"],
|
|
880
|
+
imageSizes: ["link"],
|
|
881
|
+
imageSrcSet: ["link"],
|
|
882
|
+
loop: ["audio", "video"],
|
|
883
|
+
mozAllowFullScreen: ["iframe", "video"],
|
|
884
|
+
muted: ["audio", "video"],
|
|
885
|
+
noModule: ["script"],
|
|
886
|
+
onAbort: ["audio", "video"],
|
|
887
|
+
onCanPlay: ["audio", "video"],
|
|
888
|
+
onCanPlayThrough: ["audio", "video"],
|
|
889
|
+
onCancel: ["dialog"],
|
|
890
|
+
onClose: ["dialog"],
|
|
891
|
+
onDurationChange: ["audio", "video"],
|
|
892
|
+
onEmptied: ["audio", "video"],
|
|
893
|
+
onEncrypted: ["audio", "video"],
|
|
894
|
+
onEnded: ["audio", "video"],
|
|
895
|
+
onError: [
|
|
896
|
+
"audio",
|
|
897
|
+
"video",
|
|
898
|
+
"img",
|
|
899
|
+
"link",
|
|
900
|
+
"source",
|
|
901
|
+
"script",
|
|
902
|
+
"picture",
|
|
903
|
+
"iframe"
|
|
904
|
+
],
|
|
905
|
+
onLoad: [
|
|
906
|
+
"script",
|
|
907
|
+
"img",
|
|
908
|
+
"link",
|
|
909
|
+
"picture",
|
|
910
|
+
"iframe",
|
|
911
|
+
"object",
|
|
912
|
+
"source"
|
|
913
|
+
],
|
|
914
|
+
onLoadStart: ["audio", "video"],
|
|
915
|
+
onLoadedData: ["audio", "video"],
|
|
916
|
+
onLoadedMetadata: ["audio", "video"],
|
|
917
|
+
onPause: ["audio", "video"],
|
|
918
|
+
onPlay: ["audio", "video"],
|
|
919
|
+
onPlaying: ["audio", "video"],
|
|
920
|
+
onProgress: ["audio", "video"],
|
|
921
|
+
onRateChange: ["audio", "video"],
|
|
922
|
+
onResize: ["audio", "video"],
|
|
923
|
+
onSeeked: ["audio", "video"],
|
|
924
|
+
onSeeking: ["audio", "video"],
|
|
925
|
+
onStalled: ["audio", "video"],
|
|
926
|
+
onSuspend: ["audio", "video"],
|
|
927
|
+
onTimeUpdate: ["audio", "video"],
|
|
928
|
+
onVolumeChange: ["audio", "video"],
|
|
929
|
+
onWaiting: ["audio", "video"],
|
|
930
|
+
playsInline: ["video"],
|
|
931
|
+
poster: ["video"],
|
|
932
|
+
preload: ["audio", "video"],
|
|
933
|
+
property: ["meta"],
|
|
934
|
+
returnValue: ["dialog"],
|
|
935
|
+
scrolling: ["iframe"],
|
|
936
|
+
valign: [
|
|
937
|
+
"tr",
|
|
938
|
+
"td",
|
|
939
|
+
"th",
|
|
940
|
+
"thead",
|
|
941
|
+
"tbody",
|
|
942
|
+
"tfoot",
|
|
943
|
+
"colgroup",
|
|
944
|
+
"col"
|
|
945
|
+
],
|
|
946
|
+
viewBox: [
|
|
947
|
+
"marker",
|
|
948
|
+
"pattern",
|
|
949
|
+
"svg",
|
|
950
|
+
"symbol",
|
|
951
|
+
"view"
|
|
952
|
+
],
|
|
953
|
+
webkitAllowFullScreen: ["iframe", "video"],
|
|
954
|
+
webkitDirectory: ["input"]
|
|
897
955
|
};
|
|
898
|
-
|
|
899
|
-
|
|
900
|
-
|
|
901
|
-
|
|
902
|
-
|
|
903
|
-
|
|
904
|
-
|
|
905
|
-
|
|
906
|
-
|
|
907
|
-
|
|
908
|
-
|
|
909
|
-
|
|
910
|
-
|
|
911
|
-
|
|
912
|
-
|
|
913
|
-
|
|
914
|
-
|
|
915
|
-
|
|
916
|
-
|
|
917
|
-
|
|
918
|
-
|
|
919
|
-
|
|
920
|
-
|
|
921
|
-
|
|
922
|
-
|
|
923
|
-
|
|
924
|
-
|
|
925
|
-
|
|
926
|
-
|
|
927
|
-
|
|
928
|
-
|
|
929
|
-
|
|
930
|
-
|
|
931
|
-
|
|
932
|
-
|
|
933
|
-
|
|
934
|
-
|
|
935
|
-
|
|
936
|
-
|
|
937
|
-
|
|
938
|
-
|
|
939
|
-
|
|
940
|
-
|
|
941
|
-
|
|
942
|
-
|
|
943
|
-
|
|
944
|
-
|
|
945
|
-
|
|
946
|
-
|
|
947
|
-
|
|
948
|
-
|
|
949
|
-
|
|
950
|
-
|
|
951
|
-
|
|
952
|
-
|
|
953
|
-
|
|
954
|
-
|
|
955
|
-
|
|
956
|
-
|
|
957
|
-
|
|
958
|
-
|
|
959
|
-
|
|
960
|
-
|
|
961
|
-
|
|
962
|
-
|
|
963
|
-
|
|
964
|
-
|
|
965
|
-
|
|
966
|
-
|
|
967
|
-
|
|
968
|
-
|
|
969
|
-
|
|
970
|
-
|
|
971
|
-
|
|
972
|
-
|
|
973
|
-
|
|
974
|
-
|
|
975
|
-
|
|
976
|
-
|
|
977
|
-
|
|
978
|
-
|
|
979
|
-
|
|
980
|
-
|
|
981
|
-
|
|
982
|
-
|
|
983
|
-
|
|
984
|
-
|
|
985
|
-
|
|
986
|
-
|
|
987
|
-
|
|
988
|
-
|
|
989
|
-
|
|
990
|
-
|
|
991
|
-
|
|
992
|
-
|
|
993
|
-
|
|
994
|
-
|
|
995
|
-
|
|
996
|
-
|
|
997
|
-
|
|
998
|
-
|
|
999
|
-
|
|
1000
|
-
|
|
1001
|
-
|
|
1002
|
-
|
|
1003
|
-
|
|
1004
|
-
|
|
1005
|
-
|
|
1006
|
-
|
|
1007
|
-
|
|
1008
|
-
|
|
1009
|
-
|
|
1010
|
-
|
|
1011
|
-
|
|
1012
|
-
|
|
1013
|
-
|
|
1014
|
-
|
|
1015
|
-
|
|
1016
|
-
|
|
1017
|
-
|
|
1018
|
-
|
|
1019
|
-
|
|
1020
|
-
|
|
1021
|
-
|
|
1022
|
-
|
|
1023
|
-
|
|
1024
|
-
|
|
1025
|
-
|
|
1026
|
-
|
|
1027
|
-
|
|
1028
|
-
|
|
1029
|
-
|
|
1030
|
-
|
|
1031
|
-
|
|
1032
|
-
|
|
1033
|
-
|
|
1034
|
-
|
|
1035
|
-
|
|
1036
|
-
|
|
1037
|
-
|
|
1038
|
-
|
|
1039
|
-
|
|
1040
|
-
|
|
1041
|
-
|
|
1042
|
-
|
|
1043
|
-
|
|
1044
|
-
|
|
1045
|
-
|
|
1046
|
-
|
|
1047
|
-
|
|
1048
|
-
|
|
1049
|
-
|
|
1050
|
-
|
|
1051
|
-
|
|
1052
|
-
|
|
1053
|
-
|
|
1054
|
-
|
|
1055
|
-
|
|
1056
|
-
|
|
1057
|
-
|
|
1058
|
-
|
|
1059
|
-
|
|
1060
|
-
|
|
1061
|
-
|
|
1062
|
-
|
|
1063
|
-
|
|
1064
|
-
|
|
1065
|
-
|
|
1066
|
-
|
|
1067
|
-
|
|
1068
|
-
|
|
1069
|
-
|
|
1070
|
-
|
|
1071
|
-
|
|
1072
|
-
|
|
1073
|
-
|
|
1074
|
-
|
|
1075
|
-
|
|
1076
|
-
|
|
1077
|
-
|
|
1078
|
-
|
|
1079
|
-
|
|
1080
|
-
|
|
1081
|
-
|
|
1082
|
-
|
|
1083
|
-
|
|
1084
|
-
|
|
1085
|
-
|
|
1086
|
-
|
|
1087
|
-
|
|
1088
|
-
|
|
1089
|
-
|
|
1090
|
-
|
|
1091
|
-
|
|
1092
|
-
"ref",
|
|
1093
|
-
"key",
|
|
1094
|
-
"children",
|
|
1095
|
-
// Non-standard
|
|
1096
|
-
"results",
|
|
1097
|
-
"security",
|
|
1098
|
-
// Video specific
|
|
1099
|
-
"controls"
|
|
956
|
+
/**
|
|
957
|
+
* Single-word HTML/DOM properties
|
|
958
|
+
*/
|
|
959
|
+
const DOM_PROPERTY_NAMES_ONE_WORD = [
|
|
960
|
+
"dir",
|
|
961
|
+
"draggable",
|
|
962
|
+
"hidden",
|
|
963
|
+
"id",
|
|
964
|
+
"lang",
|
|
965
|
+
"nonce",
|
|
966
|
+
"part",
|
|
967
|
+
"slot",
|
|
968
|
+
"style",
|
|
969
|
+
"title",
|
|
970
|
+
"translate",
|
|
971
|
+
"inert",
|
|
972
|
+
"accept",
|
|
973
|
+
"action",
|
|
974
|
+
"allow",
|
|
975
|
+
"alt",
|
|
976
|
+
"as",
|
|
977
|
+
"async",
|
|
978
|
+
"buffered",
|
|
979
|
+
"capture",
|
|
980
|
+
"challenge",
|
|
981
|
+
"cite",
|
|
982
|
+
"code",
|
|
983
|
+
"cols",
|
|
984
|
+
"content",
|
|
985
|
+
"coords",
|
|
986
|
+
"csp",
|
|
987
|
+
"data",
|
|
988
|
+
"decoding",
|
|
989
|
+
"default",
|
|
990
|
+
"defer",
|
|
991
|
+
"disabled",
|
|
992
|
+
"form",
|
|
993
|
+
"headers",
|
|
994
|
+
"height",
|
|
995
|
+
"high",
|
|
996
|
+
"href",
|
|
997
|
+
"icon",
|
|
998
|
+
"importance",
|
|
999
|
+
"integrity",
|
|
1000
|
+
"kind",
|
|
1001
|
+
"label",
|
|
1002
|
+
"language",
|
|
1003
|
+
"loading",
|
|
1004
|
+
"list",
|
|
1005
|
+
"loop",
|
|
1006
|
+
"low",
|
|
1007
|
+
"manifest",
|
|
1008
|
+
"max",
|
|
1009
|
+
"media",
|
|
1010
|
+
"method",
|
|
1011
|
+
"min",
|
|
1012
|
+
"multiple",
|
|
1013
|
+
"muted",
|
|
1014
|
+
"name",
|
|
1015
|
+
"open",
|
|
1016
|
+
"optimum",
|
|
1017
|
+
"pattern",
|
|
1018
|
+
"ping",
|
|
1019
|
+
"placeholder",
|
|
1020
|
+
"poster",
|
|
1021
|
+
"preload",
|
|
1022
|
+
"profile",
|
|
1023
|
+
"rel",
|
|
1024
|
+
"required",
|
|
1025
|
+
"reversed",
|
|
1026
|
+
"role",
|
|
1027
|
+
"rows",
|
|
1028
|
+
"sandbox",
|
|
1029
|
+
"scope",
|
|
1030
|
+
"seamless",
|
|
1031
|
+
"selected",
|
|
1032
|
+
"shape",
|
|
1033
|
+
"size",
|
|
1034
|
+
"sizes",
|
|
1035
|
+
"span",
|
|
1036
|
+
"src",
|
|
1037
|
+
"start",
|
|
1038
|
+
"step",
|
|
1039
|
+
"summary",
|
|
1040
|
+
"target",
|
|
1041
|
+
"type",
|
|
1042
|
+
"value",
|
|
1043
|
+
"width",
|
|
1044
|
+
"wmode",
|
|
1045
|
+
"wrap",
|
|
1046
|
+
"accumulate",
|
|
1047
|
+
"additive",
|
|
1048
|
+
"alphabetic",
|
|
1049
|
+
"amplitude",
|
|
1050
|
+
"ascent",
|
|
1051
|
+
"azimuth",
|
|
1052
|
+
"bbox",
|
|
1053
|
+
"begin",
|
|
1054
|
+
"bias",
|
|
1055
|
+
"by",
|
|
1056
|
+
"clip",
|
|
1057
|
+
"color",
|
|
1058
|
+
"cursor",
|
|
1059
|
+
"cx",
|
|
1060
|
+
"cy",
|
|
1061
|
+
"d",
|
|
1062
|
+
"decelerate",
|
|
1063
|
+
"descent",
|
|
1064
|
+
"direction",
|
|
1065
|
+
"display",
|
|
1066
|
+
"divisor",
|
|
1067
|
+
"dur",
|
|
1068
|
+
"dx",
|
|
1069
|
+
"dy",
|
|
1070
|
+
"elevation",
|
|
1071
|
+
"end",
|
|
1072
|
+
"exponent",
|
|
1073
|
+
"fill",
|
|
1074
|
+
"filter",
|
|
1075
|
+
"format",
|
|
1076
|
+
"from",
|
|
1077
|
+
"fr",
|
|
1078
|
+
"fx",
|
|
1079
|
+
"fy",
|
|
1080
|
+
"g1",
|
|
1081
|
+
"g2",
|
|
1082
|
+
"hanging",
|
|
1083
|
+
"height",
|
|
1084
|
+
"hreflang",
|
|
1085
|
+
"ideographic",
|
|
1086
|
+
"in",
|
|
1087
|
+
"in2",
|
|
1088
|
+
"intercept",
|
|
1089
|
+
"k",
|
|
1090
|
+
"k1",
|
|
1091
|
+
"k2",
|
|
1092
|
+
"k3",
|
|
1093
|
+
"k4",
|
|
1094
|
+
"kerning",
|
|
1095
|
+
"local",
|
|
1096
|
+
"mask",
|
|
1097
|
+
"mode",
|
|
1098
|
+
"offset",
|
|
1099
|
+
"opacity",
|
|
1100
|
+
"operator",
|
|
1101
|
+
"order",
|
|
1102
|
+
"orient",
|
|
1103
|
+
"orientation",
|
|
1104
|
+
"origin",
|
|
1105
|
+
"overflow",
|
|
1106
|
+
"path",
|
|
1107
|
+
"ping",
|
|
1108
|
+
"points",
|
|
1109
|
+
"r",
|
|
1110
|
+
"radius",
|
|
1111
|
+
"rel",
|
|
1112
|
+
"restart",
|
|
1113
|
+
"result",
|
|
1114
|
+
"rotate",
|
|
1115
|
+
"rx",
|
|
1116
|
+
"ry",
|
|
1117
|
+
"scale",
|
|
1118
|
+
"seed",
|
|
1119
|
+
"slope",
|
|
1120
|
+
"spacing",
|
|
1121
|
+
"speed",
|
|
1122
|
+
"stemh",
|
|
1123
|
+
"stemv",
|
|
1124
|
+
"string",
|
|
1125
|
+
"stroke",
|
|
1126
|
+
"to",
|
|
1127
|
+
"transform",
|
|
1128
|
+
"u1",
|
|
1129
|
+
"u2",
|
|
1130
|
+
"unicode",
|
|
1131
|
+
"values",
|
|
1132
|
+
"version",
|
|
1133
|
+
"visibility",
|
|
1134
|
+
"widths",
|
|
1135
|
+
"x",
|
|
1136
|
+
"x1",
|
|
1137
|
+
"x2",
|
|
1138
|
+
"xmlns",
|
|
1139
|
+
"y",
|
|
1140
|
+
"y1",
|
|
1141
|
+
"y2",
|
|
1142
|
+
"z",
|
|
1143
|
+
"property",
|
|
1144
|
+
"ref",
|
|
1145
|
+
"key",
|
|
1146
|
+
"children",
|
|
1147
|
+
"results",
|
|
1148
|
+
"security",
|
|
1149
|
+
"controls"
|
|
1100
1150
|
];
|
|
1101
|
-
|
|
1102
|
-
|
|
1103
|
-
|
|
1104
|
-
|
|
1105
|
-
|
|
1106
|
-
|
|
1107
|
-
|
|
1108
|
-
|
|
1109
|
-
|
|
1110
|
-
|
|
1111
|
-
|
|
1112
|
-
|
|
1113
|
-
|
|
1114
|
-
|
|
1115
|
-
|
|
1116
|
-
|
|
1117
|
-
|
|
1118
|
-
|
|
1119
|
-
|
|
1120
|
-
|
|
1121
|
-
|
|
1122
|
-
|
|
1123
|
-
|
|
1124
|
-
|
|
1125
|
-
|
|
1126
|
-
|
|
1127
|
-
|
|
1128
|
-
|
|
1129
|
-
|
|
1130
|
-
|
|
1131
|
-
|
|
1132
|
-
|
|
1133
|
-
|
|
1134
|
-
|
|
1135
|
-
|
|
1136
|
-
|
|
1137
|
-
|
|
1138
|
-
|
|
1139
|
-
|
|
1140
|
-
|
|
1141
|
-
|
|
1142
|
-
|
|
1143
|
-
|
|
1144
|
-
|
|
1145
|
-
|
|
1146
|
-
|
|
1147
|
-
|
|
1148
|
-
|
|
1149
|
-
|
|
1150
|
-
|
|
1151
|
-
|
|
1152
|
-
|
|
1153
|
-
|
|
1154
|
-
|
|
1155
|
-
|
|
1156
|
-
|
|
1157
|
-
|
|
1158
|
-
|
|
1159
|
-
|
|
1160
|
-
|
|
1161
|
-
|
|
1162
|
-
|
|
1163
|
-
|
|
1164
|
-
|
|
1165
|
-
|
|
1166
|
-
|
|
1167
|
-
|
|
1168
|
-
|
|
1169
|
-
|
|
1170
|
-
|
|
1171
|
-
|
|
1172
|
-
|
|
1173
|
-
|
|
1174
|
-
|
|
1175
|
-
|
|
1176
|
-
|
|
1177
|
-
|
|
1178
|
-
|
|
1179
|
-
|
|
1180
|
-
|
|
1181
|
-
|
|
1182
|
-
|
|
1183
|
-
|
|
1184
|
-
|
|
1185
|
-
|
|
1186
|
-
|
|
1187
|
-
|
|
1188
|
-
|
|
1189
|
-
|
|
1190
|
-
|
|
1191
|
-
|
|
1192
|
-
|
|
1193
|
-
|
|
1194
|
-
|
|
1195
|
-
|
|
1196
|
-
|
|
1197
|
-
|
|
1198
|
-
|
|
1199
|
-
|
|
1200
|
-
|
|
1201
|
-
|
|
1202
|
-
|
|
1203
|
-
|
|
1204
|
-
|
|
1205
|
-
|
|
1206
|
-
|
|
1207
|
-
|
|
1208
|
-
|
|
1209
|
-
|
|
1210
|
-
|
|
1211
|
-
|
|
1212
|
-
|
|
1213
|
-
|
|
1214
|
-
|
|
1215
|
-
|
|
1216
|
-
|
|
1217
|
-
|
|
1218
|
-
|
|
1219
|
-
|
|
1220
|
-
|
|
1221
|
-
|
|
1222
|
-
|
|
1223
|
-
|
|
1224
|
-
|
|
1225
|
-
|
|
1226
|
-
|
|
1227
|
-
|
|
1228
|
-
|
|
1229
|
-
|
|
1230
|
-
|
|
1231
|
-
|
|
1232
|
-
|
|
1233
|
-
|
|
1234
|
-
|
|
1235
|
-
|
|
1236
|
-
|
|
1237
|
-
|
|
1238
|
-
|
|
1239
|
-
|
|
1240
|
-
|
|
1241
|
-
|
|
1242
|
-
|
|
1243
|
-
|
|
1244
|
-
|
|
1245
|
-
|
|
1246
|
-
|
|
1247
|
-
|
|
1248
|
-
|
|
1249
|
-
|
|
1250
|
-
|
|
1251
|
-
|
|
1252
|
-
|
|
1253
|
-
|
|
1254
|
-
|
|
1255
|
-
|
|
1256
|
-
|
|
1257
|
-
|
|
1258
|
-
|
|
1259
|
-
|
|
1260
|
-
|
|
1261
|
-
|
|
1262
|
-
|
|
1263
|
-
|
|
1264
|
-
|
|
1265
|
-
|
|
1266
|
-
|
|
1267
|
-
|
|
1268
|
-
|
|
1269
|
-
|
|
1270
|
-
|
|
1271
|
-
|
|
1272
|
-
|
|
1273
|
-
|
|
1274
|
-
|
|
1275
|
-
|
|
1276
|
-
|
|
1277
|
-
|
|
1278
|
-
|
|
1279
|
-
|
|
1280
|
-
|
|
1281
|
-
|
|
1282
|
-
|
|
1283
|
-
|
|
1284
|
-
|
|
1285
|
-
|
|
1286
|
-
|
|
1287
|
-
|
|
1288
|
-
|
|
1289
|
-
|
|
1290
|
-
|
|
1291
|
-
|
|
1292
|
-
|
|
1293
|
-
|
|
1294
|
-
|
|
1295
|
-
|
|
1296
|
-
|
|
1297
|
-
|
|
1298
|
-
|
|
1299
|
-
|
|
1300
|
-
|
|
1301
|
-
|
|
1302
|
-
|
|
1303
|
-
|
|
1304
|
-
|
|
1305
|
-
|
|
1306
|
-
|
|
1307
|
-
|
|
1308
|
-
|
|
1309
|
-
|
|
1310
|
-
|
|
1311
|
-
|
|
1312
|
-
|
|
1313
|
-
|
|
1314
|
-
|
|
1315
|
-
|
|
1316
|
-
|
|
1317
|
-
|
|
1318
|
-
|
|
1319
|
-
|
|
1320
|
-
|
|
1321
|
-
|
|
1322
|
-
|
|
1323
|
-
|
|
1324
|
-
|
|
1325
|
-
|
|
1326
|
-
|
|
1327
|
-
|
|
1328
|
-
|
|
1329
|
-
|
|
1330
|
-
|
|
1331
|
-
|
|
1332
|
-
|
|
1333
|
-
|
|
1334
|
-
|
|
1335
|
-
|
|
1336
|
-
|
|
1337
|
-
|
|
1338
|
-
|
|
1339
|
-
|
|
1340
|
-
|
|
1341
|
-
|
|
1342
|
-
|
|
1343
|
-
|
|
1344
|
-
|
|
1345
|
-
|
|
1346
|
-
|
|
1347
|
-
|
|
1348
|
-
|
|
1349
|
-
|
|
1350
|
-
|
|
1351
|
-
|
|
1352
|
-
|
|
1353
|
-
|
|
1354
|
-
|
|
1355
|
-
|
|
1356
|
-
|
|
1357
|
-
|
|
1358
|
-
|
|
1359
|
-
|
|
1360
|
-
|
|
1361
|
-
|
|
1362
|
-
|
|
1363
|
-
|
|
1364
|
-
|
|
1365
|
-
|
|
1366
|
-
|
|
1367
|
-
|
|
1368
|
-
|
|
1369
|
-
|
|
1370
|
-
|
|
1371
|
-
|
|
1372
|
-
|
|
1373
|
-
|
|
1374
|
-
|
|
1375
|
-
|
|
1376
|
-
|
|
1377
|
-
|
|
1378
|
-
|
|
1379
|
-
|
|
1380
|
-
|
|
1381
|
-
|
|
1382
|
-
|
|
1383
|
-
|
|
1384
|
-
|
|
1385
|
-
|
|
1386
|
-
|
|
1387
|
-
|
|
1388
|
-
|
|
1389
|
-
|
|
1390
|
-
|
|
1391
|
-
|
|
1392
|
-
|
|
1393
|
-
|
|
1394
|
-
|
|
1395
|
-
|
|
1396
|
-
|
|
1397
|
-
|
|
1398
|
-
|
|
1399
|
-
|
|
1400
|
-
|
|
1401
|
-
|
|
1402
|
-
|
|
1403
|
-
|
|
1404
|
-
|
|
1405
|
-
|
|
1406
|
-
|
|
1407
|
-
|
|
1408
|
-
|
|
1409
|
-
|
|
1410
|
-
|
|
1411
|
-
|
|
1412
|
-
|
|
1413
|
-
|
|
1414
|
-
|
|
1415
|
-
|
|
1416
|
-
|
|
1417
|
-
|
|
1418
|
-
|
|
1419
|
-
|
|
1420
|
-
|
|
1421
|
-
|
|
1422
|
-
|
|
1423
|
-
|
|
1424
|
-
|
|
1425
|
-
|
|
1426
|
-
|
|
1427
|
-
|
|
1428
|
-
|
|
1429
|
-
|
|
1430
|
-
|
|
1431
|
-
|
|
1432
|
-
|
|
1433
|
-
|
|
1434
|
-
|
|
1435
|
-
|
|
1436
|
-
|
|
1437
|
-
|
|
1438
|
-
|
|
1439
|
-
|
|
1440
|
-
|
|
1441
|
-
|
|
1442
|
-
|
|
1443
|
-
|
|
1444
|
-
|
|
1445
|
-
|
|
1446
|
-
|
|
1447
|
-
|
|
1448
|
-
|
|
1449
|
-
|
|
1450
|
-
|
|
1451
|
-
|
|
1452
|
-
|
|
1453
|
-
|
|
1454
|
-
|
|
1455
|
-
|
|
1456
|
-
|
|
1457
|
-
|
|
1458
|
-
|
|
1459
|
-
|
|
1460
|
-
|
|
1461
|
-
|
|
1462
|
-
|
|
1463
|
-
|
|
1464
|
-
"onMouseDownCapture",
|
|
1465
|
-
"onMouseMoveCapture",
|
|
1466
|
-
"onMouseOutCapture",
|
|
1467
|
-
"onMouseOverCapture",
|
|
1468
|
-
"onMouseUpCapture",
|
|
1469
|
-
// Video specific
|
|
1470
|
-
"autoPictureInPicture",
|
|
1471
|
-
"controlsList",
|
|
1472
|
-
"disablePictureInPicture",
|
|
1473
|
-
"disableRemotePlayback"
|
|
1151
|
+
/**
|
|
1152
|
+
* Multi-word (camelCase) HTML/DOM properties
|
|
1153
|
+
*/
|
|
1154
|
+
const DOM_PROPERTY_NAMES_TWO_WORDS = [
|
|
1155
|
+
"accessKey",
|
|
1156
|
+
"autoCapitalize",
|
|
1157
|
+
"autoFocus",
|
|
1158
|
+
"contentEditable",
|
|
1159
|
+
"enterKeyHint",
|
|
1160
|
+
"exportParts",
|
|
1161
|
+
"inputMode",
|
|
1162
|
+
"itemID",
|
|
1163
|
+
"itemRef",
|
|
1164
|
+
"itemProp",
|
|
1165
|
+
"itemScope",
|
|
1166
|
+
"itemType",
|
|
1167
|
+
"spellCheck",
|
|
1168
|
+
"tabIndex",
|
|
1169
|
+
"acceptCharset",
|
|
1170
|
+
"autoComplete",
|
|
1171
|
+
"autoPlay",
|
|
1172
|
+
"border",
|
|
1173
|
+
"cellPadding",
|
|
1174
|
+
"cellSpacing",
|
|
1175
|
+
"classID",
|
|
1176
|
+
"codeBase",
|
|
1177
|
+
"colSpan",
|
|
1178
|
+
"contextMenu",
|
|
1179
|
+
"dateTime",
|
|
1180
|
+
"encType",
|
|
1181
|
+
"formAction",
|
|
1182
|
+
"formEncType",
|
|
1183
|
+
"formMethod",
|
|
1184
|
+
"formNoValidate",
|
|
1185
|
+
"formTarget",
|
|
1186
|
+
"frameBorder",
|
|
1187
|
+
"hrefLang",
|
|
1188
|
+
"httpEquiv",
|
|
1189
|
+
"imageSizes",
|
|
1190
|
+
"imageSrcSet",
|
|
1191
|
+
"isMap",
|
|
1192
|
+
"keyParams",
|
|
1193
|
+
"keyType",
|
|
1194
|
+
"marginHeight",
|
|
1195
|
+
"marginWidth",
|
|
1196
|
+
"maxLength",
|
|
1197
|
+
"mediaGroup",
|
|
1198
|
+
"minLength",
|
|
1199
|
+
"noValidate",
|
|
1200
|
+
"onAnimationEnd",
|
|
1201
|
+
"onAnimationIteration",
|
|
1202
|
+
"onAnimationStart",
|
|
1203
|
+
"onBlur",
|
|
1204
|
+
"onChange",
|
|
1205
|
+
"onClick",
|
|
1206
|
+
"onContextMenu",
|
|
1207
|
+
"onCopy",
|
|
1208
|
+
"onCompositionEnd",
|
|
1209
|
+
"onCompositionStart",
|
|
1210
|
+
"onCompositionUpdate",
|
|
1211
|
+
"onCut",
|
|
1212
|
+
"onDoubleClick",
|
|
1213
|
+
"onDrag",
|
|
1214
|
+
"onDragEnd",
|
|
1215
|
+
"onDragEnter",
|
|
1216
|
+
"onDragExit",
|
|
1217
|
+
"onDragLeave",
|
|
1218
|
+
"onError",
|
|
1219
|
+
"onFocus",
|
|
1220
|
+
"onInput",
|
|
1221
|
+
"onKeyDown",
|
|
1222
|
+
"onKeyPress",
|
|
1223
|
+
"onKeyUp",
|
|
1224
|
+
"onLoad",
|
|
1225
|
+
"onWheel",
|
|
1226
|
+
"onDragOver",
|
|
1227
|
+
"onDragStart",
|
|
1228
|
+
"onDrop",
|
|
1229
|
+
"onMouseDown",
|
|
1230
|
+
"onMouseEnter",
|
|
1231
|
+
"onMouseLeave",
|
|
1232
|
+
"onMouseMove",
|
|
1233
|
+
"onMouseOut",
|
|
1234
|
+
"onMouseOver",
|
|
1235
|
+
"onMouseUp",
|
|
1236
|
+
"onPaste",
|
|
1237
|
+
"onScroll",
|
|
1238
|
+
"onSelect",
|
|
1239
|
+
"onSubmit",
|
|
1240
|
+
"onToggle",
|
|
1241
|
+
"onTransitionEnd",
|
|
1242
|
+
"radioGroup",
|
|
1243
|
+
"readOnly",
|
|
1244
|
+
"referrerPolicy",
|
|
1245
|
+
"rowSpan",
|
|
1246
|
+
"srcDoc",
|
|
1247
|
+
"srcLang",
|
|
1248
|
+
"srcSet",
|
|
1249
|
+
"useMap",
|
|
1250
|
+
"fetchPriority",
|
|
1251
|
+
"crossOrigin",
|
|
1252
|
+
"accentHeight",
|
|
1253
|
+
"alignmentBaseline",
|
|
1254
|
+
"arabicForm",
|
|
1255
|
+
"attributeName",
|
|
1256
|
+
"attributeType",
|
|
1257
|
+
"baseFrequency",
|
|
1258
|
+
"baselineShift",
|
|
1259
|
+
"baseProfile",
|
|
1260
|
+
"calcMode",
|
|
1261
|
+
"capHeight",
|
|
1262
|
+
"clipPathUnits",
|
|
1263
|
+
"clipPath",
|
|
1264
|
+
"clipRule",
|
|
1265
|
+
"colorInterpolation",
|
|
1266
|
+
"colorInterpolationFilters",
|
|
1267
|
+
"colorProfile",
|
|
1268
|
+
"colorRendering",
|
|
1269
|
+
"contentScriptType",
|
|
1270
|
+
"contentStyleType",
|
|
1271
|
+
"diffuseConstant",
|
|
1272
|
+
"dominantBaseline",
|
|
1273
|
+
"edgeMode",
|
|
1274
|
+
"enableBackground",
|
|
1275
|
+
"fillOpacity",
|
|
1276
|
+
"fillRule",
|
|
1277
|
+
"filterRes",
|
|
1278
|
+
"filterUnits",
|
|
1279
|
+
"floodColor",
|
|
1280
|
+
"floodOpacity",
|
|
1281
|
+
"fontFamily",
|
|
1282
|
+
"fontSize",
|
|
1283
|
+
"fontSizeAdjust",
|
|
1284
|
+
"fontStretch",
|
|
1285
|
+
"fontStyle",
|
|
1286
|
+
"fontVariant",
|
|
1287
|
+
"fontWeight",
|
|
1288
|
+
"glyphName",
|
|
1289
|
+
"glyphOrientationHorizontal",
|
|
1290
|
+
"glyphOrientationVertical",
|
|
1291
|
+
"glyphRef",
|
|
1292
|
+
"gradientTransform",
|
|
1293
|
+
"gradientUnits",
|
|
1294
|
+
"horizAdvX",
|
|
1295
|
+
"horizOriginX",
|
|
1296
|
+
"imageRendering",
|
|
1297
|
+
"kernelMatrix",
|
|
1298
|
+
"kernelUnitLength",
|
|
1299
|
+
"keyPoints",
|
|
1300
|
+
"keySplines",
|
|
1301
|
+
"keyTimes",
|
|
1302
|
+
"lengthAdjust",
|
|
1303
|
+
"letterSpacing",
|
|
1304
|
+
"lightingColor",
|
|
1305
|
+
"limitingConeAngle",
|
|
1306
|
+
"markerEnd",
|
|
1307
|
+
"markerMid",
|
|
1308
|
+
"markerStart",
|
|
1309
|
+
"markerHeight",
|
|
1310
|
+
"markerUnits",
|
|
1311
|
+
"markerWidth",
|
|
1312
|
+
"maskContentUnits",
|
|
1313
|
+
"maskUnits",
|
|
1314
|
+
"mathematical",
|
|
1315
|
+
"numOctaves",
|
|
1316
|
+
"overlinePosition",
|
|
1317
|
+
"overlineThickness",
|
|
1318
|
+
"panose1",
|
|
1319
|
+
"paintOrder",
|
|
1320
|
+
"pathLength",
|
|
1321
|
+
"patternContentUnits",
|
|
1322
|
+
"patternTransform",
|
|
1323
|
+
"patternUnits",
|
|
1324
|
+
"pointerEvents",
|
|
1325
|
+
"pointsAtX",
|
|
1326
|
+
"pointsAtY",
|
|
1327
|
+
"pointsAtZ",
|
|
1328
|
+
"preserveAlpha",
|
|
1329
|
+
"preserveAspectRatio",
|
|
1330
|
+
"primitiveUnits",
|
|
1331
|
+
"referrerPolicy",
|
|
1332
|
+
"refX",
|
|
1333
|
+
"refY",
|
|
1334
|
+
"rendering-intent",
|
|
1335
|
+
"repeatCount",
|
|
1336
|
+
"repeatDur",
|
|
1337
|
+
"requiredExtensions",
|
|
1338
|
+
"requiredFeatures",
|
|
1339
|
+
"shapeRendering",
|
|
1340
|
+
"specularConstant",
|
|
1341
|
+
"specularExponent",
|
|
1342
|
+
"spreadMethod",
|
|
1343
|
+
"startOffset",
|
|
1344
|
+
"stdDeviation",
|
|
1345
|
+
"stitchTiles",
|
|
1346
|
+
"stopColor",
|
|
1347
|
+
"stopOpacity",
|
|
1348
|
+
"strikethroughPosition",
|
|
1349
|
+
"strikethroughThickness",
|
|
1350
|
+
"strokeDasharray",
|
|
1351
|
+
"strokeDashoffset",
|
|
1352
|
+
"strokeLinecap",
|
|
1353
|
+
"strokeLinejoin",
|
|
1354
|
+
"strokeMiterlimit",
|
|
1355
|
+
"strokeOpacity",
|
|
1356
|
+
"strokeWidth",
|
|
1357
|
+
"surfaceScale",
|
|
1358
|
+
"systemLanguage",
|
|
1359
|
+
"tableValues",
|
|
1360
|
+
"targetX",
|
|
1361
|
+
"targetY",
|
|
1362
|
+
"textAnchor",
|
|
1363
|
+
"textDecoration",
|
|
1364
|
+
"textRendering",
|
|
1365
|
+
"textLength",
|
|
1366
|
+
"transformOrigin",
|
|
1367
|
+
"underlinePosition",
|
|
1368
|
+
"underlineThickness",
|
|
1369
|
+
"unicodeBidi",
|
|
1370
|
+
"unicodeRange",
|
|
1371
|
+
"unitsPerEm",
|
|
1372
|
+
"vAlphabetic",
|
|
1373
|
+
"vHanging",
|
|
1374
|
+
"vIdeographic",
|
|
1375
|
+
"vMathematical",
|
|
1376
|
+
"vectorEffect",
|
|
1377
|
+
"vertAdvY",
|
|
1378
|
+
"vertOriginX",
|
|
1379
|
+
"vertOriginY",
|
|
1380
|
+
"viewBox",
|
|
1381
|
+
"viewTarget",
|
|
1382
|
+
"wordSpacing",
|
|
1383
|
+
"writingMode",
|
|
1384
|
+
"xHeight",
|
|
1385
|
+
"xChannelSelector",
|
|
1386
|
+
"xlinkActuate",
|
|
1387
|
+
"xlinkArcrole",
|
|
1388
|
+
"xlinkHref",
|
|
1389
|
+
"xlinkRole",
|
|
1390
|
+
"xlinkShow",
|
|
1391
|
+
"xlinkTitle",
|
|
1392
|
+
"xlinkType",
|
|
1393
|
+
"xmlBase",
|
|
1394
|
+
"xmlLang",
|
|
1395
|
+
"xmlnsXlink",
|
|
1396
|
+
"xmlSpace",
|
|
1397
|
+
"yChannelSelector",
|
|
1398
|
+
"zoomAndPan",
|
|
1399
|
+
"autoCorrect",
|
|
1400
|
+
"autoSave",
|
|
1401
|
+
"className",
|
|
1402
|
+
"dangerouslySetInnerHTML",
|
|
1403
|
+
"defaultValue",
|
|
1404
|
+
"defaultChecked",
|
|
1405
|
+
"htmlFor",
|
|
1406
|
+
"onBeforeInput",
|
|
1407
|
+
"onChange",
|
|
1408
|
+
"onInvalid",
|
|
1409
|
+
"onReset",
|
|
1410
|
+
"onTouchCancel",
|
|
1411
|
+
"onTouchEnd",
|
|
1412
|
+
"onTouchMove",
|
|
1413
|
+
"onTouchStart",
|
|
1414
|
+
"suppressContentEditableWarning",
|
|
1415
|
+
"suppressHydrationWarning",
|
|
1416
|
+
"onAbort",
|
|
1417
|
+
"onCanPlay",
|
|
1418
|
+
"onCanPlayThrough",
|
|
1419
|
+
"onDurationChange",
|
|
1420
|
+
"onEmptied",
|
|
1421
|
+
"onEncrypted",
|
|
1422
|
+
"onEnded",
|
|
1423
|
+
"onLoadedData",
|
|
1424
|
+
"onLoadedMetadata",
|
|
1425
|
+
"onLoadStart",
|
|
1426
|
+
"onPause",
|
|
1427
|
+
"onPlay",
|
|
1428
|
+
"onPlaying",
|
|
1429
|
+
"onProgress",
|
|
1430
|
+
"onRateChange",
|
|
1431
|
+
"onResize",
|
|
1432
|
+
"onSeeked",
|
|
1433
|
+
"onSeeking",
|
|
1434
|
+
"onStalled",
|
|
1435
|
+
"onSuspend",
|
|
1436
|
+
"onTimeUpdate",
|
|
1437
|
+
"onVolumeChange",
|
|
1438
|
+
"onWaiting",
|
|
1439
|
+
"onCopyCapture",
|
|
1440
|
+
"onCutCapture",
|
|
1441
|
+
"onPasteCapture",
|
|
1442
|
+
"onCompositionEndCapture",
|
|
1443
|
+
"onCompositionStartCapture",
|
|
1444
|
+
"onCompositionUpdateCapture",
|
|
1445
|
+
"onFocusCapture",
|
|
1446
|
+
"onBlurCapture",
|
|
1447
|
+
"onChangeCapture",
|
|
1448
|
+
"onBeforeInputCapture",
|
|
1449
|
+
"onInputCapture",
|
|
1450
|
+
"onResetCapture",
|
|
1451
|
+
"onSubmitCapture",
|
|
1452
|
+
"onInvalidCapture",
|
|
1453
|
+
"onLoadCapture",
|
|
1454
|
+
"onErrorCapture",
|
|
1455
|
+
"onKeyDownCapture",
|
|
1456
|
+
"onKeyPressCapture",
|
|
1457
|
+
"onKeyUpCapture",
|
|
1458
|
+
"onAbortCapture",
|
|
1459
|
+
"onCanPlayCapture",
|
|
1460
|
+
"onCanPlayThroughCapture",
|
|
1461
|
+
"onDurationChangeCapture",
|
|
1462
|
+
"onEmptiedCapture",
|
|
1463
|
+
"onEncryptedCapture",
|
|
1464
|
+
"onEndedCapture",
|
|
1465
|
+
"onLoadedDataCapture",
|
|
1466
|
+
"onLoadedMetadataCapture",
|
|
1467
|
+
"onLoadStartCapture",
|
|
1468
|
+
"onPauseCapture",
|
|
1469
|
+
"onPlayCapture",
|
|
1470
|
+
"onPlayingCapture",
|
|
1471
|
+
"onProgressCapture",
|
|
1472
|
+
"onRateChangeCapture",
|
|
1473
|
+
"onSeekedCapture",
|
|
1474
|
+
"onSeekingCapture",
|
|
1475
|
+
"onStalledCapture",
|
|
1476
|
+
"onSuspendCapture",
|
|
1477
|
+
"onTimeUpdateCapture",
|
|
1478
|
+
"onVolumeChangeCapture",
|
|
1479
|
+
"onWaitingCapture",
|
|
1480
|
+
"onSelectCapture",
|
|
1481
|
+
"onTouchCancelCapture",
|
|
1482
|
+
"onTouchEndCapture",
|
|
1483
|
+
"onTouchMoveCapture",
|
|
1484
|
+
"onTouchStartCapture",
|
|
1485
|
+
"onScrollCapture",
|
|
1486
|
+
"onWheelCapture",
|
|
1487
|
+
"onAnimationEndCapture",
|
|
1488
|
+
"onAnimationIteration",
|
|
1489
|
+
"onAnimationStartCapture",
|
|
1490
|
+
"onTransitionEndCapture",
|
|
1491
|
+
"onAuxClick",
|
|
1492
|
+
"onAuxClickCapture",
|
|
1493
|
+
"onClickCapture",
|
|
1494
|
+
"onContextMenuCapture",
|
|
1495
|
+
"onDoubleClickCapture",
|
|
1496
|
+
"onDragCapture",
|
|
1497
|
+
"onDragEndCapture",
|
|
1498
|
+
"onDragEnterCapture",
|
|
1499
|
+
"onDragExitCapture",
|
|
1500
|
+
"onDragLeaveCapture",
|
|
1501
|
+
"onDragOverCapture",
|
|
1502
|
+
"onDragStartCapture",
|
|
1503
|
+
"onDropCapture",
|
|
1504
|
+
"onMouseDown",
|
|
1505
|
+
"onMouseDownCapture",
|
|
1506
|
+
"onMouseMoveCapture",
|
|
1507
|
+
"onMouseOutCapture",
|
|
1508
|
+
"onMouseOverCapture",
|
|
1509
|
+
"onMouseUpCapture",
|
|
1510
|
+
"autoPictureInPicture",
|
|
1511
|
+
"controlsList",
|
|
1512
|
+
"disablePictureInPicture",
|
|
1513
|
+
"disableRemotePlayback"
|
|
1474
1514
|
];
|
|
1475
|
-
|
|
1476
|
-
|
|
1477
|
-
|
|
1478
|
-
|
|
1479
|
-
|
|
1480
|
-
|
|
1515
|
+
/**
|
|
1516
|
+
* DOM properties that are exempt from case sensitivity checks
|
|
1517
|
+
*/
|
|
1518
|
+
const DOM_PROPERTIES_IGNORE_CASE = [
|
|
1519
|
+
"charset",
|
|
1520
|
+
"allowFullScreen",
|
|
1521
|
+
"webkitAllowFullScreen",
|
|
1522
|
+
"mozAllowFullScreen",
|
|
1523
|
+
"webkitDirectory"
|
|
1481
1524
|
];
|
|
1482
|
-
|
|
1483
|
-
|
|
1484
|
-
|
|
1485
|
-
|
|
1486
|
-
|
|
1487
|
-
|
|
1488
|
-
|
|
1489
|
-
|
|
1490
|
-
|
|
1491
|
-
|
|
1492
|
-
|
|
1493
|
-
|
|
1494
|
-
|
|
1495
|
-
|
|
1496
|
-
|
|
1497
|
-
|
|
1498
|
-
|
|
1499
|
-
|
|
1500
|
-
|
|
1501
|
-
|
|
1502
|
-
|
|
1503
|
-
|
|
1504
|
-
|
|
1505
|
-
|
|
1506
|
-
|
|
1507
|
-
|
|
1508
|
-
|
|
1509
|
-
|
|
1510
|
-
|
|
1511
|
-
|
|
1512
|
-
|
|
1513
|
-
|
|
1514
|
-
|
|
1515
|
-
|
|
1516
|
-
|
|
1517
|
-
|
|
1518
|
-
|
|
1519
|
-
|
|
1520
|
-
|
|
1521
|
-
|
|
1522
|
-
|
|
1523
|
-
|
|
1524
|
-
|
|
1525
|
-
|
|
1526
|
-
|
|
1527
|
-
|
|
1528
|
-
|
|
1529
|
-
|
|
1530
|
-
|
|
1531
|
-
|
|
1532
|
-
|
|
1533
|
-
|
|
1534
|
-
|
|
1535
|
-
|
|
1536
|
-
|
|
1537
|
-
|
|
1538
|
-
|
|
1539
|
-
"aria-setsize"
|
|
1525
|
+
/**
|
|
1526
|
+
* List of ARIA attributes
|
|
1527
|
+
*/
|
|
1528
|
+
const ARIA_PROPERTIES = [
|
|
1529
|
+
"aria-atomic",
|
|
1530
|
+
"aria-braillelabel",
|
|
1531
|
+
"aria-brailleroledescription",
|
|
1532
|
+
"aria-busy",
|
|
1533
|
+
"aria-controls",
|
|
1534
|
+
"aria-current",
|
|
1535
|
+
"aria-describedby",
|
|
1536
|
+
"aria-description",
|
|
1537
|
+
"aria-details",
|
|
1538
|
+
"aria-disabled",
|
|
1539
|
+
"aria-dropeffect",
|
|
1540
|
+
"aria-errormessage",
|
|
1541
|
+
"aria-flowto",
|
|
1542
|
+
"aria-grabbed",
|
|
1543
|
+
"aria-haspopup",
|
|
1544
|
+
"aria-hidden",
|
|
1545
|
+
"aria-invalid",
|
|
1546
|
+
"aria-keyshortcuts",
|
|
1547
|
+
"aria-label",
|
|
1548
|
+
"aria-labelledby",
|
|
1549
|
+
"aria-live",
|
|
1550
|
+
"aria-owns",
|
|
1551
|
+
"aria-relevant",
|
|
1552
|
+
"aria-roledescription",
|
|
1553
|
+
"aria-autocomplete",
|
|
1554
|
+
"aria-checked",
|
|
1555
|
+
"aria-expanded",
|
|
1556
|
+
"aria-level",
|
|
1557
|
+
"aria-modal",
|
|
1558
|
+
"aria-multiline",
|
|
1559
|
+
"aria-multiselectable",
|
|
1560
|
+
"aria-orientation",
|
|
1561
|
+
"aria-placeholder",
|
|
1562
|
+
"aria-pressed",
|
|
1563
|
+
"aria-readonly",
|
|
1564
|
+
"aria-required",
|
|
1565
|
+
"aria-selected",
|
|
1566
|
+
"aria-sort",
|
|
1567
|
+
"aria-valuemax",
|
|
1568
|
+
"aria-valuemin",
|
|
1569
|
+
"aria-valuenow",
|
|
1570
|
+
"aria-valuetext",
|
|
1571
|
+
"aria-activedescendant",
|
|
1572
|
+
"aria-colcount",
|
|
1573
|
+
"aria-colindex",
|
|
1574
|
+
"aria-colindextext",
|
|
1575
|
+
"aria-colspan",
|
|
1576
|
+
"aria-posinset",
|
|
1577
|
+
"aria-rowcount",
|
|
1578
|
+
"aria-rowindex",
|
|
1579
|
+
"aria-rowindextext",
|
|
1580
|
+
"aria-rowspan",
|
|
1581
|
+
"aria-setsize"
|
|
1540
1582
|
];
|
|
1541
|
-
|
|
1542
|
-
|
|
1543
|
-
|
|
1544
|
-
|
|
1545
|
-
|
|
1546
|
-
|
|
1547
|
-
|
|
1548
|
-
|
|
1549
|
-
|
|
1550
|
-
|
|
1551
|
-
|
|
1552
|
-
|
|
1553
|
-
|
|
1554
|
-
|
|
1555
|
-
|
|
1556
|
-
|
|
1557
|
-
|
|
1558
|
-
|
|
1559
|
-
|
|
1560
|
-
|
|
1561
|
-
|
|
1562
|
-
|
|
1583
|
+
/**
|
|
1584
|
+
* React-specific pointer event handlers added in React 16.4
|
|
1585
|
+
*/
|
|
1586
|
+
const REACT_ON_PROPS = [
|
|
1587
|
+
"onGotPointerCapture",
|
|
1588
|
+
"onGotPointerCaptureCapture",
|
|
1589
|
+
"onLostPointerCapture",
|
|
1590
|
+
"onLostPointerCapture",
|
|
1591
|
+
"onLostPointerCaptureCapture",
|
|
1592
|
+
"onPointerCancel",
|
|
1593
|
+
"onPointerCancelCapture",
|
|
1594
|
+
"onPointerDown",
|
|
1595
|
+
"onPointerDownCapture",
|
|
1596
|
+
"onPointerEnter",
|
|
1597
|
+
"onPointerEnterCapture",
|
|
1598
|
+
"onPointerLeave",
|
|
1599
|
+
"onPointerLeaveCapture",
|
|
1600
|
+
"onPointerMove",
|
|
1601
|
+
"onPointerMoveCapture",
|
|
1602
|
+
"onPointerOut",
|
|
1603
|
+
"onPointerOutCapture",
|
|
1604
|
+
"onPointerOver",
|
|
1605
|
+
"onPointerOverCapture",
|
|
1606
|
+
"onPointerUp",
|
|
1607
|
+
"onPointerUpCapture"
|
|
1563
1608
|
];
|
|
1564
|
-
|
|
1565
|
-
|
|
1566
|
-
|
|
1567
|
-
|
|
1568
|
-
|
|
1569
|
-
|
|
1609
|
+
/**
|
|
1610
|
+
* Popover API properties added in React 19
|
|
1611
|
+
*/
|
|
1612
|
+
const POPOVER_API_PROPS = [
|
|
1613
|
+
"popover",
|
|
1614
|
+
"popoverTarget",
|
|
1615
|
+
"popoverTargetAction",
|
|
1616
|
+
"onToggle",
|
|
1617
|
+
"onBeforeToggle"
|
|
1570
1618
|
];
|
|
1619
|
+
/**
|
|
1620
|
+
* Gets all valid DOM property names based on React version
|
|
1621
|
+
* @param context - ESLint rule context
|
|
1622
|
+
* @returns Array of valid DOM property names
|
|
1623
|
+
*/
|
|
1571
1624
|
function getDOMPropertyNames(context) {
|
|
1572
|
-
|
|
1573
|
-
|
|
1574
|
-
|
|
1575
|
-
|
|
1576
|
-
|
|
1577
|
-
|
|
1578
|
-
|
|
1579
|
-
|
|
1580
|
-
testReactVersion(context, ">=", "19.0.0-rc.0") ? ALL_DOM_PROPERTY_NAMES.push(...POPOVER_API_PROPS) : ALL_DOM_PROPERTY_NAMES.push(...POPOVER_API_PROPS.map((prop) => prop.toLowerCase()));
|
|
1581
|
-
return ALL_DOM_PROPERTY_NAMES;
|
|
1625
|
+
const ALL_DOM_PROPERTY_NAMES = DOM_PROPERTY_NAMES_TWO_WORDS.concat(DOM_PROPERTY_NAMES_ONE_WORD);
|
|
1626
|
+
if (testReactVersion(context, "<=", "16.1.0")) {
|
|
1627
|
+
ALL_DOM_PROPERTY_NAMES.push("allowTransparency");
|
|
1628
|
+
return ALL_DOM_PROPERTY_NAMES;
|
|
1629
|
+
}
|
|
1630
|
+
if (testReactVersion(context, ">=", "16.4.0")) ALL_DOM_PROPERTY_NAMES.push(...REACT_ON_PROPS);
|
|
1631
|
+
testReactVersion(context, ">=", "19.0.0-rc.0") ? ALL_DOM_PROPERTY_NAMES.push(...POPOVER_API_PROPS) : ALL_DOM_PROPERTY_NAMES.push(...POPOVER_API_PROPS.map((prop) => prop.toLowerCase()));
|
|
1632
|
+
return ALL_DOM_PROPERTY_NAMES;
|
|
1582
1633
|
}
|
|
1634
|
+
/**
|
|
1635
|
+
* Checks if a node's parent is a JSX tag that is written with lowercase letters,
|
|
1636
|
+
* and is not a custom web component.
|
|
1637
|
+
* @param childNode - JSX element being tested
|
|
1638
|
+
* @returns Whether the node is a valid HTML tag in JSX
|
|
1639
|
+
*/
|
|
1583
1640
|
function isValidHTMLTagInJSX(childNode) {
|
|
1584
|
-
|
|
1585
|
-
|
|
1586
|
-
|
|
1587
|
-
(attrNode) => attrNode.type === "JSXAttribute" && attrNode.name.type === "JSXIdentifier" && attrNode.name.name === "is"
|
|
1588
|
-
// To learn more about custom web components and `is` attribute,
|
|
1589
|
-
// see https://html.spec.whatwg.org/multipage/custom-elements.html#custom-elements-customized-builtin-example
|
|
1590
|
-
);
|
|
1591
|
-
}
|
|
1592
|
-
return false;
|
|
1641
|
+
const tagConvention = /^[a-z][^-]*$/;
|
|
1642
|
+
if (tagConvention.test(childNode.parent.name.name)) return !childNode.parent.attributes.some((attrNode) => attrNode.type === "JSXAttribute" && attrNode.name.type === "JSXIdentifier" && attrNode.name.name === "is");
|
|
1643
|
+
return false;
|
|
1593
1644
|
}
|
|
1594
|
-
|
|
1595
|
-
|
|
1645
|
+
/**
|
|
1646
|
+
* Normalizes attribute names that should be case-insensitive
|
|
1647
|
+
* @param name - Attribute name to normalize
|
|
1648
|
+
* @returns Normalized attribute name
|
|
1649
|
+
*/
|
|
1650
|
+
function normalizeAttributeCase(name$2) {
|
|
1651
|
+
return DOM_PROPERTIES_IGNORE_CASE.find((element) => element.toLowerCase() === name$2.toLowerCase()) || name$2;
|
|
1596
1652
|
}
|
|
1597
|
-
|
|
1598
|
-
|
|
1653
|
+
/**
|
|
1654
|
+
* Checks if an attribute name is a valid data-* attribute
|
|
1655
|
+
* @param name - Attribute name to test
|
|
1656
|
+
* @returns Whether the attribute is a valid data attribute
|
|
1657
|
+
*/
|
|
1658
|
+
function isValidDataAttribute(name$2) {
|
|
1659
|
+
return !/^data-xml/i.test(name$2) && /^data-[^:]*$/.test(name$2);
|
|
1599
1660
|
}
|
|
1600
|
-
|
|
1601
|
-
|
|
1661
|
+
/**
|
|
1662
|
+
* Checks if an attribute name has uppercase characters
|
|
1663
|
+
* @param name - Attribute name to test
|
|
1664
|
+
* @returns Whether the name has uppercase characters
|
|
1665
|
+
*/
|
|
1666
|
+
function hasUpperCaseCharacter(name$2) {
|
|
1667
|
+
return name$2.toLowerCase() !== name$2;
|
|
1602
1668
|
}
|
|
1603
|
-
|
|
1604
|
-
|
|
1669
|
+
/**
|
|
1670
|
+
* Checks if an attribute is a valid ARIA attribute
|
|
1671
|
+
* @param name - Attribute name to test
|
|
1672
|
+
* @returns Whether the attribute is a valid ARIA attribute
|
|
1673
|
+
*/
|
|
1674
|
+
function isValidAriaAttribute(name$2) {
|
|
1675
|
+
return ARIA_PROPERTIES.some((element) => element === name$2);
|
|
1605
1676
|
}
|
|
1677
|
+
/**
|
|
1678
|
+
* Gets the tag name for a JSXAttribute
|
|
1679
|
+
* @param node - JSXAttribute to get tag name from
|
|
1680
|
+
* @returns Tag name or null
|
|
1681
|
+
*/
|
|
1606
1682
|
function getTagName(node) {
|
|
1607
|
-
|
|
1608
|
-
|
|
1609
|
-
}
|
|
1610
|
-
return null;
|
|
1683
|
+
if (node?.parent?.name) return node.parent.name.name;
|
|
1684
|
+
return null;
|
|
1611
1685
|
}
|
|
1686
|
+
/**
|
|
1687
|
+
* Checks if the tag name has a dot (member expression)
|
|
1688
|
+
* @param node - JSXAttribute to check
|
|
1689
|
+
* @returns Whether the tag name has a dot
|
|
1690
|
+
*/
|
|
1612
1691
|
function tagNameHasDot(node) {
|
|
1613
|
-
|
|
1692
|
+
return !!(node.parent?.name && node.parent.name.type === "JSXMemberExpression");
|
|
1614
1693
|
}
|
|
1615
|
-
|
|
1616
|
-
|
|
1617
|
-
|
|
1618
|
-
|
|
1619
|
-
|
|
1620
|
-
|
|
1621
|
-
|
|
1622
|
-
|
|
1623
|
-
|
|
1624
|
-
|
|
1625
|
-
|
|
1626
|
-
dataLowercaseRequired: "React does not recognize data-* props with uppercase characters on a DOM element. Found '{{name}}', use '{{lowerCaseName}}' instead",
|
|
1627
|
-
invalidPropOnTag: "Invalid property '{{name}}' found on tag '{{tagName}}', but it is only allowed on: {{allowedTags}}",
|
|
1628
|
-
unknownProp: "Unknown property '{{name}}' found",
|
|
1629
|
-
unknownPropWithStandardName: "Unknown property '{{name}}' found, use '{{standardName}}' instead"
|
|
1630
|
-
};
|
|
1631
|
-
var no_unknown_property_default = createRule({
|
|
1632
|
-
meta: {
|
|
1633
|
-
type: "problem",
|
|
1634
|
-
docs: {
|
|
1635
|
-
description: "Disallow unknown `DOM` property."
|
|
1636
|
-
},
|
|
1637
|
-
fixable: "code",
|
|
1638
|
-
messages,
|
|
1639
|
-
schema: [{
|
|
1640
|
-
type: "object",
|
|
1641
|
-
additionalProperties: false,
|
|
1642
|
-
properties: {
|
|
1643
|
-
ignore: {
|
|
1644
|
-
type: "array",
|
|
1645
|
-
items: {
|
|
1646
|
-
type: "string"
|
|
1647
|
-
}
|
|
1648
|
-
},
|
|
1649
|
-
requireDataLowercase: {
|
|
1650
|
-
type: "boolean",
|
|
1651
|
-
default: false
|
|
1652
|
-
}
|
|
1653
|
-
}
|
|
1654
|
-
}]
|
|
1655
|
-
},
|
|
1656
|
-
name: RULE_NAME12,
|
|
1657
|
-
create: create12,
|
|
1658
|
-
defaultOptions: []
|
|
1659
|
-
});
|
|
1660
|
-
function create12(context) {
|
|
1661
|
-
const report = Reporter.make(context);
|
|
1662
|
-
function getIgnoreConfig() {
|
|
1663
|
-
return context.options[0]?.ignore || DEFAULTS.ignore;
|
|
1664
|
-
}
|
|
1665
|
-
function getRequireDataLowercase() {
|
|
1666
|
-
return context.options[0] && typeof context.options[0].requireDataLowercase !== "undefined" ? !!context.options[0].requireDataLowercase : DEFAULTS.requireDataLowercase;
|
|
1667
|
-
}
|
|
1668
|
-
return {
|
|
1669
|
-
JSXAttribute(node) {
|
|
1670
|
-
const ignoreNames = getIgnoreConfig();
|
|
1671
|
-
const actualName = getText(context, node.name);
|
|
1672
|
-
if (ignoreNames.indexOf(actualName) >= 0) {
|
|
1673
|
-
return;
|
|
1674
|
-
}
|
|
1675
|
-
const name3 = normalizeAttributeCase(actualName);
|
|
1676
|
-
if (tagNameHasDot(node)) {
|
|
1677
|
-
return;
|
|
1678
|
-
}
|
|
1679
|
-
if (isValidDataAttribute(name3)) {
|
|
1680
|
-
if (getRequireDataLowercase() && hasUpperCaseCharacter(name3)) {
|
|
1681
|
-
report.send({
|
|
1682
|
-
node,
|
|
1683
|
-
messageId: "dataLowercaseRequired",
|
|
1684
|
-
data: {
|
|
1685
|
-
name: actualName,
|
|
1686
|
-
lowerCaseName: actualName.toLowerCase()
|
|
1687
|
-
}
|
|
1688
|
-
});
|
|
1689
|
-
}
|
|
1690
|
-
return;
|
|
1691
|
-
}
|
|
1692
|
-
if (isValidAriaAttribute(name3)) return;
|
|
1693
|
-
const tagName = getTagName(node);
|
|
1694
|
-
if (tagName === "fbt" || tagName === "fbs") return;
|
|
1695
|
-
if (!isValidHTMLTagInJSX(node)) return;
|
|
1696
|
-
const allowedTags = has(ATTRIBUTE_TAGS_MAP, name3) ? ATTRIBUTE_TAGS_MAP[name3] : null;
|
|
1697
|
-
if (tagName && allowedTags) {
|
|
1698
|
-
if (allowedTags.indexOf(tagName) === -1) {
|
|
1699
|
-
report.send({
|
|
1700
|
-
node,
|
|
1701
|
-
messageId: "invalidPropOnTag",
|
|
1702
|
-
data: {
|
|
1703
|
-
name: actualName,
|
|
1704
|
-
allowedTags: allowedTags.join(", "),
|
|
1705
|
-
tagName
|
|
1706
|
-
}
|
|
1707
|
-
});
|
|
1708
|
-
}
|
|
1709
|
-
return;
|
|
1710
|
-
}
|
|
1711
|
-
const standardName = getStandardName(name3, context);
|
|
1712
|
-
const hasStandardNameButIsNotUsed = standardName && standardName !== name3;
|
|
1713
|
-
const usesStandardName = standardName && standardName === name3;
|
|
1714
|
-
if (usesStandardName) {
|
|
1715
|
-
return;
|
|
1716
|
-
}
|
|
1717
|
-
if (hasStandardNameButIsNotUsed) {
|
|
1718
|
-
report.send({
|
|
1719
|
-
node,
|
|
1720
|
-
messageId: "unknownPropWithStandardName",
|
|
1721
|
-
data: {
|
|
1722
|
-
name: actualName,
|
|
1723
|
-
standardName
|
|
1724
|
-
},
|
|
1725
|
-
fix(fixer) {
|
|
1726
|
-
return fixer.replaceText(node.name, standardName);
|
|
1727
|
-
}
|
|
1728
|
-
});
|
|
1729
|
-
return;
|
|
1730
|
-
}
|
|
1731
|
-
report.send({
|
|
1732
|
-
node,
|
|
1733
|
-
messageId: "unknownProp",
|
|
1734
|
-
data: {
|
|
1735
|
-
name: actualName
|
|
1736
|
-
}
|
|
1737
|
-
});
|
|
1738
|
-
}
|
|
1739
|
-
};
|
|
1694
|
+
/**
|
|
1695
|
+
* Gets the standard name of an attribute
|
|
1696
|
+
* @param name - Attribute name
|
|
1697
|
+
* @param context - ESLint context
|
|
1698
|
+
* @returns Standard name or undefined
|
|
1699
|
+
*/
|
|
1700
|
+
function getStandardName(name$2, context) {
|
|
1701
|
+
if (has(DOM_ATTRIBUTE_NAMES, name$2)) return DOM_ATTRIBUTE_NAMES[name$2];
|
|
1702
|
+
if (has(SVGDOM_ATTRIBUTE_NAMES, name$2)) return SVGDOM_ATTRIBUTE_NAMES[name$2];
|
|
1703
|
+
const names = getDOMPropertyNames(context);
|
|
1704
|
+
return names.find((element) => element.toLowerCase() === name$2.toLowerCase());
|
|
1740
1705
|
}
|
|
1706
|
+
/**
|
|
1707
|
+
* Checks if an object has a property
|
|
1708
|
+
* @param obj - Object to check
|
|
1709
|
+
* @param key - Key to check for
|
|
1710
|
+
* @returns Whether the object has the property
|
|
1711
|
+
*/
|
|
1741
1712
|
function has(obj, key) {
|
|
1742
|
-
|
|
1713
|
+
return Object.hasOwn(obj, key);
|
|
1743
1714
|
}
|
|
1715
|
+
/**
|
|
1716
|
+
* Gets text of a node
|
|
1717
|
+
* @param context - ESLint context
|
|
1718
|
+
* @param node - Node to get text from
|
|
1719
|
+
* @returns Node's text
|
|
1720
|
+
*/
|
|
1744
1721
|
function getText(context, node) {
|
|
1745
|
-
|
|
1722
|
+
return context.sourceCode.getText(node);
|
|
1723
|
+
}
|
|
1724
|
+
/**
|
|
1725
|
+
* Tests React version against a comparator
|
|
1726
|
+
* @param context - ESLint context
|
|
1727
|
+
* @param comparator - Comparison operator
|
|
1728
|
+
* @param version - Version to compare against
|
|
1729
|
+
* @returns Comparison result
|
|
1730
|
+
*/
|
|
1731
|
+
function testReactVersion(context, comparator, version$1) {
|
|
1732
|
+
const { version: localVersion } = getSettingsFromContext(context);
|
|
1733
|
+
return compare(localVersion, version$1, comparator);
|
|
1746
1734
|
}
|
|
1747
|
-
|
|
1748
|
-
|
|
1749
|
-
|
|
1735
|
+
const messages = {
|
|
1736
|
+
dataLowercaseRequired: "React does not recognize data-* props with uppercase characters on a DOM element. Found '{{name}}', use '{{lowerCaseName}}' instead",
|
|
1737
|
+
invalidPropOnTag: "Invalid property '{{name}}' found on tag '{{tagName}}', but it is only allowed on: {{allowedTags}}",
|
|
1738
|
+
unknownProp: "Unknown property '{{name}}' found",
|
|
1739
|
+
unknownPropWithStandardName: "Unknown property '{{name}}' found, use '{{standardName}}' instead"
|
|
1740
|
+
};
|
|
1741
|
+
var no_unknown_property_default = createRule({
|
|
1742
|
+
meta: {
|
|
1743
|
+
type: "problem",
|
|
1744
|
+
docs: { description: "Disallow unknown `DOM` property." },
|
|
1745
|
+
fixable: "code",
|
|
1746
|
+
messages,
|
|
1747
|
+
schema: [{
|
|
1748
|
+
type: "object",
|
|
1749
|
+
additionalProperties: false,
|
|
1750
|
+
properties: {
|
|
1751
|
+
ignore: {
|
|
1752
|
+
type: "array",
|
|
1753
|
+
items: { type: "string" }
|
|
1754
|
+
},
|
|
1755
|
+
requireDataLowercase: {
|
|
1756
|
+
type: "boolean",
|
|
1757
|
+
default: false
|
|
1758
|
+
}
|
|
1759
|
+
}
|
|
1760
|
+
}]
|
|
1761
|
+
},
|
|
1762
|
+
name: RULE_NAME$4,
|
|
1763
|
+
create: create$4,
|
|
1764
|
+
defaultOptions: []
|
|
1765
|
+
});
|
|
1766
|
+
/**
|
|
1767
|
+
* Create function for the ESLint rule
|
|
1768
|
+
* @param context - ESLint rule context
|
|
1769
|
+
* @returns Rule listener
|
|
1770
|
+
*/
|
|
1771
|
+
function create$4(context) {
|
|
1772
|
+
const report = Reporter.make(context);
|
|
1773
|
+
/**
|
|
1774
|
+
* Gets the ignore configuration from rule options
|
|
1775
|
+
* @returns Array of attribute names to ignore
|
|
1776
|
+
*/
|
|
1777
|
+
function getIgnoreConfig() {
|
|
1778
|
+
return context.options[0]?.ignore || DEFAULTS.ignore;
|
|
1779
|
+
}
|
|
1780
|
+
/**
|
|
1781
|
+
* Gets the requireDataLowercase option from rule options
|
|
1782
|
+
* @returns Whether data attributes must be lowercase
|
|
1783
|
+
*/
|
|
1784
|
+
function getRequireDataLowercase() {
|
|
1785
|
+
return context.options[0] && typeof context.options[0].requireDataLowercase !== "undefined" ? !!context.options[0].requireDataLowercase : DEFAULTS.requireDataLowercase;
|
|
1786
|
+
}
|
|
1787
|
+
return { JSXAttribute(node) {
|
|
1788
|
+
const ignoreNames = getIgnoreConfig();
|
|
1789
|
+
const actualName = getText(context, node.name);
|
|
1790
|
+
if (ignoreNames.indexOf(actualName) >= 0) return;
|
|
1791
|
+
const name$2 = normalizeAttributeCase(actualName);
|
|
1792
|
+
if (tagNameHasDot(node)) return;
|
|
1793
|
+
if (isValidDataAttribute(name$2)) {
|
|
1794
|
+
if (getRequireDataLowercase() && hasUpperCaseCharacter(name$2)) report.send({
|
|
1795
|
+
node,
|
|
1796
|
+
messageId: "dataLowercaseRequired",
|
|
1797
|
+
data: {
|
|
1798
|
+
name: actualName,
|
|
1799
|
+
lowerCaseName: actualName.toLowerCase()
|
|
1800
|
+
}
|
|
1801
|
+
});
|
|
1802
|
+
return;
|
|
1803
|
+
}
|
|
1804
|
+
if (isValidAriaAttribute(name$2)) return;
|
|
1805
|
+
const tagName = getTagName(node);
|
|
1806
|
+
if (tagName === "fbt" || tagName === "fbs") return;
|
|
1807
|
+
if (!isValidHTMLTagInJSX(node)) return;
|
|
1808
|
+
const allowedTags = has(ATTRIBUTE_TAGS_MAP, name$2) ? ATTRIBUTE_TAGS_MAP[name$2] : null;
|
|
1809
|
+
if (tagName && allowedTags) {
|
|
1810
|
+
if (allowedTags.indexOf(tagName) === -1) report.send({
|
|
1811
|
+
node,
|
|
1812
|
+
messageId: "invalidPropOnTag",
|
|
1813
|
+
data: {
|
|
1814
|
+
name: actualName,
|
|
1815
|
+
allowedTags: allowedTags.join(", "),
|
|
1816
|
+
tagName
|
|
1817
|
+
}
|
|
1818
|
+
});
|
|
1819
|
+
return;
|
|
1820
|
+
}
|
|
1821
|
+
const standardName = getStandardName(name$2, context);
|
|
1822
|
+
const hasStandardNameButIsNotUsed = !!standardName && standardName !== name$2;
|
|
1823
|
+
const usesStandardName = !!standardName && standardName === name$2;
|
|
1824
|
+
if (usesStandardName) return;
|
|
1825
|
+
if (hasStandardNameButIsNotUsed) {
|
|
1826
|
+
report.send({
|
|
1827
|
+
node,
|
|
1828
|
+
messageId: "unknownPropWithStandardName",
|
|
1829
|
+
data: {
|
|
1830
|
+
name: actualName,
|
|
1831
|
+
standardName
|
|
1832
|
+
},
|
|
1833
|
+
fix(fixer) {
|
|
1834
|
+
return fixer.replaceText(node.name, standardName);
|
|
1835
|
+
}
|
|
1836
|
+
});
|
|
1837
|
+
return;
|
|
1838
|
+
}
|
|
1839
|
+
report.send({
|
|
1840
|
+
node,
|
|
1841
|
+
messageId: "unknownProp",
|
|
1842
|
+
data: { name: actualName }
|
|
1843
|
+
});
|
|
1844
|
+
} };
|
|
1750
1845
|
}
|
|
1751
1846
|
|
|
1752
|
-
|
|
1753
|
-
|
|
1754
|
-
|
|
1755
|
-
|
|
1756
|
-
|
|
1757
|
-
];
|
|
1847
|
+
//#endregion
|
|
1848
|
+
//#region src/rules/no-unsafe-iframe-sandbox.ts
|
|
1849
|
+
const RULE_NAME$3 = "no-unsafe-iframe-sandbox";
|
|
1850
|
+
const RULE_FEATURES$3 = [];
|
|
1851
|
+
const unsafeSandboxValues = [["allow-scripts", "allow-same-origin"]];
|
|
1758
1852
|
function isSafeSandbox(value) {
|
|
1759
|
-
|
|
1760
|
-
|
|
1761
|
-
|
|
1762
|
-
|
|
1853
|
+
if (typeof value !== "string") return false;
|
|
1854
|
+
return !unsafeSandboxValues.some((values) => {
|
|
1855
|
+
return values.every((v) => value.includes(v));
|
|
1856
|
+
});
|
|
1763
1857
|
}
|
|
1764
1858
|
var no_unsafe_iframe_sandbox_default = createRule({
|
|
1765
|
-
|
|
1766
|
-
|
|
1767
|
-
|
|
1768
|
-
|
|
1769
|
-
|
|
1770
|
-
|
|
1771
|
-
|
|
1772
|
-
|
|
1773
|
-
|
|
1774
|
-
|
|
1775
|
-
|
|
1776
|
-
|
|
1777
|
-
create: create13,
|
|
1778
|
-
defaultOptions: []
|
|
1859
|
+
meta: {
|
|
1860
|
+
type: "problem",
|
|
1861
|
+
docs: {
|
|
1862
|
+
description: "Enforces `sandbox` attribute for `iframe` elements is not set to unsafe combinations.",
|
|
1863
|
+
[Symbol.for("rule_features")]: RULE_FEATURES$3
|
|
1864
|
+
},
|
|
1865
|
+
messages: { noUnsafeIframeSandbox: "Unsafe 'sandbox' attribute value on 'iframe' component." },
|
|
1866
|
+
schema: []
|
|
1867
|
+
},
|
|
1868
|
+
name: RULE_NAME$3,
|
|
1869
|
+
create: create$3,
|
|
1870
|
+
defaultOptions: []
|
|
1779
1871
|
});
|
|
1780
|
-
function
|
|
1781
|
-
|
|
1782
|
-
|
|
1783
|
-
|
|
1784
|
-
|
|
1785
|
-
|
|
1786
|
-
|
|
1787
|
-
|
|
1788
|
-
|
|
1789
|
-
|
|
1790
|
-
|
|
1791
|
-
});
|
|
1792
|
-
}
|
|
1793
|
-
}
|
|
1794
|
-
};
|
|
1872
|
+
function create$3(context) {
|
|
1873
|
+
const resolver = createJsxElementResolver(context);
|
|
1874
|
+
return { JSXElement(node) {
|
|
1875
|
+
const { attributes, domElementType } = resolver.resolve(node);
|
|
1876
|
+
if (domElementType !== "iframe") return;
|
|
1877
|
+
const sandboxAttribute = resolveAttribute(context, attributes, node, "sandbox");
|
|
1878
|
+
if (!isSafeSandbox(sandboxAttribute.attributeValueString)) context.report({
|
|
1879
|
+
messageId: "noUnsafeIframeSandbox",
|
|
1880
|
+
node: sandboxAttribute.attributeValue?.node ?? sandboxAttribute.attribute ?? node
|
|
1881
|
+
});
|
|
1882
|
+
} };
|
|
1795
1883
|
}
|
|
1796
1884
|
|
|
1797
|
-
|
|
1798
|
-
|
|
1799
|
-
|
|
1800
|
-
|
|
1801
|
-
];
|
|
1885
|
+
//#endregion
|
|
1886
|
+
//#region src/rules/no-unsafe-target-blank.ts
|
|
1887
|
+
const RULE_NAME$2 = "no-unsafe-target-blank";
|
|
1888
|
+
const RULE_FEATURES$2 = ["FIX"];
|
|
1802
1889
|
function isExternalLinkLike(value) {
|
|
1803
|
-
|
|
1804
|
-
|
|
1890
|
+
if (value == null) return false;
|
|
1891
|
+
return value.startsWith("https://") || /^(?:\w+:|\/\/)/u.test(value);
|
|
1805
1892
|
}
|
|
1806
1893
|
function isSafeRel(value) {
|
|
1807
|
-
|
|
1808
|
-
|
|
1894
|
+
if (value == null) return false;
|
|
1895
|
+
return value === "noreferrer" || /\bnoreferrer\b/u.test(value);
|
|
1809
1896
|
}
|
|
1810
1897
|
var no_unsafe_target_blank_default = createRule({
|
|
1811
|
-
|
|
1812
|
-
|
|
1813
|
-
|
|
1814
|
-
|
|
1815
|
-
|
|
1816
|
-
|
|
1817
|
-
|
|
1818
|
-
|
|
1819
|
-
|
|
1820
|
-
|
|
1821
|
-
|
|
1822
|
-
|
|
1823
|
-
|
|
1824
|
-
|
|
1825
|
-
|
|
1826
|
-
|
|
1827
|
-
|
|
1898
|
+
meta: {
|
|
1899
|
+
type: "problem",
|
|
1900
|
+
docs: {
|
|
1901
|
+
description: "Disallow `target=\"_blank\"` without `rel=\"noreferrer noopener\"`.",
|
|
1902
|
+
[Symbol.for("rule_features")]: RULE_FEATURES$2
|
|
1903
|
+
},
|
|
1904
|
+
fixable: "code",
|
|
1905
|
+
hasSuggestions: true,
|
|
1906
|
+
messages: {
|
|
1907
|
+
addRelNoreferrerNoopener: `Add 'rel="noreferrer noopener"' to the link to prevent security risks.`,
|
|
1908
|
+
noUnsafeTargetBlank: `Using 'target="_blank"' on an external link without 'rel="noreferrer noopener"' is a security risk.`
|
|
1909
|
+
},
|
|
1910
|
+
schema: []
|
|
1911
|
+
},
|
|
1912
|
+
name: RULE_NAME$2,
|
|
1913
|
+
create: create$2,
|
|
1914
|
+
defaultOptions: []
|
|
1828
1915
|
});
|
|
1829
|
-
function
|
|
1830
|
-
|
|
1831
|
-
|
|
1832
|
-
|
|
1833
|
-
|
|
1834
|
-
|
|
1835
|
-
|
|
1836
|
-
|
|
1837
|
-
|
|
1838
|
-
|
|
1839
|
-
|
|
1840
|
-
|
|
1841
|
-
|
|
1842
|
-
|
|
1843
|
-
|
|
1844
|
-
|
|
1845
|
-
|
|
1846
|
-
|
|
1847
|
-
|
|
1848
|
-
|
|
1849
|
-
|
|
1850
|
-
|
|
1851
|
-
|
|
1852
|
-
|
|
1853
|
-
|
|
1854
|
-
|
|
1855
|
-
|
|
1856
|
-
|
|
1857
|
-
|
|
1858
|
-
|
|
1859
|
-
|
|
1860
|
-
|
|
1861
|
-
|
|
1862
|
-
|
|
1863
|
-
|
|
1864
|
-
|
|
1865
|
-
node: relAttribute.attributeValue?.node ?? relAttribute.attribute,
|
|
1866
|
-
suggest: [{
|
|
1867
|
-
messageId: "addRelNoreferrerNoopener",
|
|
1868
|
-
fix(fixer) {
|
|
1869
|
-
if (relAttribute.attribute == null) return null;
|
|
1870
|
-
return fixer.replaceText(relAttribute.attribute, `${relAttribute.attributeName}="noreferrer noopener"`);
|
|
1871
|
-
}
|
|
1872
|
-
}]
|
|
1873
|
-
});
|
|
1874
|
-
}
|
|
1875
|
-
};
|
|
1916
|
+
function create$2(context) {
|
|
1917
|
+
const resolver = createJsxElementResolver(context);
|
|
1918
|
+
return { JSXElement(node) {
|
|
1919
|
+
const { attributes, domElementType } = resolver.resolve(node);
|
|
1920
|
+
if (domElementType !== "a") return;
|
|
1921
|
+
const targetAttribute = resolveAttribute(context, attributes, node, "target");
|
|
1922
|
+
if (targetAttribute.attributeValueString !== "_blank") return;
|
|
1923
|
+
const hrefAttribute = resolveAttribute(context, attributes, node, "href");
|
|
1924
|
+
if (!isExternalLinkLike(hrefAttribute.attributeValueString)) return;
|
|
1925
|
+
const relAttribute = resolveAttribute(context, attributes, node, "rel");
|
|
1926
|
+
if (isSafeRel(relAttribute.attributeValueString)) return;
|
|
1927
|
+
if (relAttribute.attribute == null) {
|
|
1928
|
+
context.report({
|
|
1929
|
+
messageId: "noUnsafeTargetBlank",
|
|
1930
|
+
node: node.openingElement,
|
|
1931
|
+
suggest: [{
|
|
1932
|
+
messageId: "addRelNoreferrerNoopener",
|
|
1933
|
+
fix(fixer) {
|
|
1934
|
+
return fixer.insertTextAfter(node.openingElement.name, ` ${relAttribute.attributeName}="noreferrer noopener"`);
|
|
1935
|
+
}
|
|
1936
|
+
}]
|
|
1937
|
+
});
|
|
1938
|
+
return;
|
|
1939
|
+
}
|
|
1940
|
+
context.report({
|
|
1941
|
+
messageId: "noUnsafeTargetBlank",
|
|
1942
|
+
node: relAttribute.attributeValue?.node ?? relAttribute.attribute,
|
|
1943
|
+
suggest: [{
|
|
1944
|
+
messageId: "addRelNoreferrerNoopener",
|
|
1945
|
+
fix(fixer) {
|
|
1946
|
+
if (relAttribute.attribute == null) return null;
|
|
1947
|
+
return fixer.replaceText(relAttribute.attribute, `${relAttribute.attributeName}="noreferrer noopener"`);
|
|
1948
|
+
}
|
|
1949
|
+
}]
|
|
1950
|
+
});
|
|
1951
|
+
} };
|
|
1876
1952
|
}
|
|
1877
|
-
|
|
1878
|
-
|
|
1879
|
-
|
|
1880
|
-
|
|
1953
|
+
|
|
1954
|
+
//#endregion
|
|
1955
|
+
//#region src/rules/no-use-form-state.ts
|
|
1956
|
+
const RULE_NAME$1 = "no-use-form-state";
|
|
1957
|
+
const RULE_FEATURES$1 = ["MOD"];
|
|
1881
1958
|
var no_use_form_state_default = createRule({
|
|
1882
|
-
|
|
1883
|
-
|
|
1884
|
-
|
|
1885
|
-
|
|
1886
|
-
|
|
1887
|
-
|
|
1888
|
-
|
|
1889
|
-
|
|
1890
|
-
|
|
1891
|
-
|
|
1892
|
-
|
|
1893
|
-
|
|
1894
|
-
|
|
1895
|
-
create: create15,
|
|
1896
|
-
defaultOptions: []
|
|
1959
|
+
meta: {
|
|
1960
|
+
type: "problem",
|
|
1961
|
+
docs: {
|
|
1962
|
+
description: "Replaces usages of `useFormState` with `useActionState`.",
|
|
1963
|
+
[Symbol.for("rule_features")]: RULE_FEATURES$1
|
|
1964
|
+
},
|
|
1965
|
+
fixable: "code",
|
|
1966
|
+
messages: { noUseFormState: "[Deprecated] Use 'useActionState' from 'react' package instead." },
|
|
1967
|
+
schema: []
|
|
1968
|
+
},
|
|
1969
|
+
name: RULE_NAME$1,
|
|
1970
|
+
create: create$1,
|
|
1971
|
+
defaultOptions: []
|
|
1897
1972
|
});
|
|
1898
|
-
function
|
|
1899
|
-
|
|
1900
|
-
|
|
1901
|
-
|
|
1902
|
-
|
|
1903
|
-
|
|
1904
|
-
|
|
1905
|
-
|
|
1906
|
-
|
|
1907
|
-
|
|
1908
|
-
|
|
1909
|
-
|
|
1910
|
-
|
|
1911
|
-
|
|
1912
|
-
|
|
1913
|
-
|
|
1914
|
-
|
|
1915
|
-
|
|
1916
|
-
|
|
1917
|
-
|
|
1918
|
-
|
|
1919
|
-
|
|
1920
|
-
|
|
1921
|
-
|
|
1922
|
-
|
|
1923
|
-
|
|
1924
|
-
|
|
1925
|
-
|
|
1926
|
-
|
|
1927
|
-
|
|
1928
|
-
|
|
1929
|
-
|
|
1930
|
-
|
|
1931
|
-
|
|
1932
|
-
|
|
1933
|
-
|
|
1934
|
-
|
|
1935
|
-
|
|
1936
|
-
|
|
1937
|
-
|
|
1938
|
-
}
|
|
1939
|
-
}
|
|
1940
|
-
}
|
|
1941
|
-
};
|
|
1973
|
+
function create$1(context) {
|
|
1974
|
+
if (!context.sourceCode.text.includes("useFormState")) return {};
|
|
1975
|
+
const settings$1 = getSettingsFromContext(context);
|
|
1976
|
+
if (compare(settings$1.version, "19.0.0", "<")) return {};
|
|
1977
|
+
const reactDomNames = /* @__PURE__ */ new Set();
|
|
1978
|
+
const useFormStateNames = /* @__PURE__ */ new Set();
|
|
1979
|
+
return {
|
|
1980
|
+
CallExpression(node) {
|
|
1981
|
+
switch (true) {
|
|
1982
|
+
case node.callee.type === AST_NODE_TYPES.Identifier && useFormStateNames.has(node.callee.name):
|
|
1983
|
+
context.report({
|
|
1984
|
+
messageId: "noUseFormState",
|
|
1985
|
+
node,
|
|
1986
|
+
fix: getFix(context, node)
|
|
1987
|
+
});
|
|
1988
|
+
return;
|
|
1989
|
+
case node.callee.type === AST_NODE_TYPES.MemberExpression && node.callee.object.type === AST_NODE_TYPES.Identifier && node.callee.property.type === AST_NODE_TYPES.Identifier && node.callee.property.name === "useFormState" && reactDomNames.has(node.callee.object.name):
|
|
1990
|
+
context.report({
|
|
1991
|
+
messageId: "noUseFormState",
|
|
1992
|
+
node,
|
|
1993
|
+
fix: getFix(context, node)
|
|
1994
|
+
});
|
|
1995
|
+
return;
|
|
1996
|
+
}
|
|
1997
|
+
},
|
|
1998
|
+
ImportDeclaration(node) {
|
|
1999
|
+
const [baseSource] = node.source.value.split("/");
|
|
2000
|
+
if (baseSource !== "react-dom") return;
|
|
2001
|
+
for (const specifier of node.specifiers) switch (specifier.type) {
|
|
2002
|
+
case AST_NODE_TYPES.ImportSpecifier:
|
|
2003
|
+
if (specifier.imported.type !== AST_NODE_TYPES.Identifier) continue;
|
|
2004
|
+
if (specifier.imported.name === "useFormState") useFormStateNames.add(specifier.local.name);
|
|
2005
|
+
continue;
|
|
2006
|
+
case AST_NODE_TYPES.ImportDefaultSpecifier:
|
|
2007
|
+
case AST_NODE_TYPES.ImportNamespaceSpecifier:
|
|
2008
|
+
reactDomNames.add(specifier.local.name);
|
|
2009
|
+
continue;
|
|
2010
|
+
}
|
|
2011
|
+
}
|
|
2012
|
+
};
|
|
1942
2013
|
}
|
|
1943
|
-
function
|
|
1944
|
-
|
|
1945
|
-
|
|
1946
|
-
|
|
1947
|
-
|
|
1948
|
-
`),
|
|
1949
|
-
fixer.replaceText(node.callee, "useActionState")
|
|
1950
|
-
];
|
|
1951
|
-
};
|
|
2014
|
+
function getFix(context, node) {
|
|
2015
|
+
const { importSource } = getSettingsFromContext(context);
|
|
2016
|
+
return (fixer) => {
|
|
2017
|
+
return [fixer.insertTextBefore(context.sourceCode.ast, `import { useActionState } from "${importSource}";\n`), fixer.replaceText(node.callee, "useActionState")];
|
|
2018
|
+
};
|
|
1952
2019
|
}
|
|
1953
|
-
|
|
1954
|
-
|
|
1955
|
-
|
|
1956
|
-
|
|
1957
|
-
|
|
1958
|
-
|
|
1959
|
-
|
|
1960
|
-
|
|
1961
|
-
|
|
1962
|
-
|
|
1963
|
-
|
|
1964
|
-
|
|
1965
|
-
|
|
1966
|
-
|
|
1967
|
-
|
|
1968
|
-
|
|
1969
|
-
|
|
1970
|
-
|
|
1971
|
-
|
|
2020
|
+
|
|
2021
|
+
//#endregion
|
|
2022
|
+
//#region src/rules/no-void-elements-with-children.ts
|
|
2023
|
+
const RULE_NAME = "no-void-elements-with-children";
|
|
2024
|
+
const RULE_FEATURES = [];
|
|
2025
|
+
const voidElements = new Set([
|
|
2026
|
+
"area",
|
|
2027
|
+
"base",
|
|
2028
|
+
"br",
|
|
2029
|
+
"col",
|
|
2030
|
+
"embed",
|
|
2031
|
+
"hr",
|
|
2032
|
+
"img",
|
|
2033
|
+
"input",
|
|
2034
|
+
"keygen",
|
|
2035
|
+
"link",
|
|
2036
|
+
"menuitem",
|
|
2037
|
+
"meta",
|
|
2038
|
+
"param",
|
|
2039
|
+
"source",
|
|
2040
|
+
"track",
|
|
2041
|
+
"wbr"
|
|
1972
2042
|
]);
|
|
1973
2043
|
var no_void_elements_with_children_default = createRule({
|
|
1974
|
-
|
|
1975
|
-
|
|
1976
|
-
|
|
1977
|
-
|
|
1978
|
-
|
|
1979
|
-
|
|
1980
|
-
|
|
1981
|
-
|
|
1982
|
-
|
|
1983
|
-
|
|
1984
|
-
|
|
1985
|
-
|
|
1986
|
-
create: create16,
|
|
1987
|
-
defaultOptions: []
|
|
2044
|
+
meta: {
|
|
2045
|
+
type: "problem",
|
|
2046
|
+
docs: {
|
|
2047
|
+
description: "Disallow `children` in void DOM elements.",
|
|
2048
|
+
[Symbol.for("rule_features")]: RULE_FEATURES
|
|
2049
|
+
},
|
|
2050
|
+
messages: { noVoidElementsWithChildren: "'{{element}}' is a void element tag and must not have children." },
|
|
2051
|
+
schema: []
|
|
2052
|
+
},
|
|
2053
|
+
name: RULE_NAME,
|
|
2054
|
+
create,
|
|
2055
|
+
defaultOptions: []
|
|
1988
2056
|
});
|
|
1989
|
-
function
|
|
1990
|
-
|
|
1991
|
-
|
|
1992
|
-
|
|
1993
|
-
|
|
1994
|
-
|
|
1995
|
-
|
|
1996
|
-
|
|
1997
|
-
|
|
1998
|
-
|
|
1999
|
-
|
|
2000
|
-
|
|
2001
|
-
|
|
2002
|
-
|
|
2003
|
-
|
|
2004
|
-
|
|
2005
|
-
|
|
2006
|
-
|
|
2007
|
-
|
|
2008
|
-
const hasAttribute3 = (name3) => ER.hasAttribute(context, name3, attributes, initialScope);
|
|
2009
|
-
if (hasAttribute3("children") || hasAttribute3("dangerouslySetInnerHTML")) {
|
|
2010
|
-
context.report({
|
|
2011
|
-
messageId: "noVoidElementsWithChildren",
|
|
2012
|
-
node,
|
|
2013
|
-
data: {
|
|
2014
|
-
element: elementName
|
|
2015
|
-
}
|
|
2016
|
-
});
|
|
2017
|
-
}
|
|
2018
|
-
}
|
|
2019
|
-
};
|
|
2057
|
+
function create(context) {
|
|
2058
|
+
const resolver = createJsxElementResolver(context);
|
|
2059
|
+
return { JSXElement(node) {
|
|
2060
|
+
const { domElementType: elementName } = resolver.resolve(node);
|
|
2061
|
+
if (elementName.length === 0 || !voidElements.has(elementName)) return;
|
|
2062
|
+
if (node.children.length > 0) context.report({
|
|
2063
|
+
messageId: "noVoidElementsWithChildren",
|
|
2064
|
+
node,
|
|
2065
|
+
data: { element: elementName }
|
|
2066
|
+
});
|
|
2067
|
+
const { attributes } = node.openingElement;
|
|
2068
|
+
const initialScope = context.sourceCode.getScope(node);
|
|
2069
|
+
const hasAttribute = (name$2) => ER.hasAttribute(context, name$2, attributes, initialScope);
|
|
2070
|
+
if (hasAttribute("children") || hasAttribute("dangerouslySetInnerHTML")) context.report({
|
|
2071
|
+
messageId: "noVoidElementsWithChildren",
|
|
2072
|
+
node,
|
|
2073
|
+
data: { element: elementName }
|
|
2074
|
+
});
|
|
2075
|
+
} };
|
|
2020
2076
|
}
|
|
2021
2077
|
|
|
2022
|
-
|
|
2023
|
-
|
|
2024
|
-
|
|
2025
|
-
|
|
2026
|
-
|
|
2027
|
-
|
|
2028
|
-
|
|
2029
|
-
|
|
2030
|
-
|
|
2031
|
-
|
|
2032
|
-
|
|
2033
|
-
|
|
2034
|
-
|
|
2035
|
-
|
|
2036
|
-
|
|
2037
|
-
|
|
2038
|
-
|
|
2039
|
-
|
|
2040
|
-
|
|
2041
|
-
|
|
2042
|
-
|
|
2043
|
-
|
|
2044
|
-
|
|
2045
|
-
|
|
2078
|
+
//#endregion
|
|
2079
|
+
//#region src/plugin.ts
|
|
2080
|
+
const plugin = {
|
|
2081
|
+
meta: {
|
|
2082
|
+
name,
|
|
2083
|
+
version
|
|
2084
|
+
},
|
|
2085
|
+
rules: {
|
|
2086
|
+
"no-dangerously-set-innerhtml": no_dangerously_set_innerhtml_default,
|
|
2087
|
+
"no-dangerously-set-innerhtml-with-children": no_dangerously_set_innerhtml_with_children_default,
|
|
2088
|
+
"no-find-dom-node": no_find_dom_node_default,
|
|
2089
|
+
"no-flush-sync": no_flush_sync_default,
|
|
2090
|
+
"no-hydrate": no_hydrate_default,
|
|
2091
|
+
"no-missing-button-type": no_missing_button_type_default,
|
|
2092
|
+
"no-missing-iframe-sandbox": no_missing_iframe_sandbox_default,
|
|
2093
|
+
"no-namespace": no_namespace_default,
|
|
2094
|
+
"no-render": no_render_default,
|
|
2095
|
+
"no-render-return-value": no_render_return_value_default,
|
|
2096
|
+
"no-script-url": no_script_url_default,
|
|
2097
|
+
"no-string-style-prop": no_string_style_prop_default,
|
|
2098
|
+
"no-unknown-property": no_unknown_property_default,
|
|
2099
|
+
"no-unsafe-iframe-sandbox": no_unsafe_iframe_sandbox_default,
|
|
2100
|
+
"no-unsafe-target-blank": no_unsafe_target_blank_default,
|
|
2101
|
+
"no-use-form-state": no_use_form_state_default,
|
|
2102
|
+
"no-void-elements-with-children": no_void_elements_with_children_default
|
|
2103
|
+
}
|
|
2046
2104
|
};
|
|
2047
2105
|
|
|
2048
|
-
|
|
2049
|
-
|
|
2050
|
-
|
|
2051
|
-
|
|
2052
|
-
|
|
2053
|
-
|
|
2054
|
-
|
|
2055
|
-
|
|
2056
|
-
}
|
|
2057
|
-
function makeLegacyConfig({ rules: rules2 }) {
|
|
2058
|
-
return {
|
|
2059
|
-
plugins: ["react-dom"],
|
|
2060
|
-
rules: rules2
|
|
2061
|
-
};
|
|
2062
|
-
}
|
|
2063
|
-
var index_default = {
|
|
2064
|
-
...plugin,
|
|
2065
|
-
configs: {
|
|
2066
|
-
["recommended"]: makeConfig(recommended_exports),
|
|
2067
|
-
["recommended-legacy"]: makeLegacyConfig(recommended_exports)
|
|
2068
|
-
}
|
|
2106
|
+
//#endregion
|
|
2107
|
+
//#region src/index.ts
|
|
2108
|
+
const { toFlatConfig, toLegacyConfig } = getConfigAdapters("react-dom", plugin);
|
|
2109
|
+
var src_default = {
|
|
2110
|
+
...plugin,
|
|
2111
|
+
configs: {
|
|
2112
|
+
["recommended"]: toFlatConfig(recommended_exports),
|
|
2113
|
+
["recommended-legacy"]: toLegacyConfig(recommended_exports)
|
|
2114
|
+
}
|
|
2069
2115
|
};
|
|
2070
2116
|
|
|
2071
|
-
|
|
2117
|
+
//#endregion
|
|
2118
|
+
export { src_default as default };
|