@component-hook/eslint-plugin 1.1.5 → 1.2.1

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/dist/index.mjs ADDED
@@ -0,0 +1,577 @@
1
+ import globals from "globals";
2
+ import pluginJs from "@eslint/js";
3
+ import typescriptEslint from "typescript-eslint";
4
+ import pluginReact from "eslint-plugin-react";
5
+ import pluginReactHooks from "eslint-plugin-react-hooks";
6
+ import pluginJsxA11y from "eslint-plugin-jsx-a11y";
7
+ import pluginVue from "eslint-plugin-vue";
8
+ import vueParser from "vue-eslint-parser";
9
+ import pluginPrettier from "eslint-plugin-prettier";
10
+ import pluginPrettierRecommended from "eslint-plugin-prettier/recommended";
11
+ import pluginSonarjs from "eslint-plugin-sonarjs";
12
+ import pluginSecurity from "eslint-plugin-security";
13
+ import pluginPlaywright from "eslint-plugin-playwright";
14
+ import pluginTestingLibrary from "eslint-plugin-testing-library";
15
+ import pluginRegexp from "eslint-plugin-regexp";
16
+ import pluginImport from "eslint-plugin-import";
17
+ import pluginMarkdown from "@eslint/markdown";
18
+ import configComments from "@eslint-community/eslint-plugin-eslint-comments/configs";
19
+ import pluginUnicorn from "eslint-plugin-unicorn";
20
+ import pluginDeMorgan from "eslint-plugin-de-morgan";
21
+ import pluginPerfectionist from "eslint-plugin-perfectionist";
22
+ import pluginJsdoc from "eslint-plugin-jsdoc";
23
+
24
+ //#region configs/comments.ts
25
+ const commentsConfigs = [{
26
+ ...configComments.recommended,
27
+ name: "component-hook/comments/recommended"
28
+ }, {
29
+ name: "component-hook/comments",
30
+ rules: { "@eslint-community/eslint-comments/disable-enable-pair": ["error", { allowWholeFile: true }] }
31
+ }];
32
+
33
+ //#endregion
34
+ //#region configs/de-morgan.ts
35
+ const deMorganConfig = {
36
+ ...pluginDeMorgan.configs.recommended,
37
+ name: "component-hook/de-morgan"
38
+ };
39
+
40
+ //#endregion
41
+ //#region configs/ignores.ts
42
+ const ignores = {
43
+ name: "component-hook/ignores",
44
+ ignores: [
45
+ "**/node_modules",
46
+ "**/dist",
47
+ "**/pnpm-lock.yaml",
48
+ "**/yarn.lock",
49
+ "**/package-lock.json",
50
+ "**/bun.lockb",
51
+ "output",
52
+ "**/coverage",
53
+ "**/playwright-report",
54
+ "**/temp",
55
+ "**/fixtures",
56
+ "**/.vitepress/cache",
57
+ "**/.nuxt",
58
+ "**/.vercel",
59
+ "**/.changeset",
60
+ "**/.idea",
61
+ "**/.output",
62
+ "**/.vite-inspect",
63
+ "**/.nitro",
64
+ "**/CHANGELOG*.md",
65
+ "**/*.min.*",
66
+ "**/LICENSE*",
67
+ "**/__snapshots__",
68
+ "**/auto-import?(s).d.ts",
69
+ "**/components.d.ts",
70
+ "**/vite-env.d.ts",
71
+ "**/shims-vue.d.ts",
72
+ "**/.turbo",
73
+ "**/mockServiceWorker.js"
74
+ ]
75
+ };
76
+
77
+ //#endregion
78
+ //#region constants.ts
79
+ const SRC = "**/*.?([cm])[jt]s?(x)";
80
+ const SRC_EXT = "?([cm])[jt]s?(x)";
81
+ const VUE = "**/*.vue";
82
+
83
+ //#endregion
84
+ //#region configs/import.ts
85
+ const plugins$2 = {
86
+ import: pluginImport,
87
+ "@typescript-eslint": typescriptEslint.plugin
88
+ };
89
+ const languageOptions = {
90
+ parser: vueParser,
91
+ parserOptions: {
92
+ parser: "@typescript-eslint/parser",
93
+ sourceType: "module",
94
+ ecmaVersion: "latest"
95
+ }
96
+ };
97
+ const importConfigs = [{
98
+ name: "component-hook/import",
99
+ plugins: plugins$2,
100
+ languageOptions,
101
+ rules: {
102
+ "import/first": "error",
103
+ "import/no-default-export": "error",
104
+ "import/no-duplicates": "error",
105
+ "import/no-mutable-exports": "error",
106
+ "import/no-named-default": "error",
107
+ "import/no-self-import": "error",
108
+ "import/no-webpack-loader-syntax": "error"
109
+ }
110
+ }, {
111
+ name: "component-hook/import/allow-default-export",
112
+ files: [
113
+ "**/*.d.ts",
114
+ "**/*.md/**",
115
+ `**/*config*.${SRC_EXT}`,
116
+ `**/{views,pages,routes,middleware,plugins,api}/**/*.${SRC_EXT}`,
117
+ `**/{index,vite,esbuild,rollup,rolldown,webpack,rspack,farm,unloader}.${SRC_EXT}`
118
+ ],
119
+ plugins: plugins$2,
120
+ languageOptions,
121
+ rules: { "import/no-default-export": "off" }
122
+ }];
123
+
124
+ //#endregion
125
+ //#region configs/javascript.ts
126
+ const isProduction = process.env.NODE_ENV === "production";
127
+ const rules$3 = {
128
+ "no-useless-call": "error",
129
+ "no-useless-computed-key": "error",
130
+ "no-useless-constructor": "error",
131
+ "no-useless-rename": "error",
132
+ "no-var": "error",
133
+ "no-console": isProduction ? "warn" : "off",
134
+ "no-debugger": isProduction ? "warn" : "off",
135
+ "no-eval": "error",
136
+ "no-loop-func": "error",
137
+ "no-dupe-class-members": "error",
138
+ "no-duplicate-imports": "error",
139
+ "object-shorthand": "error",
140
+ "prefer-const": "error",
141
+ "prefer-template": "error",
142
+ eqeqeq: "error"
143
+ };
144
+ const jsConfigs = [{
145
+ name: "component-hook/javascript",
146
+ rules: {
147
+ ...pluginJs.configs.recommended.rules,
148
+ ...rules$3
149
+ }
150
+ }];
151
+
152
+ //#endregion
153
+ //#region configs/jsdoc.ts
154
+ const jsdocConfig = {
155
+ name: "component-hook/jsdoc",
156
+ plugins: { jsdoc: pluginJsdoc },
157
+ rules: {
158
+ "jsdoc/check-access": "warn",
159
+ "jsdoc/check-param-names": "warn",
160
+ "jsdoc/check-property-names": "warn",
161
+ "jsdoc/check-types": "warn",
162
+ "jsdoc/empty-tags": "warn",
163
+ "jsdoc/implements-on-classes": "warn",
164
+ "jsdoc/no-defaults": "warn",
165
+ "jsdoc/no-multi-asterisks": "warn",
166
+ "jsdoc/require-param-name": "warn",
167
+ "jsdoc/require-property": "warn",
168
+ "jsdoc/require-property-description": "warn",
169
+ "jsdoc/require-property-name": "warn",
170
+ "jsdoc/require-returns-check": "warn",
171
+ "jsdoc/require-returns-description": "warn",
172
+ "jsdoc/require-yields-check": "warn"
173
+ }
174
+ };
175
+
176
+ //#endregion
177
+ //#region configs/markdown.ts
178
+ const markdownConfigs = [...pluginMarkdown.configs.processor.map((config) => ({
179
+ ...config,
180
+ name: `component-hook/${config.name}`
181
+ })), {
182
+ files: [`**/*.md/${SRC}`, `**/*.md/${VUE}`],
183
+ name: "component-hook/markdown-rules",
184
+ rules: {
185
+ "no-alert": "off",
186
+ "no-console": "off",
187
+ "no-restricted-imports": "off",
188
+ "no-undef": "off",
189
+ "no-unused-expressions": "off",
190
+ "no-unused-vars": "off",
191
+ "@typescript-eslint/consistent-type-imports": "off",
192
+ "@typescript-eslint/no-extraneous-class": "off",
193
+ "@typescript-eslint/no-namespace": "off",
194
+ "@typescript-eslint/no-redeclare": "off",
195
+ "@typescript-eslint/no-require-imports": "off",
196
+ "@typescript-eslint/no-unused-expressions": "off",
197
+ "@typescript-eslint/no-unused-vars": "off",
198
+ "@typescript-eslint/no-use-before-define": "off",
199
+ "import/no-default-export": "off",
200
+ "sonarjs/no-dead-store": "off",
201
+ "sonarjs/unused-import": "off",
202
+ "sonarjs/no-unused-vars": "off",
203
+ "unicorn/no-useless-undefined": "off",
204
+ "unicorn/no-anonymous-default-export": "off"
205
+ }
206
+ }];
207
+
208
+ //#endregion
209
+ //#region configs/perfectionist.ts
210
+ const perfectionistConfig = {
211
+ name: "component-hook/perfectionist/import",
212
+ plugins: { perfectionist: pluginPerfectionist },
213
+ rules: {
214
+ "perfectionist/sort-imports": ["error", {
215
+ groups: [
216
+ "builtin",
217
+ "external",
218
+ "internal",
219
+ "internal-type",
220
+ "parent",
221
+ "parent-type",
222
+ "sibling",
223
+ "sibling-type",
224
+ "index",
225
+ "index-type",
226
+ "object",
227
+ "type",
228
+ "side-effect",
229
+ "side-effect-style"
230
+ ],
231
+ internalPattern: ["^[~@#]/.*"],
232
+ newlinesBetween: "ignore"
233
+ }],
234
+ "perfectionist/sort-named-exports": ["warn", { groupKind: "values-first" }],
235
+ "perfectionist/sort-named-imports": ["warn", { groupKind: "values-first" }]
236
+ }
237
+ };
238
+
239
+ //#endregion
240
+ //#region configs/playwright.ts
241
+ const playwrightConfig = {
242
+ ...pluginPlaywright.configs["flat/recommended"],
243
+ name: "component-hook/playwright"
244
+ };
245
+
246
+ //#endregion
247
+ //#region configs/prettier.ts
248
+ const rules$2 = { ...pluginPrettierRecommended.rules };
249
+ delete rules$2["vue/html-self-closing"];
250
+ const prettierConfig = {
251
+ name: "component-hook/prettier",
252
+ plugins: { prettier: pluginPrettier },
253
+ rules: {
254
+ ...rules$2,
255
+ "prettier/prettier": "warn"
256
+ }
257
+ };
258
+
259
+ //#endregion
260
+ //#region configs/react.ts
261
+ const reactConfigs = [
262
+ {
263
+ ...pluginReact.configs.flat.recommended,
264
+ name: "component-hook/react",
265
+ settings: { react: { version: "detect" } },
266
+ rules: {
267
+ ...pluginReact.configs.flat.recommended.rules,
268
+ ...pluginReact.configs.flat["jsx-runtime"].rules
269
+ }
270
+ },
271
+ {
272
+ name: "component-hook/react-hooks",
273
+ files: ["**/*.[jt]s?(x)"],
274
+ plugins: { "react-hooks": pluginReactHooks },
275
+ rules: { ...pluginReactHooks.configs.recommended.rules }
276
+ },
277
+ {
278
+ ...pluginJsxA11y.flatConfigs.recommended,
279
+ name: "component-hook/jsx-a11y"
280
+ }
281
+ ];
282
+
283
+ //#endregion
284
+ //#region configs/regexp.ts
285
+ const regexpConfig = {
286
+ ...pluginRegexp.configs["flat/recommended"],
287
+ name: "component-hook/regexp"
288
+ };
289
+
290
+ //#endregion
291
+ //#region configs/security.ts
292
+ const securityConfig = {
293
+ name: "component-hook/security",
294
+ plugins: { security: pluginSecurity },
295
+ rules: {
296
+ ...pluginSecurity.configs.recommended.rules,
297
+ "security/detect-object-injection": "off"
298
+ }
299
+ };
300
+
301
+ //#endregion
302
+ //#region configs/sonarjs.ts
303
+ const plugins$1 = { sonarjs: pluginSonarjs };
304
+ const { settings } = pluginSonarjs.configs.recommended;
305
+ const sonarjsConfigs = [{
306
+ name: "component-hook/sonarjs",
307
+ plugins: plugins$1,
308
+ rules: {
309
+ ...pluginSonarjs.configs.recommended.rules,
310
+ "sonarjs/no-commented-code": "warn"
311
+ },
312
+ settings
313
+ }, {
314
+ name: "component-hook/sonarjs/allow-in-markdown",
315
+ files: ["**/*.md/**"],
316
+ plugins: plugins$1,
317
+ rules: {
318
+ "sonarjs/unused-import": "off",
319
+ "sonarjs/no-unused-vars": "off"
320
+ },
321
+ settings
322
+ }];
323
+
324
+ //#endregion
325
+ //#region configs/testing-library.ts
326
+ const configs$1 = pluginTestingLibrary.configs;
327
+ const plugins = { "testing-library": pluginTestingLibrary };
328
+ const testingLibraryDomConfig = {
329
+ name: "component-hook/testing-library/dom",
330
+ plugins,
331
+ rules: { ...configs$1["flat/dom"].rules }
332
+ };
333
+ const testingLibraryAngularConfig = {
334
+ name: "component-hook/testing-library/angular",
335
+ plugins,
336
+ rules: { ...configs$1["flat/angular"].rules }
337
+ };
338
+ const testingLibraryReactConfig = {
339
+ name: "component-hook/testing-library/react",
340
+ plugins,
341
+ rules: { ...configs$1["flat/react"].rules }
342
+ };
343
+ const testingLibraryVueConfig = {
344
+ name: "component-hook/testing-library/vue",
345
+ plugins,
346
+ rules: { ...configs$1["flat/vue"].rules }
347
+ };
348
+ const testingLibraryMarkoConfig = {
349
+ name: "component-hook/testing-library/marko",
350
+ plugins,
351
+ rules: { ...configs$1["flat/marko"].rules }
352
+ };
353
+
354
+ //#endregion
355
+ //#region configs/typescript.ts
356
+ const rules = {
357
+ "@typescript-eslint/ban-ts-comment": "off",
358
+ "@typescript-eslint/no-explicit-any": "off",
359
+ "@typescript-eslint/no-unsafe-function-type": "off",
360
+ "@typescript-eslint/no-shadow": "error",
361
+ "@typescript-eslint/no-unused-vars": ["error", { argsIgnorePattern: "_" }],
362
+ "@typescript-eslint/no-useless-constructor": "error",
363
+ "@typescript-eslint/prefer-literal-enum-member": ["error", { allowBitwiseExpressions: true }],
364
+ "@typescript-eslint/no-unused-expressions": ["error", {
365
+ allowShortCircuit: true,
366
+ allowTaggedTemplates: true,
367
+ allowTernary: true
368
+ }]
369
+ };
370
+ const typescriptConfigs = typescriptEslint.config({
371
+ extends: [...typescriptEslint.configs.recommended],
372
+ files: ["**/*.ts", "**/*.tsx"],
373
+ name: "component-hook/typescript",
374
+ rules
375
+ });
376
+
377
+ //#endregion
378
+ //#region configs/unicorn.ts
379
+ const unicornConfigs = [{
380
+ ...pluginUnicorn.configs.unopinionated,
381
+ name: "component-hook/unicorn/unopinionated"
382
+ }, {
383
+ name: "component-hook/unicorn",
384
+ rules: {
385
+ "unicorn/catch-error-name": "error",
386
+ "unicorn/consistent-empty-array-spread": "error",
387
+ "unicorn/consistent-function-scoping": ["error", { checkArrowFunctions: false }],
388
+ "unicorn/custom-error-definition": "error",
389
+ "unicorn/filename-case": ["error", {
390
+ cases: {
391
+ kebabCase: true,
392
+ pascalCase: true
393
+ },
394
+ ignore: [/^[A-Z]+\..*$/, /import_map\.json/]
395
+ }],
396
+ "unicorn/import-style": "off",
397
+ "unicorn/no-abusive-eslint-disable": "off",
398
+ "unicorn/no-array-for-each": "off",
399
+ "unicorn/no-empty-file": "off",
400
+ "unicorn/no-for-loop": "error",
401
+ "unicorn/no-process-exit": "off",
402
+ "unicorn/no-this-assignment": "off",
403
+ "unicorn/no-unreadable-array-destructuring": "off",
404
+ "unicorn/no-useless-undefined": ["error", {
405
+ checkArguments: false,
406
+ checkArrowFunctionBody: false
407
+ }],
408
+ "unicorn/numeric-separators-style": "off",
409
+ "unicorn/prefer-module": "off",
410
+ "unicorn/prefer-query-selector": "error",
411
+ "unicorn/prefer-ternary": "off",
412
+ "unicorn/prefer-top-level-await": "off",
413
+ "unicorn/require-module-specifiers": "off"
414
+ }
415
+ }];
416
+
417
+ //#endregion
418
+ //#region configs/vue.ts
419
+ const recommendedRules = pluginVue.configs["flat/recommended"].map((config) => config.rules).reduce((acc, rules$4) => ({
420
+ ...acc,
421
+ ...rules$4
422
+ }), {});
423
+ const rules$1 = {
424
+ "vue/block-order": ["error", { order: [
425
+ "script",
426
+ "template",
427
+ "style"
428
+ ] }],
429
+ "vue/custom-event-name-casing": ["error", "camelCase"],
430
+ "vue/eqeqeq": ["error", "smart"],
431
+ "vue/html-self-closing": ["error", {
432
+ html: {
433
+ component: "always",
434
+ normal: "never",
435
+ void: "always"
436
+ },
437
+ math: "always",
438
+ svg: "always"
439
+ }],
440
+ "vue/max-attributes-per-line": "off",
441
+ "vue/multi-word-component-names": "off",
442
+ "vue/no-constant-condition": "warn",
443
+ "vue/no-empty-pattern": "error",
444
+ "vue/no-loss-of-precision": "error",
445
+ "vue/no-ref-as-operand": "off",
446
+ "vue/no-unused-refs": "error",
447
+ "vue/no-useless-v-bind": "error",
448
+ "vue/no-v-html": "off",
449
+ "vue/object-shorthand": [
450
+ "error",
451
+ "always",
452
+ {
453
+ avoidQuotes: true,
454
+ ignoreConstructors: false
455
+ }
456
+ ],
457
+ "vue/one-component-per-file": "off",
458
+ "vue/padding-line-between-blocks": ["error", "always"],
459
+ "vue/prefer-template": "error",
460
+ "vue/require-default-prop": "off",
461
+ "vue/require-prop-types": "off",
462
+ "vue/no-setup-props-reactivity-loss": "off",
463
+ "vue/return-in-computed-property": ["error", { treatUndefinedAsUnspecified: false }]
464
+ };
465
+ const extendsTypescript = typescriptEslint.configs.recommended.filter(({ name }) => name !== "typescript-eslint/base").map((config) => ({
466
+ ...config,
467
+ name: `component-hook/vue/${config.name}`
468
+ }));
469
+ const eslintConfigTypescript = typescriptEslint.config({
470
+ extends: extendsTypescript,
471
+ files: [VUE],
472
+ name: "component-hook/vue/typescript",
473
+ rules
474
+ });
475
+ const vueConfigs = [
476
+ ...eslintConfigTypescript,
477
+ {
478
+ name: "component-hook/vue/globals",
479
+ files: [VUE],
480
+ languageOptions: { globals: {
481
+ defineProps: "readonly",
482
+ defineEmits: "readonly",
483
+ defineExpose: "readonly",
484
+ defineModel: "readonly",
485
+ withDefaults: "readonly",
486
+ $: "readonly",
487
+ $$: "readonly",
488
+ $computed: "readonly",
489
+ $customRef: "readonly",
490
+ $ref: "readonly",
491
+ $shallowRef: "readonly",
492
+ $toRef: "readonly"
493
+ } }
494
+ },
495
+ {
496
+ name: "component-hook/vue",
497
+ files: [VUE],
498
+ plugins: {
499
+ "@typescript-eslint": typescriptEslint.plugin,
500
+ vue: pluginVue
501
+ },
502
+ languageOptions: {
503
+ parser: vueParser,
504
+ parserOptions: {
505
+ parser: "@typescript-eslint/parser",
506
+ extraFileExtensions: [".vue"],
507
+ sourceType: "module",
508
+ ecmaFeatures: { jsx: true }
509
+ }
510
+ },
511
+ processor: pluginVue.processors[".vue"],
512
+ rules: {
513
+ ...recommendedRules,
514
+ ...rules$1
515
+ }
516
+ }
517
+ ];
518
+
519
+ //#endregion
520
+ //#region index.ts
521
+ const basicConfigs = [
522
+ ...jsConfigs,
523
+ ...typescriptConfigs,
524
+ ...commentsConfigs,
525
+ ...importConfigs,
526
+ ...unicornConfigs,
527
+ jsdocConfig,
528
+ regexpConfig,
529
+ deMorganConfig,
530
+ perfectionistConfig,
531
+ {
532
+ name: "component-hook/globals",
533
+ languageOptions: {
534
+ ecmaVersion: "latest",
535
+ globals: {
536
+ ...globals.node,
537
+ ...globals.browser
538
+ }
539
+ }
540
+ },
541
+ ignores
542
+ ];
543
+ const configs = {
544
+ basic: basicConfigs,
545
+ react: reactConfigs,
546
+ vue: vueConfigs,
547
+ markdown: markdownConfigs,
548
+ prettier: prettierConfig,
549
+ sonarjs: sonarjsConfigs,
550
+ security: securityConfig,
551
+ playwright: playwrightConfig,
552
+ "testing-library/dom": testingLibraryDomConfig,
553
+ "testing-library/vue": testingLibraryVueConfig,
554
+ "testing-library/react": testingLibraryReactConfig,
555
+ "testing-library/angular": testingLibraryAngularConfig,
556
+ "testing-library/marko": testingLibraryMarkoConfig
557
+ };
558
+ var eslint_plugin_default = { configs };
559
+ const basicPreset = [
560
+ prettierConfig,
561
+ ...sonarjsConfigs,
562
+ securityConfig,
563
+ ...markdownConfigs
564
+ ];
565
+ const reactPreset = [
566
+ ...basicConfigs,
567
+ ...reactConfigs,
568
+ ...basicPreset
569
+ ];
570
+ const vuePreset = [
571
+ ...basicConfigs,
572
+ ...vueConfigs,
573
+ ...basicPreset
574
+ ];
575
+
576
+ //#endregion
577
+ export { eslint_plugin_default as default, reactPreset, vuePreset };
package/package.json CHANGED
@@ -1,14 +1,22 @@
1
1
  {
2
2
  "name": "@component-hook/eslint-plugin",
3
- "version": "1.1.5",
3
+ "version": "1.2.1",
4
4
  "description": "ESLint config for component hook",
5
5
  "license": "MIT",
6
6
  "type": "module",
7
7
  "author": "Tzuyi",
8
- "main": "./dist/index.js",
9
- "module": "./dist/index.js",
10
- "types": "./dist/index.d.ts",
11
- "exports": "./dist/index.js",
8
+ "exports": {
9
+ ".": {
10
+ "import": {
11
+ "types": "./dist/index.d.mts",
12
+ "default": "./dist/index.mjs"
13
+ },
14
+ "require": {
15
+ "types": "./dist/index.d.cts",
16
+ "default": "./dist/index.cjs"
17
+ }
18
+ }
19
+ },
12
20
  "homepage": "https://github.com/tzuyi0817/component-hook/tree/master/packages/eslint-plugin#readme",
13
21
  "bugs": {
14
22
  "url": "https://github.com/tzuyi0817/component-hook/issues"
@@ -34,37 +42,35 @@
34
42
  },
35
43
  "dependencies": {
36
44
  "@eslint-community/eslint-plugin-eslint-comments": "^4.5.0",
37
- "@eslint/compat": "^1.3.2",
38
- "@eslint/js": "^9.33.0",
39
- "@eslint/markdown": "^7.1.0",
45
+ "@eslint/js": "^9.39.1",
46
+ "@eslint/markdown": "^7.5.1",
40
47
  "eslint-config-prettier": "^10.1.8",
41
- "eslint-plugin-de-morgan": "^1.3.1",
48
+ "eslint-plugin-de-morgan": "^2.0.0",
42
49
  "eslint-plugin-import": "^2.32.0",
43
- "eslint-plugin-jsdoc": "^51.4.1",
50
+ "eslint-plugin-jsdoc": "^61.1.12",
44
51
  "eslint-plugin-jsx-a11y": "^6.10.2",
45
- "eslint-plugin-perfectionist": "^4.15.0",
46
- "eslint-plugin-playwright": "^2.2.2",
52
+ "eslint-plugin-perfectionist": "^4.15.1",
53
+ "eslint-plugin-playwright": "^2.3.0",
47
54
  "eslint-plugin-prettier": "^5.5.4",
48
55
  "eslint-plugin-react": "^7.37.5",
49
- "eslint-plugin-react-hooks": "^5.2.0",
56
+ "eslint-plugin-react-hooks": "^7.0.1",
50
57
  "eslint-plugin-regexp": "^2.10.0",
51
58
  "eslint-plugin-security": "^3.0.1",
52
- "eslint-plugin-sonarjs": "^3.0.4",
53
- "eslint-plugin-testing-library": "^7.6.6",
54
- "eslint-plugin-unicorn": "^60.0.0",
55
- "eslint-plugin-vue": "^10.4.0",
56
- "globals": "^16.3.0",
57
- "typescript-eslint": "^8.40.0",
59
+ "eslint-plugin-sonarjs": "^3.0.5",
60
+ "eslint-plugin-testing-library": "^7.13.3",
61
+ "eslint-plugin-unicorn": "^62.0.0",
62
+ "eslint-plugin-vue": "^10.5.1",
63
+ "globals": "^16.5.0",
64
+ "typescript-eslint": "^8.46.3",
58
65
  "vue-eslint-parser": "^10.2.0"
59
66
  },
60
67
  "devDependencies": {
61
- "@eslint/config-inspector": "^1.2.0",
62
- "@types/eslint": "^9.6.1",
68
+ "@eslint/config-inspector": "^1.3.0",
63
69
  "@types/eslint-plugin-security": "^3.0.0"
64
70
  },
65
71
  "scripts": {
66
72
  "dev": "eslint-config-inspector --config ../../eslint.config.js",
67
- "build": "tsup",
73
+ "build": "tsdown",
68
74
  "typecheck": "tsc --noEmit --skipLibCheck"
69
75
  }
70
76
  }