@docyrus/rules 0.0.2 → 0.0.4

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.
@@ -1,3 +1,3 @@
1
- import type { Linter } from 'eslint';
1
+ import { type Linter } from 'eslint';
2
2
  export declare const aiConfig: Linter.Config[];
3
3
  //# sourceMappingURL=ai.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ai.d.ts","sourceRoot":"","sources":["../../src/eslint/ai.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAU,MAAM,EAAE,MAAM,QAAQ,CAAC;AAE7C,eAAO,MAAM,QAAQ,EAAE,MAAM,CAAC,MAAM,EAWnC,CAAC"}
1
+ {"version":3,"file":"ai.d.ts","sourceRoot":"","sources":["../../src/eslint/ai.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,KAAK,MAAM,EAAE,MAAM,QAAQ,CAAC;AAIlD,eAAO,MAAM,QAAQ,EAAE,MAAM,CAAC,MAAM,EAWnC,CAAC"}
package/dist/eslint/ai.js CHANGED
@@ -3,11 +3,11 @@ export const aiConfig = [
3
3
  {
4
4
  files: ['**/*.{ts,tsx,js,jsx}'],
5
5
  plugins: {
6
- 'vercel-ai-security': vercelAiPlugin.plugin,
6
+ 'vercel-ai-security': vercelAiPlugin.plugin
7
7
  },
8
8
  rules: {
9
9
  // ─── Vercel AI Security (recommended) ───
10
- ...vercelAiPlugin.configs.recommended.rules,
11
- },
12
- },
10
+ ...vercelAiPlugin.configs.recommended.rules
11
+ }
12
+ }
13
13
  ];
@@ -1,3 +1,3 @@
1
- import type { Linter } from 'eslint';
1
+ import { type Linter } from 'eslint';
2
2
  export declare const baseConfig: Linter.Config[];
3
3
  //# sourceMappingURL=base.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../src/eslint/base.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAU,MAAM,EAAE,MAAM,QAAQ,CAAC;AAc7C,eAAO,MAAM,UAAU,EAAE,MAAM,CAAC,MAAM,EAuRrC,CAAC"}
1
+ {"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../src/eslint/base.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,KAAK,MAAM,EAAE,MAAM,QAAQ,CAAC;AAoBlD,eAAO,MAAM,UAAU,EAAE,MAAM,CAAC,MAAM,EAkUrC,CAAC"}
@@ -12,7 +12,7 @@ const customized = stylisticPlugin.configs.customize({
12
12
  braceStyle: '1tbs',
13
13
  blockSpacing: true,
14
14
  quoteProps: 'as-needed',
15
- commaDangle: 'always-multiline',
15
+ commaDangle: 'always-multiline'
16
16
  });
17
17
  export const baseConfig = [
18
18
  {
@@ -23,8 +23,8 @@ export const baseConfig = [
23
23
  '**/coverage/**',
24
24
  '**/.history/**',
25
25
  '**/.turbo/**',
26
- '**/scripts/**',
27
- ],
26
+ '**/scripts/**'
27
+ ]
28
28
  },
29
29
  {
30
30
  files: ['**/*.{ts,tsx,mjs,js,jsx}'],
@@ -34,18 +34,18 @@ export const baseConfig = [
34
34
  ecmaVersion: 'latest',
35
35
  sourceType: 'module',
36
36
  ecmaFeatures: {
37
- jsx: true,
38
- },
37
+ jsx: true
38
+ }
39
39
  },
40
40
  globals: {
41
- __DEV__: 'readonly',
42
- },
41
+ __DEV__: 'readonly'
42
+ }
43
43
  },
44
44
  plugins: {
45
45
  '@stylistic': stylisticPlugin,
46
46
  '@typescript-eslint': typescriptPlugin,
47
47
  'unused-imports': unusedPlugin,
48
- 'import-x': importPlugin,
48
+ 'import-x': importPlugin
49
49
  },
50
50
  settings: {
51
51
  'import-x/extensions': [
@@ -56,7 +56,7 @@ export const baseConfig = [
56
56
  '.mjs',
57
57
  '.mts',
58
58
  '.cts',
59
- '.cjs',
59
+ '.cjs'
60
60
  ],
61
61
  'import-x/resolver': {
62
62
  node: {
@@ -68,10 +68,10 @@ export const baseConfig = [
68
68
  '.mjs',
69
69
  '.mts',
70
70
  '.cts',
71
- '.cjs',
72
- ],
73
- },
74
- },
71
+ '.cjs'
72
+ ]
73
+ }
74
+ }
75
75
  },
