fast-vite-plugins 1.0.19 → 1.0.20

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
@@ -47,7 +47,7 @@ export default defineConfig({
47
47
  dir: "src/components",
48
48
  exportPath: "src/components/index.ts",
49
49
  dts: true,
50
- dtsPath: "types/component.d.ts",
50
+ dtsPath: "types/components.d.ts",
51
51
  }),
52
52
  /** Routing path generation */
53
53
  buildRouterPath({
package/README.zh.md CHANGED
@@ -47,7 +47,7 @@ export default defineConfig({
47
47
  dir: "src/components",
48
48
  exportPath: "src/components/index.ts",
49
49
  dts: true,
50
- dtsPath: "types/component.d.ts",
50
+ dtsPath: "types/components.d.ts",
51
51
  }),
52
52
  /** 路由路径生成 */
53
53
  buildRouterPath({
package/dist/index.cjs CHANGED
@@ -24,7 +24,7 @@ ${f}
24
24
  export default [
25
25
  ${m}
26
26
  ] as unknown as DefineComponent[];
27
- `)};return{name:"fast-vite-plugin-build-svg-icon",configResolved:r=>{n=r},buildStart(){p()},configureServer(r){let g=N.default.resolve(n.root,t);if(j.default.existsSync(g)){r.watcher.add(g);let c=m=>{m&&m.endsWith(".svg")&&p()};r.watcher.on("add",c),r.watcher.on("change",c),r.watcher.on("unlink",c)}}}}var M=$(require("fs"),1),V=$(require("path"),1),_=$(require("rollup-plugin-external-globals"),1),B=require("vite-plugin-externals"),et=process.env.NODE_ENV==="development";function nt(t){let e=process.cwd(),n=V.default.join(e,"node_modules",t,"package.json");return M.default.existsSync(n)?JSON.parse(M.default.readFileSync(n,"utf8")).version:""}function G(t){return!!(t.startsWith("http:")||t.startsWith("https:")||t.startsWith("//"))}function J(t,e){let{path:n}=e;return G(n)&&(t=n),t.replace(/\{name\}/g,e.name).replace(/\{version\}/g,e.version).replace(/\{path\}/g,n)}function ot(t,e){e=t.prodUrl||e;let n=t,p=t.version||nt(n.name),r=[];Array.isArray(n.path)?r=n.path:r.push(n.path);let g={...n,version:p};r=r.map(f=>{if(!p&&!G(f))throw new Error(`modules: ${g.name} package.json file does not exist`);return J(e,{name:g.name,version:g.version,path:f})});let c=n.css||[];!Array.isArray(c)&&c&&(c=[c]);let m=Array.isArray(c)?c.map(f=>J(e,{name:g.name,version:g.version,path:f})):[];return{...n,version:p,pathList:r,cssList:m}}var H="https://cdn.jsdelivr.net/npm/{name}@{version}/{path}",rt="https://unpkg.com/{package}@{version}/{path}";function st(t){let{modules:e=[],prodUrl:n=H,enableInDevMode:p=!1,generateCssLinkTag:r,generateScriptTag:g}=t,c=!1,m=(Array.isArray(e)?e:[e]).map(u=>typeof u=="function"?u(n):u).map(u=>ot(u,n)),f={};m.forEach(u=>{f[u.name]=u.var,Array.isArray(u.alias)&&u.alias.forEach(v=>{f[v]=u.var})});let i=[{name:"fast-vite-plugin-cdn-import",enforce:"pre",config(u,{command:v}){c=v==="build";let d={build:{rollupOptions:{plugins:[]}}};return c&&(d.build.rollupOptions.plugins=[(0,_.default)(f)]),d},transformIndexHtml(u){if(!c&&!p)return u;let v=[];return m.forEach(d=>{d.pathList.forEach(h=>{let w=g?.(d.name,h)||{},l={src:h,crossorigin:"anonymous",...d?.attrs??{},...w.attrs};v.push({tag:"script",attrs:l,...w})}),d.cssList.forEach(h=>{let w=r?.(d.name,h)||{},l={href:h,rel:"stylesheet",crossorigin:"anonymous",...d?.attrs??{},...w.attrs};v.push({tag:"link",attrs:l,...w})})}),v}}];return et&&p&&i.push((0,B.viteExternalsPlugin)(f,{enforce:"pre"})),i}var S=$(require("fs"),1),C=$(require("path"),1);function z(t){return t.replace(/\\/g,"/")}function it(t){return t.replace(/[-_](\w)/g,(e,n)=>n?n.toUpperCase():"").replace(/^\w/,e=>e.toUpperCase())}function ct(t={}){let{dir:e="src/components",exportPath:n="src/components/index.ts",dts:p=!0,dtsPath:r="types/component.d.ts",deep:g=!0,extensions:c=["vue","tsx","jsx"],formatter:m}=t,f,i=new Map,u=l=>{let s=l;for(let a of c)if(s.endsWith(`.${a}`)){s=s.slice(0,-a.length-1);break}if(s.endsWith("/index")||s.endsWith("\\index")){let a=s.split(/[\\/]/);s=a[a.length-2]||a[a.length-1]}else{let a=s.split(/[\\/]/);s=a[a.length-1]}return m?m(s):it(s)},v=(l,s=0)=>{let a=[];if(!S.default.existsSync(l))return a;let o=S.default.readdirSync(l,{withFileTypes:!0});for(let y of o){let P=C.default.join(l,y.name);if(y.isDirectory()){if(y.name==="node_modules"||y.name.startsWith(". "))continue;(g||s===0)&&a.push(...v(P,s+1))}else if(y.isFile()){let x=C.default.extname(y.name).slice(1);c.includes(x)&&a.push(P)}}return a},d=()=>{i.clear();let l=C.default.resolve(f.root,e);if(!S.default.existsSync(l)){console.warn(`[component-auto-import] Directory not found: ${l}`);return}v(l).forEach(a=>{let o=C.default.relative(l,a),y=u(o);i.set(y,{name:y,from:a})})},h=()=>{if(i.size===0)return;let l=Array.from(i.values()).sort((x,k)=>x.name.localeCompare(k.name)),s=C.default.resolve(f.root,n),a=C.default.dirname(s),o=[];o.push("/* eslint-disable */"),o.push("/* prettier-ignore */"),o.push("// @ts-nocheck"),o.push("// Auto-generated by fast component-auto-import"),o.push("// Generated by fast-vite-plugins"),o.push("// Do not edit this file manually"),o.push(""),o.push('import type { App } from "vue";'),o.push(""),l.forEach(({name:x,from:k})=>{let F=z(C.default.relative(a,k)),T=F.startsWith(".")?F:`./${F}`;o.push(`import ${x} from "${T}";`),o.push(`export { ${x} };`),o.push(`export type ${x}Instance = InstanceType<typeof ${x}>;`)}),o.push(""),o.push("/** \u81EA\u52A8\u6CE8\u518C\u6240\u6709\u7EC4\u4EF6 */"),o.push("export function registerComponents(app: App): void {"),l.forEach(({name:x})=>{o.push(` app.component(${x}.name, ${x});`)}),o.push("}"),o.push("");let y=`${o.join(`
27
+ `)};return{name:"fast-vite-plugin-build-svg-icon",configResolved:r=>{n=r},buildStart(){p()},configureServer(r){let g=N.default.resolve(n.root,t);if(j.default.existsSync(g)){r.watcher.add(g);let c=m=>{m&&m.endsWith(".svg")&&p()};r.watcher.on("add",c),r.watcher.on("change",c),r.watcher.on("unlink",c)}}}}var M=$(require("fs"),1),V=$(require("path"),1),_=$(require("rollup-plugin-external-globals"),1),B=require("vite-plugin-externals"),et=process.env.NODE_ENV==="development";function nt(t){let e=process.cwd(),n=V.default.join(e,"node_modules",t,"package.json");return M.default.existsSync(n)?JSON.parse(M.default.readFileSync(n,"utf8")).version:""}function G(t){return!!(t.startsWith("http:")||t.startsWith("https:")||t.startsWith("//"))}function J(t,e){let{path:n}=e;return G(n)&&(t=n),t.replace(/\{name\}/g,e.name).replace(/\{version\}/g,e.version).replace(/\{path\}/g,n)}function ot(t,e){e=t.prodUrl||e;let n=t,p=t.version||nt(n.name),r=[];Array.isArray(n.path)?r=n.path:r.push(n.path);let g={...n,version:p};r=r.map(f=>{if(!p&&!G(f))throw new Error(`modules: ${g.name} package.json file does not exist`);return J(e,{name:g.name,version:g.version,path:f})});let c=n.css||[];!Array.isArray(c)&&c&&(c=[c]);let m=Array.isArray(c)?c.map(f=>J(e,{name:g.name,version:g.version,path:f})):[];return{...n,version:p,pathList:r,cssList:m}}var H="https://cdn.jsdelivr.net/npm/{name}@{version}/{path}",rt="https://unpkg.com/{package}@{version}/{path}";function st(t){let{modules:e=[],prodUrl:n=H,enableInDevMode:p=!1,generateCssLinkTag:r,generateScriptTag:g}=t,c=!1,m=(Array.isArray(e)?e:[e]).map(u=>typeof u=="function"?u(n):u).map(u=>ot(u,n)),f={};m.forEach(u=>{f[u.name]=u.var,Array.isArray(u.alias)&&u.alias.forEach(v=>{f[v]=u.var})});let i=[{name:"fast-vite-plugin-cdn-import",enforce:"pre",config(u,{command:v}){c=v==="build";let d={build:{rollupOptions:{plugins:[]}}};return c&&(d.build.rollupOptions.plugins=[(0,_.default)(f)]),d},transformIndexHtml(u){if(!c&&!p)return u;let v=[];return m.forEach(d=>{d.pathList.forEach(h=>{let w=g?.(d.name,h)||{},l={src:h,crossorigin:"anonymous",...d?.attrs??{},...w.attrs};v.push({tag:"script",attrs:l,...w})}),d.cssList.forEach(h=>{let w=r?.(d.name,h)||{},l={href:h,rel:"stylesheet",crossorigin:"anonymous",...d?.attrs??{},...w.attrs};v.push({tag:"link",attrs:l,...w})})}),v}}];return et&&p&&i.push((0,B.viteExternalsPlugin)(f,{enforce:"pre"})),i}var S=$(require("fs"),1),C=$(require("path"),1);function z(t){return t.replace(/\\/g,"/")}function it(t){return t.replace(/[-_](\w)/g,(e,n)=>n?n.toUpperCase():"").replace(/^\w/,e=>e.toUpperCase())}function ct(t={}){let{dir:e="src/components",exportPath:n="src/components/index.ts",dts:p=!0,dtsPath:r="types/components.d.ts",deep:g=!0,extensions:c=["vue","tsx","jsx"],formatter:m}=t,f,i=new Map,u=l=>{let s=l;for(let a of c)if(s.endsWith(`.${a}`)){s=s.slice(0,-a.length-1);break}if(s.endsWith("/index")||s.endsWith("\\index")){let a=s.split(/[\\/]/);s=a[a.length-2]||a[a.length-1]}else{let a=s.split(/[\\/]/);s=a[a.length-1]}return m?m(s):it(s)},v=(l,s=0)=>{let a=[];if(!S.default.existsSync(l))return a;let o=S.default.readdirSync(l,{withFileTypes:!0});for(let y of o){let P=C.default.join(l,y.name);if(y.isDirectory()){if(y.name==="node_modules"||y.name.startsWith(". "))continue;(g||s===0)&&a.push(...v(P,s+1))}else if(y.isFile()){let x=C.default.extname(y.name).slice(1);c.includes(x)&&a.push(P)}}return a},d=()=>{i.clear();let l=C.default.resolve(f.root,e);if(!S.default.existsSync(l)){console.warn(`[component-auto-import] Directory not found: ${l}`);return}v(l).forEach(a=>{let o=C.default.relative(l,a),y=u(o);i.set(y,{name:y,from:a})})},h=()=>{if(i.size===0)return;let l=Array.from(i.values()).sort((x,k)=>x.name.localeCompare(k.name)),s=C.default.resolve(f.root,n),a=C.default.dirname(s),o=[];o.push("/* eslint-disable */"),o.push("/* prettier-ignore */"),o.push("// @ts-nocheck"),o.push("// Auto-generated by fast component-auto-import"),o.push("// Generated by fast-vite-plugins"),o.push("// Do not edit this file manually"),o.push(""),o.push('import type { App } from "vue";'),o.push(""),l.forEach(({name:x,from:k})=>{let F=z(C.default.relative(a,k)),T=F.startsWith(".")?F:`./${F}`;o.push(`import ${x} from "${T}";`),o.push(`export { ${x} };`),o.push(`export type ${x}Instance = InstanceType<typeof ${x}>;`)}),o.push(""),o.push("/** \u81EA\u52A8\u6CE8\u518C\u6240\u6709\u7EC4\u4EF6 */"),o.push("export function registerComponents(app: App): void {"),l.forEach(({name:x})=>{o.push(` app.component(${x}.name, ${x});`)}),o.push("}"),o.push("");let y=`${o.join(`
28
28
  `)}
29
29
  `,P=S.default.existsSync(s)?S.default.readFileSync(s,"utf-8"):"";y!==P&&S.default.writeFileSync(s,y,"utf-8")},w=()=>{if(!p||i.size===0)return;let l=Array.from(i.values()).sort((x,k)=>x.name.localeCompare(k.name)),s=C.default.resolve(f.root,r),a=C.default.dirname(s),o=[];o.push("// For this project development"),o.push("// Auto-generated by fast component-auto-import"),o.push("// Generated by fast-vite-plugins"),o.push("// Do not edit this file manually"),o.push(""),o.push('import "@vue/runtime-core";'),o.push(""),o.push("// GlobalComponents for Volar"),o.push('declare module "@vue/runtime-core" {'),o.push(" export interface GlobalComponents {"),l.forEach(({name:x,from:k})=>{let F=z(C.default.relative(a,k));F=F.replace(/\.(vue|tsx|jsx)$/,"");let T=F.startsWith(".")?F:`./${F}`;o.push(` ${x}: (typeof import("${T}"))["default"];`)}),o.push(" }"),o.push("}"),o.push(""),o.push("export {};");let y=`${o.join(`
30
30
  `)}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/index.ts","../../src/buildSvgIcon/index.ts","../../src/cdnImport/index.ts","../../src/componentAutoImport/index.ts","../../src/routerPath/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 \"./routerPath\";\nexport * from \"./routerPath/type\";\nexport * from \"./versionUpdate\";\n","import fs from \"fs\";\nimport path from \"path\";\nimport type { Plugin, ResolvedConfig, ViteDevServer } 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\tconst rebuild = (): void => {\n\t\tconst svgFiles = findSvgFile(path.resolve(config.root, dir));\n\n\t\tconst iconsPath = path.resolve(config.root, writeDir);\n\t\tfs.mkdirSync(iconsPath, { recursive: true });\n\n\t\tlet iconImportContent = \"\";\n\t\tlet iconTypeContent = \"\";\n\t\tlet exportContent = \"\";\n\n\t\tsvgFiles.forEach((svg, idx) => {\n\t\t\twriteTSXIcon(svg.componentName, path.join(iconsPath, svg.iconName), svg.iconContent);\n\n\t\t\ticonImportContent += `import { ${svg.componentName} } from \"./${svg.iconName}\";\n`;\n\n\t\t\ticonTypeContent += `\t${svg.componentName},`;\n\n\t\t\texportContent += `export * from \"./${svg.iconName}\";\n`;\n\n\t\t\tif (idx + 1 < svgFiles.length) {\n\t\t\t\ticonTypeContent += \"\\n\";\n\t\t\t}\n\t\t});\n\n\t\tfs.writeFileSync(\n\t\t\tpath.join(iconsPath, \"index.ts\"),\n\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);\n\t};\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\trebuild();\n\t\t},\n\t\t// eslint-disable-next-line @typescript-eslint/explicit-function-return-type\n\t\tconfigureServer(server: ViteDevServer) {\n\t\t\tconst fullDir = path.resolve(config.root, dir);\n\n\t\t\t// 监听文件变化\n\t\t\tif (fs.existsSync(fullDir)) {\n\t\t\t\tserver.watcher.add(fullDir);\n\n\t\t\t\tconst handle = (file: string): void => {\n\t\t\t\t\tif (!file) return;\n\t\t\t\t\tif (!file.endsWith(\".svg\")) return;\n\n\t\t\t\t\trebuild();\n\t\t\t\t};\n\n\t\t\t\tserver.watcher.on(\"add\", handle);\n\t\t\t\tserver.watcher.on(\"change\", handle);\n\t\t\t\tserver.watcher.on(\"unlink\", handle);\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\nconst cdnJsDelivrUrl = \"https://cdn.jsdelivr.net/npm/{name}@{version}/{path}\";\nconst cdnUnpkgUrl = \"https://unpkg.com/{package}@{version}/{path}\";\n\n/**\n * CDN 导入\n * @param options\n * @returns\n */\nfunction cdnImport(options: CdnImportOptions): Plugin[] {\n\tconst { modules = [], prodUrl = cdnJsDelivrUrl, enableInDevMode = false, generateCssLinkTag, generateScriptTag } = 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, cdnJsDelivrUrl, cdnUnpkgUrl };\n","import fs from \"fs\";\nimport path from \"path\";\nimport type { AutoImportOptions } from \"./type\";\nimport type { Plugin, ResolvedConfig, ViteDevServer } from \"vite\";\n\n/**\n * 将路径转换为 Unix 风格\n */\nfunction slash(path: string): string {\n\treturn path.replace(/\\\\/g, \"/\");\n}\n\n/**\n * Pascal Case 转换\n */\nfunction pascalCase(str: string): string {\n\treturn str.replace(/[-_](\\w)/g, (_, c) => (c ? c.toUpperCase() : \"\")).replace(/^\\w/, (c) => c.toUpperCase());\n}\n\n/**\n * 组件自动导入\n * @param options 选项\n */\nfunction componentAutoImport(options: AutoImportOptions = {}): Plugin {\n\tconst {\n\t\tdir = \"src/components\",\n\t\texportPath = \"src/components/index.ts\",\n\t\tdts = true,\n\t\tdtsPath = \"types/component.d.ts\",\n\t\tdeep = true,\n\t\textensions = [\"vue\", \"tsx\", \"jsx\"],\n\t\tformatter,\n\t} = options;\n\n\tlet config: ResolvedConfig;\n\tconst componentMap = new Map<\n\t\tstring,\n\t\t{\n\t\t\t/** 组件名称 (PascalCase) */\n\t\t\tname: string;\n\t\t\t/** 组件文件路径 (绝对路径) */\n\t\t\tfrom: string;\n\t\t}\n\t>();\n\n\t/** 从文件路径获取组件名 */\n\tconst getNameFromPath = (filePath: string): string => {\n\t\t// 移除扩展名\n\t\tlet name = filePath;\n\t\tfor (const ext of extensions) {\n\t\t\tif (name.endsWith(`.${ext}`)) {\n\t\t\t\tname = name.slice(0, -ext.length - 1);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\t// 如果是 index 文件,使用父目录名\n\t\tif (name.endsWith(\"/index\") || name.endsWith(\"\\\\index\")) {\n\t\t\tconst parts = name.split(/[\\\\/]/);\n\t\t\tname = parts[parts.length - 2] || parts[parts.length - 1];\n\t\t} else {\n\t\t\tconst parts = name.split(/[\\\\/]/);\n\t\t\tname = parts[parts.length - 1];\n\t\t}\n\n\t\tif (formatter) {\n\t\t\treturn formatter(name);\n\t\t} else {\n\t\t\treturn pascalCase(name);\n\t\t}\n\t};\n\n\t/** 递归扫描目录 */\n\tconst scanDirectory = (dirPath: string, depth = 0): string[] => {\n\t\tconst files: string[] = [];\n\n\t\tif (!fs.existsSync(dirPath)) {\n\t\t\treturn files;\n\t\t}\n\n\t\tconst entries = fs.readdirSync(dirPath, { withFileTypes: true });\n\n\t\tfor (const entry of entries) {\n\t\t\tconst fullPath = path.join(dirPath, entry.name);\n\n\t\t\tif (entry.isDirectory()) {\n\t\t\t\t// 跳过 node_modules 等\n\t\t\t\tif (entry.name === \"node_modules\" || entry.name.startsWith(\". \")) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// 深度扫描\n\t\t\t\tif (deep || depth === 0) {\n\t\t\t\t\tfiles.push(...scanDirectory(fullPath, depth + 1));\n\t\t\t\t}\n\t\t\t} else if (entry.isFile()) {\n\t\t\t\t// 检查文件扩展名\n\t\t\t\tconst ext = path.extname(entry.name).slice(1);\n\t\t\t\tif (extensions.includes(ext)) {\n\t\t\t\t\tfiles.push(fullPath);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn files;\n\t};\n\n\t/** 扫描组件文件 */\n\tconst scanComponents = (): void => {\n\t\tcomponentMap.clear();\n\n\t\tconst fullDir = path.resolve(config.root, dir);\n\n\t\tif (!fs.existsSync(fullDir)) {\n\t\t\tconsole.warn(`[component-auto-import] Directory not found: ${fullDir}`);\n\t\t\treturn;\n\t\t}\n\n\t\tconst files = scanDirectory(fullDir);\n\n\t\tfiles.forEach((absolutePath) => {\n\t\t\tconst relativePath = path.relative(fullDir, absolutePath);\n\t\t\tconst componentName = getNameFromPath(relativePath);\n\n\t\t\tcomponentMap.set(componentName, {\n\t\t\t\tname: componentName,\n\t\t\t\tfrom: absolutePath,\n\t\t\t});\n\t\t});\n\t};\n\n\t/** 生成自动注册文件 */\n\tconst generateAutoRegister = (): void => {\n\t\tif (componentMap.size === 0) return;\n\n\t\tconst components = Array.from(componentMap.values()).sort((a, b) => a.name.localeCompare(b.name));\n\n\t\tconst registerFilePath = path.resolve(config.root, exportPath);\n\t\tconst componentDir = path.dirname(registerFilePath);\n\n\t\tconst lines: string[] = [];\n\t\tlines.push(\"/* eslint-disable */\");\n\t\tlines.push(\"/* prettier-ignore */\");\n\t\tlines.push(\"// @ts-nocheck\");\n\t\tlines.push(\"// Auto-generated by fast component-auto-import\");\n\t\tlines.push(\"// Generated by fast-vite-plugins\");\n\t\tlines.push(\"// Do not edit this file manually\");\n\t\tlines.push(\"\");\n\t\tlines.push('import type { App } from \"vue\";');\n\t\tlines.push(\"\");\n\n\t\t// 生成 import 语句\n\t\tcomponents.forEach(({ name, from }) => {\n\t\t\tconst relativePath = slash(path.relative(componentDir, from));\n\t\t\tconst importPath = relativePath.startsWith(\".\") ? relativePath : `./${relativePath}`;\n\t\t\tlines.push(`import ${name} from \"${importPath}\";`);\n\t\t\tlines.push(`export { ${name} };`);\n\t\t\tlines.push(`export type ${name}Instance = InstanceType<typeof ${name}>;`);\n\t\t});\n\n\t\tlines.push(\"\");\n\t\tlines.push(\"/** 自动注册所有组件 */\");\n\t\tlines.push(\"export function registerComponents(app: App): void {\");\n\n\t\tcomponents.forEach(({ name }) => {\n\t\t\tlines.push(`\tapp.component(${name}.name, ${name});`);\n\t\t});\n\n\t\tlines.push(\"}\");\n\t\tlines.push(\"\");\n\n\t\tconst code = `${lines.join(\"\\n\")}\\n`;\n\n\t\tconst existingCode = fs.existsSync(registerFilePath) ? fs.readFileSync(registerFilePath, \"utf-8\") : \"\";\n\n\t\tif (code !== existingCode) {\n\t\t\tfs.writeFileSync(registerFilePath, code, \"utf-8\");\n\t\t}\n\t};\n\n\t/** 生成类型声明文件 */\n\tconst generateDts = (): void => {\n\t\tif (!dts || componentMap.size === 0) return;\n\n\t\tconst components = Array.from(componentMap.values()).sort((a, b) => a.name.localeCompare(b.name));\n\n\t\tconst dtsFullPath = path.resolve(config.root, dtsPath);\n\t\tconst dtsDir = path.dirname(dtsFullPath);\n\n\t\t// 生成类型声明内容\n\t\tconst lines: string[] = [];\n\t\tlines.push(\"// For this project development\");\n\t\tlines.push(\"// Auto-generated by fast component-auto-import\");\n\t\tlines.push(\"// Generated by fast-vite-plugins\");\n\t\tlines.push(\"// Do not edit this file manually\");\n\t\tlines.push(\"\");\n\t\tlines.push('import \"@vue/runtime-core\";');\n\t\tlines.push(\"\");\n\t\tlines.push(\"// GlobalComponents for Volar\");\n\t\tlines.push('declare module \"@vue/runtime-core\" {');\n\t\tlines.push(\"\texport interface GlobalComponents {\");\n\n\t\tcomponents.forEach(({ name, from }) => {\n\t\t\t// 计算相对路径\n\t\t\tlet relativePath = slash(path.relative(dtsDir, from));\n\n\t\t\t// 移除文件扩展名\n\t\t\trelativePath = relativePath.replace(/\\.(vue|tsx|jsx)$/, \"\");\n\n\t\t\t// 确保以 ./ 开头\n\t\t\tconst importPath = relativePath.startsWith(\".\") ? relativePath : `./${relativePath}`;\n\n\t\t\tlines.push(`\t\t${name}: (typeof import(\"${importPath}\"))[\"default\"];`);\n\t\t});\n\n\t\tlines.push(\"\t}\");\n\t\tlines.push(\"}\");\n\t\tlines.push(\"\");\n\t\tlines.push(\"export {};\");\n\n\t\tconst code = `${lines.join(\"\\n\")}\\n`;\n\n\t\t// 确保目录存在\n\t\tif (!fs.existsSync(dtsDir)) {\n\t\t\tfs.mkdirSync(dtsDir, { recursive: true });\n\t\t}\n\n\t\t// 只有内容变化时才写入\n\t\tconst existingCode = fs.existsSync(dtsFullPath) ? fs.readFileSync(dtsFullPath, \"utf-8\") : \"\";\n\n\t\tif (code !== existingCode) {\n\t\t\tfs.writeFileSync(dtsFullPath, code, \"utf-8\");\n\t\t}\n\t};\n\n\treturn {\n\t\tname: \"fast-vite-plugin-component-auto-import\",\n\t\tenforce: \"post\",\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\tscanComponents();\n\t\t\tgenerateAutoRegister();\n\t\t\tgenerateDts();\n\t\t},\n\t\t// eslint-disable-next-line @typescript-eslint/explicit-function-return-type\n\t\tconfigureServer(server: ViteDevServer) {\n\t\t\tconst fullDir = path.resolve(config.root, dir);\n\n\t\t\t// 监听文件变化\n\t\t\tif (fs.existsSync(fullDir)) {\n\t\t\t\tserver.watcher.add(fullDir);\n\n\t\t\t\tconst handle = (file: string): void => {\n\t\t\t\t\tif (!file) return;\n\t\t\t\t\t// 忽略 .d.ts 文件\n\t\t\t\t\tif (file.endsWith(\".d.ts\")) return;\n\n\t\t\t\t\t// 检查是否是组件文件\n\t\t\t\t\tconst ext = path.extname(file).slice(1);\n\t\t\t\t\tif (!extensions.includes(ext)) return;\n\n\t\t\t\t\tscanComponents();\n\t\t\t\t\tgenerateAutoRegister();\n\t\t\t\t\tgenerateDts();\n\t\t\t\t};\n\n\t\t\t\tserver.watcher.on(\"add\", handle);\n\t\t\t\tserver.watcher.on(\"change\", handle);\n\t\t\t\tserver.watcher.on(\"unlink\", handle);\n\t\t\t}\n\t\t},\n\t};\n}\n\nexport { componentAutoImport };\n","import fs from \"fs\";\nimport path from \"path\";\nimport type { BuildRouterPathOptions } from \"./type\";\nimport type { Plugin, ResolvedConfig, ViteDevServer } from \"vite\";\n\n/**\n * Pascal Case 转换\n */\nfunction pascalCase(str: string): string {\n\treturn str.replace(/[-_](\\w)/g, (_, c) => (c ? c.toUpperCase() : \"\")).replace(/^\\w/, (c) => c.toUpperCase());\n}\n\n/**\n * 从文件内容中提取组件名称\n */\nfunction extractComponentName(fileContent: string): string | null {\n\t// 匹配 defineOptions({ name: 'xxx' })\n\tconst defineOptionsRegex = /defineOptions\\(\\s*\\{\\s*name:\\s*[\"']([^\"']+)[\"']/;\n\tconst defineOptionsMatch = fileContent.match(defineOptionsRegex);\n\treturn defineOptionsMatch ? defineOptionsMatch[1] : null;\n}\n\n/**\n * 路由路径生成\n * @param options 选项\n */\nfunction buildRouterPath(options: BuildRouterPathOptions = {}): Plugin {\n\tconst { dir = \"src/views\", exportPath = \"src/router/index.json\", deep = true, extensions = [\"vue\", \"tsx\", \"jsx\"], formatter } = options;\n\n\tlet config: ResolvedConfig;\n\n\t/** 递归获取目录下所有符合扩展名的文件*/\n\tconst getAllFiles = (dirPath: string, fileList: string[] = []): string[] => {\n\t\tif (!fs.existsSync(dirPath)) {\n\t\t\treturn fileList;\n\t\t}\n\n\t\tconst files = fs.readdirSync(dirPath);\n\t\tfiles.forEach((file) => {\n\t\t\tconst filePath = path.join(dirPath, file);\n\t\t\tconst stat = fs.statSync(filePath);\n\n\t\t\tif (stat.isDirectory()) {\n\t\t\t\tif (deep) {\n\t\t\t\t\tgetAllFiles(filePath, fileList);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tconst ext = path.extname(filePath).slice(1);\n\t\t\t\tif (extensions.includes(ext)) {\n\t\t\t\t\tfileList.push(filePath);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\treturn fileList;\n\t};\n\n\t/** 生成路径-名称映射 */\n\tconst generatePathNameMap = (): void => {\n\t\tconst targetDir = path.resolve(config.root, dir);\n\t\tconst files = getAllFiles(targetDir);\n\n\t\tconst pathNameMap: Record<string, string> = files.reduce((acc, filePath) => {\n\t\t\ttry {\n\t\t\t\tconst content = fs.readFileSync(filePath, \"utf-8\");\n\t\t\t\tconst componentName = extractComponentName(content);\n\n\t\t\t\t// 生成相对路径\n\t\t\t\tconst relativePath = `/${path.relative(config.root, filePath).replace(/\\\\/g, \"/\")}`;\n\n\t\t\t\t// 确定最终的组件名称\n\t\t\t\tlet finalName: string;\n\t\t\t\tif (componentName) {\n\t\t\t\t\tfinalName = componentName;\n\t\t\t\t} else {\n\t\t\t\t\tconst fileName = path.basename(filePath, path.extname(filePath));\n\t\t\t\t\tfinalName = formatter ? formatter(fileName) : pascalCase(fileName);\n\t\t\t\t}\n\n\t\t\t\tacc[relativePath] = finalName;\n\t\t\t} catch (error) {\n\t\t\t\tconsole.error(`Error processing file ${filePath}:`, error);\n\t\t\t}\n\t\t\treturn acc;\n\t\t}, {});\n\n\t\t// 写入 JSON 文件\n\t\tconst outputPath = path.resolve(config.root, exportPath);\n\t\tconst outputDir = path.dirname(outputPath);\n\n\t\t// 确保输出目录存在\n\t\tif (!fs.existsSync(outputDir)) {\n\t\t\tfs.mkdirSync(outputDir, { recursive: true });\n\t\t}\n\n\t\tconst outputContent = JSON.stringify(pathNameMap, null, 2);\n\t\tfs.writeFileSync(outputPath, outputContent, \"utf-8\");\n\t};\n\n\treturn {\n\t\tname: \"fast-vite-plugin-router-path\",\n\t\tenforce: \"post\",\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\tgeneratePathNameMap();\n\t\t},\n\t\t// eslint-disable-next-line @typescript-eslint/explicit-function-return-type\n\t\tconfigureServer(server: ViteDevServer) {\n\t\t\tconst fullDir = path.resolve(config.root, dir);\n\n\t\t\t// 监听文件变化\n\t\t\tif (fs.existsSync(fullDir)) {\n\t\t\t\tserver.watcher.add(fullDir);\n\n\t\t\t\tconst handle = (file: string): void => {\n\t\t\t\t\tif (!file) return;\n\t\t\t\t\t// 忽略 . d.ts 文件和 JSON 文件\n\t\t\t\t\tif (file.endsWith(\".d.ts\") || file.endsWith(\".json\")) return;\n\n\t\t\t\t\t// 检查是否是组件文件\n\t\t\t\t\tconst ext = path.extname(file).slice(1);\n\t\t\t\t\tif (!extensions.includes(ext)) return;\n\n\t\t\t\t\tgeneratePathNameMap();\n\t\t\t\t};\n\n\t\t\t\tserver.watcher.on(\"add\", handle);\n\t\t\t\tserver.watcher.on(\"change\", handle);\n\t\t\t\tserver.watcher.on(\"unlink\", handle);\n\t\t\t}\n\t\t},\n\t};\n}\n\nexport { buildRouterPath };\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,GAAA,GAAAC,EAAAD,GAAA,qBAAAE,GAAA,iBAAAC,GAAA,cAAAC,GAAA,mBAAAC,EAAA,gBAAAC,GAAA,wBAAAC,GAAA,gBAAAC,EAAA,wBAAAC,GAAA,iBAAAC,IAAA,eAAAC,EAAAX,ICAA,IAAAY,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,GAAatB,EAAauB,EAA0B,CAC5D,GAAI,CAACvB,GAAO,CAACuB,EAAU,OAEvB,IAAIC,EAEEC,EAAU,IAAY,CAC3B,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,EACDC,CAAiB;AAAA,EACjBE,CAAa;AAAA;AAAA,EAEbD,CAAe;AAAA;AAAA,CAGf,CACD,EAEA,MAAO,CACN,KAAM,kCACN,eAAiBI,GAAyD,CAEzET,EAASS,CACV,EACA,YAAmC,CAClCR,EAAQ,CACT,EAEA,gBAAgBS,EAAuB,CACtC,IAAMC,EAAU,EAAA/B,QAAK,QAAQoB,EAAO,KAAMxB,CAAG,EAG7C,GAAI,EAAAE,QAAG,WAAWiC,CAAO,EAAG,CAC3BD,EAAO,QAAQ,IAAIC,CAAO,EAE1B,IAAMC,EAAUjC,GAAuB,CACjCA,GACAA,EAAK,SAAS,MAAM,GAEzBsB,EAAQ,CACT,EAEAS,EAAO,QAAQ,GAAG,MAAOE,CAAM,EAC/BF,EAAO,QAAQ,GAAG,SAAUE,CAAM,EAClCF,EAAO,QAAQ,GAAG,SAAUE,CAAM,CACnC,CACD,CACD,CACD,CClLA,IAAAC,EAAe,mBACfC,EAAiB,qBACjBC,EAA4B,+CAC5BC,EAAoC,iCAI9BC,GAAQ,QAAQ,IAAI,WAAa,cAOvC,SAASC,GAAiBC,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,GAAcC,EAAgBC,EAAuE,CAC7GA,EAAUD,EAAO,SAAWC,EAC5B,IAAMC,EAAIF,EACJG,EAAUH,EAAO,SAAWX,GAAiBa,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,CAEA,IAAME,EAAiB,uDACjBC,GAAc,+CAOpB,SAASC,GAAUC,EAAqC,CACvD,GAAM,CAAE,QAAAC,EAAU,CAAC,EAAG,QAAAZ,EAAUQ,EAAgB,gBAAAK,EAAkB,GAAO,mBAAAC,EAAoB,kBAAAC,CAAkB,EAAIJ,EAE/GK,EAAU,GAERnB,GAAQ,MAAM,QAAQe,CAAO,EAAIA,EAAU,CAACA,CAAO,GACvD,IAAKX,GAAO,OAAOA,GAAM,WAAaA,EAAED,CAAO,EAAIC,CAAE,EACrD,IAAKA,GAAMH,GAAcG,EAAGD,CAAO,CAAC,EAEhCiB,EAEF,CAAC,EAELpB,EAAK,QAASI,GAAM,CACnBgB,EAAYhB,EAAE,IAAI,EAAIA,EAAE,IACpB,MAAM,QAAQA,EAAE,KAAK,GACxBA,EAAE,MAAM,QAASiB,GAAU,CAC1BD,EAAYC,CAAK,EAAIjB,EAAE,GACxB,CAAC,CAEH,CAAC,EAED,IAAMkB,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,OAAA5B,EAAK,QAASI,GAAM,CACnBA,EAAE,SAAS,QAASL,GAAQ,CAC3B,IAAM8B,EAAWX,IAAoBd,EAAE,KAAML,CAAG,GAAK,CAAC,EAChD+B,EAAQ,CACb,IAAK/B,EACL,YAAa,YACb,GAAIK,GAAG,OAAS,CAAC,EACjB,GAAGyB,EAAS,KACb,EAEAD,EAAY,KAAK,CAChB,IAAK,SACL,MAAAE,EACA,GAAGD,CACJ,CAAC,CACF,CAAC,EACDzB,EAAE,QAAQ,QAASL,GAAQ,CAC1B,IAAM8B,EAAWZ,IAAqBb,EAAE,KAAML,CAAG,GAAK,CAAC,EACjD+B,EAAQ,CACb,KAAM/B,EACN,IAAK,aACL,YAAa,YACb,GAAIK,GAAG,OAAS,CAAC,EACjB,GAAGyB,EAAS,KACb,EACAD,EAAY,KAAK,CAChB,IAAK,OACL,MAAAE,EACA,GAAGD,CACJ,CAAC,CACF,CAAC,CACF,CAAC,EAEMD,CACR,CACD,CACD,EAEA,OAAItC,IAAS0B,GACZM,EAAQ,QACP,uBAAoBF,EAAa,CAChC,QAAS,KACV,CAAC,CACF,EAGME,CACR,CC/MA,IAAAS,EAAe,mBACfC,EAAiB,qBAOjB,SAASC,EAAMC,EAAsB,CACpC,OAAOA,EAAK,QAAQ,MAAO,GAAG,CAC/B,CAKA,SAASC,GAAWC,EAAqB,CACxC,OAAOA,EAAI,QAAQ,YAAa,CAACC,EAAGC,IAAOA,EAAIA,EAAE,YAAY,EAAI,EAAG,EAAE,QAAQ,MAAQA,GAAMA,EAAE,YAAY,CAAC,CAC5G,CAMA,SAASC,GAAoBC,EAA6B,CAAC,EAAW,CACrE,GAAM,CACL,IAAAC,EAAM,iBACN,WAAAC,EAAa,0BACb,IAAAC,EAAM,GACN,QAAAC,EAAU,uBACV,KAAAC,EAAO,GACP,WAAAC,EAAa,CAAC,MAAO,MAAO,KAAK,EACjC,UAAAC,CACD,EAAIP,EAEAQ,EACEC,EAAe,IAAI,IAWnBC,EAAmBC,GAA6B,CAErD,IAAIC,EAAOD,EACX,QAAWE,KAAOP,EACjB,GAAIM,EAAK,SAAS,IAAIC,CAAG,EAAE,EAAG,CAC7BD,EAAOA,EAAK,MAAM,EAAG,CAACC,EAAI,OAAS,CAAC,EACpC,KACD,CAID,GAAID,EAAK,SAAS,QAAQ,GAAKA,EAAK,SAAS,SAAS,EAAG,CACxD,IAAME,EAAQF,EAAK,MAAM,OAAO,EAChCA,EAAOE,EAAMA,EAAM,OAAS,CAAC,GAAKA,EAAMA,EAAM,OAAS,CAAC,CACzD,KAAO,CACN,IAAMA,EAAQF,EAAK,MAAM,OAAO,EAChCA,EAAOE,EAAMA,EAAM,OAAS,CAAC,CAC9B,CAEA,OAAIP,EACIA,EAAUK,CAAI,EAEdjB,GAAWiB,CAAI,CAExB,EAGMG,EAAgB,CAACC,EAAiBC,EAAQ,IAAgB,CAC/D,IAAMC,EAAkB,CAAC,EAEzB,GAAI,CAAC,EAAAC,QAAG,WAAWH,CAAO,EACzB,OAAOE,EAGR,IAAME,EAAU,EAAAD,QAAG,YAAYH,EAAS,CAAE,cAAe,EAAK,CAAC,EAE/D,QAAWK,KAASD,EAAS,CAC5B,IAAME,EAAW,EAAA5B,QAAK,KAAKsB,EAASK,EAAM,IAAI,EAE9C,GAAIA,EAAM,YAAY,EAAG,CAExB,GAAIA,EAAM,OAAS,gBAAkBA,EAAM,KAAK,WAAW,IAAI,EAC9D,UAIGhB,GAAQY,IAAU,IACrBC,EAAM,KAAK,GAAGH,EAAcO,EAAUL,EAAQ,CAAC,CAAC,CAElD,SAAWI,EAAM,OAAO,EAAG,CAE1B,IAAMR,EAAM,EAAAnB,QAAK,QAAQ2B,EAAM,IAAI,EAAE,MAAM,CAAC,EACxCf,EAAW,SAASO,CAAG,GAC1BK,EAAM,KAAKI,CAAQ,CAErB,CACD,CAEA,OAAOJ,CACR,EAGMK,EAAiB,IAAY,CAClCd,EAAa,MAAM,EAEnB,IAAMe,EAAU,EAAA9B,QAAK,QAAQc,EAAO,KAAMP,CAAG,EAE7C,GAAI,CAAC,EAAAkB,QAAG,WAAWK,CAAO,EAAG,CAC5B,QAAQ,KAAK,gDAAgDA,CAAO,EAAE,EACtE,MACD,CAEcT,EAAcS,CAAO,EAE7B,QAASC,GAAiB,CAC/B,IAAMC,EAAe,EAAAhC,QAAK,SAAS8B,EAASC,CAAY,EAClDE,EAAgBjB,EAAgBgB,CAAY,EAElDjB,EAAa,IAAIkB,EAAe,CAC/B,KAAMA,EACN,KAAMF,CACP,CAAC,CACF,CAAC,CACF,EAGMG,EAAuB,IAAY,CACxC,GAAInB,EAAa,OAAS,EAAG,OAE7B,IAAMoB,EAAa,MAAM,KAAKpB,EAAa,OAAO,CAAC,EAAE,KAAK,CAACqB,EAAGC,IAAMD,EAAE,KAAK,cAAcC,EAAE,IAAI,CAAC,EAE1FC,EAAmB,EAAAtC,QAAK,QAAQc,EAAO,KAAMN,CAAU,EACvD+B,EAAe,EAAAvC,QAAK,QAAQsC,CAAgB,EAE5CE,EAAkB,CAAC,EACzBA,EAAM,KAAK,sBAAsB,EACjCA,EAAM,KAAK,uBAAuB,EAClCA,EAAM,KAAK,gBAAgB,EAC3BA,EAAM,KAAK,iDAAiD,EAC5DA,EAAM,KAAK,mCAAmC,EAC9CA,EAAM,KAAK,mCAAmC,EAC9CA,EAAM,KAAK,EAAE,EACbA,EAAM,KAAK,iCAAiC,EAC5CA,EAAM,KAAK,EAAE,EAGbL,EAAW,QAAQ,CAAC,CAAE,KAAAjB,EAAM,KAAAuB,CAAK,IAAM,CACtC,IAAMT,EAAejC,EAAM,EAAAC,QAAK,SAASuC,EAAcE,CAAI,CAAC,EACtDC,EAAaV,EAAa,WAAW,GAAG,EAAIA,EAAe,KAAKA,CAAY,GAClFQ,EAAM,KAAK,UAAUtB,CAAI,UAAUwB,CAAU,IAAI,EACjDF,EAAM,KAAK,YAAYtB,CAAI,KAAK,EAChCsB,EAAM,KAAK,eAAetB,CAAI,kCAAkCA,CAAI,IAAI,CACzE,CAAC,EAEDsB,EAAM,KAAK,EAAE,EACbA,EAAM,KAAK,yDAAiB,EAC5BA,EAAM,KAAK,sDAAsD,EAEjEL,EAAW,QAAQ,CAAC,CAAE,KAAAjB,CAAK,IAAM,CAChCsB,EAAM,KAAK,kBAAkBtB,CAAI,UAAUA,CAAI,IAAI,CACpD,CAAC,EAEDsB,EAAM,KAAK,GAAG,EACdA,EAAM,KAAK,EAAE,EAEb,IAAMG,EAAO,GAAGH,EAAM,KAAK;AAAA,CAAI,CAAC;AAAA,EAE1BI,EAAe,EAAAnB,QAAG,WAAWa,CAAgB,EAAI,EAAAb,QAAG,aAAaa,EAAkB,OAAO,EAAI,GAEhGK,IAASC,GACZ,EAAAnB,QAAG,cAAca,EAAkBK,EAAM,OAAO,CAElD,EAGME,EAAc,IAAY,CAC/B,GAAI,CAACpC,GAAOM,EAAa,OAAS,EAAG,OAErC,IAAMoB,EAAa,MAAM,KAAKpB,EAAa,OAAO,CAAC,EAAE,KAAK,CAACqB,EAAGC,IAAMD,EAAE,KAAK,cAAcC,EAAE,IAAI,CAAC,EAE1FS,EAAc,EAAA9C,QAAK,QAAQc,EAAO,KAAMJ,CAAO,EAC/CqC,EAAS,EAAA/C,QAAK,QAAQ8C,CAAW,EAGjCN,EAAkB,CAAC,EACzBA,EAAM,KAAK,iCAAiC,EAC5CA,EAAM,KAAK,iDAAiD,EAC5DA,EAAM,KAAK,mCAAmC,EAC9CA,EAAM,KAAK,mCAAmC,EAC9CA,EAAM,KAAK,EAAE,EACbA,EAAM,KAAK,6BAA6B,EACxCA,EAAM,KAAK,EAAE,EACbA,EAAM,KAAK,+BAA+B,EAC1CA,EAAM,KAAK,sCAAsC,EACjDA,EAAM,KAAK,sCAAsC,EAEjDL,EAAW,QAAQ,CAAC,CAAE,KAAAjB,EAAM,KAAAuB,CAAK,IAAM,CAEtC,IAAIT,EAAejC,EAAM,EAAAC,QAAK,SAAS+C,EAAQN,CAAI,CAAC,EAGpDT,EAAeA,EAAa,QAAQ,mBAAoB,EAAE,EAG1D,IAAMU,EAAaV,EAAa,WAAW,GAAG,EAAIA,EAAe,KAAKA,CAAY,GAElFQ,EAAM,KAAK,KAAKtB,CAAI,qBAAqBwB,CAAU,iBAAiB,CACrE,CAAC,EAEDF,EAAM,KAAK,IAAI,EACfA,EAAM,KAAK,GAAG,EACdA,EAAM,KAAK,EAAE,EACbA,EAAM,KAAK,YAAY,EAEvB,IAAMG,EAAO,GAAGH,EAAM,KAAK;AAAA,CAAI,CAAC;AAAA,EAG3B,EAAAf,QAAG,WAAWsB,CAAM,GACxB,EAAAtB,QAAG,UAAUsB,EAAQ,CAAE,UAAW,EAAK,CAAC,EAIzC,IAAMH,EAAe,EAAAnB,QAAG,WAAWqB,CAAW,EAAI,EAAArB,QAAG,aAAaqB,EAAa,OAAO,EAAI,GAEtFH,IAASC,GACZ,EAAAnB,QAAG,cAAcqB,EAAaH,EAAM,OAAO,CAE7C,EAEA,MAAO,CACN,KAAM,yCACN,QAAS,OACT,eAAiBK,GAAyD,CAEzElC,EAASkC,CACV,EACA,YAAmC,CAClCnB,EAAe,EACfK,EAAqB,EACrBW,EAAY,CACb,EAEA,gBAAgBI,EAAuB,CACtC,IAAMnB,EAAU,EAAA9B,QAAK,QAAQc,EAAO,KAAMP,CAAG,EAG7C,GAAI,EAAAkB,QAAG,WAAWK,CAAO,EAAG,CAC3BmB,EAAO,QAAQ,IAAInB,CAAO,EAE1B,IAAMoB,EAAUC,GAAuB,CAGtC,GAFI,CAACA,GAEDA,EAAK,SAAS,OAAO,EAAG,OAG5B,IAAMhC,EAAM,EAAAnB,QAAK,QAAQmD,CAAI,EAAE,MAAM,CAAC,EACjCvC,EAAW,SAASO,CAAG,IAE5BU,EAAe,EACfK,EAAqB,EACrBW,EAAY,EACb,EAEAI,EAAO,QAAQ,GAAG,MAAOC,CAAM,EAC/BD,EAAO,QAAQ,GAAG,SAAUC,CAAM,EAClCD,EAAO,QAAQ,GAAG,SAAUC,CAAM,CACnC,CACD,CACD,CACD,CCnRA,IAAAE,EAAe,mBACfC,EAAiB,qBAOjB,SAASC,GAAWC,EAAqB,CACxC,OAAOA,EAAI,QAAQ,YAAa,CAACC,EAAGC,IAAOA,EAAIA,EAAE,YAAY,EAAI,EAAG,EAAE,QAAQ,MAAQA,GAAMA,EAAE,YAAY,CAAC,CAC5G,CAKA,SAASC,GAAqBC,EAAoC,CAEjE,IAAMC,EAAqB,kDACrBC,EAAqBF,EAAY,MAAMC,CAAkB,EAC/D,OAAOC,EAAqBA,EAAmB,CAAC,EAAI,IACrD,CAMA,SAASC,GAAgBC,EAAkC,CAAC,EAAW,CACtE,GAAM,CAAE,IAAAC,EAAM,YAAa,WAAAC,EAAa,wBAAyB,KAAAC,EAAO,GAAM,WAAAC,EAAa,CAAC,MAAO,MAAO,KAAK,EAAG,UAAAC,CAAU,EAAIL,EAE5HM,EAGEC,EAAc,CAACC,EAAiBC,EAAqB,CAAC,KACtD,EAAAC,QAAG,WAAWF,CAAO,GAIZ,EAAAE,QAAG,YAAYF,CAAO,EAC9B,QAASG,GAAS,CACvB,IAAMC,EAAW,EAAAC,QAAK,KAAKL,EAASG,CAAI,EAGxC,GAFa,EAAAD,QAAG,SAASE,CAAQ,EAExB,YAAY,EAChBT,GACHI,EAAYK,EAAUH,CAAQ,MAEzB,CACN,IAAMK,EAAM,EAAAD,QAAK,QAAQD,CAAQ,EAAE,MAAM,CAAC,EACtCR,EAAW,SAASU,CAAG,GAC1BL,EAAS,KAAKG,CAAQ,CAExB,CACD,CAAC,EAEMH,GAIFM,EAAsB,IAAY,CACvC,IAAMC,EAAY,EAAAH,QAAK,QAAQP,EAAO,KAAML,CAAG,EAGzCgB,EAFQV,EAAYS,CAAS,EAEe,OAAO,CAACE,EAAKN,IAAa,CAC3E,GAAI,CACH,IAAMO,EAAU,EAAAT,QAAG,aAAaE,EAAU,OAAO,EAC3CQ,EAAgBzB,GAAqBwB,CAAO,EAG5CE,EAAe,IAAI,EAAAR,QAAK,SAASP,EAAO,KAAMM,CAAQ,EAAE,QAAQ,MAAO,GAAG,CAAC,GAG7EU,EACJ,GAAIF,EACHE,EAAYF,MACN,CACN,IAAMG,EAAW,EAAAV,QAAK,SAASD,EAAU,EAAAC,QAAK,QAAQD,CAAQ,CAAC,EAC/DU,EAAYjB,EAAYA,EAAUkB,CAAQ,EAAIhC,GAAWgC,CAAQ,CAClE,CAEAL,EAAIG,CAAY,EAAIC,CACrB,OAASE,EAAO,CACf,QAAQ,MAAM,yBAAyBZ,CAAQ,IAAKY,CAAK,CAC1D,CACA,OAAON,CACR,EAAG,CAAC,CAAC,EAGCO,EAAa,EAAAZ,QAAK,QAAQP,EAAO,KAAMJ,CAAU,EACjDwB,EAAY,EAAAb,QAAK,QAAQY,CAAU,EAGpC,EAAAf,QAAG,WAAWgB,CAAS,GAC3B,EAAAhB,QAAG,UAAUgB,EAAW,CAAE,UAAW,EAAK,CAAC,EAG5C,IAAMC,EAAgB,KAAK,UAAUV,EAAa,KAAM,CAAC,EACzD,EAAAP,QAAG,cAAce,EAAYE,EAAe,OAAO,CACpD,EAEA,MAAO,CACN,KAAM,+BACN,QAAS,OACT,eAAiBC,GAAyD,CAEzEtB,EAASsB,CACV,EACA,YAAmC,CAClCb,EAAoB,CACrB,EAEA,gBAAgBc,EAAuB,CACtC,IAAMC,EAAU,EAAAjB,QAAK,QAAQP,EAAO,KAAML,CAAG,EAG7C,GAAI,EAAAS,QAAG,WAAWoB,CAAO,EAAG,CAC3BD,EAAO,QAAQ,IAAIC,CAAO,EAE1B,IAAMC,EAAUpB,GAAuB,CAGtC,GAFI,CAACA,GAEDA,EAAK,SAAS,OAAO,GAAKA,EAAK,SAAS,OAAO,EAAG,OAGtD,IAAMG,EAAM,EAAAD,QAAK,QAAQF,CAAI,EAAE,MAAM,CAAC,EACjCP,EAAW,SAASU,CAAG,GAE5BC,EAAoB,CACrB,EAEAc,EAAO,QAAQ,GAAG,MAAOE,CAAM,EAC/BF,EAAO,QAAQ,GAAG,SAAUE,CAAM,EAClCF,EAAO,QAAQ,GAAG,SAAUE,CAAM,CACnC,CACD,CACD,CACD,CCvIA,IAAAC,EAAe,mBACfC,EAAiB,qBAGjB,SAASC,EAAQC,EAAaC,EAAS,EAAW,CACjD,OAAOD,EAAI,SAAS,EAAE,SAASC,EAAQ,GAAG,CAC3C,CAEA,SAASC,GAAWC,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,GAAoBC,EAAyB,CACrD,IAAIC,EAEJ,MAAO,CACN,KAAM,kCACN,eAAiBC,GAAyD,CAEzED,EAASC,CACV,EACA,YAAmC,CAGlC,IAAMC,EAAWb,GAFD,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","buildRouterPath","buildSvgIcon","cdnImport","cdnJsDelivrUrl","cdnUnpkgUrl","componentAutoImport","findSvgFile","versionUpdatePlugin","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","rebuild","svgFiles","iconsPath","iconImportContent","iconTypeContent","exportContent","svg","idx","resolvedConfig","server","fullDir","handle","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","cdnJsDelivrUrl","cdnUnpkgUrl","cdnImport","options","modules","enableInDevMode","generateCssLinkTag","generateScriptTag","isBuild","externalMap","alias","plugins","_","command","userConfig","externalGlobals","html","descriptors","cusomize","attrs","import_fs","import_path","slash","path","pascalCase","str","_","c","componentAutoImport","options","dir","exportPath","dts","dtsPath","deep","extensions","formatter","config","componentMap","getNameFromPath","filePath","name","ext","parts","scanDirectory","dirPath","depth","files","fs","entries","entry","fullPath","scanComponents","fullDir","absolutePath","relativePath","componentName","generateAutoRegister","components","a","b","registerFilePath","componentDir","lines","from","importPath","code","existingCode","generateDts","dtsFullPath","dtsDir","resolvedConfig","server","handle","file","import_fs","import_path","pascalCase","str","_","c","extractComponentName","fileContent","defineOptionsRegex","defineOptionsMatch","buildRouterPath","options","dir","exportPath","deep","extensions","formatter","config","getAllFiles","dirPath","fileList","fs","file","filePath","path","ext","generatePathNameMap","targetDir","pathNameMap","acc","content","componentName","relativePath","finalName","fileName","error","outputPath","outputDir","outputContent","resolvedConfig","server","fullDir","handle","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/routerPath/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 \"./routerPath\";\nexport * from \"./routerPath/type\";\nexport * from \"./versionUpdate\";\n","import fs from \"fs\";\nimport path from \"path\";\nimport type { Plugin, ResolvedConfig, ViteDevServer } 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\tconst rebuild = (): void => {\n\t\tconst svgFiles = findSvgFile(path.resolve(config.root, dir));\n\n\t\tconst iconsPath = path.resolve(config.root, writeDir);\n\t\tfs.mkdirSync(iconsPath, { recursive: true });\n\n\t\tlet iconImportContent = \"\";\n\t\tlet iconTypeContent = \"\";\n\t\tlet exportContent = \"\";\n\n\t\tsvgFiles.forEach((svg, idx) => {\n\t\t\twriteTSXIcon(svg.componentName, path.join(iconsPath, svg.iconName), svg.iconContent);\n\n\t\t\ticonImportContent += `import { ${svg.componentName} } from \"./${svg.iconName}\";\n`;\n\n\t\t\ticonTypeContent += `\t${svg.componentName},`;\n\n\t\t\texportContent += `export * from \"./${svg.iconName}\";\n`;\n\n\t\t\tif (idx + 1 < svgFiles.length) {\n\t\t\t\ticonTypeContent += \"\\n\";\n\t\t\t}\n\t\t});\n\n\t\tfs.writeFileSync(\n\t\t\tpath.join(iconsPath, \"index.ts\"),\n\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);\n\t};\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\trebuild();\n\t\t},\n\t\t// eslint-disable-next-line @typescript-eslint/explicit-function-return-type\n\t\tconfigureServer(server: ViteDevServer) {\n\t\t\tconst fullDir = path.resolve(config.root, dir);\n\n\t\t\t// 监听文件变化\n\t\t\tif (fs.existsSync(fullDir)) {\n\t\t\t\tserver.watcher.add(fullDir);\n\n\t\t\t\tconst handle = (file: string): void => {\n\t\t\t\t\tif (!file) return;\n\t\t\t\t\tif (!file.endsWith(\".svg\")) return;\n\n\t\t\t\t\trebuild();\n\t\t\t\t};\n\n\t\t\t\tserver.watcher.on(\"add\", handle);\n\t\t\t\tserver.watcher.on(\"change\", handle);\n\t\t\t\tserver.watcher.on(\"unlink\", handle);\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\nconst cdnJsDelivrUrl = \"https://cdn.jsdelivr.net/npm/{name}@{version}/{path}\";\nconst cdnUnpkgUrl = \"https://unpkg.com/{package}@{version}/{path}\";\n\n/**\n * CDN 导入\n * @param options\n * @returns\n */\nfunction cdnImport(options: CdnImportOptions): Plugin[] {\n\tconst { modules = [], prodUrl = cdnJsDelivrUrl, enableInDevMode = false, generateCssLinkTag, generateScriptTag } = 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, cdnJsDelivrUrl, cdnUnpkgUrl };\n","import fs from \"fs\";\nimport path from \"path\";\nimport type { AutoImportOptions } from \"./type\";\nimport type { Plugin, ResolvedConfig, ViteDevServer } from \"vite\";\n\n/**\n * 将路径转换为 Unix 风格\n */\nfunction slash(path: string): string {\n\treturn path.replace(/\\\\/g, \"/\");\n}\n\n/**\n * Pascal Case 转换\n */\nfunction pascalCase(str: string): string {\n\treturn str.replace(/[-_](\\w)/g, (_, c) => (c ? c.toUpperCase() : \"\")).replace(/^\\w/, (c) => c.toUpperCase());\n}\n\n/**\n * 组件自动导入\n * @param options 选项\n */\nfunction componentAutoImport(options: AutoImportOptions = {}): Plugin {\n\tconst {\n\t\tdir = \"src/components\",\n\t\texportPath = \"src/components/index.ts\",\n\t\tdts = true,\n\t\tdtsPath = \"types/components.d.ts\",\n\t\tdeep = true,\n\t\textensions = [\"vue\", \"tsx\", \"jsx\"],\n\t\tformatter,\n\t} = options;\n\n\tlet config: ResolvedConfig;\n\tconst componentMap = new Map<\n\t\tstring,\n\t\t{\n\t\t\t/** 组件名称 (PascalCase) */\n\t\t\tname: string;\n\t\t\t/** 组件文件路径 (绝对路径) */\n\t\t\tfrom: string;\n\t\t}\n\t>();\n\n\t/** 从文件路径获取组件名 */\n\tconst getNameFromPath = (filePath: string): string => {\n\t\t// 移除扩展名\n\t\tlet name = filePath;\n\t\tfor (const ext of extensions) {\n\t\t\tif (name.endsWith(`.${ext}`)) {\n\t\t\t\tname = name.slice(0, -ext.length - 1);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\t// 如果是 index 文件,使用父目录名\n\t\tif (name.endsWith(\"/index\") || name.endsWith(\"\\\\index\")) {\n\t\t\tconst parts = name.split(/[\\\\/]/);\n\t\t\tname = parts[parts.length - 2] || parts[parts.length - 1];\n\t\t} else {\n\t\t\tconst parts = name.split(/[\\\\/]/);\n\t\t\tname = parts[parts.length - 1];\n\t\t}\n\n\t\tif (formatter) {\n\t\t\treturn formatter(name);\n\t\t} else {\n\t\t\treturn pascalCase(name);\n\t\t}\n\t};\n\n\t/** 递归扫描目录 */\n\tconst scanDirectory = (dirPath: string, depth = 0): string[] => {\n\t\tconst files: string[] = [];\n\n\t\tif (!fs.existsSync(dirPath)) {\n\t\t\treturn files;\n\t\t}\n\n\t\tconst entries = fs.readdirSync(dirPath, { withFileTypes: true });\n\n\t\tfor (const entry of entries) {\n\t\t\tconst fullPath = path.join(dirPath, entry.name);\n\n\t\t\tif (entry.isDirectory()) {\n\t\t\t\t// 跳过 node_modules 等\n\t\t\t\tif (entry.name === \"node_modules\" || entry.name.startsWith(\". \")) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// 深度扫描\n\t\t\t\tif (deep || depth === 0) {\n\t\t\t\t\tfiles.push(...scanDirectory(fullPath, depth + 1));\n\t\t\t\t}\n\t\t\t} else if (entry.isFile()) {\n\t\t\t\t// 检查文件扩展名\n\t\t\t\tconst ext = path.extname(entry.name).slice(1);\n\t\t\t\tif (extensions.includes(ext)) {\n\t\t\t\t\tfiles.push(fullPath);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn files;\n\t};\n\n\t/** 扫描组件文件 */\n\tconst scanComponents = (): void => {\n\t\tcomponentMap.clear();\n\n\t\tconst fullDir = path.resolve(config.root, dir);\n\n\t\tif (!fs.existsSync(fullDir)) {\n\t\t\tconsole.warn(`[component-auto-import] Directory not found: ${fullDir}`);\n\t\t\treturn;\n\t\t}\n\n\t\tconst files = scanDirectory(fullDir);\n\n\t\tfiles.forEach((absolutePath) => {\n\t\t\tconst relativePath = path.relative(fullDir, absolutePath);\n\t\t\tconst componentName = getNameFromPath(relativePath);\n\n\t\t\tcomponentMap.set(componentName, {\n\t\t\t\tname: componentName,\n\t\t\t\tfrom: absolutePath,\n\t\t\t});\n\t\t});\n\t};\n\n\t/** 生成自动注册文件 */\n\tconst generateAutoRegister = (): void => {\n\t\tif (componentMap.size === 0) return;\n\n\t\tconst components = Array.from(componentMap.values()).sort((a, b) => a.name.localeCompare(b.name));\n\n\t\tconst registerFilePath = path.resolve(config.root, exportPath);\n\t\tconst componentDir = path.dirname(registerFilePath);\n\n\t\tconst lines: string[] = [];\n\t\tlines.push(\"/* eslint-disable */\");\n\t\tlines.push(\"/* prettier-ignore */\");\n\t\tlines.push(\"// @ts-nocheck\");\n\t\tlines.push(\"// Auto-generated by fast component-auto-import\");\n\t\tlines.push(\"// Generated by fast-vite-plugins\");\n\t\tlines.push(\"// Do not edit this file manually\");\n\t\tlines.push(\"\");\n\t\tlines.push('import type { App } from \"vue\";');\n\t\tlines.push(\"\");\n\n\t\t// 生成 import 语句\n\t\tcomponents.forEach(({ name, from }) => {\n\t\t\tconst relativePath = slash(path.relative(componentDir, from));\n\t\t\tconst importPath = relativePath.startsWith(\".\") ? relativePath : `./${relativePath}`;\n\t\t\tlines.push(`import ${name} from \"${importPath}\";`);\n\t\t\tlines.push(`export { ${name} };`);\n\t\t\tlines.push(`export type ${name}Instance = InstanceType<typeof ${name}>;`);\n\t\t});\n\n\t\tlines.push(\"\");\n\t\tlines.push(\"/** 自动注册所有组件 */\");\n\t\tlines.push(\"export function registerComponents(app: App): void {\");\n\n\t\tcomponents.forEach(({ name }) => {\n\t\t\tlines.push(`\tapp.component(${name}.name, ${name});`);\n\t\t});\n\n\t\tlines.push(\"}\");\n\t\tlines.push(\"\");\n\n\t\tconst code = `${lines.join(\"\\n\")}\\n`;\n\n\t\tconst existingCode = fs.existsSync(registerFilePath) ? fs.readFileSync(registerFilePath, \"utf-8\") : \"\";\n\n\t\tif (code !== existingCode) {\n\t\t\tfs.writeFileSync(registerFilePath, code, \"utf-8\");\n\t\t}\n\t};\n\n\t/** 生成类型声明文件 */\n\tconst generateDts = (): void => {\n\t\tif (!dts || componentMap.size === 0) return;\n\n\t\tconst components = Array.from(componentMap.values()).sort((a, b) => a.name.localeCompare(b.name));\n\n\t\tconst dtsFullPath = path.resolve(config.root, dtsPath);\n\t\tconst dtsDir = path.dirname(dtsFullPath);\n\n\t\t// 生成类型声明内容\n\t\tconst lines: string[] = [];\n\t\tlines.push(\"// For this project development\");\n\t\tlines.push(\"// Auto-generated by fast component-auto-import\");\n\t\tlines.push(\"// Generated by fast-vite-plugins\");\n\t\tlines.push(\"// Do not edit this file manually\");\n\t\tlines.push(\"\");\n\t\tlines.push('import \"@vue/runtime-core\";');\n\t\tlines.push(\"\");\n\t\tlines.push(\"// GlobalComponents for Volar\");\n\t\tlines.push('declare module \"@vue/runtime-core\" {');\n\t\tlines.push(\"\texport interface GlobalComponents {\");\n\n\t\tcomponents.forEach(({ name, from }) => {\n\t\t\t// 计算相对路径\n\t\t\tlet relativePath = slash(path.relative(dtsDir, from));\n\n\t\t\t// 移除文件扩展名\n\t\t\trelativePath = relativePath.replace(/\\.(vue|tsx|jsx)$/, \"\");\n\n\t\t\t// 确保以 ./ 开头\n\t\t\tconst importPath = relativePath.startsWith(\".\") ? relativePath : `./${relativePath}`;\n\n\t\t\tlines.push(`\t\t${name}: (typeof import(\"${importPath}\"))[\"default\"];`);\n\t\t});\n\n\t\tlines.push(\"\t}\");\n\t\tlines.push(\"}\");\n\t\tlines.push(\"\");\n\t\tlines.push(\"export {};\");\n\n\t\tconst code = `${lines.join(\"\\n\")}\\n`;\n\n\t\t// 确保目录存在\n\t\tif (!fs.existsSync(dtsDir)) {\n\t\t\tfs.mkdirSync(dtsDir, { recursive: true });\n\t\t}\n\n\t\t// 只有内容变化时才写入\n\t\tconst existingCode = fs.existsSync(dtsFullPath) ? fs.readFileSync(dtsFullPath, \"utf-8\") : \"\";\n\n\t\tif (code !== existingCode) {\n\t\t\tfs.writeFileSync(dtsFullPath, code, \"utf-8\");\n\t\t}\n\t};\n\n\treturn {\n\t\tname: \"fast-vite-plugin-component-auto-import\",\n\t\tenforce: \"post\",\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\tscanComponents();\n\t\t\tgenerateAutoRegister();\n\t\t\tgenerateDts();\n\t\t},\n\t\t// eslint-disable-next-line @typescript-eslint/explicit-function-return-type\n\t\tconfigureServer(server: ViteDevServer) {\n\t\t\tconst fullDir = path.resolve(config.root, dir);\n\n\t\t\t// 监听文件变化\n\t\t\tif (fs.existsSync(fullDir)) {\n\t\t\t\tserver.watcher.add(fullDir);\n\n\t\t\t\tconst handle = (file: string): void => {\n\t\t\t\t\tif (!file) return;\n\t\t\t\t\t// 忽略 .d.ts 文件\n\t\t\t\t\tif (file.endsWith(\".d.ts\")) return;\n\n\t\t\t\t\t// 检查是否是组件文件\n\t\t\t\t\tconst ext = path.extname(file).slice(1);\n\t\t\t\t\tif (!extensions.includes(ext)) return;\n\n\t\t\t\t\tscanComponents();\n\t\t\t\t\tgenerateAutoRegister();\n\t\t\t\t\tgenerateDts();\n\t\t\t\t};\n\n\t\t\t\tserver.watcher.on(\"add\", handle);\n\t\t\t\tserver.watcher.on(\"change\", handle);\n\t\t\t\tserver.watcher.on(\"unlink\", handle);\n\t\t\t}\n\t\t},\n\t};\n}\n\nexport { componentAutoImport };\n","import fs from \"fs\";\nimport path from \"path\";\nimport type { BuildRouterPathOptions } from \"./type\";\nimport type { Plugin, ResolvedConfig, ViteDevServer } from \"vite\";\n\n/**\n * Pascal Case 转换\n */\nfunction pascalCase(str: string): string {\n\treturn str.replace(/[-_](\\w)/g, (_, c) => (c ? c.toUpperCase() : \"\")).replace(/^\\w/, (c) => c.toUpperCase());\n}\n\n/**\n * 从文件内容中提取组件名称\n */\nfunction extractComponentName(fileContent: string): string | null {\n\t// 匹配 defineOptions({ name: 'xxx' })\n\tconst defineOptionsRegex = /defineOptions\\(\\s*\\{\\s*name:\\s*[\"']([^\"']+)[\"']/;\n\tconst defineOptionsMatch = fileContent.match(defineOptionsRegex);\n\treturn defineOptionsMatch ? defineOptionsMatch[1] : null;\n}\n\n/**\n * 路由路径生成\n * @param options 选项\n */\nfunction buildRouterPath(options: BuildRouterPathOptions = {}): Plugin {\n\tconst { dir = \"src/views\", exportPath = \"src/router/index.json\", deep = true, extensions = [\"vue\", \"tsx\", \"jsx\"], formatter } = options;\n\n\tlet config: ResolvedConfig;\n\n\t/** 递归获取目录下所有符合扩展名的文件*/\n\tconst getAllFiles = (dirPath: string, fileList: string[] = []): string[] => {\n\t\tif (!fs.existsSync(dirPath)) {\n\t\t\treturn fileList;\n\t\t}\n\n\t\tconst files = fs.readdirSync(dirPath);\n\t\tfiles.forEach((file) => {\n\t\t\tconst filePath = path.join(dirPath, file);\n\t\t\tconst stat = fs.statSync(filePath);\n\n\t\t\tif (stat.isDirectory()) {\n\t\t\t\tif (deep) {\n\t\t\t\t\tgetAllFiles(filePath, fileList);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tconst ext = path.extname(filePath).slice(1);\n\t\t\t\tif (extensions.includes(ext)) {\n\t\t\t\t\tfileList.push(filePath);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\treturn fileList;\n\t};\n\n\t/** 生成路径-名称映射 */\n\tconst generatePathNameMap = (): void => {\n\t\tconst targetDir = path.resolve(config.root, dir);\n\t\tconst files = getAllFiles(targetDir);\n\n\t\tconst pathNameMap: Record<string, string> = files.reduce((acc, filePath) => {\n\t\t\ttry {\n\t\t\t\tconst content = fs.readFileSync(filePath, \"utf-8\");\n\t\t\t\tconst componentName = extractComponentName(content);\n\n\t\t\t\t// 生成相对路径\n\t\t\t\tconst relativePath = `/${path.relative(config.root, filePath).replace(/\\\\/g, \"/\")}`;\n\n\t\t\t\t// 确定最终的组件名称\n\t\t\t\tlet finalName: string;\n\t\t\t\tif (componentName) {\n\t\t\t\t\tfinalName = componentName;\n\t\t\t\t} else {\n\t\t\t\t\tconst fileName = path.basename(filePath, path.extname(filePath));\n\t\t\t\t\tfinalName = formatter ? formatter(fileName) : pascalCase(fileName);\n\t\t\t\t}\n\n\t\t\t\tacc[relativePath] = finalName;\n\t\t\t} catch (error) {\n\t\t\t\tconsole.error(`Error processing file ${filePath}:`, error);\n\t\t\t}\n\t\t\treturn acc;\n\t\t}, {});\n\n\t\t// 写入 JSON 文件\n\t\tconst outputPath = path.resolve(config.root, exportPath);\n\t\tconst outputDir = path.dirname(outputPath);\n\n\t\t// 确保输出目录存在\n\t\tif (!fs.existsSync(outputDir)) {\n\t\t\tfs.mkdirSync(outputDir, { recursive: true });\n\t\t}\n\n\t\tconst outputContent = JSON.stringify(pathNameMap, null, 2);\n\t\tfs.writeFileSync(outputPath, outputContent, \"utf-8\");\n\t};\n\n\treturn {\n\t\tname: \"fast-vite-plugin-router-path\",\n\t\tenforce: \"post\",\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\tgeneratePathNameMap();\n\t\t},\n\t\t// eslint-disable-next-line @typescript-eslint/explicit-function-return-type\n\t\tconfigureServer(server: ViteDevServer) {\n\t\t\tconst fullDir = path.resolve(config.root, dir);\n\n\t\t\t// 监听文件变化\n\t\t\tif (fs.existsSync(fullDir)) {\n\t\t\t\tserver.watcher.add(fullDir);\n\n\t\t\t\tconst handle = (file: string): void => {\n\t\t\t\t\tif (!file) return;\n\t\t\t\t\t// 忽略 . d.ts 文件和 JSON 文件\n\t\t\t\t\tif (file.endsWith(\".d.ts\") || file.endsWith(\".json\")) return;\n\n\t\t\t\t\t// 检查是否是组件文件\n\t\t\t\t\tconst ext = path.extname(file).slice(1);\n\t\t\t\t\tif (!extensions.includes(ext)) return;\n\n\t\t\t\t\tgeneratePathNameMap();\n\t\t\t\t};\n\n\t\t\t\tserver.watcher.on(\"add\", handle);\n\t\t\t\tserver.watcher.on(\"change\", handle);\n\t\t\t\tserver.watcher.on(\"unlink\", handle);\n\t\t\t}\n\t\t},\n\t};\n}\n\nexport { buildRouterPath };\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","buildRouterPath","buildSvgIcon","cdnImport","cdnJsDelivrUrl","cdnUnpkgUrl","componentAutoImport","findSvgFile","versionUpdatePlugin","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","rebuild","svgFiles","iconsPath","iconImportContent","iconTypeContent","exportContent","svg","idx","resolvedConfig","server","fullDir","handle","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","cdnJsDelivrUrl","cdnUnpkgUrl","cdnImport","options","modules","enableInDevMode","generateCssLinkTag","generateScriptTag","isBuild","externalMap","alias","plugins","_","command","userConfig","externalGlobals","html","descriptors","cusomize","attrs","import_fs","import_path","slash","path","pascalCase","str","_","c","componentAutoImport","options","dir","exportPath","dts","dtsPath","deep","extensions","formatter","config","componentMap","getNameFromPath","filePath","name","ext","parts","scanDirectory","dirPath","depth","files","fs","entries","entry","fullPath","scanComponents","fullDir","absolutePath","relativePath","componentName","generateAutoRegister","components","a","b","registerFilePath","componentDir","lines","from","importPath","code","existingCode","generateDts","dtsFullPath","dtsDir","resolvedConfig","server","handle","file","import_fs","import_path","pascalCase","str","_","c","extractComponentName","fileContent","defineOptionsRegex","defineOptionsMatch","buildRouterPath","options","dir","exportPath","deep","extensions","formatter","config","getAllFiles","dirPath","fileList","fs","file","filePath","path","ext","generatePathNameMap","targetDir","pathNameMap","acc","content","componentName","relativePath","finalName","fileName","error","outputPath","outputDir","outputContent","resolvedConfig","server","fullDir","handle","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.d.cts CHANGED
@@ -98,7 +98,7 @@ interface AutoImportOptions {
98
98
  dts?: boolean;
99
99
  /**
100
100
  * 类型声明文件路径
101
- * @default "types/component.d.ts"
101
+ * @default "types/components.d.ts"
102
102
  */
103
103
  dtsPath?: string;
104
104
  /**
package/dist/index.d.ts CHANGED
@@ -98,7 +98,7 @@ interface AutoImportOptions {
98
98
  dts?: boolean;
99
99
  /**
100
100
  * 类型声明文件路径
101
- * @default "types/component.d.ts"
101
+ * @default "types/components.d.ts"
102
102
  */
103
103
  dtsPath?: string;
104
104
  /**
package/dist/index.js CHANGED
@@ -24,7 +24,7 @@ ${f}
24
24
  export default [
25
25
  ${m}
26
26
  ] as unknown as DefineComponent[];
27
- `)};return{name:"fast-vite-plugin-build-svg-icon",configResolved:r=>{o=r},buildStart(){u()},configureServer(r){let g=F.resolve(o.root,t);if(j.existsSync(g)){r.watcher.add(g);let c=m=>{m&&m.endsWith(".svg")&&u()};r.watcher.on("add",c),r.watcher.on("change",c),r.watcher.on("unlink",c)}}}}import T from"fs";import J from"path";import V from"rollup-plugin-external-globals";import{viteExternalsPlugin as _}from"vite-plugin-externals";var B=process.env.NODE_ENV==="development";function G(t){let n=process.cwd(),o=J.join(n,"node_modules",t,"package.json");return T.existsSync(o)?JSON.parse(T.readFileSync(o,"utf8")).version:""}function M(t){return!!(t.startsWith("http:")||t.startsWith("https:")||t.startsWith("//"))}function U(t,n){let{path:o}=n;return M(o)&&(t=o),t.replace(/\{name\}/g,n.name).replace(/\{version\}/g,n.version).replace(/\{path\}/g,o)}function H(t,n){n=t.prodUrl||n;let o=t,u=t.version||G(o.name),r=[];Array.isArray(o.path)?r=o.path:r.push(o.path);let g={...o,version:u};r=r.map(f=>{if(!u&&!M(f))throw new Error(`modules: ${g.name} package.json file does not exist`);return U(n,{name:g.name,version:g.version,path:f})});let c=o.css||[];!Array.isArray(c)&&c&&(c=[c]);let m=Array.isArray(c)?c.map(f=>U(n,{name:g.name,version:g.version,path:f})):[];return{...o,version:u,pathList:r,cssList:m}}var z="https://cdn.jsdelivr.net/npm/{name}@{version}/{path}",st="https://unpkg.com/{package}@{version}/{path}";function it(t){let{modules:n=[],prodUrl:o=z,enableInDevMode:u=!1,generateCssLinkTag:r,generateScriptTag:g}=t,c=!1,m=(Array.isArray(n)?n:[n]).map(l=>typeof l=="function"?l(o):l).map(l=>H(l,o)),f={};m.forEach(l=>{f[l.name]=l.var,Array.isArray(l.alias)&&l.alias.forEach(v=>{f[v]=l.var})});let i=[{name:"fast-vite-plugin-cdn-import",enforce:"pre",config(l,{command:v}){c=v==="build";let d={build:{rollupOptions:{plugins:[]}}};return c&&(d.build.rollupOptions.plugins=[V(f)]),d},transformIndexHtml(l){if(!c&&!u)return l;let v=[];return m.forEach(d=>{d.pathList.forEach(h=>{let w=g?.(d.name,h)||{},p={src:h,crossorigin:"anonymous",...d?.attrs??{},...w.attrs};v.push({tag:"script",attrs:p,...w})}),d.cssList.forEach(h=>{let w=r?.(d.name,h)||{},p={href:h,rel:"stylesheet",crossorigin:"anonymous",...d?.attrs??{},...w.attrs};v.push({tag:"link",attrs:p,...w})})}),v}}];return B&&u&&i.push(_(f,{enforce:"pre"})),i}import S from"fs";import C from"path";function O(t){return t.replace(/\\/g,"/")}function L(t){return t.replace(/[-_](\w)/g,(n,o)=>o?o.toUpperCase():"").replace(/^\w/,n=>n.toUpperCase())}function lt(t={}){let{dir:n="src/components",exportPath:o="src/components/index.ts",dts:u=!0,dtsPath:r="types/component.d.ts",deep:g=!0,extensions:c=["vue","tsx","jsx"],formatter:m}=t,f,i=new Map,l=p=>{let s=p;for(let a of c)if(s.endsWith(`.${a}`)){s=s.slice(0,-a.length-1);break}if(s.endsWith("/index")||s.endsWith("\\index")){let a=s.split(/[\\/]/);s=a[a.length-2]||a[a.length-1]}else{let a=s.split(/[\\/]/);s=a[a.length-1]}return m?m(s):L(s)},v=(p,s=0)=>{let a=[];if(!S.existsSync(p))return a;let e=S.readdirSync(p,{withFileTypes:!0});for(let y of e){let $=C.join(p,y.name);if(y.isDirectory()){if(y.name==="node_modules"||y.name.startsWith(". "))continue;(g||s===0)&&a.push(...v($,s+1))}else if(y.isFile()){let x=C.extname(y.name).slice(1);c.includes(x)&&a.push($)}}return a},d=()=>{i.clear();let p=C.resolve(f.root,n);if(!S.existsSync(p)){console.warn(`[component-auto-import] Directory not found: ${p}`);return}v(p).forEach(a=>{let e=C.relative(p,a),y=l(e);i.set(y,{name:y,from:a})})},h=()=>{if(i.size===0)return;let p=Array.from(i.values()).sort((x,b)=>x.name.localeCompare(b.name)),s=C.resolve(f.root,o),a=C.dirname(s),e=[];e.push("/* eslint-disable */"),e.push("/* prettier-ignore */"),e.push("// @ts-nocheck"),e.push("// Auto-generated by fast component-auto-import"),e.push("// Generated by fast-vite-plugins"),e.push("// Do not edit this file manually"),e.push(""),e.push('import type { App } from "vue";'),e.push(""),p.forEach(({name:x,from:b})=>{let P=O(C.relative(a,b)),R=P.startsWith(".")?P:`./${P}`;e.push(`import ${x} from "${R}";`),e.push(`export { ${x} };`),e.push(`export type ${x}Instance = InstanceType<typeof ${x}>;`)}),e.push(""),e.push("/** \u81EA\u52A8\u6CE8\u518C\u6240\u6709\u7EC4\u4EF6 */"),e.push("export function registerComponents(app: App): void {"),p.forEach(({name:x})=>{e.push(` app.component(${x}.name, ${x});`)}),e.push("}"),e.push("");let y=`${e.join(`
27
+ `)};return{name:"fast-vite-plugin-build-svg-icon",configResolved:r=>{o=r},buildStart(){u()},configureServer(r){let g=F.resolve(o.root,t);if(j.existsSync(g)){r.watcher.add(g);let c=m=>{m&&m.endsWith(".svg")&&u()};r.watcher.on("add",c),r.watcher.on("change",c),r.watcher.on("unlink",c)}}}}import T from"fs";import J from"path";import V from"rollup-plugin-external-globals";import{viteExternalsPlugin as _}from"vite-plugin-externals";var B=process.env.NODE_ENV==="development";function G(t){let n=process.cwd(),o=J.join(n,"node_modules",t,"package.json");return T.existsSync(o)?JSON.parse(T.readFileSync(o,"utf8")).version:""}function M(t){return!!(t.startsWith("http:")||t.startsWith("https:")||t.startsWith("//"))}function U(t,n){let{path:o}=n;return M(o)&&(t=o),t.replace(/\{name\}/g,n.name).replace(/\{version\}/g,n.version).replace(/\{path\}/g,o)}function H(t,n){n=t.prodUrl||n;let o=t,u=t.version||G(o.name),r=[];Array.isArray(o.path)?r=o.path:r.push(o.path);let g={...o,version:u};r=r.map(f=>{if(!u&&!M(f))throw new Error(`modules: ${g.name} package.json file does not exist`);return U(n,{name:g.name,version:g.version,path:f})});let c=o.css||[];!Array.isArray(c)&&c&&(c=[c]);let m=Array.isArray(c)?c.map(f=>U(n,{name:g.name,version:g.version,path:f})):[];return{...o,version:u,pathList:r,cssList:m}}var z="https://cdn.jsdelivr.net/npm/{name}@{version}/{path}",st="https://unpkg.com/{package}@{version}/{path}";function it(t){let{modules:n=[],prodUrl:o=z,enableInDevMode:u=!1,generateCssLinkTag:r,generateScriptTag:g}=t,c=!1,m=(Array.isArray(n)?n:[n]).map(l=>typeof l=="function"?l(o):l).map(l=>H(l,o)),f={};m.forEach(l=>{f[l.name]=l.var,Array.isArray(l.alias)&&l.alias.forEach(v=>{f[v]=l.var})});let i=[{name:"fast-vite-plugin-cdn-import",enforce:"pre",config(l,{command:v}){c=v==="build";let d={build:{rollupOptions:{plugins:[]}}};return c&&(d.build.rollupOptions.plugins=[V(f)]),d},transformIndexHtml(l){if(!c&&!u)return l;let v=[];return m.forEach(d=>{d.pathList.forEach(h=>{let w=g?.(d.name,h)||{},p={src:h,crossorigin:"anonymous",...d?.attrs??{},...w.attrs};v.push({tag:"script",attrs:p,...w})}),d.cssList.forEach(h=>{let w=r?.(d.name,h)||{},p={href:h,rel:"stylesheet",crossorigin:"anonymous",...d?.attrs??{},...w.attrs};v.push({tag:"link",attrs:p,...w})})}),v}}];return B&&u&&i.push(_(f,{enforce:"pre"})),i}import S from"fs";import C from"path";function O(t){return t.replace(/\\/g,"/")}function L(t){return t.replace(/[-_](\w)/g,(n,o)=>o?o.toUpperCase():"").replace(/^\w/,n=>n.toUpperCase())}function lt(t={}){let{dir:n="src/components",exportPath:o="src/components/index.ts",dts:u=!0,dtsPath:r="types/components.d.ts",deep:g=!0,extensions:c=["vue","tsx","jsx"],formatter:m}=t,f,i=new Map,l=p=>{let s=p;for(let a of c)if(s.endsWith(`.${a}`)){s=s.slice(0,-a.length-1);break}if(s.endsWith("/index")||s.endsWith("\\index")){let a=s.split(/[\\/]/);s=a[a.length-2]||a[a.length-1]}else{let a=s.split(/[\\/]/);s=a[a.length-1]}return m?m(s):L(s)},v=(p,s=0)=>{let a=[];if(!S.existsSync(p))return a;let e=S.readdirSync(p,{withFileTypes:!0});for(let y of e){let $=C.join(p,y.name);if(y.isDirectory()){if(y.name==="node_modules"||y.name.startsWith(". "))continue;(g||s===0)&&a.push(...v($,s+1))}else if(y.isFile()){let x=C.extname(y.name).slice(1);c.includes(x)&&a.push($)}}return a},d=()=>{i.clear();let p=C.resolve(f.root,n);if(!S.existsSync(p)){console.warn(`[component-auto-import] Directory not found: ${p}`);return}v(p).forEach(a=>{let e=C.relative(p,a),y=l(e);i.set(y,{name:y,from:a})})},h=()=>{if(i.size===0)return;let p=Array.from(i.values()).sort((x,b)=>x.name.localeCompare(b.name)),s=C.resolve(f.root,o),a=C.dirname(s),e=[];e.push("/* eslint-disable */"),e.push("/* prettier-ignore */"),e.push("// @ts-nocheck"),e.push("// Auto-generated by fast component-auto-import"),e.push("// Generated by fast-vite-plugins"),e.push("// Do not edit this file manually"),e.push(""),e.push('import type { App } from "vue";'),e.push(""),p.forEach(({name:x,from:b})=>{let P=O(C.relative(a,b)),R=P.startsWith(".")?P:`./${P}`;e.push(`import ${x} from "${R}";`),e.push(`export { ${x} };`),e.push(`export type ${x}Instance = InstanceType<typeof ${x}>;`)}),e.push(""),e.push("/** \u81EA\u52A8\u6CE8\u518C\u6240\u6709\u7EC4\u4EF6 */"),e.push("export function registerComponents(app: App): void {"),p.forEach(({name:x})=>{e.push(` app.component(${x}.name, ${x});`)}),e.push("}"),e.push("");let y=`${e.join(`
28
28
  `)}
29
29
  `,$=S.existsSync(s)?S.readFileSync(s,"utf-8"):"";y!==$&&S.writeFileSync(s,y,"utf-8")},w=()=>{if(!u||i.size===0)return;let p=Array.from(i.values()).sort((x,b)=>x.name.localeCompare(b.name)),s=C.resolve(f.root,r),a=C.dirname(s),e=[];e.push("// For this project development"),e.push("// Auto-generated by fast component-auto-import"),e.push("// Generated by fast-vite-plugins"),e.push("// Do not edit this file manually"),e.push(""),e.push('import "@vue/runtime-core";'),e.push(""),e.push("// GlobalComponents for Volar"),e.push('declare module "@vue/runtime-core" {'),e.push(" export interface GlobalComponents {"),p.forEach(({name:x,from:b})=>{let P=O(C.relative(a,b));P=P.replace(/\.(vue|tsx|jsx)$/,"");let R=P.startsWith(".")?P:`./${P}`;e.push(` ${x}: (typeof import("${R}"))["default"];`)}),e.push(" }"),e.push("}"),e.push(""),e.push("export {};");let y=`${e.join(`
30
30
  `)}
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/buildSvgIcon/index.ts","../../src/cdnImport/index.ts","../../src/componentAutoImport/index.ts","../../src/routerPath/index.ts","../../src/versionUpdate/index.ts"],"sourcesContent":["import fs from \"fs\";\nimport path from \"path\";\nimport type { Plugin, ResolvedConfig, ViteDevServer } 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\tconst rebuild = (): void => {\n\t\tconst svgFiles = findSvgFile(path.resolve(config.root, dir));\n\n\t\tconst iconsPath = path.resolve(config.root, writeDir);\n\t\tfs.mkdirSync(iconsPath, { recursive: true });\n\n\t\tlet iconImportContent = \"\";\n\t\tlet iconTypeContent = \"\";\n\t\tlet exportContent = \"\";\n\n\t\tsvgFiles.forEach((svg, idx) => {\n\t\t\twriteTSXIcon(svg.componentName, path.join(iconsPath, svg.iconName), svg.iconContent);\n\n\t\t\ticonImportContent += `import { ${svg.componentName} } from \"./${svg.iconName}\";\n`;\n\n\t\t\ticonTypeContent += `\t${svg.componentName},`;\n\n\t\t\texportContent += `export * from \"./${svg.iconName}\";\n`;\n\n\t\t\tif (idx + 1 < svgFiles.length) {\n\t\t\t\ticonTypeContent += \"\\n\";\n\t\t\t}\n\t\t});\n\n\t\tfs.writeFileSync(\n\t\t\tpath.join(iconsPath, \"index.ts\"),\n\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);\n\t};\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\trebuild();\n\t\t},\n\t\t// eslint-disable-next-line @typescript-eslint/explicit-function-return-type\n\t\tconfigureServer(server: ViteDevServer) {\n\t\t\tconst fullDir = path.resolve(config.root, dir);\n\n\t\t\t// 监听文件变化\n\t\t\tif (fs.existsSync(fullDir)) {\n\t\t\t\tserver.watcher.add(fullDir);\n\n\t\t\t\tconst handle = (file: string): void => {\n\t\t\t\t\tif (!file) return;\n\t\t\t\t\tif (!file.endsWith(\".svg\")) return;\n\n\t\t\t\t\trebuild();\n\t\t\t\t};\n\n\t\t\t\tserver.watcher.on(\"add\", handle);\n\t\t\t\tserver.watcher.on(\"change\", handle);\n\t\t\t\tserver.watcher.on(\"unlink\", handle);\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\nconst cdnJsDelivrUrl = \"https://cdn.jsdelivr.net/npm/{name}@{version}/{path}\";\nconst cdnUnpkgUrl = \"https://unpkg.com/{package}@{version}/{path}\";\n\n/**\n * CDN 导入\n * @param options\n * @returns\n */\nfunction cdnImport(options: CdnImportOptions): Plugin[] {\n\tconst { modules = [], prodUrl = cdnJsDelivrUrl, enableInDevMode = false, generateCssLinkTag, generateScriptTag } = 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, cdnJsDelivrUrl, cdnUnpkgUrl };\n","import fs from \"fs\";\nimport path from \"path\";\nimport type { AutoImportOptions } from \"./type\";\nimport type { Plugin, ResolvedConfig, ViteDevServer } from \"vite\";\n\n/**\n * 将路径转换为 Unix 风格\n */\nfunction slash(path: string): string {\n\treturn path.replace(/\\\\/g, \"/\");\n}\n\n/**\n * Pascal Case 转换\n */\nfunction pascalCase(str: string): string {\n\treturn str.replace(/[-_](\\w)/g, (_, c) => (c ? c.toUpperCase() : \"\")).replace(/^\\w/, (c) => c.toUpperCase());\n}\n\n/**\n * 组件自动导入\n * @param options 选项\n */\nfunction componentAutoImport(options: AutoImportOptions = {}): Plugin {\n\tconst {\n\t\tdir = \"src/components\",\n\t\texportPath = \"src/components/index.ts\",\n\t\tdts = true,\n\t\tdtsPath = \"types/component.d.ts\",\n\t\tdeep = true,\n\t\textensions = [\"vue\", \"tsx\", \"jsx\"],\n\t\tformatter,\n\t} = options;\n\n\tlet config: ResolvedConfig;\n\tconst componentMap = new Map<\n\t\tstring,\n\t\t{\n\t\t\t/** 组件名称 (PascalCase) */\n\t\t\tname: string;\n\t\t\t/** 组件文件路径 (绝对路径) */\n\t\t\tfrom: string;\n\t\t}\n\t>();\n\n\t/** 从文件路径获取组件名 */\n\tconst getNameFromPath = (filePath: string): string => {\n\t\t// 移除扩展名\n\t\tlet name = filePath;\n\t\tfor (const ext of extensions) {\n\t\t\tif (name.endsWith(`.${ext}`)) {\n\t\t\t\tname = name.slice(0, -ext.length - 1);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\t// 如果是 index 文件,使用父目录名\n\t\tif (name.endsWith(\"/index\") || name.endsWith(\"\\\\index\")) {\n\t\t\tconst parts = name.split(/[\\\\/]/);\n\t\t\tname = parts[parts.length - 2] || parts[parts.length - 1];\n\t\t} else {\n\t\t\tconst parts = name.split(/[\\\\/]/);\n\t\t\tname = parts[parts.length - 1];\n\t\t}\n\n\t\tif (formatter) {\n\t\t\treturn formatter(name);\n\t\t} else {\n\t\t\treturn pascalCase(name);\n\t\t}\n\t};\n\n\t/** 递归扫描目录 */\n\tconst scanDirectory = (dirPath: string, depth = 0): string[] => {\n\t\tconst files: string[] = [];\n\n\t\tif (!fs.existsSync(dirPath)) {\n\t\t\treturn files;\n\t\t}\n\n\t\tconst entries = fs.readdirSync(dirPath, { withFileTypes: true });\n\n\t\tfor (const entry of entries) {\n\t\t\tconst fullPath = path.join(dirPath, entry.name);\n\n\t\t\tif (entry.isDirectory()) {\n\t\t\t\t// 跳过 node_modules 等\n\t\t\t\tif (entry.name === \"node_modules\" || entry.name.startsWith(\". \")) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// 深度扫描\n\t\t\t\tif (deep || depth === 0) {\n\t\t\t\t\tfiles.push(...scanDirectory(fullPath, depth + 1));\n\t\t\t\t}\n\t\t\t} else if (entry.isFile()) {\n\t\t\t\t// 检查文件扩展名\n\t\t\t\tconst ext = path.extname(entry.name).slice(1);\n\t\t\t\tif (extensions.includes(ext)) {\n\t\t\t\t\tfiles.push(fullPath);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn files;\n\t};\n\n\t/** 扫描组件文件 */\n\tconst scanComponents = (): void => {\n\t\tcomponentMap.clear();\n\n\t\tconst fullDir = path.resolve(config.root, dir);\n\n\t\tif (!fs.existsSync(fullDir)) {\n\t\t\tconsole.warn(`[component-auto-import] Directory not found: ${fullDir}`);\n\t\t\treturn;\n\t\t}\n\n\t\tconst files = scanDirectory(fullDir);\n\n\t\tfiles.forEach((absolutePath) => {\n\t\t\tconst relativePath = path.relative(fullDir, absolutePath);\n\t\t\tconst componentName = getNameFromPath(relativePath);\n\n\t\t\tcomponentMap.set(componentName, {\n\t\t\t\tname: componentName,\n\t\t\t\tfrom: absolutePath,\n\t\t\t});\n\t\t});\n\t};\n\n\t/** 生成自动注册文件 */\n\tconst generateAutoRegister = (): void => {\n\t\tif (componentMap.size === 0) return;\n\n\t\tconst components = Array.from(componentMap.values()).sort((a, b) => a.name.localeCompare(b.name));\n\n\t\tconst registerFilePath = path.resolve(config.root, exportPath);\n\t\tconst componentDir = path.dirname(registerFilePath);\n\n\t\tconst lines: string[] = [];\n\t\tlines.push(\"/* eslint-disable */\");\n\t\tlines.push(\"/* prettier-ignore */\");\n\t\tlines.push(\"// @ts-nocheck\");\n\t\tlines.push(\"// Auto-generated by fast component-auto-import\");\n\t\tlines.push(\"// Generated by fast-vite-plugins\");\n\t\tlines.push(\"// Do not edit this file manually\");\n\t\tlines.push(\"\");\n\t\tlines.push('import type { App } from \"vue\";');\n\t\tlines.push(\"\");\n\n\t\t// 生成 import 语句\n\t\tcomponents.forEach(({ name, from }) => {\n\t\t\tconst relativePath = slash(path.relative(componentDir, from));\n\t\t\tconst importPath = relativePath.startsWith(\".\") ? relativePath : `./${relativePath}`;\n\t\t\tlines.push(`import ${name} from \"${importPath}\";`);\n\t\t\tlines.push(`export { ${name} };`);\n\t\t\tlines.push(`export type ${name}Instance = InstanceType<typeof ${name}>;`);\n\t\t});\n\n\t\tlines.push(\"\");\n\t\tlines.push(\"/** 自动注册所有组件 */\");\n\t\tlines.push(\"export function registerComponents(app: App): void {\");\n\n\t\tcomponents.forEach(({ name }) => {\n\t\t\tlines.push(`\tapp.component(${name}.name, ${name});`);\n\t\t});\n\n\t\tlines.push(\"}\");\n\t\tlines.push(\"\");\n\n\t\tconst code = `${lines.join(\"\\n\")}\\n`;\n\n\t\tconst existingCode = fs.existsSync(registerFilePath) ? fs.readFileSync(registerFilePath, \"utf-8\") : \"\";\n\n\t\tif (code !== existingCode) {\n\t\t\tfs.writeFileSync(registerFilePath, code, \"utf-8\");\n\t\t}\n\t};\n\n\t/** 生成类型声明文件 */\n\tconst generateDts = (): void => {\n\t\tif (!dts || componentMap.size === 0) return;\n\n\t\tconst components = Array.from(componentMap.values()).sort((a, b) => a.name.localeCompare(b.name));\n\n\t\tconst dtsFullPath = path.resolve(config.root, dtsPath);\n\t\tconst dtsDir = path.dirname(dtsFullPath);\n\n\t\t// 生成类型声明内容\n\t\tconst lines: string[] = [];\n\t\tlines.push(\"// For this project development\");\n\t\tlines.push(\"// Auto-generated by fast component-auto-import\");\n\t\tlines.push(\"// Generated by fast-vite-plugins\");\n\t\tlines.push(\"// Do not edit this file manually\");\n\t\tlines.push(\"\");\n\t\tlines.push('import \"@vue/runtime-core\";');\n\t\tlines.push(\"\");\n\t\tlines.push(\"// GlobalComponents for Volar\");\n\t\tlines.push('declare module \"@vue/runtime-core\" {');\n\t\tlines.push(\"\texport interface GlobalComponents {\");\n\n\t\tcomponents.forEach(({ name, from }) => {\n\t\t\t// 计算相对路径\n\t\t\tlet relativePath = slash(path.relative(dtsDir, from));\n\n\t\t\t// 移除文件扩展名\n\t\t\trelativePath = relativePath.replace(/\\.(vue|tsx|jsx)$/, \"\");\n\n\t\t\t// 确保以 ./ 开头\n\t\t\tconst importPath = relativePath.startsWith(\".\") ? relativePath : `./${relativePath}`;\n\n\t\t\tlines.push(`\t\t${name}: (typeof import(\"${importPath}\"))[\"default\"];`);\n\t\t});\n\n\t\tlines.push(\"\t}\");\n\t\tlines.push(\"}\");\n\t\tlines.push(\"\");\n\t\tlines.push(\"export {};\");\n\n\t\tconst code = `${lines.join(\"\\n\")}\\n`;\n\n\t\t// 确保目录存在\n\t\tif (!fs.existsSync(dtsDir)) {\n\t\t\tfs.mkdirSync(dtsDir, { recursive: true });\n\t\t}\n\n\t\t// 只有内容变化时才写入\n\t\tconst existingCode = fs.existsSync(dtsFullPath) ? fs.readFileSync(dtsFullPath, \"utf-8\") : \"\";\n\n\t\tif (code !== existingCode) {\n\t\t\tfs.writeFileSync(dtsFullPath, code, \"utf-8\");\n\t\t}\n\t};\n\n\treturn {\n\t\tname: \"fast-vite-plugin-component-auto-import\",\n\t\tenforce: \"post\",\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\tscanComponents();\n\t\t\tgenerateAutoRegister();\n\t\t\tgenerateDts();\n\t\t},\n\t\t// eslint-disable-next-line @typescript-eslint/explicit-function-return-type\n\t\tconfigureServer(server: ViteDevServer) {\n\t\t\tconst fullDir = path.resolve(config.root, dir);\n\n\t\t\t// 监听文件变化\n\t\t\tif (fs.existsSync(fullDir)) {\n\t\t\t\tserver.watcher.add(fullDir);\n\n\t\t\t\tconst handle = (file: string): void => {\n\t\t\t\t\tif (!file) return;\n\t\t\t\t\t// 忽略 .d.ts 文件\n\t\t\t\t\tif (file.endsWith(\".d.ts\")) return;\n\n\t\t\t\t\t// 检查是否是组件文件\n\t\t\t\t\tconst ext = path.extname(file).slice(1);\n\t\t\t\t\tif (!extensions.includes(ext)) return;\n\n\t\t\t\t\tscanComponents();\n\t\t\t\t\tgenerateAutoRegister();\n\t\t\t\t\tgenerateDts();\n\t\t\t\t};\n\n\t\t\t\tserver.watcher.on(\"add\", handle);\n\t\t\t\tserver.watcher.on(\"change\", handle);\n\t\t\t\tserver.watcher.on(\"unlink\", handle);\n\t\t\t}\n\t\t},\n\t};\n}\n\nexport { componentAutoImport };\n","import fs from \"fs\";\nimport path from \"path\";\nimport type { BuildRouterPathOptions } from \"./type\";\nimport type { Plugin, ResolvedConfig, ViteDevServer } from \"vite\";\n\n/**\n * Pascal Case 转换\n */\nfunction pascalCase(str: string): string {\n\treturn str.replace(/[-_](\\w)/g, (_, c) => (c ? c.toUpperCase() : \"\")).replace(/^\\w/, (c) => c.toUpperCase());\n}\n\n/**\n * 从文件内容中提取组件名称\n */\nfunction extractComponentName(fileContent: string): string | null {\n\t// 匹配 defineOptions({ name: 'xxx' })\n\tconst defineOptionsRegex = /defineOptions\\(\\s*\\{\\s*name:\\s*[\"']([^\"']+)[\"']/;\n\tconst defineOptionsMatch = fileContent.match(defineOptionsRegex);\n\treturn defineOptionsMatch ? defineOptionsMatch[1] : null;\n}\n\n/**\n * 路由路径生成\n * @param options 选项\n */\nfunction buildRouterPath(options: BuildRouterPathOptions = {}): Plugin {\n\tconst { dir = \"src/views\", exportPath = \"src/router/index.json\", deep = true, extensions = [\"vue\", \"tsx\", \"jsx\"], formatter } = options;\n\n\tlet config: ResolvedConfig;\n\n\t/** 递归获取目录下所有符合扩展名的文件*/\n\tconst getAllFiles = (dirPath: string, fileList: string[] = []): string[] => {\n\t\tif (!fs.existsSync(dirPath)) {\n\t\t\treturn fileList;\n\t\t}\n\n\t\tconst files = fs.readdirSync(dirPath);\n\t\tfiles.forEach((file) => {\n\t\t\tconst filePath = path.join(dirPath, file);\n\t\t\tconst stat = fs.statSync(filePath);\n\n\t\t\tif (stat.isDirectory()) {\n\t\t\t\tif (deep) {\n\t\t\t\t\tgetAllFiles(filePath, fileList);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tconst ext = path.extname(filePath).slice(1);\n\t\t\t\tif (extensions.includes(ext)) {\n\t\t\t\t\tfileList.push(filePath);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\treturn fileList;\n\t};\n\n\t/** 生成路径-名称映射 */\n\tconst generatePathNameMap = (): void => {\n\t\tconst targetDir = path.resolve(config.root, dir);\n\t\tconst files = getAllFiles(targetDir);\n\n\t\tconst pathNameMap: Record<string, string> = files.reduce((acc, filePath) => {\n\t\t\ttry {\n\t\t\t\tconst content = fs.readFileSync(filePath, \"utf-8\");\n\t\t\t\tconst componentName = extractComponentName(content);\n\n\t\t\t\t// 生成相对路径\n\t\t\t\tconst relativePath = `/${path.relative(config.root, filePath).replace(/\\\\/g, \"/\")}`;\n\n\t\t\t\t// 确定最终的组件名称\n\t\t\t\tlet finalName: string;\n\t\t\t\tif (componentName) {\n\t\t\t\t\tfinalName = componentName;\n\t\t\t\t} else {\n\t\t\t\t\tconst fileName = path.basename(filePath, path.extname(filePath));\n\t\t\t\t\tfinalName = formatter ? formatter(fileName) : pascalCase(fileName);\n\t\t\t\t}\n\n\t\t\t\tacc[relativePath] = finalName;\n\t\t\t} catch (error) {\n\t\t\t\tconsole.error(`Error processing file ${filePath}:`, error);\n\t\t\t}\n\t\t\treturn acc;\n\t\t}, {});\n\n\t\t// 写入 JSON 文件\n\t\tconst outputPath = path.resolve(config.root, exportPath);\n\t\tconst outputDir = path.dirname(outputPath);\n\n\t\t// 确保输出目录存在\n\t\tif (!fs.existsSync(outputDir)) {\n\t\t\tfs.mkdirSync(outputDir, { recursive: true });\n\t\t}\n\n\t\tconst outputContent = JSON.stringify(pathNameMap, null, 2);\n\t\tfs.writeFileSync(outputPath, outputContent, \"utf-8\");\n\t};\n\n\treturn {\n\t\tname: \"fast-vite-plugin-router-path\",\n\t\tenforce: \"post\",\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\tgeneratePathNameMap();\n\t\t},\n\t\t// eslint-disable-next-line @typescript-eslint/explicit-function-return-type\n\t\tconfigureServer(server: ViteDevServer) {\n\t\t\tconst fullDir = path.resolve(config.root, dir);\n\n\t\t\t// 监听文件变化\n\t\t\tif (fs.existsSync(fullDir)) {\n\t\t\t\tserver.watcher.add(fullDir);\n\n\t\t\t\tconst handle = (file: string): void => {\n\t\t\t\t\tif (!file) return;\n\t\t\t\t\t// 忽略 . d.ts 文件和 JSON 文件\n\t\t\t\t\tif (file.endsWith(\".d.ts\") || file.endsWith(\".json\")) return;\n\n\t\t\t\t\t// 检查是否是组件文件\n\t\t\t\t\tconst ext = path.extname(file).slice(1);\n\t\t\t\t\tif (!extensions.includes(ext)) return;\n\n\t\t\t\t\tgeneratePathNameMap();\n\t\t\t\t};\n\n\t\t\t\tserver.watcher.on(\"add\", handle);\n\t\t\t\tserver.watcher.on(\"change\", handle);\n\t\t\t\tserver.watcher.on(\"unlink\", handle);\n\t\t\t}\n\t\t},\n\t};\n}\n\nexport { buildRouterPath };\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","rebuild","svgFiles","iconsPath","iconImportContent","iconTypeContent","exportContent","svg","idx","resolvedConfig","server","fullDir","handle","fs","path","externalGlobals","viteExternalsPlugin","isDev","getModuleVersion","name","pwd","pkgFile","isFullPath","renderUrl","url","data","getModuleInfo","module","prodUrl","v","version","pathList","p","css","cssList","c","cdnJsDelivrUrl","cdnUnpkgUrl","cdnImport","options","modules","enableInDevMode","generateCssLinkTag","generateScriptTag","isBuild","externalMap","alias","plugins","_","command","userConfig","html","descriptors","cusomize","attrs","fs","path","slash","pascalCase","str","_","c","componentAutoImport","options","dir","exportPath","dts","dtsPath","deep","extensions","formatter","config","componentMap","getNameFromPath","filePath","name","ext","parts","scanDirectory","dirPath","depth","files","entries","entry","fullPath","scanComponents","fullDir","absolutePath","relativePath","componentName","generateAutoRegister","components","a","registerFilePath","componentDir","lines","from","importPath","code","existingCode","generateDts","dtsFullPath","dtsDir","resolvedConfig","server","handle","file","fs","path","pascalCase","str","_","c","extractComponentName","fileContent","defineOptionsRegex","defineOptionsMatch","buildRouterPath","options","dir","exportPath","deep","extensions","formatter","config","getAllFiles","dirPath","fileList","file","filePath","ext","generatePathNameMap","targetDir","pathNameMap","acc","content","componentName","relativePath","finalName","fileName","error","outputPath","outputDir","outputContent","resolvedConfig","server","fullDir","handle","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/routerPath/index.ts","../../src/versionUpdate/index.ts"],"sourcesContent":["import fs from \"fs\";\nimport path from \"path\";\nimport type { Plugin, ResolvedConfig, ViteDevServer } 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\tconst rebuild = (): void => {\n\t\tconst svgFiles = findSvgFile(path.resolve(config.root, dir));\n\n\t\tconst iconsPath = path.resolve(config.root, writeDir);\n\t\tfs.mkdirSync(iconsPath, { recursive: true });\n\n\t\tlet iconImportContent = \"\";\n\t\tlet iconTypeContent = \"\";\n\t\tlet exportContent = \"\";\n\n\t\tsvgFiles.forEach((svg, idx) => {\n\t\t\twriteTSXIcon(svg.componentName, path.join(iconsPath, svg.iconName), svg.iconContent);\n\n\t\t\ticonImportContent += `import { ${svg.componentName} } from \"./${svg.iconName}\";\n`;\n\n\t\t\ticonTypeContent += `\t${svg.componentName},`;\n\n\t\t\texportContent += `export * from \"./${svg.iconName}\";\n`;\n\n\t\t\tif (idx + 1 < svgFiles.length) {\n\t\t\t\ticonTypeContent += \"\\n\";\n\t\t\t}\n\t\t});\n\n\t\tfs.writeFileSync(\n\t\t\tpath.join(iconsPath, \"index.ts\"),\n\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);\n\t};\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\trebuild();\n\t\t},\n\t\t// eslint-disable-next-line @typescript-eslint/explicit-function-return-type\n\t\tconfigureServer(server: ViteDevServer) {\n\t\t\tconst fullDir = path.resolve(config.root, dir);\n\n\t\t\t// 监听文件变化\n\t\t\tif (fs.existsSync(fullDir)) {\n\t\t\t\tserver.watcher.add(fullDir);\n\n\t\t\t\tconst handle = (file: string): void => {\n\t\t\t\t\tif (!file) return;\n\t\t\t\t\tif (!file.endsWith(\".svg\")) return;\n\n\t\t\t\t\trebuild();\n\t\t\t\t};\n\n\t\t\t\tserver.watcher.on(\"add\", handle);\n\t\t\t\tserver.watcher.on(\"change\", handle);\n\t\t\t\tserver.watcher.on(\"unlink\", handle);\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\nconst cdnJsDelivrUrl = \"https://cdn.jsdelivr.net/npm/{name}@{version}/{path}\";\nconst cdnUnpkgUrl = \"https://unpkg.com/{package}@{version}/{path}\";\n\n/**\n * CDN 导入\n * @param options\n * @returns\n */\nfunction cdnImport(options: CdnImportOptions): Plugin[] {\n\tconst { modules = [], prodUrl = cdnJsDelivrUrl, enableInDevMode = false, generateCssLinkTag, generateScriptTag } = 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, cdnJsDelivrUrl, cdnUnpkgUrl };\n","import fs from \"fs\";\nimport path from \"path\";\nimport type { AutoImportOptions } from \"./type\";\nimport type { Plugin, ResolvedConfig, ViteDevServer } from \"vite\";\n\n/**\n * 将路径转换为 Unix 风格\n */\nfunction slash(path: string): string {\n\treturn path.replace(/\\\\/g, \"/\");\n}\n\n/**\n * Pascal Case 转换\n */\nfunction pascalCase(str: string): string {\n\treturn str.replace(/[-_](\\w)/g, (_, c) => (c ? c.toUpperCase() : \"\")).replace(/^\\w/, (c) => c.toUpperCase());\n}\n\n/**\n * 组件自动导入\n * @param options 选项\n */\nfunction componentAutoImport(options: AutoImportOptions = {}): Plugin {\n\tconst {\n\t\tdir = \"src/components\",\n\t\texportPath = \"src/components/index.ts\",\n\t\tdts = true,\n\t\tdtsPath = \"types/components.d.ts\",\n\t\tdeep = true,\n\t\textensions = [\"vue\", \"tsx\", \"jsx\"],\n\t\tformatter,\n\t} = options;\n\n\tlet config: ResolvedConfig;\n\tconst componentMap = new Map<\n\t\tstring,\n\t\t{\n\t\t\t/** 组件名称 (PascalCase) */\n\t\t\tname: string;\n\t\t\t/** 组件文件路径 (绝对路径) */\n\t\t\tfrom: string;\n\t\t}\n\t>();\n\n\t/** 从文件路径获取组件名 */\n\tconst getNameFromPath = (filePath: string): string => {\n\t\t// 移除扩展名\n\t\tlet name = filePath;\n\t\tfor (const ext of extensions) {\n\t\t\tif (name.endsWith(`.${ext}`)) {\n\t\t\t\tname = name.slice(0, -ext.length - 1);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\t// 如果是 index 文件,使用父目录名\n\t\tif (name.endsWith(\"/index\") || name.endsWith(\"\\\\index\")) {\n\t\t\tconst parts = name.split(/[\\\\/]/);\n\t\t\tname = parts[parts.length - 2] || parts[parts.length - 1];\n\t\t} else {\n\t\t\tconst parts = name.split(/[\\\\/]/);\n\t\t\tname = parts[parts.length - 1];\n\t\t}\n\n\t\tif (formatter) {\n\t\t\treturn formatter(name);\n\t\t} else {\n\t\t\treturn pascalCase(name);\n\t\t}\n\t};\n\n\t/** 递归扫描目录 */\n\tconst scanDirectory = (dirPath: string, depth = 0): string[] => {\n\t\tconst files: string[] = [];\n\n\t\tif (!fs.existsSync(dirPath)) {\n\t\t\treturn files;\n\t\t}\n\n\t\tconst entries = fs.readdirSync(dirPath, { withFileTypes: true });\n\n\t\tfor (const entry of entries) {\n\t\t\tconst fullPath = path.join(dirPath, entry.name);\n\n\t\t\tif (entry.isDirectory()) {\n\t\t\t\t// 跳过 node_modules 等\n\t\t\t\tif (entry.name === \"node_modules\" || entry.name.startsWith(\". \")) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// 深度扫描\n\t\t\t\tif (deep || depth === 0) {\n\t\t\t\t\tfiles.push(...scanDirectory(fullPath, depth + 1));\n\t\t\t\t}\n\t\t\t} else if (entry.isFile()) {\n\t\t\t\t// 检查文件扩展名\n\t\t\t\tconst ext = path.extname(entry.name).slice(1);\n\t\t\t\tif (extensions.includes(ext)) {\n\t\t\t\t\tfiles.push(fullPath);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn files;\n\t};\n\n\t/** 扫描组件文件 */\n\tconst scanComponents = (): void => {\n\t\tcomponentMap.clear();\n\n\t\tconst fullDir = path.resolve(config.root, dir);\n\n\t\tif (!fs.existsSync(fullDir)) {\n\t\t\tconsole.warn(`[component-auto-import] Directory not found: ${fullDir}`);\n\t\t\treturn;\n\t\t}\n\n\t\tconst files = scanDirectory(fullDir);\n\n\t\tfiles.forEach((absolutePath) => {\n\t\t\tconst relativePath = path.relative(fullDir, absolutePath);\n\t\t\tconst componentName = getNameFromPath(relativePath);\n\n\t\t\tcomponentMap.set(componentName, {\n\t\t\t\tname: componentName,\n\t\t\t\tfrom: absolutePath,\n\t\t\t});\n\t\t});\n\t};\n\n\t/** 生成自动注册文件 */\n\tconst generateAutoRegister = (): void => {\n\t\tif (componentMap.size === 0) return;\n\n\t\tconst components = Array.from(componentMap.values()).sort((a, b) => a.name.localeCompare(b.name));\n\n\t\tconst registerFilePath = path.resolve(config.root, exportPath);\n\t\tconst componentDir = path.dirname(registerFilePath);\n\n\t\tconst lines: string[] = [];\n\t\tlines.push(\"/* eslint-disable */\");\n\t\tlines.push(\"/* prettier-ignore */\");\n\t\tlines.push(\"// @ts-nocheck\");\n\t\tlines.push(\"// Auto-generated by fast component-auto-import\");\n\t\tlines.push(\"// Generated by fast-vite-plugins\");\n\t\tlines.push(\"// Do not edit this file manually\");\n\t\tlines.push(\"\");\n\t\tlines.push('import type { App } from \"vue\";');\n\t\tlines.push(\"\");\n\n\t\t// 生成 import 语句\n\t\tcomponents.forEach(({ name, from }) => {\n\t\t\tconst relativePath = slash(path.relative(componentDir, from));\n\t\t\tconst importPath = relativePath.startsWith(\".\") ? relativePath : `./${relativePath}`;\n\t\t\tlines.push(`import ${name} from \"${importPath}\";`);\n\t\t\tlines.push(`export { ${name} };`);\n\t\t\tlines.push(`export type ${name}Instance = InstanceType<typeof ${name}>;`);\n\t\t});\n\n\t\tlines.push(\"\");\n\t\tlines.push(\"/** 自动注册所有组件 */\");\n\t\tlines.push(\"export function registerComponents(app: App): void {\");\n\n\t\tcomponents.forEach(({ name }) => {\n\t\t\tlines.push(`\tapp.component(${name}.name, ${name});`);\n\t\t});\n\n\t\tlines.push(\"}\");\n\t\tlines.push(\"\");\n\n\t\tconst code = `${lines.join(\"\\n\")}\\n`;\n\n\t\tconst existingCode = fs.existsSync(registerFilePath) ? fs.readFileSync(registerFilePath, \"utf-8\") : \"\";\n\n\t\tif (code !== existingCode) {\n\t\t\tfs.writeFileSync(registerFilePath, code, \"utf-8\");\n\t\t}\n\t};\n\n\t/** 生成类型声明文件 */\n\tconst generateDts = (): void => {\n\t\tif (!dts || componentMap.size === 0) return;\n\n\t\tconst components = Array.from(componentMap.values()).sort((a, b) => a.name.localeCompare(b.name));\n\n\t\tconst dtsFullPath = path.resolve(config.root, dtsPath);\n\t\tconst dtsDir = path.dirname(dtsFullPath);\n\n\t\t// 生成类型声明内容\n\t\tconst lines: string[] = [];\n\t\tlines.push(\"// For this project development\");\n\t\tlines.push(\"// Auto-generated by fast component-auto-import\");\n\t\tlines.push(\"// Generated by fast-vite-plugins\");\n\t\tlines.push(\"// Do not edit this file manually\");\n\t\tlines.push(\"\");\n\t\tlines.push('import \"@vue/runtime-core\";');\n\t\tlines.push(\"\");\n\t\tlines.push(\"// GlobalComponents for Volar\");\n\t\tlines.push('declare module \"@vue/runtime-core\" {');\n\t\tlines.push(\"\texport interface GlobalComponents {\");\n\n\t\tcomponents.forEach(({ name, from }) => {\n\t\t\t// 计算相对路径\n\t\t\tlet relativePath = slash(path.relative(dtsDir, from));\n\n\t\t\t// 移除文件扩展名\n\t\t\trelativePath = relativePath.replace(/\\.(vue|tsx|jsx)$/, \"\");\n\n\t\t\t// 确保以 ./ 开头\n\t\t\tconst importPath = relativePath.startsWith(\".\") ? relativePath : `./${relativePath}`;\n\n\t\t\tlines.push(`\t\t${name}: (typeof import(\"${importPath}\"))[\"default\"];`);\n\t\t});\n\n\t\tlines.push(\"\t}\");\n\t\tlines.push(\"}\");\n\t\tlines.push(\"\");\n\t\tlines.push(\"export {};\");\n\n\t\tconst code = `${lines.join(\"\\n\")}\\n`;\n\n\t\t// 确保目录存在\n\t\tif (!fs.existsSync(dtsDir)) {\n\t\t\tfs.mkdirSync(dtsDir, { recursive: true });\n\t\t}\n\n\t\t// 只有内容变化时才写入\n\t\tconst existingCode = fs.existsSync(dtsFullPath) ? fs.readFileSync(dtsFullPath, \"utf-8\") : \"\";\n\n\t\tif (code !== existingCode) {\n\t\t\tfs.writeFileSync(dtsFullPath, code, \"utf-8\");\n\t\t}\n\t};\n\n\treturn {\n\t\tname: \"fast-vite-plugin-component-auto-import\",\n\t\tenforce: \"post\",\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\tscanComponents();\n\t\t\tgenerateAutoRegister();\n\t\t\tgenerateDts();\n\t\t},\n\t\t// eslint-disable-next-line @typescript-eslint/explicit-function-return-type\n\t\tconfigureServer(server: ViteDevServer) {\n\t\t\tconst fullDir = path.resolve(config.root, dir);\n\n\t\t\t// 监听文件变化\n\t\t\tif (fs.existsSync(fullDir)) {\n\t\t\t\tserver.watcher.add(fullDir);\n\n\t\t\t\tconst handle = (file: string): void => {\n\t\t\t\t\tif (!file) return;\n\t\t\t\t\t// 忽略 .d.ts 文件\n\t\t\t\t\tif (file.endsWith(\".d.ts\")) return;\n\n\t\t\t\t\t// 检查是否是组件文件\n\t\t\t\t\tconst ext = path.extname(file).slice(1);\n\t\t\t\t\tif (!extensions.includes(ext)) return;\n\n\t\t\t\t\tscanComponents();\n\t\t\t\t\tgenerateAutoRegister();\n\t\t\t\t\tgenerateDts();\n\t\t\t\t};\n\n\t\t\t\tserver.watcher.on(\"add\", handle);\n\t\t\t\tserver.watcher.on(\"change\", handle);\n\t\t\t\tserver.watcher.on(\"unlink\", handle);\n\t\t\t}\n\t\t},\n\t};\n}\n\nexport { componentAutoImport };\n","import fs from \"fs\";\nimport path from \"path\";\nimport type { BuildRouterPathOptions } from \"./type\";\nimport type { Plugin, ResolvedConfig, ViteDevServer } from \"vite\";\n\n/**\n * Pascal Case 转换\n */\nfunction pascalCase(str: string): string {\n\treturn str.replace(/[-_](\\w)/g, (_, c) => (c ? c.toUpperCase() : \"\")).replace(/^\\w/, (c) => c.toUpperCase());\n}\n\n/**\n * 从文件内容中提取组件名称\n */\nfunction extractComponentName(fileContent: string): string | null {\n\t// 匹配 defineOptions({ name: 'xxx' })\n\tconst defineOptionsRegex = /defineOptions\\(\\s*\\{\\s*name:\\s*[\"']([^\"']+)[\"']/;\n\tconst defineOptionsMatch = fileContent.match(defineOptionsRegex);\n\treturn defineOptionsMatch ? defineOptionsMatch[1] : null;\n}\n\n/**\n * 路由路径生成\n * @param options 选项\n */\nfunction buildRouterPath(options: BuildRouterPathOptions = {}): Plugin {\n\tconst { dir = \"src/views\", exportPath = \"src/router/index.json\", deep = true, extensions = [\"vue\", \"tsx\", \"jsx\"], formatter } = options;\n\n\tlet config: ResolvedConfig;\n\n\t/** 递归获取目录下所有符合扩展名的文件*/\n\tconst getAllFiles = (dirPath: string, fileList: string[] = []): string[] => {\n\t\tif (!fs.existsSync(dirPath)) {\n\t\t\treturn fileList;\n\t\t}\n\n\t\tconst files = fs.readdirSync(dirPath);\n\t\tfiles.forEach((file) => {\n\t\t\tconst filePath = path.join(dirPath, file);\n\t\t\tconst stat = fs.statSync(filePath);\n\n\t\t\tif (stat.isDirectory()) {\n\t\t\t\tif (deep) {\n\t\t\t\t\tgetAllFiles(filePath, fileList);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tconst ext = path.extname(filePath).slice(1);\n\t\t\t\tif (extensions.includes(ext)) {\n\t\t\t\t\tfileList.push(filePath);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\treturn fileList;\n\t};\n\n\t/** 生成路径-名称映射 */\n\tconst generatePathNameMap = (): void => {\n\t\tconst targetDir = path.resolve(config.root, dir);\n\t\tconst files = getAllFiles(targetDir);\n\n\t\tconst pathNameMap: Record<string, string> = files.reduce((acc, filePath) => {\n\t\t\ttry {\n\t\t\t\tconst content = fs.readFileSync(filePath, \"utf-8\");\n\t\t\t\tconst componentName = extractComponentName(content);\n\n\t\t\t\t// 生成相对路径\n\t\t\t\tconst relativePath = `/${path.relative(config.root, filePath).replace(/\\\\/g, \"/\")}`;\n\n\t\t\t\t// 确定最终的组件名称\n\t\t\t\tlet finalName: string;\n\t\t\t\tif (componentName) {\n\t\t\t\t\tfinalName = componentName;\n\t\t\t\t} else {\n\t\t\t\t\tconst fileName = path.basename(filePath, path.extname(filePath));\n\t\t\t\t\tfinalName = formatter ? formatter(fileName) : pascalCase(fileName);\n\t\t\t\t}\n\n\t\t\t\tacc[relativePath] = finalName;\n\t\t\t} catch (error) {\n\t\t\t\tconsole.error(`Error processing file ${filePath}:`, error);\n\t\t\t}\n\t\t\treturn acc;\n\t\t}, {});\n\n\t\t// 写入 JSON 文件\n\t\tconst outputPath = path.resolve(config.root, exportPath);\n\t\tconst outputDir = path.dirname(outputPath);\n\n\t\t// 确保输出目录存在\n\t\tif (!fs.existsSync(outputDir)) {\n\t\t\tfs.mkdirSync(outputDir, { recursive: true });\n\t\t}\n\n\t\tconst outputContent = JSON.stringify(pathNameMap, null, 2);\n\t\tfs.writeFileSync(outputPath, outputContent, \"utf-8\");\n\t};\n\n\treturn {\n\t\tname: \"fast-vite-plugin-router-path\",\n\t\tenforce: \"post\",\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\tgeneratePathNameMap();\n\t\t},\n\t\t// eslint-disable-next-line @typescript-eslint/explicit-function-return-type\n\t\tconfigureServer(server: ViteDevServer) {\n\t\t\tconst fullDir = path.resolve(config.root, dir);\n\n\t\t\t// 监听文件变化\n\t\t\tif (fs.existsSync(fullDir)) {\n\t\t\t\tserver.watcher.add(fullDir);\n\n\t\t\t\tconst handle = (file: string): void => {\n\t\t\t\t\tif (!file) return;\n\t\t\t\t\t// 忽略 . d.ts 文件和 JSON 文件\n\t\t\t\t\tif (file.endsWith(\".d.ts\") || file.endsWith(\".json\")) return;\n\n\t\t\t\t\t// 检查是否是组件文件\n\t\t\t\t\tconst ext = path.extname(file).slice(1);\n\t\t\t\t\tif (!extensions.includes(ext)) return;\n\n\t\t\t\t\tgeneratePathNameMap();\n\t\t\t\t};\n\n\t\t\t\tserver.watcher.on(\"add\", handle);\n\t\t\t\tserver.watcher.on(\"change\", handle);\n\t\t\t\tserver.watcher.on(\"unlink\", handle);\n\t\t\t}\n\t\t},\n\t};\n}\n\nexport { buildRouterPath };\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,EAEEC,EAAU,IAAY,CAC3B,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,EACDC,CAAiB;AAAA,EACjBE,CAAa;AAAA;AAAA,EAEbD,CAAe;AAAA;AAAA,CAGf,CACD,EAEA,MAAO,CACN,KAAM,kCACN,eAAiBI,GAAyD,CAEzET,EAASS,CACV,EACA,YAAmC,CAClCR,EAAQ,CACT,EAEA,gBAAgBS,EAAuB,CACtC,IAAMC,EAAUnC,EAAK,QAAQwB,EAAO,KAAMtB,CAAG,EAG7C,GAAIH,EAAG,WAAWoC,CAAO,EAAG,CAC3BD,EAAO,QAAQ,IAAIC,CAAO,EAE1B,IAAMC,EAAUhC,GAAuB,CACjCA,GACAA,EAAK,SAAS,MAAM,GAEzBqB,EAAQ,CACT,EAEAS,EAAO,QAAQ,GAAG,MAAOE,CAAM,EAC/BF,EAAO,QAAQ,GAAG,SAAUE,CAAM,EAClCF,EAAO,QAAQ,GAAG,SAAUE,CAAM,CACnC,CACD,CACD,CACD,CClLA,OAAOC,MAAQ,KACf,OAAOC,MAAU,OACjB,OAAOC,MAAqB,iCAC5B,OAAS,uBAAAC,MAA2B,wBAIpC,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,CAEA,IAAME,EAAiB,uDACjBC,GAAc,+CAOpB,SAASC,GAAUC,EAAqC,CACvD,GAAM,CAAE,QAAAC,EAAU,CAAC,EAAG,QAAAZ,EAAUQ,EAAgB,gBAAAK,EAAkB,GAAO,mBAAAC,EAAoB,kBAAAC,CAAkB,EAAIJ,EAE/GK,EAAU,GAERnB,GAAQ,MAAM,QAAQe,CAAO,EAAIA,EAAU,CAACA,CAAO,GACvD,IAAKX,GAAO,OAAOA,GAAM,WAAaA,EAAED,CAAO,EAAIC,CAAE,EACrD,IAAKA,GAAMH,EAAcG,EAAGD,CAAO,CAAC,EAEhCiB,EAEF,CAAC,EAELpB,EAAK,QAASI,GAAM,CACnBgB,EAAYhB,EAAE,IAAI,EAAIA,EAAE,IACpB,MAAM,QAAQA,EAAE,KAAK,GACxBA,EAAE,MAAM,QAASiB,GAAU,CAC1BD,EAAYC,CAAK,EAAIjB,EAAE,GACxB,CAAC,CAEH,CAAC,EAED,IAAMkB,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,CAACnC,EAAgB8B,CAAW,CAAC,GAGhEK,CACR,EACA,mBAAmBC,EAAoC,CACtD,GAAI,CAACP,GAAW,CAACH,EAChB,OAAOU,EAGR,IAAMC,EAAmC,CAAC,EAE1C,OAAA3B,EAAK,QAASI,GAAM,CACnBA,EAAE,SAAS,QAASL,GAAQ,CAC3B,IAAM6B,EAAWV,IAAoBd,EAAE,KAAML,CAAG,GAAK,CAAC,EAChD8B,EAAQ,CACb,IAAK9B,EACL,YAAa,YACb,GAAIK,GAAG,OAAS,CAAC,EACjB,GAAGwB,EAAS,KACb,EAEAD,EAAY,KAAK,CAChB,IAAK,SACL,MAAAE,EACA,GAAGD,CACJ,CAAC,CACF,CAAC,EACDxB,EAAE,QAAQ,QAASL,GAAQ,CAC1B,IAAM6B,EAAWX,IAAqBb,EAAE,KAAML,CAAG,GAAK,CAAC,EACjD8B,EAAQ,CACb,KAAM9B,EACN,IAAK,aACL,YAAa,YACb,GAAIK,GAAG,OAAS,CAAC,EACjB,GAAGwB,EAAS,KACb,EACAD,EAAY,KAAK,CAChB,IAAK,OACL,MAAAE,EACA,GAAGD,CACJ,CAAC,CACF,CAAC,CACF,CAAC,EAEMD,CACR,CACD,CACD,EAEA,OAAInC,GAASwB,GACZM,EAAQ,KACP/B,EAAoB6B,EAAa,CAChC,QAAS,KACV,CAAC,CACF,EAGME,CACR,CC/MA,OAAOQ,MAAQ,KACf,OAAOC,MAAU,OAOjB,SAASC,EAAMD,EAAsB,CACpC,OAAOA,EAAK,QAAQ,MAAO,GAAG,CAC/B,CAKA,SAASE,EAAWC,EAAqB,CACxC,OAAOA,EAAI,QAAQ,YAAa,CAACC,EAAGC,IAAOA,EAAIA,EAAE,YAAY,EAAI,EAAG,EAAE,QAAQ,MAAQA,GAAMA,EAAE,YAAY,CAAC,CAC5G,CAMA,SAASC,GAAoBC,EAA6B,CAAC,EAAW,CACrE,GAAM,CACL,IAAAC,EAAM,iBACN,WAAAC,EAAa,0BACb,IAAAC,EAAM,GACN,QAAAC,EAAU,wBACV,KAAAC,EAAO,GACP,WAAAC,EAAa,CAAC,MAAO,MAAO,KAAK,EACjC,UAAAC,CACD,EAAIP,EAEAQ,EACEC,EAAe,IAAI,IAWnBC,EAAmBC,GAA6B,CAErD,IAAIC,EAAOD,EACX,QAAWE,KAAOP,EACjB,GAAIM,EAAK,SAAS,IAAIC,CAAG,EAAE,EAAG,CAC7BD,EAAOA,EAAK,MAAM,EAAG,CAACC,EAAI,OAAS,CAAC,EACpC,KACD,CAID,GAAID,EAAK,SAAS,QAAQ,GAAKA,EAAK,SAAS,SAAS,EAAG,CACxD,IAAME,EAAQF,EAAK,MAAM,OAAO,EAChCA,EAAOE,EAAMA,EAAM,OAAS,CAAC,GAAKA,EAAMA,EAAM,OAAS,CAAC,CACzD,KAAO,CACN,IAAMA,EAAQF,EAAK,MAAM,OAAO,EAChCA,EAAOE,EAAMA,EAAM,OAAS,CAAC,CAC9B,CAEA,OAAIP,EACIA,EAAUK,CAAI,EAEdjB,EAAWiB,CAAI,CAExB,EAGMG,EAAgB,CAACC,EAAiBC,EAAQ,IAAgB,CAC/D,IAAMC,EAAkB,CAAC,EAEzB,GAAI,CAAC1B,EAAG,WAAWwB,CAAO,EACzB,OAAOE,EAGR,IAAMC,EAAU3B,EAAG,YAAYwB,EAAS,CAAE,cAAe,EAAK,CAAC,EAE/D,QAAWI,KAASD,EAAS,CAC5B,IAAME,EAAW5B,EAAK,KAAKuB,EAASI,EAAM,IAAI,EAE9C,GAAIA,EAAM,YAAY,EAAG,CAExB,GAAIA,EAAM,OAAS,gBAAkBA,EAAM,KAAK,WAAW,IAAI,EAC9D,UAIGf,GAAQY,IAAU,IACrBC,EAAM,KAAK,GAAGH,EAAcM,EAAUJ,EAAQ,CAAC,CAAC,CAElD,SAAWG,EAAM,OAAO,EAAG,CAE1B,IAAMP,EAAMpB,EAAK,QAAQ2B,EAAM,IAAI,EAAE,MAAM,CAAC,EACxCd,EAAW,SAASO,CAAG,GAC1BK,EAAM,KAAKG,CAAQ,CAErB,CACD,CAEA,OAAOH,CACR,EAGMI,EAAiB,IAAY,CAClCb,EAAa,MAAM,EAEnB,IAAMc,EAAU9B,EAAK,QAAQe,EAAO,KAAMP,CAAG,EAE7C,GAAI,CAACT,EAAG,WAAW+B,CAAO,EAAG,CAC5B,QAAQ,KAAK,gDAAgDA,CAAO,EAAE,EACtE,MACD,CAEcR,EAAcQ,CAAO,EAE7B,QAASC,GAAiB,CAC/B,IAAMC,EAAehC,EAAK,SAAS8B,EAASC,CAAY,EAClDE,EAAgBhB,EAAgBe,CAAY,EAElDhB,EAAa,IAAIiB,EAAe,CAC/B,KAAMA,EACN,KAAMF,CACP,CAAC,CACF,CAAC,CACF,EAGMG,EAAuB,IAAY,CACxC,GAAIlB,EAAa,OAAS,EAAG,OAE7B,IAAMmB,EAAa,MAAM,KAAKnB,EAAa,OAAO,CAAC,EAAE,KAAK,CAACoB,EAAG,IAAMA,EAAE,KAAK,cAAc,EAAE,IAAI,CAAC,EAE1FC,EAAmBrC,EAAK,QAAQe,EAAO,KAAMN,CAAU,EACvD6B,EAAetC,EAAK,QAAQqC,CAAgB,EAE5CE,EAAkB,CAAC,EACzBA,EAAM,KAAK,sBAAsB,EACjCA,EAAM,KAAK,uBAAuB,EAClCA,EAAM,KAAK,gBAAgB,EAC3BA,EAAM,KAAK,iDAAiD,EAC5DA,EAAM,KAAK,mCAAmC,EAC9CA,EAAM,KAAK,mCAAmC,EAC9CA,EAAM,KAAK,EAAE,EACbA,EAAM,KAAK,iCAAiC,EAC5CA,EAAM,KAAK,EAAE,EAGbJ,EAAW,QAAQ,CAAC,CAAE,KAAAhB,EAAM,KAAAqB,CAAK,IAAM,CACtC,IAAMR,EAAe/B,EAAMD,EAAK,SAASsC,EAAcE,CAAI,CAAC,EACtDC,EAAaT,EAAa,WAAW,GAAG,EAAIA,EAAe,KAAKA,CAAY,GAClFO,EAAM,KAAK,UAAUpB,CAAI,UAAUsB,CAAU,IAAI,EACjDF,EAAM,KAAK,YAAYpB,CAAI,KAAK,EAChCoB,EAAM,KAAK,eAAepB,CAAI,kCAAkCA,CAAI,IAAI,CACzE,CAAC,EAEDoB,EAAM,KAAK,EAAE,EACbA,EAAM,KAAK,yDAAiB,EAC5BA,EAAM,KAAK,sDAAsD,EAEjEJ,EAAW,QAAQ,CAAC,CAAE,KAAAhB,CAAK,IAAM,CAChCoB,EAAM,KAAK,kBAAkBpB,CAAI,UAAUA,CAAI,IAAI,CACpD,CAAC,EAEDoB,EAAM,KAAK,GAAG,EACdA,EAAM,KAAK,EAAE,EAEb,IAAMG,EAAO,GAAGH,EAAM,KAAK;AAAA,CAAI,CAAC;AAAA,EAE1BI,EAAe5C,EAAG,WAAWsC,CAAgB,EAAItC,EAAG,aAAasC,EAAkB,OAAO,EAAI,GAEhGK,IAASC,GACZ5C,EAAG,cAAcsC,EAAkBK,EAAM,OAAO,CAElD,EAGME,EAAc,IAAY,CAC/B,GAAI,CAAClC,GAAOM,EAAa,OAAS,EAAG,OAErC,IAAMmB,EAAa,MAAM,KAAKnB,EAAa,OAAO,CAAC,EAAE,KAAK,CAACoB,EAAG,IAAMA,EAAE,KAAK,cAAc,EAAE,IAAI,CAAC,EAE1FS,EAAc7C,EAAK,QAAQe,EAAO,KAAMJ,CAAO,EAC/CmC,EAAS9C,EAAK,QAAQ6C,CAAW,EAGjCN,EAAkB,CAAC,EACzBA,EAAM,KAAK,iCAAiC,EAC5CA,EAAM,KAAK,iDAAiD,EAC5DA,EAAM,KAAK,mCAAmC,EAC9CA,EAAM,KAAK,mCAAmC,EAC9CA,EAAM,KAAK,EAAE,EACbA,EAAM,KAAK,6BAA6B,EACxCA,EAAM,KAAK,EAAE,EACbA,EAAM,KAAK,+BAA+B,EAC1CA,EAAM,KAAK,sCAAsC,EACjDA,EAAM,KAAK,sCAAsC,EAEjDJ,EAAW,QAAQ,CAAC,CAAE,KAAAhB,EAAM,KAAAqB,CAAK,IAAM,CAEtC,IAAIR,EAAe/B,EAAMD,EAAK,SAAS8C,EAAQN,CAAI,CAAC,EAGpDR,EAAeA,EAAa,QAAQ,mBAAoB,EAAE,EAG1D,IAAMS,EAAaT,EAAa,WAAW,GAAG,EAAIA,EAAe,KAAKA,CAAY,GAElFO,EAAM,KAAK,KAAKpB,CAAI,qBAAqBsB,CAAU,iBAAiB,CACrE,CAAC,EAEDF,EAAM,KAAK,IAAI,EACfA,EAAM,KAAK,GAAG,EACdA,EAAM,KAAK,EAAE,EACbA,EAAM,KAAK,YAAY,EAEvB,IAAMG,EAAO,GAAGH,EAAM,KAAK;AAAA,CAAI,CAAC;AAAA,EAG3BxC,EAAG,WAAW+C,CAAM,GACxB/C,EAAG,UAAU+C,EAAQ,CAAE,UAAW,EAAK,CAAC,EAIzC,IAAMH,EAAe5C,EAAG,WAAW8C,CAAW,EAAI9C,EAAG,aAAa8C,EAAa,OAAO,EAAI,GAEtFH,IAASC,GACZ5C,EAAG,cAAc8C,EAAaH,EAAM,OAAO,CAE7C,EAEA,MAAO,CACN,KAAM,yCACN,QAAS,OACT,eAAiBK,GAAyD,CAEzEhC,EAASgC,CACV,EACA,YAAmC,CAClClB,EAAe,EACfK,EAAqB,EACrBU,EAAY,CACb,EAEA,gBAAgBI,EAAuB,CACtC,IAAMlB,EAAU9B,EAAK,QAAQe,EAAO,KAAMP,CAAG,EAG7C,GAAIT,EAAG,WAAW+B,CAAO,EAAG,CAC3BkB,EAAO,QAAQ,IAAIlB,CAAO,EAE1B,IAAMmB,EAAUC,GAAuB,CAGtC,GAFI,CAACA,GAEDA,EAAK,SAAS,OAAO,EAAG,OAG5B,IAAM9B,EAAMpB,EAAK,QAAQkD,CAAI,EAAE,MAAM,CAAC,EACjCrC,EAAW,SAASO,CAAG,IAE5BS,EAAe,EACfK,EAAqB,EACrBU,EAAY,EACb,EAEAI,EAAO,QAAQ,GAAG,MAAOC,CAAM,EAC/BD,EAAO,QAAQ,GAAG,SAAUC,CAAM,EAClCD,EAAO,QAAQ,GAAG,SAAUC,CAAM,CACnC,CACD,CACD,CACD,CCnRA,OAAOE,MAAQ,KACf,OAAOC,MAAU,OAOjB,SAASC,EAAWC,EAAqB,CACxC,OAAOA,EAAI,QAAQ,YAAa,CAACC,EAAGC,IAAOA,EAAIA,EAAE,YAAY,EAAI,EAAG,EAAE,QAAQ,MAAQA,GAAMA,EAAE,YAAY,CAAC,CAC5G,CAKA,SAASC,EAAqBC,EAAoC,CAEjE,IAAMC,EAAqB,kDACrBC,EAAqBF,EAAY,MAAMC,CAAkB,EAC/D,OAAOC,EAAqBA,EAAmB,CAAC,EAAI,IACrD,CAMA,SAASC,GAAgBC,EAAkC,CAAC,EAAW,CACtE,GAAM,CAAE,IAAAC,EAAM,YAAa,WAAAC,EAAa,wBAAyB,KAAAC,EAAO,GAAM,WAAAC,EAAa,CAAC,MAAO,MAAO,KAAK,EAAG,UAAAC,CAAU,EAAIL,EAE5HM,EAGEC,EAAc,CAACC,EAAiBC,EAAqB,CAAC,KACtDpB,EAAG,WAAWmB,CAAO,GAIZnB,EAAG,YAAYmB,CAAO,EAC9B,QAASE,GAAS,CACvB,IAAMC,EAAWrB,EAAK,KAAKkB,EAASE,CAAI,EAGxC,GAFarB,EAAG,SAASsB,CAAQ,EAExB,YAAY,EAChBR,GACHI,EAAYI,EAAUF,CAAQ,MAEzB,CACN,IAAMG,EAAMtB,EAAK,QAAQqB,CAAQ,EAAE,MAAM,CAAC,EACtCP,EAAW,SAASQ,CAAG,GAC1BH,EAAS,KAAKE,CAAQ,CAExB,CACD,CAAC,EAEMF,GAIFI,EAAsB,IAAY,CACvC,IAAMC,EAAYxB,EAAK,QAAQgB,EAAO,KAAML,CAAG,EAGzCc,EAFQR,EAAYO,CAAS,EAEe,OAAO,CAACE,EAAKL,IAAa,CAC3E,GAAI,CACH,IAAMM,EAAU5B,EAAG,aAAasB,EAAU,OAAO,EAC3CO,EAAgBvB,EAAqBsB,CAAO,EAG5CE,EAAe,IAAI7B,EAAK,SAASgB,EAAO,KAAMK,CAAQ,EAAE,QAAQ,MAAO,GAAG,CAAC,GAG7ES,EACJ,GAAIF,EACHE,EAAYF,MACN,CACN,IAAMG,EAAW/B,EAAK,SAASqB,EAAUrB,EAAK,QAAQqB,CAAQ,CAAC,EAC/DS,EAAYf,EAAYA,EAAUgB,CAAQ,EAAI9B,EAAW8B,CAAQ,CAClE,CAEAL,EAAIG,CAAY,EAAIC,CACrB,OAASE,EAAO,CACf,QAAQ,MAAM,yBAAyBX,CAAQ,IAAKW,CAAK,CAC1D,CACA,OAAON,CACR,EAAG,CAAC,CAAC,EAGCO,EAAajC,EAAK,QAAQgB,EAAO,KAAMJ,CAAU,EACjDsB,EAAYlC,EAAK,QAAQiC,CAAU,EAGpClC,EAAG,WAAWmC,CAAS,GAC3BnC,EAAG,UAAUmC,EAAW,CAAE,UAAW,EAAK,CAAC,EAG5C,IAAMC,EAAgB,KAAK,UAAUV,EAAa,KAAM,CAAC,EACzD1B,EAAG,cAAckC,EAAYE,EAAe,OAAO,CACpD,EAEA,MAAO,CACN,KAAM,+BACN,QAAS,OACT,eAAiBC,GAAyD,CAEzEpB,EAASoB,CACV,EACA,YAAmC,CAClCb,EAAoB,CACrB,EAEA,gBAAgBc,EAAuB,CACtC,IAAMC,EAAUtC,EAAK,QAAQgB,EAAO,KAAML,CAAG,EAG7C,GAAIZ,EAAG,WAAWuC,CAAO,EAAG,CAC3BD,EAAO,QAAQ,IAAIC,CAAO,EAE1B,IAAMC,EAAUnB,GAAuB,CAGtC,GAFI,CAACA,GAEDA,EAAK,SAAS,OAAO,GAAKA,EAAK,SAAS,OAAO,EAAG,OAGtD,IAAME,EAAMtB,EAAK,QAAQoB,CAAI,EAAE,MAAM,CAAC,EACjCN,EAAW,SAASQ,CAAG,GAE5BC,EAAoB,CACrB,EAEAc,EAAO,QAAQ,GAAG,MAAOE,CAAM,EAC/BF,EAAO,QAAQ,GAAG,SAAUE,CAAM,EAClCF,EAAO,QAAQ,GAAG,SAAUE,CAAM,CACnC,CACD,CACD,CACD,CCvIA,OAAOC,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,GAAoBC,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","rebuild","svgFiles","iconsPath","iconImportContent","iconTypeContent","exportContent","svg","idx","resolvedConfig","server","fullDir","handle","fs","path","externalGlobals","viteExternalsPlugin","isDev","getModuleVersion","name","pwd","pkgFile","isFullPath","renderUrl","url","data","getModuleInfo","module","prodUrl","v","version","pathList","p","css","cssList","c","cdnJsDelivrUrl","cdnUnpkgUrl","cdnImport","options","modules","enableInDevMode","generateCssLinkTag","generateScriptTag","isBuild","externalMap","alias","plugins","_","command","userConfig","html","descriptors","cusomize","attrs","fs","path","slash","pascalCase","str","_","c","componentAutoImport","options","dir","exportPath","dts","dtsPath","deep","extensions","formatter","config","componentMap","getNameFromPath","filePath","name","ext","parts","scanDirectory","dirPath","depth","files","entries","entry","fullPath","scanComponents","fullDir","absolutePath","relativePath","componentName","generateAutoRegister","components","a","registerFilePath","componentDir","lines","from","importPath","code","existingCode","generateDts","dtsFullPath","dtsDir","resolvedConfig","server","handle","file","fs","path","pascalCase","str","_","c","extractComponentName","fileContent","defineOptionsRegex","defineOptionsMatch","buildRouterPath","options","dir","exportPath","deep","extensions","formatter","config","getAllFiles","dirPath","fileList","file","filePath","ext","generatePathNameMap","targetDir","pathNameMap","acc","content","componentName","relativePath","finalName","fileName","error","outputPath","outputDir","outputContent","resolvedConfig","server","fullDir","handle","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,6 +1,6 @@
1
1
  {
2
2
  "name": "fast-vite-plugins",
3
- "version": "1.0.19",
3
+ "version": "1.0.20",
4
4
  "description": "Fast Vite插件库.",
5
5
  "type": "module",
6
6
  "keywords": [