From 6890dd720135b52e2d810fd85ae44062bec0c661 Mon Sep 17 00:00:00 2001 From: vben Date: Thu, 6 Apr 2023 23:28:37 +0800 Subject: [PATCH] =?UTF-8?q?perf:=20=E6=96=B0=E5=8C=85=E4=BD=BF=E7=94=A8?= =?UTF-8?q?=E6=9B=B4=E4=B8=A5=E6=A0=BC=E7=9A=84eslint?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- internal/eslint-config/.eslintrc.js | 2 +- internal/eslint-config/src/strict.ts | 53 ++++++++++++++++--- internal/stylelint-config/.eslintrc.js | 2 +- internal/vite-config/.eslintrc.js | 2 +- .../vite-config/src/config/application.ts | 12 +++-- internal/vite-config/src/config/common.ts | 4 +- internal/vite-config/src/config/package.ts | 9 ++-- internal/vite-config/src/plugins/appConfig.ts | 5 +- internal/vite-config/src/plugins/index.ts | 17 +++--- internal/vite-config/src/plugins/svgSprite.ts | 3 +- .../vite-config/src/plugins/visualizer.ts | 2 +- internal/vite-config/src/utils/env.ts | 3 +- internal/vite-config/src/utils/modifyVars.ts | 5 +- packages/hooks/.eslintrc.js | 2 +- packages/hooks/src/index.ts | 1 - packages/hooks/src/onMountedOrActivated.ts | 2 +- packages/hooks/src/useAttrs.ts | 2 +- packages/hooks/src/useRefs.ts | 2 +- packages/types/.eslintrc.js | 2 +- packages/types/src/utils.ts | 12 ++--- 20 files changed, 96 insertions(+), 46 deletions(-) diff --git a/internal/eslint-config/.eslintrc.js b/internal/eslint-config/.eslintrc.js index 870eb080..cd27a196 100644 --- a/internal/eslint-config/.eslintrc.js +++ b/internal/eslint-config/.eslintrc.js @@ -1,4 +1,4 @@ module.exports = { root: true, - extends: ['@vben'], + extends: ['@vben/eslint-config/strict'], }; diff --git a/internal/eslint-config/src/strict.ts b/internal/eslint-config/src/strict.ts index 4741d596..5dbf5b70 100644 --- a/internal/eslint-config/src/strict.ts +++ b/internal/eslint-config/src/strict.ts @@ -1,16 +1,55 @@ -import baseLintConfig from './index'; - export default { - extends: [baseLintConfig], + extends: ['@vben'], plugins: ['simple-import-sort'], rules: { 'simple-import-sort/imports': 'error', 'simple-import-sort/exports': 'error', - '@typescript-eslint/ban-types': 'error', - '@typescript-eslint/ban-ts-ignore': 'error', - '@typescript-eslint/ban-ts-comment': 'error', - '@typescript-eslint/no-explicit-any': 'error', + '@typescript-eslint/ban-ts-comment': [ + 'error', + { + 'ts-expect-error': 'allow-with-description', + 'ts-ignore': 'allow-with-description', + 'ts-nocheck': 'allow-with-description', + 'ts-check': false, + }, + ], + + /** + * 【强制】关键字前后有一个空格 + * @link https://github.com/typescript-eslint/typescript-eslint/blob/master/packages/eslint-plugin/docs/rules/keyword-spacing.md + */ + 'keyword-spacing': 'off', + '@typescript-eslint/keyword-spacing': [ + 'error', + { + before: true, + after: true, + overrides: { + return: { after: true }, + throw: { after: true }, + case: { after: true }, + }, + }, + ], + + /** + * 禁止出现空函数,普通函数(非 async/await/generator)、箭头函数、类上的方法除外 + * @link https://github.com/typescript-eslint/typescript-eslint/blob/master/packages/eslint-plugin/docs/rules/no-empty-function.md + */ + 'no-empty-function': 'off', + '@typescript-eslint/no-empty-function': [ + 'error', + { + allow: ['arrowFunctions', 'functions', 'methods'], + }, + ], + + /** + * 优先使用 interface 而不是 type 定义对象类型 + * @link https://github.com/typescript-eslint/typescript-eslint/blob/master/packages/eslint-plugin/docs/rules/consistent-type-definitions.md + */ + '@typescript-eslint/consistent-type-definitions': ['warn', 'interface'], 'vue/attributes-order': 'error', 'vue/require-default-prop': 'error', diff --git a/internal/stylelint-config/.eslintrc.js b/internal/stylelint-config/.eslintrc.js index 870eb080..cd27a196 100644 --- a/internal/stylelint-config/.eslintrc.js +++ b/internal/stylelint-config/.eslintrc.js @@ -1,4 +1,4 @@ module.exports = { root: true, - extends: ['@vben'], + extends: ['@vben/eslint-config/strict'], }; diff --git a/internal/vite-config/.eslintrc.js b/internal/vite-config/.eslintrc.js index 870eb080..cd27a196 100644 --- a/internal/vite-config/.eslintrc.js +++ b/internal/vite-config/.eslintrc.js @@ -1,4 +1,4 @@ module.exports = { root: true, - extends: ['@vben'], + extends: ['@vben/eslint-config/strict'], }; diff --git a/internal/vite-config/src/config/application.ts b/internal/vite-config/src/config/application.ts index 53679464..92c69342 100644 --- a/internal/vite-config/src/config/application.ts +++ b/internal/vite-config/src/config/application.ts @@ -1,14 +1,18 @@ -import { type UserConfig, defineConfig, mergeConfig, loadEnv } from 'vite'; import { resolve } from 'node:path'; + +import dayjs from 'dayjs'; import { readPackageJSON } from 'pkg-types'; +import { defineConfig, loadEnv, mergeConfig, type UserConfig } from 'vite'; + +import { createPlugins } from '../plugins'; import { generateModifyVars } from '../utils/modifyVars'; import { commonConfig } from './common'; -import { createPlugins } from '../plugins'; -import dayjs from 'dayjs'; interface DefineOptions { overrides?: UserConfig; - options?: {}; + options?: { + // + }; } function defineApplicationConfig(defineOptions: DefineOptions = {}) { diff --git a/internal/vite-config/src/config/common.ts b/internal/vite-config/src/config/common.ts index d00e9c4c..8a56c897 100644 --- a/internal/vite-config/src/config/common.ts +++ b/internal/vite-config/src/config/common.ts @@ -1,6 +1,6 @@ -import { type UserConfig } from 'vite'; -import UnoCSS from 'unocss/vite'; import { presetTypography, presetUno } from 'unocss'; +import UnoCSS from 'unocss/vite'; +import { type UserConfig } from 'vite'; const commonConfig: UserConfig = { server: { diff --git a/internal/vite-config/src/config/package.ts b/internal/vite-config/src/config/package.ts index 78e62bc4..cb6dd191 100644 --- a/internal/vite-config/src/config/package.ts +++ b/internal/vite-config/src/config/package.ts @@ -1,11 +1,14 @@ -import { type UserConfig, defineConfig, mergeConfig } from 'vite'; import { readPackageJSON } from 'pkg-types'; -import { commonConfig } from './common'; +import { defineConfig, mergeConfig, type UserConfig } from 'vite'; import dts from 'vite-plugin-dts'; +import { commonConfig } from './common'; + interface DefineOptions { overrides?: UserConfig; - options?: {}; + options?: { + // + }; } function definePackageConfig(defineOptions: DefineOptions = {}) { diff --git a/internal/vite-config/src/plugins/appConfig.ts b/internal/vite-config/src/plugins/appConfig.ts index 96395125..a98b0416 100644 --- a/internal/vite-config/src/plugins/appConfig.ts +++ b/internal/vite-config/src/plugins/appConfig.ts @@ -1,8 +1,9 @@ +import colors from 'picocolors'; +import { readPackageJSON } from 'pkg-types'; import { type PluginOption } from 'vite'; + import { getEnvConfig } from '../utils/env'; import { createContentHash } from '../utils/hash'; -import { readPackageJSON } from 'pkg-types'; -import colors from 'picocolors'; const GLOBAL_CONFIG_FILE_NAME = '_app.config.js'; const PLUGIN_NAME = 'app-config'; diff --git a/internal/vite-config/src/plugins/index.ts b/internal/vite-config/src/plugins/index.ts index 7d9e002f..7f32df6a 100644 --- a/internal/vite-config/src/plugins/index.ts +++ b/internal/vite-config/src/plugins/index.ts @@ -1,15 +1,16 @@ +import vue from '@vitejs/plugin-vue'; +import vueJsx from '@vitejs/plugin-vue-jsx'; +// @ts-ignore: type unless +import DefineOptions from 'unplugin-vue-define-options/vite'; import { type PluginOption } from 'vite'; +import purgeIcons from 'vite-plugin-purge-icons'; + +import { createAppConfigPlugin } from './appConfig'; +import { configCompressPlugin } from './compress'; import { configHtmlPlugin } from './html'; import { configMockPlugin } from './mock'; -import { configCompressPlugin } from './compress'; -import { configVisualizerConfig } from './visualizer'; import { configSvgIconsPlugin } from './svgSprite'; -import { createAppConfigPlugin } from './appConfig'; -import vue from '@vitejs/plugin-vue'; -import vueJsx from '@vitejs/plugin-vue-jsx'; -import purgeIcons from 'vite-plugin-purge-icons'; -// @ts-ignore -import DefineOptions from 'unplugin-vue-define-options/vite'; +import { configVisualizerConfig } from './visualizer'; interface Options { isBuild: boolean; diff --git a/internal/vite-config/src/plugins/svgSprite.ts b/internal/vite-config/src/plugins/svgSprite.ts index e01f965c..659e5af7 100644 --- a/internal/vite-config/src/plugins/svgSprite.ts +++ b/internal/vite-config/src/plugins/svgSprite.ts @@ -3,9 +3,10 @@ * https://github.com/anncwb/vite-plugin-svg-icons */ -import { createSvgIconsPlugin } from 'vite-plugin-svg-icons'; import { resolve } from 'node:path'; + import type { PluginOption } from 'vite'; +import { createSvgIconsPlugin } from 'vite-plugin-svg-icons'; export function configSvgIconsPlugin({ isBuild }: { isBuild: boolean }) { const svgIconsPlugin = createSvgIconsPlugin({ diff --git a/internal/vite-config/src/plugins/visualizer.ts b/internal/vite-config/src/plugins/visualizer.ts index 268eb55c..0b6ba621 100644 --- a/internal/vite-config/src/plugins/visualizer.ts +++ b/internal/vite-config/src/plugins/visualizer.ts @@ -1,8 +1,8 @@ /** * Package file volume analysis */ -import { type PluginOption } from 'vite'; import visualizer from 'rollup-plugin-visualizer'; +import { type PluginOption } from 'vite'; export function configVisualizerConfig() { return visualizer({ diff --git a/internal/vite-config/src/utils/env.ts b/internal/vite-config/src/utils/env.ts index 186857f2..648d8736 100644 --- a/internal/vite-config/src/utils/env.ts +++ b/internal/vite-config/src/utils/env.ts @@ -1,6 +1,7 @@ +import { join } from 'node:path'; + import dotenv from 'dotenv'; import { readFile } from 'fs-extra'; -import { join } from 'node:path'; /** * 获取当前环境下生效的配置文件名 diff --git a/internal/vite-config/src/utils/modifyVars.ts b/internal/vite-config/src/utils/modifyVars.ts index 797ef06d..8ac8a8fb 100644 --- a/internal/vite-config/src/utils/modifyVars.ts +++ b/internal/vite-config/src/utils/modifyVars.ts @@ -1,6 +1,7 @@ -import { generate } from '@ant-design/colors'; import { resolve } from 'node:path'; -// @ts-ignore + +import { generate } from '@ant-design/colors'; +// @ts-ignore: typo import { getThemeVariables } from 'ant-design-vue/dist/theme'; const primaryColor = '#0960bd'; diff --git a/packages/hooks/.eslintrc.js b/packages/hooks/.eslintrc.js index 870eb080..cd27a196 100644 --- a/packages/hooks/.eslintrc.js +++ b/packages/hooks/.eslintrc.js @@ -1,4 +1,4 @@ module.exports = { root: true, - extends: ['@vben'], + extends: ['@vben/eslint-config/strict'], }; diff --git a/packages/hooks/src/index.ts b/packages/hooks/src/index.ts index 137143b0..e18d6d96 100644 --- a/packages/hooks/src/index.ts +++ b/packages/hooks/src/index.ts @@ -1,5 +1,4 @@ export * from './onMountedOrActivated'; export * from './useAttrs'; export * from './useRefs'; - export { useTimeoutFn } from '@vueuse/core'; diff --git a/packages/hooks/src/onMountedOrActivated.ts b/packages/hooks/src/onMountedOrActivated.ts index 6037593c..53a3c5e5 100644 --- a/packages/hooks/src/onMountedOrActivated.ts +++ b/packages/hooks/src/onMountedOrActivated.ts @@ -1,5 +1,5 @@ import { type AnyFunction } from '@vben/types'; -import { nextTick, onMounted, onActivated } from 'vue'; +import { nextTick, onActivated, onMounted } from 'vue'; /** * 在 OnMounted 或者 OnActivated 时触发 diff --git a/packages/hooks/src/useAttrs.ts b/packages/hooks/src/useAttrs.ts index b886d62d..c9b14eac 100644 --- a/packages/hooks/src/useAttrs.ts +++ b/packages/hooks/src/useAttrs.ts @@ -1,5 +1,5 @@ -import { getCurrentInstance, reactive, shallowRef, watchEffect } from 'vue'; import { type Recordable } from '@vben/types'; +import { getCurrentInstance, reactive, shallowRef, watchEffect } from 'vue'; interface Options { excludeListeners?: boolean; diff --git a/packages/hooks/src/useRefs.ts b/packages/hooks/src/useRefs.ts index 180bb149..14ff1610 100644 --- a/packages/hooks/src/useRefs.ts +++ b/packages/hooks/src/useRefs.ts @@ -1,5 +1,5 @@ import type { Ref } from 'vue'; -import { ref, onBeforeUpdate } from 'vue'; +import { onBeforeUpdate, ref } from 'vue'; export function useRefs(): [Ref, (index: number) => (el: HTMLElement) => void] { const refs = ref([]) as Ref; diff --git a/packages/types/.eslintrc.js b/packages/types/.eslintrc.js index 870eb080..cd27a196 100644 --- a/packages/types/.eslintrc.js +++ b/packages/types/.eslintrc.js @@ -1,4 +1,4 @@ module.exports = { root: true, - extends: ['@vben'], + extends: ['@vben/eslint-config/strict'], }; diff --git a/packages/types/src/utils.ts b/packages/types/src/utils.ts index 33c95e2a..73e51f58 100644 --- a/packages/types/src/utils.ts +++ b/packages/types/src/utils.ts @@ -31,9 +31,9 @@ type Recordable = Record; /** * 字符串类型对象(只读) */ -type ReadonlyRecordable = { +interface ReadonlyRecordable { readonly [key: string]: T; -}; +} /** * setTimeout 返回值类型 @@ -47,12 +47,12 @@ type IntervalHandle = ReturnType; export { type AnyFunction, - type AnyPromiseFunction, type AnyNormalFunction, - type Nullable, + type AnyPromiseFunction, + type IntervalHandle, type NonNullable, - type Recordable, + type Nullable, type ReadonlyRecordable, + type Recordable, type TimeoutHandle, - type IntervalHandle, }; -- GitLab