diff --git a/internal/eslint-config/.eslintrc.js b/internal/eslint-config/.eslintrc.js index 870eb0800c91b411c49da89574a0470b3e92aab5..cd27a196114998b9cd6a62bece83e84b30c75a72 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 4741d596315f876557f3eff528fb1c248fe979ac..5dbf5b700eb200f83110dd43fad645677078790b 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 870eb0800c91b411c49da89574a0470b3e92aab5..cd27a196114998b9cd6a62bece83e84b30c75a72 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 870eb0800c91b411c49da89574a0470b3e92aab5..cd27a196114998b9cd6a62bece83e84b30c75a72 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 53679464091d8232a25b9996054566e705a4f6b3..92c6934211d9fc50153ff4053daeb642745ecdab 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 d00e9c4cd23b9927893af4aef1dadfeb41dfb2ed..8a56c897d422d971fe9c11a57064ac3e501909a6 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 78e62bc45144f9d4bb1e6c0ab932de774be61100..cb6dd1911875199cbe0191775fe02bc3bf4bf8ff 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 96395125578ee8500ff65f57e2eab0023ed51612..a98b041662fbe8704f76ea2ae8f891925db7c928 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 7d9e002f5cf437257555cd11234911a617a4268f..7f32df6a11f2693c09a8533e62c687b165e27968 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 e01f965cc33abbe0b34861b46deb4f7d7bfefc36..659e5af7ffd8646d7fe05452df926293dd342ad0 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 268eb55c598a060046971fd25b5413e257ffc4ad..0b6ba6214f9869ea787f59e102f3763dfb20782c 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 186857f2289b7794f4e2b1007a5e510325320873..648d87363f61e29194e7a954007e5d31159d7c4c 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 797ef06d2c6545e3c4b7ff4ba83e0fb0515edf13..8ac8a8fb406d89790b924e2bdbf96495f4caa704 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 870eb0800c91b411c49da89574a0470b3e92aab5..cd27a196114998b9cd6a62bece83e84b30c75a72 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 137143b0f5bba789e146acb152f5c9fc78bd658f..e18d6d969e093e19e64c50606662e9786aec97fb 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 6037593c38f5647e1f2c3435cf8d4cc5f7ccb90d..53a3c5e574833307245479deadf4d6e5c3e126a0 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 b886d62d778d0fd73d9ab8593c63c144dd743a2d..c9b14eac73c0973421f84bd76f7aea85a304c07d 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 180bb1497b4971b220ed26652015bc106f192055..14ff1610c74398fa1f129b3b225942b9a98e6dd4 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 870eb0800c91b411c49da89574a0470b3e92aab5..cd27a196114998b9cd6a62bece83e84b30c75a72 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 33c95e2a49ae4dfeebcf576be6e350131268d2d5..73e51f58845a496e33e57b9c5ee0e3b60288d364 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, };