@open-xchange/linter-presets 1.23.4 → 1.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/CHANGELOG.md CHANGED
@@ -1,5 +1,16 @@
1
1
  # Changelog
2
2
 
3
+ ## `1.25.0` – 2026-May-18
4
+
5
+ - added: (ESLint) rules `@eslint-react/kit/jsx-shorthand-boolean`, `@eslint-react/kit/prefer-destructuring-assignment` (restored rules via custom reimplementation)
6
+ - removed: (ESLint) custom rule `env-project/no-amd-module-directive`
7
+
8
+ ## `1.24.0` – 2026-May-14
9
+
10
+ - changed: require NodeJS v22.18
11
+ - removed: (ESLint) rule `n/no-missing-import` (plugin v18 fails to resolve TS aliases)
12
+ - chore: bump dependencies
13
+
3
14
  ## `1.23.4` – 2026-May-07
4
15
 
5
16
  - chore: bump dependencies
@@ -487,7 +487,7 @@ interface SharedRuleSettings {
487
487
  alias?: Record<string, string>;
488
488
  }
489
489
  //#endregion
490
- //#region src/eslint/rules/no-invalid-modules.d.ts
490
+ //#region src/eslint/rules/project/noInvalidModules.d.ts
491
491
  /**
492
492
  * Configuration for the rule 'env-project/no-invalid-modules'.
493
493
  */
@@ -498,7 +498,7 @@ interface RuleNoInvalidModulesOptions {
498
498
  external?: string[];
499
499
  }
500
500
  //#endregion
