@oxlint/migrate 0.15.12 → 0.15.14

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,4 +1,4 @@
1
- # oxlint-migrate
1
+ # @oxlint/migrate
2
2
 
3
3
  ![test](https://github.com/oxc-project/oxlint-migrate/actions/workflows/test.yml/badge.svg)
4
4
  [![NPM Version](https://img.shields.io/npm/v/%40oxlint%2Fmigrate)](https://www.npmjs.com/package/@oxlint/migrate)
@@ -11,16 +11,15 @@ Generates a `.oxlintrc.json` from a existing eslint flat config.
11
11
  ## Usage
12
12
 
13
13
  ```shell
14
- pnpm install @oxlint/migrate
15
- npx oxlint-migrate <optional-eslint-flat-config-path>
14
+ npx @oxlint/migrate <optional-eslint-flat-config-path>
16
15
  ```
17
16
 
18
17
  When no config file provided, the script searches for the default eslint config filenames in the current directory.
19
18
 
20
19
  ### User Flow
21
20
 
22
- - Upgrade `oxlint` and `oxlint-migrate` to the same version.
23
- - Execute `npx oxlint-migrate`
21
+ - Upgrade `oxlint` and `@oxlint/migrate` to the same version.
22
+ - Execute `npx @oxlint/migrate`
24
23
  - (Optional): Disable supported rules via [eslint-plugin-oxlint](https://github.com/oxc-project/eslint-plugin-oxlint)
25
24
 
26
25
  ## Contributing
@@ -1,4 +1,4 @@
1
- const version = "0.15.12";
1
+ const version = "0.15.14";
2
2
  const packageJson = {
3
3
  version
4
4
  };
@@ -1,5 +1,5 @@
1
1
  import { removeGlobalsWithAreCoveredByEnv, transformBoolGlobalToString, ES_VERSIONS, cleanUpUselessOverridesEnv } from "./env_globals.mjs";
2
- import { replaceTypescriptAliasRules, cleanUpUselessOverridesRules, cleanUpUselessOverridesPlugins } from "./plugins_rules.mjs";
2
+ import { replaceTypescriptAliasRules, replaceNodePluginName, cleanUpUselessOverridesRules, cleanUpUselessOverridesPlugins } from "./plugins_rules.mjs";
3
3
  const isEqualDeep = (a, b) => {
4
4
  if (a === b) {
5
5
  return true;
@@ -27,8 +27,7 @@ const TS_ESLINT_DEFAULT_OVERRIDE = {
27
27
  "no-var": "error",
28
28
  "prefer-rest-params": "error",
29
29
  "prefer-spread": "error"
30
- },
31
- plugins: []
30
+ }
32
31
  };
33
32
  const cleanUpDefaultTypeScriptOverridesForEslint = (config) => {
34
33
  if (config.overrides === void 0) {
@@ -73,6 +72,7 @@ const cleanUpOxlintConfig = (config) => {
73
72
  removeGlobalsWithAreCoveredByEnv(config);
74
73
  transformBoolGlobalToString(config);
75
74
  replaceTypescriptAliasRules(config);
75
+ replaceNodePluginName(config);
76
76
  if (config.globals !== void 0 && Object.keys(config.globals).length === 0) {
77
77
  delete config.globals;
78
78
  }
@@ -1,3 +1,7 @@
1
- declare const rules: string[];
1
+ export declare const pedanticRules: string[];
2
2
  export declare const nurseryRules: string[];
3
- export default rules;
3
+ export declare const styleRules: string[];
4
+ export declare const restrictionRules: string[];
5
+ export declare const correctnessRules: string[];
6
+ export declare const perfRules: string[];
7
+ export declare const suspiciousRules: string[];
@@ -1,124 +1,129 @@
1
- const rules = [
1
+ const pedanticRules = [
2
2
  "array-callback-return",
3
+ "eqeqeq",
4
+ "max-nested-callbacks",
5
+ "max-lines-per-function",
6
+ "max-classes-per-file",
7
+ "max-depth",
8
+ "max-lines",
9
+ "no-object-constructor",
10
+ "no-array-constructor",
11
+ "no-case-declarations",
12
+ "no-constructor-return",
13
+ "no-else-return",
14
+ "no-fallthrough",
15
+ "no-inner-declarations",
16
+ "no-negated-condition",
17
+ "no-new-wrappers",
18
+ "no-prototype-builtins",
19
+ "no-redeclare",
20
+ "no-self-compare",
21
+ "no-throw-literal",
22
+ "radix",
23
+ "require-await",
24
+ "sort-vars",
25
+ "symbol-description",
26
+ "import/max-dependencies",
27
+ "jest/no-conditional-in-test",
28
+ "jsdoc/require-param",
29
+ "jsdoc/require-param-description",
30
+ "jsdoc/require-param-name",
31
+ "jsdoc/require-param-type",
32
+ "jsdoc/require-returns",
33
+ "jsdoc/require-returns-description",
34
+ "jsdoc/require-returns-type",
35
+ "react/checked-requires-onchange-or-readonly",
36
+ "react/jsx-no-useless-fragment",
37
+ "react/no-unescaped-entities",
38
+ "react-hooks/rules-of-hooks",
39
+ "@typescript-eslint/ban-ts-comment",
40
+ "@typescript-eslint/ban-types",
41
+ "@typescript-eslint/no-unsafe-function-type",
42
+ "@typescript-eslint/prefer-enum-initializers",
43
+ "@typescript-eslint/prefer-ts-expect-error",
44
+ "unicorn/consistent-empty-array-spread",
45
+ "unicorn/escape-case",
46
+ "unicorn/explicit-length-check",
47
+ "unicorn/new-for-builtins",
48
+ "unicorn/no-hex-escape",
49
+ "unicorn/no-instanceof-array",
50
+ "unicorn/no-lonely-if",
51
+ "unicorn/no-negation-in-equality-check",
52
+ "unicorn/no-new-buffer",
53
+ "unicorn/no-object-as-default-parameter",
54
+ "unicorn/no-static-only-class",
55
+ "unicorn/no-this-assignment",
56
+ "unicorn/no-typeof-undefined",
57
+ "unicorn/no-unreadable-iife",
58
+ "unicorn/no-useless-promise-resolve-reject",
59
+ "unicorn/no-useless-switch-case",
60
+ "unicorn/no-useless-undefined",
61
+ "unicorn/prefer-array-flat",
62
+ "unicorn/prefer-array-some",
63
+ "unicorn/prefer-blob-reading-methods",
64
+ "unicorn/prefer-code-point",
65
+ "unicorn/prefer-date-now",
66
+ "unicorn/prefer-dom-node-append",
67
+ "unicorn/prefer-dom-node-dataset",
68
+ "unicorn/prefer-dom-node-remove",
69
+ "unicorn/prefer-event-target",
70
+ "unicorn/prefer-math-min-max",
71
+ "unicorn/prefer-math-trunc",
72
+ "unicorn/prefer-native-coercion-functions",
73
+ "unicorn/prefer-prototype-methods",
74
+ "unicorn/prefer-query-selector",
75
+ "unicorn/prefer-regexp-test",
76
+ "unicorn/prefer-string-replace-all",
77
+ "unicorn/prefer-string-slice",
78
+ "unicorn/prefer-type-error",
79
+ "unicorn/require-number-to-fixed-digits-argument",
80
+ "@typescript-eslint/no-array-constructor",
81
+ "unicorn/no-negated-condition",
82
+ "@typescript-eslint/no-redeclare",
83
+ "import-x/max-dependencies",
84
+ "vitest/no-conditional-in-test"
85
+ ];
86
+ const nurseryRules = [
3
87
  "constructor-super",
4
- "default-case",
88
+ "getter-return",
89
+ "no-undef",
90
+ "no-unreachable",
91
+ "import/export",
92
+ "import/named",
93
+ "promise/no-return-in-finally",
94
+ "react-hooks/exhaustive-deps",
95
+ "react/require-render-return",
96
+ "@typescript-eslint/consistent-type-imports",
97
+ "import-x/export",
98
+ "import-x/named"
99
+ ];
100
+ const styleRules = [
101
+ "curly",
5
102
  "default-case-last",
6
103
  "default-param-last",
7
- "eqeqeq",
8
- "for-direction",
9
104
  "func-style",
10
105
  "func-names",
11
- "getter-return",
12
106
  "grouped-accessor-pairs",
13
107
  "guard-for-in",
14
108
  "init-declarations",
15
- "max-nested-callbacks",
16
- "max-lines-per-function",
17
- "max-classes-per-file",
18
- "max-depth",
19
- "max-lines",
20
109
  "max-params",
21
110
  "new-cap",
22
- "no-useless-call",
23
- "no-unneeded-ternary",
24
111
  "no-extra-label",
25
112
  "no-multi-assign",
26
113
  "no-nested-ternary",
27
114
  "no-labels",
28
115
  "no-lone-blocks",
29
- "no-restricted-imports",
30
- "no-object-constructor",
31
116
  "no-duplicate-imports",
32
- "no-alert",
33
- "no-array-constructor",
34
- "no-async-promise-executor",
35
- "no-await-in-loop",
36
- "no-bitwise",
37
- "no-caller",
38
- "no-case-declarations",
39
- "no-class-assign",
40
- "no-compare-neg-zero",
41
- "no-cond-assign",
42
- "no-console",
43
- "no-const-assign",
44
- "no-constant-binary-expression",
45
- "no-constant-condition",
46
- "no-constructor-return",
47
117
  "no-continue",
48
- "no-control-regex",
49
- "no-debugger",
50
- "no-delete-var",
51
- "no-div-regex",
52
- "no-dupe-class-members",
53
- "no-dupe-else-if",
54
- "no-dupe-keys",
55
- "no-duplicate-case",
56
- "no-else-return",
57
- "no-empty-character-class",
58
- "no-empty-function",
59
- "no-empty-pattern",
60
- "no-empty-static-block",
61
- "no-empty",
62
- "no-eq-null",
63
- "no-eval",
64
- "no-ex-assign",
65
- "no-extend-native",
66
- "no-extra-boolean-cast",
67
- "no-fallthrough",
68
- "no-func-assign",
69
- "no-global-assign",
70
- "no-import-assign",
71
- "no-inner-declarations",
72
- "no-invalid-regexp",
73
- "no-irregular-whitespace",
74
- "no-iterator",
75
118
  "no-label-var",
76
- "no-loss-of-precision",
77
119
  "no-magic-numbers",
78
- "no-negated-condition",
79
120
  "no-multi-str",
80
121
  "no-new-func",
81
- "no-new-native-nonconstructor",
82
- "no-new-wrappers",
83
- "no-new",
84
- "no-nonoctal-decimal-escape",
85
- "no-obj-calls",
86
- "no-plusplus",
87
- "no-proto",
88
- "no-prototype-builtins",
89
- "no-redeclare",
90
- "no-regex-spaces",
91
- "no-restricted-globals",
92
122
  "no-return-assign",
93
123
  "no-script-url",
94
- "no-self-assign",
95
- "no-self-compare",
96
- "no-setter-return",
97
- "no-shadow-restricted-names",
98
- "no-sparse-arrays",
99
124
  "no-template-curly-in-string",
100
125
  "no-ternary",
101
- "no-this-before-super",
102
- "no-throw-literal",
103
- "no-undef",
104
- "no-undefined",
105
- "no-unexpected-multiline",
106
- "no-unreachable",
107
- "no-unsafe-finally",
108
- "no-unsafe-negation",
109
- "no-unsafe-optional-chaining",
110
- "no-unused-expressions",
111
- "no-unused-labels",
112
- "no-unused-private-class-members",
113
- "no-unused-vars",
114
- "no-useless-catch",
115
- "no-useless-concat",
116
- "no-useless-constructor",
117
- "no-useless-escape",
118
- "no-useless-rename",
119
- "no-var",
120
- "no-void",
121
- "no-with",
126
+ "operator-assignment",
122
127
  "prefer-promise-reject-errors",
123
128
  "prefer-exponentiation-operator",
124
129
  "prefer-numeric-literals",
@@ -126,52 +131,24 @@ const rules = [
126
131
  "prefer-object-spread",
127
132
  "prefer-rest-params",
128
133
  "prefer-spread",
129
- "radix",
130
- "require-await",
131
- "require-yield",
132
134
  "sort-imports",
133
135
  "sort-keys",
134
- "sort-vars",
135
- "symbol-description",
136
- "unicode-bom",
137
- "use-isnan",
138
- "valid-typeof",
139
136
  "vars-on-top",
140
137
  "yoda",
141
- "import/default",
142
- "import/export",
138
+ "import/exports-last",
143
139
  "import/first",
140
+ "import/no-anonymous-default-export",
141
+ "import/no-mutable-exports",
144
142
  "import/no-named-default",
145
143
  "import/no-namespace",
146
- "import/max-dependencies",
147
- "import/named",
148
- "import/namespace",
149
- "import/no-amd",
150
- "import/no-commonjs",
151
- "import/no-cycle",
152
- "import/no-default-export",
153
- "import/no-duplicates",
154
- "import/no-dynamic-require",
155
- "import/no-named-as-default",
156
- "import/no-named-as-default-member",
157
- "import/no-self-import",
158
- "import/no-webpack-loader-syntax",
159
- "import/unambiguous",
160
144
  "jest/consistent-test-it",
161
- "jest/expect-expect",
162
145
  "jest/max-expects",
163
146
  "jest/max-nested-describe",
164
147
  "jest/no-alias-methods",
165
- "jest/no-commented-out-tests",
166
- "jest/no-conditional-expect",
167
- "jest/no-conditional-in-test",
168
148
  "jest/no-confusing-set-timeout",
169
149
  "jest/no-deprecated-functions",
170
- "jest/no-disabled-tests",
171
150
  "jest/no-done-callback",
172
151
  "jest/no-duplicate-hooks",
173
- "jest/no-export",
174
- "jest/no-focused-tests",
175
152
  "jest/no-hooks",
176
153
  "jest/no-identical-title",
177
154
  "jest/no-interpolation-in-snapshots",
@@ -180,7 +157,6 @@ const rules = [
180
157
  "jest/no-mocks-import",
181
158
  "jest/no-restricted-jest-methods",
182
159
  "jest/no-restricted-matchers",
183
- "jest/no-standalone-expect",
184
160
  "jest/no-test-prefixes",
185
161
  "jest/no-test-return-statement",
186
162
  "jest/no-untyped-mock-factory",
@@ -201,28 +177,239 @@ const rules = [
201
177
  "jest/prefer-to-have-length",
202
178
  "jest/prefer-todo",
203
179
  "jest/require-hook",
180
+ "jest/require-top-level-describe",
181
+ "node/no-exports-assign",
182
+ "promise/avoid-new",
183
+ "promise/no-return-wrap",
184
+ "promise/no-nesting",
185
+ "promise/param-names",
186
+ "promise/prefer-catch",
187
+ "promise/prefer-await-to-callbacks",
188
+ "promise/prefer-await-to-then",
189
+ "react/jsx-boolean-value",
190
+ "react/jsx-curly-brace-presence",
191
+ "react/no-set-state",
192
+ "react/prefer-es6-class",
193
+ "react/self-closing-comp",
194
+ "@typescript-eslint/adjacent-overload-signatures",
195
+ "@typescript-eslint/array-type",
196
+ "@typescript-eslint/ban-tslint-comment",
197
+ "@typescript-eslint/consistent-generic-constructors",
198
+ "@typescript-eslint/consistent-indexed-object-style",
199
+ "@typescript-eslint/consistent-type-definitions",
200
+ "@typescript-eslint/no-inferrable-types",
201
+ "@typescript-eslint/no-empty-interface",
202
+ "@typescript-eslint/prefer-for-of",
203
+ "@typescript-eslint/prefer-function-type",
204
+ "@typescript-eslint/prefer-namespace-keyword",
205
+ "unicorn/catch-error-name",
206
+ "unicorn/consistent-date-clone",
207
+ "unicorn/consistent-existence-index-check",
208
+ "unicorn/empty-brace-spaces",
209
+ "unicorn/error-message",
210
+ "unicorn/filename-case",
211
+ "unicorn/no-await-expression-member",
212
+ "unicorn/no-console-spaces",
213
+ "unicorn/no-null",
214
+ "unicorn/no-unreadable-array-destructuring",
215
+ "unicorn/no-zero-fractions",
216
+ "unicorn/number-literal-case",
217
+ "unicorn/numeric-separators-style",
218
+ "unicorn/prefer-spread",
219
+ "unicorn/prefer-array-flat-map",
220
+ "unicorn/prefer-dom-node-text-content",
221
+ "unicorn/prefer-includes",
222
+ "unicorn/prefer-logical-operator-over-ternary",
223
+ "unicorn/prefer-modern-dom-apis",
224
+ "unicorn/prefer-negative-index",
225
+ "unicorn/prefer-optional-catch-binding",
226
+ "unicorn/prefer-reflect-apply",
227
+ "unicorn/prefer-string-raw",
228
+ "unicorn/prefer-string-trim-start-end",
229
+ "unicorn/prefer-structured-clone",
230
+ "unicorn/require-array-join-separator",
231
+ "unicorn/switch-case-braces",
232
+ "unicorn/text-encoding-identifier-case",
233
+ "unicorn/throw-new-error",
234
+ "vitest/no-import-node-test",
235
+ "vitest/prefer-to-be-falsy",
236
+ "vitest/prefer-to-be-object",
237
+ "vitest/prefer-to-be-truthy",
238
+ "@typescript-eslint/default-param-last",
239
+ "@typescript-eslint/init-declarations",
240
+ "@typescript-eslint/max-params",
241
+ "@typescript-eslint/no-magic-numbers",
242
+ "import-x/exports-last",
243
+ "import-x/first",
244
+ "import-x/no-anonymous-default-export",
245
+ "import-x/no-mutable-exports",
246
+ "import-x/no-named-default",
247
+ "import-x/no-namespace",
248
+ "vitest/consistent-test-it",
249
+ "vitest/max-expects",
250
+ "vitest/max-nested-describe",
251
+ "vitest/no-alias-methods",
252
+ "vitest/no-duplicate-hooks",
253
+ "vitest/no-hooks",
254
+ "vitest/no-identical-title",
255
+ "vitest/no-interpolation-in-snapshots",
256
+ "vitest/no-restricted-jest-methods",
257
+ "vitest/no-restricted-matchers",
258
+ "vitest/no-test-prefixes",
259
+ "vitest/no-test-return-statement",
260
+ "vitest/prefer-each",
261
+ "vitest/prefer-comparison-matcher",
262
+ "vitest/prefer-equality-matcher",
263
+ "vitest/prefer-expect-resolves",
264
+ "vitest/prefer-hooks-in-order",
265
+ "vitest/prefer-hooks-on-top",
266
+ "vitest/prefer-lowercase-title",
267
+ "vitest/prefer-mock-promise-shorthand",
268
+ "vitest/prefer-strict-equal",
269
+ "vitest/prefer-to-have-length",
270
+ "vitest/prefer-todo",
271
+ "vitest/require-top-level-describe"
272
+ ];
273
+ const restrictionRules = [
274
+ "default-case",
275
+ "no-restricted-imports",
276
+ "no-alert",
277
+ "no-bitwise",
278
+ "no-console",
279
+ "no-div-regex",
280
+ "no-empty-function",
281
+ "no-empty",
282
+ "no-eq-null",
283
+ "no-iterator",
284
+ "no-plusplus",
285
+ "no-proto",
286
+ "no-regex-spaces",
287
+ "no-restricted-globals",
288
+ "no-undefined",
289
+ "no-unused-expressions",
290
+ "no-var",
291
+ "no-void",
292
+ "unicode-bom",
293
+ "import/no-amd",
294
+ "import/no-commonjs",
295
+ "import/no-cycle",
296
+ "import/no-default-export",
297
+ "import/no-dynamic-require",
298
+ "import/no-webpack-loader-syntax",
299
+ "import/unambiguous",
300
+ "jsdoc/check-access",
301
+ "jsdoc/empty-tags",
302
+ "jsx-a11y/anchor-ambiguous-text",
303
+ "node/no-new-require",
304
+ "promise/catch-or-return",
305
+ "promise/spec-only",
306
+ "react/button-has-type",
307
+ "react/jsx-filename-extension",
308
+ "react/no-danger",
309
+ "react/no-unknown-property",
310
+ "@typescript-eslint/explicit-function-return-type",
311
+ "@typescript-eslint/no-dynamic-delete",
312
+ "@typescript-eslint/no-empty-object-type",
313
+ "@typescript-eslint/no-explicit-any",
314
+ "@typescript-eslint/no-import-type-side-effects",
315
+ "@typescript-eslint/no-namespace",
316
+ "@typescript-eslint/no-non-null-asserted-nullish-coalescing",
317
+ "@typescript-eslint/no-non-null-assertion",
318
+ "@typescript-eslint/no-require-imports",
319
+ "@typescript-eslint/no-var-requires",
320
+ "@typescript-eslint/prefer-literal-enum-member",
321
+ "unicorn/no-abusive-eslint-disable",
322
+ "unicorn/no-anonymous-default-export",
323
+ "unicorn/no-array-for-each",
324
+ "unicorn/no-array-reduce",
325
+ "unicorn/no-length-as-slice-end",
326
+ "unicorn/no-magic-array-flat-depth",
327
+ "unicorn/no-nested-ternary",
328
+ "unicorn/no-process-exit",
329
+ "unicorn/prefer-modern-math-apis",
330
+ "unicorn/prefer-node-protocol",
331
+ "unicorn/prefer-number-properties",
332
+ "@typescript-eslint/no-restricted-imports",
333
+ "@typescript-eslint/no-empty-function",
334
+ "@typescript-eslint/no-unused-expressions",
335
+ "import-x/no-amd",
336
+ "import-x/no-commonjs",
337
+ "import-x/no-cycle",
338
+ "import-x/no-default-export",
339
+ "import-x/no-dynamic-require",
340
+ "import-x/no-webpack-loader-syntax",
341
+ "import-x/unambiguous"
342
+ ];
343
+ const correctnessRules = [
344
+ "for-direction",
345
+ "no-async-promise-executor",
346
+ "no-caller",
347
+ "no-class-assign",
348
+ "no-compare-neg-zero",
349
+ "no-cond-assign",
350
+ "no-const-assign",
351
+ "no-constant-binary-expression",
352
+ "no-constant-condition",
353
+ "no-control-regex",
354
+ "no-debugger",
355
+ "no-delete-var",
356
+ "no-dupe-class-members",
357
+ "no-dupe-else-if",
358
+ "no-dupe-keys",
359
+ "no-duplicate-case",
360
+ "no-empty-character-class",
361
+ "no-empty-pattern",
362
+ "no-empty-static-block",
363
+ "no-eval",
364
+ "no-ex-assign",
365
+ "no-extra-boolean-cast",
366
+ "no-func-assign",
367
+ "no-global-assign",
368
+ "no-import-assign",
369
+ "no-invalid-regexp",
370
+ "no-irregular-whitespace",
371
+ "no-loss-of-precision",
372
+ "no-new-native-nonconstructor",
373
+ "no-nonoctal-decimal-escape",
374
+ "no-obj-calls",
375
+ "no-self-assign",
376
+ "no-setter-return",
377
+ "no-shadow-restricted-names",
378
+ "no-sparse-arrays",
379
+ "no-this-before-super",
380
+ "no-unsafe-finally",
381
+ "no-unsafe-negation",
382
+ "no-unsafe-optional-chaining",
383
+ "no-unused-labels",
384
+ "no-unused-private-class-members",
385
+ "no-unused-vars",
386
+ "no-useless-catch",
387
+ "no-useless-escape",
388
+ "no-useless-rename",
389
+ "no-with",
390
+ "require-yield",
391
+ "use-isnan",
392
+ "valid-typeof",
393
+ "import/default",
394
+ "import/namespace",
395
+ "jest/expect-expect",
396
+ "jest/no-conditional-expect",
397
+ "jest/no-disabled-tests",
398
+ "jest/no-export",
399
+ "jest/no-focused-tests",
400
+ "jest/no-standalone-expect",
204
401
  "jest/require-to-throw-message",
205
- "jest/require-top-level-describe",
206
402
  "jest/valid-describe-callback",
207
403
  "jest/valid-expect",
208
404
  "jest/valid-title",
209
- "jsdoc/check-access",
210
405
  "jsdoc/check-property-names",
211
406
  "jsdoc/check-tag-names",
212
- "jsdoc/empty-tags",
213
407
  "jsdoc/implements-on-classes",
214
408
  "jsdoc/no-defaults",
215
- "jsdoc/require-param",
216
- "jsdoc/require-param-description",
217
- "jsdoc/require-param-name",
218
- "jsdoc/require-param-type",
219
409
  "jsdoc/require-property",
220
410
  "jsdoc/require-property-description",
221
411
  "jsdoc/require-property-name",
222
412
  "jsdoc/require-property-type",
223
- "jsdoc/require-returns",
224
- "jsdoc/require-returns-description",
225
- "jsdoc/require-returns-type",
226
413
  "jsdoc/require-yields",
227
414
  "jsx-a11y/alt-text",
228
415
  "jsx-a11y/anchor-has-content",
@@ -252,7 +439,6 @@ const rules = [
252
439
  "jsx-a11y/role-supports-aria-props",
253
440
  "jsx-a11y/scope",
254
441
  "jsx-a11y/tabindex-no-positive",
255
- "jsx-a11y/anchor-ambiguous-text",
256
442
  "@next/next/google-font-display",
257
443
  "@next/next/google-font-preconnect",
258
444
  "@next/next/inline-script-id",
@@ -273,305 +459,111 @@ const rules = [
273
459
  "@next/next/no-title-in-document-head",
274
460
  "@next/next/no-typos",
275
461
  "@next/next/no-unwanted-polyfillio",
276
- "node/no-exports-assign",
277
- "node/no-new-require",
278
- "oxc/approx-constant",
279
- "oxc/bad-array-method-on-arguments",
280
- "oxc/bad-bitwise-operator",
281
- "oxc/bad-char-at-comparison",
282
- "oxc/bad-comparison-sequence",
283
- "oxc/bad-min-max-func",
284
- "oxc/bad-object-literal-comparison",
285
- "oxc/bad-replace-all-arg",
286
- "oxc/const-comparisons",
287
- "oxc/double-comparisons",
288
- "oxc/erasing-op",
289
- "oxc/misrefactored-assign-op",
290
- "oxc/missing-throw",
291
- "oxc/no-accumulating-spread",
292
- "oxc/no-async-await",
293
- "oxc/no-async-endpoint-handlers",
294
- "oxc/no-barrel-file",
295
- "oxc/no-const-enum",
296
- "oxc/no-map-spread",
297
- "oxc/no-optional-chaining",
298
- "oxc/no-rest-spread-properties",
299
- "oxc/number-arg-out-of-range",
300
- "oxc/only-used-in-recursion",
301
- "oxc/uninvoked-array-callback",
302
- "promise/avoid-new",
303
- "promise/catch-or-return",
304
- "promise/no-promise-in-callback",
305
462
  "promise/no-callback-in-promise",
306
463
  "promise/no-new-statics",
307
- "promise/no-return-in-finally",
308
- "promise/param-names",
309
- "promise/prefer-await-to-callbacks",
310
- "promise/prefer-await-to-then",
311
- "promise/spec-only",
312
464
  "promise/valid-params",
313
- "react/button-has-type",
314
- "react/checked-requires-onchange-or-readonly",
315
- "react-hooks/exhaustive-deps",
316
- "react/iframe-missing-sandbox",
317
- "react/jsx-boolean-value",
318
- "react/jsx-curly-brace-presence",
319
465
  "react/jsx-key",
320
- "react/jsx-no-comment-textnodes",
321
466
  "react/jsx-no-duplicate-props",
322
- "react/jsx-no-script-url",
323
467
  "react/jsx-no-target-blank",
324
468
  "react/jsx-no-undef",
325
- "react/jsx-no-useless-fragment",
326
469
  "react/jsx-props-no-spread-multi",
327
- "react/no-array-index-key",
328
470
  "react/no-children-prop",
329
471
  "react/no-danger-with-children",
330
- "react/no-danger",
331
472
  "react/no-direct-mutation-state",
332
473
  "react/no-find-dom-node",
333
474
  "react/no-is-mounted",
334
475
  "react/no-render-return-value",
335
- "react/no-set-state",
336
476
  "react/no-string-refs",
337
- "react/no-unescaped-entities",
338
- "react/no-unknown-property",
339
- "react/prefer-es6-class",
340
- "react/react-in-jsx-scope",
341
- "react/require-render-return",
342
- "react-hooks/rules-of-hooks",
343
- "react/self-closing-comp",
344
- "react/style-prop-object",
345
477
  "react/void-dom-elements-no-children",
346
- "react-perf/jsx-no-jsx-as-prop",
347
- "react-perf/jsx-no-new-array-as-prop",
348
- "react-perf/jsx-no-new-function-as-prop",
349
- "react-perf/jsx-no-new-object-as-prop",
350
- "@typescript-eslint/adjacent-overload-signatures",
351
- "@typescript-eslint/array-type",
352
- "@typescript-eslint/ban-ts-comment",
353
- "@typescript-eslint/ban-tslint-comment",
354
- "@typescript-eslint/ban-types",
355
- "@typescript-eslint/consistent-generic-constructors",
356
- "@typescript-eslint/consistent-indexed-object-style",
357
- "@typescript-eslint/consistent-type-definitions",
358
- "@typescript-eslint/consistent-type-imports",
359
- "@typescript-eslint/explicit-function-return-type",
360
- "@typescript-eslint/no-inferrable-types",
361
- "@typescript-eslint/no-confusing-non-null-assertion",
362
478
  "@typescript-eslint/no-duplicate-enum-values",
363
- "@typescript-eslint/no-dynamic-delete",
364
- "@typescript-eslint/no-empty-interface",
365
- "@typescript-eslint/no-empty-object-type",
366
- "@typescript-eslint/no-explicit-any",
367
479
  "@typescript-eslint/no-extra-non-null-assertion",
368
- "@typescript-eslint/no-extraneous-class",
369
- "@typescript-eslint/no-import-type-side-effects",
370
480
  "@typescript-eslint/no-misused-new",
371
- "@typescript-eslint/no-namespace",
372
- "@typescript-eslint/no-non-null-asserted-nullish-coalescing",
373
481
  "@typescript-eslint/no-non-null-asserted-optional-chain",
374
- "@typescript-eslint/no-non-null-assertion",
375
- "@typescript-eslint/no-require-imports",
376
482
  "@typescript-eslint/no-this-alias",
377
- "@typescript-eslint/no-unnecessary-type-constraint",
378
483
  "@typescript-eslint/no-unsafe-declaration-merging",
379
- "@typescript-eslint/no-unsafe-function-type",
380
484
  "@typescript-eslint/no-useless-empty-export",
381
- "@typescript-eslint/no-var-requires",
382
485
  "@typescript-eslint/no-wrapper-object-types",
383
486
  "@typescript-eslint/prefer-as-const",
384
- "@typescript-eslint/prefer-enum-initializers",
385
- "@typescript-eslint/prefer-for-of",
386
- "@typescript-eslint/prefer-function-type",
387
- "@typescript-eslint/prefer-literal-enum-member",
388
- "@typescript-eslint/prefer-namespace-keyword",
389
- "@typescript-eslint/prefer-ts-expect-error",
390
487
  "@typescript-eslint/triple-slash-reference",
391
- "unicorn/catch-error-name",
392
- "unicorn/consistent-empty-array-spread",
393
- "unicorn/consistent-existence-index-check",
394
- "unicorn/consistent-function-scoping",
395
- "unicorn/empty-brace-spaces",
396
- "unicorn/error-message",
397
- "unicorn/escape-case",
398
- "unicorn/explicit-length-check",
399
- "unicorn/filename-case",
400
- "unicorn/new-for-builtins",
401
488
  "unicorn/no-invalid-fetch-options",
402
- "unicorn/no-abusive-eslint-disable",
403
- "unicorn/no-anonymous-default-export",
404
- "unicorn/no-array-for-each",
405
- "unicorn/no-array-reduce",
406
- "unicorn/no-await-expression-member",
407
489
  "unicorn/no-await-in-promise-methods",
408
- "unicorn/no-console-spaces",
409
490
  "unicorn/no-document-cookie",
410
491
  "unicorn/no-empty-file",
411
- "unicorn/no-hex-escape",
412
- "unicorn/no-instanceof-array",
413
492
  "unicorn/no-invalid-remove-event-listener",
414
- "unicorn/no-length-as-slice-end",
415
- "unicorn/no-lonely-if",
416
- "unicorn/no-magic-array-flat-depth",
417
- "unicorn/no-negation-in-equality-check",
418
- "unicorn/no-nested-ternary",
419
493
  "unicorn/no-new-array",
420
- "unicorn/no-new-buffer",
421
- "unicorn/no-null",
422
- "unicorn/no-object-as-default-parameter",
423
- "unicorn/no-process-exit",
424
494
  "unicorn/no-single-promise-in-promise-methods",
425
- "unicorn/no-static-only-class",
426
495
  "unicorn/no-thenable",
427
- "unicorn/no-this-assignment",
428
- "unicorn/no-typeof-undefined",
429
496
  "unicorn/no-unnecessary-await",
430
- "unicorn/no-unreadable-array-destructuring",
431
- "unicorn/no-unreadable-iife",
432
497
  "unicorn/no-useless-fallback-in-spread",
433
498
  "unicorn/no-useless-length-check",
434
- "unicorn/no-useless-promise-resolve-reject",
435
499
  "unicorn/no-useless-spread",
436
- "unicorn/no-useless-switch-case",
437
- "unicorn/no-useless-undefined",
438
- "unicorn/no-zero-fractions",
439
- "unicorn/number-literal-case",
440
- "unicorn/numeric-separators-style",
441
- "unicorn/prefer-spread",
442
- "unicorn/prefer-add-event-listener",
443
- "unicorn/prefer-array-flat",
444
- "unicorn/prefer-array-flat-map",
445
- "unicorn/prefer-array-some",
446
- "unicorn/prefer-blob-reading-methods",
447
- "unicorn/prefer-code-point",
448
- "unicorn/prefer-date-now",
449
- "unicorn/prefer-dom-node-append",
450
- "unicorn/prefer-dom-node-dataset",
451
- "unicorn/prefer-dom-node-remove",
452
- "unicorn/prefer-dom-node-text-content",
453
- "unicorn/prefer-event-target",
454
- "unicorn/prefer-includes",
455
- "unicorn/prefer-logical-operator-over-ternary",
456
- "unicorn/prefer-math-min-max",
457
- "unicorn/prefer-math-trunc",
458
- "unicorn/prefer-modern-dom-apis",
459
- "unicorn/prefer-modern-math-apis",
460
- "unicorn/prefer-native-coercion-functions",
461
- "unicorn/prefer-negative-index",
462
- "unicorn/prefer-node-protocol",
463
- "unicorn/prefer-number-properties",
464
- "unicorn/prefer-optional-catch-binding",
465
- "unicorn/prefer-prototype-methods",
466
- "unicorn/prefer-query-selector",
467
- "unicorn/prefer-reflect-apply",
468
- "unicorn/prefer-regexp-test",
469
- "unicorn/prefer-set-has",
470
500
  "unicorn/prefer-set-size",
471
- "unicorn/prefer-string-raw",
472
- "unicorn/prefer-string-replace-all",
473
- "unicorn/prefer-string-slice",
474
501
  "unicorn/prefer-string-starts-ends-with",
475
- "unicorn/prefer-string-trim-start-end",
476
- "unicorn/prefer-structured-clone",
477
- "unicorn/prefer-type-error",
478
- "unicorn/require-array-join-separator",
479
- "unicorn/require-number-to-fixed-digits-argument",
480
- "unicorn/switch-case-braces",
481
- "unicorn/text-encoding-identifier-case",
482
- "unicorn/throw-new-error",
483
502
  "vitest/no-conditional-tests",
484
- "vitest/no-import-node-test",
485
- "vitest/prefer-to-be-falsy",
486
- "vitest/prefer-to-be-object",
487
- "vitest/prefer-to-be-truthy",
488
503
  "vitest/require-local-test-context-for-concurrent-snapshots",
489
- "@typescript-eslint/default-param-last",
490
- "@typescript-eslint/init-declarations",
491
- "@typescript-eslint/max-params",
492
- "@typescript-eslint/no-restricted-imports",
493
- "@typescript-eslint/no-array-constructor",
494
504
  "@typescript-eslint/no-dupe-class-members",
495
- "@typescript-eslint/no-empty-function",
496
505
  "@typescript-eslint/no-loss-of-precision",
497
- "@typescript-eslint/no-magic-numbers",
498
- "unicorn/no-negated-condition",
499
- "@typescript-eslint/no-redeclare",
500
- "@typescript-eslint/no-unused-expressions",
501
506
  "@typescript-eslint/no-unused-vars",
502
- "@typescript-eslint/no-useless-constructor",
503
507
  "import-x/default",
504
- "import-x/export",
505
- "import-x/first",
506
- "import-x/no-named-default",
507
- "import-x/no-namespace",
508
- "import-x/max-dependencies",
509
- "import-x/named",
510
508
  "import-x/namespace",
511
- "import-x/no-amd",
512
- "import-x/no-commonjs",
513
- "import-x/no-cycle",
514
- "import-x/no-default-export",
515
- "import-x/no-duplicates",
516
- "import-x/no-dynamic-require",
517
- "import-x/no-named-as-default",
518
- "import-x/no-named-as-default-member",
519
- "import-x/no-self-import",
520
- "import-x/no-webpack-loader-syntax",
521
- "import-x/unambiguous",
522
- "vitest/consistent-test-it",
523
509
  "vitest/expect-expect",
524
- "vitest/max-expects",
525
- "vitest/max-nested-describe",
526
- "vitest/no-alias-methods",
527
- "vitest/no-commented-out-tests",
528
510
  "vitest/no-conditional-expect",
529
- "vitest/no-conditional-in-test",
530
511
  "vitest/no-disabled-tests",
531
- "vitest/no-duplicate-hooks",
532
512
  "vitest/no-focused-tests",
533
- "vitest/no-hooks",
534
- "vitest/no-identical-title",
535
- "vitest/no-interpolation-in-snapshots",
536
- "vitest/no-restricted-jest-methods",
537
- "vitest/no-restricted-matchers",
538
513
  "vitest/no-standalone-expect",
539
- "vitest/no-test-prefixes",
540
- "vitest/no-test-return-statement",
541
- "vitest/prefer-each",
542
- "vitest/prefer-comparison-matcher",
543
- "vitest/prefer-equality-matcher",
544
- "vitest/prefer-expect-resolves",
545
- "vitest/prefer-hooks-in-order",
546
- "vitest/prefer-hooks-on-top",
547
- "vitest/prefer-lowercase-title",
548
- "vitest/prefer-mock-promise-shorthand",
549
- "vitest/prefer-strict-equal",
550
- "vitest/prefer-to-have-length",
551
- "vitest/prefer-todo",
552
514
  "vitest/require-to-throw-message",
553
- "vitest/require-top-level-describe",
554
515
  "vitest/valid-describe-callback",
555
516
  "vitest/valid-expect"
556
517
  ];
557
- const nurseryRules = [
558
- "constructor-super",
559
- "getter-return",
560
- "no-restricted-imports",
561
- "no-undef",
562
- "no-unreachable",
563
- "import/export",
564
- "import/named",
565
- "oxc/no-map-spread",
566
- "promise/no-return-in-finally",
567
- "react-hooks/exhaustive-deps",
568
- "react/require-render-return",
569
- "@typescript-eslint/consistent-type-imports",
570
- "@typescript-eslint/no-restricted-imports",
571
- "import-x/export",
572
- "import-x/named"
518
+ const perfRules = [
519
+ "no-useless-call",
520
+ "no-await-in-loop",
521
+ "react/no-array-index-key",
522
+ "react-perf/jsx-no-jsx-as-prop",
523
+ "react-perf/jsx-no-new-array-as-prop",
524
+ "react-perf/jsx-no-new-function-as-prop",
525
+ "react-perf/jsx-no-new-object-as-prop",
526
+ "unicorn/prefer-set-has"
527
+ ];
528
+ const suspiciousRules = [
529
+ "no-unneeded-ternary",
530
+ "no-extend-native",
531
+ "no-new",
532
+ "no-unexpected-multiline",
533
+ "no-useless-concat",
534
+ "no-useless-constructor",
535
+ "import/no-absolute-path",
536
+ "import/no-duplicates",
537
+ "import/no-named-as-default",
538
+ "import/no-named-as-default-member",
539
+ "import/no-self-import",
540
+ "jest/no-commented-out-tests",
541
+ "promise/no-promise-in-callback",
542
+ "react/iframe-missing-sandbox",
543
+ "react/jsx-no-comment-textnodes",
544
+ "react/jsx-no-script-url",
545
+ "react/no-namespace",
546
+ "react/react-in-jsx-scope",
547
+ "react/style-prop-object",
548
+ "@typescript-eslint/no-confusing-non-null-assertion",
549
+ "@typescript-eslint/no-extraneous-class",
550
+ "@typescript-eslint/no-unnecessary-type-constraint",
551
+ "unicorn/consistent-function-scoping",
552
+ "unicorn/prefer-add-event-listener",
553
+ "@typescript-eslint/no-useless-constructor",
554
+ "import-x/no-absolute-path",
555
+ "import-x/no-duplicates",
556
+ "import-x/no-named-as-default",
557
+ "import-x/no-named-as-default-member",
558
+ "import-x/no-self-import",
559
+ "vitest/no-commented-out-tests"
573
560
  ];
574
561
  export {
575
- rules as default,
576
- nurseryRules
562
+ correctnessRules,
563
+ nurseryRules,
564
+ pedanticRules,
565
+ perfRules,
566
+ restrictionRules,
567
+ styleRules,
568
+ suspiciousRules
577
569
  };
@@ -5,3 +5,7 @@ export declare const detectNeededRulesPlugins: (targetConfig: OxlintConfigOrOver
5
5
  export declare const cleanUpUselessOverridesPlugins: (config: OxlintConfig) => void;
6
6
  export declare const cleanUpUselessOverridesRules: (config: OxlintConfig) => void;
7
7
  export declare const replaceTypescriptAliasRules: (config: OxlintConfigOrOverride) => void;
8
+ /**
9
+ * Oxlint support them only under the node plugin name
10
+ */
11
+ export declare const replaceNodePluginName: (config: OxlintConfigOrOverride) => void;
@@ -1,7 +1,38 @@
1
- import rules, { nurseryRules } from "./generated/rules.mjs";
1
+ import * as rules from "./generated/rules.mjs";
2
+ import { nurseryRules } from "./generated/rules.mjs";
2
3
  import { rulesPrefixesForPlugins, typescriptRulesExtendEslintRules } from "./constants.mjs";
4
+ const allRules = Object.values(rules).flat();
3
5
  const isValueInSet = (value, validSet) => validSet.includes(value) || Array.isArray(value) && validSet.includes(value[0]);
4
6
  const isActiveValue = (value) => isValueInSet(value, ["error", "warn", 1, 2]);
7
+ const isOffValue = (value) => isValueInSet(value, ["off", 0]);
8
+ const isErrorValue = (value) => isValueInSet(value, ["error", 1]);
9
+ const isWarnValue = (value) => isValueInSet(value, ["warn", 2]);
10
+ const normalizeSeverityValue = (value) => {
11
+ if (value === void 0) {
12
+ return value;
13
+ }
14
+ if (isWarnValue(value)) {
15
+ if (Array.isArray(value)) {
16
+ value[0] == "warn";
17
+ return value;
18
+ }
19
+ return "warn";
20
+ } else if (isErrorValue(value)) {
21
+ if (Array.isArray(value)) {
22
+ value[0] == "error";
23
+ return value;
24
+ }
25
+ return "error";
26
+ }
27
+ if (isOffValue(value)) {
28
+ if (Array.isArray(value)) {
29
+ value[0] == "off";
30
+ return value;
31
+ }
32
+ return "off";
33
+ }
34
+ return void 0;
35
+ };
5
36
  const transformRuleEntry = (eslintConfig, targetConfig, reporter) => {
6
37
  if (eslintConfig.rules === void 0) {
7
38
  return;
@@ -10,12 +41,12 @@ const transformRuleEntry = (eslintConfig, targetConfig, reporter) => {
10
41
  targetConfig.rules = {};
11
42
  }
12
43
  for (const [rule, config] of Object.entries(eslintConfig.rules)) {
13
- if (rules.includes(rule)) {
44
+ if (allRules.includes(rule)) {
14
45
  if (nurseryRules.includes(rule)) {
15
46
  reporter !== void 0 && reporter(`unsupported rule, but in development: ${rule}`);
16
47
  continue;
17
48
  }
18
- targetConfig.rules[rule] = config;
49
+ targetConfig.rules[rule] = normalizeSeverityValue(config);
19
50
  } else {
20
51
  if (isActiveValue(config)) {
21
52
  reporter !== void 0 && reporter(`unsupported rule: ${rule}`);
@@ -47,6 +78,9 @@ const detectNeededRulesPlugins = (targetConfig, reporter) => {
47
78
  reporter !== void 0 && reporter(`unsupported plugin for rule: ${rule}`);
48
79
  }
49
80
  }
81
+ if ("files" in targetConfig && targetConfig.plugins.length === 0) {
82
+ delete targetConfig.plugins;
83
+ }
50
84
  };
51
85
  const cleanUpUselessOverridesPlugins = (config) => {
52
86
  if (config.overrides === void 0) {
@@ -104,10 +138,25 @@ const replaceTypescriptAliasRules = (config) => {
104
138
  delete config.rules;
105
139
  }
106
140
  };
141
+ const replaceNodePluginName = (config) => {
142
+ if (config.rules === void 0) {
143
+ return;
144
+ }
145
+ for (const rule of Object.keys(config.rules)) {
146
+ const prefix = "n/";
147
+ if (!rule.startsWith(prefix)) {
148
+ continue;
149
+ }
150
+ const nodeRule = `node/${rule.slice(prefix.length)}`;
151
+ config.rules[nodeRule] = config.rules[rule];
152
+ delete config.rules[rule];
153
+ }
154
+ };
107
155
  export {
108
156
  cleanUpUselessOverridesPlugins,
109
157
  cleanUpUselessOverridesRules,
110
158
  detectNeededRulesPlugins,
159
+ replaceNodePluginName,
111
160
  replaceTypescriptAliasRules,
112
161
  transformRuleEntry
113
162
  };
package/package.json CHANGED
@@ -1,10 +1,10 @@
1
1
  {
2
2
  "name": "@oxlint/migrate",
3
- "version": "0.15.12",
3
+ "version": "0.15.14",
4
4
  "description": "Generates a `.oxlintrc.json` from a existing eslint flat config",
5
5
  "type": "module",
6
6
  "bin": {
7
- "oxlint-migrate": "./dist/bin/oxlint-migrate.mjs"
7
+ "@oxlint/migrate": "./dist/bin/oxlint-migrate.mjs"
8
8
  },
9
9
  "repository": {
10
10
  "type": "git",
@@ -15,6 +15,7 @@
15
15
  "generate": "node --import @oxc-node/core/register ./scripts/generate.ts",
16
16
  "format": "npx prettier --write .",
17
17
  "type-check": "tsc --noEmit",
18
+ "lint": "oxlint",
18
19
  "test": "vitest",
19
20
  "build": "vite build",
20
21
  "manual-test": "pnpm build; chmod +x dist/bin/oxlint-migrate.mjs; npx ."
@@ -33,16 +34,21 @@
33
34
  "license": "MIT",
34
35
  "devDependencies": {
35
36
  "@antfu/eslint-config": "^4.2.0",
37
+ "@eslint/eslintrc": "^3.3.0",
36
38
  "@eslint/js": "^9.20.0",
37
39
  "@logux/eslint-config": "^55.0.0",
38
- "@oxc-node/core": "^0.0.19",
40
+ "@oxc-node/core": "^0.0.20",
41
+ "@stylistic/eslint-plugin": "^4.0.1",
39
42
  "@stylistic/eslint-plugin-ts": "^4.0.0",
40
43
  "@types/eslint-config-prettier": "^6.11.3",
41
44
  "@types/node": "^22.13.4",
45
+ "@typescript-eslint/eslint-plugin": "^8.25.0",
46
+ "@typescript-eslint/parser": "^8.25.0",
42
47
  "@vitest/coverage-v8": "^3.0.5",
43
48
  "eslint": "^9.20.1",
44
49
  "eslint-config-prettier": "^10.0.1",
45
50
  "eslint-plugin-header": "^3.1.1",
51
+ "eslint-plugin-import": "^2.31.0",
46
52
  "eslint-plugin-import-x": "^4.6.1",
47
53
  "eslint-plugin-jsdoc": "^50.6.3",
48
54
  "eslint-plugin-local": "^6.0.0",
@@ -51,7 +57,7 @@
51
57
  "eslint-plugin-unicorn": "^57.0.0",
52
58
  "husky": "^9.1.7",
53
59
  "lint-staged": "^15.4.3",
54
- "oxlint": "^0.15.12",
60
+ "oxlint": "^0.15.14",
55
61
  "prettier": "^3.5.1",
56
62
  "typescript": "^5.7.3",
57
63
  "typescript-eslint": "^8.24.0",
@@ -66,5 +72,5 @@
66
72
  "commander": "^13.1.0",
67
73
  "globals": "^16.0.0"
68
74
  },
69
- "packageManager": "pnpm@10.4.1"
75
+ "packageManager": "pnpm@10.6.1"
70
76
  }