eslint-plugin-react-dom 2.0.0-next.0 → 2.0.0-next.2

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