eslint-plugin-react-dom 5.24.9 → 5.25.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +39 -23
- package/package.json +7 -7
package/dist/index.js
CHANGED
|
@@ -20,7 +20,7 @@ var __exportAll = (all, no_symbols) => {
|
|
|
20
20
|
//#endregion
|
|
21
21
|
//#region package.json
|
|
22
22
|
var name$2 = "eslint-plugin-react-dom";
|
|
23
|
-
var version = "5.
|
|
23
|
+
var version = "5.25.0";
|
|
24
24
|
//#endregion
|
|
25
25
|
//#region src/utils/create-rule.ts
|
|
26
26
|
function getDocsUrl(ruleName) {
|
|
@@ -1635,56 +1635,72 @@ function isExternalLinkLike(value) {
|
|
|
1635
1635
|
if (!isString(value)) return false;
|
|
1636
1636
|
return value.startsWith("https://") || /^(?:\w+:|\/\/)/u.test(value);
|
|
1637
1637
|
}
|
|
1638
|
-
function isSafeRel(value) {
|
|
1638
|
+
function isSafeRel(value, allowReferrer) {
|
|
1639
1639
|
if (!isString(value)) return false;
|
|
1640
|
-
|
|
1640
|
+
if (/\bnoreferrer\b/u.test(value)) return true;
|
|
1641
|
+
return allowReferrer && /\bnoopener\b/u.test(value);
|
|
1641
1642
|
}
|
|
1643
|
+
//#endregion
|
|
1644
|
+
//#region src/rules/no-unsafe-target-blank/no-unsafe-target-blank.ts
|
|
1645
|
+
const RULE_NAME$2 = "no-unsafe-target-blank";
|
|
1646
|
+
const defaultOptions = [{ allowReferrer: false }];
|
|
1647
|
+
const schema = [{
|
|
1648
|
+
type: "object",
|
|
1649
|
+
additionalProperties: false,
|
|
1650
|
+
properties: { allowReferrer: {
|
|
1651
|
+
type: "boolean",
|
|
1652
|
+
description: "Allow 'rel=\"noopener\"' without 'noreferrer' so referrer information is preserved.",
|
|
1653
|
+
default: false
|
|
1654
|
+
} }
|
|
1655
|
+
}];
|
|
1642
1656
|
var no_unsafe_target_blank_default = createRule({
|
|
1643
1657
|
meta: {
|
|
1644
1658
|
type: "problem",
|
|
1659
|
+
defaultOptions: [...defaultOptions],
|
|
1645
1660
|
docs: { description: "Disallows 'target=\"_blank\"' without 'rel=\"noreferrer noopener\"'." },
|
|
1646
1661
|
fixable: "code",
|
|
1647
1662
|
hasSuggestions: true,
|
|
1648
1663
|
messages: {
|
|
1649
|
-
|
|
1650
|
-
|
|
1664
|
+
default: `Using 'target="_blank"' on an external link without '{{rel}}' is a security risk.`,
|
|
1665
|
+
suggest: `Add '{{rel}}' to the link to prevent security risks.`
|
|
1651
1666
|
},
|
|
1652
|
-
schema
|
|
1667
|
+
schema
|
|
1653
1668
|
},
|
|
1654
|
-
name:
|
|
1669
|
+
name: RULE_NAME$2,
|
|
1655
1670
|
create: create$2
|
|
1656
1671
|
});
|
|
1657
1672
|
function create$2(context) {
|
|
1673
|
+
const { allowReferrer = false } = context.options[0] ?? defaultOptions[0];
|
|
1658
1674
|
const resolver = createJsxElementResolver(context);
|
|
1675
|
+
const requiredRelAttribute = `rel="${allowReferrer ? "noopener" : "noreferrer noopener"}"`;
|
|
1676
|
+
function buildSuggest(fix) {
|
|
1677
|
+
return [{
|
|
1678
|
+
data: { rel: requiredRelAttribute },
|
|
1679
|
+
fix,
|
|
1680
|
+
messageId: "suggest"
|
|
1681
|
+
}];
|
|
1682
|
+
}
|
|
1659
1683
|
return { JSXElement(node) {
|
|
1660
1684
|
const { domElementType } = resolver.resolve(node);
|
|
1661
1685
|
if (domElementType !== "a") return;
|
|
1662
1686
|
if (getAttributeStaticValue(context, node, "target") !== "_blank") return;
|
|
1663
1687
|
if (!isExternalLinkLike(getAttributeStaticValue(context, node, "href"))) return;
|
|
1664
|
-
const
|
|
1665
|
-
if (
|
|
1688
|
+
const relAttribute = findAttribute(context, node, "rel");
|
|
1689
|
+
if (relAttribute == null) {
|
|
1666
1690
|
context.report({
|
|
1667
1691
|
messageId: "default",
|
|
1692
|
+
data: { rel: requiredRelAttribute },
|
|
1668
1693
|
node: node.openingElement,
|
|
1669
|
-
suggest:
|
|
1670
|
-
fix(fixer) {
|
|
1671
|
-
return fixer.insertTextAfter(node.openingElement.name, ` rel="noreferrer noopener"`);
|
|
1672
|
-
},
|
|
1673
|
-
messageId: "add-rel-noreferrer-noopener"
|
|
1674
|
-
}]
|
|
1694
|
+
suggest: buildSuggest((fixer) => fixer.insertTextAfter(node.openingElement.name, ` ${requiredRelAttribute}`))
|
|
1675
1695
|
});
|
|
1676
1696
|
return;
|
|
1677
1697
|
}
|
|
1678
|
-
if (isSafeRel(getAttributeStaticValue(context, node, "rel"))) return;
|
|
1698
|
+
if (isSafeRel(getAttributeStaticValue(context, node, "rel"), allowReferrer)) return;
|
|
1679
1699
|
context.report({
|
|
1680
1700
|
messageId: "default",
|
|
1681
|
-
|
|
1682
|
-
|
|
1683
|
-
|
|
1684
|
-
return fixer.replaceText(relProp, `rel="noreferrer noopener"`);
|
|
1685
|
-
},
|
|
1686
|
-
messageId: "add-rel-noreferrer-noopener"
|
|
1687
|
-
}]
|
|
1701
|
+
data: { rel: requiredRelAttribute },
|
|
1702
|
+
node: relAttribute,
|
|
1703
|
+
suggest: buildSuggest((fixer) => fixer.replaceText(relAttribute, requiredRelAttribute))
|
|
1688
1704
|
});
|
|
1689
1705
|
} };
|
|
1690
1706
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "eslint-plugin-react-dom",
|
|
3
|
-
"version": "5.
|
|
3
|
+
"version": "5.25.0",
|
|
4
4
|
"description": "ESLint React's ESLint plugin for DOM related rules.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"react",
|
|
@@ -37,11 +37,11 @@
|
|
|
37
37
|
"dist"
|
|
38
38
|
],
|
|
39
39
|
"dependencies": {
|
|
40
|
-
"@eslint-react/ast": "5.
|
|
41
|
-
"@eslint-react/eslint": "5.
|
|
42
|
-
"@eslint-react/jsx": "5.
|
|
43
|
-
"@eslint-react/shared": "5.
|
|
44
|
-
"@eslint-react/var": "5.
|
|
40
|
+
"@eslint-react/ast": "5.25.0",
|
|
41
|
+
"@eslint-react/eslint": "5.25.0",
|
|
42
|
+
"@eslint-react/jsx": "5.25.0",
|
|
43
|
+
"@eslint-react/shared": "5.25.0",
|
|
44
|
+
"@eslint-react/var": "5.25.0",
|
|
45
45
|
"@typescript-eslint/types": "^8.71.1",
|
|
46
46
|
"@typescript-eslint/utils": "^8.71.1",
|
|
47
47
|
"compare-versions": "^6.1.1",
|
|
@@ -55,7 +55,7 @@
|
|
|
55
55
|
"@types/react-dom": "^19.3.0",
|
|
56
56
|
"dedent": "^1.7.2",
|
|
57
57
|
"eslint": "^10.12.0",
|
|
58
|
-
"tsdown": "^0.23.
|
|
58
|
+
"tsdown": "^0.23.1",
|
|
59
59
|
"typescript": "6.0.3"
|
|
60
60
|
},
|
|
61
61
|
"peerDependencies": {
|