76
76
  rules: {
77
77
  // ─── Stylistic (base from customize) ───
@@ -91,11 +91,15 @@ export const baseConfig = [
91
91
  outerIIFEBody: 0,
92
92
  ArrayExpression: 1,
93
93
  ObjectExpression: 1,
94
- offsetTernaryExpressions: true,
95
- },
94
+ offsetTernaryExpressions: true
95
+ }
96
96
  ],
97
97
  '@stylistic/comma-dangle': ['error', 'never'],
98
- '@stylistic/lines-between-class-members': ['error', 'always', { exceptAfterSingleLine: false }],
98
+ '@stylistic/lines-between-class-members': [
99
+ 'error',
100
+ 'always',
101
+ { exceptAfterSingleLine: false }
102
+ ],
99
103
  '@stylistic/jsx-closing-bracket-location': ['error', 'after-props'],
100
104
  '@stylistic/jsx-indent-props': ['error', 2],
101
105
  '@stylistic/jsx-quotes': ['error', 'prefer-double'],
@@ -115,8 +119,8 @@ export const baseConfig = [
115
119
  closingSlash: 'never',
116
120
  beforeSelfClosing: 'always',
117
121
  afterOpening: 'never',
118
- beforeClosing: 'never',
119
- },
122
+ beforeClosing: 'never'
123
+ }
120
124
  ],
121
125
  '@stylistic/jsx-wrap-multilines': 'off',
122
126
  '@stylistic/jsx-curly-newline': ['error', { multiline: 'consistent', singleline: 'forbid' }],
@@ -129,9 +133,9 @@ export const baseConfig = [
129
133
  Property: true,
130
134
  BinaryExpression: true,
131
135
  VariableDeclarator: false,
132
- ImportDeclaration: false,
133
- },
134
- },
136
+ ImportDeclaration: false
137
+ }
138
+ }
135
139
  ],
136
140
  '@stylistic/linebreak-style': ['error', 'unix'],
137
141
  '@stylistic/max-len': [
@@ -143,33 +147,57 @@ export const baseConfig = [
143
147
  ignoreComments: false,
144
148
  ignoreRegExpLiterals: true,
145
149
  ignoreStrings: true,
146
- ignoreTemplateLiterals: true,
147
- },
150
+ ignoreTemplateLiterals: true
151
+ }
148
152
  ],
149
153
  '@stylistic/member-delimiter-style': [
150
154
  'error',
151
155
  {
152
156
  multiline: { delimiter: 'semi', requireLast: true },
153
- singleline: { delimiter: 'semi', requireLast: false },
154
- },
157
+ singleline: { delimiter: 'semi', requireLast: false }
158
+ }
155
159
  ],
156
160
  '@stylistic/no-multiple-empty-lines': ['error', { max: 1, maxEOF: 0 }],
157
161
  '@stylistic/no-trailing-spaces': 'error',
158
162
  '@stylistic/padding-line-between-statements': [
159
163
  'error',
160
164
  { blankLine: 'always', prev: '*', next: 'return' },
161
- { blankLine: 'always', prev: ['const', 'let', 'var'], next: '*' },
162
- { blankLine: 'any', prev: ['const', 'let', 'var'], next: ['const', 'let', 'var'] },
165
+ { blankLine: 'always', prev: [
166
+ 'const',
167
+ 'let',
168
+ 'var'
169
+ ], next: '*' },
170
+ { blankLine: 'any', prev: [
171
+ 'const',
172
+ 'let',
173
+ 'var'
174
+ ], next: [
175
+ 'const',
176
+ 'let',
177
+ 'var'
178
+ ] },
163
179
  { blankLine: 'always', prev: 'directive', next: '*' },
164
180
  { blankLine: 'any', prev: 'directive', next: 'directive' },
165
- { blankLine: 'always', prev: ['case', 'default'], next: '*' },
181
+ { blankLine: 'always', prev: ['case', 'default'], next: '*' }
166
182
  ],
167
183
  '@stylistic/array-bracket-newline': ['error', { multiline: true, minItems: 4 }],
