@xylabs/eslint-config-react-flat 8.2.0 → 8.2.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/README.md CHANGED
@@ -49,6 +49,20 @@ const eslintConfig: Linter.Config[] = [
49
49
  export default eslintConfig
50
50
  ```
51
51
 
52
+ ### Tiered presets
53
+
54
+ React layers are added at **tier 2 (best practices)** and above. Lower tiers match `@xylabs/eslint-config-flat` without React rules.
55
+
56
+ | Export | Description |
57
+ |--------|-------------|
58
+ | `correctnessConfig` / `correctnessTypeCheckedConfig` | Base tier 0 only |
59
+ | `consistencyConfig` / `consistencyTypeCheckedConfig` | Base tier 1 only |
60
+ | `bestPracticesConfig` / `bestPracticesTypeCheckedConfig` | Base + React (**default** without storybook) |
61
+ | `opinionatedConfig` / `opinionatedTypeCheckedConfig` | Stricter optional rules |
62
+ | `strictConfig` / `strictTypeCheckedConfig` | Opinionated + SonarJS at error severity |
63
+
64
+ `config` includes storybook support via `recommendedTypeCheckedWithStorybookConfig`.
65
+
52
66
  ### Extending with custom rules
53
67
 
54
68
  ```ts
@@ -1,9 +1,3 @@
1
- import type { Linter } from 'eslint';
2
- export declare const reactStorybookConfig: Linter.Config[];
3
- export declare const recommendedConfig: Linter.Config[];
4
- export declare const recommendedTypeCheckedConfig: Linter.Config[];
5
- export declare const recommendedTypeCheckedWithStorybookConfig: Linter.Config[];
6
- export declare const config: Linter.Config[];
7
- export { reactConfig, reactRecommendedConfig, reactRecommendedTypeCheckedConfig, } from './react/index.ts';
8
1
  export { storybookConfig } from './storybook/index.ts';
2
+ export * from './tiers/index.ts';
9
3
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAQpC,eAAO,MAAM,oBAAoB,EAAE,MAAM,CAAC,MAAM,EAAyB,CAAA;AAEzE,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAwD,CAAA;AAErG,eAAO,MAAM,4BAA4B,EAAE,MAAM,CAAC,MAAM,EAGvD,CAAA;AAED,eAAO,MAAM,yCAAyC,EAAE,MAAM,CAAC,MAAM,EAGpE,CAAA;AAGD,eAAO,MAAM,MAAM,EAAE,MAAM,CAAC,MAAM,EAA8C,CAAA;AAEhF,OAAO,EACL,WAAW,EAAE,sBAAsB,EAAE,iCAAiC,GACvE,MAAM,kBAAkB,CAAA;AACzB,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AACtD,cAAc,kBAAkB,CAAA"}
@@ -1,7 +1,19 @@
1
- // src/index.ts
1
+ // src/storybook/index.ts
2
+ import storybook from "eslint-plugin-storybook";
3
+ var storybookConfig = storybook.configs["flat/recommended"];
4
+
5
+ // src/tiers/index.ts
2
6
  import {
3
- recommendedConfig as xyRecommendedConfig,
4
- recommendedTypeCheckedConfig as xyRecommendedTypeCheckedConfig
7
+ configTier0Correctness,
8
+ configTier0CorrectnessTypeChecked,
9
+ configTier1Consistency,
10
+ configTier1ConsistencyTypeChecked,
11
+ configTier2BestPractices,
12
+ configTier2BestPracticesTypeChecked,
13
+ configTier3Opinionated,
14
+ configTier3OpinionatedTypeChecked,
15
+ configTier4Strict,
16
+ configTier4StrictTypeChecked
5
17
  } from "@xylabs/eslint-config-flat";
6
18
 
7
19
  // src/react/index.ts
@@ -63,38 +75,68 @@ function createReactOverride(typeChecked = false) {
63
75
  }
64
76
  };
65
77
  }
