@greenberry/linting-config 0.2.35 → 1.0.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
@@ -19,10 +19,11 @@ https://www.npmjs.com/package/@greenberry/linting-config
19
19
  1. Make your changes
20
20
  2. Review and merge your changes into `main`
21
21
  3. Run `npm run build`
22
- 4. If it is a patch update: run `npm run release:patch`
23
- 5. If it is a minor update: run `npm run release:minor`
24
- 6. If it is a major update: run `npm run release:major`
25
- 7. Push the changed version number to `main`
22
+ 4. Run `npm login` and login with the Marvin account in 1Password
23
+ 5. If it is a patch update: run `npm run release:patch`
24
+ 6. If it is a minor update: run `npm run release:minor`
25
+ 7. If it is a major update: run `npm run release:major`
26
+ 8. Push the changed version number to `main`
26
27
 
27
28
  ## Install
28
29
 
@@ -3,9 +3,8 @@ import importPlugin from "eslint-plugin-import-x";
3
3
  import { createTypeScriptImportResolver } from "eslint-import-resolver-typescript";
4
4
  import jsxA11yPlugin from "eslint-plugin-jsx-a11y";
5
5
  import perfectionistPlugin from "eslint-plugin-perfectionist";
6
- import prettierPlugin from "eslint-plugin-prettier";
6
+ import prettierRecommended from "eslint-plugin-prettier/recommended";
7
7
  import reactCompilerPlugin from "eslint-plugin-react-compiler";
8
- import reactHooksPlugin from "eslint-plugin-react-hooks";
9
8
  import unicornPlugin from "eslint-plugin-unicorn";
10
9
  import { defineConfig } from "eslint/config";
11
10
  import globals from "globals";
@@ -13,23 +12,15 @@ import tseslint from "typescript-eslint";
13
12
  import eslintReact from "@eslint-react/eslint-plugin";
14
13
  import eslint from "@eslint/js";
15
14
  import nextPlugin from "@next/eslint-plugin-next";