168
- '@stylistic/array-bracket-spacing': ['error', 'never', { singleValue: false, arraysInArrays: false, objectsInArrays: false }],
184
+ '@stylistic/array-bracket-spacing': [
185
+ 'error',
186
+ 'never',
187
+ { singleValue: false, arraysInArrays: false, objectsInArrays: false }
188
+ ],
169
189
  '@stylistic/array-element-newline': ['error', { consistent: false, multiline: true, minItems: 4 }],
170
- '@stylistic/arrow-parens': ['error', 'as-needed', { requireForBlockBody: true }],
190
+ '@stylistic/arrow-parens': [
191
+ 'error',
192
+ 'as-needed',
193
+ { requireForBlockBody: true }
194
+ ],
171
195
  '@stylistic/block-spacing': 'error',
172
- '@stylistic/brace-style': ['error', '1tbs', { allowSingleLine: true }],
196
+ '@stylistic/brace-style': [
197
+ 'error',
198
+ '1tbs',
199
+ { allowSingleLine: true }
200
+ ],
173
201
  '@stylistic/comma-spacing': ['error', { before: false, after: true }],
174
202
  '@stylistic/comma-style': ['error', 'last'],
175
203
  '@stylistic/computed-property-spacing': ['error', 'never'],
@@ -177,11 +205,19 @@ export const baseConfig = [
177
205
  '@stylistic/function-paren-newline': ['error', 'multiline-arguments'],
178
206
  '@stylistic/implicit-arrow-linebreak': ['error', 'beside'],
179
207
  '@stylistic/quote-props': ['error', 'as-needed'],
180
- '@stylistic/quotes': ['error', 'single', { avoidEscape: true, allowTemplateLiterals: 'always' }],
208
+ '@stylistic/quotes': [
209
+ 'error',
210
+ 'single',
211
+ { avoidEscape: true, allowTemplateLiterals: 'always' }
212
+ ],
181
213
  '@stylistic/semi': ['error', 'always'],
182
214
  '@stylistic/semi-spacing': ['error', { before: false, after: true }],
183
215
  '@stylistic/object-curly-newline': ['error', { consistent: true, minProperties: 4 }],
184
- '@stylistic/object-curly-spacing': ['error', 'always', { objectsInObjects: true, arraysInObjects: true }],
216
+ '@stylistic/object-curly-spacing': [
217
+ 'error',
218
+ 'always',
219
+ { objectsInObjects: true, arraysInObjects: true }
220
+ ],
185
221
  '@stylistic/space-before-blocks': 'error',
186
222
  '@stylistic/multiline-ternary': ['error', 'never'],
187
223
  '@stylistic/multiline-comment-style': ['error', 'starred-block'],
@@ -190,8 +226,8 @@ export const baseConfig = [
190
226
  {
191
227
  anonymous: 'always',
192
228
  named: 'never',
193
- asyncArrow: 'always',
194
- },
229
+ asyncArrow: 'always'
230
+ }
195
231
  ],
196
232
  '@stylistic/space-in-parens': ['error', 'never'],
197
233
  '@stylistic/space-infix-ops': 'error',
@@ -207,10 +243,13 @@ export const baseConfig = [
207
243
  '@typescript-eslint/no-non-null-assertion': 'warn',
208
244
  '@typescript-eslint/no-empty-interface': 'warn',
209
245
  '@typescript-eslint/ban-ts-comment': 'warn',
210
- '@typescript-eslint/consistent-type-imports': ['error', {
246
+ '@typescript-eslint/consistent-type-imports': [
247
+ 'error',
248
+ {
211
249
  prefer: 'type-imports',
212
- disallowTypeAnnotations: true,
213
- }],
250
+ disallowTypeAnnotations: true
251
+ }
252
+ ],
214
253
  // ─── Unused imports ───
215
254
  'unused-imports/no-unused-imports': 'error',
216
255
  'unused-imports/no-unused-vars': [
@@ -220,8 +259,8 @@ export const baseConfig = [
220
259
  varsIgnorePattern: '^_',
221
260
  args: 'after-used',
222
261
  argsIgnorePattern: '^_',
223
- caughtErrorsIgnorePattern: '^_',
224
- },
262
+ caughtErrorsIgnorePattern: '^_'
263
+ }
225
264
  ],
