Procházet zdrojové kódy

fix(lint): autoimport gen eslintrc-auto-import.json files

runningwater před 7 měsíci
rodič
revize
717face0f9

+ 93 - 0
.eslintrc-auto-import.json

@@ -0,0 +1,93 @@
+{
+  "globals": {
+    "Component": true,
+    "ComponentPublicInstance": true,
+    "ComputedRef": true,
+    "DirectiveBinding": true,
+    "EffectScope": true,
+    "ExtractDefaultPropTypes": true,
+    "ExtractPropTypes": true,
+    "ExtractPublicPropTypes": true,
+    "InjectionKey": true,
+    "MaybeRef": true,
+    "MaybeRefOrGetter": true,
+    "PropType": true,
+    "Ref": true,
+    "Slot": true,
+    "Slots": true,
+    "VNode": true,
+    "WritableComputedRef": true,
+    "acceptHMRUpdate": true,
+    "computed": true,
+    "createApp": true,
+    "createPinia": true,
+    "customRef": true,
+    "defineAsyncComponent": true,
+    "defineComponent": true,
+    "defineStore": true,
+    "effectScope": true,
+    "getActivePinia": true,
+    "getCurrentInstance": true,
+    "getCurrentScope": true,
+    "h": true,
+    "inject": true,
+    "isProxy": true,
+    "isReactive": true,
+    "isReadonly": true,
+    "isRef": true,
+    "mapActions": true,
+    "mapGetters": true,
+    "mapState": true,
+    "mapStores": true,
+    "mapWritableState": true,
+    "markRaw": true,
+    "nextTick": true,
+    "onActivated": true,
+    "onBeforeMount": true,
+    "onBeforeRouteLeave": true,
+    "onBeforeRouteUpdate": true,
+    "onBeforeUnmount": true,
+    "onBeforeUpdate": true,
+    "onDeactivated": true,
+    "onErrorCaptured": true,
+    "onMounted": true,
+    "onRenderTracked": true,
+    "onRenderTriggered": true,
+    "onScopeDispose": true,
+    "onServerPrefetch": true,
+    "onUnmounted": true,
+    "onUpdated": true,
+    "onWatcherCleanup": true,
+    "provide": true,
+    "reactive": true,
+    "readonly": true,
+    "ref": true,
+    "resolveComponent": true,
+    "setActivePinia": true,
+    "setMapStoreSuffix": true,
+    "shallowReactive": true,
+    "shallowReadonly": true,
+    "shallowRef": true,
+    "storeToRefs": true,
+    "toRaw": true,
+    "toRef": true,
+    "toRefs": true,
+    "toValue": true,
+    "triggerRef": true,
+    "unref": true,
+    "useAttrs": true,
+    "useCssModule": true,
+    "useCssVars": true,
+    "useId": true,
+    "useLink": true,
+    "useModel": true,
+    "useRoute": true,
+    "useRouter": true,
+    "useSlots": true,
+    "useTemplateRef": true,
+    "watch": true,
+    "watchEffect": true,
+    "watchPostEffect": true,
+    "watchSyncEffect": true
+  }
+}

+ 88 - 0
auto-imports.d.ts

