fast-vite-plugins 1.0.11 → 1.0.12

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
@@ -35,8 +35,8 @@ pnpm install fast-vite-plugins -D
35
35
  In `vite.config.ts`
36
36
 
37
37
  ```typescript
38
+ import { buildSvgIcon, cdnImport, tsxComponentAutoImport, versionUpdatePlugin, vueComponentAutoImport } from "fast-vite-plugins";
38
39
  import { defineConfig } from "vite";
39
- import { buildSvgIcon, cdnImport, tsxComponentAutoImport, vueComponentAutoImport, versionUpdatePlugin } from "fast-vite-plugins";
40
40
 
41
41
  export default defineConfig({
42
42
  plugins: [
package/README.zh.md CHANGED
@@ -35,8 +35,8 @@ pnpm install fast-vite-plugins -D
35
35
  在 `vite.config.ts`
36
36
 
37
37
  ```typescript
38
+ import { buildSvgIcon, cdnImport, tsxComponentAutoImport, versionUpdatePlugin, vueComponentAutoImport } from "fast-vite-plugins";
38
39
  import { defineConfig } from "vite";
39
- import { buildSvgIcon, cdnImport, tsxComponentAutoImport, vueComponentAutoImport, versionUpdatePlugin } from "fast-vite-plugins";
40
40
 