226
265
  // ─── Import ordering ───
227
266
  'import-x/order': [
@@ -232,15 +271,12 @@ export const baseConfig = [
232
271
  'builtin',
233
272
  'external',
234
273
  'internal',
235
- ['sibling', 'parent'],
274
+ ['sibling', 'parent']
236
275
  ],
237
276
  'newlines-between': 'always-and-inside-groups',
238
- pathGroups: [
239
- { pattern: 'react', group: 'type', position: 'before' },
240
- { pattern: 'react', group: 'builtin', position: 'before' },
241
- ],
242
- pathGroupsExcludedImportTypes: ['react'],
243
- },
277
+ pathGroups: [{ pattern: 'react', group: 'type', position: 'before' }, { pattern: 'react', group: 'builtin', position: 'before' }],
278
+ pathGroupsExcludedImportTypes: ['react']
279
+ }
244
280
  ],
245
281
  'import-x/consistent-type-specifier-style': ['error', 'prefer-inline'],
246
282
  'import-x/no-duplicates': ['error', { 'prefer-inline': true }],
@@ -253,13 +289,20 @@ export const baseConfig = [
253
289
  allowArrowFunction: true,
254
290
  allowCallExpression: true,
255
291
  allowLiteral: false,
256
- allowObject: true,
257
- },
292
+ allowObject: true
293
+ }
258
294
  ],
259
295
  'import-x/no-dynamic-require': 'error',
260
296
  'import-x/prefer-default-export': 'off',
261
297
  // ─── General rules ───
262
- 'no-console': ['warn', { allow: ['warn', 'error', 'info'] }],
298
+ 'no-console': [
299
+ 'warn',
300
+ { allow: [
301
+ 'warn',
302
+ 'error',
303
+ 'info'
304
+ ] }
305
+ ],
263
306
  'no-debugger': 'error',
264
307
  'no-alert': 'error',
265
308
  'prefer-const': 'error',
@@ -279,13 +322,13 @@ export const baseConfig = [
279
322
  'error',
280
323
  {
281
324
  selector: 'ForInStatement',
282
- message: 'for..in loops iterate over the entire prototype chain, which is virtually never what you want. Use Object.{keys,values,entries}, and iterate over the resulting array.',
325
+ message: 'for..in loops iterate over the entire prototype chain, which is virtually never what you want. Use Object.{keys,values,entries}, and iterate over the resulting array.'
283
326
  },
284
327
  {
285
328
  selector: 'WithStatement',
286
- message: '`with` is disallowed in strict mode because it makes code impossible to predict and optimize.',
287
- },
288
- ],
289
- },
290
- },
329
+ message: '`with` is disallowed in strict mode because it makes code impossible to predict and optimize.'
330
+ }
331
+ ]
332
+ }
333
+ }
291
334
  ];
@@ -1,3 +1,3 @@
1
- import type { Linter } from 'eslint';
1
+ import { type Linter } from 'eslint';
2
2
  export declare const expoConfig: Linter.Config[];
3
3
  //# sourceMappingURL=expo.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"expo.d.ts","sourceRoot":"","sources":["../../src/eslint/expo.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAU,MAAM,EAAE,MAAM,QAAQ,CAAC;AA2B7C,eAAO,MAAM,UAAU,EAAE,MAAM,CAAC,MAAM,EAyBrC,CAAC"}