@@ -0,0 +1,88 @@
+/* eslint-disable */
+/* prettier-ignore */
+// @ts-nocheck
+// noinspection JSUnusedGlobalSymbols
+// Generated by unplugin-auto-import
+// biome-ignore lint: disable
+export {}
+declare global {
+  const EffectScope: typeof import('vue')['EffectScope']
+  const acceptHMRUpdate: typeof import('pinia')['acceptHMRUpdate']
+  const computed: typeof import('vue')['computed']
+  const createApp: typeof import('vue')['createApp']
+  const createPinia: typeof import('pinia')['createPinia']
+  const customRef: typeof import('vue')['customRef']
+  const defineAsyncComponent: typeof import('vue')['defineAsyncComponent']
+  const defineComponent: typeof import('vue')['defineComponent']
+  const defineStore: typeof import('pinia')['defineStore']
+  const effectScope: typeof import('vue')['effectScope']
+  const getActivePinia: typeof import('pinia')['getActivePinia']
+  const getCurrentInstance: typeof import('vue')['getCurrentInstance']
+  const getCurrentScope: typeof import('vue')['getCurrentScope']
+  const h: typeof import('vue')['h']
+  const inject: typeof import('vue')['inject']
+  const isProxy: typeof import('vue')['isProxy']
+  const isReactive: typeof import('vue')['isReactive']
+  const isReadonly: typeof import('vue')['isReadonly']
+  const isRef: typeof import('vue')['isRef']
+  const mapActions: typeof import('pinia')['mapActions']
+  const mapGetters: typeof import('pinia')['mapGetters']
+  const mapState: typeof import('pinia')['mapState']
+  const mapStores: typeof import('pinia')['mapStores']
+  const mapWritableState: typeof import('pinia')['mapWritableState']
+  const markRaw: typeof import('vue')['markRaw']
+  const nextTick: typeof import('vue')['nextTick']
+  const onActivated: typeof import('vue')['onActivated']
+  const onBeforeMount: typeof import('vue')['onBeforeMount']
+  const onBeforeRouteLeave: typeof import('vue-router')['onBeforeRouteLeave']
+  const onBeforeRouteUpdate: typeof import('vue-router')['onBeforeRouteUpdate']
+  const onBeforeUnmount: typeof import('vue')['onBeforeUnmount']
+  const onBeforeUpdate: typeof import('vue')['onBeforeUpdate']
+  const onDeactivated: typeof import('vue')['onDeactivated']
+  const onErrorCaptured: typeof import('vue')['onErrorCaptured']
+  const onMounted: typeof import('vue')['onMounted']
+  const onRenderTracked: typeof import('vue')['onRenderTracked']
+  const onRenderTriggered: typeof import('vue')['onRenderTriggered']
+  const onScopeDispose: typeof import('vue')['onScopeDispose']
+  const onServerPrefetch: typeof import('vue')['onServerPrefetch']
+  const onUnmounted: typeof import('vue')['onUnmounted']
+  const onUpdated: typeof import('vue')['onUpdated']
+  const onWatcherCleanup: typeof import('vue')['onWatcherCleanup']
+  const provide: typeof import('vue')['provide']
+  const reactive: typeof import('vue')['reactive']
+  const readonly: typeof import('vue')['readonly']
+  const ref: typeof import('vue')['ref']
+  const resolveComponent: typeof import('vue')['resolveComponent']
+  const setActivePinia: typeof import('pinia')['setActivePinia']
+  const setMapStoreSuffix: typeof import('pinia')['setMapStoreSuffix']
+  const shallowReactive: typeof import('vue')['shallowReactive']
+  const shallowReadonly: typeof import('vue')['shallowReadonly']
+  const shallowRef: typeof import('vue')['shallowRef']
+  const storeToRefs: typeof import('pinia')['storeToRefs']
+  const toRaw: typeof import('vue')['toRaw']
+  const toRef: typeof import('vue')['toRef']
+  const toRefs: typeof import('vue')['toRefs']
+  const toValue: typeof import('vue')['toValue']
+  const triggerRef: typeof import('vue')['triggerRef']
+  const unref: typeof import('vue')['unref']
+  const useAttrs: typeof import('vue')['useAttrs']
+  const useCssModule: typeof import('vue')['useCssModule']
+  const useCssVars: typeof import('vue')['useCssVars']
+  const useId: typeof import('vue')['useId']
+  const useLink: typeof import('vue-router')['useLink']
+  const useModel: typeof import('vue')['useModel']
+  const useRoute: typeof import('vue-router')['useRoute']
+  const useRouter: typeof import('vue-router')['useRouter']
+  const useSlots: typeof import('vue')['useSlots']
+  const useTemplateRef: typeof import('vue')['useTemplateRef']
+  const watch: typeof import('vue')['watch']
+  const watchEffect: typeof import('vue')['watchEffect']
+  const watchPostEffect: typeof import('vue')['watchPostEffect']
+  const watchSyncEffect: typeof import('vue')['watchSyncEffect']
+}
+// for type re-export
+declare global {
+  // @ts-ignore
+  export type { Component, Slot, Slots, ComponentPublicInstance, ComputedRef, DirectiveBinding, ExtractDefaultPropTypes, ExtractPropTypes, ExtractPublicPropTypes, InjectionKey, PropType, Ref, MaybeRef, MaybeRefOrGetter, VNode, WritableComputedRef } from 'vue'
+  import('vue')
+}

