eslint-plugin-react-dom 5.24.10 → 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.
Files changed (2) hide show
  1. package/dist/index.js +39 -23
  2. 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.24.10";
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
- return value === "noreferrer" || /\bnoreferrer\b/u.test(value);
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
- "add-rel-noreferrer-noopener": `Add 'rel="noreferrer noopener"' to the link to prevent security risks.`,
1650
- default: `Using 'target="_blank"' on an external link without 'rel="noreferrer noopener"' is a security risk.`
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: "no-unsafe-target-blank",
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 relProp = findAttribute(context, node, "rel");
1665
- if (relProp == null) {
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
- node: relProp,
1682
- suggest: [{
1683
- fix(fixer) {
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.24.10",
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.24.10",
41
- "@eslint-react/eslint": "5.24.10",
42
- "@eslint-react/jsx": "5.24.10",
43
- "@eslint-react/shared": "5.24.10",
44
- "@eslint-react/var": "5.24.10",
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.0",
58
+ "tsdown": "^0.23.1",
59
59
  "typescript": "6.0.3"
60
60
  },
61
61
  "peerDependencies": {