vite-plugin-config-helper 0.1.4 → 0.1.6

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/README.md CHANGED
@@ -73,8 +73,11 @@ export default defineConfig((config: ConfigEnv): UserConfig => {
73
73
  │ │ ├── auto-imports.d.ts # unplugin-auto-import 配置生成
74
74
  │ │ ├── components.d.ts # unplugin-vue-components 配置生成
75
75
  │ │ └── ep.d.ts # ElementPlus 配置文件,包括组件和样式自动导入等
76
+ │ ├── hooks/ # hook 目录
77
+ │ │ └── color.ts # ElementPlus 动态更改主题色
76
78
  ├── .env # vite-plugin-env-helper 添加的环境变量配置文件
77
79
  ├── eslint.config.ts # vite-plugin-env-helper 更改后的配置文件
78
80
  ├── vite.config.ts # 修改后的 vite 配置
79
81
  └── package.json # 修改后的依赖
80
- ```
82
+ ```
83
+
package/dist/esm/main.js CHANGED
@@ -1 +1 @@
1
- import*as e from"node:fs";import n from"node:fs";import*as o from"node:path";import*as t from"node:os";async function r(e){try{return await n.promises.access(e),!0}catch{return!1}}async function l(e,o){return await new Promise(((o,t)=>{let r="";n.createReadStream(e,{highWaterMark:1048576,encoding:"utf8"}).on("error",(e=>t(e))).on("data",(e=>r+=e)).on("end",(()=>{o(r)}))}))}async function s(e,o,t){return await new Promise(((t,r)=>{n.createWriteStream(e,{encoding:"utf8",highWaterMark:1048576}).on("error",(e=>r(e))).on("finish",(()=>t())).on("open",(function(){this.write(o),this.end()}))}))}function i(n={port:5173,baseUrl:"/api",proxyUrl:"http://192.168.0.193:9999",pluginEnvHelper:!0,pluginScanRoutes:!1,pluginElementPlus:!0}){return{name:"vite-plugin-config-helper",async configResolved(i){if(await r(o.resolve(process.cwd(),"./build/config/index.ts")))return;if(await r(o.resolve(process.cwd(),"./build/config/plugins.ts")))return;e.mkdirSync(process.cwd()+"/build/config",{recursive:!0});const p=await r(o.resolve(process.cwd(),"./.env")),c=["VITE_APP_BASE_URL","VITE_APP_PROXY_URL","VITE_APP_PORT"];if(!(c[0]in i.env))if(p){let e=await l(o.resolve(process.cwd(),"./.env"));e+=t.EOL+`VITE_APP_BASE_URL=${n.baseUrl}`,await s(o.resolve(process.cwd(),"./.env"),e)}else await s(o.resolve(process.cwd(),"./.env"),`VITE_APP_BASE_URL=${n.baseUrl}`);if(!(c[1]in i.env))if(await r(o.resolve(process.cwd(),"./.env"))){let e=await l(o.resolve(process.cwd(),"./.env"));e+=t.EOL+`VITE_APP_PROXY_URL=${n.proxyUrl}`,await s(o.resolve(process.cwd(),"./.env"),e)}else await s(o.resolve(process.cwd(),"./.env"),`VITE_APP_PROXY_URL=${n.proxyUrl}`);if(!(c[2]in i.env))if(await r(o.resolve(process.cwd(),"./.env"))){let e=await l(o.resolve(process.cwd(),"./.env"));e+=t.EOL+`VITE_APP_PORT=${n.port}`,await s(o.resolve(process.cwd(),"./.env"),e)}else await s(o.resolve(process.cwd(),"./.env"),`VITE_APP_PORT=${n.port}`);if(!await r(o.resolve(process.cwd(),"./build/config/plugins.ts"))){const e="import type { PluginsOption } from 'vite'\nimport vue from '@vitejs/plugin-vue'\nimport vueJsx from '@vitejs/plugin-vue-jsx'\nimport vueDevTools from 'vite-plugin-vue-devtools'"+t.EOL+(n.pluginScanRoutes?"import scanRoutes from 'vite-plugin-scan-routes'":"")+t.EOL+(n.pluginEnvHelper?"import { envHelper } from 'vite-plugin-env-helper'":"")+t.EOL+t.EOL+t.EOL+"export function createPlugins(): PluginsOption {\n const vitePlugins: PluginsOption = [\n vue(),\n vueJsx(),\n vueDevTools()"+(n.pluginScanRoutes?","+t.EOL+" scanRoutes()":"")+(n.pluginEnvHelper?","+t.EOL+" envHelper()"+t.EOL:"")+t.EOL+" ]\n return vitePlugins\n}\n";await s(o.resolve(process.cwd(),"./build/config/plugins.ts"),e)}if(n.pluginElementPlus){if(e.mkdirSync(process.cwd()+"/src/components",{recursive:!0}),e.mkdirSync(process.cwd()+"/src/types",{recursive:!0}),!await r(o.resolve(process.cwd(),"./build/config/ep.ts"))){const e="import type { PluginsOption } from 'vite'\nimport AutoImport from 'unplugin-auto-import/vite'\nimport Components from 'unplugin-vue-components/vite'\nimport ElementPlus from 'unplugin-element-plus/vite'\nimport { ElementPlusResolver } from 'unplugin-vue-components/resolvers'"+t.EOL+t.EOL+"export function createElementPlusPlugins(): PluginsOption {\n const vitePlugins: PluginsOption = [\n AutoImport({\n dts: 'src/types/auto-imports.d.ts',\n imports: ['vue'],\n resolvers: [\n ElementPlusResolver({\n importStyle: 'css' \n })\n ]\n }),\n Components({\n dts: 'src/types/components.d.ts',\n dirs: [ 'src/components' ],\n resolvers: [\n ElementPlusResolver({\n importStyle: 'css' \n })\n ]\n }),\n ElementPlus({\n useSource: false\n })"+t.EOL+" ]\n return vitePlugins\n}\n";await s(o.resolve(process.cwd(),"./build/config/ep.ts"),e)}const n="import type {\n AutocompleteProps,\n CascaderProps,\n CheckboxGroupProps,\n CheckboxProps,\n ColorPickerProps,\n DatePickerProps,\n InputNumberProps,\n InputProps,\n InputTagProps,\n MentionProps,\n OptionProps,\n RadioButtonProps,\n RadioGroupProps,\n RadioProps,\n RateProps,\n SelectProps,\n SelectV2Props,\n SliderProps,\n SwitchProps,\n TimePickerDefaultProps,\n TimeSelectProps,\n TransferProps,\n TreeProps,\n UploadProps,\n} from 'element-plus'\n\nexport {}\ndeclare global {\n /** ElDialog 主要属性 */\n type EpDialogAttrs = {\n visible: boolean\n title?: string\n width?: string\n height?: string\n center?: boolean\n showClose?: boolean\n closeOnClickModal?: boolean\n closeOnPressEscape?: boolean\n }\n /** ElementPlus 封装的动态表单组件的名称类型 (25个) */\n type FormName =\n | 'ElAutocomplete'\n | 'ElCascader'\n | 'ElCheckboxGroup'\n | 'ElCheckbox'\n | 'ElCheckboxButton'\n | 'ElColorPicker'\n | 'ElDatePicker'\n | 'ElTimePicker'\n | 'ElInput'\n | 'ElInputNumber'\n | 'ElInputTag'\n | 'ElMention'\n | 'ElRadioGroup'\n | 'ElRadio'\n | 'ElRadioButton'\n | 'ElRate'\n | 'ElSelect'\n | 'ElOption'\n | 'ElSelectV2'\n | 'ElSlider'\n | 'ElSwitch'\n | 'ElTimeSelect'\n | 'ElTransfer'\n | 'ElTreeSelect'\n | 'ElUpload'\n /** ElementPlus 封装的动态表单组件的属性类型 (25个) */\n type FormNameProps = {\n ElAutocomplete: AutocompleteProps\n ElCascader: CascaderProps\n ElCheckboxGroup: CheckboxGroupProps\n ElCheckbox: CheckboxProps\n ElCheckboxButton: CheckboxProps\n ElColorPicker: ColorPickerProps\n ElDatePicker: DatePickerProps\n ElTimePicker: TimePickerDefaultProps\n ElInput: InputProps\n ElInputNumber: InputNumberProps\n ElInputTag: InputTagProps\n ElMention: MentionProps\n ElRadioGroup: RadioGroupProps\n ElRadio: RadioProps\n ElRadioButton: RadioButtonProps\n ElRate: RateProps\n ElSelect: SelectProps\n ElOption: OptionProps\n ElSelectV2: SelectV2Props\n ElSlider: SliderProps\n ElSwitch: SwitchProps\n ElTimeSelect: TimeSelectProps\n ElTransfer: TransferProps\n ElTreeSelect: TreeProps & SelectProps\n ElUpload: UploadProps\n }\n /** ElementPlus 封装动态表单组件类型 */\n type FormBuilderItem<T> = {\n type: FormName\n label?: string\n prop?: keyof T\n span?: number\n props?: FormNameProps[FormName]\n value?: string\n }\n}\n";await s(o.resolve(process.cwd(),"./src/types/ep.d.ts"),n);const l='<script lang="ts">\nimport { defineComponent } from \'vue\'\n\nexport type FormBuilderInstance = InstanceType<ReturnType<typeof defineComponent>>\n<\/script>\n<script setup lang="ts" generic="T extends Record<string, unknown>">\nimport {\n ElAutocomplete,\n ElCascader,\n ElCheckboxGroup,\n ElCheckbox,\n ElCheckboxButton,\n ElColorPicker,\n ElDatePicker,\n ElTimePicker,\n ElInput,\n ElInputNumber,\n ElInputTag,\n ElMention,\n ElRadioGroup,\n ElRadio,\n ElRadioButton,\n ElRate,\n ElSelect,\n ElOption,\n ElSelectV2,\n ElSlider,\n ElSwitch,\n ElTimeSelect,\n ElTransfer,\n ElTreeSelect,\n ElUpload,\n type FormInstance,\n type FormRules,\n type FormValidateCallback,\n} from \'element-plus\'\nimport { useTemplateRef } from \'vue\'\n\ndefineProps<{\n items: FormBuilderItem<T>[]\n rules: FormRules<T>\n}>()\n\nconst form = defineModel<T>({\n required: true,\n default: {} as T,\n})\n\nconst instance = useTemplateRef<FormInstance>(\'formRef\')\n\nconst compMaps = {\n ElAutocomplete,\n ElCascader,\n ElCheckboxGroup,\n ElCheckbox,\n ElCheckboxButton,\n ElColorPicker,\n ElDatePicker,\n ElTimePicker,\n ElInput,\n ElInputNumber,\n ElInputTag,\n ElMention,\n ElRadioGroup,\n ElRadio,\n ElRadioButton,\n ElRate,\n ElSelect,\n ElOption,\n ElSelectV2,\n ElSlider,\n ElSwitch,\n ElTimeSelect,\n ElTransfer,\n ElTreeSelect,\n ElUpload,\n}\n\nfunction getComponent(type: unknown) {\n if (typeof type === \'string\') {\n return compMaps[type as FormName]\n }\n return type\n}\n\nfunction validate(callback?: FormValidateCallback) {\n instance.value?.validate(callback)\n}\n\nfunction resetFields() {\n instance.value?.resetFields()\n}\n\ndefineExpose({\n validate,\n resetFields,\n})\n<\/script>\n\n<template>\n <el-form :model="form" :rules="rules" label-width="auto" ref="formRef">\n <el-row>\n <el-col\n :xs="item.span || 24"\n :sm="item.span || 24"\n :md="item.span || 24"\n :lg="item.span || 24"\n :xl="item.span || 24"\n v-for="item in items"\n :key="item.prop"\n >\n <el-form-item style="padding: 0 30px;" :prop="item.prop as string" :label="item.label">\n <component :is="getComponent(item.type)" v-bind="item.props" v-model="form[item.prop!]">\n </component>\n </el-form-item>\n </el-col>\n </el-row>\n </el-form>\n</template>\n\n<style scoped></style>\n';await s(o.resolve(process.cwd(),"./src/components/FormBuilder.vue"),l)}if(!await r(o.resolve(process.cwd(),"./build/config/index.ts"))){const e="import {"+t.EOL+" defineConfig as defineAppConfig,"+t.EOL+" mergeConfig,"+t.EOL+" loadEnv,"+t.EOL+" type UserConfig,"+t.EOL+" type ConfigEnv,"+t.EOL+" type PluginOption"+t.EOL+"} from 'vite'"+t.EOL+"import { createPlugins } from './plugins'"+(n.pluginElementPlus?t.EOL+"import { createElementPlusPlugins } from './ep'"+t.EOL:t.EOL)+"import { fileURLToPath, URL } from 'node:url'"+t.EOL+t.EOL+"interface ConfigOptions {"+t.EOL+" overrides?: UserConfig"+t.EOL+"}"+t.EOL+t.EOL+"export function defineConfig<T extends ConfigOptions>(options: T) {"+t.EOL+" const { overrides } = options"+t.EOL+" return defineAppConfig("+t.EOL+" (config: ConfigEnv): UserConfig => {"+t.EOL+" const prefixes = ['VITE_']"+t.EOL+" const env = loadEnv(config.mode, process.cwd(), prefixes)"+t.EOL+" const commonConfig: UserConfig = {"+t.EOL+" envPrefix: prefixes,"+t.EOL+" root: process.cwd(),"+t.EOL+" base: '/',"+t.EOL+" publicDir: 'public',"+t.EOL+" server: {"+t.EOL+" host: '0.0.0.0',"+t.EOL+" port: Number(env.VITE_APP_PORT),"+t.EOL+" proxy: {"+t.EOL+" [env.VITE_APP_BASE_URL]: {"+t.EOL+" target: env.VITE_APP_PROXY_URL,"+t.EOL+" changeOrigin: true,"+t.EOL+" rewrite: (path) => path.replace(new RegExp(`^${env.VITE_APP_BASE_URL}`), '')"+t.EOL+" }"+t.EOL+" }"+t.EOL+" },"+t.EOL+" resolve: {"+t.EOL+" alias: {"+t.EOL+" '@': fileURLToPath(new URL('../../src', import.meta.url))"+t.EOL+" }"+t.EOL+" },"+t.EOL+" plugins: ["+t.EOL+" ...createPlugins()"+(n.pluginElementPlus?","+t.EOL+" ...createElementPlusPlugins()"+t.EOL:t.EOL)+" ]"+t.EOL+" }"+t.EOL+" return overrides ? mergeConfig(commonConfig, overrides) : commonConfig"+t.EOL+" }"+t.EOL+" )"+t.EOL+"}"+t.EOL;await s(o.resolve(process.cwd(),"./build/config/index.ts"),e)}const a="import { defineConfig } from './build/config'"+t.EOL+t.EOL+"export default defineConfig({"+t.EOL+" overrides: {"+t.EOL+t.EOL+" }"+t.EOL+"})"+t.EOL;await s(o.resolve(process.cwd(),"./vite.config.ts"),a);const u=await l(o.resolve(process.cwd(),"./package.json"));let E="";n.pluginEnvHelper&&n.pluginScanRoutes?E=`"vite-plugin-env-helper": "^1.1.0",${t.EOL} "vite-plugin-scan-routes": "1.0.2",${t.EOL}`:n.pluginScanRoutes?E=`"vite-plugin-scan-routes": "1.0.2",${t.EOL}`:n.pluginEnvHelper&&(E=`"vite-plugin-env-helper": "^1.1.0",${t.EOL}`),n.pluginElementPlus&&(E+=` "unplugin-auto-import": "^20.0.0",${t.EOL} "unplugin-vue-components": "^29.0.0",${t.EOL} "unplugin-element-plus": "^0.10.0",${t.EOL}`);const m=u.replace(/"vite-plugin-config-helper":\s*"[^"]*"\s*,?\n?/g,E),d=n.pluginElementPlus?m.replace(/"dependencies": \s*\{/g,'"dependencies": {'+t.EOL+' "element-plus": "^2.10.7",'):m;await s(o.resolve(process.cwd(),"./package.json"),d)}}}export{i as configHelper};
1
+ import*as e from"node:fs";import n from"node:fs";import*as o from"node:path";import*as r from"node:os";async function t(e){try{return await n.promises.access(e),!0}catch{return!1}}async function l(e,o){return await new Promise(((o,r)=>{let t="";n.createReadStream(e,{highWaterMark:1048576,encoding:"utf8"}).on("error",(e=>r(e))).on("data",(e=>t+=e)).on("end",(()=>{o(t)}))}))}async function i(e,o,r){return await new Promise(((r,t)=>{n.createWriteStream(e,{encoding:"utf8",highWaterMark:1048576}).on("error",(e=>t(e))).on("finish",(()=>r())).on("open",(function(){this.write(o),this.end()}))}))}function s(n={port:5173,baseUrl:"/api",proxyUrl:"http://192.168.0.193:9999",pluginEnvHelper:!0,pluginScanRoutes:!1,pluginElementPlus:!0}){return{name:"vite-plugin-config-helper",async configResolved(s){if(await t(o.resolve(process.cwd(),"./build/config/index.ts")))return;if(await t(o.resolve(process.cwd(),"./build/config/plugins.ts")))return;e.mkdirSync(process.cwd()+"/build/config",{recursive:!0});const p=await t(o.resolve(process.cwd(),"./.env")),c=["VITE_APP_BASE_URL","VITE_APP_PROXY_URL","VITE_APP_PORT"];if(!(c[0]in s.env))if(p){let e=await l(o.resolve(process.cwd(),"./.env"));e+=r.EOL+`VITE_APP_BASE_URL=${n.baseUrl}`,await i(o.resolve(process.cwd(),"./.env"),e)}else await i(o.resolve(process.cwd(),"./.env"),`VITE_APP_BASE_URL=${n.baseUrl}`);if(!(c[1]in s.env))if(await t(o.resolve(process.cwd(),"./.env"))){let e=await l(o.resolve(process.cwd(),"./.env"));e+=r.EOL+`VITE_APP_PROXY_URL=${n.proxyUrl}`,await i(o.resolve(process.cwd(),"./.env"),e)}else await i(o.resolve(process.cwd(),"./.env"),`VITE_APP_PROXY_URL=${n.proxyUrl}`);if(!(c[2]in s.env))if(await t(o.resolve(process.cwd(),"./.env"))){let e=await l(o.resolve(process.cwd(),"./.env"));e+=r.EOL+`VITE_APP_PORT=${n.port}`,await i(o.resolve(process.cwd(),"./.env"),e)}else await i(o.resolve(process.cwd(),"./.env"),`VITE_APP_PORT=${n.port}`);if(!await t(o.resolve(process.cwd(),"./build/config/plugins.ts"))){const e="import type { PluginOption } from 'vite'\nimport vue from '@vitejs/plugin-vue'\nimport vueJsx from '@vitejs/plugin-vue-jsx'\nimport vueDevTools from 'vite-plugin-vue-devtools'"+r.EOL+(n.pluginScanRoutes?"import scanRoutes from 'vite-plugin-scan-routes'":"")+r.EOL+(n.pluginEnvHelper?"import { envHelper } from 'vite-plugin-env-helper'":"")+r.EOL+r.EOL+r.EOL+"export function createPlugins(): PluginOption[] {\n const vitePlugins: PluginOption[] = [\n vue(),\n vueJsx(),\n vueDevTools()"+(n.pluginScanRoutes?","+r.EOL+" scanRoutes()":"")+(n.pluginEnvHelper?","+r.EOL+" envHelper()"+r.EOL:"")+r.EOL+" ]\n return vitePlugins\n}\n";await i(o.resolve(process.cwd(),"./build/config/plugins.ts"),e)}if(n.pluginElementPlus){if(e.mkdirSync(process.cwd()+"/src/components",{recursive:!0}),e.mkdirSync(process.cwd()+"/src/hooks",{recursive:!0}),e.mkdirSync(process.cwd()+"/src/types",{recursive:!0}),!await t(o.resolve(process.cwd(),"./build/config/ep.ts"))){const e="import type { PluginOption } from 'vite'\nimport AutoImport from 'unplugin-auto-import/vite'\nimport Components from 'unplugin-vue-components/vite'\nimport ElementPlus from 'unplugin-element-plus/vite'\nimport { ElementPlusResolver } from 'unplugin-vue-components/resolvers'"+r.EOL+r.EOL+"export function createElementPlusPlugins(): PluginOption[] {\n const vitePlugins: PluginOption[] = [\n AutoImport({\n dts: 'src/types/auto-imports.d.ts',\n imports: ['vue'],\n resolvers: [\n ElementPlusResolver({\n importStyle: 'css' \n })\n ]\n }),\n Components({\n dts: 'src/types/components.d.ts',\n dirs: [ 'src/components' ],\n resolvers: [\n ElementPlusResolver({\n importStyle: 'css' \n })\n ]\n }),\n ElementPlus({\n useSource: false\n })"+r.EOL+" ]\n return vitePlugins\n}\n";await i(o.resolve(process.cwd(),"./build/config/ep.ts"),e)}const n="import type {\n AutocompleteProps,\n CascaderProps,\n CheckboxGroupProps,\n CheckboxProps,\n ColorPickerProps,\n DatePickerProps,\n InputNumberProps,\n InputProps,\n InputTagProps,\n MentionProps,\n OptionProps,\n RadioButtonProps,\n RadioGroupProps,\n RadioProps,\n RateProps,\n SelectProps,\n SelectV2Props,\n SliderProps,\n SwitchProps,\n TimePickerDefaultProps,\n TimeSelectProps,\n TransferProps,\n TreeProps,\n UploadProps,\n} from 'element-plus'\n\nexport {}\ndeclare global {\n /** ElDialog 主要属性 */\n type EpDialogAttrs = {\n visible: boolean\n title?: string\n width?: string\n height?: string\n center?: boolean\n showClose?: boolean\n closeOnClickModal?: boolean\n closeOnPressEscape?: boolean\n }\n /** ElementPlus 封装的动态表单组件的名称类型 (25个) */\n type FormName =\n | 'ElAutocomplete'\n | 'ElCascader'\n | 'ElCheckboxGroup'\n | 'ElCheckbox'\n | 'ElCheckboxButton'\n | 'ElColorPicker'\n | 'ElDatePicker'\n | 'ElTimePicker'\n | 'ElInput'\n | 'ElInputNumber'\n | 'ElInputTag'\n | 'ElMention'\n | 'ElRadioGroup'\n | 'ElRadio'\n | 'ElRadioButton'\n | 'ElRate'\n | 'ElSelect'\n | 'ElOption'\n | 'ElSelectV2'\n | 'ElSlider'\n | 'ElSwitch'\n | 'ElTimeSelect'\n | 'ElTransfer'\n | 'ElTreeSelect'\n | 'ElUpload'\n /** ElementPlus 封装的动态表单组件的属性类型 (25个) */\n type FormNameProps = {\n ElAutocomplete: AutocompleteProps\n ElCascader: CascaderProps\n ElCheckboxGroup: CheckboxGroupProps\n ElCheckbox: CheckboxProps\n ElCheckboxButton: CheckboxProps\n ElColorPicker: ColorPickerProps\n ElDatePicker: DatePickerProps\n ElTimePicker: TimePickerDefaultProps\n ElInput: InputProps\n ElInputNumber: InputNumberProps\n ElInputTag: InputTagProps\n ElMention: MentionProps\n ElRadioGroup: RadioGroupProps\n ElRadio: RadioProps\n ElRadioButton: RadioButtonProps\n ElRate: RateProps\n ElSelect: SelectProps\n ElOption: OptionProps\n ElSelectV2: SelectV2Props\n ElSlider: SliderProps\n ElSwitch: SwitchProps\n ElTimeSelect: TimeSelectProps\n ElTransfer: TransferProps\n ElTreeSelect: TreeProps & SelectProps\n ElUpload: UploadProps\n }\n /** ElementPlus 封装动态表单组件类型 */\n type FormBuilderItem<T> = {\n type: FormName\n label?: string\n prop?: keyof T\n span?: number\n props?: FormNameProps[FormName]\n value?: string\n }\n}\n";await i(o.resolve(process.cwd(),"./src/types/ep.d.ts"),n);const l='<script lang="ts">\nimport { defineComponent } from \'vue\'\n\nexport type FormBuilderInstance = InstanceType<ReturnType<typeof defineComponent>>\n<\/script>\n<script setup lang="ts" generic="T extends Record<string, unknown>">\nimport {\n ElAutocomplete,\n ElCascader,\n ElCheckboxGroup,\n ElCheckbox,\n ElCheckboxButton,\n ElColorPicker,\n ElDatePicker,\n ElTimePicker,\n ElInput,\n ElInputNumber,\n ElInputTag,\n ElMention,\n ElRadioGroup,\n ElRadio,\n ElRadioButton,\n ElRate,\n ElSelect,\n ElOption,\n ElSelectV2,\n ElSlider,\n ElSwitch,\n ElTimeSelect,\n ElTransfer,\n ElTreeSelect,\n ElUpload,\n type FormInstance,\n type FormRules,\n type FormValidateCallback,\n} from \'element-plus\'\nimport { useTemplateRef } from \'vue\'\n\ndefineProps<{\n items: FormBuilderItem<T>[]\n rules: FormRules<T>\n}>()\n\nconst form = defineModel<T>({\n required: true,\n default: {} as T,\n})\n\nconst instance = useTemplateRef<FormInstance>(\'formRef\')\n\nconst compMaps = {\n ElAutocomplete,\n ElCascader,\n ElCheckboxGroup,\n ElCheckbox,\n ElCheckboxButton,\n ElColorPicker,\n ElDatePicker,\n ElTimePicker,\n ElInput,\n ElInputNumber,\n ElInputTag,\n ElMention,\n ElRadioGroup,\n ElRadio,\n ElRadioButton,\n ElRate,\n ElSelect,\n ElOption,\n ElSelectV2,\n ElSlider,\n ElSwitch,\n ElTimeSelect,\n ElTransfer,\n ElTreeSelect,\n ElUpload,\n}\n\nfunction getComponent(type: unknown) {\n if (typeof type === \'string\') {\n return compMaps[type as FormName]\n }\n return type\n}\n\nfunction validate(callback?: FormValidateCallback) {\n instance.value?.validate(callback)\n}\n\nfunction resetFields() {\n instance.value?.resetFields()\n}\n\ndefineExpose({\n validate,\n resetFields,\n})\n<\/script>\n\n<template>\n <el-form :model="form" :rules="rules" label-width="auto" ref="formRef">\n <el-row>\n <el-col\n :xs="item.span || 24"\n :sm="item.span || 24"\n :md="item.span || 24"\n :lg="item.span || 24"\n :xl="item.span || 24"\n v-for="item in items"\n :key="item.prop"\n >\n <el-form-item style="padding: 0 30px;" :prop="item.prop as string" :label="item.label">\n <component :is="getComponent(item.type)" v-bind="item.props" v-model="form[item.prop!]">\n </component>\n </el-form-item>\n </el-col>\n </el-row>\n </el-form>\n</template>\n\n<style scoped></style>\n';await i(o.resolve(process.cwd(),"./src/components/FormBuilder.vue"),l)}if(!await t(o.resolve(process.cwd(),"./src/hooks/color.ts"))){const e="import { onBeforeMount } from 'vue'\n\nfunction lightColor(colorWithHash: string, percentFrom1To100: number) {\n const rgb = [1, 3, 5].map((diff) => parseInt(colorWithHash.substring(diff, diff + 2), 16))\n const lightRgb = rgb.map((value) =>\n parseInt(String(value + (255 - value) * (percentFrom1To100 / 100))),\n )\n return '#' + lightRgb.map((v) => v.toString(16).padStart(2, '0')).join('')\n}\n\nfunction darkColor(colorWithHash: string, percentFrom1To100: number) {\n const rgb = [1, 3, 5].map((diff) => parseInt(colorWithHash.substring(diff, diff + 2), 16))\n const darkRgb = rgb.map((value) => parseInt(String(value * (1 - percentFrom1To100 / 100))))\n return '#' + darkRgb.map((v) => v.toString(16).padStart(2, '0')).join('')\n}\n\nfunction updateThemeColor(colorWithHash: string = '#409eff') {\n const colorRegex = /^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/\n if (!colorRegex.test(colorWithHash)) {\n console.error('color must be a hex string')\n return\n }\n if (colorWithHash.length === 4) {\n colorWithHash = ['#']\n .concat(\n colorWithHash\n .slice(1)\n .split('')\n .map((item) => item + item),\n )\n .join('')\n }\n const el = document.documentElement\n const colorNames = [\n '--el-color-primary',\n '--el-color-primary-light-3',\n '--el-color-primary-light-5',\n '--el-color-primary-light-7',\n '--el-color-primary-light-8',\n '--el-color-primary-light-9',\n '--el-color-primary-dark-2',\n ]\n for (const item of colorNames) {\n const tail = item.slice(-1)\n if (tail === 'y') {\n el.style.setProperty(item, colorWithHash)\n } else if (tail === '2') {\n el.style.setProperty(item, darkColor(colorWithHash, Number(tail + '0')))\n } else {\n el.style.setProperty(item, lightColor(colorWithHash, Number(tail + '0')))\n }\n }\n}\n\nexport function useElementPlusTheme(colorWithHash?: string) {\n onBeforeMount(() => {\n updateThemeColor(colorWithHash)\n })\n return { updateThemeColor }\n}\n";await i(o.resolve(process.cwd(),"./src/hooks/color.ts"),e)}if(!await t(o.resolve(process.cwd(),"./build/config/index.ts"))){const e="import {"+r.EOL+" defineConfig as defineAppConfig,"+r.EOL+" mergeConfig,"+r.EOL+" loadEnv,"+r.EOL+" type UserConfig,"+r.EOL+" type ConfigEnv,"+r.EOL+" type PluginOption"+r.EOL+"} from 'vite'"+r.EOL+"import { createPlugins } from './plugins'"+(n.pluginElementPlus?r.EOL+"import { createElementPlusPlugins } from './ep'"+r.EOL:r.EOL)+"import { fileURLToPath, URL } from 'node:url'"+r.EOL+r.EOL+"interface ConfigOptions {"+r.EOL+" overrides?: UserConfig"+r.EOL+"}"+r.EOL+r.EOL+"export function defineConfig<T extends ConfigOptions>(options: T) {"+r.EOL+" const { overrides } = options"+r.EOL+" return defineAppConfig("+r.EOL+" (config: ConfigEnv): UserConfig => {"+r.EOL+" const prefixes = ['VITE_']"+r.EOL+" const env = loadEnv(config.mode, process.cwd(), prefixes)"+r.EOL+" const commonConfig: UserConfig = {"+r.EOL+" envPrefix: prefixes,"+r.EOL+" root: process.cwd(),"+r.EOL+" base: '/',"+r.EOL+" publicDir: 'public',"+r.EOL+" server: {"+r.EOL+" host: '0.0.0.0',"+r.EOL+" port: Number(env.VITE_APP_PORT),"+r.EOL+" proxy: {"+r.EOL+" [env.VITE_APP_BASE_URL]: {"+r.EOL+" target: env.VITE_APP_PROXY_URL,"+r.EOL+" changeOrigin: true,"+r.EOL+" rewrite: (path) => path.replace(new RegExp(`^${env.VITE_APP_BASE_URL}`), '')"+r.EOL+" }"+r.EOL+" }"+r.EOL+" },"+r.EOL+" resolve: {"+r.EOL+" alias: {"+r.EOL+" '@': fileURLToPath(new URL('../../src', import.meta.url))"+r.EOL+" }"+r.EOL+" },"+r.EOL+" plugins: ["+r.EOL+" ...createPlugins()"+(n.pluginElementPlus?","+r.EOL+" ...createElementPlusPlugins()"+r.EOL:r.EOL)+" ]"+r.EOL+" }"+r.EOL+" return overrides ? mergeConfig(commonConfig, overrides) : commonConfig"+r.EOL+" }"+r.EOL+" )"+r.EOL+"}"+r.EOL;await i(o.resolve(process.cwd(),"./build/config/index.ts"),e)}const a="import { defineConfig } from './build/config'"+r.EOL+r.EOL+"export default defineConfig({"+r.EOL+" overrides: {"+r.EOL+r.EOL+" }"+r.EOL+"})"+r.EOL;await i(o.resolve(process.cwd(),"./vite.config.ts"),a);const u=await l(o.resolve(process.cwd(),"./package.json"));let m="";n.pluginEnvHelper&&n.pluginScanRoutes?m=`"vite-plugin-env-helper": "^1.1.0",${r.EOL} "vite-plugin-scan-routes": "1.0.2",${r.EOL}`:n.pluginScanRoutes?m=`"vite-plugin-scan-routes": "1.0.2",${r.EOL}`:n.pluginEnvHelper&&(m=`"vite-plugin-env-helper": "^1.1.0",${r.EOL}`),n.pluginElementPlus&&(m+=` "unplugin-auto-import": "^20.1.0",${r.EOL} "unplugin-vue-components": "^29.0.0",${r.EOL} "unplugin-element-plus": "^0.10.0",${r.EOL}`);const E=u.replace(/"vite-plugin-config-helper":\s*"[^"]*"\s*,?\n?/g,m),d=n.pluginElementPlus?E.replace(/"dependencies": \s*\{/g,'"dependencies": {'+r.EOL+' "element-plus": "^2.11.1",'):E;await i(o.resolve(process.cwd(),"./package.json"),d)}}}export{s as configHelper};
package/package.json CHANGED
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "name": "vite-plugin-config-helper",
3
- "version": "0.1.4",
3
+ "version": "0.1.6",
4
4
  "private": false,
5
- "description": "把 vite.config.ts 配置进行逻辑拆分,并整合一些常用插件,如 element-plus 自动导入组件样式配置的相关插件",
5
+ "description": "把 vite.config.ts 配置进行逻辑拆分,并整合一些常用插件或代码,如 element-plus 自动导入组件样式配置的相关插件",
6
6
  "keywords": [
7
7
  "typescript",
8
8
  "vite",