+ 17 - 0
components.d.ts

@@ -0,0 +1,17 @@
+/* eslint-disable */
+// @ts-nocheck
+// Generated by unplugin-vue-components
+// Read more: https://github.com/vuejs/core/pull/3399
+// biome-ignore lint: disable
+export {}
+
+/* prettier-ignore */
+declare module 'vue' {
+  export interface GlobalComponents {
+    Dashboard: typeof import('./src/views/Dashboard/index.vue')['default']
+    ElButton: typeof import('element-plus/es')['ElButton']
+    RouterLink: typeof import('vue-router')['RouterLink']
+    RouterView: typeof import('vue-router')['RouterView']
+    Test: typeof import('./src/views/Dashboard/test.vue')['default']
+  }
+}

+ 4 - 4
eslint.config.js

@@ -1,21 +1,21 @@
 import { defineConfig } from "eslint/config";
 import globals from "globals";
-import js from "@eslint/js";
+import pluginJs from "@eslint/js";
 import tseslint from "typescript-eslint";
 import pluginVue from "eslint-plugin-vue";
 import prettierRecommended from "eslint-plugin-prettier/recommended";
 import { createRequire } from "module";
 const require = createRequire(import.meta.url);
+const autoImport = require("./.eslintrc-auto-import.json");
 
 export default defineConfig([
   { files: ["**/*.{js,mjs,cjs,ts,vue}"] },
   {
-    files: ["**/*.{js,mjs,cjs,ts,vue}"],
     languageOptions: {
-      globals: { ...globals.browser, ...globals.node }
+      globals: { ...globals.browser, ...globals.node, ...autoImport.globals }
     }
   },
-  // pluginJs.configs.recommended,
+  pluginJs.configs.recommended,
   ...tseslint.configs.recommended,
   ...pluginVue.configs["flat/recommended"],
   {

+ 4 - 0
package.json

@@ -1,4 +1,5 @@
 {
+  "$schema": "https://json.schemastore.org/package.json",
   "name": "vue3-admin",
   "private": true,
   "version": "0.0.0",
@@ -16,6 +17,7 @@
     "element-plus": "^2.9.7",
     "normalize.css": "^8.0.1",
     "pinia": "^3.0.1",
+    "unplugin-element-plus": "^0.9.1",
     "vue": "^3.5.13",
     "vue-router": "^4.5.0"
   },
@@ -39,6 +41,8 @@
     "typescript": "~5.7.2",
     "typescript-eslint": "^8.28.0",
     "unocss": "66.1.0-beta.7",
+    "unplugin-auto-import": "^19.1.2",
+    "unplugin-vue-components": "^28.4.1",
     "vite": "^6.2.0",
     "vue-tsc": "^2.2.4"
   },

Rozdílová data souboru nebyla zobrazena, protože soubor je příliš velký
+ 0 - 3685
pnpm-lock.yaml


+ 0 - 41
src/components/HelloWorld.vue

@@ -1,41 +0,0 @@
-<script setup lang="ts">
-import { ref } from 'vue'
-
-defineProps<{ msg: string }>()
-
-const count = ref(0)
-</script>
-
-<template>
-  <h1>{{ msg }}</h1>
-
-  <div class="card">
-    <button type="button" @click="count++">count is {{ count }}</button>
-    <p>
-      Edit
-      <code>components/HelloWorld.vue</code> to test HMR
-    </p>
-  </div>
-
-  <p>
-    Check out
-    <a href="https://vuejs.org/guide/quick-start.html#local" target="_blank"
-      >create-vue</a
-    >, the official Vue + Vite starter
-  </p>
-  <p>
-    Learn more about IDE Support for Vue in the
-    <a
-      href="https://vuejs.org/guide/scaling-up/tooling.html#ide-support"
-      target="_blank"
-      >Vue Docs Scaling up Guide</a
-    >.
-  </p>
-  <p class="read-the-docs">Click on the Vite and Vue logos to learn more</p>
-</template>
-
-<style scoped>
-.read-the-docs {
-  color: #888;
-}
-</style>

+ 5 - 3
src/main.ts

@@ -4,8 +4,9 @@ import App from "./App.vue";
 import router from "./router";
 import "normalize.css/normalize.css";
 import { createPinia } from "pinia";
-import ElementPlus from "element-plus";
-import "element-plus/dist/index.css";
+import element from "./plugins/element";
+// import ElementPlus from "element-plus";
+// import "element-plus/dist/index.css";
 import "@/style/index.scss";
 import "uno.css";
 
@@ -13,5 +14,6 @@ const app = createApp(App);
 const pinia = createPinia();
 app.use(router);
 app.use(pinia);
-app.use(ElementPlus);
+app.use(element);
+// app.use(ElementPlus);
 app.mount("#app");

+ 16 - 0
src/plugins/element.ts

@@ -0,0 +1,16 @@
+import type { App } from "vue";
+import { ElMessage, ElNotification, ElMessageBox } from "element-plus";
+
+/**
+ * 注册 element-plus
+ * @param app
+ */
+export default (app: App): void => {
+  app.config.globalProperties.$message = ElMessage;
+  app.config.globalProperties.$notify = ElNotification;
+  app.config.globalProperties.$confirm = ElMessageBox.confirm;
+  app.config.globalProperties.$alert = ElMessageBox.alert;
+  app.config.globalProperties.$prompt = ElMessageBox.prompt;
+};
+
+export type Size = "default" | "small" | "large";

+ 4 - 4
src/style/index.scss

@@ -1,7 +1,7 @@
-@import "./variables.module.scss";
+@use "variables.module.scss";
 
 :root {
-  --sidebar-width: #{$sideBarWidth};
-  --navbar-height: #{$navBarHeight};
-  --tagsview-height: #{$tagsViewHeight};
+  --sidebar-width: #{variables.$sideBarWidth};
+  --navbar-height: #{variables.$navBarHeight};
+  --tagsview-height: #{variables.$tagsViewHeight};
 }

+ 14 - 1
src/views/Dashboard/index.vue

@@ -1 +1,14 @@
-<template>Dashboard</template>
+<template>
+  <el-button>DashBoard</el-button>
+  <el-button @click="handle"></el-button>
+</template>
+<script lang="ts" setup>
+const a = ref(1);
+const { proxy } = getCurrentInstance()!;
+
+const handle = () => {
+  proxy?.$message({
+    message: "Hello World!" + a.value
+  });
+};
+</script>

+ 5 - 0
src/views/Dashboard/test.vue

@@ -0,0 +1,5 @@
+<template>
+  <div>
+    <h1>Hi, test!</h1>
+  </div>
+</template>

+ 1 - 1
tsconfig.app.json

@@ -13,7 +13,7 @@
     "paths": {
       "@/*": ["src/*"]
     },
-    "types": ["element-plus/global"]
+    "types": ["element-plus/global", "./auto-imports.d.ts", "./components.d.ts"]
   },
   "include": ["src/**/*.ts", "src/**/*.tsx", "src/**/*.vue"]
 }