501
- //#region src/eslint/rules/no-invalid-hierarchy.d.ts
501
+ //#region src/eslint/rules/project/noInvalidHierarchy.d.ts
502
502
  /**
503
503
  * Configuration for the rule 'env-project/no-invalid-hierarchy' to specify a
504
504
  * sub package inside a project.
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.mts","names":[],"sources":["../../src/utils/resolver.ts","../../src/utils/utils.ts","../../src/eslint/shared/env-utils.ts","../../src/eslint/core/vue.ts","../../src/eslint/shared/restricted.ts","../../src/eslint/env/node.ts","../../src/eslint/env/browser.ts","../../src/eslint/shared/unittest.ts","../../src/eslint/env/jest.ts","../../src/eslint/env/vitest.ts","../../src/eslint/env/codecept.ts","../../src/eslint/env/react.ts","../../src/eslint/env/eslint.ts","../../src/eslint/shared/rule-utils.ts","../../src/eslint/rules/no-invalid-modules.ts","../../src/eslint/rules/no-invalid-hierarchy.ts","../../src/eslint/env/project.ts","../../src/eslint/env/tsconfig.ts","../../src/eslint/env/decorators.ts","../../src/eslint/index.ts"],"mappings":"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"}
1
+ {"version":3,"file":"index.d.mts","names":[],"sources":["../../src/utils/resolver.ts","../../src/utils/utils.ts","../../src/eslint/shared/env-utils.ts","../../src/eslint/core/vue.ts","../../src/eslint/shared/restricted.ts","../../src/eslint/env/node.ts","../../src/eslint/env/browser.ts","../../src/eslint/shared/unittest.ts","../../src/eslint/env/jest.ts","../../src/eslint/env/vitest.ts","../../src/eslint/env/codecept.ts","../../src/eslint/env/react.ts","../../src/eslint/env/eslint.ts","../../src/eslint/shared/rule-utils.ts","../../src/eslint/rules/project/noInvalidModules.ts","../../src/eslint/rules/project/noInvalidHierarchy.ts","../../src/eslint/env/project.ts","../../src/eslint/env/tsconfig.ts","../../src/eslint/env/decorators.ts","../../src/eslint/index.ts"],"mappings":";;;;;;;;;;cASa,YAAA;EAAA;cAKC,GAAA;;;AALd;;MAcM,IAAA,CAAA;EAdmB;;;;;;;;AA2BN;EAAjB,IAAA,CAAK,IAAA;AAAA;;;KC7BK,YAAA,MAAkB,CAAA,8BAA+B,aAAA,CAAc,YAAA,CAAa,CAAA;;;KCK5E,MAAA,GAAS,cAAA,GAAe,iBAAA,GAAoB,MAAA,CAAO,MAAA,GAAS,QAAA,CAAS,UAAA,CAAW,MAAA;AAAA,KAEhF,SAAA,GAAY,YAAY,CAAC,MAAA;;AFLrC;;UEYiB,eAAA;EFZQ;;;;;EEmBvB,WAAA,GAAc,MAAA,CAAO,WAAW;EFQ3B;;AAAY;;;;AC7BnB;;EC+BE,UAAA;AAAA;;;;UAae,eAAA;ED5C0D;;;AAAc;ECkDvF,OAAA;;;AA7CF;EAkDE,MAAM;AAAA;;;;UAaS,sBAAA;EA/DuC;;;EAoEtD,EAAA;EApE0F;;AAAM;EAyEhG,IAAA;EAvEmB;;;EA4EnB,IAAA;EArEe;;;EA0Ef,GAAA;AAAA;;;;UAMe,gBAAA;EA/DL;AAaZ;;;;EAyDE,MAAA;EAjCe;;;;;;EAyCf,eAAA,GAAkB,sBAAsB;EArBxC;;AAAG;AAML;;;;;;EA0BE,IAAA;EAAA;;;;AAoBM;EAbN,MAAA;EA0B8B;;;;;;;;AAsBvB;AAST;;EA5CE,MAAA;AAAA;AAiDmB;;;AAAA,UApCJ,eAAA;EClJA;;;;AAMC;;EDoJhB,QAAA;;AE5JF;;;;EFmKE,KAAA,EAAO,aAAa;EE3JL;;;;;EFkKf,OAAA;AAAA;;AE/JO;AAMT;;UFkKiB,cAAA,SAAuB,eAAe;EEjKrD;AACO;AAMT;EF+JE,KAAA,GAAQ,aAAA;AAAA;;;;;;UCtLO,UAAA;;;;AHLjB;EGWE,gBAAgB;AAAA;;;;;;UCRD,iBAAA;EACf,IAAA;EACA,OAAO;AAAA;;;;UAMQ,qBAAA;EACf,MAAA;EACA,QAAA;EACA,OAAA;AAAA;;;AJaiB;UIPF,mBAAA;EACf,QAAA;EACA,OAAO;AAAA;;;;UAMQ,kBAAA;EH9B0D;EGgCzE,OAAA,GAAU,iBAAA;EHhC8D;EGkCxE,OAAA,GAAU,iBAAA;EHlCa;EGoCvB,UAAA,GAAa,qBAAA;EHpC8C;EGsC3D,MAAA,GAAS,mBAAA;AAAA;;AHtC8E;;;UG6CxE,qBAAA,SAA8B,eAAA,EAAiB,kBAAkB;;;;;UAMjE,mBAAA,SAA4B,kBAAkB;EF9CS;;;;;EEqDtE,SAAA,GAAY,qBAAA;AAAA;;;;;UAOG,oBAAA,SAA6B,cAAc;EF1DhD;;;;EEgEV,UAAA,GAAa,mBAAA;AAAA;;;KCpEH,yBAAA,IAA6B,OAAA,UAAiB,WAAW;;;;;KAMzD,wBAAA,GAA2B,MAAM,SAAS,yBAAA;;;;;UAMrC,yBAAA;EACf,OAAA;EACA,OAAA;EACA,OAAA,EAAS,yBAAyB;AAAA;;ALWjB;;UKLF,qBAAA;EACf,OAAA;EACA,YAAA;EACA,YAAA;EACA,WAAA,GAAc,wBAAA,GAA2B,yBAAA;EACzC,aAAA;EACA,YAAA;EACA,sBAAA,GAAyB,EAAA,CAAG,MAAA,CAAO,QAAA,CAAS,OAAA,GAAU,KAAA;AAAA;;;;UAMvC,cAAA,SAAuB,oBAAA;EJrCqB;;;;AAA4B;EI4CvF,UAAA,GAAa,eAAA;;;AHvCf;;EG6CE,QAAA,GAAW,qBAAA;AAAA;;;;;;;;;;;;;;iBAkBW,IAAA,CAAK,UAAA,EAAY,cAAA,GAAiB,SAAS;;;;;;UC7DlD,iBAAA,SAA0B,oBAAoB;;ANL/D;;;;;;;;;;;AA2BmB;;;iBM6EK,OAAA,CAAQ,UAAA,EAAY,iBAAA,GAAoB,SAAS;;;;;;UCpGxD,kBAAA,SAA2B,cAAc;;;;APJ1D;;;EOYE,YAAA;;;;;;;;EASA,OAAA;;;;ANvBF;EM6BE,UAAA;AAAA;;;;;;UCzBe,cAAA,SAAuB,kBAAkB;;ARF1D;;;;;;;;;;;AA2BmB;;;;iBQLK,IAAA,CAAK,UAAA,EAAY,cAAA,GAAiB,SAAS;;;;;;UCpBlD,gBAAA,SAAyB,kBAAkB;;ATF5D;;;;;;;;;;;AA2BmB;;;;iBSLK,MAAA,CAAO,UAAA,EAAY,gBAAA,GAAmB,SAAS;;;;;;UCnBtD,kBAAA,SAA2B,cAAc;;;AVH1D;;;;;;;;;;;AA2BmB;iBUNK,QAAA,CAAS,UAAA,EAAY,kBAAA,GAAqB,SAAS;;;;;;UCX1D,eAAA,SAAwB,cAAc;;;;AXVvD;;EWiBE,WAAA;EXjBuB;;;;;EWwBvB,UAAA;AAAA;;AXGiB;;;;AC7BnB;;;;;;;;;;iBU8CwB,KAAA,CAAM,UAAA,EAAY,eAAA,GAAkB,SAAS;;;;;;UC1CpD,gBAAA,SAAyB,cAAc;;;AZFxD;;;;;;;;;;iBYkBwB,MAAA,CAAO,UAAA,EAAY,gBAAA,GAAmB,SAAS;;;;;;UCTtD,kBAAA;;AbTjB;;EacE,KAAA,GAAQ,MAAM;AAAA;;;;;;UCZC,2BAAA;;;;EAKf,QAAQ;AAAA;;;;;;;UCJO,6BAAA;;;AfHjB;EeQE,KAAA;;;;;EAMA,OAAA;EfAI;;;;AAaa;;;;AC7BnB;Ec2BE,QAAA;AAAA;AAAA,KAKU,6BAAA,GAAgC,MAAM,SAAS,6BAAA;;;;;;UC1B1C,iBAAA,SAA0B,cAAA;EhBJ9B;;;EgBSX,KAAA,GAAQ,kBAAA;;;;EAKR,QAAA,GAAW,2BAAA;EhBaX;;;EgBRA,SAAA,GAAY,6BAAA;AAAA;;;AfrBd;;;;;;;iBemCwB,OAAA,CAAQ,UAAA,EAAY,iBAAA,GAAoB,SAAS;;;;;;UCjCxD,kBAAA,SAA2B,cAAc;;;;EAKxD,OAAO;AAAA;;;;;;;;;;iBAce,QAAA,CAAS,UAAA,EAAY,kBAAA,GAAqB,SAAS;;;;;AjBnB3E;;;;;;;;;;;iBkBmBwB,UAAA,CAAW,UAAA,EAAY,cAAA,GAAiB,SAAS;;;;;;UCcxD,cAAA;EnBNE;;;;EmBYjB,IAAA;ElBzCsB;;;EkB8CtB,OAAA;ElB9CyE;;;;EkBoDzE,OAAA;ElBpD4B;;;EkByD5B,QAAA,GAAW,eAAA;ElBzD4E;AAAA;;EkB8DvF,QAAA,GAAW,eAAA;;AjBzDb;;EiB8DE,SAAA,GAAY,gBAAA;EjB9DO;;;EiBmEnB,GAAA,GAAM,UAAA;EjBnE0F;;;EiBwEhG,KAAA,GAAQ,WAAA;AAAA;;;;cAQG,GAAA;EAAA;;;;;;;;;;;;;;;;AjBtDD;AAaZ;;;;AAWQ;AAaR;;;iBiB8CgB,YAAA,CAAa,OAAA,EAAS,cAAA,KAAmB,OAAA,EAAS,KAAA,CAAM,SAAA,KAAc,QAAA,EAAU,YAAA,KAAiB,SAAA,KAAc,YAAA"}
@@ -29,14 +29,15 @@ import vitestPlugin from "@vitest/eslint-plugin";
29
29
  import codeceptPlugin from "eslint-plugin-codeceptjs";
30
30
  import chaiExpectPlugin from "eslint-plugin-chai-expect";
31
31
  import reactPlugin from "@eslint-react/eslint-plugin";
32
+ import reactKit, { merge } from "@eslint-react/kit";
32
33
  import reactHooksPlugin from "eslint-plugin-react-hooks";
33
34
  import { reactRefresh } from "eslint-plugin-react-refresh";
34
35
  import jsxA11yPlugin from "eslint-plugin-jsx-a11y";
35
- import eslintPlugin from "eslint-plugin-eslint-plugin";
36
36
  import { AST_NODE_TYPES, ESLintUtils } from "@typescript-eslint/utils";
37
37
  import { lstatSync } from "node:fs";
38
38
  import pm from "picomatch";
39
39
  import * as find from "empathic/find";
40
+ import eslintPlugin from "eslint-plugin-eslint-plugin";
40
41
  import * as babelParser from "@babel/eslint-parser";
41
42
  //#region src/utils/utils.ts
42
43
  /**
@@ -1163,7 +1164,7 @@ function node(envOptions) {
1163
1164
  restrictedRulesConfig("env.node.restricted", envOptions),
1164
1165
  customRules("env.node.rules", envOptions, {
1165
1166
  "no-console": "off",
1166
- "n/no-missing-import": ["error", { ignoreTypeImport: true }],
1167
+ "n/no-missing-import": "off",
1167
1168
  "n/no-unsupported-features/node-builtins": ["error", { allowExperimental: true }],
1168
1169
  "n/prefer-global/buffer": "error",
1169
1170
  "n/prefer-global/console": "error",
@@ -1450,107 +1451,6 @@ function codecept(envOptions) {
1450
1451
  ];
1451
1452
  }
1452
1453
  //#endregion
1453
- //#region src/eslint/env/react.ts
1454
- /**
1455
- * Creates configuration objects with linter rules for ReactJS.
1456
- *
1457
- * Wraps the following packages:
1458
- * - `@eslint-react/eslint-plugin`
1459
- * - `eslint-plugin-react-hooks`
1460
- * - `eslint-plugin-react-refresh`
1461
- * - `eslint-plugin-jsx-a11y`
1462
- *
1463
- * @param envOptions
1464
- * Configuration options for the environment.
1465
- *
1466
- * @returns
1467
- * The configuration entries to be added to the resulting configuration array.
1468
- */
1469
- function react(envOptions) {
1470
- const reactConfig = reactPlugin.configs["strict-type-checked"];
1471
- const settings = { ...reactConfig.settings };
1472
- if (envOptions.effectHooks?.length) mergeSettings(settings, "react-x", { additionalEffectHooks: `/^(${envOptions.effectHooks.join("|")})$/` });
1473
- if (envOptions.stateHooks?.length) mergeSettings(settings, "react-x", { additionalStateHooks: `/^(${envOptions.stateHooks.join("|")})$/` });
1474
- return [
1475
- createConfig("env.react.recommended", envOptions, {
1476
- languageOptions: {
1477
- parser,
1478
- parserOptions: { projectService: true }
1479
- },
1480
- ...convertRuleWarningsToErrors(reactConfig),
1481
- settings
1482
- }, {
1483
- "@eslint-react/dom-no-unknown-property": "error",
1484
- "@eslint-react/jsx-no-leaked-dollar": "error",
1485
- "@eslint-react/jsx-no-useless-fragment": ["error", { allowEmptyFragment: true }],
1486
- "@eslint-react/naming-convention-context-name": "error",
1487
- "@eslint-react/no-missing-component-display-name": "error",
1488
- "@eslint-react/no-missing-context-display-name": "error"
1489
- }),
1490
- createConfig("env.react.react-hooks", envOptions, convertRuleWarningsToErrors(reactHooksPlugin.configs.flat.recommended), {
1491
- "react-hooks/exhaustive-deps": "off",
1492
- "react-hooks/rules-of-hooks": "off",
1493
- "react-hooks/set-state-in-effect": "off",
1494
- "react-hooks/set-state-in-render": "off"
1495
- }),
1496
- createConfig("env.react.react-refresh", envOptions, reactRefresh.configs.vite()),
1497
- createConfig("env.react.jsx-a11y", envOptions, jsxA11yPlugin.flatConfigs.recommended),
1498
- customRules("env.react.rules", envOptions)
1499
- ];
1500
- }
1501
- //#endregion
1502
- //#region src/eslint/env/eslint.ts
1503
- /**
1504
- * Adds linter rules for ESLint plugin implementations.
1505
- *
1506
- * Wraps the following packages:
1507
- * - `eslint-plugin-eslint-plugin`
1508
- *
1509
- * @param envOptions
1510
- * Configuration options for the environment.
1511
- *
1512
- * @returns
1513
- * The configuration entries to be added to the resulting configuration array.
1514
- */
1515
- function eslint(envOptions) {
1516
- return [createConfig("env.eslint.recommended", envOptions, eslintPlugin.configs["rules-recommended"]), customRules("env.eslint.rules", envOptions, {
1517
- "eslint-plugin/no-property-in-node": "error",
1518
- "eslint-plugin/prefer-placeholders": "error",
1519
- "eslint-plugin/prefer-replace-text": "error",
1520
- "eslint-plugin/require-meta-docs-description": "error"
1521
- })];
1522
- }
1523
- //#endregion
1524
- //#region src/eslint/rules/no-amd-module-directive.ts
1525
- var no_amd_module_directive_default = ESLintUtils.RuleCreator.withoutDocs({
1526
- meta: {
1527
- type: "problem",
1528
- schema: [],
1529
- messages: {
1530
- UNEXPECTED_DIRECTIVE: "Unexpected `<amd-module>` directive.",
1531
- UNEXPECTED_DIRECTIVE_FIX: "Delete the `<amd-module>` directive."
1532
- },
1533
- hasSuggestions: true,
1534
- fixable: "code"
1535
- },
1536
- defaultOptions: [],
1537
- create: (context) => ({ Program(node) {
1538
- const amdComment = node.comments?.find((comment) => /^\/\s*<amd-module/.test(comment.value));
1539
- if (amdComment) {
1540
- const deleteDirective = (fixer) => fixer.removeRange(amdComment.range);
1541
- context.report({
1542
- messageId: "UNEXPECTED_DIRECTIVE",
1543
- loc: amdComment.loc,
1544
- fix: deleteDirective,
1545
- suggest: [{
1546
- messageId: "UNEXPECTED_DIRECTIVE_FIX",
1547
- fix: deleteDirective
1548
- }]
1549
- });
1550
- }
1551
- } })
1552
- });
1553
- //#endregion
1554
1454
  //#region src/eslint/shared/rule-utils.ts