66
- var reactRecommendedConfig = [
78
+ var reactBestPracticesConfig = [
67
79
  ...scopeReactConfigs(reactPlugin.configs["strict-typescript"]),
68
80
  createReactOverride()
69
81
  ];
70
- var reactRecommendedTypeCheckedConfig = [
82
+ var reactBestPracticesTypeCheckedConfig = [
71
83
  ...scopeReactConfigs(reactPlugin.configs["strict-type-checked"], true),
72
84
  createReactOverride(true)
73
85
  ];
74
- var reactConfig = reactRecommendedTypeCheckedConfig;
75
86
 
76
- // src/storybook/index.ts
77
- import storybook from "eslint-plugin-storybook";
78
- var storybookConfig = storybook.configs["flat/recommended"];
79
-
80
- // src/index.ts
81
- var reactStorybookConfig = [...storybookConfig];
82
- var recommendedConfig = [...xyRecommendedConfig, ...reactRecommendedConfig];
83
- var recommendedTypeCheckedConfig = [
84
- ...xyRecommendedTypeCheckedConfig,
85
- ...reactRecommendedTypeCheckedConfig
86
- ];
87
- var recommendedTypeCheckedWithStorybookConfig = [
88
- ...recommendedTypeCheckedConfig,
89
- ...reactStorybookConfig
90
- ];
87
+ // src/tiers/index.ts
88
+ function mergeTierConfigs(...parts) {
89
+ return parts.flat();
90
+ }
91
+ var configReactStorybook = [...storybookConfig];
92
+ var configReactTier0Correctness = [...configTier0Correctness];
93
+ var configReactTier0CorrectnessTypeChecked = [...configTier0CorrectnessTypeChecked];
94
+ var configReactTier1Consistency = [...configTier1Consistency];
95
+ var configReactTier1ConsistencyTypeChecked = [...configTier1ConsistencyTypeChecked];
96
+ var configReactTier2BestPractices = mergeTierConfigs(
97
+ configTier2BestPractices,
98
+ reactBestPracticesConfig
99
+ );
100
+ var configReactTier2BestPracticesTypeChecked = mergeTierConfigs(
101
+ configTier2BestPracticesTypeChecked,
102
+ reactBestPracticesTypeCheckedConfig
103
+ );
104
+ var configReactTier3Oopinionated = mergeTierConfigs(
105
+ configTier3Opinionated,
106
+ reactBestPracticesTypeCheckedConfig
107
+ );
108
+ var configReactTier3OpinionatedTypeChecked = mergeTierConfigs(
109
+ configTier3OpinionatedTypeChecked,
110
+ reactBestPracticesTypeCheckedConfig
111
+ );
112
+ var configReactTier4Strict = mergeTierConfigs(
113
+ configTier4Strict,
114
+ reactBestPracticesTypeCheckedConfig
115
+ );
116
+ var configReactTier4StrictTypeChecked = mergeTierConfigs(
117
+ configTier4StrictTypeChecked,
118
+ reactBestPracticesTypeCheckedConfig
119
+ );
120
+ var recommendedConfig = configReactTier2BestPractices;
121
+ var recommendedTypeCheckedConfig = configReactTier2BestPracticesTypeChecked;
122
+ var recommendedTypeCheckedWithStorybookConfig = mergeTierConfigs(
123
+ configReactTier2BestPracticesTypeChecked,
124
+ configReactStorybook
125
+ );
91
126
  var config = recommendedTypeCheckedWithStorybookConfig;
92
127
  export {
93
128
  config,
94
- reactConfig,
95
- reactRecommendedConfig,
96
- reactRecommendedTypeCheckedConfig,
97
- reactStorybookConfig,
129
+ configReactStorybook,
130
+ configReactTier0Correctness,
131
+ configReactTier0CorrectnessTypeChecked,
132
+ configReactTier1Consistency,
133
+ configReactTier1ConsistencyTypeChecked,
134
+ configReactTier2BestPractices,
135
+ configReactTier2BestPracticesTypeChecked,
136
+ configReactTier3Oopinionated,
137
+ configReactTier3OpinionatedTypeChecked,
138
+ configReactTier4Strict,
139
+ configReactTier4StrictTypeChecked,
98
140
  recommendedConfig,
99
141
  recommendedTypeCheckedConfig,
100
142
  recommendedTypeCheckedWithStorybookConfig,
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../../src/index.ts", "../../src/react/index.ts", "../../src/storybook/index.ts"],
4
- "sourcesContent": ["import {\n recommendedConfig as xyRecommendedConfig,\n recommendedTypeCheckedConfig as xyRecommendedTypeCheckedConfig,\n} from '@xylabs/eslint-config-flat'\nimport type { Linter } from 'eslint'\n\nimport {\n reactRecommendedConfig,\n reactRecommendedTypeCheckedConfig,\n} from './react/index.ts'\nimport { storybookConfig } from './storybook/index.ts'\n\nexport const reactStorybookConfig: Linter.Config[] = [...storybookConfig]\n\nexport const recommendedConfig: Linter.Config[] = [...xyRecommendedConfig, ...reactRecommendedConfig]\n\nexport const recommendedTypeCheckedConfig: Linter.Config[] = [\n ...xyRecommendedTypeCheckedConfig,\n ...reactRecommendedTypeCheckedConfig,\n]\n\nexport const recommendedTypeCheckedWithStorybookConfig: Linter.Config[] = [\n ...recommendedTypeCheckedConfig,\n ...reactStorybookConfig,\n]\n\n// Compatibility export for existing consumers.\nexport const config: Linter.Config[] = recommendedTypeCheckedWithStorybookConfig\n\nexport {\n reactConfig, reactRecommendedConfig, reactRecommendedTypeCheckedConfig,\n} from './react/index.ts'\nexport { storybookConfig } from './storybook/index.ts'\n", "import tsParser from '@typescript-eslint/parser'\nimport type { ESLint, Linter } from 'eslint'\nimport reactDomPlugin from 'eslint-plugin-react-dom'\nimport reactHooksPlugin from 'eslint-plugin-react-hooks'\nimport reactNamingConventionPlugin from 'eslint-plugin-react-naming-convention'\nimport eslintReactRefreshPlugin from 'eslint-plugin-react-refresh'\nimport reactWebApiPlugin from 'eslint-plugin-react-web-api'\nimport reactPlugin from 'eslint-plugin-react-x'\nimport globals from 'globals'\n\nconst reactFiles = ['**/*.{ts,tsx,mts,cts,js,jsx,mjs,cjs}']\n\nfunction scopeReactConfigs(\n configs: Linter.Config | Linter.Config[],\n typeChecked = false,\n): Linter.Config[] {\n return (Array.isArray(configs) ? configs : [configs]).map(config => ({\n ...config,\n files: reactFiles,\n languageOptions: {\n parser: tsParser,\n ...config.languageOptions,\n globals: {\n ...(globals.browser as Record<string, boolean>),\n ...(config.languageOptions?.globals as Record<string, unknown> | undefined),\n },\n parserOptions: {\n ecmaFeatures: { jsx: true },\n ...(config.languageOptions?.parserOptions as Record<string, unknown> | undefined),\n ...(typeChecked && { projectService: true, tsconfigRootDir: process.cwd() }),\n },\n },\n }))\n}\n\nfunction createReactOverride(typeChecked = false): Linter.Config {\n return {\n files: reactFiles,\n languageOptions: {\n parser: tsParser,\n parserOptions: {\n ecmaFeatures: { jsx: true },\n ...(typeChecked && { projectService: true, tsconfigRootDir: process.cwd() }),\n },\n globals: { ...globals.browser },\n },\n plugins: {\n 'react-dom': reactDomPlugin,\n 'react-web-api': reactWebApiPlugin,\n 'react-refresh': eslintReactRefreshPlugin,\n 'react-hooks': reactHooksPlugin as unknown as ESLint.Plugin,\n 'react-naming-convention': reactNamingConventionPlugin,\n },\n rules: {\n ...reactDomPlugin.configs.strict.rules,\n ...reactWebApiPlugin.configs.recommended.rules,\n ...reactHooksPlugin.configs.flat.recommended.rules,\n ...reactNamingConventionPlugin.configs.recommended.rules,\n ...eslintReactRefreshPlugin.configs.recommended.rules,\n 'react-refresh/only-export-components': ['warn', { allowConstantExport: true }],\n 'react-hooks/use-memo': 'warn',\n 'react-hooks/set-state-in-effect': 'warn',\n },\n }\n}\n\nexport const reactRecommendedConfig: Linter.Config[] = [\n ...scopeReactConfigs(reactPlugin.configs['strict-typescript']),\n createReactOverride(),\n]\n\nexport const reactRecommendedTypeCheckedConfig: Linter.Config[] = [\n ...scopeReactConfigs(reactPlugin.configs['strict-type-checked'], true),\n createReactOverride(true),\n]\n\nexport const reactConfig: Linter.Config[] = reactRecommendedTypeCheckedConfig\n", "import type { Linter } from 'eslint'\nimport storybook from 'eslint-plugin-storybook'\n\nexport const storybookConfig: Linter.Config[] = storybook.configs['flat/recommended'] as Linter.Config[]\n"],
5
- "mappings": ";AAAA;AAAA,EACE,qBAAqB;AAAA,EACrB,gCAAgC;AAAA,OAC3B;;;ACHP,OAAO,cAAc;AAErB,OAAO,oBAAoB;AAC3B,OAAO,sBAAsB;AAC7B,OAAO,iCAAiC;AACxC,OAAO,8BAA8B;AACrC,OAAO,uBAAuB;AAC9B,OAAO,iBAAiB;AACxB,OAAO,aAAa;AAEpB,IAAM,aAAa,CAAC,sCAAsC;AAE1D,SAAS,kBACP,SACA,cAAc,OACG;AACjB,UAAQ,MAAM,QAAQ,OAAO,IAAI,UAAU,CAAC,OAAO,GAAG,IAAI,CAAAA,aAAW;AAAA,IACnE,GAAGA;AAAA,IACH,OAAO;AAAA,IACP,iBAAiB;AAAA,MACf,QAAQ;AAAA,MACR,GAAGA,QAAO;AAAA,MACV,SAAS;AAAA,QACP,GAAI,QAAQ;AAAA,QACZ,GAAIA,QAAO,iBAAiB;AAAA,MAC9B;AAAA,MACA,eAAe;AAAA,QACb,cAAc,EAAE,KAAK,KAAK;AAAA,QAC1B,GAAIA,QAAO,iBAAiB;AAAA,QAC5B,GAAI,eAAe,EAAE,gBAAgB,MAAM,iBAAiB,QAAQ,IAAI,EAAE;AAAA,MAC5E;AAAA,IACF;AAAA,EACF,EAAE;AACJ;AAEA,SAAS,oBAAoB,cAAc,OAAsB;AAC/D,SAAO;AAAA,IACL,OAAO;AAAA,IACP,iBAAiB;AAAA,MACf,QAAQ;AAAA,MACR,eAAe;AAAA,QACb,cAAc,EAAE,KAAK,KAAK;AAAA,QAC1B,GAAI,eAAe,EAAE,gBAAgB,MAAM,iBAAiB,QAAQ,IAAI,EAAE;AAAA,MAC5E;AAAA,MACA,SAAS,EAAE,GAAG,QAAQ,QAAQ;AAAA,IAChC;AAAA,IACA,SAAS;AAAA,MACP,aAAa;AAAA,MACb,iBAAiB;AAAA,MACjB,iBAAiB;AAAA,MACjB,eAAe;AAAA,MACf,2BAA2B;AAAA,IAC7B;AAAA,IACA,OAAO;AAAA,MACL,GAAG,eAAe,QAAQ,OAAO;AAAA,MACjC,GAAG,kBAAkB,QAAQ,YAAY;AAAA,MACzC,GAAG,iBAAiB,QAAQ,KAAK,YAAY;AAAA,MAC7C,GAAG,4BAA4B,QAAQ,YAAY;AAAA,MACnD,GAAG,yBAAyB,QAAQ,YAAY;AAAA,MAChD,wCAAwC,CAAC,QAAQ,EAAE,qBAAqB,KAAK,CAAC;AAAA,MAC9E,wBAAwB;AAAA,MACxB,mCAAmC;AAAA,IACrC;AAAA,EACF;AACF;AAEO,IAAM,yBAA0C;AAAA,EACrD,GAAG,kBAAkB,YAAY,QAAQ,mBAAmB,CAAC;AAAA,EAC7D,oBAAoB;AACtB;AAEO,IAAM,oCAAqD;AAAA,EAChE,GAAG,kBAAkB,YAAY,QAAQ,qBAAqB,GAAG,IAAI;AAAA,EACrE,oBAAoB,IAAI;AAC1B;AAEO,IAAM,cAA+B;;;AC3E5C,OAAO,eAAe;AAEf,IAAM,kBAAmC,UAAU,QAAQ,kBAAkB;;;AFS7E,IAAM,uBAAwC,CAAC,GAAG,eAAe;AAEjE,IAAM,oBAAqC,CAAC,GAAG,qBAAqB,GAAG,sBAAsB;AAE7F,IAAM,+BAAgD;AAAA,EAC3D,GAAG;AAAA,EACH,GAAG;AACL;AAEO,IAAM,4CAA6D;AAAA,EACxE,GAAG;AAAA,EACH,GAAG;AACL;AAGO,IAAM,SAA0B;",
3
+ "sources": ["../../src/storybook/index.ts", "../../src/tiers/index.ts", "../../src/react/index.ts"],
4
+ "sourcesContent": ["import type { Linter } from 'eslint'\nimport storybook from 'eslint-plugin-storybook'\n\nexport const storybookConfig: Linter.Config[] = storybook.configs['flat/recommended'] as Linter.Config[]\n", "import {\n configTier0Correctness, configTier0CorrectnessTypeChecked, configTier1Consistency,\n configTier1ConsistencyTypeChecked,\n configTier2BestPractices,\n configTier2BestPracticesTypeChecked,\n configTier3Opinionated,\n configTier3OpinionatedTypeChecked,\n configTier4Strict,\n configTier4StrictTypeChecked,\n} from '@xylabs/eslint-config-flat'\nimport type { Linter } from 'eslint'\n\nimport {\n reactBestPracticesConfig,\n reactBestPracticesTypeCheckedConfig,\n} from '../react/index.ts'\nimport { storybookConfig } from '../storybook/index.ts'\n\nfunction mergeTierConfigs(...parts: readonly Linter.Config[][]): Linter.Config[] {\n return parts.flat()\n}\n\nexport const configReactStorybook: Linter.Config[] = [...storybookConfig]\n\nexport const configReactTier0Correctness: Linter.Config[] = [...configTier0Correctness]\n\nexport const configReactTier0CorrectnessTypeChecked: Linter.Config[] = [...configTier0CorrectnessTypeChecked]\n\nexport const configReactTier1Consistency: Linter.Config[] = [...configTier1Consistency]\n\nexport const configReactTier1ConsistencyTypeChecked: Linter.Config[] = [...configTier1ConsistencyTypeChecked]\n\nexport const configReactTier2BestPractices: Linter.Config[] = mergeTierConfigs(\n configTier2BestPractices,\n reactBestPracticesConfig,\n)\n\nexport const configReactTier2BestPracticesTypeChecked: Linter.Config[] = mergeTierConfigs(\n configTier2BestPracticesTypeChecked,\n reactBestPracticesTypeCheckedConfig,\n)\n\nexport const configReactTier3Oopinionated: Linter.Config[] = mergeTierConfigs(\n configTier3Opinionated,\n reactBestPracticesTypeCheckedConfig,\n)\n\nexport const configReactTier3OpinionatedTypeChecked: Linter.Config[] = mergeTierConfigs(\n configTier3OpinionatedTypeChecked,\n reactBestPracticesTypeCheckedConfig,\n)\n\nexport const configReactTier4Strict: Linter.Config[] = mergeTierConfigs(\n configTier4Strict,\n reactBestPracticesTypeCheckedConfig,\n)\n\nexport const configReactTier4StrictTypeChecked: Linter.Config[] = mergeTierConfigs(\n configTier4StrictTypeChecked,\n reactBestPracticesTypeCheckedConfig,\n)\n\n/** @deprecated Use `configReactTier2BestPractices` instead. */\nexport const recommendedConfig: Linter.Config[] = configReactTier2BestPractices\n\n/** @deprecated Use `configReactTier2BestPracticesTypeChecked` instead. */\nexport const recommendedTypeCheckedConfig: Linter.Config[] = configReactTier2BestPracticesTypeChecked\n\nexport const recommendedTypeCheckedWithStorybookConfig: Linter.Config[] = mergeTierConfigs(\n configReactTier2BestPracticesTypeChecked,\n configReactStorybook,\n)\n\nexport const config: Linter.Config[] = recommendedTypeCheckedWithStorybookConfig\n", "import tsParser from '@typescript-eslint/parser'\nimport type { ESLint, Linter } from 'eslint'\nimport reactDomPlugin from 'eslint-plugin-react-dom'\nimport reactHooksPlugin from 'eslint-plugin-react-hooks'\nimport reactNamingConventionPlugin from 'eslint-plugin-react-naming-convention'\nimport eslintReactRefreshPlugin from 'eslint-plugin-react-refresh'\nimport reactWebApiPlugin from 'eslint-plugin-react-web-api'\nimport reactPlugin from 'eslint-plugin-react-x'\nimport globals from 'globals'\n\nconst reactFiles = ['**/*.{ts,tsx,mts,cts,js,jsx,mjs,cjs}']\n\nfunction scopeReactConfigs(\n configs: Linter.Config | Linter.Config[],\n typeChecked = false,\n): Linter.Config[] {\n return (Array.isArray(configs) ? configs : [configs]).map(config => ({\n ...config,\n files: reactFiles,\n languageOptions: {\n parser: tsParser,\n ...config.languageOptions,\n globals: {\n ...(globals.browser as Record<string, boolean>),\n ...(config.languageOptions?.globals as Record<string, unknown> | undefined),\n },\n parserOptions: {\n ecmaFeatures: { jsx: true },\n ...(config.languageOptions?.parserOptions as Record<string, unknown> | undefined),\n ...(typeChecked && { projectService: true, tsconfigRootDir: process.cwd() }),\n },\n },\n }))\n}\n\nfunction createReactOverride(typeChecked = false): Linter.Config {\n return {\n files: reactFiles,\n languageOptions: {\n parser: tsParser,\n parserOptions: {\n ecmaFeatures: { jsx: true },\n ...(typeChecked && { projectService: true, tsconfigRootDir: process.cwd() }),\n },\n globals: { ...globals.browser },\n },\n plugins: {\n 'react-dom': reactDomPlugin,\n 'react-web-api': reactWebApiPlugin,\n 'react-refresh': eslintReactRefreshPlugin,\n 'react-hooks': reactHooksPlugin as unknown as ESLint.Plugin,\n 'react-naming-convention': reactNamingConventionPlugin,\n },\n rules: {\n ...reactDomPlugin.configs.strict.rules,\n ...reactWebApiPlugin.configs.recommended.rules,\n ...reactHooksPlugin.configs.flat.recommended.rules,\n ...reactNamingConventionPlugin.configs.recommended.rules,\n ...eslintReactRefreshPlugin.configs.recommended.rules,\n 'react-refresh/only-export-components': ['warn', { allowConstantExport: true }],\n 'react-hooks/use-memo': 'warn',\n 'react-hooks/set-state-in-effect': 'warn',\n },\n }\n}\n\nexport const reactBestPracticesConfig: Linter.Config[] = [\n ...scopeReactConfigs(reactPlugin.configs['strict-typescript']),\n createReactOverride(),\n]\n\nexport const reactBestPracticesTypeCheckedConfig: Linter.Config[] = [\n ...scopeReactConfigs(reactPlugin.configs['strict-type-checked'], true),\n createReactOverride(true),\n]\n\n/** @deprecated Use `reactBestPracticesConfig` instead. */\nexport const reactRecommendedConfig: Linter.Config[] = reactBestPracticesConfig\n\n/** @deprecated Use `reactBestPracticesTypeCheckedConfig` instead. */\nexport const reactRecommendedTypeCheckedConfig: Linter.Config[] = reactBestPracticesTypeCheckedConfig\n\nexport const reactConfig: Linter.Config[] = reactBestPracticesTypeCheckedConfig\n"],
5
+ "mappings": "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",
6
6
  "names": ["config"]
7
7
  }
@@ -1,5 +1,9 @@
1
1
  import type { Linter } from 'eslint';
2
+ export declare const reactBestPracticesConfig: Linter.Config[];
3
+ export declare const reactBestPracticesTypeCheckedConfig: Linter.Config[];
4
+ /** @deprecated Use `reactBestPracticesConfig` instead. */
2
5
  export declare const reactRecommendedConfig: Linter.Config[];
6
+ /** @deprecated Use `reactBestPracticesTypeCheckedConfig` instead. */
3
7
  export declare const reactRecommendedTypeCheckedConfig: Linter.Config[];
4
8
  export declare const reactConfig: Linter.Config[];
5
9
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/react/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAU,MAAM,EAAE,MAAM,QAAQ,CAAA;AAiE5C,eAAO,MAAM,sBAAsB,EAAE,MAAM,CAAC,MAAM,EAGjD,CAAA;AAED,eAAO,MAAM,iCAAiC,EAAE,MAAM,CAAC,MAAM,EAG5D,CAAA;AAED,eAAO,MAAM,WAAW,EAAE,MAAM,CAAC,MAAM,EAAsC,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/react/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAU,MAAM,EAAE,MAAM,QAAQ,CAAA;AAiE5C,eAAO,MAAM,wBAAwB,EAAE,MAAM,CAAC,MAAM,EAGnD,CAAA;AAED,eAAO,MAAM,mCAAmC,EAAE,MAAM,CAAC,MAAM,EAG9D,CAAA;AAED,0DAA0D;AAC1D,eAAO,MAAM,sBAAsB,EAAE,MAAM,CAAC,MAAM,EAA6B,CAAA;AAE/E,qEAAqE;AACrE,eAAO,MAAM,iCAAiC,EAAE,MAAM,CAAC,MAAM,EAAwC,CAAA;AAErG,eAAO,MAAM,WAAW,EAAE,MAAM,CAAC,MAAM,EAAwC,CAAA"}
@@ -0,0 +1,19 @@
1
+ import type { Linter } from 'eslint';
2
+ export declare const configReactStorybook: Linter.Config[];
3
+ export declare const configReactTier0Correctness: Linter.Config[];
4
+ export declare const configReactTier0CorrectnessTypeChecked: Linter.Config[];
5
+ export declare const configReactTier1Consistency: Linter.Config[];
6
+ export declare const configReactTier1ConsistencyTypeChecked: Linter.Config[];
7
+ export declare const configReactTier2BestPractices: Linter.Config[];
8
+ export declare const configReactTier2BestPracticesTypeChecked: Linter.Config[];
9
+ export declare const configReactTier3Oopinionated: Linter.Config[];
10
+ export declare const configReactTier3OpinionatedTypeChecked: Linter.Config[];
11
+ export declare const configReactTier4Strict: Linter.Config[];
12
+ export declare const configReactTier4StrictTypeChecked: Linter.Config[];
13
+ /** @deprecated Use `configReactTier2BestPractices` instead. */
14
+ export declare const recommendedConfig: Linter.Config[];
15
+ /** @deprecated Use `configReactTier2BestPracticesTypeChecked` instead. */
16
+ export declare const recommendedTypeCheckedConfig: Linter.Config[];
17
+ export declare const recommendedTypeCheckedWithStorybookConfig: Linter.Config[];
18
+ export declare const config: Linter.Config[];
19
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/tiers/index.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAYpC,eAAO,MAAM,oBAAoB,EAAE,MAAM,CAAC,MAAM,EAAyB,CAAA;AAEzE,eAAO,MAAM,2BAA2B,EAAE,MAAM,CAAC,MAAM,EAAgC,CAAA;AAEvF,eAAO,MAAM,sCAAsC,EAAE,MAAM,CAAC,MAAM,EAA2C,CAAA;AAE7G,eAAO,MAAM,2BAA2B,EAAE,MAAM,CAAC,MAAM,EAAgC,CAAA;AAEvF,eAAO,MAAM,sCAAsC,EAAE,MAAM,CAAC,MAAM,EAA2C,CAAA;AAE7G,eAAO,MAAM,6BAA6B,EAAE,MAAM,CAAC,MAAM,EAGxD,CAAA;AAED,eAAO,MAAM,wCAAwC,EAAE,MAAM,CAAC,MAAM,EAGnE,CAAA;AAED,eAAO,MAAM,4BAA4B,EAAE,MAAM,CAAC,MAAM,EAGvD,CAAA;AAED,eAAO,MAAM,sCAAsC,EAAE,MAAM,CAAC,MAAM,EAGjE,CAAA;AAED,eAAO,MAAM,sBAAsB,EAAE,MAAM,CAAC,MAAM,EAGjD,CAAA;AAED,eAAO,MAAM,iCAAiC,EAAE,MAAM,CAAC,MAAM,EAG5D,CAAA;AAED,+DAA+D;AAC/D,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAkC,CAAA;AAE/E,0EAA0E;AAC1E,eAAO,MAAM,4BAA4B,EAAE,MAAM,CAAC,MAAM,EAA6C,CAAA;AAErG,eAAO,MAAM,yCAAyC,EAAE,MAAM,CAAC,MAAM,EAGpE,CAAA;AAED,eAAO,MAAM,MAAM,EAAE,MAAM,CAAC,MAAM,EAA8C,CAAA"}
@@ -1,9 +1,3 @@
1
- import type { Linter } from 'eslint';
2
- export declare const reactStorybookConfig: Linter.Config[];
3
- export declare const recommendedConfig: Linter.Config[];
4
- export declare const recommendedTypeCheckedConfig: Linter.Config[];
5
- export declare const recommendedTypeCheckedWithStorybookConfig: Linter.Config[];
6
- export declare const config: Linter.Config[];
7
- export { reactConfig, reactRecommendedConfig, reactRecommendedTypeCheckedConfig, } from './react/index.ts';
8
1
  export { storybookConfig } from './storybook/index.ts';
2
+ export * from './tiers/index.ts';
9
3
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAQpC,eAAO,MAAM,oBAAoB,EAAE,MAAM,CAAC,MAAM,EAAyB,CAAA;AAEzE,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAwD,CAAA;AAErG,eAAO,MAAM,4BAA4B,EAAE,MAAM,CAAC,MAAM,EAGvD,CAAA;AAED,eAAO,MAAM,yCAAyC,EAAE,MAAM,CAAC,MAAM,EAGpE,CAAA;AAGD,eAAO,MAAM,MAAM,EAAE,MAAM,CAAC,MAAM,EAA8C,CAAA;AAEhF,OAAO,EACL,WAAW,EAAE,sBAAsB,EAAE,iCAAiC,GACvE,MAAM,kBAAkB,CAAA;AACzB,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AACtD,cAAc,kBAAkB,CAAA"}
@@ -1,7 +1,19 @@
1
- // src/index.ts
1
+ // src/storybook/index.ts
2
+ import storybook from "eslint-plugin-storybook";
3
+ var storybookConfig = storybook.configs["flat/recommended"];
4
+
5
+ // src/tiers/index.ts
2
6
  import {
3
- recommendedConfig as xyRecommendedConfig,
4
- recommendedTypeCheckedConfig as xyRecommendedTypeCheckedConfig
7
+ configTier0Correctness,
8
+ configTier0CorrectnessTypeChecked,
9
+ configTier1Consistency,
10
+ configTier1ConsistencyTypeChecked,
11
+ configTier2BestPractices,
12
+ configTier2BestPracticesTypeChecked,
13
+ configTier3Opinionated,
14
+ configTier3OpinionatedTypeChecked,
15
+ configTier4Strict,
16
+ configTier4StrictTypeChecked
5
17
  } from "@xylabs/eslint-config-flat";
6
18
 
7
19
  // src/react/index.ts
@@ -63,38 +75,68 @@ function createReactOverride(typeChecked = false) {
63
75
  }
64
76
  };
65
77
  }