+ 26 - 1
vite.config.ts

@@ -2,6 +2,10 @@ import { defineConfig } from "vite";
 import vue from "@vitejs/plugin-vue";
 import path from "path";
 import UnoCSS from "unocss/vite";
+import AutoImport from "unplugin-auto-import/vite";
+import Components from "unplugin-vue-components/vite";
+import { ElementPlusResolver } from "unplugin-vue-components/resolvers";
+import ElementPlus from "unplugin-element-plus/vite";
 
 // https://vite.dev/config/
 export default defineConfig({
@@ -16,6 +20,27 @@ export default defineConfig({
     UnoCSS({
       configFile: "./UnoCSS.config.ts"
     }),
-    vue()
+    vue(),
+    AutoImport({
+      // 自动导入 Vue 相关函数,如:ref, reactive, toRef 等
+      // api
+      imports: ["vue", "vue-router", "pinia"],
+      resolvers: [ElementPlusResolver()],
+      eslintrc: { enabled: true }
+      // 生成相应的 .eslintrc-auto-import.json 文件。
+      // 这样就可以在eslint中启用自动导入
+    }),
+    Components({
+      // 解析 ElementPlus 组件
+      resolvers: [ElementPlusResolver()],
+      // 所有自定义组件可以自动加载,无需 import
+      dirs: [
+        "src/components",
+        "src/layouts/components",
+        "src/views/**/components",
+        "src/views/"
+      ]
+    }),
+    ElementPlus({}) // 导入样式
   ]
 });