41
41
  export default defineConfig({
42
42
  plugins: [
@@ -1 +1 @@
1
- {"version":3,"sources":["../../packages/index.ts","../../packages/buildSvgIcon/index.ts","../../packages/cdnImport/index.ts","../../packages/componentAutoImport/index.ts","../../packages/versionUpdate/index.ts"],"sourcesContent":["export * from \"./buildSvgIcon\";\nexport * from \"./cdnImport\";\nexport * from \"./cdnImport/type\";\nexport * from \"./componentAutoImport\";\nexport * from \"./componentAutoImport/type\";\nexport * from \"./versionUpdate\";\n","import fs from \"fs\";\nimport path from \"path\";\nimport type { Plugin, ResolvedConfig } from \"vite\";\n\n/**\n * 查找 svg 文件\n */\n\nconst findSvgFile = (dir: string): { iconName: string; componentName: string; iconContent: string }[] => {\n\t// svg 内容\n\tconst svgContents: { iconName: string; componentName: string; iconContent: string }[] = [];\n\t// 获取当前目录下的文件\n\tconst svgFiles = fs.readdirSync(dir, {\n\t\twithFileTypes: true,\n\t});\n\n\tsvgFiles.forEach((file) => {\n\t\tif (file.isDirectory()) {\n\t\t\tsvgContents.push(...findSvgFile(path.join(dir, file.name)));\n\t\t} else {\n\t\t\tconst iconName = file.name.replace(\".svg\", \"\");\n\n\t\t\tconst svgContent = fs\n\t\t\t\t.readFileSync(path.join(dir, file.name), \"utf-8\")\n\t\t\t\t.replace(/<\\?xml.*?\\?>/, \"\")\n\t\t\t\t.replace(/<!DOCTYPE svg.*?>/, \"\")\n\t\t\t\t// .replace(/(\\r)|(\\n)/g, \"\")\n\t\t\t\t.trimStart()\n\t\t\t\t.trimEnd()\n\t\t\t\t// .replace(/(fill=\"[^>+].*?\")/g, 'fill=\"\"')\n\t\t\t\t.replace(/<svg([^>+].*?)>/, (match, attr) => {\n\t\t\t\t\tconst viewBoxMatch = attr.match(/viewBox=\"[^\"]+\"/);\n\t\t\t\t\tconst widthMatch = attr.match(/width=\"(\\d+)\"/);\n\t\t\t\t\tconst heightMatch = attr.match(/height=\"(\\d+)\"/);\n\t\t\t\t\tlet width = 1024;\n\t\t\t\t\tlet height = 1024;\n\t\t\t\t\tif (widthMatch) {\n\t\t\t\t\t\twidth = widthMatch[0];\n\t\t\t\t\t}\n\t\t\t\t\tif (heightMatch) {\n\t\t\t\t\t\theight = heightMatch[0];\n\t\t\t\t\t}\n\t\t\t\t\tlet viewBoxContent = \"\";\n\t\t\t\t\tif (!viewBoxMatch) {\n\t\t\t\t\t\tviewBoxContent = `viewBox=\"0 0 ${width} ${height}\"`;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tviewBoxContent = viewBoxMatch[0];\n\t\t\t\t\t}\n\t\t\t\t\treturn `<svg xmlns=\"http://www.w3.org/2000/svg\" ${viewBoxContent}>`;\n\t\t\t\t});\n\n\t\t\tsvgContents.push({\n\t\t\t\t// iconName: iconName.charAt(0).toUpperCase() + iconName.slice(1),\n\t\t\t\ticonName,\n\t\t\t\tcomponentName: iconName.charAt(0).toUpperCase() + iconName.slice(1),\n\t\t\t\ticonContent: svgContent,\n\t\t\t});\n\t\t}\n\t});\n\n\treturn svgContents.sort((a, b) => {\n\t\tif (a.iconName < b.iconName) {\n\t\t\treturn -1;\n\t\t}\n\t\tif (a.iconName > b.iconName) {\n\t\t\treturn 1;\n\t\t}\n\t\treturn 0;\n\t});\n};\n\n/**\n * 写入 TSX 图标\n */\nconst writeTSXIcon = (componentName: string, iconDir: string, svgContent: string): void => {\n\tfs.mkdirSync(iconDir, { recursive: true });\n\n\tconst componentContent = `import { defineComponent } from \"vue\";\n\n/**\n * ${componentName} 图标组件\n */\nexport const ${componentName} = defineComponent({\n\tname: \"${componentName}\",\n\trender() {\n\t\treturn (\n${svgContent\n\t.split(\"\\n\")\n\t.map((line) => `\t\t\t${line}`)\n\t.join(\"\\n\")}\n\t\t);\n\t},\n});\n\nexport default ${componentName};\n`;\n\n\tfs.writeFileSync(path.join(iconDir, \"index.tsx\"), componentContent);\n};\n\n/**\n * 构建 svg 图标组件\n * @param dir svg 文件路径\n * @param writeDir 写入的文件路径 相对的即可\n */\nfunction buildSvgIcon(dir: string, writeDir: string): Plugin {\n\tif (!dir || !writeDir) return;\n\n\tlet config: ResolvedConfig;\n\n\treturn {\n\t\tname: \"fast-vite-plugin-build-svg-icon\",\n\t\tconfigResolved: (resolvedConfig: ResolvedConfig): void | Promise<void> => {\n\t\t\t// 存储最终解析的配置\n\t\t\tconfig = resolvedConfig;\n\t\t},\n\t\tbuildStart(): void | Promise<void> {\n\t\t\tconst svgFiles = findSvgFile(path.resolve(config.root, dir));\n\n\t\t\tconst iconsPath = path.resolve(config.root, writeDir);\n\t\t\tfs.mkdirSync(iconsPath, { recursive: true });\n\n\t\t\tlet iconImportContent = \"\";\n\t\t\tlet iconTypeContent = \"\";\n\t\t\tlet exportContent = \"\";\n\n\t\t\tsvgFiles.forEach((svg, idx) => {\n\t\t\t\twriteTSXIcon(svg.componentName, path.join(iconsPath, svg.iconName), svg.iconContent);\n\n\t\t\t\ticonImportContent += `import { ${svg.componentName} } from \"./${svg.iconName}\";\n`;\n\n\t\t\t\ticonTypeContent += `\t${svg.componentName},`;\n\n\t\t\t\texportContent += `export * from \"./${svg.iconName}\";\n`;\n\n\t\t\t\tif (idx + 1 < svgFiles.length) {\n\t\t\t\t\ticonTypeContent += \"\\n\";\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tfs.writeFileSync(\n\t\t\t\tpath.join(iconsPath, \"index.ts\"),\n\t\t\t\t`import type { DefineComponent } from \"vue\";\n${iconImportContent}\n${exportContent}\nexport default [\n${iconTypeContent}\n] as unknown as DefineComponent[];\n`\n\t\t\t);\n\t\t},\n\t};\n}\n\nexport { findSvgFile, writeTSXIcon, buildSvgIcon };\n","import fs from \"fs\";\nimport path from \"path\";\nimport externalGlobals from \"rollup-plugin-external-globals\";\nimport type { HtmlTagDescriptor, Plugin, UserConfig } from \"vite\";\nimport { viteExternalsPlugin } from \"vite-plugin-externals\";\nimport type { CdnImportOptions, Module } from \"./type\";\n\nconst isDev = process.env.NODE_ENV === \"development\";\n\n/**\n * get npm module version\n * @param name\n * @returns\n */\nfunction getModuleVersion(name: string): string {\n\tconst pwd = process.cwd();\n\tconst pkgFile = path.join(pwd, \"node_modules\", name, \"package.json\");\n\tif (fs.existsSync(pkgFile)) {\n\t\tconst pkgJson = JSON.parse(fs.readFileSync(pkgFile, \"utf8\"));\n\t\treturn pkgJson.version;\n\t}\n\n\treturn \"\";\n}\n\n/**\n * 是否完整的 url\n * @param path\n * @returns\n */\nfunction isFullPath(path: string): boolean {\n\treturn path.startsWith(\"http:\") || path.startsWith(\"https:\") || path.startsWith(\"//\") ? true : false;\n}\n\nfunction renderUrl(\n\turl: string,\n\tdata: {\n\t\tname: string;\n\t\tversion: string;\n\t\tpath: string;\n\t}\n): string {\n\tconst { path } = data;\n\tif (isFullPath(path)) {\n\t\turl = path;\n\t}\n\treturn url\n\t\t.replace(/\\{name\\}/g, data.name)\n\t\t.replace(/\\{version\\}/g, data.version)\n\t\t.replace(/\\{path\\}/g, path);\n}\n\nfunction getModuleInfo(module: Module, prodUrl: string): Module & { pathList?: string[]; cssList?: string[] } {\n\tprodUrl = module.prodUrl || prodUrl;\n\tconst v = module;\n\tconst version = module.version || getModuleVersion(v.name);\n\tlet pathList: string[] = [];\n\tif (!Array.isArray(v.path)) {\n\t\tpathList.push(v.path);\n\t} else {\n\t\tpathList = v.path;\n\t}\n\n\tconst data = {\n\t\t...v,\n\t\tversion,\n\t};\n\n\tpathList = pathList.map((p) => {\n\t\tif (!version && !isFullPath(p)) {\n\t\t\tthrow new Error(`modules: ${data.name} package.json file does not exist`);\n\t\t}\n\t\treturn renderUrl(prodUrl, {\n\t\t\tname: data.name,\n\t\t\tversion: data.version,\n\t\t\tpath: p,\n\t\t});\n\t});\n\n\tlet css = v.css || [];\n\tif (!Array.isArray(css) && css) {\n\t\tcss = [css];\n\t}\n\n\tconst cssList = !Array.isArray(css)\n\t\t? []\n\t\t: css.map((c) =>\n\t\t\t\trenderUrl(prodUrl, {\n\t\t\t\t\tname: data.name,\n\t\t\t\t\tversion: data.version,\n\t\t\t\t\tpath: c,\n\t\t\t\t})\n\t\t\t);\n\n\treturn {\n\t\t...v,\n\t\tversion,\n\t\tpathList,\n\t\tcssList,\n\t};\n}\n\n/**\n * CDN 导入\n * @param options\n * @returns\n */\nfunction cdnImport(options: CdnImportOptions): Plugin[] {\n\tconst {\n\t\tmodules = [],\n\t\tprodUrl = \"https://cdn.jsdelivr.net/npm/{name}@{version}/{path}\",\n\t\tenableInDevMode = false,\n\t\tgenerateCssLinkTag,\n\t\tgenerateScriptTag,\n\t} = options;\n\n\tlet isBuild = false;\n\n\tconst data = (Array.isArray(modules) ? modules : [modules])\n\t\t.map((v) => (typeof v === \"function\" ? v(prodUrl) : v))\n\t\t.map((v) => getModuleInfo(v, prodUrl));\n\n\tconst externalMap: {\n\t\t[name: string]: string;\n\t} = {};\n\n\tdata.forEach((v) => {\n\t\texternalMap[v.name] = v.var;\n\t\tif (Array.isArray(v.alias)) {\n\t\t\tv.alias.forEach((alias) => {\n\t\t\t\texternalMap[alias] = v.var;\n\t\t\t});\n\t\t}\n\t});\n\n\tconst plugins: Plugin[] = [\n\t\t{\n\t\t\tname: \"fast-vite-plugin-cdn-import\",\n\t\t\tenforce: \"pre\",\n\t\t\tconfig(_, { command }): UserConfig {\n\t\t\t\tisBuild = command === \"build\";\n\n\t\t\t\tconst userConfig: UserConfig = {\n\t\t\t\t\tbuild: {\n\t\t\t\t\t\trollupOptions: {\n\t\t\t\t\t\t\tplugins: [],\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t};\n\n\t\t\t\tif (isBuild) {\n\t\t\t\t\tuserConfig.build.rollupOptions.plugins = [externalGlobals(externalMap)];\n\t\t\t\t}\n\n\t\t\t\treturn userConfig;\n\t\t\t},\n\t\t\ttransformIndexHtml(html): string | HtmlTagDescriptor[] {\n\t\t\t\tif (!isBuild && !enableInDevMode) {\n\t\t\t\t\treturn html;\n\t\t\t\t}\n\n\t\t\t\tconst descriptors: HtmlTagDescriptor[] = [];\n\n\t\t\t\tdata.forEach((v) => {\n\t\t\t\t\tv.pathList.forEach((url) => {\n\t\t\t\t\t\tconst cusomize = generateScriptTag?.(v.name, url) || {};\n\t\t\t\t\t\tconst attrs = {\n\t\t\t\t\t\t\tsrc: url,\n\t\t\t\t\t\t\tcrossorigin: \"anonymous\",\n\t\t\t\t\t\t\t...(v?.attrs ?? {}),\n\t\t\t\t\t\t\t...cusomize.attrs,\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\tdescriptors.push({\n\t\t\t\t\t\t\ttag: \"script\",\n\t\t\t\t\t\t\tattrs,\n\t\t\t\t\t\t\t...cusomize,\n\t\t\t\t\t\t});\n\t\t\t\t\t});\n\t\t\t\t\tv.cssList.forEach((url) => {\n\t\t\t\t\t\tconst cusomize = generateCssLinkTag?.(v.name, url) || {};\n\t\t\t\t\t\tconst attrs = {\n\t\t\t\t\t\t\thref: url,\n\t\t\t\t\t\t\trel: \"stylesheet\",\n\t\t\t\t\t\t\tcrossorigin: \"anonymous\",\n\t\t\t\t\t\t\t...(v?.attrs ?? {}),\n\t\t\t\t\t\t\t...cusomize.attrs,\n\t\t\t\t\t\t};\n\t\t\t\t\t\tdescriptors.push({\n\t\t\t\t\t\t\ttag: \"link\",\n\t\t\t\t\t\t\tattrs,\n\t\t\t\t\t\t\t...cusomize,\n\t\t\t\t\t\t});\n\t\t\t\t\t});\n\t\t\t\t});\n\n\t\t\t\treturn descriptors;\n\t\t\t},\n\t\t},\n\t];\n\n\tif (isDev && enableInDevMode) {\n\t\tplugins.push(\n\t\t\tviteExternalsPlugin(externalMap, {\n\t\t\t\tenforce: \"pre\",\n\t\t\t})\n\t\t);\n\t}\n\n\treturn plugins;\n}\n\nexport { cdnImport };\n","import fs from \"fs\";\nimport path from \"path\";\nimport type { Plugin } from \"vite\";\nimport type { AutoImportOptions } from \"./type\";\n\n/**\n * TSX组件自动导入\n * @description 只会生成安装文件\n * @param options 组件文件夹路径\n */\nfunction tsxComponentAutoImport(options: string | AutoImportOptions): Plugin {\n\tif (!options) return;\n\n\treturn {\n\t\tname: \"fast-vite-plugin-tsx-component-auto-import\",\n\t\tbuildStart(): void | Promise<void> {\n\t\t\tconst dir = typeof options === \"string\" ? options : options.dir;\n\n\t\t\tconst defaultFormatter = (fName: string): string => {\n\t\t\t\treturn fName.charAt(0).toUpperCase() + fName.slice(1);\n\t\t\t};\n\n\t\t\tconst formatter = typeof options === \"string\" ? defaultFormatter : (options.formatter ?? defaultFormatter);\n\n\t\t\t// 获取所有文件夹名称\n\t\t\tconst cFiles = fs.readdirSync(dir, {\n\t\t\t\twithFileTypes: true,\n\t\t\t});\n\n\t\t\tif (cFiles?.length === 0) return;\n\n\t\t\t// 组件名称\n\t\t\tconst cNames = cFiles\n\t\t\t\t// 排除export文件\n\t\t\t\t.filter((f) => f.name !== \"index.ts\")\n\t\t\t\t.map((file) => {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tcomponentName: formatter(file.name),\n\t\t\t\t\t\tfileName: file.name,\n\t\t\t\t\t};\n\t\t\t\t})\n\t\t\t\t.sort((a, b) => {\n\t\t\t\t\tif (a.componentName < b.componentName) {\n\t\t\t\t\t\treturn -1;\n\t\t\t\t\t}\n\t\t\t\t\tif (a.componentName > b.componentName) {\n\t\t\t\t\t\treturn 1;\n\t\t\t\t\t}\n\t\t\t\t\treturn 0;\n\t\t\t\t});\n\n\t\t\tlet importContent = \"\";\n\t\t\tlet exportContent = \"\";\n\t\t\tlet typeContent = \"\";\n\n\t\t\tcNames.forEach(({ componentName, fileName }, idx) => {\n\t\t\t\timportContent += `import { ${componentName} } from \"./${fileName}\";\n`;\n\n\t\t\t\texportContent += `export * from \"./${fileName}\";\n`;\n\n\t\t\t\ttypeContent += `\t${componentName},`;\n\n\t\t\t\tif (idx + 1 < cNames.length) {\n\t\t\t\t\ttypeContent += \"\\n\";\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tfs.writeFileSync(\n\t\t\t\tpath.join(dir, \"index.ts\"),\n\t\t\t\t`import type { Plugin } from \"vue\";\n${importContent}\n${exportContent}\nexport default [\n${typeContent}\n] as Plugin[];\n`\n\t\t\t);\n\t\t},\n\t};\n}\n\n/**\n * VUE组件自动导入\n * @description 只会生成安装文件\n * @param options 组件文件夹路径\n */\nfunction vueComponentAutoImport(options: string | AutoImportOptions): Plugin {\n\tif (!options) return;\n\n\treturn {\n\t\tname: \"fast-vite-plugin-vue-component-auto-import\",\n\t\tbuildStart(): void | Promise<void> {\n\t\t\tconst dir = typeof options === \"string\" ? options : options.dir;\n\n\t\t\tconst defaultFormatter = (fName: string): string => {\n\t\t\t\treturn fName.charAt(0).toUpperCase() + fName.slice(1);\n\t\t\t};\n\n\t\t\tconst formatter = typeof options === \"string\" ? defaultFormatter : (options.formatter ?? defaultFormatter);\n\n\t\t\t// 获取所有文件夹名称\n\t\t\tconst cFiles = fs.readdirSync(dir, {\n\t\t\t\twithFileTypes: true,\n\t\t\t});\n\n\t\t\tif (cFiles?.length === 0) return;\n\n\t\t\t// 组件名称\n\t\t\tconst cNames = cFiles\n\t\t\t\t// 排除export文件\n\t\t\t\t.filter((f) => f.name !== \"index.ts\")\n\t\t\t\t.map((file) => {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tcomponentName: formatter(file.name),\n\t\t\t\t\t\tfileName: file.name,\n\t\t\t\t\t};\n\t\t\t\t})\n\t\t\t\t.sort((a, b) => {\n\t\t\t\t\tif (a.componentName < b.componentName) {\n\t\t\t\t\t\treturn -1;\n\t\t\t\t\t}\n\t\t\t\t\tif (a.componentName > b.componentName) {\n\t\t\t\t\t\treturn 1;\n\t\t\t\t\t}\n\t\t\t\t\treturn 0;\n\t\t\t\t});\n\n\t\t\tlet importContent = \"\";\n\t\t\tlet exportContent = \"\";\n\t\t\tlet typeContent = \"\";\n\n\t\t\tcNames.forEach(({ componentName, fileName }, idx) => {\n\t\t\t\timportContent += `import ${componentName} from \"./${fileName}/index.vue\";\n`;\n\n\t\t\t\texportContent += `export * from \"./${fileName}/index.vue\";\n`;\n\n\t\t\t\ttypeContent += `\t${componentName},`;\n\n\t\t\t\tif (idx + 1 < cNames.length) {\n\t\t\t\t\ttypeContent += \"\\n\";\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tfs.writeFileSync(\n\t\t\t\tpath.join(dir, \"index.ts\"),\n\t\t\t\t`import type { DefineComponent } from \"vue\";\n${importContent}\n${exportContent}\nexport default [\n${typeContent}\n] as unknown as DefineComponent[];\n`\n\t\t\t);\n\t\t},\n\t};\n}\n\nexport { tsxComponentAutoImport, vueComponentAutoImport };\n","import fs from \"fs\";\nimport path from \"path\";\nimport type { Plugin, ResolvedConfig } from \"vite\";\n\nfunction padZero(num: number, length = 2): string {\n\treturn num.toString().padStart(length, \"0\");\n}\n\nfunction formatDate(date: Date): string {\n\tconst year = date.getUTCFullYear();\n\tconst month = padZero(date.getUTCMonth() + 1);\n\tconst day = padZero(date.getUTCDate());\n\tconst hours = padZero(date.getUTCHours());\n\tconst minutes = padZero(date.getUTCMinutes());\n\tconst seconds = padZero(date.getUTCSeconds());\n\tconst milliseconds = padZero(date.getUTCMilliseconds(), 3);\n\n\treturn `Z ${year}-${month}-${day} ${hours}:${minutes}:${seconds}.${milliseconds}`;\n}\n\n/**\n * 版本更新插件\n * @param version 不要携带 'v',示例:1.0.0\n * @returns\n */\nfunction versionUpdatePlugin(version: string): Plugin {\n\tlet config: ResolvedConfig;\n\n\treturn {\n\t\tname: \"fast-vite-plugin-version-update\",\n\t\tconfigResolved: (resolvedConfig: ResolvedConfig): void | Promise<void> => {\n\t\t\t// 存储最终解析的配置\n\t\t\tconfig = resolvedConfig;\n\t\t},\n\t\tbuildStart(): void | Promise<void> {\n\t\t\tconst curDate = new Date();\n\n\t\t\tconst dateTime = formatDate(curDate);\n\n\t\t\tconst versionDir = config.publicDir;\n\t\t\tconst versionPath = path.join(versionDir, \"version.json\");\n\t\t\tif (!fs.existsSync(versionDir)) {\n\t\t\t\tfs.mkdirSync(versionDir);\n\t\t\t}\n\n\t\t\t// 写入版本信息文件\n\t\t\tconst content = JSON.stringify({ version: `v${version}`, dateTime }, null, 4);\n\t\t\tfs.writeFileSync(versionPath, content);\n\n\t\t\tconst pkgPath = path.join(config.base, \"package.json\");\n\t\t\tif (fs.existsSync(pkgPath)) {\n\t\t\t\tconst pkgJson = JSON.parse(fs.readFileSync(pkgPath, \"utf-8\"));\n\t\t\t\tpkgJson.version = version;\n\t\t\t\tfs.writeFileSync(pkgPath, JSON.stringify(pkgJson, null, 2), \"utf-8\");\n\t\t\t}\n\t\t},\n\t};\n}\n\nexport { versionUpdatePlugin };\n"],"mappings":"0jBAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,kBAAAE,EAAA,cAAAC,EAAA,gBAAAC,EAAA,2BAAAC,EAAA,wBAAAC,EAAA,2BAAAC,EAAA,iBAAAC,IAAA,eAAAC,EAAAT,GCAA,IAAAU,EAAe,mBACfC,EAAiB,qBAOXC,EAAeC,GAAoF,CAExG,IAAMC,EAAkF,CAAC,EAMzF,OAJiB,EAAAC,QAAG,YAAYF,EAAK,CACpC,cAAe,EAChB,CAAC,EAEQ,QAASG,GAAS,CAC1B,GAAIA,EAAK,YAAY,EACpBF,EAAY,KAAK,GAAGF,EAAY,EAAAK,QAAK,KAAKJ,EAAKG,EAAK,IAAI,CAAC,CAAC,MACpD,CACN,IAAME,EAAWF,EAAK,KAAK,QAAQ,OAAQ,EAAE,EAEvCG,EAAa,EAAAJ,QACjB,aAAa,EAAAE,QAAK,KAAKJ,EAAKG,EAAK,IAAI,EAAG,OAAO,EAC/C,QAAQ,eAAgB,EAAE,EAC1B,QAAQ,oBAAqB,EAAE,EAE/B,UAAU,EACV,QAAQ,EAER,QAAQ,kBAAmB,CAACI,EAAOC,IAAS,CAC5C,IAAMC,EAAeD,EAAK,MAAM,iBAAiB,EAC3CE,EAAaF,EAAK,MAAM,eAAe,EACvCG,EAAcH,EAAK,MAAM,gBAAgB,EAC3CI,EAAQ,KACRC,EAAS,KACTH,IACHE,EAAQF,EAAW,CAAC,GAEjBC,IACHE,EAASF,EAAY,CAAC,GAEvB,IAAIG,EAAiB,GACrB,OAAKL,EAGJK,EAAiBL,EAAa,CAAC,EAF/BK,EAAiB,gBAAgBF,CAAK,IAAIC,CAAM,IAI1C,2CAA2CC,CAAc,GACjE,CAAC,EAEFb,EAAY,KAAK,CAEhB,SAAAI,EACA,cAAeA,EAAS,OAAO,CAAC,EAAE,YAAY,EAAIA,EAAS,MAAM,CAAC,EAClE,YAAaC,CACd,CAAC,CACF,CACD,CAAC,EAEML,EAAY,KAAK,CAACc,EAAGC,IACvBD,EAAE,SAAWC,EAAE,SACX,GAEJD,EAAE,SAAWC,EAAE,SACX,EAED,CACP,CACF,EAKMC,EAAe,CAACC,EAAuBC,EAAiBb,IAA6B,CAC1F,EAAAJ,QAAG,UAAUiB,EAAS,CAAE,UAAW,EAAK,CAAC,EAEzC,IAAMC,EAAmB;AAAA;AAAA;AAAA,KAGrBF,CAAa;AAAA;AAAA,eAEHA,CAAa;AAAA,UAClBA,CAAa;AAAA;AAAA;AAAA,EAGrBZ,EACA,MAAM;AAAA,CAAI,EACV,IAAKe,GAAS,MAAMA,CAAI,EAAE,EAC1B,KAAK;AAAA,CAAI,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,iBAKKH,CAAa;AAAA,EAG7B,EAAAhB,QAAG,cAAc,EAAAE,QAAK,KAAKe,EAAS,WAAW,EAAGC,CAAgB,CACnE,EAOA,SAASE,EAAatB,EAAauB,EAA0B,CAC5D,GAAI,CAACvB,GAAO,CAACuB,EAAU,OAEvB,IAAIC,EAEJ,MAAO,CACN,KAAM,kCACN,eAAiBC,GAAyD,CAEzED,EAASC,CACV,EACA,YAAmC,CAClC,IAAMC,EAAW3B,EAAY,EAAAK,QAAK,QAAQoB,EAAO,KAAMxB,CAAG,CAAC,EAErD2B,EAAY,EAAAvB,QAAK,QAAQoB,EAAO,KAAMD,CAAQ,EACpD,EAAArB,QAAG,UAAUyB,EAAW,CAAE,UAAW,EAAK,CAAC,EAE3C,IAAIC,EAAoB,GACpBC,EAAkB,GAClBC,EAAgB,GAEpBJ,EAAS,QAAQ,CAACK,EAAKC,IAAQ,CAC9Bf,EAAac,EAAI,cAAe,EAAA3B,QAAK,KAAKuB,EAAWI,EAAI,QAAQ,EAAGA,EAAI,WAAW,EAEnFH,GAAqB,YAAYG,EAAI,aAAa,cAAcA,EAAI,QAAQ;AAAA,EAG5EF,GAAmB,IAAIE,EAAI,aAAa,IAExCD,GAAiB,oBAAoBC,EAAI,QAAQ;AAAA,EAG7CC,EAAM,EAAIN,EAAS,SACtBG,GAAmB;AAAA,EAErB,CAAC,EAED,EAAA3B,QAAG,cACF,EAAAE,QAAK,KAAKuB,EAAW,UAAU,EAC/B;AAAA,EACFC,CAAiB;AAAA,EACjBE,CAAa;AAAA;AAAA,EAEbD,CAAe;AAAA;AAAA,CAGd,CACD,CACD,CACD,CC1JA,IAAAI,EAAe,mBACfC,EAAiB,qBACjBC,EAA4B,+CAE5BC,EAAoC,iCAG9BC,EAAQ,QAAQ,IAAI,WAAa,cAOvC,SAASC,EAAiBC,EAAsB,CAC/C,IAAMC,EAAM,QAAQ,IAAI,EAClBC,EAAU,EAAAC,QAAK,KAAKF,EAAK,eAAgBD,EAAM,cAAc,EACnE,OAAI,EAAAI,QAAG,WAAWF,CAAO,EACR,KAAK,MAAM,EAAAE,QAAG,aAAaF,EAAS,MAAM,CAAC,EAC5C,QAGT,EACR,CAOA,SAASG,EAAWF,EAAuB,CAC1C,MAAO,GAAAA,EAAK,WAAW,OAAO,GAAKA,EAAK,WAAW,QAAQ,GAAKA,EAAK,WAAW,IAAI,EACrF,CAEA,SAASG,EACRC,EACAC,EAKS,CACT,GAAM,CAAE,KAAAL,CAAK,EAAIK,EACjB,OAAIH,EAAWF,CAAI,IAClBI,EAAMJ,GAEAI,EACL,QAAQ,YAAaC,EAAK,IAAI,EAC9B,QAAQ,eAAgBA,EAAK,OAAO,EACpC,QAAQ,YAAaL,CAAI,CAC5B,CAEA,SAASM,EAAcC,EAAgBC,EAAuE,CAC7GA,EAAUD,EAAO,SAAWC,EAC5B,IAAMC,EAAIF,EACJG,EAAUH,EAAO,SAAWX,EAAiBa,EAAE,IAAI,EACrDE,EAAqB,CAAC,EACrB,MAAM,QAAQF,EAAE,IAAI,EAGxBE,EAAWF,EAAE,KAFbE,EAAS,KAAKF,EAAE,IAAI,EAKrB,IAAMJ,EAAO,CACZ,GAAGI,EACH,QAAAC,CACD,EAEAC,EAAWA,EAAS,IAAKC,GAAM,CAC9B,GAAI,CAACF,GAAW,CAACR,EAAWU,CAAC,EAC5B,MAAM,IAAI,MAAM,YAAYP,EAAK,IAAI,mCAAmC,EAEzE,OAAOF,EAAUK,EAAS,CACzB,KAAMH,EAAK,KACX,QAASA,EAAK,QACd,KAAMO,CACP,CAAC,CACF,CAAC,EAED,IAAIC,EAAMJ,EAAE,KAAO,CAAC,EAChB,CAAC,MAAM,QAAQI,CAAG,GAAKA,IAC1BA,EAAM,CAACA,CAAG,GAGX,IAAMC,EAAW,MAAM,QAAQD,CAAG,EAE/BA,EAAI,IAAKE,GACTZ,EAAUK,EAAS,CAClB,KAAMH,EAAK,KACX,QAASA,EAAK,QACd,KAAMU,CACP,CAAC,CACF,EAPC,CAAC,EASJ,MAAO,CACN,GAAGN,EACH,QAAAC,EACA,SAAAC,EACA,QAAAG,CACD,CACD,CAOA,SAASE,EAAUC,EAAqC,CACvD,GAAM,CACL,QAAAC,EAAU,CAAC,EACX,QAAAV,EAAU,uDACV,gBAAAW,EAAkB,GAClB,mBAAAC,EACA,kBAAAC,CACD,EAAIJ,EAEAK,EAAU,GAERjB,GAAQ,MAAM,QAAQa,CAAO,EAAIA,EAAU,CAACA,CAAO,GACvD,IAAKT,GAAO,OAAOA,GAAM,WAAaA,EAAED,CAAO,EAAIC,CAAE,EACrD,IAAKA,GAAMH,EAAcG,EAAGD,CAAO,CAAC,EAEhCe,EAEF,CAAC,EAELlB,EAAK,QAASI,GAAM,CACnBc,EAAYd,EAAE,IAAI,EAAIA,EAAE,IACpB,MAAM,QAAQA,EAAE,KAAK,GACxBA,EAAE,MAAM,QAASe,GAAU,CAC1BD,EAAYC,CAAK,EAAIf,EAAE,GACxB,CAAC,CAEH,CAAC,EAED,IAAMgB,EAAoB,CACzB,CACC,KAAM,8BACN,QAAS,MACT,OAAOC,EAAG,CAAE,QAAAC,CAAQ,EAAe,CAClCL,EAAUK,IAAY,QAEtB,IAAMC,EAAyB,CAC9B,MAAO,CACN,cAAe,CACd,QAAS,CAAC,CACX,CACD,CACD,EAEA,OAAIN,IACHM,EAAW,MAAM,cAAc,QAAU,IAAC,EAAAC,SAAgBN,CAAW,CAAC,GAGhEK,CACR,EACA,mBAAmBE,EAAoC,CACtD,GAAI,CAACR,GAAW,CAACH,EAChB,OAAOW,EAGR,IAAMC,EAAmC,CAAC,EAE1C,OAAA1B,EAAK,QAASI,GAAM,CACnBA,EAAE,SAAS,QAASL,GAAQ,CAC3B,IAAM4B,EAAWX,IAAoBZ,EAAE,KAAML,CAAG,GAAK,CAAC,EAChD6B,EAAQ,CACb,IAAK7B,EACL,YAAa,YACb,GAAIK,GAAG,OAAS,CAAC,EACjB,GAAGuB,EAAS,KACb,EAEAD,EAAY,KAAK,CAChB,IAAK,SACL,MAAAE,EACA,GAAGD,CACJ,CAAC,CACF,CAAC,EACDvB,EAAE,QAAQ,QAASL,GAAQ,CAC1B,IAAM4B,EAAWZ,IAAqBX,EAAE,KAAML,CAAG,GAAK,CAAC,EACjD6B,EAAQ,CACb,KAAM7B,EACN,IAAK,aACL,YAAa,YACb,GAAIK,GAAG,OAAS,CAAC,EACjB,GAAGuB,EAAS,KACb,EACAD,EAAY,KAAK,CAChB,IAAK,OACL,MAAAE,EACA,GAAGD,CACJ,CAAC,CACF,CAAC,CACF,CAAC,EAEMD,CACR,CACD,CACD,EAEA,OAAIpC,GAASwB,GACZM,EAAQ,QACP,uBAAoBF,EAAa,CAChC,QAAS,KACV,CAAC,CACF,EAGME,CACR,CClNA,IAAAS,EAAe,mBACfC,EAAiB,qBASjB,SAASC,EAAuBC,EAA6C,CAC5E,GAAKA,EAEL,MAAO,CACN,KAAM,6CACN,YAAmC,CAClC,IAAMC,EAAM,OAAOD,GAAY,SAAWA,EAAUA,EAAQ,IAEtDE,EAAoBC,GAClBA,EAAM,OAAO,CAAC,EAAE,YAAY,EAAIA,EAAM,MAAM,CAAC,EAG/CC,EAAY,OAAOJ,GAAY,SAAWE,EAAoBF,EAAQ,WAAaE,EAGnFG,EAAS,EAAAC,QAAG,YAAYL,EAAK,CAClC,cAAe,EAChB,CAAC,EAED,GAAII,GAAQ,SAAW,EAAG,OAG1B,IAAME,EAASF,EAEb,OAAQG,GAAMA,EAAE,OAAS,UAAU,EACnC,IAAKC,IACE,CACN,cAAeL,EAAUK,EAAK,IAAI,EAClC,SAAUA,EAAK,IAChB,EACA,EACA,KAAK,CAACC,EAAGC,IACLD,EAAE,cAAgBC,EAAE,cAChB,GAEJD,EAAE,cAAgBC,EAAE,cAChB,EAED,CACP,EAEEC,EAAgB,GAChBC,EAAgB,GAChBC,EAAc,GAElBP,EAAO,QAAQ,CAAC,CAAE,cAAAQ,EAAe,SAAAC,CAAS,EAAGC,IAAQ,CACpDL,GAAiB,YAAYG,CAAa,cAAcC,CAAQ;AAAA,EAGhEH,GAAiB,oBAAoBG,CAAQ;AAAA,EAG7CF,GAAe,IAAIC,CAAa,IAE5BE,EAAM,EAAIV,EAAO,SACpBO,GAAe;AAAA,EAEjB,CAAC,EAED,EAAAR,QAAG,cACF,EAAAY,QAAK,KAAKjB,EAAK,UAAU,EACzB;AAAA,EACFW,CAAa;AAAA,EACbC,CAAa;AAAA;AAAA,EAEbC,CAAW;AAAA;AAAA,CAGV,CACD,CACD,CACD,CAOA,SAASK,EAAuBnB,EAA6C,CAC5E,GAAKA,EAEL,MAAO,CACN,KAAM,6CACN,YAAmC,CAClC,IAAMC,EAAM,OAAOD,GAAY,SAAWA,EAAUA,EAAQ,IAEtDE,EAAoBC,GAClBA,EAAM,OAAO,CAAC,EAAE,YAAY,EAAIA,EAAM,MAAM,CAAC,EAG/CC,EAAY,OAAOJ,GAAY,SAAWE,EAAoBF,EAAQ,WAAaE,EAGnFG,EAAS,EAAAC,QAAG,YAAYL,EAAK,CAClC,cAAe,EAChB,CAAC,EAED,GAAII,GAAQ,SAAW,EAAG,OAG1B,IAAME,EAASF,EAEb,OAAQG,GAAMA,EAAE,OAAS,UAAU,EACnC,IAAKC,IACE,CACN,cAAeL,EAAUK,EAAK,IAAI,EAClC,SAAUA,EAAK,IAChB,EACA,EACA,KAAK,CAACC,EAAGC,IACLD,EAAE,cAAgBC,EAAE,cAChB,GAEJD,EAAE,cAAgBC,EAAE,cAChB,EAED,CACP,EAEEC,EAAgB,GAChBC,EAAgB,GAChBC,EAAc,GAElBP,EAAO,QAAQ,CAAC,CAAE,cAAAQ,EAAe,SAAAC,CAAS,EAAGC,IAAQ,CACpDL,GAAiB,UAAUG,CAAa,YAAYC,CAAQ;AAAA,EAG5DH,GAAiB,oBAAoBG,CAAQ;AAAA,EAG7CF,GAAe,IAAIC,CAAa,IAE5BE,EAAM,EAAIV,EAAO,SACpBO,GAAe;AAAA,EAEjB,CAAC,EAED,EAAAR,QAAG,cACF,EAAAY,QAAK,KAAKjB,EAAK,UAAU,EACzB;AAAA,EACFW,CAAa;AAAA,EACbC,CAAa;AAAA;AAAA,EAEbC,CAAW;AAAA;AAAA,CAGV,CACD,CACD,CACD,CC/JA,IAAAM,EAAe,mBACfC,EAAiB,qBAGjB,SAASC,EAAQC,EAAaC,EAAS,EAAW,CACjD,OAAOD,EAAI,SAAS,EAAE,SAASC,EAAQ,GAAG,CAC3C,CAEA,SAASC,EAAWC,EAAoB,CACvC,IAAMC,EAAOD,EAAK,eAAe,EAC3BE,EAAQN,EAAQI,EAAK,YAAY,EAAI,CAAC,EACtCG,EAAMP,EAAQI,EAAK,WAAW,CAAC,EAC/BI,EAAQR,EAAQI,EAAK,YAAY,CAAC,EAClCK,EAAUT,EAAQI,EAAK,cAAc,CAAC,EACtCM,EAAUV,EAAQI,EAAK,cAAc,CAAC,EACtCO,EAAeX,EAAQI,EAAK,mBAAmB,EAAG,CAAC,EAEzD,MAAO,KAAKC,CAAI,IAAIC,CAAK,IAAIC,CAAG,IAAIC,CAAK,IAAIC,CAAO,IAAIC,CAAO,IAAIC,CAAY,EAChF,CAOA,SAASC,EAAoBC,EAAyB,CACrD,IAAIC,EAEJ,MAAO,CACN,KAAM,kCACN,eAAiBC,GAAyD,CAEzED,EAASC,CACV,EACA,YAAmC,CAGlC,IAAMC,EAAWb,EAFD,IAAI,IAEe,EAE7Bc,EAAaH,EAAO,UACpBI,EAAc,EAAAC,QAAK,KAAKF,EAAY,cAAc,EACnD,EAAAG,QAAG,WAAWH,CAAU,GAC5B,EAAAG,QAAG,UAAUH,CAAU,EAIxB,IAAMI,EAAU,KAAK,UAAU,CAAE,QAAS,IAAIR,CAAO,GAAI,SAAAG,CAAS,EAAG,KAAM,CAAC,EAC5E,EAAAI,QAAG,cAAcF,EAAaG,CAAO,EAErC,IAAMC,EAAU,EAAAH,QAAK,KAAKL,EAAO,KAAM,cAAc,EACrD,GAAI,EAAAM,QAAG,WAAWE,CAAO,EAAG,CAC3B,IAAMC,EAAU,KAAK,MAAM,EAAAH,QAAG,aAAaE,EAAS,OAAO,CAAC,EAC5DC,EAAQ,QAAUV,EAClB,EAAAO,QAAG,cAAcE,EAAS,KAAK,UAAUC,EAAS,KAAM,CAAC,EAAG,OAAO,CACpE,CACD,CACD,CACD","names":["index_exports","__export","buildSvgIcon","cdnImport","findSvgFile","tsxComponentAutoImport","versionUpdatePlugin","vueComponentAutoImport","writeTSXIcon","__toCommonJS","import_fs","import_path","findSvgFile","dir","svgContents","fs","file","path","iconName","svgContent","match","attr","viewBoxMatch","widthMatch","heightMatch","width","height","viewBoxContent","a","b","writeTSXIcon","componentName","iconDir","componentContent","line","buildSvgIcon","writeDir","config","resolvedConfig","svgFiles","iconsPath","iconImportContent","iconTypeContent","exportContent","svg","idx","import_fs","import_path","import_rollup_plugin_external_globals","import_vite_plugin_externals","isDev","getModuleVersion","name","pwd","pkgFile","path","fs","isFullPath","renderUrl","url","data","getModuleInfo","module","prodUrl","v","version","pathList","p","css","cssList","c","cdnImport","options","modules","enableInDevMode","generateCssLinkTag","generateScriptTag","isBuild","externalMap","alias","plugins","_","command","userConfig","externalGlobals","html","descriptors","cusomize","attrs","import_fs","import_path","tsxComponentAutoImport","options","dir","defaultFormatter","fName","formatter","cFiles","fs","cNames","f","file","a","b","importContent","exportContent","typeContent","componentName","fileName","idx","path","vueComponentAutoImport","import_fs","import_path","padZero","num","length","formatDate","date","year","month","day","hours","minutes","seconds","milliseconds","versionUpdatePlugin","version","config","resolvedConfig","dateTime","versionDir","versionPath","path","fs","content","pkgPath","pkgJson"]}
1
+ {"version":3,"sources":["../../src/index.ts","../../src/buildSvgIcon/index.ts","../../src/cdnImport/index.ts","../../src/componentAutoImport/index.ts","../../src/versionUpdate/index.ts"],"sourcesContent":["export * from \"./buildSvgIcon\";\nexport * from \"./cdnImport\";\nexport * from \"./cdnImport/type\";\nexport * from \"./componentAutoImport\";\nexport * from \"./componentAutoImport/type\";\nexport * from \"./versionUpdate\";\n","import fs from \"fs\";\nimport path from \"path\";\nimport type { Plugin, ResolvedConfig } from \"vite\";\n\n/**\n * 查找 svg 文件\n */\n\nconst findSvgFile = (dir: string): { iconName: string; componentName: string; iconContent: string }[] => {\n\t// svg 内容\n\tconst svgContents: { iconName: string; componentName: string; iconContent: string }[] = [];\n\t// 获取当前目录下的文件\n\tconst svgFiles = fs.readdirSync(dir, {\n\t\twithFileTypes: true,\n\t});\n\n\tsvgFiles.forEach((file) => {\n\t\tif (file.isDirectory()) {\n\t\t\tsvgContents.push(...findSvgFile(path.join(dir, file.name)));\n\t\t} else {\n\t\t\tconst iconName = file.name.replace(\".svg\", \"\");\n\n\t\t\tconst svgContent = fs\n\t\t\t\t.readFileSync(path.join(dir, file.name), \"utf-8\")\n\t\t\t\t.replace(/<\\?xml.*?\\?>/, \"\")\n\t\t\t\t.replace(/<!DOCTYPE svg.*?>/, \"\")\n\t\t\t\t// .replace(/(\\r)|(\\n)/g, \"\")\n\t\t\t\t.trimStart()\n\t\t\t\t.trimEnd()\n\t\t\t\t// .replace(/(fill=\"[^>+].*?\")/g, 'fill=\"\"')\n\t\t\t\t.replace(/<svg([^>+].*?)>/, (match, attr) => {\n\t\t\t\t\tconst viewBoxMatch = attr.match(/viewBox=\"[^\"]+\"/);\n\t\t\t\t\tconst widthMatch = attr.match(/width=\"(\\d+)\"/);\n\t\t\t\t\tconst heightMatch = attr.match(/height=\"(\\d+)\"/);\n\t\t\t\t\tlet width = 1024;\n\t\t\t\t\tlet height = 1024;\n\t\t\t\t\tif (widthMatch) {\n\t\t\t\t\t\twidth = widthMatch[0];\n\t\t\t\t\t}\n\t\t\t\t\tif (heightMatch) {\n\t\t\t\t\t\theight = heightMatch[0];\n\t\t\t\t\t}\n\t\t\t\t\tlet viewBoxContent = \"\";\n\t\t\t\t\tif (!viewBoxMatch) {\n\t\t\t\t\t\tviewBoxContent = `viewBox=\"0 0 ${width} ${height}\"`;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tviewBoxContent = viewBoxMatch[0];\n\t\t\t\t\t}\n\t\t\t\t\treturn `<svg xmlns=\"http://www.w3.org/2000/svg\" ${viewBoxContent}>`;\n\t\t\t\t});\n\n\t\t\tsvgContents.push({\n\t\t\t\t// iconName: iconName.charAt(0).toUpperCase() + iconName.slice(1),\n\t\t\t\ticonName,\n\t\t\t\tcomponentName: iconName.charAt(0).toUpperCase() + iconName.slice(1),\n\t\t\t\ticonContent: svgContent,\n\t\t\t});\n\t\t}\n\t});\n\n\treturn svgContents.sort((a, b) => {\n\t\tif (a.iconName < b.iconName) {\n\t\t\treturn -1;\n\t\t}\n\t\tif (a.iconName > b.iconName) {\n\t\t\treturn 1;\n\t\t}\n\t\treturn 0;\n\t});\n};\n\n/**\n * 写入 TSX 图标\n */\nconst writeTSXIcon = (componentName: string, iconDir: string, svgContent: string): void => {\n\tfs.mkdirSync(iconDir, { recursive: true });\n\n\tconst componentContent = `import { defineComponent } from \"vue\";\n\n/**\n * ${componentName} 图标组件\n */\nexport const ${componentName} = defineComponent({\n\tname: \"${componentName}\",\n\trender() {\n\t\treturn (\n${svgContent\n\t.split(\"\\n\")\n\t.map((line) => `\t\t\t${line}`)\n\t.join(\"\\n\")}\n\t\t);\n\t},\n});\n\nexport default ${componentName};\n`;\n\n\tfs.writeFileSync(path.join(iconDir, \"index.tsx\"), componentContent);\n};\n\n/**\n * 构建 svg 图标组件\n * @param dir svg 文件路径\n * @param writeDir 写入的文件路径 相对的即可\n */\nfunction buildSvgIcon(dir: string, writeDir: string): Plugin {\n\tif (!dir || !writeDir) return;\n\n\tlet config: ResolvedConfig;\n\n\treturn {\n\t\tname: \"fast-vite-plugin-build-svg-icon\",\n\t\tconfigResolved: (resolvedConfig: ResolvedConfig): void | Promise<void> => {\n\t\t\t// 存储最终解析的配置\n\t\t\tconfig = resolvedConfig;\n\t\t},\n\t\tbuildStart(): void | Promise<void> {\n\t\t\tconst svgFiles = findSvgFile(path.resolve(config.root, dir));\n\n\t\t\tconst iconsPath = path.resolve(config.root, writeDir);\n\t\t\tfs.mkdirSync(iconsPath, { recursive: true });\n\n\t\t\tlet iconImportContent = \"\";\n\t\t\tlet iconTypeContent = \"\";\n\t\t\tlet exportContent = \"\";\n\n\t\t\tsvgFiles.forEach((svg, idx) => {\n\t\t\t\twriteTSXIcon(svg.componentName, path.join(iconsPath, svg.iconName), svg.iconContent);\n\n\t\t\t\ticonImportContent += `import { ${svg.componentName} } from \"./${svg.iconName}\";\n`;\n\n\t\t\t\ticonTypeContent += `\t${svg.componentName},`;\n\n\t\t\t\texportContent += `export * from \"./${svg.iconName}\";\n`;\n\n\t\t\t\tif (idx + 1 < svgFiles.length) {\n\t\t\t\t\ticonTypeContent += \"\\n\";\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tfs.writeFileSync(\n\t\t\t\tpath.join(iconsPath, \"index.ts\"),\n\t\t\t\t`import type { DefineComponent } from \"vue\";\n${iconImportContent}\n${exportContent}\nexport default [\n${iconTypeContent}\n] as unknown as DefineComponent[];\n`\n\t\t\t);\n\t\t},\n\t};\n}\n\nexport { findSvgFile, writeTSXIcon, buildSvgIcon };\n","import fs from \"fs\";\nimport path from \"path\";\nimport externalGlobals from \"rollup-plugin-external-globals\";\nimport { viteExternalsPlugin } from \"vite-plugin-externals\";\nimport type { CdnImportOptions, Module } from \"./type\";\nimport type { HtmlTagDescriptor, Plugin, UserConfig } from \"vite\";\n\nconst isDev = process.env.NODE_ENV === \"development\";\n\n/**\n * get npm module version\n * @param name\n * @returns\n */\nfunction getModuleVersion(name: string): string {\n\tconst pwd = process.cwd();\n\tconst pkgFile = path.join(pwd, \"node_modules\", name, \"package.json\");\n\tif (fs.existsSync(pkgFile)) {\n\t\tconst pkgJson = JSON.parse(fs.readFileSync(pkgFile, \"utf8\"));\n\t\treturn pkgJson.version;\n\t}\n\n\treturn \"\";\n}\n\n/**\n * 是否完整的 url\n * @param path\n * @returns\n */\nfunction isFullPath(path: string): boolean {\n\treturn path.startsWith(\"http:\") || path.startsWith(\"https:\") || path.startsWith(\"//\") ? true : false;\n}\n\nfunction renderUrl(\n\turl: string,\n\tdata: {\n\t\tname: string;\n\t\tversion: string;\n\t\tpath: string;\n\t}\n): string {\n\tconst { path } = data;\n\tif (isFullPath(path)) {\n\t\turl = path;\n\t}\n\treturn url\n\t\t.replace(/\\{name\\}/g, data.name)\n\t\t.replace(/\\{version\\}/g, data.version)\n\t\t.replace(/\\{path\\}/g, path);\n}\n\nfunction getModuleInfo(module: Module, prodUrl: string): Module & { pathList?: string[]; cssList?: string[] } {\n\tprodUrl = module.prodUrl || prodUrl;\n\tconst v = module;\n\tconst version = module.version || getModuleVersion(v.name);\n\tlet pathList: string[] = [];\n\tif (!Array.isArray(v.path)) {\n\t\tpathList.push(v.path);\n\t} else {\n\t\tpathList = v.path;\n\t}\n\n\tconst data = {\n\t\t...v,\n\t\tversion,\n\t};\n\n\tpathList = pathList.map((p) => {\n\t\tif (!version && !isFullPath(p)) {\n\t\t\tthrow new Error(`modules: ${data.name} package.json file does not exist`);\n\t\t}\n\t\treturn renderUrl(prodUrl, {\n\t\t\tname: data.name,\n\t\t\tversion: data.version,\n\t\t\tpath: p,\n\t\t});\n\t});\n\n\tlet css = v.css || [];\n\tif (!Array.isArray(css) && css) {\n\t\tcss = [css];\n\t}\n\n\tconst cssList = !Array.isArray(css)\n\t\t? []\n\t\t: css.map((c) =>\n\t\t\t\trenderUrl(prodUrl, {\n\t\t\t\t\tname: data.name,\n\t\t\t\t\tversion: data.version,\n\t\t\t\t\tpath: c,\n\t\t\t\t})\n\t\t\t);\n\n\treturn {\n\t\t...v,\n\t\tversion,\n\t\tpathList,\n\t\tcssList,\n\t};\n}\n\n/**\n * CDN 导入\n * @param options\n * @returns\n */\nfunction cdnImport(options: CdnImportOptions): Plugin[] {\n\tconst {\n\t\tmodules = [],\n\t\tprodUrl = \"https://cdn.jsdelivr.net/npm/{name}@{version}/{path}\",\n\t\tenableInDevMode = false,\n\t\tgenerateCssLinkTag,\n\t\tgenerateScriptTag,\n\t} = options;\n\n\tlet isBuild = false;\n\n\tconst data = (Array.isArray(modules) ? modules : [modules])\n\t\t.map((v) => (typeof v === \"function\" ? v(prodUrl) : v))\n\t\t.map((v) => getModuleInfo(v, prodUrl));\n\n\tconst externalMap: {\n\t\t[name: string]: string;\n\t} = {};\n\n\tdata.forEach((v) => {\n\t\texternalMap[v.name] = v.var;\n\t\tif (Array.isArray(v.alias)) {\n\t\t\tv.alias.forEach((alias) => {\n\t\t\t\texternalMap[alias] = v.var;\n\t\t\t});\n\t\t}\n\t});\n\n\tconst plugins: Plugin[] = [\n\t\t{\n\t\t\tname: \"fast-vite-plugin-cdn-import\",\n\t\t\tenforce: \"pre\",\n\t\t\tconfig(_, { command }): UserConfig {\n\t\t\t\tisBuild = command === \"build\";\n\n\t\t\t\tconst userConfig: UserConfig = {\n\t\t\t\t\tbuild: {\n\t\t\t\t\t\trollupOptions: {\n\t\t\t\t\t\t\tplugins: [],\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t};\n\n\t\t\t\tif (isBuild) {\n\t\t\t\t\tuserConfig.build.rollupOptions.plugins = [externalGlobals(externalMap)];\n\t\t\t\t}\n\n\t\t\t\treturn userConfig;\n\t\t\t},\n\t\t\ttransformIndexHtml(html): string | HtmlTagDescriptor[] {\n\t\t\t\tif (!isBuild && !enableInDevMode) {\n\t\t\t\t\treturn html;\n\t\t\t\t}\n\n\t\t\t\tconst descriptors: HtmlTagDescriptor[] = [];\n\n\t\t\t\tdata.forEach((v) => {\n\t\t\t\t\tv.pathList.forEach((url) => {\n\t\t\t\t\t\tconst cusomize = generateScriptTag?.(v.name, url) || {};\n\t\t\t\t\t\tconst attrs = {\n\t\t\t\t\t\t\tsrc: url,\n\t\t\t\t\t\t\tcrossorigin: \"anonymous\",\n\t\t\t\t\t\t\t...(v?.attrs ?? {}),\n\t\t\t\t\t\t\t...cusomize.attrs,\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\tdescriptors.push({\n\t\t\t\t\t\t\ttag: \"script\",\n\t\t\t\t\t\t\tattrs,\n\t\t\t\t\t\t\t...cusomize,\n\t\t\t\t\t\t});\n\t\t\t\t\t});\n\t\t\t\t\tv.cssList.forEach((url) => {\n\t\t\t\t\t\tconst cusomize = generateCssLinkTag?.(v.name, url) || {};\n\t\t\t\t\t\tconst attrs = {\n\t\t\t\t\t\t\thref: url,\n\t\t\t\t\t\t\trel: \"stylesheet\",\n\t\t\t\t\t\t\tcrossorigin: \"anonymous\",\n\t\t\t\t\t\t\t...(v?.attrs ?? {}),\n\t\t\t\t\t\t\t...cusomize.attrs,\n\t\t\t\t\t\t};\n\t\t\t\t\t\tdescriptors.push({\n\t\t\t\t\t\t\ttag: \"link\",\n\t\t\t\t\t\t\tattrs,\n\t\t\t\t\t\t\t...cusomize,\n\t\t\t\t\t\t});\n\t\t\t\t\t});\n\t\t\t\t});\n\n\t\t\t\treturn descriptors;\n\t\t\t},\n\t\t},\n\t];\n\n\tif (isDev && enableInDevMode) {\n\t\tplugins.push(\n\t\t\tviteExternalsPlugin(externalMap, {\n\t\t\t\tenforce: \"pre\",\n\t\t\t})\n\t\t);\n\t}\n\n\treturn plugins;\n}\n\nexport { cdnImport };\n","import fs from \"fs\";\nimport path from \"path\";\nimport type { AutoImportOptions } from \"./type\";\nimport type { Plugin } from \"vite\";\n\n/**\n * TSX组件自动导入\n * @description 只会生成安装文件\n * @param options 组件文件夹路径\n */\nfunction tsxComponentAutoImport(options: string | AutoImportOptions): Plugin {\n\tif (!options) return;\n\n\treturn {\n\t\tname: \"fast-vite-plugin-tsx-component-auto-import\",\n\t\tbuildStart(): void | Promise<void> {\n\t\t\tconst dir = typeof options === \"string\" ? options : options.dir;\n\n\t\t\tconst defaultFormatter = (fName: string): string => {\n\t\t\t\treturn fName.charAt(0).toUpperCase() + fName.slice(1);\n\t\t\t};\n\n\t\t\tconst formatter = typeof options === \"string\" ? defaultFormatter : (options.formatter ?? defaultFormatter);\n\n\t\t\t// 获取所有文件夹名称\n\t\t\tconst cFiles = fs.readdirSync(dir, {\n\t\t\t\twithFileTypes: true,\n\t\t\t});\n\n\t\t\tif (cFiles?.length === 0) return;\n\n\t\t\t// 组件名称\n\t\t\tconst cNames = cFiles\n\t\t\t\t// 排除export文件\n\t\t\t\t.filter((f) => f.name !== \"index.ts\")\n\t\t\t\t.map((file) => {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tcomponentName: formatter(file.name),\n\t\t\t\t\t\tfileName: file.name,\n\t\t\t\t\t};\n\t\t\t\t})\n\t\t\t\t.sort((a, b) => {\n\t\t\t\t\tif (a.componentName < b.componentName) {\n\t\t\t\t\t\treturn -1;\n\t\t\t\t\t}\n\t\t\t\t\tif (a.componentName > b.componentName) {\n\t\t\t\t\t\treturn 1;\n\t\t\t\t\t}\n\t\t\t\t\treturn 0;\n\t\t\t\t});\n\n\t\t\tlet importContent = \"\";\n\t\t\tlet exportContent = \"\";\n\t\t\tlet typeContent = \"\";\n\n\t\t\tcNames.forEach(({ componentName, fileName }, idx) => {\n\t\t\t\timportContent += `import { ${componentName} } from \"./${fileName}\";\n`;\n\n\t\t\t\texportContent += `export * from \"./${fileName}\";\n`;\n\n\t\t\t\ttypeContent += `\t${componentName},`;\n\n\t\t\t\tif (idx + 1 < cNames.length) {\n\t\t\t\t\ttypeContent += \"\\n\";\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tfs.writeFileSync(\n\t\t\t\tpath.join(dir, \"index.ts\"),\n\t\t\t\t`import type { Plugin } from \"vue\";\n${importContent}\n${exportContent}\nexport default [\n${typeContent}\n] as Plugin[];\n`\n\t\t\t);\n\t\t},\n\t};\n}\n\n/**\n * VUE组件自动导入\n * @description 只会生成安装文件\n * @param options 组件文件夹路径\n */\nfunction vueComponentAutoImport(options: string | AutoImportOptions): Plugin {\n\tif (!options) return;\n\n\treturn {\n\t\tname: \"fast-vite-plugin-vue-component-auto-import\",\n\t\tbuildStart(): void | Promise<void> {\n\t\t\tconst dir = typeof options === \"string\" ? options : options.dir;\n\n\t\t\tconst defaultFormatter = (fName: string): string => {\n\t\t\t\treturn fName.charAt(0).toUpperCase() + fName.slice(1);\n\t\t\t};\n\n\t\t\tconst formatter = typeof options === \"string\" ? defaultFormatter : (options.formatter ?? defaultFormatter);\n\n\t\t\t// 获取所有文件夹名称\n\t\t\tconst cFiles = fs.readdirSync(dir, {\n\t\t\t\twithFileTypes: true,\n\t\t\t});\n\n\t\t\tif (cFiles?.length === 0) return;\n\n\t\t\t// 组件名称\n\t\t\tconst cNames = cFiles\n\t\t\t\t// 排除export文件\n\t\t\t\t.filter((f) => f.name !== \"index.ts\")\n\t\t\t\t.map((file) => {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tcomponentName: formatter(file.name),\n\t\t\t\t\t\tfileName: file.name,\n\t\t\t\t\t};\n\t\t\t\t})\n\t\t\t\t.sort((a, b) => {\n\t\t\t\t\tif (a.componentName < b.componentName) {\n\t\t\t\t\t\treturn -1;\n\t\t\t\t\t}\n\t\t\t\t\tif (a.componentName > b.componentName) {\n\t\t\t\t\t\treturn 1;\n\t\t\t\t\t}\n\t\t\t\t\treturn 0;\n\t\t\t\t});\n\n\t\t\tlet importContent = \"\";\n\t\t\tlet exportContent = \"\";\n\t\t\tlet typeContent = \"\";\n\n\t\t\tcNames.forEach(({ componentName, fileName }, idx) => {\n\t\t\t\timportContent += `import ${componentName} from \"./${fileName}/index.vue\";\n`;\n\n\t\t\t\texportContent += `export * from \"./${fileName}/index.vue\";\n`;\n\n\t\t\t\ttypeContent += `\t${componentName},`;\n\n\t\t\t\tif (idx + 1 < cNames.length) {\n\t\t\t\t\ttypeContent += \"\\n\";\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tfs.writeFileSync(\n\t\t\t\tpath.join(dir, \"index.ts\"),\n\t\t\t\t`import type { DefineComponent } from \"vue\";\n${importContent}\n${exportContent}\nexport default [\n${typeContent}\n] as unknown as DefineComponent[];\n`\n\t\t\t);\n\t\t},\n\t};\n}\n\nexport { tsxComponentAutoImport, vueComponentAutoImport };\n","import fs from \"fs\";\nimport path from \"path\";\nimport type { Plugin, ResolvedConfig } from \"vite\";\n\nfunction padZero(num: number, length = 2): string {\n\treturn num.toString().padStart(length, \"0\");\n}\n\nfunction formatDate(date: Date): string {\n\tconst year = date.getUTCFullYear();\n\tconst month = padZero(date.getUTCMonth() + 1);\n\tconst day = padZero(date.getUTCDate());\n\tconst hours = padZero(date.getUTCHours());\n\tconst minutes = padZero(date.getUTCMinutes());\n\tconst seconds = padZero(date.getUTCSeconds());\n\tconst milliseconds = padZero(date.getUTCMilliseconds(), 3);\n\n\treturn `Z ${year}-${month}-${day} ${hours}:${minutes}:${seconds}.${milliseconds}`;\n}\n\n/**\n * 版本更新插件\n * @param version 不要携带 'v',示例:1.0.0\n * @returns\n */\nfunction versionUpdatePlugin(version: string): Plugin {\n\tlet config: ResolvedConfig;\n\n\treturn {\n\t\tname: \"fast-vite-plugin-version-update\",\n\t\tconfigResolved: (resolvedConfig: ResolvedConfig): void | Promise<void> => {\n\t\t\t// 存储最终解析的配置\n\t\t\tconfig = resolvedConfig;\n\t\t},\n\t\tbuildStart(): void | Promise<void> {\n\t\t\tconst curDate = new Date();\n\n\t\t\tconst dateTime = formatDate(curDate);\n\n\t\t\tconst versionDir = config.publicDir;\n\t\t\tconst versionPath = path.join(versionDir, \"version.json\");\n\t\t\tif (!fs.existsSync(versionDir)) {\n\t\t\t\tfs.mkdirSync(versionDir);\n\t\t\t}\n\n\t\t\t// 写入版本信息文件\n\t\t\tconst content = JSON.stringify({ version: `v${version}`, dateTime }, null, 4);\n\t\t\tfs.writeFileSync(versionPath, content);\n\n\t\t\tconst pkgPath = path.join(config.base, \"package.json\");\n\t\t\tif (fs.existsSync(pkgPath)) {\n\t\t\t\tconst pkgJson = JSON.parse(fs.readFileSync(pkgPath, \"utf-8\"));\n\t\t\t\tpkgJson.version = version;\n\t\t\t\tfs.writeFileSync(pkgPath, JSON.stringify(pkgJson, null, 2), \"utf-8\");\n\t\t\t}\n\t\t},\n\t};\n}\n\nexport { versionUpdatePlugin };\n"],"mappings":"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","names":["index_exports","__export","buildSvgIcon","cdnImport","findSvgFile","tsxComponentAutoImport","versionUpdatePlugin","vueComponentAutoImport","writeTSXIcon","__toCommonJS","import_fs","import_path","findSvgFile","dir","svgContents","fs","file","path","iconName","svgContent","match","attr","viewBoxMatch","widthMatch","heightMatch","width","height","viewBoxContent","a","b","writeTSXIcon","componentName","iconDir","componentContent","line","buildSvgIcon","writeDir","config","resolvedConfig","svgFiles","iconsPath","iconImportContent","iconTypeContent","exportContent","svg","idx","import_fs","import_path","import_rollup_plugin_external_globals","import_vite_plugin_externals","isDev","getModuleVersion","name","pwd","pkgFile","path","fs","isFullPath","renderUrl","url","data","getModuleInfo","module","prodUrl","v","version","pathList","p","css","cssList","c","cdnImport","options","modules","enableInDevMode","generateCssLinkTag","generateScriptTag","isBuild","externalMap","alias","plugins","_","command","userConfig","externalGlobals","html","descriptors","cusomize","attrs","import_fs","import_path","tsxComponentAutoImport","options","dir","defaultFormatter","fName","formatter","cFiles","fs","cNames","f","file","a","b","importContent","exportContent","typeContent","componentName","fileName","idx","path","vueComponentAutoImport","import_fs","import_path","padZero","num","length","formatDate","date","year","month","day","hours","minutes","seconds","milliseconds","versionUpdatePlugin","version","config","resolvedConfig","dateTime","versionDir","versionPath","path","fs","content","pkgPath","pkgJson"]}
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../../packages/buildSvgIcon/index.ts","../../packages/cdnImport/index.ts","../../packages/componentAutoImport/index.ts","../../packages/versionUpdate/index.ts"],"sourcesContent":["import fs from \"fs\";\nimport path from \"path\";\nimport type { Plugin, ResolvedConfig } from \"vite\";\n\n/**\n * 查找 svg 文件\n */\n\nconst findSvgFile = (dir: string): { iconName: string; componentName: string; iconContent: string }[] => {\n\t// svg 内容\n\tconst svgContents: { iconName: string; componentName: string; iconContent: string }[] = [];\n\t// 获取当前目录下的文件\n\tconst svgFiles = fs.readdirSync(dir, {\n\t\twithFileTypes: true,\n\t});\n\n\tsvgFiles.forEach((file) => {\n\t\tif (file.isDirectory()) {\n\t\t\tsvgContents.push(...findSvgFile(path.join(dir, file.name)));\n\t\t} else {\n\t\t\tconst iconName = file.name.replace(\".svg\", \"\");\n\n\t\t\tconst svgContent = fs\n\t\t\t\t.readFileSync(path.join(dir, file.name), \"utf-8\")\n\t\t\t\t.replace(/<\\?xml.*?\\?>/, \"\")\n\t\t\t\t.replace(/<!DOCTYPE svg.*?>/, \"\")\n\t\t\t\t// .replace(/(\\r)|(\\n)/g, \"\")\n\t\t\t\t.trimStart()\n\t\t\t\t.trimEnd()\n\t\t\t\t// .replace(/(fill=\"[^>+].*?\")/g, 'fill=\"\"')\n\t\t\t\t.replace(/<svg([^>+].*?)>/, (match, attr) => {\n\t\t\t\t\tconst viewBoxMatch = attr.match(/viewBox=\"[^\"]+\"/);\n\t\t\t\t\tconst widthMatch = attr.match(/width=\"(\\d+)\"/);\n\t\t\t\t\tconst heightMatch = attr.match(/height=\"(\\d+)\"/);\n\t\t\t\t\tlet width = 1024;\n\t\t\t\t\tlet height = 1024;\n\t\t\t\t\tif (widthMatch) {\n\t\t\t\t\t\twidth = widthMatch[0];\n\t\t\t\t\t}\n\t\t\t\t\tif (heightMatch) {\n\t\t\t\t\t\theight = heightMatch[0];\n\t\t\t\t\t}\n\t\t\t\t\tlet viewBoxContent = \"\";\n\t\t\t\t\tif (!viewBoxMatch) {\n\t\t\t\t\t\tviewBoxContent = `viewBox=\"0 0 ${width} ${height}\"`;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tviewBoxContent = viewBoxMatch[0];\n\t\t\t\t\t}\n\t\t\t\t\treturn `<svg xmlns=\"http://www.w3.org/2000/svg\" ${viewBoxContent}>`;\n\t\t\t\t});\n\n\t\t\tsvgContents.push({\n\t\t\t\t// iconName: iconName.charAt(0).toUpperCase() + iconName.slice(1),\n\t\t\t\ticonName,\n\t\t\t\tcomponentName: iconName.charAt(0).toUpperCase() + iconName.slice(1),\n\t\t\t\ticonContent: svgContent,\n\t\t\t});\n\t\t}\n\t});\n\n\treturn svgContents.sort((a, b) => {\n\t\tif (a.iconName < b.iconName) {\n\t\t\treturn -1;\n\t\t}\n\t\tif (a.iconName > b.iconName) {\n\t\t\treturn 1;\n\t\t}\n\t\treturn 0;\n\t});\n};\n\n/**\n * 写入 TSX 图标\n */\nconst writeTSXIcon = (componentName: string, iconDir: string, svgContent: string): void => {\n\tfs.mkdirSync(iconDir, { recursive: true });\n\n\tconst componentContent = `import { defineComponent } from \"vue\";\n\n/**\n * ${componentName} 图标组件\n */\nexport const ${componentName} = defineComponent({\n\tname: \"${componentName}\",\n\trender() {\n\t\treturn (\n${svgContent\n\t.split(\"\\n\")\n\t.map((line) => `\t\t\t${line}`)\n\t.join(\"\\n\")}\n\t\t);\n\t},\n});\n\nexport default ${componentName};\n`;\n\n\tfs.writeFileSync(path.join(iconDir, \"index.tsx\"), componentContent);\n};\n\n/**\n * 构建 svg 图标组件\n * @param dir svg 文件路径\n * @param writeDir 写入的文件路径 相对的即可\n */\nfunction buildSvgIcon(dir: string, writeDir: string): Plugin {\n\tif (!dir || !writeDir) return;\n\n\tlet config: ResolvedConfig;\n\n\treturn {\n\t\tname: \"fast-vite-plugin-build-svg-icon\",\n\t\tconfigResolved: (resolvedConfig: ResolvedConfig): void | Promise<void> => {\n\t\t\t// 存储最终解析的配置\n\t\t\tconfig = resolvedConfig;\n\t\t},\n\t\tbuildStart(): void | Promise<void> {\n\t\t\tconst svgFiles = findSvgFile(path.resolve(config.root, dir));\n\n\t\t\tconst iconsPath = path.resolve(config.root, writeDir);\n\t\t\tfs.mkdirSync(iconsPath, { recursive: true });\n\n\t\t\tlet iconImportContent = \"\";\n\t\t\tlet iconTypeContent = \"\";\n\t\t\tlet exportContent = \"\";\n\n\t\t\tsvgFiles.forEach((svg, idx) => {\n\t\t\t\twriteTSXIcon(svg.componentName, path.join(iconsPath, svg.iconName), svg.iconContent);\n\n\t\t\t\ticonImportContent += `import { ${svg.componentName} } from \"./${svg.iconName}\";\n`;\n\n\t\t\t\ticonTypeContent += `\t${svg.componentName},`;\n\n\t\t\t\texportContent += `export * from \"./${svg.iconName}\";\n`;\n\n\t\t\t\tif (idx + 1 < svgFiles.length) {\n\t\t\t\t\ticonTypeContent += \"\\n\";\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tfs.writeFileSync(\n\t\t\t\tpath.join(iconsPath, \"index.ts\"),\n\t\t\t\t`import type { DefineComponent } from \"vue\";\n${iconImportContent}\n${exportContent}\nexport default [\n${iconTypeContent}\n] as unknown as DefineComponent[];\n`\n\t\t\t);\n\t\t},\n\t};\n}\n\nexport { findSvgFile, writeTSXIcon, buildSvgIcon };\n","import fs from \"fs\";\nimport path from \"path\";\nimport externalGlobals from \"rollup-plugin-external-globals\";\nimport type { HtmlTagDescriptor, Plugin, UserConfig } from \"vite\";\nimport { viteExternalsPlugin } from \"vite-plugin-externals\";\nimport type { CdnImportOptions, Module } from \"./type\";\n\nconst isDev = process.env.NODE_ENV === \"development\";\n\n/**\n * get npm module version\n * @param name\n * @returns\n */\nfunction getModuleVersion(name: string): string {\n\tconst pwd = process.cwd();\n\tconst pkgFile = path.join(pwd, \"node_modules\", name, \"package.json\");\n\tif (fs.existsSync(pkgFile)) {\n\t\tconst pkgJson = JSON.parse(fs.readFileSync(pkgFile, \"utf8\"));\n\t\treturn pkgJson.version;\n\t}\n\n\treturn \"\";\n}\n\n/**\n * 是否完整的 url\n * @param path\n * @returns\n */\nfunction isFullPath(path: string): boolean {\n\treturn path.startsWith(\"http:\") || path.startsWith(\"https:\") || path.startsWith(\"//\") ? true : false;\n}\n\nfunction renderUrl(\n\turl: string,\n\tdata: {\n\t\tname: string;\n\t\tversion: string;\n\t\tpath: string;\n\t}\n): string {\n\tconst { path } = data;\n\tif (isFullPath(path)) {\n\t\turl = path;\n\t}\n\treturn url\n\t\t.replace(/\\{name\\}/g, data.name)\n\t\t.replace(/\\{version\\}/g, data.version)\n\t\t.replace(/\\{path\\}/g, path);\n}\n\nfunction getModuleInfo(module: Module, prodUrl: string): Module & { pathList?: string[]; cssList?: string[] } {\n\tprodUrl = module.prodUrl || prodUrl;\n\tconst v = module;\n\tconst version = module.version || getModuleVersion(v.name);\n\tlet pathList: string[] = [];\n\tif (!Array.isArray(v.path)) {\n\t\tpathList.push(v.path);\n\t} else {\n\t\tpathList = v.path;\n\t}\n\n\tconst data = {\n\t\t...v,\n\t\tversion,\n\t};\n\n\tpathList = pathList.map((p) => {\n\t\tif (!version && !isFullPath(p)) {\n\t\t\tthrow new Error(`modules: ${data.name} package.json file does not exist`);\n\t\t}\n\t\treturn renderUrl(prodUrl, {\n\t\t\tname: data.name,\n\t\t\tversion: data.version,\n\t\t\tpath: p,\n\t\t});\n\t});\n\n\tlet css = v.css || [];\n\tif (!Array.isArray(css) && css) {\n\t\tcss = [css];\n\t}\n\n\tconst cssList = !Array.isArray(css)\n\t\t? []\n\t\t: css.map((c) =>\n\t\t\t\trenderUrl(prodUrl, {\n\t\t\t\t\tname: data.name,\n\t\t\t\t\tversion: data.version,\n\t\t\t\t\tpath: c,\n\t\t\t\t})\n\t\t\t);\n\n\treturn {\n\t\t...v,\n\t\tversion,\n\t\tpathList,\n\t\tcssList,\n\t};\n}\n\n/**\n * CDN 导入\n * @param options\n * @returns\n */\nfunction cdnImport(options: CdnImportOptions): Plugin[] {\n\tconst {\n\t\tmodules = [],\n\t\tprodUrl = \"https://cdn.jsdelivr.net/npm/{name}@{version}/{path}\",\n\t\tenableInDevMode = false,\n\t\tgenerateCssLinkTag,\n\t\tgenerateScriptTag,\n\t} = options;\n\n\tlet isBuild = false;\n\n\tconst data = (Array.isArray(modules) ? modules : [modules])\n\t\t.map((v) => (typeof v === \"function\" ? v(prodUrl) : v))\n\t\t.map((v) => getModuleInfo(v, prodUrl));\n\n\tconst externalMap: {\n\t\t[name: string]: string;\n\t} = {};\n\n\tdata.forEach((v) => {\n\t\texternalMap[v.name] = v.var;\n\t\tif (Array.isArray(v.alias)) {\n\t\t\tv.alias.forEach((alias) => {\n\t\t\t\texternalMap[alias] = v.var;\n\t\t\t});\n\t\t}\n\t});\n\n\tconst plugins: Plugin[] = [\n\t\t{\n\t\t\tname: \"fast-vite-plugin-cdn-import\",\n\t\t\tenforce: \"pre\",\n\t\t\tconfig(_, { command }): UserConfig {\n\t\t\t\tisBuild = command === \"build\";\n\n\t\t\t\tconst userConfig: UserConfig = {\n\t\t\t\t\tbuild: {\n\t\t\t\t\t\trollupOptions: {\n\t\t\t\t\t\t\tplugins: [],\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t};\n\n\t\t\t\tif (isBuild) {\n\t\t\t\t\tuserConfig.build.rollupOptions.plugins = [externalGlobals(externalMap)];\n\t\t\t\t}\n\n\t\t\t\treturn userConfig;\n\t\t\t},\n\t\t\ttransformIndexHtml(html): string | HtmlTagDescriptor[] {\n\t\t\t\tif (!isBuild && !enableInDevMode) {\n\t\t\t\t\treturn html;\n\t\t\t\t}\n\n\t\t\t\tconst descriptors: HtmlTagDescriptor[] = [];\n\n\t\t\t\tdata.forEach((v) => {\n\t\t\t\t\tv.pathList.forEach((url) => {\n\t\t\t\t\t\tconst cusomize = generateScriptTag?.(v.name, url) || {};\n\t\t\t\t\t\tconst attrs = {\n\t\t\t\t\t\t\tsrc: url,\n\t\t\t\t\t\t\tcrossorigin: \"anonymous\",\n\t\t\t\t\t\t\t...(v?.attrs ?? {}),\n\t\t\t\t\t\t\t...cusomize.attrs,\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\tdescriptors.push({\n\t\t\t\t\t\t\ttag: \"script\",\n\t\t\t\t\t\t\tattrs,\n\t\t\t\t\t\t\t...cusomize,\n\t\t\t\t\t\t});\n\t\t\t\t\t});\n\t\t\t\t\tv.cssList.forEach((url) => {\n\t\t\t\t\t\tconst cusomize = generateCssLinkTag?.(v.name, url) || {};\n\t\t\t\t\t\tconst attrs = {\n\t\t\t\t\t\t\thref: url,\n\t\t\t\t\t\t\trel: \"stylesheet\",\n\t\t\t\t\t\t\tcrossorigin: \"anonymous\",\n\t\t\t\t\t\t\t...(v?.attrs ?? {}),\n\t\t\t\t\t\t\t...cusomize.attrs,\n\t\t\t\t\t\t};\n\t\t\t\t\t\tdescriptors.push({\n\t\t\t\t\t\t\ttag: \"link\",\n\t\t\t\t\t\t\tattrs,\n\t\t\t\t\t\t\t...cusomize,\n\t\t\t\t\t\t});\n\t\t\t\t\t});\n\t\t\t\t});\n\n\t\t\t\treturn descriptors;\n\t\t\t},\n\t\t},\n\t];\n\n\tif (isDev && enableInDevMode) {\n\t\tplugins.push(\n\t\t\tviteExternalsPlugin(externalMap, {\n\t\t\t\tenforce: \"pre\",\n\t\t\t})\n\t\t);\n\t}\n\n\treturn plugins;\n}\n\nexport { cdnImport };\n","import fs from \"fs\";\nimport path from \"path\";\nimport type { Plugin } from \"vite\";\nimport type { AutoImportOptions } from \"./type\";\n\n/**\n * TSX组件自动导入\n * @description 只会生成安装文件\n * @param options 组件文件夹路径\n */\nfunction tsxComponentAutoImport(options: string | AutoImportOptions): Plugin {\n\tif (!options) return;\n\n\treturn {\n\t\tname: \"fast-vite-plugin-tsx-component-auto-import\",\n\t\tbuildStart(): void | Promise<void> {\n\t\t\tconst dir = typeof options === \"string\" ? options : options.dir;\n\n\t\t\tconst defaultFormatter = (fName: string): string => {\n\t\t\t\treturn fName.charAt(0).toUpperCase() + fName.slice(1);\n\t\t\t};\n\n\t\t\tconst formatter = typeof options === \"string\" ? defaultFormatter : (options.formatter ?? defaultFormatter);\n\n\t\t\t// 获取所有文件夹名称\n\t\t\tconst cFiles = fs.readdirSync(dir, {\n\t\t\t\twithFileTypes: true,\n\t\t\t});\n\n\t\t\tif (cFiles?.length === 0) return;\n\n\t\t\t// 组件名称\n\t\t\tconst cNames = cFiles\n\t\t\t\t// 排除export文件\n\t\t\t\t.filter((f) => f.name !== \"index.ts\")\n\t\t\t\t.map((file) => {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tcomponentName: formatter(file.name),\n\t\t\t\t\t\tfileName: file.name,\n\t\t\t\t\t};\n\t\t\t\t})\n\t\t\t\t.sort((a, b) => {\n\t\t\t\t\tif (a.componentName < b.componentName) {\n\t\t\t\t\t\treturn -1;\n\t\t\t\t\t}\n\t\t\t\t\tif (a.componentName > b.componentName) {\n\t\t\t\t\t\treturn 1;\n\t\t\t\t\t}\n\t\t\t\t\treturn 0;\n\t\t\t\t});\n\n\t\t\tlet importContent = \"\";\n\t\t\tlet exportContent = \"\";\n\t\t\tlet typeContent = \"\";\n\n\t\t\tcNames.forEach(({ componentName, fileName }, idx) => {\n\t\t\t\timportContent += `import { ${componentName} } from \"./${fileName}\";\n`;\n\n\t\t\t\texportContent += `export * from \"./${fileName}\";\n`;\n\n\t\t\t\ttypeContent += `\t${componentName},`;\n\n\t\t\t\tif (idx + 1 < cNames.length) {\n\t\t\t\t\ttypeContent += \"\\n\";\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tfs.writeFileSync(\n\t\t\t\tpath.join(dir, \"index.ts\"),\n\t\t\t\t`import type { Plugin } from \"vue\";\n${importContent}\n${exportContent}\nexport default [\n${typeContent}\n] as Plugin[];\n`\n\t\t\t);\n\t\t},\n\t};\n}\n\n/**\n * VUE组件自动导入\n * @description 只会生成安装文件\n * @param options 组件文件夹路径\n */\nfunction vueComponentAutoImport(options: string | AutoImportOptions): Plugin {\n\tif (!options) return;\n\n\treturn {\n\t\tname: \"fast-vite-plugin-vue-component-auto-import\",\n\t\tbuildStart(): void | Promise<void> {\n\t\t\tconst dir = typeof options === \"string\" ? options : options.dir;\n\n\t\t\tconst defaultFormatter = (fName: string): string => {\n\t\t\t\treturn fName.charAt(0).toUpperCase() + fName.slice(1);\n\t\t\t};\n\n\t\t\tconst formatter = typeof options === \"string\" ? defaultFormatter : (options.formatter ?? defaultFormatter);\n\n\t\t\t// 获取所有文件夹名称\n\t\t\tconst cFiles = fs.readdirSync(dir, {\n\t\t\t\twithFileTypes: true,\n\t\t\t});\n\n\t\t\tif (cFiles?.length === 0) return;\n\n\t\t\t// 组件名称\n\t\t\tconst cNames = cFiles\n\t\t\t\t// 排除export文件\n\t\t\t\t.filter((f) => f.name !== \"index.ts\")\n\t\t\t\t.map((file) => {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tcomponentName: formatter(file.name),\n\t\t\t\t\t\tfileName: file.name,\n\t\t\t\t\t};\n\t\t\t\t})\n\t\t\t\t.sort((a, b) => {\n\t\t\t\t\tif (a.componentName < b.componentName) {\n\t\t\t\t\t\treturn -1;\n\t\t\t\t\t}\n\t\t\t\t\tif (a.componentName > b.componentName) {\n\t\t\t\t\t\treturn 1;\n\t\t\t\t\t}\n\t\t\t\t\treturn 0;\n\t\t\t\t});\n\n\t\t\tlet importContent = \"\";\n\t\t\tlet exportContent = \"\";\n\t\t\tlet typeContent = \"\";\n\n\t\t\tcNames.forEach(({ componentName, fileName }, idx) => {\n\t\t\t\timportContent += `import ${componentName} from \"./${fileName}/index.vue\";\n`;\n\n\t\t\t\texportContent += `export * from \"./${fileName}/index.vue\";\n`;\n\n\t\t\t\ttypeContent += `\t${componentName},`;\n\n\t\t\t\tif (idx + 1 < cNames.length) {\n\t\t\t\t\ttypeContent += \"\\n\";\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tfs.writeFileSync(\n\t\t\t\tpath.join(dir, \"index.ts\"),\n\t\t\t\t`import type { DefineComponent } from \"vue\";\n${importContent}\n${exportContent}\nexport default [\n${typeContent}\n] as unknown as DefineComponent[];\n`\n\t\t\t);\n\t\t},\n\t};\n}\n\nexport { tsxComponentAutoImport, vueComponentAutoImport };\n","import fs from \"fs\";\nimport path from \"path\";\nimport type { Plugin, ResolvedConfig } from \"vite\";\n\nfunction padZero(num: number, length = 2): string {\n\treturn num.toString().padStart(length, \"0\");\n}\n\nfunction formatDate(date: Date): string {\n\tconst year = date.getUTCFullYear();\n\tconst month = padZero(date.getUTCMonth() + 1);\n\tconst day = padZero(date.getUTCDate());\n\tconst hours = padZero(date.getUTCHours());\n\tconst minutes = padZero(date.getUTCMinutes());\n\tconst seconds = padZero(date.getUTCSeconds());\n\tconst milliseconds = padZero(date.getUTCMilliseconds(), 3);\n\n\treturn `Z ${year}-${month}-${day} ${hours}:${minutes}:${seconds}.${milliseconds}`;\n}\n\n/**\n * 版本更新插件\n * @param version 不要携带 'v',示例:1.0.0\n * @returns\n */\nfunction versionUpdatePlugin(version: string): Plugin {\n\tlet config: ResolvedConfig;\n\n\treturn {\n\t\tname: \"fast-vite-plugin-version-update\",\n\t\tconfigResolved: (resolvedConfig: ResolvedConfig): void | Promise<void> => {\n\t\t\t// 存储最终解析的配置\n\t\t\tconfig = resolvedConfig;\n\t\t},\n\t\tbuildStart(): void | Promise<void> {\n\t\t\tconst curDate = new Date();\n\n\t\t\tconst dateTime = formatDate(curDate);\n\n\t\t\tconst versionDir = config.publicDir;\n\t\t\tconst versionPath = path.join(versionDir, \"version.json\");\n\t\t\tif (!fs.existsSync(versionDir)) {\n\t\t\t\tfs.mkdirSync(versionDir);\n\t\t\t}\n\n\t\t\t// 写入版本信息文件\n\t\t\tconst content = JSON.stringify({ version: `v${version}`, dateTime }, null, 4);\n\t\t\tfs.writeFileSync(versionPath, content);\n\n\t\t\tconst pkgPath = path.join(config.base, \"package.json\");\n\t\t\tif (fs.existsSync(pkgPath)) {\n\t\t\t\tconst pkgJson = JSON.parse(fs.readFileSync(pkgPath, \"utf-8\"));\n\t\t\t\tpkgJson.version = version;\n\t\t\t\tfs.writeFileSync(pkgPath, JSON.stringify(pkgJson, null, 2), \"utf-8\");\n\t\t\t}\n\t\t},\n\t};\n}\n\nexport { versionUpdatePlugin };\n"],"mappings":"AAAA,OAAOA,MAAQ,KACf,OAAOC,MAAU,OAOjB,IAAMC,EAAeC,GAAoF,CAExG,IAAMC,EAAkF,CAAC,EAMzF,OAJiBJ,EAAG,YAAYG,EAAK,CACpC,cAAe,EAChB,CAAC,EAEQ,QAASE,GAAS,CAC1B,GAAIA,EAAK,YAAY,EACpBD,EAAY,KAAK,GAAGF,EAAYD,EAAK,KAAKE,EAAKE,EAAK,IAAI,CAAC,CAAC,MACpD,CACN,IAAMC,EAAWD,EAAK,KAAK,QAAQ,OAAQ,EAAE,EAEvCE,EAAaP,EACjB,aAAaC,EAAK,KAAKE,EAAKE,EAAK,IAAI,EAAG,OAAO,EAC/C,QAAQ,eAAgB,EAAE,EAC1B,QAAQ,oBAAqB,EAAE,EAE/B,UAAU,EACV,QAAQ,EAER,QAAQ,kBAAmB,CAACG,EAAOC,IAAS,CAC5C,IAAMC,EAAeD,EAAK,MAAM,iBAAiB,EAC3CE,EAAaF,EAAK,MAAM,eAAe,EACvCG,EAAcH,EAAK,MAAM,gBAAgB,EAC3CI,EAAQ,KACRC,EAAS,KACTH,IACHE,EAAQF,EAAW,CAAC,GAEjBC,IACHE,EAASF,EAAY,CAAC,GAEvB,IAAIG,EAAiB,GACrB,OAAKL,EAGJK,EAAiBL,EAAa,CAAC,EAF/BK,EAAiB,gBAAgBF,CAAK,IAAIC,CAAM,IAI1C,2CAA2CC,CAAc,GACjE,CAAC,EAEFX,EAAY,KAAK,CAEhB,SAAAE,EACA,cAAeA,EAAS,OAAO,CAAC,EAAE,YAAY,EAAIA,EAAS,MAAM,CAAC,EAClE,YAAaC,CACd,CAAC,CACF,CACD,CAAC,EAEMH,EAAY,KAAK,CAACY,EAAGC,IACvBD,EAAE,SAAWC,EAAE,SACX,GAEJD,EAAE,SAAWC,EAAE,SACX,EAED,CACP,CACF,EAKMC,EAAe,CAACC,EAAuBC,EAAiBb,IAA6B,CAC1FP,EAAG,UAAUoB,EAAS,CAAE,UAAW,EAAK,CAAC,EAEzC,IAAMC,EAAmB;AAAA;AAAA;AAAA,KAGrBF,CAAa;AAAA;AAAA,eAEHA,CAAa;AAAA,UAClBA,CAAa;AAAA;AAAA;AAAA,EAGrBZ,EACA,MAAM;AAAA,CAAI,EACV,IAAKe,GAAS,MAAMA,CAAI,EAAE,EAC1B,KAAK;AAAA,CAAI,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,iBAKKH,CAAa;AAAA,EAG7BnB,EAAG,cAAcC,EAAK,KAAKmB,EAAS,WAAW,EAAGC,CAAgB,CACnE,EAOA,SAASE,EAAapB,EAAaqB,EAA0B,CAC5D,GAAI,CAACrB,GAAO,CAACqB,EAAU,OAEvB,IAAIC,EAEJ,MAAO,CACN,KAAM,kCACN,eAAiBC,GAAyD,CAEzED,EAASC,CACV,EACA,YAAmC,CAClC,IAAMC,EAAWzB,EAAYD,EAAK,QAAQwB,EAAO,KAAMtB,CAAG,CAAC,EAErDyB,EAAY3B,EAAK,QAAQwB,EAAO,KAAMD,CAAQ,EACpDxB,EAAG,UAAU4B,EAAW,CAAE,UAAW,EAAK,CAAC,EAE3C,IAAIC,EAAoB,GACpBC,EAAkB,GAClBC,EAAgB,GAEpBJ,EAAS,QAAQ,CAACK,EAAKC,IAAQ,CAC9Bf,EAAac,EAAI,cAAe/B,EAAK,KAAK2B,EAAWI,EAAI,QAAQ,EAAGA,EAAI,WAAW,EAEnFH,GAAqB,YAAYG,EAAI,aAAa,cAAcA,EAAI,QAAQ;AAAA,EAG5EF,GAAmB,IAAIE,EAAI,aAAa,IAExCD,GAAiB,oBAAoBC,EAAI,QAAQ;AAAA,EAG7CC,EAAM,EAAIN,EAAS,SACtBG,GAAmB;AAAA,EAErB,CAAC,EAED9B,EAAG,cACFC,EAAK,KAAK2B,EAAW,UAAU,EAC/B;AAAA,EACFC,CAAiB;AAAA,EACjBE,CAAa;AAAA;AAAA,EAEbD,CAAe;AAAA;AAAA,CAGd,CACD,CACD,CACD,CC1JA,OAAOI,MAAQ,KACf,OAAOC,MAAU,OACjB,OAAOC,MAAqB,iCAE5B,OAAS,uBAAAC,MAA2B,wBAGpC,IAAMC,EAAQ,QAAQ,IAAI,WAAa,cAOvC,SAASC,EAAiBC,EAAsB,CAC/C,IAAMC,EAAM,QAAQ,IAAI,EAClBC,EAAUP,EAAK,KAAKM,EAAK,eAAgBD,EAAM,cAAc,EACnE,OAAIN,EAAG,WAAWQ,CAAO,EACR,KAAK,MAAMR,EAAG,aAAaQ,EAAS,MAAM,CAAC,EAC5C,QAGT,EACR,CAOA,SAASC,EAAWR,EAAuB,CAC1C,MAAO,GAAAA,EAAK,WAAW,OAAO,GAAKA,EAAK,WAAW,QAAQ,GAAKA,EAAK,WAAW,IAAI,EACrF,CAEA,SAASS,EACRC,EACAC,EAKS,CACT,GAAM,CAAE,KAAAX,CAAK,EAAIW,EACjB,OAAIH,EAAWR,CAAI,IAClBU,EAAMV,GAEAU,EACL,QAAQ,YAAaC,EAAK,IAAI,EAC9B,QAAQ,eAAgBA,EAAK,OAAO,EACpC,QAAQ,YAAaX,CAAI,CAC5B,CAEA,SAASY,EAAcC,EAAgBC,EAAuE,CAC7GA,EAAUD,EAAO,SAAWC,EAC5B,IAAMC,EAAIF,EACJG,EAAUH,EAAO,SAAWT,EAAiBW,EAAE,IAAI,EACrDE,EAAqB,CAAC,EACrB,MAAM,QAAQF,EAAE,IAAI,EAGxBE,EAAWF,EAAE,KAFbE,EAAS,KAAKF,EAAE,IAAI,EAKrB,IAAMJ,EAAO,CACZ,GAAGI,EACH,QAAAC,CACD,EAEAC,EAAWA,EAAS,IAAKC,GAAM,CAC9B,GAAI,CAACF,GAAW,CAACR,EAAWU,CAAC,EAC5B,MAAM,IAAI,MAAM,YAAYP,EAAK,IAAI,mCAAmC,EAEzE,OAAOF,EAAUK,EAAS,CACzB,KAAMH,EAAK,KACX,QAASA,EAAK,QACd,KAAMO,CACP,CAAC,CACF,CAAC,EAED,IAAIC,EAAMJ,EAAE,KAAO,CAAC,EAChB,CAAC,MAAM,QAAQI,CAAG,GAAKA,IAC1BA,EAAM,CAACA,CAAG,GAGX,IAAMC,EAAW,MAAM,QAAQD,CAAG,EAE/BA,EAAI,IAAKE,GACTZ,EAAUK,EAAS,CAClB,KAAMH,EAAK,KACX,QAASA,EAAK,QACd,KAAMU,CACP,CAAC,CACF,EAPC,CAAC,EASJ,MAAO,CACN,GAAGN,EACH,QAAAC,EACA,SAAAC,EACA,QAAAG,CACD,CACD,CAOA,SAASE,EAAUC,EAAqC,CACvD,GAAM,CACL,QAAAC,EAAU,CAAC,EACX,QAAAV,EAAU,uDACV,gBAAAW,EAAkB,GAClB,mBAAAC,EACA,kBAAAC,CACD,EAAIJ,EAEAK,EAAU,GAERjB,GAAQ,MAAM,QAAQa,CAAO,EAAIA,EAAU,CAACA,CAAO,GACvD,IAAKT,GAAO,OAAOA,GAAM,WAAaA,EAAED,CAAO,EAAIC,CAAE,EACrD,IAAKA,GAAMH,EAAcG,EAAGD,CAAO,CAAC,EAEhCe,EAEF,CAAC,EAELlB,EAAK,QAASI,GAAM,CACnBc,EAAYd,EAAE,IAAI,EAAIA,EAAE,IACpB,MAAM,QAAQA,EAAE,KAAK,GACxBA,EAAE,MAAM,QAASe,GAAU,CAC1BD,EAAYC,CAAK,EAAIf,EAAE,GACxB,CAAC,CAEH,CAAC,EAED,IAAMgB,EAAoB,CACzB,CACC,KAAM,8BACN,QAAS,MACT,OAAOC,EAAG,CAAE,QAAAC,CAAQ,EAAe,CAClCL,EAAUK,IAAY,QAEtB,IAAMC,EAAyB,CAC9B,MAAO,CACN,cAAe,CACd,QAAS,CAAC,CACX,CACD,CACD,EAEA,OAAIN,IACHM,EAAW,MAAM,cAAc,QAAU,CAACjC,EAAgB4B,CAAW,CAAC,GAGhEK,CACR,EACA,mBAAmBC,EAAoC,CACtD,GAAI,CAACP,GAAW,CAACH,EAChB,OAAOU,EAGR,IAAMC,EAAmC,CAAC,EAE1C,OAAAzB,EAAK,QAASI,GAAM,CACnBA,EAAE,SAAS,QAASL,GAAQ,CAC3B,IAAM2B,EAAWV,IAAoBZ,EAAE,KAAML,CAAG,GAAK,CAAC,EAChD4B,EAAQ,CACb,IAAK5B,EACL,YAAa,YACb,GAAIK,GAAG,OAAS,CAAC,EACjB,GAAGsB,EAAS,KACb,EAEAD,EAAY,KAAK,CAChB,IAAK,SACL,MAAAE,EACA,GAAGD,CACJ,CAAC,CACF,CAAC,EACDtB,EAAE,QAAQ,QAASL,GAAQ,CAC1B,IAAM2B,EAAWX,IAAqBX,EAAE,KAAML,CAAG,GAAK,CAAC,EACjD4B,EAAQ,CACb,KAAM5B,EACN,IAAK,aACL,YAAa,YACb,GAAIK,GAAG,OAAS,CAAC,EACjB,GAAGsB,EAAS,KACb,EACAD,EAAY,KAAK,CAChB,IAAK,OACL,MAAAE,EACA,GAAGD,CACJ,CAAC,CACF,CAAC,CACF,CAAC,EAEMD,CACR,CACD,CACD,EAEA,OAAIjC,GAASsB,GACZM,EAAQ,KACP7B,EAAoB2B,EAAa,CAChC,QAAS,KACV,CAAC,CACF,EAGME,CACR,CClNA,OAAOQ,MAAQ,KACf,OAAOC,MAAU,OASjB,SAASC,EAAuBC,EAA6C,CAC5E,GAAKA,EAEL,MAAO,CACN,KAAM,6CACN,YAAmC,CAClC,IAAMC,EAAM,OAAOD,GAAY,SAAWA,EAAUA,EAAQ,IAEtDE,EAAoBC,GAClBA,EAAM,OAAO,CAAC,EAAE,YAAY,EAAIA,EAAM,MAAM,CAAC,EAG/CC,EAAY,OAAOJ,GAAY,SAAWE,EAAoBF,EAAQ,WAAaE,EAGnFG,EAASR,EAAG,YAAYI,EAAK,CAClC,cAAe,EAChB,CAAC,EAED,GAAII,GAAQ,SAAW,EAAG,OAG1B,IAAMC,EAASD,EAEb,OAAQE,GAAMA,EAAE,OAAS,UAAU,EACnC,IAAKC,IACE,CACN,cAAeJ,EAAUI,EAAK,IAAI,EAClC,SAAUA,EAAK,IAChB,EACA,EACA,KAAK,CAACC,EAAGC,IACLD,EAAE,cAAgBC,EAAE,cAChB,GAEJD,EAAE,cAAgBC,EAAE,cAChB,EAED,CACP,EAEEC,EAAgB,GAChBC,EAAgB,GAChBC,EAAc,GAElBP,EAAO,QAAQ,CAAC,CAAE,cAAAQ,EAAe,SAAAC,CAAS,EAAGC,IAAQ,CACpDL,GAAiB,YAAYG,CAAa,cAAcC,CAAQ;AAAA,EAGhEH,GAAiB,oBAAoBG,CAAQ;AAAA,EAG7CF,GAAe,IAAIC,CAAa,IAE5BE,EAAM,EAAIV,EAAO,SACpBO,GAAe;AAAA,EAEjB,CAAC,EAEDhB,EAAG,cACFC,EAAK,KAAKG,EAAK,UAAU,EACzB;AAAA,EACFU,CAAa;AAAA,EACbC,CAAa;AAAA;AAAA,EAEbC,CAAW;AAAA;AAAA,CAGV,CACD,CACD,CACD,CAOA,SAASI,EAAuBjB,EAA6C,CAC5E,GAAKA,EAEL,MAAO,CACN,KAAM,6CACN,YAAmC,CAClC,IAAMC,EAAM,OAAOD,GAAY,SAAWA,EAAUA,EAAQ,IAEtDE,EAAoBC,GAClBA,EAAM,OAAO,CAAC,EAAE,YAAY,EAAIA,EAAM,MAAM,CAAC,EAG/CC,EAAY,OAAOJ,GAAY,SAAWE,EAAoBF,EAAQ,WAAaE,EAGnFG,EAASR,EAAG,YAAYI,EAAK,CAClC,cAAe,EAChB,CAAC,EAED,GAAII,GAAQ,SAAW,EAAG,OAG1B,IAAMC,EAASD,EAEb,OAAQE,GAAMA,EAAE,OAAS,UAAU,EACnC,IAAKC,IACE,CACN,cAAeJ,EAAUI,EAAK,IAAI,EAClC,SAAUA,EAAK,IAChB,EACA,EACA,KAAK,CAACC,EAAGC,IACLD,EAAE,cAAgBC,EAAE,cAChB,GAEJD,EAAE,cAAgBC,EAAE,cAChB,EAED,CACP,EAEEC,EAAgB,GAChBC,EAAgB,GAChBC,EAAc,GAElBP,EAAO,QAAQ,CAAC,CAAE,cAAAQ,EAAe,SAAAC,CAAS,EAAGC,IAAQ,CACpDL,GAAiB,UAAUG,CAAa,YAAYC,CAAQ;AAAA,EAG5DH,GAAiB,oBAAoBG,CAAQ;AAAA,EAG7CF,GAAe,IAAIC,CAAa,IAE5BE,EAAM,EAAIV,EAAO,SACpBO,GAAe;AAAA,EAEjB,CAAC,EAEDhB,EAAG,cACFC,EAAK,KAAKG,EAAK,UAAU,EACzB;AAAA,EACFU,CAAa;AAAA,EACbC,CAAa;AAAA;AAAA,EAEbC,CAAW;AAAA;AAAA,CAGV,CACD,CACD,CACD,CC/JA,OAAOK,MAAQ,KACf,OAAOC,MAAU,OAGjB,SAASC,EAAQC,EAAaC,EAAS,EAAW,CACjD,OAAOD,EAAI,SAAS,EAAE,SAASC,EAAQ,GAAG,CAC3C,CAEA,SAASC,EAAWC,EAAoB,CACvC,IAAMC,EAAOD,EAAK,eAAe,EAC3BE,EAAQN,EAAQI,EAAK,YAAY,EAAI,CAAC,EACtCG,EAAMP,EAAQI,EAAK,WAAW,CAAC,EAC/BI,EAAQR,EAAQI,EAAK,YAAY,CAAC,EAClCK,EAAUT,EAAQI,EAAK,cAAc,CAAC,EACtCM,EAAUV,EAAQI,EAAK,cAAc,CAAC,EACtCO,EAAeX,EAAQI,EAAK,mBAAmB,EAAG,CAAC,EAEzD,MAAO,KAAKC,CAAI,IAAIC,CAAK,IAAIC,CAAG,IAAIC,CAAK,IAAIC,CAAO,IAAIC,CAAO,IAAIC,CAAY,EAChF,CAOA,SAASC,EAAoBC,EAAyB,CACrD,IAAIC,EAEJ,MAAO,CACN,KAAM,kCACN,eAAiBC,GAAyD,CAEzED,EAASC,CACV,EACA,YAAmC,CAGlC,IAAMC,EAAWb,EAFD,IAAI,IAEe,EAE7Bc,EAAaH,EAAO,UACpBI,EAAcnB,EAAK,KAAKkB,EAAY,cAAc,EACnDnB,EAAG,WAAWmB,CAAU,GAC5BnB,EAAG,UAAUmB,CAAU,EAIxB,IAAME,EAAU,KAAK,UAAU,CAAE,QAAS,IAAIN,CAAO,GAAI,SAAAG,CAAS,EAAG,KAAM,CAAC,EAC5ElB,EAAG,cAAcoB,EAAaC,CAAO,EAErC,IAAMC,EAAUrB,EAAK,KAAKe,EAAO,KAAM,cAAc,EACrD,GAAIhB,EAAG,WAAWsB,CAAO,EAAG,CAC3B,IAAMC,EAAU,KAAK,MAAMvB,EAAG,aAAasB,EAAS,OAAO,CAAC,EAC5DC,EAAQ,QAAUR,EAClBf,EAAG,cAAcsB,EAAS,KAAK,UAAUC,EAAS,KAAM,CAAC,EAAG,OAAO,CACpE,CACD,CACD,CACD","names":["fs","path","findSvgFile","dir","svgContents","file","iconName","svgContent","match","attr","viewBoxMatch","widthMatch","heightMatch","width","height","viewBoxContent","a","b","writeTSXIcon","componentName","iconDir","componentContent","line","buildSvgIcon","writeDir","config","resolvedConfig","svgFiles","iconsPath","iconImportContent","iconTypeContent","exportContent","svg","idx","fs","path","externalGlobals","viteExternalsPlugin","isDev","getModuleVersion","name","pwd","pkgFile","isFullPath","renderUrl","url","data","getModuleInfo","module","prodUrl","v","version","pathList","p","css","cssList","c","cdnImport","options","modules","enableInDevMode","generateCssLinkTag","generateScriptTag","isBuild","externalMap","alias","plugins","_","command","userConfig","html","descriptors","cusomize","attrs","fs","path","tsxComponentAutoImport","options","dir","defaultFormatter","fName","formatter","cFiles","cNames","f","file","a","b","importContent","exportContent","typeContent","componentName","fileName","idx","vueComponentAutoImport","fs","path","padZero","num","length","formatDate","date","year","month","day","hours","minutes","seconds","milliseconds","versionUpdatePlugin","version","config","resolvedConfig","dateTime","versionDir","versionPath","content","pkgPath","pkgJson"]}
1
+ {"version":3,"sources":["../../src/buildSvgIcon/index.ts","../../src/cdnImport/index.ts","../../src/componentAutoImport/index.ts","../../src/versionUpdate/index.ts"],"sourcesContent":["import fs from \"fs\";\nimport path from \"path\";\nimport type { Plugin, ResolvedConfig } from \"vite\";\n\n/**\n * 查找 svg 文件\n */\n\nconst findSvgFile = (dir: string): { iconName: string; componentName: string; iconContent: string }[] => {\n\t// svg 内容\n\tconst svgContents: { iconName: string; componentName: string; iconContent: string }[] = [];\n\t// 获取当前目录下的文件\n\tconst svgFiles = fs.readdirSync(dir, {\n\t\twithFileTypes: true,\n\t});\n\n\tsvgFiles.forEach((file) => {\n\t\tif (file.isDirectory()) {\n\t\t\tsvgContents.push(...findSvgFile(path.join(dir, file.name)));\n\t\t} else {\n\t\t\tconst iconName = file.name.replace(\".svg\", \"\");\n\n\t\t\tconst svgContent = fs\n\t\t\t\t.readFileSync(path.join(dir, file.name), \"utf-8\")\n\t\t\t\t.replace(/<\\?xml.*?\\?>/, \"\")\n\t\t\t\t.replace(/<!DOCTYPE svg.*?>/, \"\")\n\t\t\t\t// .replace(/(\\r)|(\\n)/g, \"\")\n\t\t\t\t.trimStart()\n\t\t\t\t.trimEnd()\n\t\t\t\t// .replace(/(fill=\"[^>+].*?\")/g, 'fill=\"\"')\n\t\t\t\t.replace(/<svg([^>+].*?)>/, (match, attr) => {\n\t\t\t\t\tconst viewBoxMatch = attr.match(/viewBox=\"[^\"]+\"/);\n\t\t\t\t\tconst widthMatch = attr.match(/width=\"(\\d+)\"/);\n\t\t\t\t\tconst heightMatch = attr.match(/height=\"(\\d+)\"/);\n\t\t\t\t\tlet width = 1024;\n\t\t\t\t\tlet height = 1024;\n\t\t\t\t\tif (widthMatch) {\n\t\t\t\t\t\twidth = widthMatch[0];\n\t\t\t\t\t}\n\t\t\t\t\tif (heightMatch) {\n\t\t\t\t\t\theight = heightMatch[0];\n\t\t\t\t\t}\n\t\t\t\t\tlet viewBoxContent = \"\";\n\t\t\t\t\tif (!viewBoxMatch) {\n\t\t\t\t\t\tviewBoxContent = `viewBox=\"0 0 ${width} ${height}\"`;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tviewBoxContent = viewBoxMatch[0];\n\t\t\t\t\t}\n\t\t\t\t\treturn `<svg xmlns=\"http://www.w3.org/2000/svg\" ${viewBoxContent}>`;\n\t\t\t\t});\n\n\t\t\tsvgContents.push({\n\t\t\t\t// iconName: iconName.charAt(0).toUpperCase() + iconName.slice(1),\n\t\t\t\ticonName,\n\t\t\t\tcomponentName: iconName.charAt(0).toUpperCase() + iconName.slice(1),\n\t\t\t\ticonContent: svgContent,\n\t\t\t});\n\t\t}\n\t});\n\n\treturn svgContents.sort((a, b) => {\n\t\tif (a.iconName < b.iconName) {\n\t\t\treturn -1;\n\t\t}\n\t\tif (a.iconName > b.iconName) {\n\t\t\treturn 1;\n\t\t}\n\t\treturn 0;\n\t});\n};\n\n/**\n * 写入 TSX 图标\n */\nconst writeTSXIcon = (componentName: string, iconDir: string, svgContent: string): void => {\n\tfs.mkdirSync(iconDir, { recursive: true });\n\n\tconst componentContent = `import { defineComponent } from \"vue\";\n\n/**\n * ${componentName} 图标组件\n */\nexport const ${componentName} = defineComponent({\n\tname: \"${componentName}\",\n\trender() {\n\t\treturn (\n${svgContent\n\t.split(\"\\n\")\n\t.map((line) => `\t\t\t${line}`)\n\t.join(\"\\n\")}\n\t\t);\n\t},\n});\n\nexport default ${componentName};\n`;\n\n\tfs.writeFileSync(path.join(iconDir, \"index.tsx\"), componentContent);\n};\n\n/**\n * 构建 svg 图标组件\n * @param dir svg 文件路径\n * @param writeDir 写入的文件路径 相对的即可\n */\nfunction buildSvgIcon(dir: string, writeDir: string): Plugin {\n\tif (!dir || !writeDir) return;\n\n\tlet config: ResolvedConfig;\n\n\treturn {\n\t\tname: \"fast-vite-plugin-build-svg-icon\",\n\t\tconfigResolved: (resolvedConfig: ResolvedConfig): void | Promise<void> => {\n\t\t\t// 存储最终解析的配置\n\t\t\tconfig = resolvedConfig;\n\t\t},\n\t\tbuildStart(): void | Promise<void> {\n\t\t\tconst svgFiles = findSvgFile(path.resolve(config.root, dir));\n\n\t\t\tconst iconsPath = path.resolve(config.root, writeDir);\n\t\t\tfs.mkdirSync(iconsPath, { recursive: true });\n\n\t\t\tlet iconImportContent = \"\";\n\t\t\tlet iconTypeContent = \"\";\n\t\t\tlet exportContent = \"\";\n\n\t\t\tsvgFiles.forEach((svg, idx) => {\n\t\t\t\twriteTSXIcon(svg.componentName, path.join(iconsPath, svg.iconName), svg.iconContent);\n\n\t\t\t\ticonImportContent += `import { ${svg.componentName} } from \"./${svg.iconName}\";\n`;\n\n\t\t\t\ticonTypeContent += `\t${svg.componentName},`;\n\n\t\t\t\texportContent += `export * from \"./${svg.iconName}\";\n`;\n\n\t\t\t\tif (idx + 1 < svgFiles.length) {\n\t\t\t\t\ticonTypeContent += \"\\n\";\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tfs.writeFileSync(\n\t\t\t\tpath.join(iconsPath, \"index.ts\"),\n\t\t\t\t`import type { DefineComponent } from \"vue\";\n${iconImportContent}\n${exportContent}\nexport default [\n${iconTypeContent}\n] as unknown as DefineComponent[];\n`\n\t\t\t);\n\t\t},\n\t};\n}\n\nexport { findSvgFile, writeTSXIcon, buildSvgIcon };\n","import fs from \"fs\";\nimport path from \"path\";\nimport externalGlobals from \"rollup-plugin-external-globals\";\nimport { viteExternalsPlugin } from \"vite-plugin-externals\";\nimport type { CdnImportOptions, Module } from \"./type\";\nimport type { HtmlTagDescriptor, Plugin, UserConfig } from \"vite\";\n\nconst isDev = process.env.NODE_ENV === \"development\";\n\n/**\n * get npm module version\n * @param name\n * @returns\n */\nfunction getModuleVersion(name: string): string {\n\tconst pwd = process.cwd();\n\tconst pkgFile = path.join(pwd, \"node_modules\", name, \"package.json\");\n\tif (fs.existsSync(pkgFile)) {\n\t\tconst pkgJson = JSON.parse(fs.readFileSync(pkgFile, \"utf8\"));\n\t\treturn pkgJson.version;\n\t}\n\n\treturn \"\";\n}\n\n/**\n * 是否完整的 url\n * @param path\n * @returns\n */\nfunction isFullPath(path: string): boolean {\n\treturn path.startsWith(\"http:\") || path.startsWith(\"https:\") || path.startsWith(\"//\") ? true : false;\n}\n\nfunction renderUrl(\n\turl: string,\n\tdata: {\n\t\tname: string;\n\t\tversion: string;\n\t\tpath: string;\n\t}\n): string {\n\tconst { path } = data;\n\tif (isFullPath(path)) {\n\t\turl = path;\n\t}\n\treturn url\n\t\t.replace(/\\{name\\}/g, data.name)\n\t\t.replace(/\\{version\\}/g, data.version)\n\t\t.replace(/\\{path\\}/g, path);\n}\n\nfunction getModuleInfo(module: Module, prodUrl: string): Module & { pathList?: string[]; cssList?: string[] } {\n\tprodUrl = module.prodUrl || prodUrl;\n\tconst v = module;\n\tconst version = module.version || getModuleVersion(v.name);\n\tlet pathList: string[] = [];\n\tif (!Array.isArray(v.path)) {\n\t\tpathList.push(v.path);\n\t} else {\n\t\tpathList = v.path;\n\t}\n\n\tconst data = {\n\t\t...v,\n\t\tversion,\n\t};\n\n\tpathList = pathList.map((p) => {\n\t\tif (!version && !isFullPath(p)) {\n\t\t\tthrow new Error(`modules: ${data.name} package.json file does not exist`);\n\t\t}\n\t\treturn renderUrl(prodUrl, {\n\t\t\tname: data.name,\n\t\t\tversion: data.version,\n\t\t\tpath: p,\n\t\t});\n\t});\n\n\tlet css = v.css || [];\n\tif (!Array.isArray(css) && css) {\n\t\tcss = [css];\n\t}\n\n\tconst cssList = !Array.isArray(css)\n\t\t? []\n\t\t: css.map((c) =>\n\t\t\t\trenderUrl(prodUrl, {\n\t\t\t\t\tname: data.name,\n\t\t\t\t\tversion: data.version,\n\t\t\t\t\tpath: c,\n\t\t\t\t})\n\t\t\t);\n\n\treturn {\n\t\t...v,\n\t\tversion,\n\t\tpathList,\n\t\tcssList,\n\t};\n}\n\n/**\n * CDN 导入\n * @param options\n * @returns\n */\nfunction cdnImport(options: CdnImportOptions): Plugin[] {\n\tconst {\n\t\tmodules = [],\n\t\tprodUrl = \"https://cdn.jsdelivr.net/npm/{name}@{version}/{path}\",\n\t\tenableInDevMode = false,\n\t\tgenerateCssLinkTag,\n\t\tgenerateScriptTag,\n\t} = options;\n\n\tlet isBuild = false;\n\n\tconst data = (Array.isArray(modules) ? modules : [modules])\n\t\t.map((v) => (typeof v === \"function\" ? v(prodUrl) : v))\n\t\t.map((v) => getModuleInfo(v, prodUrl));\n\n\tconst externalMap: {\n\t\t[name: string]: string;\n\t} = {};\n\n\tdata.forEach((v) => {\n\t\texternalMap[v.name] = v.var;\n\t\tif (Array.isArray(v.alias)) {\n\t\t\tv.alias.forEach((alias) => {\n\t\t\t\texternalMap[alias] = v.var;\n\t\t\t});\n\t\t}\n\t});\n\n\tconst plugins: Plugin[] = [\n\t\t{\n\t\t\tname: \"fast-vite-plugin-cdn-import\",\n\t\t\tenforce: \"pre\",\n\t\t\tconfig(_, { command }): UserConfig {\n\t\t\t\tisBuild = command === \"build\";\n\n\t\t\t\tconst userConfig: UserConfig = {\n\t\t\t\t\tbuild: {\n\t\t\t\t\t\trollupOptions: {\n\t\t\t\t\t\t\tplugins: [],\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t};\n\n\t\t\t\tif (isBuild) {\n\t\t\t\t\tuserConfig.build.rollupOptions.plugins = [externalGlobals(externalMap)];\n\t\t\t\t}\n\n\t\t\t\treturn userConfig;\n\t\t\t},\n\t\t\ttransformIndexHtml(html): string | HtmlTagDescriptor[] {\n\t\t\t\tif (!isBuild && !enableInDevMode) {\n\t\t\t\t\treturn html;\n\t\t\t\t}\n\n\t\t\t\tconst descriptors: HtmlTagDescriptor[] = [];\n\n\t\t\t\tdata.forEach((v) => {\n\t\t\t\t\tv.pathList.forEach((url) => {\n\t\t\t\t\t\tconst cusomize = generateScriptTag?.(v.name, url) || {};\n\t\t\t\t\t\tconst attrs = {\n\t\t\t\t\t\t\tsrc: url,\n\t\t\t\t\t\t\tcrossorigin: \"anonymous\",\n\t\t\t\t\t\t\t...(v?.attrs ?? {}),\n\t\t\t\t\t\t\t...cusomize.attrs,\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\tdescriptors.push({\n\t\t\t\t\t\t\ttag: \"script\",\n\t\t\t\t\t\t\tattrs,\n\t\t\t\t\t\t\t...cusomize,\n\t\t\t\t\t\t});\n\t\t\t\t\t});\n\t\t\t\t\tv.cssList.forEach((url) => {\n\t\t\t\t\t\tconst cusomize = generateCssLinkTag?.(v.name, url) || {};\n\t\t\t\t\t\tconst attrs = {\n\t\t\t\t\t\t\thref: url,\n\t\t\t\t\t\t\trel: \"stylesheet\",\n\t\t\t\t\t\t\tcrossorigin: \"anonymous\",\n\t\t\t\t\t\t\t...(v?.attrs ?? {}),\n\t\t\t\t\t\t\t...cusomize.attrs,\n\t\t\t\t\t\t};\n\t\t\t\t\t\tdescriptors.push({\n\t\t\t\t\t\t\ttag: \"link\",\n\t\t\t\t\t\t\tattrs,\n\t\t\t\t\t\t\t...cusomize,\n\t\t\t\t\t\t});\n\t\t\t\t\t});\n\t\t\t\t});\n\n\t\t\t\treturn descriptors;\n\t\t\t},\n\t\t},\n\t];\n\n\tif (isDev && enableInDevMode) {\n\t\tplugins.push(\n\t\t\tviteExternalsPlugin(externalMap, {\n\t\t\t\tenforce: \"pre\",\n\t\t\t})\n\t\t);\n\t}\n\n\treturn plugins;\n}\n\nexport { cdnImport };\n","import fs from \"fs\";\nimport path from \"path\";\nimport type { AutoImportOptions } from \"./type\";\nimport type { Plugin } from \"vite\";\n\n/**\n * TSX组件自动导入\n * @description 只会生成安装文件\n * @param options 组件文件夹路径\n */\nfunction tsxComponentAutoImport(options: string | AutoImportOptions): Plugin {\n\tif (!options) return;\n\n\treturn {\n\t\tname: \"fast-vite-plugin-tsx-component-auto-import\",\n\t\tbuildStart(): void | Promise<void> {\n\t\t\tconst dir = typeof options === \"string\" ? options : options.dir;\n\n\t\t\tconst defaultFormatter = (fName: string): string => {\n\t\t\t\treturn fName.charAt(0).toUpperCase() + fName.slice(1);\n\t\t\t};\n\n\t\t\tconst formatter = typeof options === \"string\" ? defaultFormatter : (options.formatter ?? defaultFormatter);\n\n\t\t\t// 获取所有文件夹名称\n\t\t\tconst cFiles = fs.readdirSync(dir, {\n\t\t\t\twithFileTypes: true,\n\t\t\t});\n\n\t\t\tif (cFiles?.length === 0) return;\n\n\t\t\t// 组件名称\n\t\t\tconst cNames = cFiles\n\t\t\t\t// 排除export文件\n\t\t\t\t.filter((f) => f.name !== \"index.ts\")\n\t\t\t\t.map((file) => {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tcomponentName: formatter(file.name),\n\t\t\t\t\t\tfileName: file.name,\n\t\t\t\t\t};\n\t\t\t\t})\n\t\t\t\t.sort((a, b) => {\n\t\t\t\t\tif (a.componentName < b.componentName) {\n\t\t\t\t\t\treturn -1;\n\t\t\t\t\t}\n\t\t\t\t\tif (a.componentName > b.componentName) {\n\t\t\t\t\t\treturn 1;\n\t\t\t\t\t}\n\t\t\t\t\treturn 0;\n\t\t\t\t});\n\n\t\t\tlet importContent = \"\";\n\t\t\tlet exportContent = \"\";\n\t\t\tlet typeContent = \"\";\n\n\t\t\tcNames.forEach(({ componentName, fileName }, idx) => {\n\t\t\t\timportContent += `import { ${componentName} } from \"./${fileName}\";\n`;\n\n\t\t\t\texportContent += `export * from \"./${fileName}\";\n`;\n\n\t\t\t\ttypeContent += `\t${componentName},`;\n\n\t\t\t\tif (idx + 1 < cNames.length) {\n\t\t\t\t\ttypeContent += \"\\n\";\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tfs.writeFileSync(\n\t\t\t\tpath.join(dir, \"index.ts\"),\n\t\t\t\t`import type { Plugin } from \"vue\";\n${importContent}\n${exportContent}\nexport default [\n${typeContent}\n] as Plugin[];\n`\n\t\t\t);\n\t\t},\n\t};\n}\n\n/**\n * VUE组件自动导入\n * @description 只会生成安装文件\n * @param options 组件文件夹路径\n */\nfunction vueComponentAutoImport(options: string | AutoImportOptions): Plugin {\n\tif (!options) return;\n\n\treturn {\n\t\tname: \"fast-vite-plugin-vue-component-auto-import\",\n\t\tbuildStart(): void | Promise<void> {\n\t\t\tconst dir = typeof options === \"string\" ? options : options.dir;\n\n\t\t\tconst defaultFormatter = (fName: string): string => {\n\t\t\t\treturn fName.charAt(0).toUpperCase() + fName.slice(1);\n\t\t\t};\n\n\t\t\tconst formatter = typeof options === \"string\" ? defaultFormatter : (options.formatter ?? defaultFormatter);\n\n\t\t\t// 获取所有文件夹名称\n\t\t\tconst cFiles = fs.readdirSync(dir, {\n\t\t\t\twithFileTypes: true,\n\t\t\t});\n\n\t\t\tif (cFiles?.length === 0) return;\n\n\t\t\t// 组件名称\n\t\t\tconst cNames = cFiles\n\t\t\t\t// 排除export文件\n\t\t\t\t.filter((f) => f.name !== \"index.ts\")\n\t\t\t\t.map((file) => {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tcomponentName: formatter(file.name),\n\t\t\t\t\t\tfileName: file.name,\n\t\t\t\t\t};\n\t\t\t\t})\n\t\t\t\t.sort((a, b) => {\n\t\t\t\t\tif (a.componentName < b.componentName) {\n\t\t\t\t\t\treturn -1;\n\t\t\t\t\t}\n\t\t\t\t\tif (a.componentName > b.componentName) {\n\t\t\t\t\t\treturn 1;\n\t\t\t\t\t}\n\t\t\t\t\treturn 0;\n\t\t\t\t});\n\n\t\t\tlet importContent = \"\";\n\t\t\tlet exportContent = \"\";\n\t\t\tlet typeContent = \"\";\n\n\t\t\tcNames.forEach(({ componentName, fileName }, idx) => {\n\t\t\t\timportContent += `import ${componentName} from \"./${fileName}/index.vue\";\n`;\n\n\t\t\t\texportContent += `export * from \"./${fileName}/index.vue\";\n`;\n\n\t\t\t\ttypeContent += `\t${componentName},`;\n\n\t\t\t\tif (idx + 1 < cNames.length) {\n\t\t\t\t\ttypeContent += \"\\n\";\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tfs.writeFileSync(\n\t\t\t\tpath.join(dir, \"index.ts\"),\n\t\t\t\t`import type { DefineComponent } from \"vue\";\n${importContent}\n${exportContent}\nexport default [\n${typeContent}\n] as unknown as DefineComponent[];\n`\n\t\t\t);\n\t\t},\n\t};\n}\n\nexport { tsxComponentAutoImport, vueComponentAutoImport };\n","import fs from \"fs\";\nimport path from \"path\";\nimport type { Plugin, ResolvedConfig } from \"vite\";\n\nfunction padZero(num: number, length = 2): string {\n\treturn num.toString().padStart(length, \"0\");\n}\n\nfunction formatDate(date: Date): string {\n\tconst year = date.getUTCFullYear();\n\tconst month = padZero(date.getUTCMonth() + 1);\n\tconst day = padZero(date.getUTCDate());\n\tconst hours = padZero(date.getUTCHours());\n\tconst minutes = padZero(date.getUTCMinutes());\n\tconst seconds = padZero(date.getUTCSeconds());\n\tconst milliseconds = padZero(date.getUTCMilliseconds(), 3);\n\n\treturn `Z ${year}-${month}-${day} ${hours}:${minutes}:${seconds}.${milliseconds}`;\n}\n\n/**\n * 版本更新插件\n * @param version 不要携带 'v',示例:1.0.0\n * @returns\n */\nfunction versionUpdatePlugin(version: string): Plugin {\n\tlet config: ResolvedConfig;\n\n\treturn {\n\t\tname: \"fast-vite-plugin-version-update\",\n\t\tconfigResolved: (resolvedConfig: ResolvedConfig): void | Promise<void> => {\n\t\t\t// 存储最终解析的配置\n\t\t\tconfig = resolvedConfig;\n\t\t},\n\t\tbuildStart(): void | Promise<void> {\n\t\t\tconst curDate = new Date();\n\n\t\t\tconst dateTime = formatDate(curDate);\n\n\t\t\tconst versionDir = config.publicDir;\n\t\t\tconst versionPath = path.join(versionDir, \"version.json\");\n\t\t\tif (!fs.existsSync(versionDir)) {\n\t\t\t\tfs.mkdirSync(versionDir);\n\t\t\t}\n\n\t\t\t// 写入版本信息文件\n\t\t\tconst content = JSON.stringify({ version: `v${version}`, dateTime }, null, 4);\n\t\t\tfs.writeFileSync(versionPath, content);\n\n\t\t\tconst pkgPath = path.join(config.base, \"package.json\");\n\t\t\tif (fs.existsSync(pkgPath)) {\n\t\t\t\tconst pkgJson = JSON.parse(fs.readFileSync(pkgPath, \"utf-8\"));\n\t\t\t\tpkgJson.version = version;\n\t\t\t\tfs.writeFileSync(pkgPath, JSON.stringify(pkgJson, null, 2), \"utf-8\");\n\t\t\t}\n\t\t},\n\t};\n}\n\nexport { versionUpdatePlugin };\n"],"mappings":"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","names":["fs","path","findSvgFile","dir","svgContents","file","iconName","svgContent","match","attr","viewBoxMatch","widthMatch","heightMatch","width","height","viewBoxContent","a","b","writeTSXIcon","componentName","iconDir","componentContent","line","buildSvgIcon","writeDir","config","resolvedConfig","svgFiles","iconsPath","iconImportContent","iconTypeContent","exportContent","svg","idx","fs","path","externalGlobals","viteExternalsPlugin","isDev","getModuleVersion","name","pwd","pkgFile","isFullPath","renderUrl","url","data","getModuleInfo","module","prodUrl","v","version","pathList","p","css","cssList","c","cdnImport","options","modules","enableInDevMode","generateCssLinkTag","generateScriptTag","isBuild","externalMap","alias","plugins","_","command","userConfig","html","descriptors","cusomize","attrs","fs","path","tsxComponentAutoImport","options","dir","defaultFormatter","fName","formatter","cFiles","cNames","f","file","a","b","importContent","exportContent","typeContent","componentName","fileName","idx","vueComponentAutoImport","fs","path","padZero","num","length","formatDate","date","year","month","day","hours","minutes","seconds","milliseconds","versionUpdatePlugin","version","config","resolvedConfig","dateTime","versionDir","versionPath","content","pkgPath","pkgJson"]}
package/package.json CHANGED
@@ -1,7 +1,6 @@
1
1
  {
2
2
  "name": "fast-vite-plugins",
3
- "author": "小方",
4
- "version": "1.0.11",
3
+ "version": "1.0.12",
5
4
  "description": "Fast Vite插件库.",
6
5
  "type": "module",
7
6
  "keywords": [
@@ -12,20 +11,15 @@
12
11
  "plugin"
13
12
  ],
14
13
  "license": "Apache-2.0",
15
- "publishConfig": {
16
- "access": "public"
17
- },
18
14
  "homepage": "https://fastdotnet.com",
15
+ "bugs": {
16
+ "url": "https://gitee.com/China-xiaoFang/fast.vite.plugins/issues"
17
+ },
19
18
  "repository": {
20
19
  "type": "git",
21
20
  "url": "https://gitee.com/China-xiaoFang/fast.vite.plugins"
22
21
  },
23
- "bugs": {
24
- "url": "https://gitee.com/China-xiaoFang/fast.vite.plugins/issues"
25
- },
26
- "main": "dist/index.js",
27
- "module": "dist/index.js",
28
- "types": "dist/index.d.ts",
22
+ "author": "小方",
29
23
  "files": [
30
24
  "./Fast.png",
31
25
  "./LICENSE",
@@ -33,20 +27,26 @@
33
27
  "./README.zh.md",
34
28
  "./dist"
35
29
  ],
30
+ "main": "dist/index.js",
31
+ "module": "dist/index.js",
32
+ "types": "dist/index.d.ts",
36
33
  "exports": {
37
34
  ".": {
38
- "import": "./dist/index.js",
39
- "require": "./dist/index.cjs"
35
+ "require": "./dist/index.cjs",
36
+ "import": "./dist/index.js"
40
37
  }
41
38
  },
42
39
  "unpkg": "dist/index.js",
43
40
  "jsdelivr": "dist/index.js",
41
+ "publishConfig": {
42
+ "access": "public"
43
+ },
44
44
  "dependencies": {
45
45
  "rollup-plugin-external-globals": "^0.12.0",
46
46
  "vite-plugin-externals": "^0.6.2"
47
47
  },
48
48
  "devDependencies": {
49
- "@types/node": "*"
49
+ "@types/node": "latest"
50
50
  },
51
51
  "engines": {
52
52
  "node": ">=20.0.0"