@lincy/eslint-config 4.3.1 → 4.5.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/dist/index.js CHANGED
@@ -349,7 +349,7 @@ async function javascript(options = {}) {
349
349
  "unused-imports/no-unused-imports": isInEditor ? "off" : "error",
350
350
  "unused-imports/no-unused-vars": [
351
351
  "error",
352
- { args: "after-used", argsIgnorePattern: "^_", vars: "all", varsIgnorePattern: "^_" }
352
+ { args: "after-used", argsIgnorePattern: "^_", ignoreRestSiblings: true, vars: "all", varsIgnorePattern: "^_" }
353
353
  ],
354
354
  "use-isnan": ["error", { enforceForIndexOf: true, enforceForSwitchCase: true }],
355
355
  "valid-typeof": ["error", { requireStringLiterals: true }],
@@ -379,8 +379,9 @@ function renameRules(rules, map) {
379
379
  return Object.fromEntries(
380
380
  Object.entries(rules).map(([key, value]) => {
381
381
  for (const [from, to] of Object.entries(map)) {
382
- if (key.startsWith(`${from}/`))
382
+ if (key.startsWith(`${from}/`)) {
383
383
  return [to + key.slice(from.length), value];
384
+ }
384
385
  }
385
386
  return [key, value];
386
387
  })
@@ -389,13 +390,15 @@ function renameRules(rules, map) {
389
390
  function renamePluginInConfigs(configs, map) {
390
391
  return configs.map((i) => {
391
392
  const clone = { ...i };
392
- if (clone.rules)
393
+ if (clone.rules) {
393
394
  clone.rules = renameRules(clone.rules, map);
395
+ }
394
396
  if (clone.plugins) {
395
397
  clone.plugins = Object.fromEntries(
396
398
  Object.entries(clone.plugins).map(([key, value]) => {
397
- if (key in map)
399
+ if (key in map) {
398
400
  return [map[key], value];
401
+ }
399
402
  return [key, value];
400
403
  })
401
404
  );
@@ -411,11 +414,13 @@ async function interopDefault(m) {
411
414
  return resolved.default || resolved;
412
415
  }
413
416
  async function ensurePackages(packages) {
414
- if (process.stdout.isTTY === false)
417
+ if (process.stdout.isTTY === false) {
415
418
  return;
419
+ }
416
420
  const nonExistingPackages = packages.filter((i) => !isPackageExists(i));
417
- if (nonExistingPackages.length === 0)
421
+ if (nonExistingPackages.length === 0) {
418
422
  return;
423
+ }
419
424
  const { default: prompts } = await import("prompts");
420
425
  const { result } = await prompts([
421
426
  {
@@ -424,8 +429,9 @@ async function ensurePackages(packages) {
424
429
  type: "confirm"
425
430
  }
426
431
  ]);
427
- if (result)
432
+ if (result) {
428
433
  await import("@antfu/install-pkg").then((i) => i.installPackage(nonExistingPackages, { dev: true }));
434
+ }
429
435
  }
430
436
 
431
437
  // src/configs/jsdoc.ts
@@ -650,6 +656,7 @@ import * as parserPlain2 from "eslint-parser-plain";
650
656
  var StylisticConfigDefaults = {
651
657
  indent: 4,
652
658
  jsx: true,
659
+ lessOpinionated: true,
653
660
  quotes: "single",
654
661
  semi: false
655
662
  };
@@ -661,6 +668,7 @@ async function stylistic(options = {}) {
661
668
  const {
662
669
  indent,
663
670
  jsx,
671
+ lessOpinionated,
664
672
  quotes,
665
673
  semi
666
674
  } = typeof stylistic2 === "boolean" ? StylisticConfigDefaults : { ...StylisticConfigDefaults, ...stylistic2 };
@@ -683,9 +691,13 @@ async function stylistic(options = {}) {
683
691
  rules: {
684
692
  ...config.rules,
685
693
  "antfu/consistent-list-newline": "off",
686
- "antfu/if-newline": "error",
687
- "antfu/top-level-function": "error",
688
- "curly": ["error", "multi-or-nest", "consistent"],
694
+ ...lessOpinionated ? {
695
+ curly: ["error", "all"]
696
+ } : {
697
+ "antfu/if-newline": "error",
698
+ "antfu/top-level-function": "error",
699
+ "curly": ["error", "multi-or-nest", "consistent"]
700
+ },
689
701
  // 覆盖`stylistic`默认规则
690
702
  "style/member-delimiter-style": ["error", { multiline: { delimiter: "none" } }],
691
703
  "style/multiline-ternary": ["error", "never"],
@@ -798,7 +810,7 @@ async function formatters(options = {}, stylistic2 = {}) {
798
810
  }
799
811
  if (options.html) {
800
812
  configs.push({
801
- files: ["**/*.html"],
813
+ files: [GLOB_HTML],
802
814
  languageOptions: {
803
815
  parser: parserPlain2
804
816
  },
@@ -894,152 +906,116 @@ async function react(options = {}) {
894
906
  typescript: typescript2 = true,
895
907
  version = "detect"
896
908
  } = options;
909
+ const tsconfigPath = options?.tsconfigPath ? toArray(options.tsconfigPath) : void 0;
910
+ const isTypeAware = !!tsconfigPath || !typescript2;
897
911
  await ensurePackages([
898
- "eslint-plugin-react",
912
+ "@eslint-react/eslint-plugin",
899
913
  "eslint-plugin-react-hooks",
900
914
  "eslint-plugin-react-refresh"
901
915
  ]);
902
916
  const [
903
917
  pluginReact,
904
918
  pluginReactHooks,
905
- pluginReactRefresh
919
+ pluginReactRefresh,
920
+ parserTs
906
921
  ] = await Promise.all([
907
- // @ts-expect-error missing types
908
- interopDefault(import("eslint-plugin-react")),
922
+ interopDefault(import("@eslint-react/eslint-plugin")),
909
923
  // @ts-expect-error missing types
910
924
  interopDefault(import("eslint-plugin-react-hooks")),
911
925
  // @ts-expect-error missing types
912
- interopDefault(import("eslint-plugin-react-refresh"))
926
+ interopDefault(import("eslint-plugin-react-refresh")),
927
+ interopDefault(import("@typescript-eslint/parser"))
913
928
  ]);
914
929
  const _isAllowConstantExport = ReactRefreshAllowConstantExportPackages.some(
915
930
  (i) => isPackageExists2(i)
916
931
  );
932
+ const plugins = pluginReact.configs.all.plugins;
917
933
  return [
918
934
  {
919
935
  name: "eslint:react:setup",
920
936
  plugins: {
921
- "react": pluginReact,
937
+ "react": plugins["@eslint-react"],
938
+ "react-dom": plugins["@eslint-react/dom"],
922
939
  "react-hooks": pluginReactHooks,
940
+ "react-hooks-extra": plugins["@eslint-react/hooks-extra"],
941
+ "react-naming-convention": plugins["@eslint-react/naming-convention"],
923
942
  "react-refresh": pluginReactRefresh
924
943
  }
925
944
  },
926
945
  {
927
946
  files,
928
947
  languageOptions: {
948
+ parser: parserTs,
929
949
  parserOptions: {
930
950
  ecmaFeatures: {
931
951
  jsx
932
- }
952
+ },
953
+ ...isTypeAware ? { project: tsconfigPath } : {}
933
954
  }
934
955
  },
935
956
  name: "eslint:react:rules",
936
957
  rules: {
937
- // react-hooks
958
+ // recommended rules from @eslint-react/dom
959
+ "react-dom/no-children-in-void-dom-elements": "warn",
960
+ "react-dom/no-dangerously-set-innerhtml": "warn",
961
+ "react-dom/no-dangerously-set-innerhtml-with-children": "error",
962
+ "react-dom/no-find-dom-node": "error",
963
+ "react-dom/no-missing-button-type": "warn",
964
+ "react-dom/no-missing-iframe-sandbox": "warn",
965
+ "react-dom/no-namespace": "error",
966
+ "react-dom/no-render-return-value": "error",
967
+ "react-dom/no-script-url": "warn",
968
+ "react-dom/no-unsafe-iframe-sandbox": "warn",
969
+ "react-dom/no-unsafe-target-blank": "warn",
970
+ // recommended rules react-hooks
938
971
  "react-hooks/exhaustive-deps": "warn",
939
972
  "react-hooks/rules-of-hooks": "error",
940
- // react-refresh
973
+ // react refresh
941
974
  // 'react-refresh/only-export-components': [
942
975
  // 'warn',
943
- // { allowConstantExport: _isAllowConstantExport },
976
+ // { allowConstantExport: isAllowConstantExport },
944
977
  // ],
945
- "react-refresh/only-export-components": "off",
946
- // react
947
- "react/boolean-prop-naming": "error",
948
- "react/button-has-type": "error",
949
- "react/default-props-match-prop-types": "error",
950
- "react/destructuring-assignment": "error",
951
- "react/display-name": "error",
952
- "react/forbid-component-props": "off",
953
- // 禁止组件上使用某些 props
954
- "react/forbid-dom-props": "error",
955
- "react/forbid-elements": "error",
956
- "react/forbid-foreign-prop-types": "error",
957
- "react/forbid-prop-types": "error",
958
- "react/function-component-definition": "error",
959
- "react/hook-use-state": "off",
960
- // useState 钩子值和 setter 变量的解构和对称命名
961
- "react/iframe-missing-sandbox": "error",
962
- "react/jsx-boolean-value": "error",
963
- "react/jsx-filename-extension": "off",
964
- // 禁止可能包含 JSX 文件扩展名
965
- "react/jsx-fragments": "error",
966
- "react/jsx-handler-names": "error",
967
- "react/jsx-key": "error",
968
- "react/jsx-max-depth": "off",
969
- // 强制 JSX 最大深度
970
- "react/jsx-no-bind": "off",
971
- // .bind()JSX 属性中禁止使用箭头函数
972
- "react/jsx-no-comment-textnodes": "error",
973
- "react/jsx-no-constructed-context-values": "error",
974
- "react/jsx-no-duplicate-props": "error",
975
- "react/jsx-no-leaked-render": "error",
976
- "react/jsx-no-literals": "off",
977
- // 禁止在 JSX 中使用字符串文字
978
- "react/jsx-no-script-url": "error",
979
- "react/jsx-no-target-blank": "error",
980
- "react/jsx-no-undef": "error",
981
- "react/jsx-no-useless-fragment": "error",
982
- "react/jsx-props-no-spreading": "off",
983
- // 强制任何 JSX 属性都不会传播
984
- "react/jsx-uses-react": "error",
985
- "react/jsx-uses-vars": "error",
978
+ // recommended rules from @eslint-react
979
+ "react/ensure-forward-ref-using-ref": "warn",
986
980
  "react/no-access-state-in-setstate": "error",
987
- "react/no-adjacent-inline-elements": "error",
988
- "react/no-array-index-key": "error",
989
- "react/no-arrow-function-lifecycle": "error",
990
- "react/no-children-prop": "error",
991
- "react/no-danger": "off",
992
- // 禁止使用 dangerouslySetInnerHTML
993
- "react/no-danger-with-children": "error",
994
- "react/no-deprecated": "error",
995
- "react/no-did-mount-set-state": "error",
996
- "react/no-did-update-set-state": "error",
981
+ "react/no-array-index-key": "warn",
982
+ "react/no-children-count": "warn",
983
+ "react/no-children-for-each": "warn",
984
+ "react/no-children-map": "warn",
985
+ "react/no-children-only": "warn",
986
+ "react/no-children-prop": "warn",
987
+ "react/no-children-to-array": "warn",
988
+ "react/no-clone-element": "warn",
989
+ "react/no-comment-textnodes": "warn",
990
+ "react/no-component-will-mount": "error",
991
+ "react/no-component-will-receive-props": "error",
992
+ "react/no-component-will-update": "error",
993
+ "react/no-create-ref": "error",
997
994
  "react/no-direct-mutation-state": "error",
998
- "react/no-find-dom-node": "error",
999
- "react/no-invalid-html-attribute": "error",
1000
- "react/no-is-mounted": "error",
1001
- "react/no-multi-comp": "error",
1002
- "react/no-namespace": "error",
1003
- "react/no-object-type-as-default-prop": "error",
995
+ "react/no-duplicate-key": "error",
996
+ "react/no-implicit-key": "error",
997
+ "react/no-missing-key": "error",
998
+ "react/no-nested-components": "warn",
1004
999
  "react/no-redundant-should-component-update": "error",
1005
- "react/no-render-return-value": "error",
1006
- "react/no-set-state": "error",
1000
+ "react/no-set-state-in-component-did-mount": "warn",
1001
+ "react/no-set-state-in-component-did-update": "warn",
1002
+ "react/no-set-state-in-component-will-update": "warn",
1007
1003
  "react/no-string-refs": "error",
1008
- "react/no-this-in-sfc": "error",
1009
- "react/no-typos": "error",
1010
- "react/no-unescaped-entities": "error",
1011
- "react/no-unknown-property": "error",
1012
- "react/no-unsafe": "off",
1013
- // 禁止使用不安全的生命周期方法
1014
- "react/no-unstable-nested-components": "error",
1015
- "react/no-unused-class-component-methods": "error",
1016
- "react/no-unused-prop-types": "error",
1017
- "react/no-unused-state": "error",
1018
- "react/no-will-update-set-state": "error",
1019
- "react/prefer-es6-class": "error",
1020
- "react/prefer-exact-props": "error",
1021
- "react/prefer-read-only-props": "error",
1022
- "react/prefer-stateless-function": "error",
1023
- "react/prop-types": "error",
1024
- "react/react-in-jsx-scope": "off",
1025
- // 使用 JSX 时需要引入 React
1026
- "react/require-default-props": "off",
1027
- // 为每个非必需 prop 强制执行 defaultProps 定义
1028
- "react/require-optimization": "error",
1029
- "react/require-render-return": "error",
1030
- "react/self-closing-comp": "error",
1031
- "react/sort-comp": "error",
1032
- "react/sort-default-props": "error",
1033
- "react/sort-prop-types": "error",
1034
- "react/state-in-constructor": "error",
1035
- "react/static-property-placement": "error",
1036
- "react/style-prop-object": "error",
1037
- "react/void-dom-elements-no-children": "error",
1038
- "style/jsx-pascal-case": "error",
1039
- ...typescript2 ? {
1040
- "react/jsx-no-undef": "off",
1041
- "react/prop-type": "off"
1004
+ "react/no-unsafe-component-will-mount": "warn",
1005
+ "react/no-unsafe-component-will-receive-props": "warn",
1006
+ "react/no-unsafe-component-will-update": "warn",
1007
+ "react/no-unstable-context-value": "error",
1008
+ "react/no-unstable-default-props": "error",
1009
+ "react/no-unused-class-component-members": "warn",
1010
+ "react/no-unused-state": "warn",
1011
+ "react/no-useless-fragment": "warn",
1012
+ "react/prefer-destructuring-assignment": "warn",
1013
+ "react/prefer-shorthand-boolean": "warn",
1014
+ "react/prefer-shorthand-fragment": "warn",
1015
+ ...isTypeAware ? {
1016
+ "react/no-leaked-conditional-rendering": "warn"
1042
1017
  } : {},
1018
+ // overrides
1043
1019
  ...overrides
1044
1020
  },
1045
1021
  settings: {
@@ -1869,6 +1845,10 @@ var VuePackages = [
1869
1845
  "@slidev/cli"
1870
1846
  ];
1871
1847
  var defaultPluginRenaming = {
1848
+ "@eslint-react": "react",
1849
+ "@eslint-react/dom": "react-dom",
1850
+ "@eslint-react/hooks-extra": "react-hooks-extra",
1851
+ "@eslint-react/naming-convention": "react-naming-convention",
1872
1852
  "@stylistic": "style",
1873
1853
  "@typescript-eslint": "ts",
1874
1854
  "import-x": "import",
@@ -1894,16 +1874,18 @@ function lincy(options = {}, ...userConfigs) {
1894
1874
  } = options;
1895
1875
  const stylisticOptions = options.stylistic === false ? false : typeof options.stylistic === "object" ? options.stylistic : {};
1896
1876
  if (stylisticOptions) {
1897
- if (!("jsx" in stylisticOptions))
1877
+ if (!("jsx" in stylisticOptions)) {
1898
1878
  stylisticOptions.jsx = options.jsx ?? true;
1879
+ }
1899
1880
  }
1900
1881
  const configs = [];
1901
1882
  if (enableGitignore) {
1902
1883
  if (typeof enableGitignore !== "boolean") {
1903
1884
  configs.push(interopDefault(import("eslint-config-flat-gitignore")).then((r) => [r(enableGitignore)]));
1904
1885
  } else {
1905
- if (fs.existsSync(".gitignore"))
1886
+ if (fs.existsSync(".gitignore")) {
1906
1887
  configs.push(interopDefault(import("eslint-config-flat-gitignore")).then((r) => [r()]));
1888
+ }
1907
1889
  }
1908
1890
  }
1909
1891
  configs.push(
@@ -1926,8 +1908,9 @@ function lincy(options = {}, ...userConfigs) {
1926
1908
  // Optional plugins (installed but not enabled by default)
1927
1909
  perfectionist()
1928
1910
  );
1929
- if (enableVue)
1911
+ if (enableVue) {
1930
1912
  componentExts.push("vue");
1913
+ }
1931
1914
  if (enableTypeScript) {
1932
1915
  configs.push(typescript({
1933
1916
  ...typeof enableTypeScript !== "boolean" ? enableTypeScript : {},
@@ -2007,20 +1990,23 @@ function lincy(options = {}, ...userConfigs) {
2007
1990
  ));
2008
1991
  }
2009
1992
  const fusedConfig = flatConfigProps.reduce((acc, key) => {
2010
- if (key in options)
1993
+ if (key in options) {
2011
1994
  acc[key] = options[key];
1995
+ }
2012
1996
  return acc;
2013
1997
  }, {});
2014
- if (Object.keys(fusedConfig).length)
1998
+ if (Object.keys(fusedConfig).length) {
2015
1999
  configs.push([fusedConfig]);
2016
- let pipeline = new FlatConfigComposer();
2017
- pipeline = pipeline.append(
2000
+ }
2001
+ let composer = new FlatConfigComposer();
2002
+ composer = composer.append(
2018
2003
  ...configs,
2019
2004
  ...userConfigs
2020
2005
  );
2021
- if (autoRenamePlugins)
2022
- pipeline = pipeline.renamePlugins(defaultPluginRenaming);
2023
- return pipeline;
2006
+ if (autoRenamePlugins) {
2007
+ composer = composer.renamePlugins(defaultPluginRenaming);
2008
+ }
2009
+ return composer;
2024
2010
  }
2025
2011
 
2026
2012
  // src/index.ts
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@lincy/eslint-config",
3
3
  "type": "module",
4
- "version": "4.3.1",
4
+ "version": "4.5.0",
5
5
  "packageManager": "pnpm@8.7.6",
6
6
  "description": "LinCenYing's ESLint config",
7
7
  "author": "LinCenYing <lincenying@gmail.com> (https://github.com/lincenying/)",
@@ -37,21 +37,21 @@
37
37
  "prepare": "npx simple-git-hooks"
38
38
  },
39
39
  "peerDependencies": {
40
+ "@eslint-react/eslint-plugin": "^7.33.2",
40
41
  "@unocss/eslint-plugin": ">=0.50.0",
41
42
  "eslint": ">=8.40.0",
42
43
  "eslint-plugin-format": ">=0.1.0",
43
- "eslint-plugin-react": "^7.33.2",
44
44
  "eslint-plugin-react-hooks": "^4.6.0",
45
45
  "eslint-plugin-react-refresh": "^0.4.4"
46
46
  },
47
47
  "peerDependenciesMeta": {
48
- "@unocss/eslint-plugin": {
48
+ "@eslint-react/eslint-plugin": {
49
49
  "optional": true
50
50
  },
51
- "eslint-plugin-format": {
51
+ "@unocss/eslint-plugin": {
52
52
  "optional": true
53
53
  },
54
- "eslint-plugin-react": {
54
+ "eslint-plugin-format": {
55
55
  "optional": true
56
56
  },
57
57
  "eslint-plugin-react-hooks": {
@@ -64,29 +64,29 @@
64
64
  "dependencies": {
65
65
  "@antfu/eslint-define-config": "1.23.0-2",
66
66
  "@antfu/install-pkg": "^0.3.2",
67
- "@stylistic/eslint-plugin": "1.7.0",
68
- "@typescript-eslint/eslint-plugin": "^7.5.0",
69
- "@typescript-eslint/parser": "^7.5.0",
70
- "eslint-config-flat-gitignore": "^0.1.3",
71
- "eslint-flat-config-utils": "^0.2.0",
67
+ "@stylistic/eslint-plugin": "1.7.2",
68
+ "@typescript-eslint/eslint-plugin": "^7.7.1",
69
+ "@typescript-eslint/parser": "^7.7.1",
70
+ "eslint-config-flat-gitignore": "^0.1.5",
71
+ "eslint-flat-config-utils": "^0.2.3",
72
72
  "eslint-merge-processors": "^0.1.0",
73
73
  "eslint-parser-plain": "^0.1.0",
74
74
  "eslint-plugin-antfu": "^2.1.2",
75
75
  "eslint-plugin-eslint-comments": "^3.2.0",
76
76
  "eslint-plugin-import-x": "^0.5.0",
77
- "eslint-plugin-jsdoc": "^48.2.2",
78
- "eslint-plugin-jsonc": "^2.15.0",
77
+ "eslint-plugin-jsdoc": "^48.2.3",
78
+ "eslint-plugin-jsonc": "^2.15.1",
79
79
  "eslint-plugin-markdown": "^4.0.1",
80
- "eslint-plugin-n": "^16.6.2",
80
+ "eslint-plugin-n": "^17.2.1",
81
81
  "eslint-plugin-no-only-tests": "^3.1.0",
82
- "eslint-plugin-perfectionist": "^2.7.0",
82
+ "eslint-plugin-perfectionist": "^2.9.0",
83
83
  "eslint-plugin-toml": "^0.11.0",
84
- "eslint-plugin-unicorn": "^51.0.1",
84
+ "eslint-plugin-unicorn": "^52.0.0",
85
85
  "eslint-plugin-unused-imports": "^3.1.0",
86
- "eslint-plugin-vitest": "^0.4.1",
87
- "eslint-plugin-vue": "^9.24.0",
86
+ "eslint-plugin-vitest": "^0.5.3",
87
+ "eslint-plugin-vue": "^9.25.0",
88
88
  "eslint-plugin-yml": "^1.14.0",
89
- "eslint-processor-vue-blocks": "^0.1.1",
89
+ "eslint-processor-vue-blocks": "^0.1.2",
90
90
  "globals": "^15.0.0",
91
91
  "jsonc-eslint-parser": "^2.4.0",
92
92
  "local-pkg": "^0.5.0",
@@ -97,35 +97,36 @@
97
97
  },
98
98
  "devDependencies": {
99
99
  "@antfu/ni": "^0.21.12",
100
- "@eslint-types/jsdoc": "48.2.1",
101
- "@eslint-types/typescript-eslint": "^7.2.0",
102
- "@eslint-types/unicorn": "^51.0.1",
103
- "@eslint/config-inspector": "^0.2.1",
100
+ "@eslint-react/eslint-plugin": "^1.5.9",
101
+ "@eslint-types/jsdoc": "48.2.2",
102
+ "@eslint-types/typescript-eslint": "^7.5.0",
103
+ "@eslint-types/unicorn": "^52.0.0",
104
+ "@eslint/config-inspector": "^0.4.7",
104
105
  "@lincy/eslint-config": "workspace:*",
105
- "@stylistic/eslint-plugin-migrate": "^1.7.0",
106
- "@types/eslint": "^8.56.7",
107
- "@types/node": "^20.12.2",
106
+ "@stylistic/eslint-plugin-migrate": "^1.7.2",
107
+ "@types/eslint": "^8.56.10",
108
+ "@types/node": "^20.12.7",
108
109
  "@types/prompts": "^2.4.9",
109
- "@unocss/eslint-plugin": "^0.58.8",
110
+ "@unocss/eslint-plugin": "^0.59.4",
110
111
  "bumpp": "^9.4.0",
111
- "eslint": "^8.57.0",
112
- "eslint-plugin-format": "^0.1.0",
113
- "eslint-plugin-react": "^7.34.1",
112
+ "eslint": "^9.1.1",
113
+ "eslint-plugin-format": "^0.1.1",
114
114
  "eslint-plugin-react-hooks": "^4.6.0",
115
115
  "eslint-plugin-react-refresh": "^0.4.6",
116
- "eslint-typegen": "^0.2.0",
116
+ "eslint-typegen": "^0.2.4",
117
117
  "esno": "^4.7.0",
118
118
  "lint-staged": "^15.2.2",
119
119
  "prettier": "^3.2.5",
120
+ "react": "^18.2.0",
120
121
  "rimraf": "^5.0.5",
121
122
  "simple-git-hooks": "^2.11.1",
122
123
  "simple-open-url": "^3.0.1",
123
124
  "sucrase": "^3.35.0",
124
125
  "tsup": "^8.0.2",
125
- "typescript": "^5.4.3",
126
+ "typescript": "^5.4.5",
126
127
  "unbuild": "^2.0.0",
127
- "vitest": "^1.4.0",
128
- "vue": "^3.4.21"
128
+ "vitest": "^1.5.0",
129
+ "vue": "^3.4.24"
129
130
  },
130
131
  "pnpm": {
131
132
  "peerDependencyRules": {