1
+ {"version":3,"file":"expo.d.ts","sourceRoot":"","sources":["../../src/eslint/expo.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,KAAK,MAAM,EAAE,MAAM,QAAQ,CAAC;AAkClD,eAAO,MAAM,UAAU,EAAE,MAAM,CAAC,MAAM,EAuBrC,CAAC"}
@@ -1,6 +1,10 @@
1
1
  import expoEslint from 'eslint-config-expo/flat.js';
2
2
  import reactNativePlugin from 'eslint-plugin-react-native';
3
- const pluginsToFilter = ['import', 'react-hooks', 'react'];
3
+ const pluginsToFilter = [
4
+ 'import',
5
+ 'react-hooks',
6
+ 'react'
7
+ ];
4
8
  const filteredExpoConfig = expoEslint.map((config) => {
5
9
  if (!config.plugins) {
6
10
  return config;
@@ -20,15 +24,13 @@ const filteredExpoConfig = expoEslint.map((config) => {
20
24
  });
21
25
  export const expoConfig = [
22
26
  {
23
- ignores: [
24
- '**/.expo/**',
25
- ],
27
+ ignores: ['**/.expo/**']
26
28
  },
27
29
  ...filteredExpoConfig,
28
30
  {
29
31
  files: ['**/*.{ts,tsx,js,jsx}'],
30
32
  plugins: {
31
- 'react-native': reactNativePlugin,
33
+ 'react-native': reactNativePlugin
32
34
  },
33
35
  rules: {
34
36
  // ─── Expo overrides ───
@@ -39,7 +41,7 @@ export const expoConfig = [
39
41
  'react-native/no-inline-styles': 'off',
40
42
  'react-native/no-color-literals': 'off',
41
43
  'react-native/no-raw-text': 'off',
42
- 'react-native/no-single-element-style-arrays': 'warn',
43
- },
44
- },
44
+ 'react-native/no-single-element-style-arrays': 'warn'
45
+ }
46
+ }
45
47
  ];
@@ -1,3 +1,3 @@
1
- import type { Linter } from 'eslint';
1
+ import { type Linter } from 'eslint';
2
2
  export declare const nextjsConfig: Linter.Config[];
3
3
  //# sourceMappingURL=nextjs.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"nextjs.d.ts","sourceRoot":"","sources":["../../src/eslint/nextjs.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAU,MAAM,EAAE,MAAM,QAAQ,CAAC;AAE7C,eAAO,MAAM,YAAY,EAAE,MAAM,CAAC,MAAM,EA2BvC,CAAC"}
1
+ {"version":3,"file":"nextjs.d.ts","sourceRoot":"","sources":["../../src/eslint/nextjs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,KAAK,MAAM,EAAE,MAAM,QAAQ,CAAC;AAKlD,eAAO,MAAM,YAAY,EAAE,MAAM,CAAC,MAAM,EAwBvC,CAAC"}
@@ -6,24 +6,21 @@ export const nextjsConfig = [
6
6
  '**/.next/**',
7
7
  '**/.open-next/**',
8
8
  '**/next-env.d.ts',
9
- '**/src/components/ui/**',
10
- ],
9
+ '**/src/components/ui/**'
10
+ ]
11
11
  },
12
12
  {
13
13
  files: ['**/*.{ts,tsx,js,jsx}'],
14
14
  plugins: {
15
15
  '@next/next': nextPlugin,
16
- 'react-refresh': reactRefreshPlugin,
16
+ 'react-refresh': reactRefreshPlugin
17
17
  },
18
18
  rules: {
19
19
  // ─── Next.js recommended + core-web-vitals ───
20
20
  ...nextPlugin.configs.recommended.rules,
21
21
  ...nextPlugin.configs['core-web-vitals'].rules,
22
22
  // ─── React Refresh ───
23
- 'react-refresh/only-export-components': [
24
- 'warn',
25
- { allowConstantExport: true },
26
- ],
27
- },
28
- },
23
+ 'react-refresh/only-export-components': ['warn', { allowConstantExport: true }]
24
+ }
25
+ }
29
26
  ];
@@ -1,3 +1,3 @@
1
- import type { Linter } from 'eslint';
1
+ import { type Linter } from 'eslint';
2
2
  export declare const reactConfig: Linter.Config[];
3
3
  //# sourceMappingURL=react.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"react.d.ts","sourceRoot":"","sources":["../../src/eslint/react.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAU,MAAM,EAAE,MAAM,QAAQ,CAAC;AAE7C,eAAO,MAAM,WAAW,EAAE,MAAM,CAAC,MAAM,EAqCtC,CAAC"}
