@zjutjh/eslint-config 0.9.1 → 2.0.0-beta.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
@@ -1,11 +1,28 @@
1
- # `@zjutjh/eslint-config` [![npm-version](https://img.shields.io/npm/v/%40zjutjh%2Feslint-config)](https://www.npmjs.com/package/@zjutjh/eslint-config)
1
+ # `@zjutjh/eslint-config`
2
+
3
+ [![Open on npmx.dev](https://npmx.dev/api/registry/badge/license/@zjutjh/eslint-config?labelColor=000000&color=000000)](https://npmx.dev/package/@zjutjh/eslint-config)
4
+ [![Open on npmx.dev](https://npmx.dev/api/registry/badge/version/@zjutjh/eslint-config?labelColor=000000&color=000000)](https://npmx.dev/package/@zjutjh/eslint-config)
5
+ [![Open on npmx.dev](https://npmx.dev/api/registry/badge/size/@zjutjh/eslint-config?labelColor=000000&color=000000)](https://npmx.dev/package/@zjutjh/eslint-config)
2
6
 
3
7
  zjutjh 的 ESLint 配置,适用于 JS, TS, Vue3 等项目。
4
8
 
5
9
  ## 使用方式
6
10
 
11
+ > [!TIP]
12
+ > **For Agent**:可以通过 Skill 来接入
13
+ >
14
+ > ```sh
15
+ > # 推荐安装到项目本地。
16
+ > npx skills add zjutjh/eslint-config --skill setup-zjutjh-eslint
17
+ > ```
18
+ > 安装完成后,在对话里提及接入 zjutjh eslint config 即可触发
19
+
20
+ ---
21
+
22
+ **For Human**
23
+
7
24
  > [!IMPORTANT]
8
- > ESLint 版本需要 ^9.9.0 以上,Node 版本需要 ^20.19.0 以上
25
+ > ESLint 版本需要 ^10.0.0 以上,Node 版本需要 ^20.19.0 以上
9
26
 
10
27
  ```sh
11
28
  # 确保你已经安装了 eslint
@@ -13,7 +30,7 @@ $ pnpm add -D eslint
13
30
 
14
31
  $ pnpm add -D @zjutjh/eslint-config
15
32
 
16
- # 如果你想使用 ts 编写配置文件,还需要安装 typescript, jiti 来帮助 eslint 解析配置
33
+ # 如果你想使用 ts 编写配置文件,还需要安装 typescript, jiti 来帮助 eslint 解析配置。(Node 24 版本后不需要安装 jiti)
17
34
  $ pnpm add -D typescript jiti
18
35
  ```
19
36
 
@@ -134,22 +151,23 @@ export default zjutjh(
134
151
  很多人在意代码的格式化,这里单独拿出一章讲。
135
152
 
136
153
  内置两种格式化工具。`@stylistic/eslint-plugin` (lint 工具对格式的检查) 和传统的 formatter 工具
137
- (Prettier) 。stylistic 默认开启,如果要使用 Prettier,需要手动开启。
154
+ ([oxfmt](https://oxc.rs/docs/guide/usage/formatter))。stylistic 默认开启,如果要使用 oxfmt,需要手动开启。
138
155
 
139
156
  ```ts
140
- // 启用 prettier
157
+ // 启用 oxfmt
141
158
  export default zjutjh({
142
- prettier: true
159
+ oxfmt: true
143
160
  }),
144
161
  ```
145
162
 
146
- 支持自定义 prettier 格式化选项,以及关闭对部分文件的格式化(默认对支持的文件全部开启)
163
+ 支持自定义 oxfmt 格式化选项,以及关闭对部分文件的格式化(默认对支持的文件全部开启)
147
164
 
148
165
  ```ts
149
166
  export default zjutjh({
150
- prettier: {
151
- prettierSelfOptions: {
152
- // 自定义 prettier 的格式化风格配置
167
+ oxfmt: {
168
+ oxfmtSelfOptions: {
169
+ // 自定义 oxfmt 的格式化风格配置
170
+ // 参考 https://oxc.rs/docs/guide/usage/formatter
153
171
  },
154
172
  lang: {
155
173
  html: false // 关闭对一些文件的格式化。默认对支持的文件全部开启
@@ -158,7 +176,7 @@ export default zjutjh({
158
176
  })
159
177
  ```
160
178
 
161
- stylistic 只对 js(x) 和 ts(x) 进行格式化,而 prettier 还对其他文件,如 css,html 等的格式化。
179
+ stylistic 只对 js(x) 和 ts(x) 进行格式化,而 oxfmt 还对其他文件,如 vue,css,html,json 等的格式化。
162
180
  如果你要**在编辑器中**自动格式化这些文件,需要配置编辑器来允许 eslint 校验这些类型的文件。
163
181
 
164
182
  ```jsonc
@@ -175,8 +193,8 @@ stylistic 只对 js(x) 和 ts(x) 进行格式化,而 prettier 还对其他文
175
193
  ```
176
194
 
177
195
  > [!WARNING]
178
- > 我们使用 eslint 调用 prettier 可执行文件来进行代码格式化,所以你的编辑器不需要安装 prettier 插件,有
179
- > eslint 插件就行。prettier 的格式化配置声明在配置源码内部,如果启用了 prettier 插件,他读取不到内部的配置,
196
+ > 我们通过 eslint 调用 oxfmt 来进行代码格式化,所以你的编辑器不需要安装额外的格式化插件,有
197
+ > eslint 插件就行。格式化配置声明在配置源码内部,如果启用了 prettier 插件,他读取不到内部的配置,
180
198
  > 会按照默认的配置来格式化,这会导致代码风格不一致。
181
199
 
182
200
  ## 开发指南
package/dist/index.d.mts CHANGED
@@ -1,6 +1,6 @@
1
- import { ParserOptions } from "@typescript-eslint/parser";
2
1
  import { Linter } from "eslint";
3
- import { Options } from "prettier";
2
+ import { ParserOptions } from "@typescript-eslint/parser";
3
+ import { FormatOptions } from "oxfmt";
4
4
 
5
5
  //#region src/types.d.ts
6
6
  interface OverridesConfigs {
@@ -15,7 +15,7 @@ interface OptionsConfig extends OptionsComponentExts {
15
15
  taro?: boolean;
16
16
  jsx?: boolean;
17
17
  react?: boolean;
18
- prettier?: boolean | OptionsPrettier;
18
+ oxfmt?: boolean | OptionsOxfmt;
19
19
  ignores?: string[];
20
20
  overrides?: OverridesConfigs;
21
21
  }
@@ -25,9 +25,10 @@ interface OptionsComponentExts {
25
25
  interface OptionsTypeScriptParserOptions {
26
26
  parserOptions?: Partial<ParserOptions>;
27
27
  }
28
- interface OptionsPrettier {
29
- prettierSelfOptions?: Options;
30
- /** 对哪些文件启用 prettier,默认全部启用 */
28
+ interface OptionsOxfmt {
29
+ /** 传递给 oxfmt format() API 的选项,参考 https://oxc.rs/docs/guide/usage/formatter */
30
+ oxfmtSelfOptions?: FormatOptions;
31
+ /** 对哪些文件启用 oxfmt,默认全部启用 */
31
32
  lang?: {
32
33
  /** js, ts, vue 文件 */es: boolean; /** css, less, scss 文件 */
33
34
  css: boolean;
package/dist/index.mjs CHANGED
@@ -1,11 +1,10 @@
1
1
  import { isPackageExists } from "local-pkg";
2
- import eslintImportPlugin from "eslint-plugin-import";
2
+ import importXPlugin, { flatConfigs } from "eslint-plugin-import-x";
3
3
  import simpleImportSortPlugin from "eslint-plugin-simple-import-sort";
4
4
  import eslintJS from "@eslint/js";
5
5
  import globals from "globals";
6
6
  import uniconPlugin from "eslint-plugin-unicorn";
7
7
  import pluginStylistic from "@stylistic/eslint-plugin";
8
-
9
8
  //#region src/globs.ts
10
9
  const GLOB_VUE = "**/*.vue";
11
10
  const GLOB_JS = "**/*.?([cm])js";
@@ -55,7 +54,6 @@ const GLOBS_EXCLUDES = [
55
54
  "**/auto-import?(s).d.ts",
56
55
  "**/components.d.ts"
57
56
  ];
58
-
59
57
  //#endregion
60
58
  //#region src/configs/ignores.ts
61
59
  function ignores(options) {
@@ -64,7 +62,6 @@ function ignores(options) {
64
62
  ignores: [...GLOBS_EXCLUDES, ...options?.userIgnores ?? []]
65
63
  }];
66
64
  }
67
-
68
65
  //#endregion
69
66
  //#region src/configs/imports.ts
70
67
  function imports() {
@@ -72,18 +69,18 @@ function imports() {
72
69
  name: "zjutjh/imports/setup",
73
70
  plugins: {
74
71
  "simple-import-sort": simpleImportSortPlugin,
75
- "import": eslintImportPlugin
72
+ "import-x": importXPlugin
76
73
  }
77
74
  }, {
78
75
  name: "zjutjh/imports/rules",
79
76
  rules: {
80
77
  "simple-import-sort/imports": "error",
81
78
  "simple-import-sort/exports": "error",
82
- "import/no-duplicates": "error"
79
+ ...flatConfigs.recommended.rules,
80
+ "import-x/no-unresolved": "off"
83
81
  }
84
82
  }];
85
83
  }
86
-
87
84
  //#endregion
88
85
  //#region src/configs/javascript.ts
89
86
  function javascript() {
@@ -131,7 +128,6 @@ function javascript() {
131
128
  }
132
129
  }];
133
130
  }
134
-
135
131
  //#endregion
136
132
  //#region src/configs/jsx.ts
137
133
  function jsx() {
@@ -141,7 +137,6 @@ function jsx() {
141
137
  languageOptions: { parserOptions: { ecmaFeatures: { jsx: true } } }
142
138
  }];
143
139
  }
144
-
145
140
  //#endregion
146
141
  //#region src/configs/misc.ts
147
142
  function misc() {
@@ -153,7 +148,6 @@ function misc() {
153
148
  rules: { "unicorn/filename-case": ["error", { "case": "kebabCase" }] }
154
149
  }];
155
150
  }
156
-
157
151
  //#endregion
158
152
  //#region src/utils.ts
159
153
  async function interopDefault(m) {
@@ -175,13 +169,12 @@ function resolveSubOptions(options, key) {
175
169
  function getOverrides(options, key) {
176
170
  return { ...options.overrides?.[key] };
177
171
  }
178
-
179
172
  //#endregion
180
- //#region src/configs/prettier.ts
173
+ //#region src/configs/oxfmt.ts
181
174
  /**
182
- * @see https://prettier.io/docs/options
175
+ * @see https://oxc.rs/docs/guide/usage/formatter
183
176
  */
184
- const prettierOptions = {
177
+ const oxfmtOptions = {
185
178
  printWidth: 100,
186
179
  tabWidth: 2,
187
180
  useTabs: false,
@@ -193,31 +186,23 @@ const prettierOptions = {
193
186
  bracketSpacing: true,
194
187
  bracketSameLine: false,
195
188
  arrowParens: "always",
196
- requirePragma: false,
197
- insertPragma: false,
198
- proseWrap: "preserve",
199
189
  htmlWhitespaceSensitivity: "css",
200
190
  vueIndentScriptAndStyle: false,
201
191
  endOfLine: "lf",
202
192
  embeddedLanguageFormatting: "auto",
203
193
  singleAttributePerLine: false
204
194
  };
205
- async function prettier(options) {
206
- await ensurePackages([
207
- "eslint-plugin-format",
208
- "eslint-plugin-prettier",
209
- "eslint-config-prettier",
210
- "prettier"
211
- ]);
212
- const [configPrettier, pluginFormat] = await Promise.all([interopDefault(import("eslint-plugin-prettier/recommended")), interopDefault(import("eslint-plugin-format"))]);
195
+ async function oxfmt(options) {
196
+ await ensurePackages(["eslint-plugin-format", "oxfmt"]);
197
+ const pluginFormat = await interopDefault(import("eslint-plugin-format"));
213
198
  const { es: enableESFormat = true, html: enableHTMLFormat = true, css: enableCSSFormat = true, json: enableJSONFormat = true } = options?.lang ?? {};
214
- const mergedPrettierOptions = {
215
- ...prettierOptions,
216
- ...options?.prettierSelfOptions
199
+ const mergedOptions = {
200
+ ...oxfmtOptions,
201
+ ...options?.oxfmtSelfOptions
217
202
  };
218
203
  return [
219
204
  enableESFormat ? {
220
- name: "zjutjh/prettier/setup",
205
+ name: "zjutjh/oxfmt/es",
221
206
  files: [
222
207
  GLOB_VUE,
223
208
  GLOB_TS,
@@ -225,21 +210,11 @@ async function prettier(options) {
225
210
  GLOB_TSX,
226
211
  GLOB_JSX
227
212
  ],
228
- ...configPrettier
229
- } : {},
230
- enableESFormat ? {
231
- name: "zjutjh/prettier/es",
232
- files: [
233
- GLOB_VUE,
234
- GLOB_TS,
235
- GLOB_JS,
236
- GLOB_TSX,
237
- GLOB_JSX
238
- ],
239
- rules: { "prettier/prettier": ["error", mergedPrettierOptions] }
213
+ plugins: { format: pluginFormat },
214
+ rules: { "format/oxfmt": ["error", mergedOptions] }
240
215
  } : {},
241
216
  enableCSSFormat ? {
242
- name: "zjutjh/prettier/css",
217
+ name: "zjutjh/oxfmt/css",
243
218
  files: [
244
219
  GLOB_CSS,
245
220
  GLOB_LESS,
@@ -247,23 +222,17 @@ async function prettier(options) {
247
222
  ],
248
223
  languageOptions: { parser: pluginFormat.parserPlain },
249
224
  plugins: { format: pluginFormat },
250
- rules: { "format/prettier": ["error", {
251
- parser: "css",
252
- mergedPrettierOptions
253
- }] }
225
+ rules: { "format/oxfmt": ["error", mergedOptions] }
254
226
  } : {},
255
227
  enableHTMLFormat ? {
256
- name: "zjutjh/prettier/html",
228
+ name: "zjutjh/oxfmt/html",
257
229
  files: [GLOB_HTML],
258
230
  languageOptions: { parser: pluginFormat.parserPlain },
259
231
  plugins: { format: pluginFormat },
260
- rules: { "format/prettier": ["error", {
261
- parser: "html",
262
- mergedPrettierOptions
263
- }] }
232
+ rules: { "format/oxfmt": ["error", mergedOptions] }
264
233
  } : {},
265
234
  enableJSONFormat ? {
266
- name: "zjutjh/prettier/json",
235
+ name: "zjutjh/oxfmt/json",
267
236
  files: [
268
237
  GLOB_JSON,
269
238
  GLOB_JSON5,
@@ -271,14 +240,10 @@ async function prettier(options) {
271
240
  ],
272
241
  languageOptions: { parser: pluginFormat.parserPlain },
273
242
  plugins: { format: pluginFormat },
274
- rules: { "format/prettier": ["error", {
275
- parser: "json",
276
- mergedPrettierOptions
277
- }] }
243
+ rules: { "format/oxfmt": ["error", mergedOptions] }
278
244
  } : {}
279
245
  ];
280
246
  }
281
-
282
247
  //#endregion
283
248
  //#region src/configs/react.ts
284
249
  async function react(options) {
@@ -292,16 +257,10 @@ async function react(options) {
292
257
  interopDefault(import("eslint-plugin-react-hooks")),
293
258
  interopDefault(import("eslint-plugin-react-refresh"))
294
259
  ]);
295
- const plugins = pluginReact.configs.all.plugins;
296
260
  return [{
297
261
  name: "zjutjh/react/setup",
298
262
  plugins: {
299
- "@eslint-react": plugins["@eslint-react"],
300
- "@eslint-react/dom": plugins["@eslint-react/dom"],
301
- "@eslint-react/hooks-extra": plugins["@eslint-react/hooks-extra"],
302
- "@eslint-react/naming-convention": plugins["@eslint-react/naming-convention"],
303
- "@eslint-react/rsc": plugins["@eslint-react/rsc"],
304
- "@eslint-react/web-api": plugins["@eslint-react/web-api"],
263
+ "@eslint-react": pluginReact,
305
264
  "react-hooks": pluginReactHooks,
306
265
  "react-refresh": pluginReactRefresh
307
266
  }
@@ -317,14 +276,12 @@ async function react(options) {
317
276
  ...pluginReact.configs.recommended.rules,
318
277
  ...pluginReactHooks.configs.recommended.rules,
319
278
  "react-refresh/only-export-components": "warn",
320
- "@eslint-react/no-leaked-conditional-rendering": "error",
321
279
  "@eslint-react/no-missing-component-display-name": "error",
322
280
  "@eslint-react/no-missing-context-display-name": "error",
323
281
  ...options.overrides
324
282
  }
325
283
  }];
326
284
  }
327
-
328
285
  //#endregion
329
286
  //#region src/configs/stylistic.ts
330
287
  function stylistic(options) {
@@ -364,7 +321,6 @@ function stylistic(options) {
364
321
  }
365
322
  }];
366
323
  }
367
-
368
324
  //#endregion
369
325
  //#region src/configs/typescript.ts
370
326
  async function typescript(options) {
@@ -400,6 +356,14 @@ async function typescript(options) {
400
356
  files,
401
357
  rules: {
402
358
  ...pluginTs.configs.strict.rules,
359
+ "@typescript-eslint/restrict-template-expressions": ["error", {
360
+ allowNumber: true,
361
+ allowBoolean: false,
362
+ allowAny: false,
363
+ allowNullish: false,
364
+ allowRegExp: false,
365
+ allowArray: false
366
+ }],
403
367
  "@typescript-eslint/ban-ts-comment": ["error", { "ts-expect-error": "allow-with-description" }],
404
368
  "@typescript-eslint/require-await": "error",
405
369
  "@typescript-eslint/no-shadow": "error",
@@ -422,7 +386,6 @@ async function typescript(options) {
422
386
  }
423
387
  ];
424
388
  }
425
-
426
389
  //#endregion
427
390
  //#region src/configs/vue.ts
428
391
  async function vue(options) {
@@ -469,11 +432,10 @@ async function vue(options) {
469
432
  }
470
433
  }];
471
434
  }
472
-
473
435
  //#endregion
474
436
  //#region src/factory.ts
475
437
  async function zjutjh(options = {}, ...userConfigs) {
476
- const { componentExts = [], vue: enableVue = isPackageExists("vue"), ts: enableTs = isPackageExists("typescript"), taro: enableTaro = isPackageExists("@tarojs/taro"), jsx: enableJSX = isPackageExists("react"), react: enableReact = isPackageExists("react"), ignores: userIgnores, prettier: enablePrettier = false } = options;
438
+ const { componentExts = [], vue: enableVue = isPackageExists("vue"), ts: enableTs = isPackageExists("typescript"), taro: enableTaro = isPackageExists("@tarojs/taro"), jsx: enableJSX = isPackageExists("react"), react: enableReact = isPackageExists("react"), ignores: userIgnores, oxfmt: enableOxfmt = false } = options;
477
439
  const configs = [];
478
440
  configs.push(ignores({ userIgnores }), javascript(), imports(), stylistic({ overrides: getOverrides(options, "stylistic") }), misc());
479
441
  if (enableVue) componentExts.push("vue");
@@ -490,14 +452,12 @@ async function zjutjh(options = {}, ...userConfigs) {
490
452
  }));
491
453
  if (enableJSX) configs.push(jsx());
492
454
  if (enableReact) configs.push(await react({ overrides: getOverrides(options, "react") }));
493
- const codeStyleOptions = resolveSubOptions(options, "prettier");
494
- if (enablePrettier) configs.push(await prettier(codeStyleOptions));
455
+ const oxfmtOptions = resolveSubOptions(options, "oxfmt");
456
+ if (enableOxfmt) configs.push(await oxfmt(oxfmtOptions));
495
457
  return configs.flat(1).concat(userConfigs);
496
458
  }
497
-
498
459
  //#endregion
499
460
  //#region src/index.ts
500
461
  var src_default = zjutjh;
501
-
502
462
  //#endregion
503
- export { src_default as default };
463
+ export { src_default as default };
package/package.json CHANGED
@@ -1,10 +1,10 @@
1
1
  {
2
2
  "name": "@zjutjh/eslint-config",
3
3
  "type": "module",
4
- "version": "0.9.1",
4
+ "version": "2.0.0-beta.0",
5
5
  "license": "ISC",
6
6
  "author": "zjutjh",
7
- "description": "Eslint config used by zjutjh",
7
+ "description": "ESLint config used by zjutjh",
8
8
  "files": [
9
9
  "dist"
10
10
  ],
@@ -25,20 +25,18 @@
25
25
  "registry": "https://registry.npmjs.org/"
26
26
  },
27
27
  "simple-git-hooks": {
28
- "pre-commit": "pnpx lint-staged"
28
+ "pre-commit": "pnpm lint-staged"
29
29
  },
30
30
  "peerDependencies": {
31
- "@eslint-react/eslint-plugin": "^2.13.0",
32
- "@typescript-eslint/eslint-plugin": "^8.56.0",
33
- "@typescript-eslint/parser": "^8.56.0",
34
- "eslint": "^10.0.1",
35
- "eslint-config-prettier": "^10.1.8",
36
- "eslint-plugin-format": "^1.4.0",
37
- "eslint-plugin-prettier": "^5.5.5",
38
- "eslint-plugin-react-hooks": "^7.0.1",
39
- "eslint-plugin-react-refresh": "^0.5.0",
31
+ "@eslint-react/eslint-plugin": "^4.2.3",
32
+ "@typescript-eslint/eslint-plugin": "^8.58.2",
33
+ "@typescript-eslint/parser": "^8.58.2",
34
+ "eslint": "^10.2.1",
35
+ "eslint-plugin-format": "^2.0.1",
36
+ "eslint-plugin-react-hooks": "^7.1.1",
37
+ "eslint-plugin-react-refresh": "^0.5.2",
40
38
  "eslint-plugin-vue": "^10.8.0",
41
- "prettier": "^3.8.1",
39
+ "oxfmt": "^0.35.0",
42
40
  "vue-eslint-parser": "^10.4.0"
43
41
  },
44
42
  "peerDependenciesMeta": {
@@ -51,15 +49,9 @@
51
49
  "@typescript-eslint/parser": {
52
50
  "optional": true
53
51
  },
54
- "eslint-config-prettier": {
55
- "optional": true
56
- },
57
52
  "eslint-plugin-format": {
58
53
  "optional": true
59
54
  },
60
- "eslint-plugin-prettier": {
61
- "optional": true
62
- },
63
55
  "eslint-plugin-react-hooks": {
64
56
  "optional": true
65
57
  },
@@ -69,7 +61,7 @@
69
61
  "eslint-plugin-vue": {
70
62
  "optional": true
71
63
  },
72
- "prettier": {
64
+ "oxfmt": {
73
65
  "optional": true
74
66
  },
75
67
  "vue-eslint-parser": {
@@ -78,41 +70,39 @@
78
70
  },
79
71
  "dependencies": {
80
72
  "@antfu/install-pkg": "^1.1.0",
81
- "@clack/prompts": "^1.0.1",
82
- "@eslint/js": "^9.39.3",
83
- "@stylistic/eslint-plugin": "^5.9.0",
84
- "eslint-plugin-import": "^2.32.0",
85
- "eslint-plugin-simple-import-sort": "^12.1.1",
86
- "eslint-plugin-unicorn": "^63.0.0",
87
- "globals": "^17.3.0",
73
+ "@clack/prompts": "^1.2.0",
74
+ "@eslint/js": "^10.0.1",
75
+ "@stylistic/eslint-plugin": "^5.10.0",
76
+ "eslint-plugin-import-x": "^4.16.2",
77
+ "eslint-plugin-simple-import-sort": "^13.0.0",
78
+ "eslint-plugin-unicorn": "^64.0.0",
79
+ "globals": "^17.5.0",
88
80
  "local-pkg": "^1.1.2"
89
81
  },
90
82
  "devDependencies": {
91
- "@eslint-react/eslint-plugin": "^2.13.0",
92
- "@eslint/config-inspector": "^1.4.2",
93
- "@eslint/core": "^1.1.0",
94
- "@types/node": "^25.3.0",
95
- "@typescript-eslint/eslint-plugin": "^8.56.0",
96
- "@typescript-eslint/parser": "^8.56.0",
97
- "bumpp": "^10.4.1",
98
- "cspell": "^9.6.4",
99
- "eslint": "^10.0.1",
100
- "eslint-config-prettier": "^10.1.8",
101
- "eslint-plugin-format": "^1.4.0",
102
- "eslint-plugin-prettier": "^5.5.5",
103
- "eslint-plugin-react-hooks": "^7.0.1",
104
- "eslint-plugin-react-refresh": "^0.5.0",
83
+ "@eslint-react/eslint-plugin": "^4.2.3",
84
+ "@eslint/config-inspector": "^2.0.0",
85
+ "@eslint/core": "^1.2.1",
86
+ "@types/node": "^25.6.0",
87
+ "@typescript-eslint/eslint-plugin": "^8.58.2",
88
+ "@typescript-eslint/parser": "^8.58.2",
89
+ "bumpp": "^11.0.1",
90
+ "cspell": "^10.0.0",
91
+ "eslint": "^10.2.1",
92
+ "eslint-plugin-format": "^2.0.1",
93
+ "eslint-plugin-react-hooks": "^7.1.1",
94
+ "eslint-plugin-react-refresh": "^0.5.2",
105
95
  "eslint-plugin-vue": "^10.8.0",
106
- "jiti": "^2.6.1",
107
- "prettier": "^3.8.1",
96
+ "lint-staged": "^16.4.0",
97
+ "oxfmt": "^0.35.0",
108
98
  "simple-git-hooks": "^2.13.1",
109
- "tsdown": "^0.20.3",
110
- "typescript": "^5.9.3",
99
+ "tsdown": "^0.21.9",
100
+ "typescript": "^6.0.3",
111
101
  "vue-eslint-parser": "^10.4.0"
112
102
  },
113
103
  "scripts": {
114
104
  "build": "tsdown",
115
- "lint": "eslint .",
105
+ "lint": "eslint",
116
106
  "typecheck": "tsc --noEmit",
117
107
  "dev": "config-inspector",
118
108
  "release": "bumpp && pnpm publish --access public",