1555
1455
  const FILE_EXTENSIONS = [
1556
1456
  "js",
@@ -1607,6 +1507,70 @@ const Schema = {
1607
1507
  }
1608
1508
  };
1609
1509
  /**
1510
+ * Returns whether the passed AST node is an `Identifier `node.
1511
+ *
1512
+ * @param node
1513
+ * The AST node to be checked.
1514
+ *
1515
+ * @returns
1516
+ * Whether the passed AST node is an `Identifier` node.
1517
+ */
1518
+ function isIdentifier(node) {
1519
+ return node?.type === AST_NODE_TYPES.Identifier;
1520
+ }
1521
+ /**
1522
+ * Returns whether the passed AST node is a `Literal` node.
1523
+ *
1524
+ * @param node
1525
+ * The AST node to be checked.
1526
+ *
1527
+ * @returns
1528
+ * Whether the passed AST node is a `Literal` node.
1529
+ */
1530
+ function isLiteral(node) {
1531
+ return node?.type === AST_NODE_TYPES.Literal;
1532
+ }
1533
+ /**
1534
+ * Returns whether the passed AST node is a `Literal` node with a specific
1535
+ * constant value.
1536
+ *
1537
+ * @param node
1538
+ * The AST node to be checked.
1539
+ *
1540
+ * @param value
1541
+ * The expected literal value.
1542
+ *
1543
+ * @returns
1544
+ * Whether the passed AST node is a `Literal` node with a constant value.
1545
+ */
1546
+ function isLiteralValue(node, value) {
1547
+ return isLiteral(node) && node.value === value;
1548
+ }
1549
+ /**
1550
+ * Returns whether the passed AST node is an `AssignmentExpression` node.
1551
+ *
1552
+ * @param node
1553
+ * The AST node to be checked.
1554
+ *
1555
+ * @returns
1556
+ * Whether the passed AST node is an `AssignmentExpression` node.
1557
+ */
1558
+ function isAssignmentExpression(node) {
1559
+ return node?.type === AST_NODE_TYPES.AssignmentExpression;
1560
+ }
1561
+ /**
1562
+ * Returns whether the passed AST node is a `MemberExpression` node.
1563
+ *
1564
+ * @param node
1565
+ * The AST node to be checked.
1566
+ *
1567
+ * @returns
1568
+ * Whether the passed AST node is a `MemberExpression` node.
1569
+ */
1570
+ function isMemberExpression(node) {
1571
+ return node?.type === AST_NODE_TYPES.MemberExpression;
1572
+ }
1573
+ /**
1610
1574
  * Returns a passed array unmodified, converts the value `undefined` to an
1611
1575
  * empty array, and converts all other values to an array with one element.
1612
1576
  *
@@ -1794,8 +1758,129 @@ var ProjectContext = class {
1794
1758
  }
1795
1759
  };
1796
1760
  //#endregion
1797
- //#region src/eslint/rules/no-invalid-modules.ts
1798
- var no_invalid_modules_default = ESLintUtils.RuleCreator.withoutDocs({
1761
+ //#region src/eslint/rules/react/jsxShorthandBoolean.ts
1762
+ /**
1763
+ * Enforce shorthand notation for boolean JSX attributes.
1764
+ *
1765
+ * @returns
1766
+ * The rule implementation.
1767
+ */
1768
+ function jsxShorthandBoolean() {
1769
+ return (context, toolkit) => ({ JSXAttribute(node) {
1770
+ const value = node.value;
1771
+ if (value?.type !== AST_NODE_TYPES.JSXExpressionContainer) return;
1772
+ if (isLiteralValue(toolkit.ast.unwrap(value.expression), true)) context.report({
1773
+ node,
1774
+ message: "Omit the value for boolean attributes.",
1775
+ fix: (fixer) => fixer.removeRange([node.name.range[1], value.range[1]])
1776
+ });
1777
+ } });
1778
+ }
1779
+ //#endregion
1780
+ //#region src/eslint/rules/react/preferDestructuringAssignment.ts
1781
+ /**
1782
+ * Enforce destructuring assignment for component props.
1783
+ *
1784
+ * @returns
1785
+ * The rule implementation.
1786
+ */
1787
+ function preferDestructuringAssignment() {
1788
+ return (context, toolkit) => {
1789
+ const components = toolkit.collect.components(context);
1790
+ return merge(components.visitor, { "Program:exit"(program) {
1791
+ for (const component of components.query.all(program)) {
1792
+ const param = component.node.params[0];
1793
+ if (!isIdentifier(param)) continue;
1794
+ const variable = context.sourceCode.getScope(component.node).variables.find((v) => v.name === param.name);
1795
+ if (!variable?.references) continue;
1796
+ for (const reference of variable.references) {
1797
+ const parent = reference.identifier.parent;
1798
+ if (!isMemberExpression(parent)) continue;
1799
+ if (isAssignmentExpression(parent.parent) && parent === parent.parent.left) continue;
1800
+ context.report({
1801
+ node: parent,
1802
+ message: "Use destructuring assignment for component props."
1803
+ });
1804
+ }
1805
+ }
1806
+ } });
1807
+ };
1808
+ }
1809
+ //#endregion
1810
+ //#region src/eslint/env/react.ts
1811
+ /**
1812
+ * Creates configuration objects with linter rules for ReactJS.
1813
+ *
1814
+ * Wraps the following packages:
1815
+ * - `@eslint-react/eslint-plugin`
1816
+ * - `eslint-plugin-react-hooks`
1817
+ * - `eslint-plugin-react-refresh`
1818
+ * - `eslint-plugin-jsx-a11y`
1819
+ *
1820
+ * @param envOptions
1821
+ * Configuration options for the environment.
1822
+ *
1823
+ * @returns
1824
+ * The configuration entries to be added to the resulting configuration array.
1825
+ */
1826
+ function react(envOptions) {
1827
+ const reactConfig = reactPlugin.configs["strict-type-checked"];
1828
+ const settings = { ...reactConfig.settings };
1829
+ if (envOptions.effectHooks?.length) mergeSettings(settings, "react-x", { additionalEffectHooks: `/^(${envOptions.effectHooks.join("|")})$/` });
1830
+ if (envOptions.stateHooks?.length) mergeSettings(settings, "react-x", { additionalStateHooks: `/^(${envOptions.stateHooks.join("|")})$/` });
1831
+ return [
1832
+ createConfig("env.react.recommended", envOptions, {
1833
+ languageOptions: {
1834
+ parser,
1835
+ parserOptions: { projectService: true }
1836
+ },
1837
+ ...convertRuleWarningsToErrors(reactConfig),
1838
+ settings
1839
+ }, {
1840
+ "@eslint-react/dom-no-unknown-property": "error",
1841
+ "@eslint-react/jsx-no-leaked-dollar": "error",
1842
+ "@eslint-react/jsx-no-useless-fragment": ["error", { allowEmptyFragment: true }],
1843
+ "@eslint-react/naming-convention-context-name": "error",
1844
+ "@eslint-react/no-missing-component-display-name": "error",
1845
+ "@eslint-react/no-missing-context-display-name": "error"
1846
+ }),
1847
+ createConfig("env.react.recommended", envOptions, { extends: [reactKit().use(jsxShorthandBoolean).use(preferDestructuringAssignment).getConfig()] }),
1848
+ createConfig("env.react.react-hooks", envOptions, convertRuleWarningsToErrors(reactHooksPlugin.configs.flat.recommended), {
1849
+ "react-hooks/exhaustive-deps": "off",
1850
+ "react-hooks/rules-of-hooks": "off",
1851
+ "react-hooks/set-state-in-effect": "off",
1852
+ "react-hooks/set-state-in-render": "off"
1853
+ }),
1854
+ createConfig("env.react.react-refresh", envOptions, reactRefresh.configs.vite()),
1855
+ createConfig("env.react.jsx-a11y", envOptions, jsxA11yPlugin.flatConfigs.recommended),
1856
+ customRules("env.react.rules", envOptions)
1857
+ ];
1858
+ }
1859
+ //#endregion
1860
+ //#region src/eslint/env/eslint.ts
1861
+ /**
1862
+ * Adds linter rules for ESLint plugin implementations.
1863
+ *
1864
+ * Wraps the following packages:
1865
+ * - `eslint-plugin-eslint-plugin`
1866
+ *
1867
+ * @param envOptions
1868
+ * Configuration options for the environment.
1869
+ *
1870
+ * @returns
1871
+ * The configuration entries to be added to the resulting configuration array.
1872
+ */
1873
+ function eslint(envOptions) {
1874
+ return [createConfig("env.eslint.recommended", envOptions, eslintPlugin.configs["rules-recommended"]), customRules("env.eslint.rules", envOptions, {
1875
+ "eslint-plugin/no-property-in-node": "error",
1876
+ "eslint-plugin/prefer-placeholders": "error",
1877
+ "eslint-plugin/prefer-replace-text": "error",
1878
+ "eslint-plugin/require-meta-docs-description": "error"
1879
+ })];
1880
+ }
1881
+ //#endregion
1882
+ //#region src/eslint/rules/project/noInvalidModules.ts
1883
+ var noInvalidModules_default = ESLintUtils.RuleCreator.withoutDocs({
1799
1884
  meta: {
1800
1885
  type: "problem",
1801
1886
  schema: [Schema.options({ external: Schema.array(Schema.stringNE()) })],
@@ -1821,8 +1906,8 @@ var no_invalid_modules_default = ESLintUtils.RuleCreator.withoutDocs({
1821
1906
  }
1822
1907
  });
1823
1908
  //#endregion
1824
- //#region src/eslint/rules/no-invalid-hierarchy.ts
1825
- var no_invalid_hierarchy_default = ESLintUtils.RuleCreator.withoutDocs({
1909
+ //#region src/eslint/rules/project/noInvalidHierarchy.ts
1910
+ var noInvalidHierarchy_default = ESLintUtils.RuleCreator.withoutDocs({
1826
1911
  meta: {
1827
1912
  type: "problem",
1828
1913
  schema: [Schema.dictionary(Schema.options({
@@ -1891,13 +1976,11 @@ var no_invalid_hierarchy_default = ESLintUtils.RuleCreator.withoutDocs({
1891
1976
  function project(envOptions) {
1892
1977
  return [createConfig("env.project.plugin", envOptions, {
1893
1978
  plugins: { "env-project": { rules: {
1894
- "no-amd-module-directive": no_amd_module_directive_default,
1895
- "no-invalid-modules": no_invalid_modules_default,
1896
- "no-invalid-hierarchy": no_invalid_hierarchy_default
1979
+ "no-invalid-modules": noInvalidModules_default,
1980
+ "no-invalid-hierarchy": noInvalidHierarchy_default
1897
1981
  } } },
1898
1982
  settings: { "env-project": { alias: envOptions.alias } }
1899
1983
  }), customRules("env.project.rules", envOptions, {
1900
- "env-project/no-amd-module-directive": "error",
1901
1984
  "env-project/no-invalid-modules": ["error", { external: envOptions.external ?? [] }],
1902
1985
  "env-project/no-invalid-hierarchy": envOptions.hierarchy ? ["error", envOptions.hierarchy] : "off"
1903
1986
  })];