1
+ {"version":3,"file":"react.d.ts","sourceRoot":"","sources":["../../src/eslint/react.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,KAAK,MAAM,EAAE,MAAM,QAAQ,CAAC;AAKlD,eAAO,MAAM,WAAW,EAAE,MAAM,CAAC,MAAM,EAqCtC,CAAC"}
@@ -5,12 +5,12 @@ export const reactConfig = [
5
5
  files: ['**/*.{ts,tsx,js,jsx}'],
6
6
  plugins: {
7
7
  react: reactPlugin,
8
- 'react-hooks': reactHooksPlugin,
8
+ 'react-hooks': reactHooksPlugin
9
9
  },
10
10
  settings: {
11
11
  react: {
12
- version: 'detect',
13
- },
12
+ version: 'detect'
13
+ }
14
14
  },
15
15
  rules: {
16
16
  // ─── React rules ───
@@ -33,7 +33,7 @@ export const reactConfig = [
33
33
  'react/no-array-index-key': 'warn',
34
34
  // ─── React Hooks rules ───
35
35
  'react-hooks/rules-of-hooks': 'error',
36
- 'react-hooks/exhaustive-deps': 'error',
37
- },
38
- },
36
+ 'react-hooks/exhaustive-deps': 'error'
37
+ }
38
+ }
39
39
  ];
package/package.json CHANGED
@@ -1,6 +1,11 @@
1
1
  {
2
2
  "name": "@docyrus/rules",
3
- "version": "0.0.2",
3
+ "version": "0.0.4",
4
+ "repository": {
5
+ "type": "git",
6
+ "url": "https://github.com/Docyrus/docyrus-devkit.git",
7
+ "directory": "packages/rules"
8
+ },
4
9
  "description": "Shared ESLint and Biome configurations for Docyrus projects",
5
10
  "type": "module",
6
11
  "exports": {
@@ -40,27 +45,30 @@
40
45
  "build": "tsc && cp -r src/biome dist/biome",
41
46
  "clean": "rm -rf dist",
42
47
  "verify": "node --input-type=module -e \"import { baseConfig, reactConfig, nextjsConfig, expoConfig, aiConfig } from '@docyrus/rules/eslint'; console.log('All exports OK');\"",
48
+ "lint": "eslint src",
49
+ "format": "eslint src --fix",
50
+ "typecheck": "eslint src && tsc --noEmit",
43
51
  "prepublishOnly": "pnpm run clean && pnpm run build"
44
52
  },
45
53
  "dependencies": {
46
- "@next/eslint-plugin-next": "16.1.6",
47
- "@stylistic/eslint-plugin": "5.7.1",
48
- "@typescript-eslint/eslint-plugin": "8.54.0",
49
- "@typescript-eslint/parser": "8.54.0",
50
- "enhanced-resolve": "5.19.0",
51
- "eslint-config-expo": "10.0.0",
52
- "eslint-import-resolver-typescript": "4.4.4",
53
- "eslint-plugin-import-x": "4.16.1",
54
- "eslint-plugin-react": "7.37.5",
55
- "eslint-plugin-react-hooks": "7.0.1",
56
- "eslint-plugin-react-native": "5.0.0",
57
- "eslint-plugin-react-refresh": "0.5.0",
58
- "eslint-plugin-unused-imports": "4.3.0",
59
- "eslint-plugin-vercel-ai-security": "1.3.3"
54
+ "@next/eslint-plugin-next": "catalog:",
55
+ "@stylistic/eslint-plugin": "catalog:",
56
+ "@typescript-eslint/eslint-plugin": "catalog:",
57
+ "@typescript-eslint/parser": "catalog:",
58
+ "enhanced-resolve": "catalog:",
59
+ "eslint-config-expo": "catalog:",
60
+ "eslint-import-resolver-typescript": "catalog:",
61
+ "eslint-plugin-import-x": "catalog:",
62
+ "eslint-plugin-react": "catalog:",
63
+ "eslint-plugin-react-hooks": "catalog:",
64
+ "eslint-plugin-react-native": "catalog:",
65
+ "eslint-plugin-react-refresh": "catalog:",
66
+ "eslint-plugin-unused-imports": "catalog:",
67
+ "eslint-plugin-vercel-ai-security": "catalog:"
60
68
  },
61
69
  "devDependencies": {
62
- "eslint": "10.0.0",
63
- "typescript": "5.9.3"
70
+ "eslint": "catalog:",
71
+ "typescript": "catalog:"
64
72
  },
65
73
  "peerDependencies": {
66
74
  "eslint": "^10.0.0",
@@ -71,9 +79,5 @@
71
79
  "@biomejs/biome": {
72
80
  "optional": true
73
81
  }
74
- },
75
- "packageManager": "pnpm@10.29.1",
76
- "engines": {
77
- "node": ">=24"
78
82
  }
79
83
  }