66
- var reactRecommendedConfig = [
78
+ var reactBestPracticesConfig = [
67
79
  ...scopeReactConfigs(reactPlugin.configs["strict-typescript"]),
68
80
  createReactOverride()
69
81
  ];
70
- var reactRecommendedTypeCheckedConfig = [
82
+ var reactBestPracticesTypeCheckedConfig = [
71
83
  ...scopeReactConfigs(reactPlugin.configs["strict-type-checked"], true),
72
84
  createReactOverride(true)
73
85
  ];
74
- var reactConfig = reactRecommendedTypeCheckedConfig;
75
86
 
76
- // src/storybook/index.ts
77
- import storybook from "eslint-plugin-storybook";
78
- var storybookConfig = storybook.configs["flat/recommended"];
79
-
80
- // src/index.ts
81
- var reactStorybookConfig = [...storybookConfig];
82
- var recommendedConfig = [...xyRecommendedConfig, ...reactRecommendedConfig];
83
- var recommendedTypeCheckedConfig = [
84
- ...xyRecommendedTypeCheckedConfig,
85
- ...reactRecommendedTypeCheckedConfig
86
- ];
87
- var recommendedTypeCheckedWithStorybookConfig = [
88
- ...recommendedTypeCheckedConfig,
89
- ...reactStorybookConfig
90
- ];
87
+ // src/tiers/index.ts
88
+ function mergeTierConfigs(...parts) {
89
+ return parts.flat();
90
+ }
91
+ var configReactStorybook = [...storybookConfig];
92
+ var configReactTier0Correctness = [...configTier0Correctness];
93
+ var configReactTier0CorrectnessTypeChecked = [...configTier0CorrectnessTypeChecked];
94
+ var configReactTier1Consistency = [...configTier1Consistency];
95
+ var configReactTier1ConsistencyTypeChecked = [...configTier1ConsistencyTypeChecked];
96
+ var configReactTier2BestPractices = mergeTierConfigs(
97
+ configTier2BestPractices,
98
+ reactBestPracticesConfig
99
+ );
100
+ var configReactTier2BestPracticesTypeChecked = mergeTierConfigs(
101
+ configTier2BestPracticesTypeChecked,
102
+ reactBestPracticesTypeCheckedConfig
103
+ );
104
+ var configReactTier3Oopinionated = mergeTierConfigs(
105
+ configTier3Opinionated,
106
+ reactBestPracticesTypeCheckedConfig
107
+ );
108
+ var configReactTier3OpinionatedTypeChecked = mergeTierConfigs(
109
+ configTier3OpinionatedTypeChecked,
110
+ reactBestPracticesTypeCheckedConfig
111
+ );
112
+ var configReactTier4Strict = mergeTierConfigs(
113
+ configTier4Strict,
114
+ reactBestPracticesTypeCheckedConfig
115
+ );
116
+ var configReactTier4StrictTypeChecked = mergeTierConfigs(
117
+ configTier4StrictTypeChecked,
118
+ reactBestPracticesTypeCheckedConfig
119
+ );
120
+ var recommendedConfig = configReactTier2BestPractices;
121
+ var recommendedTypeCheckedConfig = configReactTier2BestPracticesTypeChecked;
122
+ var recommendedTypeCheckedWithStorybookConfig = mergeTierConfigs(
123
+ configReactTier2BestPracticesTypeChecked,
124
+ configReactStorybook
125
+ );
91
126
  var config = recommendedTypeCheckedWithStorybookConfig;
92
127
  export {
93
128
  config,
94
- reactConfig,
95
- reactRecommendedConfig,
96
- reactRecommendedTypeCheckedConfig,
97
- reactStorybookConfig,
129
+ configReactStorybook,
130
+ configReactTier0Correctness,
131
+ configReactTier0CorrectnessTypeChecked,
132
+ configReactTier1Consistency,
133
+ configReactTier1ConsistencyTypeChecked,
134
+ configReactTier2BestPractices,
135
+ configReactTier2BestPracticesTypeChecked,
136
+ configReactTier3Oopinionated,
137
+ configReactTier3OpinionatedTypeChecked,
138
+ configReactTier4Strict,
139
+ configReactTier4StrictTypeChecked,
98
140
  recommendedConfig,
99
141
  recommendedTypeCheckedConfig,
100
142
  recommendedTypeCheckedWithStorybookConfig,
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../../src/index.ts", "../../src/react/index.ts", "../../src/storybook/index.ts"],
4
- "sourcesContent": ["import {\n recommendedConfig as xyRecommendedConfig,\n recommendedTypeCheckedConfig as xyRecommendedTypeCheckedConfig,\n} from '@xylabs/eslint-config-flat'\nimport type { Linter } from 'eslint'\n\nimport {\n reactRecommendedConfig,\n reactRecommendedTypeCheckedConfig,\n} from './react/index.ts'\nimport { storybookConfig } from './storybook/index.ts'\n\nexport const reactStorybookConfig: Linter.Config[] = [...storybookConfig]\n\nexport const recommendedConfig: Linter.Config[] = [...xyRecommendedConfig, ...reactRecommendedConfig]\n\nexport const recommendedTypeCheckedConfig: Linter.Config[] = [\n ...xyRecommendedTypeCheckedConfig,\n ...reactRecommendedTypeCheckedConfig,\n]\n\nexport const recommendedTypeCheckedWithStorybookConfig: Linter.Config[] = [\n ...recommendedTypeCheckedConfig,\n ...reactStorybookConfig,\n]\n\n// Compatibility export for existing consumers.\nexport const config: Linter.Config[] = recommendedTypeCheckedWithStorybookConfig\n\nexport {\n reactConfig, reactRecommendedConfig, reactRecommendedTypeCheckedConfig,\n} from './react/index.ts'\nexport { storybookConfig } from './storybook/index.ts'\n", "import tsParser from '@typescript-eslint/parser'\nimport type { ESLint, Linter } from 'eslint'\nimport reactDomPlugin from 'eslint-plugin-react-dom'\nimport reactHooksPlugin from 'eslint-plugin-react-hooks'\nimport reactNamingConventionPlugin from 'eslint-plugin-react-naming-convention'\nimport eslintReactRefreshPlugin from 'eslint-plugin-react-refresh'\nimport reactWebApiPlugin from 'eslint-plugin-react-web-api'\nimport reactPlugin from 'eslint-plugin-react-x'\nimport globals from 'globals'\n\nconst reactFiles = ['**/*.{ts,tsx,mts,cts,js,jsx,mjs,cjs}']\n\nfunction scopeReactConfigs(\n configs: Linter.Config | Linter.Config[],\n typeChecked = false,\n): Linter.Config[] {\n return (Array.isArray(configs) ? configs : [configs]).map(config => ({\n ...config,\n files: reactFiles,\n languageOptions: {\n parser: tsParser,\n ...config.languageOptions,\n globals: {\n ...(globals.browser as Record<string, boolean>),\n ...(config.languageOptions?.globals as Record<string, unknown> | undefined),\n },\n parserOptions: {\n ecmaFeatures: { jsx: true },\n ...(config.languageOptions?.parserOptions as Record<string, unknown> | undefined),\n ...(typeChecked && { projectService: true, tsconfigRootDir: process.cwd() }),\n },\n },\n }))\n}\n\nfunction createReactOverride(typeChecked = false): Linter.Config {\n return {\n files: reactFiles,\n languageOptions: {\n parser: tsParser,\n parserOptions: {\n ecmaFeatures: { jsx: true },\n ...(typeChecked && { projectService: true, tsconfigRootDir: process.cwd() }),\n },\n globals: { ...globals.browser },\n },\n plugins: {\n 'react-dom': reactDomPlugin,\n 'react-web-api': reactWebApiPlugin,\n 'react-refresh': eslintReactRefreshPlugin,\n 'react-hooks': reactHooksPlugin as unknown as ESLint.Plugin,\n 'react-naming-convention': reactNamingConventionPlugin,\n },\n rules: {\n ...reactDomPlugin.configs.strict.rules,\n ...reactWebApiPlugin.configs.recommended.rules,\n ...reactHooksPlugin.configs.flat.recommended.rules,\n ...reactNamingConventionPlugin.configs.recommended.rules,\n ...eslintReactRefreshPlugin.configs.recommended.rules,\n 'react-refresh/only-export-components': ['warn', { allowConstantExport: true }],\n 'react-hooks/use-memo': 'warn',\n 'react-hooks/set-state-in-effect': 'warn',\n },\n }\n}\n\nexport const reactRecommendedConfig: Linter.Config[] = [\n ...scopeReactConfigs(reactPlugin.configs['strict-typescript']),\n createReactOverride(),\n]\n\nexport const reactRecommendedTypeCheckedConfig: Linter.Config[] = [\n ...scopeReactConfigs(reactPlugin.configs['strict-type-checked'], true),\n createReactOverride(true),\n]\n\nexport const reactConfig: Linter.Config[] = reactRecommendedTypeCheckedConfig\n", "import type { Linter } from 'eslint'\nimport storybook from 'eslint-plugin-storybook'\n\nexport const storybookConfig: Linter.Config[] = storybook.configs['flat/recommended'] as Linter.Config[]\n"],
5
- "mappings": ";AAAA;AAAA,EACE,qBAAqB;AAAA,EACrB,gCAAgC;AAAA,OAC3B;;;ACHP,OAAO,cAAc;AAErB,OAAO,oBAAoB;AAC3B,OAAO,sBAAsB;AAC7B,OAAO,iCAAiC;AACxC,OAAO,8BAA8B;AACrC,OAAO,uBAAuB;AAC9B,OAAO,iBAAiB;AACxB,OAAO,aAAa;AAEpB,IAAM,aAAa,CAAC,sCAAsC;AAE1D,SAAS,kBACP,SACA,cAAc,OACG;AACjB,UAAQ,MAAM,QAAQ,OAAO,IAAI,UAAU,CAAC,OAAO,GAAG,IAAI,CAAAA,aAAW;AAAA,IACnE,GAAGA;AAAA,IACH,OAAO;AAAA,IACP,iBAAiB;AAAA,MACf,QAAQ;AAAA,MACR,GAAGA,QAAO;AAAA,MACV,SAAS;AAAA,QACP,GAAI,QAAQ;AAAA,QACZ,GAAIA,QAAO,iBAAiB;AAAA,MAC9B;AAAA,MACA,eAAe;AAAA,QACb,cAAc,EAAE,KAAK,KAAK;AAAA,QAC1B,GAAIA,QAAO,iBAAiB;AAAA,QAC5B,GAAI,eAAe,EAAE,gBAAgB,MAAM,iBAAiB,QAAQ,IAAI,EAAE;AAAA,MAC5E;AAAA,IACF;AAAA,EACF,EAAE;AACJ;AAEA,SAAS,oBAAoB,cAAc,OAAsB;AAC/D,SAAO;AAAA,IACL,OAAO;AAAA,IACP,iBAAiB;AAAA,MACf,QAAQ;AAAA,MACR,eAAe;AAAA,QACb,cAAc,EAAE,KAAK,KAAK;AAAA,QAC1B,GAAI,eAAe,EAAE,gBAAgB,MAAM,iBAAiB,QAAQ,IAAI,EAAE;AAAA,MAC5E;AAAA,MACA,SAAS,EAAE,GAAG,QAAQ,QAAQ;AAAA,IAChC;AAAA,IACA,SAAS;AAAA,MACP,aAAa;AAAA,MACb,iBAAiB;AAAA,MACjB,iBAAiB;AAAA,MACjB,eAAe;AAAA,MACf,2BAA2B;AAAA,IAC7B;AAAA,IACA,OAAO;AAAA,MACL,GAAG,eAAe,QAAQ,OAAO;AAAA,MACjC,GAAG,kBAAkB,QAAQ,YAAY;AAAA,MACzC,GAAG,iBAAiB,QAAQ,KAAK,YAAY;AAAA,MAC7C,GAAG,4BAA4B,QAAQ,YAAY;AAAA,MACnD,GAAG,yBAAyB,QAAQ,YAAY;AAAA,MAChD,wCAAwC,CAAC,QAAQ,EAAE,qBAAqB,KAAK,CAAC;AAAA,MAC9E,wBAAwB;AAAA,MACxB,mCAAmC;AAAA,IACrC;AAAA,EACF;AACF;AAEO,IAAM,yBAA0C;AAAA,EACrD,GAAG,kBAAkB,YAAY,QAAQ,mBAAmB,CAAC;AAAA,EAC7D,oBAAoB;AACtB;AAEO,IAAM,oCAAqD;AAAA,EAChE,GAAG,kBAAkB,YAAY,QAAQ,qBAAqB,GAAG,IAAI;AAAA,EACrE,oBAAoB,IAAI;AAC1B;AAEO,IAAM,cAA+B;;;AC3E5C,OAAO,eAAe;AAEf,IAAM,kBAAmC,UAAU,QAAQ,kBAAkB;;;AFS7E,IAAM,uBAAwC,CAAC,GAAG,eAAe;AAEjE,IAAM,oBAAqC,CAAC,GAAG,qBAAqB,GAAG,sBAAsB;AAE7F,IAAM,+BAAgD;AAAA,EAC3D,GAAG;AAAA,EACH,GAAG;AACL;AAEO,IAAM,4CAA6D;AAAA,EACxE,GAAG;AAAA,EACH,GAAG;AACL;AAGO,IAAM,SAA0B;",
3
+ "sources": ["../../src/storybook/index.ts", "../../src/tiers/index.ts", "../../src/react/index.ts"],
4
+ "sourcesContent": ["import type { Linter } from 'eslint'\nimport storybook from 'eslint-plugin-storybook'\n\nexport const storybookConfig: Linter.Config[] = storybook.configs['flat/recommended'] as Linter.Config[]\n", "import {\n configTier0Correctness, configTier0CorrectnessTypeChecked, configTier1Consistency,\n configTier1ConsistencyTypeChecked,\n configTier2BestPractices,\n configTier2BestPracticesTypeChecked,\n configTier3Opinionated,\n configTier3OpinionatedTypeChecked,\n configTier4Strict,\n configTier4StrictTypeChecked,\n} from '@xylabs/eslint-config-flat'\nimport type { Linter } from 'eslint'\n\nimport {\n reactBestPracticesConfig,\n reactBestPracticesTypeCheckedConfig,\n} from '../react/index.ts'\nimport { storybookConfig } from '../storybook/index.ts'\n\nfunction mergeTierConfigs(...parts: readonly Linter.Config[][]): Linter.Config[] {\n return parts.flat()\n}\n\nexport const configReactStorybook: Linter.Config[] = [...storybookConfig]\n\nexport const configReactTier0Correctness: Linter.Config[] = [...configTier0Correctness]\n\nexport const configReactTier0CorrectnessTypeChecked: Linter.Config[] = [...configTier0CorrectnessTypeChecked]\n\nexport const configReactTier1Consistency: Linter.Config[] = [...configTier1Consistency]\n\nexport const configReactTier1ConsistencyTypeChecked: Linter.Config[] = [...configTier1ConsistencyTypeChecked]\n\nexport const configReactTier2BestPractices: Linter.Config[] = mergeTierConfigs(\n configTier2BestPractices,\n reactBestPracticesConfig,\n)\n\nexport const configReactTier2BestPracticesTypeChecked: Linter.Config[] = mergeTierConfigs(\n configTier2BestPracticesTypeChecked,\n reactBestPracticesTypeCheckedConfig,\n)\n\nexport const configReactTier3Oopinionated: Linter.Config[] = mergeTierConfigs(\n configTier3Opinionated,\n reactBestPracticesTypeCheckedConfig,\n)\n\nexport const configReactTier3OpinionatedTypeChecked: Linter.Config[] = mergeTierConfigs(\n configTier3OpinionatedTypeChecked,\n reactBestPracticesTypeCheckedConfig,\n)\n\nexport const configReactTier4Strict: Linter.Config[] = mergeTierConfigs(\n configTier4Strict,\n reactBestPracticesTypeCheckedConfig,\n)\n\nexport const configReactTier4StrictTypeChecked: Linter.Config[] = mergeTierConfigs(\n configTier4StrictTypeChecked,\n reactBestPracticesTypeCheckedConfig,\n)\n\n/** @deprecated Use `configReactTier2BestPractices` instead. */\nexport const recommendedConfig: Linter.Config[] = configReactTier2BestPractices\n\n/** @deprecated Use `configReactTier2BestPracticesTypeChecked` instead. */\nexport const recommendedTypeCheckedConfig: Linter.Config[] = configReactTier2BestPracticesTypeChecked\n\nexport const recommendedTypeCheckedWithStorybookConfig: Linter.Config[] = mergeTierConfigs(\n configReactTier2BestPracticesTypeChecked,\n configReactStorybook,\n)\n\nexport const config: Linter.Config[] = recommendedTypeCheckedWithStorybookConfig\n", "import tsParser from '@typescript-eslint/parser'\nimport type { ESLint, Linter } from 'eslint'\nimport reactDomPlugin from 'eslint-plugin-react-dom'\nimport reactHooksPlugin from 'eslint-plugin-react-hooks'\nimport reactNamingConventionPlugin from 'eslint-plugin-react-naming-convention'\nimport eslintReactRefreshPlugin from 'eslint-plugin-react-refresh'\nimport reactWebApiPlugin from 'eslint-plugin-react-web-api'\nimport reactPlugin from 'eslint-plugin-react-x'\nimport globals from 'globals'\n\nconst reactFiles = ['**/*.{ts,tsx,mts,cts,js,jsx,mjs,cjs}']\n\nfunction scopeReactConfigs(\n configs: Linter.Config | Linter.Config[],\n typeChecked = false,\n): Linter.Config[] {\n return (Array.isArray(configs) ? configs : [configs]).map(config => ({\n ...config,\n files: reactFiles,\n languageOptions: {\n parser: tsParser,\n ...config.languageOptions,\n globals: {\n ...(globals.browser as Record<string, boolean>),\n ...(config.languageOptions?.globals as Record<string, unknown> | undefined),\n },\n parserOptions: {\n ecmaFeatures: { jsx: true },\n ...(config.languageOptions?.parserOptions as Record<string, unknown> | undefined),\n ...(typeChecked && { projectService: true, tsconfigRootDir: process.cwd() }),\n },\n },\n }))\n}\n\nfunction createReactOverride(typeChecked = false): Linter.Config {\n return {\n files: reactFiles,\n languageOptions: {\n parser: tsParser,\n parserOptions: {\n ecmaFeatures: { jsx: true },\n ...(typeChecked && { projectService: true, tsconfigRootDir: process.cwd() }),\n },\n globals: { ...globals.browser },\n },\n plugins: {\n 'react-dom': reactDomPlugin,\n 'react-web-api': reactWebApiPlugin,\n 'react-refresh': eslintReactRefreshPlugin,\n 'react-hooks': reactHooksPlugin as unknown as ESLint.Plugin,\n 'react-naming-convention': reactNamingConventionPlugin,\n },\n rules: {\n ...reactDomPlugin.configs.strict.rules,\n ...reactWebApiPlugin.configs.recommended.rules,\n ...reactHooksPlugin.configs.flat.recommended.rules,\n ...reactNamingConventionPlugin.configs.recommended.rules,\n ...eslintReactRefreshPlugin.configs.recommended.rules,\n 'react-refresh/only-export-components': ['warn', { allowConstantExport: true }],\n 'react-hooks/use-memo': 'warn',\n 'react-hooks/set-state-in-effect': 'warn',\n },\n }\n}\n\nexport const reactBestPracticesConfig: Linter.Config[] = [\n ...scopeReactConfigs(reactPlugin.configs['strict-typescript']),\n createReactOverride(),\n]\n\nexport const reactBestPracticesTypeCheckedConfig: Linter.Config[] = [\n ...scopeReactConfigs(reactPlugin.configs['strict-type-checked'], true),\n createReactOverride(true),\n]\n\n/** @deprecated Use `reactBestPracticesConfig` instead. */\nexport const reactRecommendedConfig: Linter.Config[] = reactBestPracticesConfig\n\n/** @deprecated Use `reactBestPracticesTypeCheckedConfig` instead. */\nexport const reactRecommendedTypeCheckedConfig: Linter.Config[] = reactBestPracticesTypeCheckedConfig\n\nexport const reactConfig: Linter.Config[] = reactBestPracticesTypeCheckedConfig\n"],
5
+ "mappings": "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",
6
6
  "names": ["config"]
7
7
  }
@@ -1,5 +1,9 @@
1
1
  import type { Linter } from 'eslint';
2
+ export declare const reactBestPracticesConfig: Linter.Config[];
3
+ export declare const reactBestPracticesTypeCheckedConfig: Linter.Config[];
4
+ /** @deprecated Use `reactBestPracticesConfig` instead. */
2
5
  export declare const reactRecommendedConfig: Linter.Config[];
6
+ /** @deprecated Use `reactBestPracticesTypeCheckedConfig` instead. */
3
7
  export declare const reactRecommendedTypeCheckedConfig: Linter.Config[];
4
8
  export declare const reactConfig: Linter.Config[];
5
9
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/react/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAU,MAAM,EAAE,MAAM,QAAQ,CAAA;AAiE5C,eAAO,MAAM,sBAAsB,EAAE,MAAM,CAAC,MAAM,EAGjD,CAAA;AAED,eAAO,MAAM,iCAAiC,EAAE,MAAM,CAAC,MAAM,EAG5D,CAAA;AAED,eAAO,MAAM,WAAW,EAAE,MAAM,CAAC,MAAM,EAAsC,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/react/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAU,MAAM,EAAE,MAAM,QAAQ,CAAA;AAiE5C,eAAO,MAAM,wBAAwB,EAAE,MAAM,CAAC,MAAM,EAGnD,CAAA;AAED,eAAO,MAAM,mCAAmC,EAAE,MAAM,CAAC,MAAM,EAG9D,CAAA;AAED,0DAA0D;AAC1D,eAAO,MAAM,sBAAsB,EAAE,MAAM,CAAC,MAAM,EAA6B,CAAA;AAE/E,qEAAqE;AACrE,eAAO,MAAM,iCAAiC,EAAE,MAAM,CAAC,MAAM,EAAwC,CAAA;AAErG,eAAO,MAAM,WAAW,EAAE,MAAM,CAAC,MAAM,EAAwC,CAAA"}
@@ -0,0 +1,19 @@
1
+ import type { Linter } from 'eslint';
2
+ export declare const configReactStorybook: Linter.Config[];
3
+ export declare const configReactTier0Correctness: Linter.Config[];
4
+ export declare const configReactTier0CorrectnessTypeChecked: Linter.Config[];
5
+ export declare const configReactTier1Consistency: Linter.Config[];
6
+ export declare const configReactTier1ConsistencyTypeChecked: Linter.Config[];
7
+ export declare const configReactTier2BestPractices: Linter.Config[];
8
+ export declare const configReactTier2BestPracticesTypeChecked: Linter.Config[];
9
+ export declare const configReactTier3Oopinionated: Linter.Config[];
10
+ export declare const configReactTier3OpinionatedTypeChecked: Linter.Config[];
11
+ export declare const configReactTier4Strict: Linter.Config[];
12
+ export declare const configReactTier4StrictTypeChecked: Linter.Config[];
13
+ /** @deprecated Use `configReactTier2BestPractices` instead. */
14
+ export declare const recommendedConfig: Linter.Config[];
15
+ /** @deprecated Use `configReactTier2BestPracticesTypeChecked` instead. */
16
+ export declare const recommendedTypeCheckedConfig: Linter.Config[];
17
+ export declare const recommendedTypeCheckedWithStorybookConfig: Linter.Config[];
18
+ export declare const config: Linter.Config[];
19
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/tiers/index.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAYpC,eAAO,MAAM,oBAAoB,EAAE,MAAM,CAAC,MAAM,EAAyB,CAAA;AAEzE,eAAO,MAAM,2BAA2B,EAAE,MAAM,CAAC,MAAM,EAAgC,CAAA;AAEvF,eAAO,MAAM,sCAAsC,EAAE,MAAM,CAAC,MAAM,EAA2C,CAAA;AAE7G,eAAO,MAAM,2BAA2B,EAAE,MAAM,CAAC,MAAM,EAAgC,CAAA;AAEvF,eAAO,MAAM,sCAAsC,EAAE,MAAM,CAAC,MAAM,EAA2C,CAAA;AAE7G,eAAO,MAAM,6BAA6B,EAAE,MAAM,CAAC,MAAM,EAGxD,CAAA;AAED,eAAO,MAAM,wCAAwC,EAAE,MAAM,CAAC,MAAM,EAGnE,CAAA;AAED,eAAO,MAAM,4BAA4B,EAAE,MAAM,CAAC,MAAM,EAGvD,CAAA;AAED,eAAO,MAAM,sCAAsC,EAAE,MAAM,CAAC,MAAM,EAGjE,CAAA;AAED,eAAO,MAAM,sBAAsB,EAAE,MAAM,CAAC,MAAM,EAGjD,CAAA;AAED,eAAO,MAAM,iCAAiC,EAAE,MAAM,CAAC,MAAM,EAG5D,CAAA;AAED,+DAA+D;AAC/D,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAkC,CAAA;AAE/E,0EAA0E;AAC1E,eAAO,MAAM,4BAA4B,EAAE,MAAM,CAAC,MAAM,EAA6C,CAAA;AAErG,eAAO,MAAM,yCAAyC,EAAE,MAAM,CAAC,MAAM,EAGpE,CAAA;AAED,eAAO,MAAM,MAAM,EAAE,MAAM,CAAC,MAAM,EAA8C,CAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xylabs/eslint-config-react-flat",
3
- "version": "8.2.0",
3
+ "version": "8.2.2",
4
4
  "description": "ESLint Config used throughout XY Labs TypeScript/JavaScript libraries and react projects",
5
5
  "keywords": [
6
6
  "xylabs",
@@ -44,7 +44,7 @@
44
44
  "eslint-plugin-react-x": "^5.9.0",
45
45
  "eslint-plugin-storybook": "^10.4.4",
46
46
  "globals": "~17.6.0",
47
- "@xylabs/eslint-config-flat": "~8.2.0"
47
+ "@xylabs/eslint-config-flat": "~8.2.2"
48
48
  },
49
49
  "devDependencies": {
50
50
  "@babel/core": "^7.29.7",
@@ -63,8 +63,8 @@
63
63
  "vite": "^8.0.16",
64
64
  "vitest": "~4.1.8",
65
65
  "zod": "^4.4.3",
66
- "@xylabs/toolchain": "~8.2.0",
67
- "@xylabs/tsconfig": "~8.2.0"
66
+ "@xylabs/tsconfig": "~8.2.2",
67
+ "@xylabs/toolchain": "~8.2.2"
68
68
  },
69
69
  "peerDependencies": {
70
70
  "browserslist": ">= 4.21.0",