@greenberry/linting-config 0.2.31 → 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
@@ -6,20 +6,24 @@ ESLint and Prettier bundle for all things Greenberry.
6
6
 
7
7
  - [Greenberry linting-config](#greenberry-linting-config)
8
8
  - [Table of Contents](#table-of-contents)
9
+ - [NPM Registry](#npm-registry)
9
10
  - [Publish a new version](#publish-a-new-version)
10
11
  - [Install](#install)
11
12
  - [NextJS](#nextjs)
12
13
 
14
+ ## NPM Registry
15
+ https://www.npmjs.com/package/@greenberry/linting-config
13
16
 
14
17
  ## Publish a new version
15
18
 
16
19
  1. Make your changes
17
20
  2. Review and merge your changes into `main`
18
21
  3. Run `npm run build`
19
- 4. If it is a patch update: run `npm run publish:patch`
20
- 5. If it is a minor update: run `npm run publish:minor`
21
- 6. If it is a major update: run `npm run publish:major`
22
- 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`
23
27
 
24
28
  ## Install
25
29
 
@@ -1,10 +1,10 @@
1
1
  import path from "path";
2
2
  import importPlugin from "eslint-plugin-import-x";
3
+ import { createTypeScriptImportResolver } from "eslint-import-resolver-typescript";
3
4
  import jsxA11yPlugin from "eslint-plugin-jsx-a11y";
4
5
  import perfectionistPlugin from "eslint-plugin-perfectionist";
5
- import prettierPlugin from "eslint-plugin-prettier";
6
+ import prettierRecommended from "eslint-plugin-prettier/recommended";
6
7
  import reactCompilerPlugin from "eslint-plugin-react-compiler";
7
- import reactHooksPlugin from "eslint-plugin-react-hooks";
8
8
  import unicornPlugin from "eslint-plugin-unicorn";
9
9
  import { defineConfig } from "eslint/config";
10
10
  import globals from "globals";
@@ -12,22 +12,15 @@ import tseslint from "typescript-eslint";
12
12
  import eslintReact from "@eslint-react/eslint-plugin";
13
13
  import eslint from "@eslint/js";
14
14
  import nextPlugin from "@next/eslint-plugin-next";
15
- // Extract only meta and rules for TypeScript compatibility with ESLint flat config
16
- // The plugins include a 'configs' property that's incompatible with the Plugin type
17
- // but we only need meta and rules for flat config, so we extract just those
18
- const reactHooksPluginTyped = {
19
- meta: reactHooksPlugin.meta,
20
- rules: reactHooksPlugin.rules,
21
- };
22
- const eslintReactPlugins =
23
- // @ts-ignore - plugins property exists at runtime but not in types
24
- eslintReact.configs.recommended.plugins || {};
25
15
  export default defineConfig(eslint.configs.recommended, tseslint.configs.strict, tseslint.configs.stylistic, nextPlugin.configs.recommended, nextPlugin.configs["core-web-vitals"], {
26
16
  files: [
17
+ ".jest/**/*.{js,mjs,cjs,jsx,ts,tsx}",
27
18
  "src/**/*.{js,mjs,cjs,jsx,ts,tsx}",
28
19
  "scripts/**/*.{js,mjs,cjs,jsx,ts,tsx}",
29
20
  "config/**/*.{js,mjs,cjs,jsx,ts,tsx}",
21
+ "public/**/*.{js,mjs,cjs,ts}",
30
22
  ],
23
+ extends: [eslintReact.configs["recommended-type-checked"]],
31
24
  languageOptions: {
32
25
  parserOptions: {
33
26
  ecmaVersion: "latest",
@@ -45,43 +38,26 @@ export default defineConfig(eslint.configs.recommended, tseslint.configs.strict,
45
38
  },
46
39
  },
47
40
  plugins: {
48
- ...eslintReactPlugins,
49
- "react-hooks": reactHooksPluginTyped,
50
41
  "import-x": importPlugin,
51
42
  unicorn: unicornPlugin,
52
43
  perfectionist: perfectionistPlugin,
53
44
  "jsx-a11y": jsxA11yPlugin,
54
- prettier: prettierPlugin,
55
45
  "react-compiler": reactCompilerPlugin,
56
46
  },
57
47
  settings: {
58
- "import-x/resolver": {
59
- typescript: {
48
+ "import-x/resolver-next": [
49
+ createTypeScriptImportResolver({
60
50
  alwaysTryTypes: true,
61
51
  project: "./tsconfig.json",
62
- },
63
- },
64
- "import-x/parsers": {
65
- "@typescript-eslint/parser": [".ts", ".tsx"],
66
- },
67
- react: {
68
- version: "detect",
69
- },
70
- // Disable conflicts between @eslint-react/eslint-plugin and eslint-plugin-react-hooks
71
- // when both plugins are used together
72
- "@eslint-react/eslint-plugin": {
73
- "disable-conflict-eslint-plugin-react-hooks": true,
74
- },
75
- // Inform rules about React Compiler compilation mode for better rule accuracy
52
+ }),
53
+ ],
76
54
  "react-x": {
77
55
  compilationMode: "infer", // Options: "infer" | "annotation" | "off"
78
56
  },
79
57
  },
80
58
  rules: {
81
- ...eslintReact.configs.recommended.rules,
82
- ...reactHooksPlugin.configs.recommended.rules,
83
- ...jsxA11yPlugin.configs.recommended.rules,
84
- // TypeScript rules
59
+ ...jsxA11yPlugin.configs.strict.rules,
60
+ // ─── TypeScript ────────────────────────────────────────
85
61
  "@typescript-eslint/array-type": ["error", { default: "array" }],
86
62
  "@typescript-eslint/ban-ts-comment": "off",
87
63
  "@typescript-eslint/consistent-type-assertions": "error",
@@ -111,16 +87,59 @@ export default defineConfig(eslint.configs.recommended, tseslint.configs.strict,
111
87
  disallowTypeAnnotations: false,
112
88
  },
113
89
  ],
114
- // React rules (using @eslint-react/eslint-plugin)
90
+ // ─── React Core (overrides on recommended-type-checked)
91
+ "@eslint-react/exhaustive-deps": "error",
115
92
  "@eslint-react/no-array-index-key": "error",
116
- "@eslint-react/jsx-shorthand-boolean": "error",
117
- "@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",
118
108
  "@eslint-react/no-unused-props": "error",
119
109
  "@eslint-react/no-unused-state": "error",
120
- "@eslint-react/dom/no-void-elements-with-children": "error",
121
- "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 ────────────────────────────────────
122
141
  "react-compiler/react-compiler": "error",
123
- // Import rules
142
+ // ─── Import ────────────────────────────────────────────
124
143
  "import-x/extensions": [
125
144
  "error",
126
145
  "ignorePackages",
@@ -133,6 +152,7 @@ export default defineConfig(eslint.configs.recommended, tseslint.configs.strict,
133
152
  stories: "always",
134
153
  },
135
154
  ],
155
+ "import-x/no-duplicates": "error",
136
156
  "import-x/prefer-default-export": "off",
137
157
  "import-x/no-extraneous-dependencies": [
138
158
  "error",
@@ -140,7 +160,7 @@ export default defineConfig(eslint.configs.recommended, tseslint.configs.strict,
140
160
  devDependencies: true,
141
161
  },
142
162
  ],
143
- // Unicorn rules
163
+ // ─── Unicorn ───────────────────────────────────────────
144
164
  "unicorn/catch-error-name": "error",
145
165
  "unicorn/error-message": "error",
146
166
  "unicorn/escape-case": "error",
@@ -159,7 +179,7 @@ export default defineConfig(eslint.configs.recommended, tseslint.configs.strict,
159
179
  "unicorn/prefer-query-selector": "error",
160
180
  "unicorn/prefer-type-error": "error",
161
181
  "unicorn/throw-new-error": "error",
162
- // Perfectionist rules
182
+ // ─── Perfectionist ─────────────────────────────────────
163
183
  "perfectionist/sort-jsx-props": [
164
184
  "error",
165
185
  {
@@ -174,21 +194,14 @@ export default defineConfig(eslint.configs.recommended, tseslint.configs.strict,
174
194
  groups: ["key", "ref", "id", "unknown", "className"],
175
195
  },
176
196
  ],
177
- // React Hooks Extra rules (migrated to @eslint-react/eslint-plugin)
178
- "@eslint-react/set-state-in-effect": "warn",
179
- "@eslint-react/use-state": [
180
- "warn",
181
- { enforceLazyInitialization: true },
182
- ],
183
- "@eslint-react/use-memo": "warn",
184
- "@eslint-react/no-unnecessary-use-callback": "warn",
185
- "@eslint-react/no-unnecessary-use-memo": "warn",
186
- "@eslint-react/exhaustive-deps": "off",
187
- // React Compiler compatibility rules
188
- "@eslint-react/unsupported-syntax": "error",
189
- // Other rules
190
- "jsx-a11y/alt-text": "error",
197
+ // ─── Accessibility (jsx-a11y strict + extras not in presets)
198
+ "jsx-a11y/anchor-ambiguous-text": "warn",
191
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 ───────────────────────────────────────────
192
205
  "no-unused-expressions": "error",
193
206
  "no-inner-declarations": "error",
194
207
  "no-process-env": "error",
@@ -209,8 +222,6 @@ export default defineConfig(eslint.configs.recommended, tseslint.configs.strict,
209
222
  ],
210
223
  "no-console": ["warn", { allow: ["warn", "error", "info"] }],
211
224
  curly: ["error", "all"],
212
- // Prettier integration
213
- "prettier/prettier": "error",
214
225
  },
215
226
  }, {
216
227
  files: [
@@ -219,20 +230,35 @@ export default defineConfig(eslint.configs.recommended, tseslint.configs.strict,
219
230
  ],
220
231
  rules: {
221
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",
222
238
  },
223
- }, {
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, {
224
243
  ignores: [
244
+ // Common
225
245
  "**/node_modules/**",
226
246
  "**/*.gql",
227
247
  "**/.next/**",
228
- "**/.storybook/**",
229
248
  "**/.vercel/**",
230
249
  "**/.cursor/**",
231
250
  "**/.husky/**",
232
251
  "**/.git/**",
233
252
  "**/coverage/**",
253
+ // TypeScript
234
254
  "**/*.tsbuildinfo",
255
+ // Payload
235
256
  "**/payload-types.ts",
257
+ "**/migrations/**/*.ts",
258
+ "**/migrations/**/*.js",
259
+ "**/generated/**/*.ts",
260
+ // Storybook
261
+ "**/.storybook/**",
236
262
  "**/storybook-static/**",
237
263
  ],
238
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/resolver": {
13
- typescript: {
14
- project: string;
15
- };
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":";AAUA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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,11 +1,12 @@
1
1
  import importPlugin from "eslint-plugin-import-x";
2
+ import { createTypeScriptImportResolver } from "eslint-import-resolver-typescript";
2
3
  import jsxA11yPlugin from "eslint-plugin-jsx-a11y";
3
- import prettierPlugin from "eslint-plugin-prettier";
4
+ import prettierRecommended from "eslint-plugin-prettier/recommended";
4
5
  import eslintReact from "@eslint-react/eslint-plugin";
5
6
  import reactCompilerPlugin from "eslint-plugin-react-compiler";
6
- import reactHooksPlugin from "eslint-plugin-react-hooks";
7
7
  import unicornPlugin from "eslint-plugin-unicorn";
8
8
  import nextPlugin from "@next/eslint-plugin-next";
9
+ /** @type {import("eslint").Linter.Config[]} */
9
10
  const config = [
10
11
  {
11
12
  files: ["**/*.{js,mjs,cjs,jsx,ts,tsx}"],
@@ -19,41 +20,82 @@ const config = [
19
20
  // Spread plugins from @eslint-react/eslint-plugin recommended config
20
21
  // This includes: @eslint-react, @eslint-react/dom, @eslint-react/web-api,
21
22
  // @eslint-react/hooks-extra, @eslint-react/naming-convention
22
- // @ts-expect-error - plugins property exists at runtime but not in types
23
23
  ...eslintReact.configs.recommended.plugins,
24
- "react-hooks": reactHooksPlugin,
25
24
  "import-x": importPlugin,
26
25
  unicorn: unicornPlugin,
27
26
  "@next/next": nextPlugin,
28
27
  "jsx-a11y": jsxA11yPlugin,
29
- prettier: prettierPlugin,
30
28
  "react-compiler": reactCompilerPlugin,
31
29
  },
32
30
  settings: {
33
- "import/resolver": {
34
- typescript: {
31
+ "import-x/resolver-next": [
32
+ createTypeScriptImportResolver({
35
33
  project: "./jsconfig.json",
36
- },
37
- },
38
- react: {
39
- version: "detect",
34
+ }),
35
+ ],
36
+ "react-x": {
37
+ compilationMode: "infer",
40
38
  },
41
39
  },
42
40
  rules: {
43
- // Include recommended rules
41
+ // Include recommended rules from @eslint-react (replaces eslint-plugin-react-hooks)
44
42
  ...eslintReact.configs.recommended.rules,
45
- ...reactHooksPlugin.configs.recommended.rules,
46
- ...jsxA11yPlugin.configs.recommended.rules,
43
+ ...jsxA11yPlugin.configs.strict.rules,
47
44
  ...nextPlugin.configs.recommended.rules,
48
- // React rules (using @eslint-react/eslint-plugin)
45
+ // ─── React Core (overrides on recommended defaults) ────
46
+ "@eslint-react/exhaustive-deps": "error",
49
47
  "@eslint-react/no-array-index-key": "error",
50
- "@eslint-react/jsx-shorthand-boolean": "error",
51
- "@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",
52
62
  "@eslint-react/no-unused-props": "error",
53
63
  "@eslint-react/no-unused-state": "error",
54
- "@eslint-react/dom/no-void-elements-with-children": "error",
55
- "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 ────────────────────────────────────
56
97
  "react-compiler/react-compiler": "error",
98
+ // ─── Import ────────────────────────────────────────────
57
99
  "import-x/prefer-default-export": "off",
58
100
  "import-x/no-extraneous-dependencies": [
59
101
  "error",
@@ -61,7 +103,7 @@ const config = [
61
103
  devDependencies: true,
62
104
  },
63
105
  ],
64
- // Unicorn rules
106
+ // ─── Unicorn ───────────────────────────────────────────
65
107
  "unicorn/catch-error-name": "error",
66
108
  "unicorn/error-message": "error",
67
109
  "unicorn/escape-case": "error",
@@ -80,7 +122,7 @@ const config = [
80
122
  "unicorn/prefer-query-selector": "error",
81
123
  "unicorn/prefer-type-error": "error",
82
124
  "unicorn/throw-new-error": "error",
83
- // Next.js specific rules
125
+ // ─── Next.js ───────────────────────────────────────────
84
126
  "@next/next/no-html-link-for-pages": "error",
85
127
  "@next/next/no-img-element": "error",
86
128
  "@next/next/no-unwanted-polyfillio": "error",
@@ -91,9 +133,14 @@ const config = [
91
133
  "@next/next/next-script-for-ga": "error",
92
134
  "@next/next/no-typos": "error",
93
135
  "@next/next/no-duplicate-head": "error",
94
- // Other rules
95
- "jsx-a11y/alt-text": "error",
136
+ // ─── Accessibility (jsx-a11y strict + extras not in presets) ─
137
+ "jsx-a11y/anchor-ambiguous-text": "warn",
96
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 ───────────────────────────────────────────
97
144
  "no-unused-expressions": "error",
98
145
  "no-inner-declarations": "error",
99
146
  "no-process-env": "error",
@@ -114,10 +161,10 @@ const config = [
114
161
  ],
115
162
  "no-console": ["warn", { allow: ["warn", "error", "info"] }],
116
163
  curly: ["error", "all"],
117
- // Prettier integration
118
- "prettier/prettier": "error",
119
164
  },
120
165
  },
166
+ // Must be last — disables all ESLint formatting rules that conflict with prettier
167
+ prettierRecommended,
121
168
  {
122
169
  ignores: [".next/*", "coverage/*", "src/env.ts", "**/*.gql"],
123
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.31",
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
  }