@xylabs/eslint-config-react-flat 7.8.6 → 7.9.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/README.md CHANGED
@@ -29,7 +29,7 @@ pnpm add -D {{name}}
29
29
 
30
30
  ## Usage
31
31
 
32
- Use this config in your `eslint.config.mjs`:
32
+ Use the compatibility export in your `eslint.config.mjs`:
33
33
 
34
34
  ```js
35
35
  import { config } from '@xylabs/eslint-config-react-flat'
@@ -37,6 +37,14 @@ import { config } from '@xylabs/eslint-config-react-flat'
37
37
  export default config
38
38
  ```
39
39
 
40
+ For new consumers, prefer the explicit presets:
41
+
42
+ ```js
43
+ import { recommendedTypeCheckedConfig } from '@xylabs/eslint-config-react-flat'
44
+
45
+ export default recommendedTypeCheckedConfig
46
+ ```
47
+
40
48
  ### Extending with custom rules
41
49
 
42
50
  ```js
@@ -58,11 +66,18 @@ Everything from [`@xylabs/eslint-config-flat`](https://www.npmjs.com/package/@xy
58
66
 
59
67
  - React component and hooks linting via `eslint-plugin-react-x`
60
68
  - DOM API validation via `eslint-plugin-react-dom`
61
- - Enhanced hooks rules via `eslint-plugin-react-hooks-extra`
69
+ - Hooks validation via `eslint-plugin-react-hooks`
62
70
  - Naming convention enforcement via `eslint-plugin-react-naming-convention`
63
71
  - React Refresh validation via `eslint-plugin-react-refresh`
64
72
  - Web API best practices via `eslint-plugin-react-web-api`
65
73
 
74
+ Additional exports:
75
+
76
+ - `recommendedConfig`: base + React without Storybook
77
+ - `recommendedTypeCheckedConfig`: type-aware base + React without Storybook
78
+ - `recommendedTypeCheckedWithStorybookConfig`: type-aware base + React + Storybook
79
+ - `config`: legacy compatibility export equivalent to the Storybook-inclusive type-aware preset
80
+
66
81
 
67
82
  ## License
68
83
 
@@ -1,6 +1,10 @@
1
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[];
2
6
  export declare const config: Linter.Config[];
3
- export { reactConfig } from './react/index.ts';
7
+ export { reactConfig, reactRecommendedConfig, reactRecommendedTypeCheckedConfig, } from './react/index.ts';
4
8
  export { reactImportConfig } from './reactImport/index.ts';
5
9
  export { storybookConfig } from './storybook/index.ts';
6
10
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAMpC,eAAO,MAAM,MAAM,EAAE,MAAM,CAAC,MAAM,EAAsE,CAAA;AAExG,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAC1D,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AASpC,eAAO,MAAM,oBAAoB,EAAE,MAAM,CAAC,MAAM,EAAyB,CAAA;AAEzE,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAA2E,CAAA;AAExH,eAAO,MAAM,4BAA4B,EAAE,MAAM,CAAC,MAAM,EAIvD,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,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAC1D,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA"}
@@ -1,5 +1,8 @@
1
1
  // src/index.ts
2
- import { config as xyConfig } from "@xylabs/eslint-config-flat";
2
+ import {
3
+ recommendedConfig as xyRecommendedConfig,
4
+ recommendedTypeCheckedConfig as xyRecommendedTypeCheckedConfig
5
+ } from "@xylabs/eslint-config-flat";
3
6
 
4
7
  // src/react/index.ts
5
8
  import tsParser from "@typescript-eslint/parser";
@@ -10,39 +13,68 @@ import eslintReactRefreshPlugin from "eslint-plugin-react-refresh";
10
13
  import reactWebApiPlugin from "eslint-plugin-react-web-api";
11
14
  import reactPlugin from "eslint-plugin-react-x";
12
15
  import globals from "globals";
13
- var reactConfig = {
14
- files: ["**/*.{ts,tsx}"],
15
- ...reactPlugin.configs.recommended,
16
- ...reactDomPlugin.configs.recommended,
17
- ...reactWebApiPlugin.configs.recommended,
18
- ...reactNamingConventionPlugin.configs.recommended,
19
- ...eslintReactRefreshPlugin.configs.recommended,
20
- plugins: {
21
- "react-x": reactPlugin,
22
- "react-dom": reactDomPlugin,
23
- "react-web-api": reactWebApiPlugin,
24
- "react-refresh": eslintReactRefreshPlugin,
25
- "react-hooks": reactHooksPlugin,
26
- "react-naming-convention": reactNamingConventionPlugin
27
- },
28
- languageOptions: {
29
- parser: tsParser,
30
- parserOptions: { ecmaFeatures: { jsx: true } },
31
- globals: { ...globals.browser }
32
- },
33
- rules: {
34
- ...reactPlugin.configs["strict-typescript"].rules,
35
- ...reactDomPlugin.configs.strict.rules,
36
- ...reactWebApiPlugin.configs.recommended.rules,
37
- ...reactHooksPlugin.configs.recommended.rules,
38
- ...reactNamingConventionPlugin.configs.recommended.rules,
39
- ...eslintReactRefreshPlugin.configs.recommended.rules,
40
- "react-refresh/only-export-components": ["warn", { allowConstantExport: true }]
41
- }
42
- };
16
+ var reactFiles = ["**/*.{ts,tsx,js,jsx}"];
17
+ function scopeReactConfigs(configs, typeChecked = false) {
18
+ return (Array.isArray(configs) ? configs : [configs]).map((config2) => ({
19
+ ...config2,
20
+ files: reactFiles,
21
+ languageOptions: {
22
+ parser: tsParser,
23
+ ...config2.languageOptions,
24
+ globals: {
25
+ ...globals.browser,
26
+ ...config2.languageOptions?.globals
27
+ },
28
+ parserOptions: {
29
+ ecmaFeatures: { jsx: true },
30
+ ...config2.languageOptions?.parserOptions,
31
+ ...typeChecked ? { projectService: true, tsconfigRootDir: process.cwd() } : {}
32
+ }
33
+ }
34
+ }));
35
+ }
36
+ function createReactOverride(typeChecked = false) {
37
+ return {
38
+ files: reactFiles,
39
+ languageOptions: {
40
+ parser: tsParser,
41
+ parserOptions: {
42
+ ecmaFeatures: { jsx: true },
43
+ ...typeChecked ? { projectService: true, tsconfigRootDir: process.cwd() } : {}
44
+ },
45
+ globals: { ...globals.browser }
46
+ },
47
+ plugins: {
48
+ "react-x": reactPlugin,
49
+ "react-dom": reactDomPlugin,
50
+ "react-web-api": reactWebApiPlugin,
51
+ "react-refresh": eslintReactRefreshPlugin,
52
+ "react-hooks": reactHooksPlugin,
53
+ "react-naming-convention": reactNamingConventionPlugin
54
+ },
55
+ rules: {
56
+ ...reactDomPlugin.configs.strict.rules,
57
+ ...reactWebApiPlugin.configs.recommended.rules,
58
+ ...reactHooksPlugin.configs.flat.recommended.rules,
59
+ ...reactNamingConventionPlugin.configs.recommended.rules,
60
+ ...eslintReactRefreshPlugin.configs.recommended.rules,
61
+ "react-refresh/only-export-components": ["warn", { allowConstantExport: true }]
62
+ }
63
+ };
64
+ }
65
+ var reactRecommendedConfig = [
66
+ ...scopeReactConfigs(reactPlugin.configs["strict-typescript"]),
67
+ createReactOverride()
68
+ ];
69
+ var reactRecommendedTypeCheckedConfig = [
70
+ ...scopeReactConfigs(reactPlugin.configs["strict-type-checked"], true),
71
+ createReactOverride(true)
72
+ ];
73
+ var reactConfig = reactRecommendedTypeCheckedConfig;
43
74
 
44
75
  // src/reactImport/index.ts
45
76
  import { importConfig } from "@xylabs/eslint-config-flat";
77
+ var importRuleConfig = importConfig.find((config2) => config2.rules?.["import-x/no-internal-modules"] !== void 0);
46
78
  var reactImportConfig = {
47
79
  rules: {
48
80
  "import-x/no-internal-modules": [
@@ -51,7 +83,7 @@ var reactImportConfig = {
51
83
  allow: [
52
84
  "react-dom/*",
53
85
  "react-icons/*",
54
- ...importConfig.rules?.["import-x/no-internal-modules"]?.[1]?.allow ?? []
86
+ ...importRuleConfig?.rules?.["import-x/no-internal-modules"]?.[1]?.allow ?? []
55
87
  ]
56
88
  }
57
89
  ]
@@ -63,11 +95,28 @@ import storybook from "eslint-plugin-storybook";
63
95
  var storybookConfig = storybook.configs["flat/recommended"];
64
96
 
65
97
  // src/index.ts
66
- var config = [...xyConfig, reactConfig, reactImportConfig, ...storybookConfig];
98
+ var reactStorybookConfig = [...storybookConfig];
99
+ var recommendedConfig = [...xyRecommendedConfig, ...reactRecommendedConfig, reactImportConfig];
100
+ var recommendedTypeCheckedConfig = [
101
+ ...xyRecommendedTypeCheckedConfig,
102
+ ...reactRecommendedTypeCheckedConfig,
103
+ reactImportConfig
104
+ ];
105
+ var recommendedTypeCheckedWithStorybookConfig = [
106
+ ...recommendedTypeCheckedConfig,
107
+ ...reactStorybookConfig
108
+ ];
109
+ var config = recommendedTypeCheckedWithStorybookConfig;
67
110
  export {
68
111
  config,
69
112
  reactConfig,
70
113
  reactImportConfig,
114
+ reactRecommendedConfig,
115
+ reactRecommendedTypeCheckedConfig,
116
+ reactStorybookConfig,
117
+ recommendedConfig,
118
+ recommendedTypeCheckedConfig,
119
+ recommendedTypeCheckedWithStorybookConfig,
71
120
  storybookConfig
72
121
  };
73
122
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/index.ts","../../src/react/index.ts","../../src/reactImport/index.ts","../../src/storybook/index.ts"],"sourcesContent":["import { config as xyConfig } from '@xylabs/eslint-config-flat'\nimport type { Linter } from 'eslint'\n\nimport { reactConfig } from './react/index.ts'\nimport { reactImportConfig } from './reactImport/index.ts'\nimport { storybookConfig } from './storybook/index.ts'\n\nexport const config: Linter.Config[] = [...xyConfig, reactConfig, reactImportConfig, ...storybookConfig]\n\nexport { reactConfig } from './react/index.ts'\nexport { reactImportConfig } from './reactImport/index.ts'\nexport { storybookConfig } from './storybook/index.ts'\n","import tsParser from '@typescript-eslint/parser'\nimport type { 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\nexport const reactConfig = {\n files: ['**/*.{ts,tsx}'],\n ...reactPlugin.configs.recommended,\n ...reactDomPlugin.configs.recommended,\n ...reactWebApiPlugin.configs.recommended,\n ...reactNamingConventionPlugin.configs.recommended,\n ...eslintReactRefreshPlugin.configs.recommended,\n plugins: {\n 'react-x': reactPlugin,\n 'react-dom': reactDomPlugin,\n 'react-web-api': reactWebApiPlugin,\n 'react-refresh': eslintReactRefreshPlugin,\n 'react-hooks': reactHooksPlugin,\n 'react-naming-convention': reactNamingConventionPlugin,\n },\n languageOptions: {\n parser: tsParser,\n parserOptions: { ecmaFeatures: { jsx: true } },\n globals: { ...globals.browser },\n },\n rules: {\n ...reactPlugin.configs['strict-typescript'].rules,\n ...reactDomPlugin.configs.strict.rules,\n ...reactWebApiPlugin.configs.recommended.rules,\n ...reactHooksPlugin.configs.recommended.rules,\n ...reactNamingConventionPlugin.configs.recommended.rules,\n ...eslintReactRefreshPlugin.configs.recommended.rules,\n 'react-refresh/only-export-components': ['warn', { allowConstantExport: true }],\n },\n} as unknown as Linter.Config\n","import { importConfig } from '@xylabs/eslint-config-flat'\nimport type { Linter } from 'eslint'\n\nexport const reactImportConfig: Linter.Config = {\n rules: {\n 'import-x/no-internal-modules': [\n 'warn',\n {\n allow: [\n 'react-dom/*',\n 'react-icons/*',\n ...((importConfig.rules?.['import-x/no-internal-modules'] as [string, { allow: string[] }])?.[1]?.allow ?? []),\n ],\n },\n ],\n },\n}\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"],"mappings":";AAAA,SAAS,UAAU,gBAAgB;;;ACAnC,OAAO,cAAc;AAErB,OAAO,oBAAoB;AAC3B,OAAO,sBAAsB;AAC7B,OAAO,iCAAiC;AACxC,OAAO,8BAA8B;AACrC,OAAO,uBAAuB;AAC9B,OAAO,iBAAiB;AACxB,OAAO,aAAa;AAEb,IAAM,cAAc;AAAA,EACzB,OAAO,CAAC,eAAe;AAAA,EACvB,GAAG,YAAY,QAAQ;AAAA,EACvB,GAAG,eAAe,QAAQ;AAAA,EAC1B,GAAG,kBAAkB,QAAQ;AAAA,EAC7B,GAAG,4BAA4B,QAAQ;AAAA,EACvC,GAAG,yBAAyB,QAAQ;AAAA,EACpC,SAAS;AAAA,IACP,WAAW;AAAA,IACX,aAAa;AAAA,IACb,iBAAiB;AAAA,IACjB,iBAAiB;AAAA,IACjB,eAAe;AAAA,IACf,2BAA2B;AAAA,EAC7B;AAAA,EACA,iBAAiB;AAAA,IACf,QAAQ;AAAA,IACR,eAAe,EAAE,cAAc,EAAE,KAAK,KAAK,EAAE;AAAA,IAC7C,SAAS,EAAE,GAAG,QAAQ,QAAQ;AAAA,EAChC;AAAA,EACA,OAAO;AAAA,IACL,GAAG,YAAY,QAAQ,mBAAmB,EAAE;AAAA,IAC5C,GAAG,eAAe,QAAQ,OAAO;AAAA,IACjC,GAAG,kBAAkB,QAAQ,YAAY;AAAA,IACzC,GAAG,iBAAiB,QAAQ,YAAY;AAAA,IACxC,GAAG,4BAA4B,QAAQ,YAAY;AAAA,IACnD,GAAG,yBAAyB,QAAQ,YAAY;AAAA,IAChD,wCAAwC,CAAC,QAAQ,EAAE,qBAAqB,KAAK,CAAC;AAAA,EAChF;AACF;;;ACvCA,SAAS,oBAAoB;AAGtB,IAAM,oBAAmC;AAAA,EAC9C,OAAO;AAAA,IACL,gCAAgC;AAAA,MAC9B;AAAA,MACA;AAAA,QACE,OAAO;AAAA,UACL;AAAA,UACA;AAAA,UACA,GAAK,aAAa,QAAQ,8BAA8B,IAAsC,CAAC,GAAG,SAAS,CAAC;AAAA,QAC9G;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;;;ACfA,OAAO,eAAe;AAEf,IAAM,kBAAmC,UAAU,QAAQ,kBAAkB;;;AHI7E,IAAM,SAA0B,CAAC,GAAG,UAAU,aAAa,mBAAmB,GAAG,eAAe;","names":[]}
1
+ {"version":3,"sources":["../../src/index.ts","../../src/react/index.ts","../../src/reactImport/index.ts","../../src/storybook/index.ts"],"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 { reactImportConfig } from './reactImport/index.ts'\nimport { storybookConfig } from './storybook/index.ts'\n\nexport const reactStorybookConfig: Linter.Config[] = [...storybookConfig]\n\nexport const recommendedConfig: Linter.Config[] = [...xyRecommendedConfig, ...reactRecommendedConfig, reactImportConfig]\n\nexport const recommendedTypeCheckedConfig: Linter.Config[] = [\n ...xyRecommendedTypeCheckedConfig,\n ...reactRecommendedTypeCheckedConfig,\n reactImportConfig,\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 { reactImportConfig } from './reactImport/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,js,jsx}']\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-x': reactPlugin,\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 },\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 { importConfig } from '@xylabs/eslint-config-flat'\nimport type { Linter } from 'eslint'\n\nconst importRuleConfig = importConfig.find(config => config.rules?.['import-x/no-internal-modules'] !== undefined)\n\nexport const reactImportConfig: Linter.Config = {\n rules: {\n 'import-x/no-internal-modules': [\n 'warn',\n {\n allow: [\n 'react-dom/*',\n 'react-icons/*',\n ...((importRuleConfig?.rules?.['import-x/no-internal-modules'] as [string, { allow: string[] }])?.[1]?.allow ?? []),\n ],\n },\n ],\n },\n}\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"],"mappings":"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","names":["config","config"]}
@@ -1,3 +1,5 @@
1
1
  import type { Linter } from 'eslint';
2
- export declare const reactConfig: Linter.Config;
2
+ export declare const reactRecommendedConfig: Linter.Config[];
3
+ export declare const reactRecommendedTypeCheckedConfig: Linter.Config[];
4
+ export declare const reactConfig: Linter.Config[];
3
5
  //# 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,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AASpC,eAAO,MAAM,WAAW,EA6BR,MAAM,CAAC,MAAM,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;AAgE5C,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 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/reactImport/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAEpC,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,MAatC,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/reactImport/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAIpC,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,MAatC,CAAA"}
@@ -1,6 +1,10 @@
1
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[];
2
6
  export declare const config: Linter.Config[];
3
- export { reactConfig } from './react/index.ts';
7
+ export { reactConfig, reactRecommendedConfig, reactRecommendedTypeCheckedConfig, } from './react/index.ts';
4
8
  export { reactImportConfig } from './reactImport/index.ts';
5
9
  export { storybookConfig } from './storybook/index.ts';
6
10
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAMpC,eAAO,MAAM,MAAM,EAAE,MAAM,CAAC,MAAM,EAAsE,CAAA;AAExG,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAC1D,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AASpC,eAAO,MAAM,oBAAoB,EAAE,MAAM,CAAC,MAAM,EAAyB,CAAA;AAEzE,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAA2E,CAAA;AAExH,eAAO,MAAM,4BAA4B,EAAE,MAAM,CAAC,MAAM,EAIvD,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,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAC1D,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA"}
@@ -1,5 +1,8 @@
1
1
  // src/index.ts
2
- import { config as xyConfig } from "@xylabs/eslint-config-flat";
2
+ import {
3
+ recommendedConfig as xyRecommendedConfig,
4
+ recommendedTypeCheckedConfig as xyRecommendedTypeCheckedConfig
5
+ } from "@xylabs/eslint-config-flat";
3
6
 
4
7
  // src/react/index.ts
5
8
  import tsParser from "@typescript-eslint/parser";
@@ -10,39 +13,68 @@ import eslintReactRefreshPlugin from "eslint-plugin-react-refresh";
10
13
  import reactWebApiPlugin from "eslint-plugin-react-web-api";
11
14
  import reactPlugin from "eslint-plugin-react-x";
12
15
  import globals from "globals";
13
- var reactConfig = {
14
- files: ["**/*.{ts,tsx}"],
15
- ...reactPlugin.configs.recommended,
16
- ...reactDomPlugin.configs.recommended,
17
- ...reactWebApiPlugin.configs.recommended,
18
- ...reactNamingConventionPlugin.configs.recommended,
19
- ...eslintReactRefreshPlugin.configs.recommended,
20
- plugins: {
21
- "react-x": reactPlugin,
22
- "react-dom": reactDomPlugin,
23
- "react-web-api": reactWebApiPlugin,
24
- "react-refresh": eslintReactRefreshPlugin,
25
- "react-hooks": reactHooksPlugin,
26
- "react-naming-convention": reactNamingConventionPlugin
27
- },
28
- languageOptions: {
29
- parser: tsParser,
30
- parserOptions: { ecmaFeatures: { jsx: true } },
31
- globals: { ...globals.browser }
32
- },
33
- rules: {
34
- ...reactPlugin.configs["strict-typescript"].rules,
35
- ...reactDomPlugin.configs.strict.rules,
36
- ...reactWebApiPlugin.configs.recommended.rules,
37
- ...reactHooksPlugin.configs.recommended.rules,
38
- ...reactNamingConventionPlugin.configs.recommended.rules,
39
- ...eslintReactRefreshPlugin.configs.recommended.rules,
40
- "react-refresh/only-export-components": ["warn", { allowConstantExport: true }]
41
- }
42
- };
16
+ var reactFiles = ["**/*.{ts,tsx,js,jsx}"];
17
+ function scopeReactConfigs(configs, typeChecked = false) {
18
+ return (Array.isArray(configs) ? configs : [configs]).map((config2) => ({
19
+ ...config2,
20
+ files: reactFiles,
21
+ languageOptions: {
22
+ parser: tsParser,
23
+ ...config2.languageOptions,
24
+ globals: {
25
+ ...globals.browser,
26
+ ...config2.languageOptions?.globals
27
+ },
28
+ parserOptions: {
29
+ ecmaFeatures: { jsx: true },
30
+ ...config2.languageOptions?.parserOptions,
31
+ ...typeChecked ? { projectService: true, tsconfigRootDir: process.cwd() } : {}
32
+ }
33
+ }
34
+ }));
35
+ }
36
+ function createReactOverride(typeChecked = false) {
37
+ return {
38
+ files: reactFiles,
39
+ languageOptions: {
40
+ parser: tsParser,
41
+ parserOptions: {
42
+ ecmaFeatures: { jsx: true },
43
+ ...typeChecked ? { projectService: true, tsconfigRootDir: process.cwd() } : {}
44
+ },
45
+ globals: { ...globals.browser }
46
+ },
47
+ plugins: {
48
+ "react-x": reactPlugin,
49
+ "react-dom": reactDomPlugin,
50
+ "react-web-api": reactWebApiPlugin,
51
+ "react-refresh": eslintReactRefreshPlugin,
52
+ "react-hooks": reactHooksPlugin,
53
+ "react-naming-convention": reactNamingConventionPlugin
54
+ },
55
+ rules: {
56
+ ...reactDomPlugin.configs.strict.rules,
57
+ ...reactWebApiPlugin.configs.recommended.rules,
58
+ ...reactHooksPlugin.configs.flat.recommended.rules,
59
+ ...reactNamingConventionPlugin.configs.recommended.rules,
60
+ ...eslintReactRefreshPlugin.configs.recommended.rules,
61
+ "react-refresh/only-export-components": ["warn", { allowConstantExport: true }]
62
+ }
63
+ };
64
+ }
65
+ var reactRecommendedConfig = [
66
+ ...scopeReactConfigs(reactPlugin.configs["strict-typescript"]),
67
+ createReactOverride()
68
+ ];
69
+ var reactRecommendedTypeCheckedConfig = [
70
+ ...scopeReactConfigs(reactPlugin.configs["strict-type-checked"], true),
71
+ createReactOverride(true)
72
+ ];
73
+ var reactConfig = reactRecommendedTypeCheckedConfig;
43
74
 
44
75
  // src/reactImport/index.ts
45
76
  import { importConfig } from "@xylabs/eslint-config-flat";
77
+ var importRuleConfig = importConfig.find((config2) => config2.rules?.["import-x/no-internal-modules"] !== void 0);
46
78
  var reactImportConfig = {
47
79
  rules: {
48
80
  "import-x/no-internal-modules": [
@@ -51,7 +83,7 @@ var reactImportConfig = {
51
83
  allow: [
52
84
  "react-dom/*",
53
85
  "react-icons/*",
54
- ...importConfig.rules?.["import-x/no-internal-modules"]?.[1]?.allow ?? []
86
+ ...importRuleConfig?.rules?.["import-x/no-internal-modules"]?.[1]?.allow ?? []
55
87
  ]
56
88
  }
57
89
  ]
@@ -63,11 +95,28 @@ import storybook from "eslint-plugin-storybook";
63
95
  var storybookConfig = storybook.configs["flat/recommended"];
64
96
 
65
97
  // src/index.ts
66
- var config = [...xyConfig, reactConfig, reactImportConfig, ...storybookConfig];
98
+ var reactStorybookConfig = [...storybookConfig];
99
+ var recommendedConfig = [...xyRecommendedConfig, ...reactRecommendedConfig, reactImportConfig];
100
+ var recommendedTypeCheckedConfig = [
101
+ ...xyRecommendedTypeCheckedConfig,
102
+ ...reactRecommendedTypeCheckedConfig,
103
+ reactImportConfig
104
+ ];
105
+ var recommendedTypeCheckedWithStorybookConfig = [
106
+ ...recommendedTypeCheckedConfig,
107
+ ...reactStorybookConfig
108
+ ];
109
+ var config = recommendedTypeCheckedWithStorybookConfig;
67
110
  export {
68
111
  config,
69
112
  reactConfig,
70
113
  reactImportConfig,
114
+ reactRecommendedConfig,
115
+ reactRecommendedTypeCheckedConfig,
116
+ reactStorybookConfig,
117
+ recommendedConfig,
118
+ recommendedTypeCheckedConfig,
119
+ recommendedTypeCheckedWithStorybookConfig,
71
120
  storybookConfig
72
121
  };
73
122
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/index.ts","../../src/react/index.ts","../../src/reactImport/index.ts","../../src/storybook/index.ts"],"sourcesContent":["import { config as xyConfig } from '@xylabs/eslint-config-flat'\nimport type { Linter } from 'eslint'\n\nimport { reactConfig } from './react/index.ts'\nimport { reactImportConfig } from './reactImport/index.ts'\nimport { storybookConfig } from './storybook/index.ts'\n\nexport const config: Linter.Config[] = [...xyConfig, reactConfig, reactImportConfig, ...storybookConfig]\n\nexport { reactConfig } from './react/index.ts'\nexport { reactImportConfig } from './reactImport/index.ts'\nexport { storybookConfig } from './storybook/index.ts'\n","import tsParser from '@typescript-eslint/parser'\nimport type { 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\nexport const reactConfig = {\n files: ['**/*.{ts,tsx}'],\n ...reactPlugin.configs.recommended,\n ...reactDomPlugin.configs.recommended,\n ...reactWebApiPlugin.configs.recommended,\n ...reactNamingConventionPlugin.configs.recommended,\n ...eslintReactRefreshPlugin.configs.recommended,\n plugins: {\n 'react-x': reactPlugin,\n 'react-dom': reactDomPlugin,\n 'react-web-api': reactWebApiPlugin,\n 'react-refresh': eslintReactRefreshPlugin,\n 'react-hooks': reactHooksPlugin,\n 'react-naming-convention': reactNamingConventionPlugin,\n },\n languageOptions: {\n parser: tsParser,\n parserOptions: { ecmaFeatures: { jsx: true } },\n globals: { ...globals.browser },\n },\n rules: {\n ...reactPlugin.configs['strict-typescript'].rules,\n ...reactDomPlugin.configs.strict.rules,\n ...reactWebApiPlugin.configs.recommended.rules,\n ...reactHooksPlugin.configs.recommended.rules,\n ...reactNamingConventionPlugin.configs.recommended.rules,\n ...eslintReactRefreshPlugin.configs.recommended.rules,\n 'react-refresh/only-export-components': ['warn', { allowConstantExport: true }],\n },\n} as unknown as Linter.Config\n","import { importConfig } from '@xylabs/eslint-config-flat'\nimport type { Linter } from 'eslint'\n\nexport const reactImportConfig: Linter.Config = {\n rules: {\n 'import-x/no-internal-modules': [\n 'warn',\n {\n allow: [\n 'react-dom/*',\n 'react-icons/*',\n ...((importConfig.rules?.['import-x/no-internal-modules'] as [string, { allow: string[] }])?.[1]?.allow ?? []),\n ],\n },\n ],\n },\n}\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"],"mappings":";AAAA,SAAS,UAAU,gBAAgB;;;ACAnC,OAAO,cAAc;AAErB,OAAO,oBAAoB;AAC3B,OAAO,sBAAsB;AAC7B,OAAO,iCAAiC;AACxC,OAAO,8BAA8B;AACrC,OAAO,uBAAuB;AAC9B,OAAO,iBAAiB;AACxB,OAAO,aAAa;AAEb,IAAM,cAAc;AAAA,EACzB,OAAO,CAAC,eAAe;AAAA,EACvB,GAAG,YAAY,QAAQ;AAAA,EACvB,GAAG,eAAe,QAAQ;AAAA,EAC1B,GAAG,kBAAkB,QAAQ;AAAA,EAC7B,GAAG,4BAA4B,QAAQ;AAAA,EACvC,GAAG,yBAAyB,QAAQ;AAAA,EACpC,SAAS;AAAA,IACP,WAAW;AAAA,IACX,aAAa;AAAA,IACb,iBAAiB;AAAA,IACjB,iBAAiB;AAAA,IACjB,eAAe;AAAA,IACf,2BAA2B;AAAA,EAC7B;AAAA,EACA,iBAAiB;AAAA,IACf,QAAQ;AAAA,IACR,eAAe,EAAE,cAAc,EAAE,KAAK,KAAK,EAAE;AAAA,IAC7C,SAAS,EAAE,GAAG,QAAQ,QAAQ;AAAA,EAChC;AAAA,EACA,OAAO;AAAA,IACL,GAAG,YAAY,QAAQ,mBAAmB,EAAE;AAAA,IAC5C,GAAG,eAAe,QAAQ,OAAO;AAAA,IACjC,GAAG,kBAAkB,QAAQ,YAAY;AAAA,IACzC,GAAG,iBAAiB,QAAQ,YAAY;AAAA,IACxC,GAAG,4BAA4B,QAAQ,YAAY;AAAA,IACnD,GAAG,yBAAyB,QAAQ,YAAY;AAAA,IAChD,wCAAwC,CAAC,QAAQ,EAAE,qBAAqB,KAAK,CAAC;AAAA,EAChF;AACF;;;ACvCA,SAAS,oBAAoB;AAGtB,IAAM,oBAAmC;AAAA,EAC9C,OAAO;AAAA,IACL,gCAAgC;AAAA,MAC9B;AAAA,MACA;AAAA,QACE,OAAO;AAAA,UACL;AAAA,UACA;AAAA,UACA,GAAK,aAAa,QAAQ,8BAA8B,IAAsC,CAAC,GAAG,SAAS,CAAC;AAAA,QAC9G;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;;;ACfA,OAAO,eAAe;AAEf,IAAM,kBAAmC,UAAU,QAAQ,kBAAkB;;;AHI7E,IAAM,SAA0B,CAAC,GAAG,UAAU,aAAa,mBAAmB,GAAG,eAAe;","names":[]}
1
+ {"version":3,"sources":["../../src/index.ts","../../src/react/index.ts","../../src/reactImport/index.ts","../../src/storybook/index.ts"],"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 { reactImportConfig } from './reactImport/index.ts'\nimport { storybookConfig } from './storybook/index.ts'\n\nexport const reactStorybookConfig: Linter.Config[] = [...storybookConfig]\n\nexport const recommendedConfig: Linter.Config[] = [...xyRecommendedConfig, ...reactRecommendedConfig, reactImportConfig]\n\nexport const recommendedTypeCheckedConfig: Linter.Config[] = [\n ...xyRecommendedTypeCheckedConfig,\n ...reactRecommendedTypeCheckedConfig,\n reactImportConfig,\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 { reactImportConfig } from './reactImport/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,js,jsx}']\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-x': reactPlugin,\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 },\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 { importConfig } from '@xylabs/eslint-config-flat'\nimport type { Linter } from 'eslint'\n\nconst importRuleConfig = importConfig.find(config => config.rules?.['import-x/no-internal-modules'] !== undefined)\n\nexport const reactImportConfig: Linter.Config = {\n rules: {\n 'import-x/no-internal-modules': [\n 'warn',\n {\n allow: [\n 'react-dom/*',\n 'react-icons/*',\n ...((importRuleConfig?.rules?.['import-x/no-internal-modules'] as [string, { allow: string[] }])?.[1]?.allow ?? []),\n ],\n },\n ],\n },\n}\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"],"mappings":"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","names":["config","config"]}
@@ -1,3 +1,5 @@
1
1
  import type { Linter } from 'eslint';
2
- export declare const reactConfig: Linter.Config;
2
+ export declare const reactRecommendedConfig: Linter.Config[];
3
+ export declare const reactRecommendedTypeCheckedConfig: Linter.Config[];
4
+ export declare const reactConfig: Linter.Config[];
3
5
  //# 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,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AASpC,eAAO,MAAM,WAAW,EA6BR,MAAM,CAAC,MAAM,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;AAgE5C,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 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/reactImport/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAEpC,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,MAatC,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/reactImport/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAIpC,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,MAatC,CAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xylabs/eslint-config-react-flat",
3
- "version": "7.8.6",
3
+ "version": "7.9.0",
4
4
  "description": "ESLint Config used throughout XY Labs TypeScript/JavaScript libraries and react projects",
5
5
  "keywords": [
6
6
  "xylabs",
@@ -37,7 +37,7 @@
37
37
  ],
38
38
  "dependencies": {
39
39
  "@typescript-eslint/parser": "~8.58.0",
40
- "@xylabs/eslint-config-flat": "~7.8.6",
40
+ "@xylabs/eslint-config-flat": "~7.9.0",
41
41
  "eslint-plugin-react-dom": "^4.2.3",
42
42
  "eslint-plugin-react-hooks": "^7.0.1",
43
43
  "eslint-plugin-react-naming-convention": "^4.2.3",
@@ -50,20 +50,20 @@
50
50
  "devDependencies": {
51
51
  "@babel/core": "^7.29.0",
52
52
  "@testing-library/dom": "^10.4.1",
53
- "@types/node": "^25.5.0",
54
- "@xylabs/ts-scripts-common": "~7.8.6",
55
- "@xylabs/ts-scripts-yarn3": "~7.8.6",
56
- "@xylabs/tsconfig": "~7.8.6",
53
+ "@types/node": "^25.5.2",
54
+ "@xylabs/ts-scripts-common": "~7.9.0",
55
+ "@xylabs/ts-scripts-yarn3": "~7.9.0",
56
+ "@xylabs/tsconfig": "~7.9.0",
57
57
  "acorn": "^8.16.0",
58
58
  "cosmiconfig": "^9.0.1",
59
59
  "esbuild": "^0.28.0",
60
- "eslint": "^10.1.0",
60
+ "eslint": "^10.2.0",
61
61
  "react": "^19.2.4",
62
62
  "react-dom": "^19.2.4",
63
63
  "rollup": "^4.60.1",
64
64
  "storybook": "^10.3.4",
65
65
  "typescript": "^5.9.3",
66
- "vite": "^8.0.3",
66
+ "vite": "^8.0.5",
67
67
  "vitest": "~4.1.2",
68
68
  "zod": "^4.3.6"
69
69
  },