16
- // Extract only meta and rules for TypeScript compatibility with ESLint flat config
17
- // The plugins include a 'configs' property that's incompatible with the Plugin type
18
- // but we only need meta and rules for flat config, so we extract just those
19
- const reactHooksPluginTyped = {
20
- meta: reactHooksPlugin.meta,
21
- rules: reactHooksPlugin.rules,
22
- };
23
- const eslintReactPlugins =
24
- // @ts-ignore - plugins property exists at runtime but not in types
25
- eslintReact.configs.recommended.plugins || {};
26
15
  export default defineConfig(eslint.configs.recommended, tseslint.configs.strict, tseslint.configs.stylistic, nextPlugin.configs.recommended, nextPlugin.configs["core-web-vitals"], {
27
16
  files: [
28
17
  ".jest/**/*.{js,mjs,cjs,jsx,ts,tsx}",
29
18
  "src/**/*.{js,mjs,cjs,jsx,ts,tsx}",
30
19
  "scripts/**/*.{js,mjs,cjs,jsx,ts,tsx}",
31
20
  "config/**/*.{js,mjs,cjs,jsx,ts,tsx}",
21
+ "public/**/*.{js,mjs,cjs,ts}",
32
22
  ],
23
+ extends: [eslintReact.configs["recommended-type-checked"]],
33
24
  languageOptions: {
34
25
  parserOptions: {
35
26
  ecmaVersion: "latest",
@@ -47,13 +38,10 @@ export default defineConfig(eslint.configs.recommended, tseslint.configs.strict,
47
38
  },
48
39
  },
49
40
  plugins: {
50
- ...eslintReactPlugins,
51
- "react-hooks": reactHooksPluginTyped,
52
41
  "import-x": importPlugin,
53
42
  unicorn: unicornPlugin,
54
43
  perfectionist: perfectionistPlugin,
55
44
  "jsx-a11y": jsxA11yPlugin,
56
- prettier: prettierPlugin,
57
45
  "react-compiler": reactCompilerPlugin,
58
46
  },
59
47
  settings: {
@@ -63,24 +51,13 @@ export default defineConfig(eslint.configs.recommended, tseslint.configs.strict,
63
51
  project: "./tsconfig.json",
64
52
  }),
65
53
  ],
66
- react: {
67
- version: "detect",
68
- },
69
- // Disable conflicts between @eslint-react/eslint-plugin and eslint-plugin-react-hooks
70
- // when both plugins are used together
71
- "@eslint-react/eslint-plugin": {
72
- "disable-conflict-eslint-plugin-react-hooks": true,
73
- },
74
- // Inform rules about React Compiler compilation mode for better rule accuracy
75
54
  "react-x": {
76
55
  compilationMode: "infer", // Options: "infer" | "annotation" | "off"
77
56
  },
78
57
  },
79
58
  rules: {
80
- ...eslintReact.configs.recommended.rules,
81
- ...reactHooksPlugin.configs.recommended.rules,
82
- ...jsxA11yPlugin.configs.recommended.rules,
83
- // TypeScript rules
59
+ ...jsxA11yPlugin.configs.strict.rules,
60
+ // ─── TypeScript ────────────────────────────────────────
84
61
  "@typescript-eslint/array-type": ["error", { default: "array" }],
85
62
  "@typescript-eslint/ban-ts-comment": "off",
86
63
  "@typescript-eslint/consistent-type-assertions": "error",
@@ -110,16 +87,59 @@ export default defineConfig(eslint.configs.recommended, tseslint.configs.strict,
110
87
  disallowTypeAnnotations: false,
111
88
  },
112
89
  ],
113
- // React rules (using @eslint-react/eslint-plugin)
90
+ // ─── React Core (overrides on recommended-type-checked)
91
+ "@eslint-react/exhaustive-deps": "error",
114
92
  "@eslint-react/no-array-index-key": "error",
115
- "@eslint-react/jsx-shorthand-boolean": "error",
116
- "@eslint-react/no-unnecessary-use-prefix": "warn",
93
+ "@eslint-react/no-duplicate-key": "error",
94
+ "@eslint-react/no-leaked-conditional-rendering": "error",
95
+ "@eslint-react/no-missing-key": "error",
96
+ "@eslint-react/no-nested-component-definitions": "error",
97
+ "@eslint-react/no-nested-lazy-component-declarations": "error",
98
+ // Strict rules (not in recommended, added for quality)
99
+ "@eslint-react/jsx-no-children-prop": "error",
100
+ "@eslint-react/jsx-no-children-prop-with-children": "error",
101
+ "@eslint-react/jsx-no-key-after-spread": "error",
102
+ "@eslint-react/no-class-component": "error",
103
+ "@eslint-react/no-context-provider": "warn",
104
+ "@eslint-react/no-forward-ref": "warn",
105
+ "@eslint-react/no-misused-capture-owner-stack": "error",
106
+ "@eslint-react/no-unstable-context-value": "warn",
107
+ "@eslint-react/no-unstable-default-props": "warn",
117
108
  "@eslint-react/no-unused-props": "error",
118
109
  "@eslint-react/no-unused-state": "error",
119
- "@eslint-react/dom/no-void-elements-with-children": "error",
120
- "react-hooks/exhaustive-deps": "error",
110
+ "@eslint-react/no-use-context": "warn",
111
+ "@eslint-react/jsx-no-useless-fragment": "warn",
112
+ "@eslint-react/prefer-destructuring-assignment": "warn",
113
+ // ─── React Hooks ───────────────────────────────────────
114
+ "@eslint-react/no-unnecessary-use-callback": "warn",
115
+ "@eslint-react/no-unnecessary-use-memo": "warn",
116
+ // ─── React DOM ─────────────────────────────────────────
117
+ "@eslint-react/dom-no-missing-button-type": "warn",
118
+ "@eslint-react/dom-no-missing-iframe-sandbox": "warn",
119
+ "@eslint-react/dom-no-unsafe-target-blank": "warn",
120
+ "@eslint-react/dom-no-script-url": "error",
121
+ "@eslint-react/dom-no-use-form-state": "warn",
122
+ // ─── Web API (leak detection in effects) ───────────────
123
+ "@eslint-react/web-api-no-leaked-event-listener": "warn",
124
+ "@eslint-react/web-api-no-leaked-interval": "warn",
125
+ "@eslint-react/web-api-no-leaked-resize-observer": "warn",
126
+ "@eslint-react/web-api-no-leaked-timeout": "warn",
127
+ // ─── React Conventions ─────────────────────────────────
128
+ "@eslint-react/naming-convention-id-name": "warn",
129
+ "@eslint-react/naming-convention-ref-name": "warn",
130
+ "@eslint-react/use-state": [
131
+ "warn",
132
+ {
133
+ enforceAssignment: true,
134
+ enforceSetterName: true,
135
+ },
136
+ ],
137
+ "@eslint-react/set-state-in-effect": "warn",
138
+ "@eslint-react/purity": "warn",
139
+ "@eslint-react/rsc-function-definition": "error",
140
+ // ─── React Compiler ────────────────────────────────────
121
141
  "react-compiler/react-compiler": "error",
122
- // Import rules
142
+ // ─── Import ────────────────────────────────────────────
123
143
  "import-x/extensions": [
124
144
  "error",
125
145
  "ignorePackages",
@@ -132,6 +152,7 @@ export default defineConfig(eslint.configs.recommended, tseslint.configs.strict,
132
152
  stories: "always",
133
153
  },
134
154
  ],
155
+ "import-x/no-duplicates": "error",
135
156
  "import-x/prefer-default-export": "off",
136
157
  "import-x/no-extraneous-dependencies": [
137
158
  "error",
@@ -139,7 +160,7 @@ export default defineConfig(eslint.configs.recommended, tseslint.configs.strict,
139
160
  devDependencies: true,
140
161
  },
141
162
  ],
142
- // Unicorn rules
163
+ // ─── Unicorn ───────────────────────────────────────────
143
164
  "unicorn/catch-error-name": "error",
144
165
  "unicorn/error-message": "error",
145
166
  "unicorn/escape-case": "error",
@@ -158,7 +179,7 @@ export default defineConfig(eslint.configs.recommended, tseslint.configs.strict,
158
179
  "unicorn/prefer-query-selector": "error",
159
180
  "unicorn/prefer-type-error": "error",
160
181
  "unicorn/throw-new-error": "error",
161
- // Perfectionist rules
182
+ // ─── Perfectionist ─────────────────────────────────────
162
183
  "perfectionist/sort-jsx-props": [
163
184
  "error",
164
185
  {
@@ -173,21 +194,14 @@ export default defineConfig(eslint.configs.recommended, tseslint.configs.strict,
173
194
  groups: ["key", "ref", "id", "unknown", "className"],
174
195
  },
175
196
  ],
176
- // React Hooks Extra rules (migrated to @eslint-react/eslint-plugin)
177
- "@eslint-react/set-state-in-effect": "warn",
178
- "@eslint-react/use-state": [
179
- "warn",
180
- { enforceLazyInitialization: true },
181
- ],
182
- "@eslint-react/use-memo": "warn",
183
- "@eslint-react/no-unnecessary-use-callback": "warn",
184
- "@eslint-react/no-unnecessary-use-memo": "warn",
185
- "@eslint-react/exhaustive-deps": "off",
186
- // React Compiler compatibility rules
187
- "@eslint-react/unsupported-syntax": "error",
188
- // Other rules
189
- "jsx-a11y/alt-text": "error",
197
+ // ─── Accessibility (jsx-a11y strict + extras not in presets)
198
+ "jsx-a11y/anchor-ambiguous-text": "warn",
190
199
  "jsx-a11y/media-has-caption": "warn",
200
+ "jsx-a11y/accessible-emoji": "warn",
201
+ "jsx-a11y/lang": "warn",
202
+ "jsx-a11y/no-aria-hidden-on-focusable": "error",
203
+ "jsx-a11y/prefer-tag-over-role": "warn",
204
+ // ─── General ───────────────────────────────────────────
191
205
  "no-unused-expressions": "error",
192
206
  "no-inner-declarations": "error",
193
207
  "no-process-env": "error",
@@ -208,8 +222,6 @@ export default defineConfig(eslint.configs.recommended, tseslint.configs.strict,
208
222
  ],
209
223
  "no-console": ["warn", { allow: ["warn", "error", "info"] }],
210
224
  curly: ["error", "all"],
211
- // Prettier integration
212
- "prettier/prettier": "error",
213
225
  },
214
226
  }, {
215
227
  files: [
@@ -218,20 +230,35 @@ export default defineConfig(eslint.configs.recommended, tseslint.configs.strict,
218
230
  ],
219
231
  rules: {
220
232
  "@eslint-react/rules-of-hooks": "off",
233
+ "@eslint-react/no-unstable-context-value": "off",
234
+ "@eslint-react/no-unstable-default-props": "off",
235
+ "@eslint-react/no-unused-props": "off",
236
+ "@eslint-react/prefer-destructuring-assignment": "off",
237
+ "no-process-env": "off",
221
238
  },
222
- }, {
239
+ },
240
+ // Must be last — disables all ESLint formatting rules that conflict with prettier
241
+ // (covers tseslint.configs.stylistic rules like semi, quotes, indent, etc.)
242
+ prettierRecommended, {
223
243
  ignores: [
244
+ // Common
224
245
  "**/node_modules/**",
225
246
  "**/*.gql",
226
247
  "**/.next/**",
227
- "**/.storybook/**",
228
248
  "**/.vercel/**",
229
249
  "**/.cursor/**",
230
250
  "**/.husky/**",
231
251
  "**/.git/**",
232
252
  "**/coverage/**",
253
+ // TypeScript
233
254
  "**/*.tsbuildinfo",
255
+ // Payload
234
256
  "**/payload-types.ts",
257
+ "**/migrations/**/*.ts",
258
+ "**/migrations/**/*.js",
259
+ "**/generated/**/*.ts",
260
+ // Storybook
261
+ "**/.storybook/**",
235
262
  "**/storybook-static/**",
236
263
  ],
237
264
  });
@@ -1 +1 @@
1
- {"version":3,"file":"eslint.config.js","sourceRoot":"","sources":["../src/eslint.config.js"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"eslint.config.js","sourceRoot":"","sources":["../src/eslint.config.js"],"names":[],"mappings":"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"}
@@ -24,9 +24,8 @@ export default defineConfig(
24
24
  "storybook/use-storybook-testing-library": "error",
25
25
  "@eslint-react/no-array-index-key": "off",
26
26
  "@eslint-react/rules-of-hooks": "off",
27
- "react-hooks/rules-of-hooks": "off",
27
+ "@eslint-react/exhaustive-deps": "warn",
28
28
  "import-x/no-anonymous-default-export": "off",
29
- "react-hooks/exhaustive-deps": "warn",
30
29
  },
31
30
  },
32
31
  // Storybook main config file
@@ -1 +1 @@
1
- {"version":3,"file":"eslint.storybook.config.js","sourceRoot":"","sources":["../src/eslint.storybook.config.js"],"names":[],"mappings":"AAAA,OAAO,eAAe,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAE7C,eAAe,YAAY;AACzB,kCAAkC;AAClC;IACE,KAAK,EAAE;QACL,2CAA2C;QAC3C,yCAAyC;KAC1C;IACD,OAAO,EAAE;QACP,SAAS,EAAE,eAAe;KAC3B;IACD,KAAK,EAAE;QACL,8CAA8C;QAC9C,8BAA8B,EAAE,OAAO;QACvC,oCAAoC,EAAE,OAAO;QAC7C,2BAA2B,EAAE,OAAO;QACpC,+BAA+B,EAAE,MAAM;QACvC,mCAAmC,EAAE,MAAM;QAC3C,yBAAyB,EAAE,OAAO;QAClC,8BAA8B,EAAE,MAAM;QACtC,yBAAyB,EAAE,OAAO;QAClC,gCAAgC,EAAE,OAAO;QACzC,yCAAyC,EAAE,OAAO;QAClD,kCAAkC,EAAE,KAAK;QACzC,8BAA8B,EAAE,KAAK;QACrC,4BAA4B,EAAE,KAAK;QACnC,sCAAsC,EAAE,KAAK;QAC7C,6BAA6B,EAAE,MAAM;KACtC;CACF;AACD,6BAA6B;AAC7B;IACE,KAAK,EAAE,CAAC,kCAAkC,CAAC;IAC3C,OAAO,EAAE;QACP,SAAS,EAAE,eAAe;KAC3B;IACD,KAAK,EAAE;QACL,iCAAiC,EAAE,OAAO;KAC3C;CACF,CACF,CAAC"}
1
+ {"version":3,"file":"eslint.storybook.config.js","sourceRoot":"","sources":["../src/eslint.storybook.config.js"],"names":[],"mappings":"AAAA,OAAO,eAAe,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAE7C,eAAe,YAAY;AACzB,kCAAkC;AAClC;IACE,KAAK,EAAE;QACL,2CAA2C;QAC3C,yCAAyC;KAC1C;IACD,OAAO,EAAE;QACP,SAAS,EAAE,eAAe;KAC3B;IACD,KAAK,EAAE;QACL,8CAA8C;QAC9C,8BAA8B,EAAE,OAAO;QACvC,oCAAoC,EAAE,OAAO;QAC7C,2BAA2B,EAAE,OAAO;QACpC,+BAA+B,EAAE,MAAM;QACvC,mCAAmC,EAAE,MAAM;QAC3C,yBAAyB,EAAE,OAAO;QAClC,8BAA8B,EAAE,MAAM;QACtC,yBAAyB,EAAE,OAAO;QAClC,gCAAgC,EAAE,OAAO;QACzC,yCAAyC,EAAE,OAAO;QAClD,kCAAkC,EAAE,KAAK;QACzC,8BAA8B,EAAE,KAAK;QACrC,+BAA+B,EAAE,MAAM;QACvC,sCAAsC,EAAE,KAAK;KAC9C;CACF;AACD,6BAA6B;AAC7B;IACE,KAAK,EAAE,CAAC,kCAAkC,CAAC;IAC3C,OAAO,EAAE;QACP,SAAS,EAAE,eAAe;KAC3B;IACD,KAAK,EAAE;QACL,iCAAiC,EAAE,OAAO;KAC3C;CACF,CACF,CAAC"}
@@ -1,86 +1,4 @@
1
1
  export default config;
2
- declare const config: ({
3
- files: string[];
4
- languageOptions: {
5
- sourceType: string;
6
- parserOptions: {
7
- project: string;
8
- };
9
- };
10
- plugins: any;
11
- settings: {
12
- "import-x/resolver-next": {
13
- interfaceVersion: number;
14
- name: string;
15
- resolve(source: string, file: string): import("eslint-plugin-import-x").ResolvedResult;
16
- }[];
17
- react: {
18
- version: string;
19
- };
20
- };
21
- rules: {
22
- "@eslint-react/no-array-index-key": string;
23
- "@eslint-react/jsx-shorthand-boolean": string;
24
- "@eslint-react/no-unnecessary-use-prefix": string;
25
- "@eslint-react/no-unused-props": string;
26
- "@eslint-react/no-unused-state": string;
27
- "@eslint-react/dom/no-void-elements-with-children": string;
28
- "react-hooks/exhaustive-deps": string;
29
- "react-compiler/react-compiler": string;
30
- "import-x/prefer-default-export": string;
31
- "import-x/no-extraneous-dependencies": (string | {
32
- devDependencies: boolean;
33
- })[];
34
- "unicorn/catch-error-name": string;
35
- "unicorn/error-message": string;
36
- "unicorn/escape-case": string;
37
- "unicorn/explicit-length-check": string;
38
- "unicorn/new-for-builtins": string;
39
- "unicorn/no-instanceof-builtins": string;
40
- "unicorn/no-abusive-eslint-disable": string;
41
- "unicorn/no-console-spaces": string;
42
- "unicorn/no-for-loop": string;
43
- "unicorn/no-hex-escape": string;
44
- "unicorn/no-new-buffer": string;
45
- "unicorn/no-unreadable-array-destructuring": string;
46
- "unicorn/no-zero-fractions": string;
47
- "unicorn/number-literal-case": string;
48
- "unicorn/prefer-includes": string;
49
- "unicorn/prefer-query-selector": string;
50
- "unicorn/prefer-type-error": string;
51
- "unicorn/throw-new-error": string;
52
- "@next/next/no-html-link-for-pages": string;
53
- "@next/next/no-img-element": string;
54
- "@next/next/no-unwanted-polyfillio": string;
55
- "@next/next/no-sync-scripts": string;
56
- "@next/next/no-script-component-in-head": string;
57
- "@next/next/google-font-display": string;
58
- "@next/next/google-font-preconnect": string;
59
- "@next/next/next-script-for-ga": string;
60
- "@next/next/no-typos": string;
61
- "@next/next/no-duplicate-head": string;
62
- "jsx-a11y/alt-text": string;
63
- "jsx-a11y/media-has-caption": string;
64
- "no-unused-expressions": string;
65
- "no-inner-declarations": string;
66
- "no-process-env": string;
67
- "no-restricted-syntax": (string | {
68
- selector: string;
69
- message: string;
70
- })[];
71
- "no-console": (string | {
72
- allow: string[];
73
- })[];
74
- curly: string[];
75
- "prettier/prettier": string;
76
- };
77
- ignores?: never;
78
- } | {
79
- ignores: string[];
80
- files?: never;
81
- languageOptions?: never;
82
- plugins?: never;
83
- settings?: never;
84
- rules?: never;
85
- })[];
2
+ /** @type {import("eslint").Linter.Config[]} */
3
+ declare const config: import("eslint").Linter.Config[];
86
4
  //# sourceMappingURL=eslint.config.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"eslint.config.d.ts","sourceRoot":"","sources":["../../src/legacy/eslint.config.js"],"names":[],"mappings":";AAWA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KA2HE"}
1
+ {"version":3,"file":"eslint.config.d.ts","sourceRoot":"","sources":["../../src/legacy/eslint.config.js"],"names":[],"mappings":";AAUA,+CAA+C;AAC/C,sBADW,OAAO,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,CAkLzC"}
@@ -1,12 +1,12 @@
1
1
  import importPlugin from "eslint-plugin-import-x";
2
2
  import { createTypeScriptImportResolver } from "eslint-import-resolver-typescript";
3
3
  import jsxA11yPlugin from "eslint-plugin-jsx-a11y";
4
- import prettierPlugin from "eslint-plugin-prettier";
4
+ import prettierRecommended from "eslint-plugin-prettier/recommended";
5
5
  import eslintReact from "@eslint-react/eslint-plugin";
6
6
  import reactCompilerPlugin from "eslint-plugin-react-compiler";
7
- import reactHooksPlugin from "eslint-plugin-react-hooks";
8
7
  import unicornPlugin from "eslint-plugin-unicorn";
9
8
  import nextPlugin from "@next/eslint-plugin-next";
9
+ /** @type {import("eslint").Linter.Config[]} */
10
10
  const config = [
11
11
  {
12
12
  files: ["**/*.{js,mjs,cjs,jsx,ts,tsx}"],
@@ -20,14 +20,11 @@ const config = [
20
20
  // Spread plugins from @eslint-react/eslint-plugin recommended config
21
21
  // This includes: @eslint-react, @eslint-react/dom, @eslint-react/web-api,
22
22
  // @eslint-react/hooks-extra, @eslint-react/naming-convention
23
- // @ts-expect-error - plugins property exists at runtime but not in types
24
23
  ...eslintReact.configs.recommended.plugins,
25
- "react-hooks": reactHooksPlugin,
26
24
  "import-x": importPlugin,
27
25
  unicorn: unicornPlugin,
28
26
  "@next/next": nextPlugin,
29
27
  "jsx-a11y": jsxA11yPlugin,
30
- prettier: prettierPlugin,
31
28
  "react-compiler": reactCompilerPlugin,
32
29
  },
33
30
  settings: {
@@ -36,25 +33,69 @@ const config = [
36
33
  project: "./jsconfig.json",
37
34
  }),
38
35
  ],
39
- react: {
40
- version: "detect",
36
+ "react-x": {
37
+ compilationMode: "infer",
41
38
  },
42
39
  },
43
40
  rules: {
44
- // Include recommended rules
41
+ // Include recommended rules from @eslint-react (replaces eslint-plugin-react-hooks)
45
42
  ...eslintReact.configs.recommended.rules,
46
- ...reactHooksPlugin.configs.recommended.rules,
47
- ...jsxA11yPlugin.configs.recommended.rules,
43
+ ...jsxA11yPlugin.configs.strict.rules,
48
44
  ...nextPlugin.configs.recommended.rules,
49
- // React rules (using @eslint-react/eslint-plugin)
45
+ // ─── React Core (overrides on recommended defaults) ────
46
+ "@eslint-react/exhaustive-deps": "error",
50
47
  "@eslint-react/no-array-index-key": "error",
51
- "@eslint-react/jsx-shorthand-boolean": "error",
52
- "@eslint-react/no-unnecessary-use-prefix": "warn",
48
+ "@eslint-react/no-duplicate-key": "error",
49
+ "@eslint-react/no-missing-key": "error",
50
+ "@eslint-react/no-nested-component-definitions": "error",
51
+ "@eslint-react/no-nested-lazy-component-declarations": "error",
52
+ // Strict rules (not in recommended, added for quality)
53
+ "@eslint-react/jsx-no-children-prop": "error",
54
+ "@eslint-react/jsx-no-children-prop-with-children": "error",
55
+ "@eslint-react/jsx-no-key-after-spread": "error",
56
+ "@eslint-react/no-class-component": "error",
57
+ "@eslint-react/no-context-provider": "warn",
58
+ "@eslint-react/no-forward-ref": "warn",
59
+ "@eslint-react/no-misused-capture-owner-stack": "error",
60
+ "@eslint-react/no-unstable-context-value": "warn",
61
+ "@eslint-react/no-unstable-default-props": "warn",
53
62
  "@eslint-react/no-unused-props": "error",
54
63
  "@eslint-react/no-unused-state": "error",
55
- "@eslint-react/dom/no-void-elements-with-children": "error",
56
- "react-hooks/exhaustive-deps": "error",
64
+ "@eslint-react/no-use-context": "warn",
65
+ "@eslint-react/jsx-no-useless-fragment": "warn",
66
+ "@eslint-react/prefer-destructuring-assignment": "warn",
67
+ "@eslint-react/no-unnecessary-use-prefix": "warn",
68
+ // ─── React Hooks ───────────────────────────────────────
69
+ "@eslint-react/no-unnecessary-use-callback": "warn",
70
+ "@eslint-react/no-unnecessary-use-memo": "warn",
71
+ // ─── React DOM ─────────────────────────────────────────
72
+ "@eslint-react/dom-no-missing-button-type": "warn",
73
+ "@eslint-react/dom-no-void-elements-with-children": "error",
74
+ "@eslint-react/dom-no-missing-iframe-sandbox": "warn",
75
+ "@eslint-react/dom-no-unsafe-target-blank": "warn",
76
+ "@eslint-react/dom-no-script-url": "error",
77
+ "@eslint-react/dom-no-use-form-state": "warn",
78
+ // ─── Web API (leak detection in effects) ───────────────
79
+ "@eslint-react/web-api-no-leaked-event-listener": "warn",
80
+ "@eslint-react/web-api-no-leaked-interval": "warn",
81
+ "@eslint-react/web-api-no-leaked-resize-observer": "warn",
82
+ "@eslint-react/web-api-no-leaked-timeout": "warn",
83
+ // ─── React Conventions ─────────────────────────────────
84
+ "@eslint-react/naming-convention-id-name": "warn",
85
+ "@eslint-react/naming-convention-ref-name": "warn",
86
+ "@eslint-react/use-state": [
87
+ "warn",
88
+ {
89
+ enforceAssignment: true,
90
+ enforceSetterName: true,
91
+ },
92
+ ],
93
+ "@eslint-react/set-state-in-effect": "warn",
94
+ "@eslint-react/purity": "warn",
95
+ "@eslint-react/rsc-function-definition": "error",
96
+ // ─── React Compiler ────────────────────────────────────
57
97
  "react-compiler/react-compiler": "error",
98
+ // ─── Import ────────────────────────────────────────────
58
99
  "import-x/prefer-default-export": "off",
59
100
  "import-x/no-extraneous-dependencies": [
60
101
  "error",
@@ -62,7 +103,7 @@ const config = [
62
103
  devDependencies: true,
63
104
  },
64
105
  ],
65
- // Unicorn rules
106
+ // ─── Unicorn ───────────────────────────────────────────
66
107
  "unicorn/catch-error-name": "error",
67
108
  "unicorn/error-message": "error",
68
109
  "unicorn/escape-case": "error",
@@ -81,7 +122,7 @@ const config = [
81
122
  "unicorn/prefer-query-selector": "error",
82
123
  "unicorn/prefer-type-error": "error",
83
124
  "unicorn/throw-new-error": "error",
84
- // Next.js specific rules
125
+ // ─── Next.js ───────────────────────────────────────────
85
126
  "@next/next/no-html-link-for-pages": "error",
86
127
  "@next/next/no-img-element": "error",
87
128
  "@next/next/no-unwanted-polyfillio": "error",
@@ -92,9 +133,14 @@ const config = [
92
133
  "@next/next/next-script-for-ga": "error",
93
134
  "@next/next/no-typos": "error",
94
135
  "@next/next/no-duplicate-head": "error",
95
- // Other rules
96
- "jsx-a11y/alt-text": "error",
136
+ // ─── Accessibility (jsx-a11y strict + extras not in presets) ─
137
+ "jsx-a11y/anchor-ambiguous-text": "warn",
97
138
  "jsx-a11y/media-has-caption": "warn",
139
+ "jsx-a11y/accessible-emoji": "warn",
140
+ "jsx-a11y/lang": "warn",
141
+ "jsx-a11y/no-aria-hidden-on-focusable": "error",
142
+ "jsx-a11y/prefer-tag-over-role": "warn",
143
+ // ─── General ───────────────────────────────────────────
98
144
  "no-unused-expressions": "error",
99
145
  "no-inner-declarations": "error",
100
146
  "no-process-env": "error",
@@ -115,10 +161,10 @@ const config = [
115
161
  ],
116
162
  "no-console": ["warn", { allow: ["warn", "error", "info"] }],
117
163
  curly: ["error", "all"],
118
- // Prettier integration
119
- "prettier/prettier": "error",
120
164
  },
121
165
  },
166
+ // Must be last — disables all ESLint formatting rules that conflict with prettier
167
+ prettierRecommended,
122
168
  {
123
169
  ignores: [".next/*", "coverage/*", "src/env.ts", "**/*.gql"],
124
170
  },
@@ -1 +1 @@
1
- {"version":3,"file":"eslint.config.js","sourceRoot":"","sources":["../../src/legacy/eslint.config.js"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"eslint.config.js","sourceRoot":"","sources":["../../src/legacy/eslint.config.js"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@greenberry/linting-config",
3
- "version": "0.2.35",
3
+ "version": "1.0.0",
4
4
  "private": false,
5
5
  "main": "dist/index.js",
6
6
  "type": "module",
@@ -18,42 +18,45 @@
18
18
  "build": "npm run clean && tsc",
19
19
  "release:patch": "npm run build && npm version patch && npm publish --access public",
20
20
  "release:minor": "npm run build && npm version minor && npm publish --access public",
21
- "release:major": "npm run build && npm version major && npm publish --access public"
21
+ "release:major": "npm run build && npm version major && npm publish --access public",
22
+ "publish:beta": "npm run build && npm publish --access public --tag beta",
23
+ "release:beta": "npm run build && npm version prerelease --preid=beta && npm publish --access public --tag beta"
22
24
  },
23
25
  "files": [
24
26
  "dist"
25
27
  ],
26
28
  "overrides": {
27
- "minimatch": "^10.2.1",
28
- "ajv": "^8.18.0"
29
+ "eslint-plugin-jsx-a11y": {
30
+ "eslint": "$eslint"
31
+ }
29
32
  },
30
33
  "dependencies": {
31
- "@eslint-react/eslint-plugin": "^3.0.0-beta.45",
34
+ "@eslint/js": "^10.0.1",
35
+ "@eslint-react/eslint-plugin": "^4.2.3",
32
36
  "@ianvs/prettier-plugin-sort-imports": "^4.7.1",
33
- "@next/eslint-plugin-next": "^16.1.6",
34
- "@typescript-eslint/parser": "^8.56.0",
35
- "eslint": "^9.39.2",
37
+ "@next/eslint-plugin-next": "^16.2.3",
38
+ "@typescript-eslint/parser": "^8.58.1",
39
+ "eslint": "^10.2.0",
36
40
  "eslint-config-prettier": "^10.1.8",
37
41
  "eslint-import-resolver-typescript": "^4.4.4",
38
- "eslint-plugin-import-x": "^4.16.1",
42
+ "eslint-plugin-import-x": "^4.16.2",
39
43
  "eslint-plugin-jsx-a11y": "^6.10.2",
40
- "eslint-plugin-perfectionist": "^5.6.0",
44
+ "eslint-plugin-perfectionist": "^5.8.0",
41
45
  "eslint-plugin-prettier": "^5.5.5",
42
46
  "eslint-plugin-react-compiler": "^19.1.0-rc.2",
43
- "eslint-plugin-react-hooks": "^7.0.1",
44
- "eslint-plugin-storybook": "^10.2.10",
45
- "eslint-plugin-unicorn": "^63.0.0",
46
- "globals": "^17.3.0",
47
- "prettier": "^3.8.1",
47
+ "eslint-plugin-storybook": "^10.3.5",
48
+ "eslint-plugin-unicorn": "^64.0.0",
49
+ "globals": "^17.5.0",
50
+ "prettier": "^3.8.2",
48
51
  "prettier-plugin-tailwindcss": "^0.7.2",
49
- "stylelint": "^17.3.0",
52
+ "stylelint": "^17.7.0",
50
53
  "stylelint-config-standard-scss": "^17.0.0",
51
54
  "stylelint-prettier": "^5.0.3",
52
- "typescript-eslint": "^8.56.0"
55
+ "typescript-eslint": "^8.58.1"
53
56
  },
54
57
  "devDependencies": {
55
58
  "@types/eslint-plugin-jsx-a11y": "^6.10.1",
56
- "@types/node": "^25.3.0",
57
- "typescript": "^5.9.3"
59
+ "@types/node": "^25.6.0",
60
+ "typescript": "^6.0.2"
58
61
  }
59
62
  }