fast-vite-plugins 1.0.18 → 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
@@ -1,4 +1,4 @@
1
- "use strict";var Y=Object.create;var T=Object.defineProperty;var Z=Object.getOwnPropertyDescriptor;var X=Object.getOwnPropertyNames;var q=Object.getPrototypeOf,K=Object.prototype.hasOwnProperty;var Q=(t,e)=>{for(var n in e)T(t,n,{get:e[n],enumerable:!0})},W=(t,e,n,i)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of X(e))!K.call(t,r)&&r!==n&&T(t,r,{get:()=>e[r],enumerable:!(i=Z(e,r))||i.enumerable});return t};var w=(t,e,n)=>(n=t!=null?Y(q(t)):{},W(e||!t||!t.__esModule?T(n,"default",{value:t,enumerable:!0}):n,t)),tt=t=>W(T({},"__esModule",{value:!0}),t);var gt={};Q(gt,{buildRouterPath:()=>ut,buildSvgIcon:()=>et,cdnImport:()=>it,cdnJsDelivrUrl:()=>z,cdnUnpkgUrl:()=>st,componentAutoImport:()=>at,findSvgFile:()=>M,versionUpdatePlugin:()=>ft,writeTSXIcon:()=>J});module.exports=tt(gt);var R=w(require("fs"),1),j=w(require("path"),1),M=t=>{let e=[];return R.default.readdirSync(t,{withFileTypes:!0}).forEach(i=>{if(i.isDirectory())e.push(...M(j.default.join(t,i.name)));else{let r=i.name.replace(".svg",""),g=R.default.readFileSync(j.default.join(t,i.name),"utf-8").replace(/<\?xml.*?\?>/,"").replace(/<!DOCTYPE svg.*?>/,"").trimStart().trimEnd().replace(/<svg([^>+].*?)>/,(p,u)=>{let c=u.match(/viewBox="[^"]+"/),C=u.match(/width="(\d+)"/),a=u.match(/height="(\d+)"/),d=1024,h=1024;C&&(d=C[0]),a&&(h=a[0]);let f="";return c?f=c[0]:f=`viewBox="0 0 ${d} ${h}"`,`<svg xmlns="http://www.w3.org/2000/svg" ${f}>`});e.push({iconName:r,componentName:r.charAt(0).toUpperCase()+r.slice(1),iconContent:g})}}),e.sort((i,r)=>i.iconName<r.iconName?-1:i.iconName>r.iconName?1:0)},J=(t,e,n)=>{R.default.mkdirSync(e,{recursive:!0});let i=`import { defineComponent } from "vue";
1
+ "use strict";var L=Object.create;var E=Object.defineProperty;var Y=Object.getOwnPropertyDescriptor;var Z=Object.getOwnPropertyNames;var X=Object.getPrototypeOf,q=Object.prototype.hasOwnProperty;var K=(t,e)=>{for(var n in e)E(t,n,{get:e[n],enumerable:!0})},I=(t,e,n,p)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of Z(e))!q.call(t,r)&&r!==n&&E(t,r,{get:()=>e[r],enumerable:!(p=Y(e,r))||p.enumerable});return t};var $=(t,e,n)=>(n=t!=null?L(X(t)):{},I(e||!t||!t.__esModule?E(n,"default",{value:t,enumerable:!0}):n,t)),Q=t=>I(E({},"__esModule",{value:!0}),t);var ft={};K(ft,{buildRouterPath:()=>lt,buildSvgIcon:()=>tt,cdnImport:()=>st,cdnJsDelivrUrl:()=>H,cdnUnpkgUrl:()=>rt,componentAutoImport:()=>ct,findSvgFile:()=>U,versionUpdatePlugin:()=>mt,writeTSXIcon:()=>W});module.exports=Q(ft);var j=$(require("fs"),1),N=$(require("path"),1),U=t=>{let e=[];return j.default.readdirSync(t,{withFileTypes:!0}).forEach(p=>{if(p.isDirectory())e.push(...U(N.default.join(t,p.name)));else{let r=p.name.replace(".svg",""),g=j.default.readFileSync(N.default.join(t,p.name),"utf-8").replace(/<\?xml.*?\?>/,"").replace(/<!DOCTYPE svg.*?>/,"").trimStart().trimEnd().replace(/<svg([^>+].*?)>/,(c,m)=>{let f=m.match(/viewBox="[^"]+"/),i=m.match(/width="(\d+)"/),u=m.match(/height="(\d+)"/),v=1024,d=1024;i&&(v=i[0]),u&&(d=u[0]);let h="";return f?h=f[0]:h=`viewBox="0 0 ${v} ${d}"`,`<svg xmlns="http://www.w3.org/2000/svg" ${h}>`});e.push({iconName:r,componentName:r.charAt(0).toUpperCase()+r.slice(1),iconContent:g})}}),e.sort((p,r)=>p.iconName<r.iconName?-1:p.iconName>r.iconName?1:0)},W=(t,e,n)=>{j.default.mkdirSync(e,{recursive:!0});let p=`import { defineComponent } from "vue";
2
2
 
3
3
  /**
4
4
  * ${t} \u56FE\u6807\u7EC4\u4EF6
@@ -15,18 +15,18 @@ ${n.split(`
15
15
  });
16
16
 
17
17
  export default ${t};
18
- `;R.default.writeFileSync(j.default.join(e,"index.tsx"),i)};function et(t,e){if(!t||!e)return;let n;return{name:"fast-vite-plugin-build-svg-icon",configResolved:i=>{n=i},buildStart(){let i=M(j.default.resolve(n.root,t)),r=j.default.resolve(n.root,e);R.default.mkdirSync(r,{recursive:!0});let g="",p="",u="";i.forEach((c,C)=>{J(c.componentName,j.default.join(r,c.iconName),c.iconContent),g+=`import { ${c.componentName} } from "./${c.iconName}";
19
- `,p+=` ${c.componentName},`,u+=`export * from "./${c.iconName}";
20
- `,C+1<i.length&&(p+=`
21
- `)}),R.default.writeFileSync(j.default.join(r,"index.ts"),`import type { DefineComponent } from "vue";
22
- ${g}
23
- ${u}
18
+ `;j.default.writeFileSync(N.default.join(e,"index.tsx"),p)};function tt(t,e){if(!t||!e)return;let n,p=()=>{let r=U(N.default.resolve(n.root,t)),g=N.default.resolve(n.root,e);j.default.mkdirSync(g,{recursive:!0});let c="",m="",f="";r.forEach((i,u)=>{W(i.componentName,N.default.join(g,i.iconName),i.iconContent),c+=`import { ${i.componentName} } from "./${i.iconName}";
19
+ `,m+=` ${i.componentName},`,f+=`export * from "./${i.iconName}";
20
+ `,u+1<r.length&&(m+=`
21
+ `)}),j.default.writeFileSync(N.default.join(g,"index.ts"),`import type { DefineComponent } from "vue";
22
+ ${c}
23
+ ${f}
24
24
  export default [
25
- ${p}
25
+ ${m}
26
26
  ] as unknown as DefineComponent[];
27
- `)}}}var O=w(require("fs"),1),B=w(require("path"),1),V=w(require("rollup-plugin-external-globals"),1),G=require("vite-plugin-externals"),nt=process.env.NODE_ENV==="development";function ot(t){let e=process.cwd(),n=B.default.join(e,"node_modules",t,"package.json");return O.default.existsSync(n)?JSON.parse(O.default.readFileSync(n,"utf8")).version:""}function H(t){return!!(t.startsWith("http:")||t.startsWith("https:")||t.startsWith("//"))}function _(t,e){let{path:n}=e;return H(n)&&(t=n),t.replace(/\{name\}/g,e.name).replace(/\{version\}/g,e.version).replace(/\{path\}/g,n)}function rt(t,e){e=t.prodUrl||e;let n=t,i=t.version||ot(n.name),r=[];Array.isArray(n.path)?r=n.path:r.push(n.path);let g={...n,version:i};r=r.map(c=>{if(!i&&!H(c))throw new Error(`modules: ${g.name} package.json file does not exist`);return _(e,{name:g.name,version:g.version,path:c})});let p=n.css||[];!Array.isArray(p)&&p&&(p=[p]);let u=Array.isArray(p)?p.map(c=>_(e,{name:g.name,version:g.version,path:c})):[];return{...n,version:i,pathList:r,cssList:u}}var z="https://cdn.jsdelivr.net/npm/{name}@{version}/{path}",st="https://unpkg.com/{package}@{version}/{path}";function it(t){let{modules:e=[],prodUrl:n=z,enableInDevMode:i=!1,generateCssLinkTag:r,generateScriptTag:g}=t,p=!1,u=(Array.isArray(e)?e:[e]).map(a=>typeof a=="function"?a(n):a).map(a=>rt(a,n)),c={};u.forEach(a=>{c[a.name]=a.var,Array.isArray(a.alias)&&a.alias.forEach(d=>{c[d]=a.var})});let C=[{name:"fast-vite-plugin-cdn-import",enforce:"pre",config(a,{command:d}){p=d==="build";let h={build:{rollupOptions:{plugins:[]}}};return p&&(h.build.rollupOptions.plugins=[(0,V.default)(c)]),h},transformIndexHtml(a){if(!p&&!i)return a;let d=[];return u.forEach(h=>{h.pathList.forEach(f=>{let y=g?.(h.name,f)||{},N={src:f,crossorigin:"anonymous",...h?.attrs??{},...y.attrs};d.push({tag:"script",attrs:N,...y})}),h.cssList.forEach(f=>{let y=r?.(h.name,f)||{},N={href:f,rel:"stylesheet",crossorigin:"anonymous",...h?.attrs??{},...y.attrs};d.push({tag:"link",attrs:N,...y})})}),d}}];return nt&&i&&C.push((0,G.viteExternalsPlugin)(c,{enforce:"pre"})),C}var S=w(require("fs"),1),$=w(require("path"),1);function L(t){return t.replace(/\\/g,"/")}function ct(t){return t.replace(/[-_](\w)/g,(e,n)=>n?n.toUpperCase():"").replace(/^\w/,e=>e.toUpperCase())}function at(t={}){let{dir:e="src/components",exportPath:n="src/components/index.ts",dts:i=!0,dtsPath:r="types/component.d.ts",deep:g=!0,extensions:p=["vue","tsx","jsx"],formatter:u}=t,c,C=new Map,a=null,d=m=>{let s=m;for(let l of p)if(s.endsWith(`.${l}`)){s=s.slice(0,-l.length-1);break}if(s.endsWith("/index")||s.endsWith("\\index")){let l=s.split(/[\\/]/);s=l[l.length-2]||l[l.length-1]}else{let l=s.split(/[\\/]/);s=l[l.length-1]}return u?u(s):ct(s)},h=(m,s=0)=>{let l=[];if(!S.default.existsSync(m))return l;let o=S.default.readdirSync(m,{withFileTypes:!0});for(let v of o){let D=$.default.join(m,v.name);if(v.isDirectory()){if(v.name==="node_modules"||v.name.startsWith(". "))continue;(g||s===0)&&l.push(...h(D,s+1))}else if(v.isFile()){let x=$.default.extname(v.name).slice(1);p.includes(x)&&l.push(D)}}return l},f=()=>{C.clear();let m=$.default.resolve(c.root,e);if(!S.default.existsSync(m)){console.warn(`[component-auto-import] Directory not found: ${m}`);return}h(m).forEach(l=>{let o=$.default.relative(m,l),v=d(o);C.set(v,{name:v,from:l})})},y=()=>{if(C.size===0)return;let m=Array.from(C.values()).sort((x,A)=>x.name.localeCompare(A.name)),s=$.default.resolve(c.root,n),l=$.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(""),m.forEach(({name:x,from:A})=>{let b=L($.default.relative(l,A)),U=b.startsWith(".")?b:`./${b}`;o.push(`import ${x} from "${U}";`),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 {"),m.forEach(({name:x})=>{o.push(` app.component(${x}.name, ${x});`)}),o.push("}"),o.push("");let v=`${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
- `,D=S.default.existsSync(s)?S.default.readFileSync(s,"utf-8"):"";v!==D&&S.default.writeFileSync(s,v,"utf-8")},N=()=>{if(!i||C.size===0)return;let m=Array.from(C.values()).sort((x,A)=>x.name.localeCompare(A.name)),s=$.default.resolve(c.root,r),l=$.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 {"),m.forEach(({name:x,from:A})=>{let b=L($.default.relative(l,A));b=b.replace(/\.(vue|tsx|jsx)$/,"");let U=b.startsWith(".")?b:`./${b}`;o.push(` ${x}: (typeof import("${U}"))["default"];`)}),o.push(" }"),o.push("}"),o.push(""),o.push("export {};");let v=`${o.join(`
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
  `)}
31
- `;S.default.existsSync(l)||S.default.mkdirSync(l,{recursive:!0});let D=S.default.existsSync(s)?S.default.readFileSync(s,"utf-8"):"";v!==D&&S.default.writeFileSync(s,v,"utf-8")};return{name:"fast-vite-plugin-component-auto-import",enforce:"post",configResolved:m=>{c=m},buildStart(){f(),y(),N()},configureServer(m){let s=$.default.resolve(c.root,e);S.default.existsSync(s)&&(a=S.default.watch(s,{recursive:!0},(l,o)=>{if(!o||o.endsWith(".d.ts"))return;let v=$.default.extname(o).slice(1);p.includes(v)&&(f(),y(),N(),m.ws.send({type:"full-reload",path:"*"}))}))},buildEnd(){a&&(a.close(),a=null)}}}var F=w(require("fs"),1),P=w(require("path"),1);function pt(t){return t.replace(/[-_](\w)/g,(e,n)=>n?n.toUpperCase():"").replace(/^\w/,e=>e.toUpperCase())}function lt(t){let e=/defineOptions\(\s*\{\s*name:\s*["']([^"']+)["']/,n=t.match(e);return n?n[1]:null}function ut(t={}){let{dir:e="src/views",exportPath:n="src/router/index.json",deep:i=!0,extensions:r=["vue","tsx","jsx"],formatter:g}=t,p,u=null,c=(a,d=[])=>(F.default.existsSync(a)&&F.default.readdirSync(a).forEach(f=>{let y=P.default.join(a,f);if(F.default.statSync(y).isDirectory())i&&c(y,d);else{let m=P.default.extname(y).slice(1);r.includes(m)&&d.push(y)}}),d),C=()=>{let a=P.default.resolve(p.root,e),h=c(a).reduce((m,s)=>{try{let l=F.default.readFileSync(s,"utf-8"),o=lt(l),v=`/${P.default.relative(p.root,s).replace(/\\/g,"/")}`,D;if(o)D=o;else{let x=P.default.basename(s,P.default.extname(s));D=g?g(x):pt(x)}m[v]=D}catch(l){console.error(`Error processing file ${s}:`,l)}return m},{}),f=P.default.resolve(p.root,n),y=P.default.dirname(f);F.default.existsSync(y)||F.default.mkdirSync(y,{recursive:!0});let N=JSON.stringify(h,null,2);F.default.writeFileSync(f,N,"utf-8")};return{name:"fast-vite-plugin-router-path",enforce:"post",configResolved:a=>{p=a},buildStart(){C()},configureServer(a){let d=P.default.resolve(p.root,e);F.default.existsSync(d)&&(u=F.default.watch(d,{recursive:!0},(h,f)=>{if(!f||f.endsWith(".d.ts")||f.endsWith(".json"))return;let y=P.default.extname(f).slice(1);r.includes(y)&&(C(),a.ws.send({type:"full-reload",path:"*"}))}))},buildEnd(){u&&(u.close(),u=null)}}}var k=w(require("fs"),1),I=w(require("path"),1);function E(t,e=2){return t.toString().padStart(e,"0")}function mt(t){let e=t.getUTCFullYear(),n=E(t.getUTCMonth()+1),i=E(t.getUTCDate()),r=E(t.getUTCHours()),g=E(t.getUTCMinutes()),p=E(t.getUTCSeconds()),u=E(t.getUTCMilliseconds(),3);return`Z ${e}-${n}-${i} ${r}:${g}:${p}.${u}`}function ft(t){let e;return{name:"fast-vite-plugin-version-update",configResolved:n=>{e=n},buildStart(){let i=mt(new Date),r=e.publicDir,g=I.default.join(r,"version.json");k.default.existsSync(r)||k.default.mkdirSync(r);let p=JSON.stringify({version:`v${t}`,dateTime:i},null,4);k.default.writeFileSync(g,p);let u=I.default.join(e.base,"package.json");if(k.default.existsSync(u)){let c=JSON.parse(k.default.readFileSync(u,"utf-8"));c.version=t,k.default.writeFileSync(u,JSON.stringify(c,null,2),"utf-8")}}}}0&&(module.exports={buildRouterPath,buildSvgIcon,cdnImport,cdnJsDelivrUrl,cdnUnpkgUrl,componentAutoImport,findSvgFile,versionUpdatePlugin,writeTSXIcon});
31
+ `;S.default.existsSync(a)||S.default.mkdirSync(a,{recursive:!0});let P=S.default.existsSync(s)?S.default.readFileSync(s,"utf-8"):"";y!==P&&S.default.writeFileSync(s,y,"utf-8")};return{name:"fast-vite-plugin-component-auto-import",enforce:"post",configResolved:l=>{f=l},buildStart(){d(),h(),w()},configureServer(l){let s=C.default.resolve(f.root,e);if(S.default.existsSync(s)){l.watcher.add(s);let a=o=>{if(!o||o.endsWith(".d.ts"))return;let y=C.default.extname(o).slice(1);c.includes(y)&&(d(),h(),w())};l.watcher.on("add",a),l.watcher.on("change",a),l.watcher.on("unlink",a)}}}}var b=$(require("fs"),1),D=$(require("path"),1);function at(t){return t.replace(/[-_](\w)/g,(e,n)=>n?n.toUpperCase():"").replace(/^\w/,e=>e.toUpperCase())}function pt(t){let e=/defineOptions\(\s*\{\s*name:\s*["']([^"']+)["']/,n=t.match(e);return n?n[1]:null}function lt(t={}){let{dir:e="src/views",exportPath:n="src/router/index.json",deep:p=!0,extensions:r=["vue","tsx","jsx"],formatter:g}=t,c,m=(i,u=[])=>(b.default.existsSync(i)&&b.default.readdirSync(i).forEach(d=>{let h=D.default.join(i,d);if(b.default.statSync(h).isDirectory())p&&m(h,u);else{let l=D.default.extname(h).slice(1);r.includes(l)&&u.push(h)}}),u),f=()=>{let i=D.default.resolve(c.root,e),v=m(i).reduce((l,s)=>{try{let a=b.default.readFileSync(s,"utf-8"),o=pt(a),y=`/${D.default.relative(c.root,s).replace(/\\/g,"/")}`,P;if(o)P=o;else{let x=D.default.basename(s,D.default.extname(s));P=g?g(x):at(x)}l[y]=P}catch(a){console.error(`Error processing file ${s}:`,a)}return l},{}),d=D.default.resolve(c.root,n),h=D.default.dirname(d);b.default.existsSync(h)||b.default.mkdirSync(h,{recursive:!0});let w=JSON.stringify(v,null,2);b.default.writeFileSync(d,w,"utf-8")};return{name:"fast-vite-plugin-router-path",enforce:"post",configResolved:i=>{c=i},buildStart(){f()},configureServer(i){let u=D.default.resolve(c.root,e);if(b.default.existsSync(u)){i.watcher.add(u);let v=d=>{if(!d||d.endsWith(".d.ts")||d.endsWith(".json"))return;let h=D.default.extname(d).slice(1);r.includes(h)&&f()};i.watcher.on("add",v),i.watcher.on("change",v),i.watcher.on("unlink",v)}}}}var A=$(require("fs"),1),O=$(require("path"),1);function R(t,e=2){return t.toString().padStart(e,"0")}function ut(t){let e=t.getUTCFullYear(),n=R(t.getUTCMonth()+1),p=R(t.getUTCDate()),r=R(t.getUTCHours()),g=R(t.getUTCMinutes()),c=R(t.getUTCSeconds()),m=R(t.getUTCMilliseconds(),3);return`Z ${e}-${n}-${p} ${r}:${g}:${c}.${m}`}function mt(t){let e;return{name:"fast-vite-plugin-version-update",configResolved:n=>{e=n},buildStart(){let p=ut(new Date),r=e.publicDir,g=O.default.join(r,"version.json");A.default.existsSync(r)||A.default.mkdirSync(r);let c=JSON.stringify({version:`v${t}`,dateTime:p},null,4);A.default.writeFileSync(g,c);let m=O.default.join(e.base,"package.json");if(A.default.existsSync(m)){let f=JSON.parse(A.default.readFileSync(m,"utf-8"));f.version=t,A.default.writeFileSync(m,JSON.stringify(f,null,2),"utf-8")}}}}0&&(module.exports={buildRouterPath,buildSvgIcon,cdnImport,cdnJsDelivrUrl,cdnUnpkgUrl,componentAutoImport,findSvgFile,versionUpdatePlugin,writeTSXIcon});
32
32
  //# sourceMappingURL=index.cjs.map
@@ -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 } from \"vite\";\n\n/**\n * 查找 svg 文件\n */\n\nconst findSvgFile = (dir: string): { iconName: string; componentName: string; iconContent: string }[] => {\n\t// svg 内容\n\tconst svgContents: { iconName: string; componentName: string; iconContent: string }[] = [];\n\t// 获取当前目录下的文件\n\tconst svgFiles = fs.readdirSync(dir, {\n\t\twithFileTypes: true,\n\t});\n\n\tsvgFiles.forEach((file) => {\n\t\tif (file.isDirectory()) {\n\t\t\tsvgContents.push(...findSvgFile(path.join(dir, file.name)));\n\t\t} else {\n\t\t\tconst iconName = file.name.replace(\".svg\", \"\");\n\n\t\t\tconst svgContent = fs\n\t\t\t\t.readFileSync(path.join(dir, file.name), \"utf-8\")\n\t\t\t\t.replace(/<\\?xml.*?\\?>/, \"\")\n\t\t\t\t.replace(/<!DOCTYPE svg.*?>/, \"\")\n\t\t\t\t// .replace(/(\\r)|(\\n)/g, \"\")\n\t\t\t\t.trimStart()\n\t\t\t\t.trimEnd()\n\t\t\t\t// .replace(/(fill=\"[^>+].*?\")/g, 'fill=\"\"')\n\t\t\t\t.replace(/<svg([^>+].*?)>/, (match, attr) => {\n\t\t\t\t\tconst viewBoxMatch = attr.match(/viewBox=\"[^\"]+\"/);\n\t\t\t\t\tconst widthMatch = attr.match(/width=\"(\\d+)\"/);\n\t\t\t\t\tconst heightMatch = attr.match(/height=\"(\\d+)\"/);\n\t\t\t\t\tlet width = 1024;\n\t\t\t\t\tlet height = 1024;\n\t\t\t\t\tif (widthMatch) {\n\t\t\t\t\t\twidth = widthMatch[0];\n\t\t\t\t\t}\n\t\t\t\t\tif (heightMatch) {\n\t\t\t\t\t\theight = heightMatch[0];\n\t\t\t\t\t}\n\t\t\t\t\tlet viewBoxContent = \"\";\n\t\t\t\t\tif (!viewBoxMatch) {\n\t\t\t\t\t\tviewBoxContent = `viewBox=\"0 0 ${width} ${height}\"`;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tviewBoxContent = viewBoxMatch[0];\n\t\t\t\t\t}\n\t\t\t\t\treturn `<svg xmlns=\"http://www.w3.org/2000/svg\" ${viewBoxContent}>`;\n\t\t\t\t});\n\n\t\t\tsvgContents.push({\n\t\t\t\t// iconName: iconName.charAt(0).toUpperCase() + iconName.slice(1),\n\t\t\t\ticonName,\n\t\t\t\tcomponentName: iconName.charAt(0).toUpperCase() + iconName.slice(1),\n\t\t\t\ticonContent: svgContent,\n\t\t\t});\n\t\t}\n\t});\n\n\treturn svgContents.sort((a, b) => {\n\t\tif (a.iconName < b.iconName) {\n\t\t\treturn -1;\n\t\t}\n\t\tif (a.iconName > b.iconName) {\n\t\t\treturn 1;\n\t\t}\n\t\treturn 0;\n\t});\n};\n\n/**\n * 写入 TSX 图标\n */\nconst writeTSXIcon = (componentName: string, iconDir: string, svgContent: string): void => {\n\tfs.mkdirSync(iconDir, { recursive: true });\n\n\tconst componentContent = `import { defineComponent } from \"vue\";\n\n/**\n * ${componentName} 图标组件\n */\nexport const ${componentName} = defineComponent({\n\tname: \"${componentName}\",\n\trender() {\n\t\treturn (\n${svgContent\n\t.split(\"\\n\")\n\t.map((line) => `\t\t\t${line}`)\n\t.join(\"\\n\")}\n\t\t);\n\t},\n});\n\nexport default ${componentName};\n`;\n\n\tfs.writeFileSync(path.join(iconDir, \"index.tsx\"), componentContent);\n};\n\n/**\n * 构建 svg 图标组件\n * @param dir svg 文件路径\n * @param writeDir 写入的文件路径 相对的即可\n */\nfunction buildSvgIcon(dir: string, writeDir: string): Plugin {\n\tif (!dir || !writeDir) return;\n\n\tlet config: ResolvedConfig;\n\n\treturn {\n\t\tname: \"fast-vite-plugin-build-svg-icon\",\n\t\tconfigResolved: (resolvedConfig: ResolvedConfig): void | Promise<void> => {\n\t\t\t// 存储最终解析的配置\n\t\t\tconfig = resolvedConfig;\n\t\t},\n\t\tbuildStart(): void | Promise<void> {\n\t\t\tconst svgFiles = findSvgFile(path.resolve(config.root, dir));\n\n\t\t\tconst iconsPath = path.resolve(config.root, writeDir);\n\t\t\tfs.mkdirSync(iconsPath, { recursive: true });\n\n\t\t\tlet iconImportContent = \"\";\n\t\t\tlet iconTypeContent = \"\";\n\t\t\tlet exportContent = \"\";\n\n\t\t\tsvgFiles.forEach((svg, idx) => {\n\t\t\t\twriteTSXIcon(svg.componentName, path.join(iconsPath, svg.iconName), svg.iconContent);\n\n\t\t\t\ticonImportContent += `import { ${svg.componentName} } from \"./${svg.iconName}\";\n`;\n\n\t\t\t\ticonTypeContent += `\t${svg.componentName},`;\n\n\t\t\t\texportContent += `export * from \"./${svg.iconName}\";\n`;\n\n\t\t\t\tif (idx + 1 < svgFiles.length) {\n\t\t\t\t\ticonTypeContent += \"\\n\";\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tfs.writeFileSync(\n\t\t\t\tpath.join(iconsPath, \"index.ts\"),\n\t\t\t\t`import type { DefineComponent } from \"vue\";\n${iconImportContent}\n${exportContent}\nexport default [\n${iconTypeContent}\n] as unknown as DefineComponent[];\n`\n\t\t\t);\n\t\t},\n\t};\n}\n\nexport { findSvgFile, writeTSXIcon, buildSvgIcon };\n","import fs from \"fs\";\nimport path from \"path\";\nimport externalGlobals from \"rollup-plugin-external-globals\";\nimport { viteExternalsPlugin } from \"vite-plugin-externals\";\nimport type { CdnImportOptions, Module } from \"./type\";\nimport type { HtmlTagDescriptor, Plugin, UserConfig } from \"vite\";\n\nconst isDev = process.env.NODE_ENV === \"development\";\n\n/**\n * get npm module version\n * @param name\n * @returns\n */\nfunction getModuleVersion(name: string): string {\n\tconst pwd = process.cwd();\n\tconst pkgFile = path.join(pwd, \"node_modules\", name, \"package.json\");\n\tif (fs.existsSync(pkgFile)) {\n\t\tconst pkgJson = JSON.parse(fs.readFileSync(pkgFile, \"utf8\"));\n\t\treturn pkgJson.version;\n\t}\n\n\treturn \"\";\n}\n\n/**\n * 是否完整的 url\n * @param path\n * @returns\n */\nfunction isFullPath(path: string): boolean {\n\treturn path.startsWith(\"http:\") || path.startsWith(\"https:\") || path.startsWith(\"//\") ? true : false;\n}\n\nfunction renderUrl(\n\turl: string,\n\tdata: {\n\t\tname: string;\n\t\tversion: string;\n\t\tpath: string;\n\t}\n): string {\n\tconst { path } = data;\n\tif (isFullPath(path)) {\n\t\turl = path;\n\t}\n\treturn url\n\t\t.replace(/\\{name\\}/g, data.name)\n\t\t.replace(/\\{version\\}/g, data.version)\n\t\t.replace(/\\{path\\}/g, path);\n}\n\nfunction getModuleInfo(module: Module, prodUrl: string): Module & { pathList?: string[]; cssList?: string[] } {\n\tprodUrl = module.prodUrl || prodUrl;\n\tconst v = module;\n\tconst version = module.version || getModuleVersion(v.name);\n\tlet pathList: string[] = [];\n\tif (!Array.isArray(v.path)) {\n\t\tpathList.push(v.path);\n\t} else {\n\t\tpathList = v.path;\n\t}\n\n\tconst data = {\n\t\t...v,\n\t\tversion,\n\t};\n\n\tpathList = pathList.map((p) => {\n\t\tif (!version && !isFullPath(p)) {\n\t\t\tthrow new Error(`modules: ${data.name} package.json file does not exist`);\n\t\t}\n\t\treturn renderUrl(prodUrl, {\n\t\t\tname: data.name,\n\t\t\tversion: data.version,\n\t\t\tpath: p,\n\t\t});\n\t});\n\n\tlet css = v.css || [];\n\tif (!Array.isArray(css) && css) {\n\t\tcss = [css];\n\t}\n\n\tconst cssList = !Array.isArray(css)\n\t\t? []\n\t\t: css.map((c) =>\n\t\t\t\trenderUrl(prodUrl, {\n\t\t\t\t\tname: data.name,\n\t\t\t\t\tversion: data.version,\n\t\t\t\t\tpath: c,\n\t\t\t\t})\n\t\t\t);\n\n\treturn {\n\t\t...v,\n\t\tversion,\n\t\tpathList,\n\t\tcssList,\n\t};\n}\n\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\tlet watcher: fs.FSWatcher | null = null;\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\twatcher = fs.watch(fullDir, { recursive: true }, (eventType, filename) => {\n\t\t\t\t\tif (!filename) return;\n\t\t\t\t\t// 忽略 .d.ts 文件\n\t\t\t\t\tif (filename.endsWith(\".d.ts\")) return;\n\n\t\t\t\t\t// 检查是否是组件文件\n\t\t\t\t\tconst ext = path.extname(filename).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\n\t\t\t\t\t// 通知客户端刷新\n\t\t\t\t\tserver.ws.send({ type: \"full-reload\", path: \"*\" });\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\tbuildEnd(): void | Promise<void> {\n\t\t\t// 关闭监听器\n\t\t\tif (watcher) {\n\t\t\t\twatcher.close();\n\t\t\t\twatcher = null;\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\tlet watcher: fs.FSWatcher | null = null;\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\twatcher = fs.watch(fullDir, { recursive: true }, (eventType, filename) => {\n\t\t\t\t\tif (!filename) return;\n\t\t\t\t\t// 忽略 . d.ts 文件和 JSON 文件\n\t\t\t\t\tif (filename.endsWith(\".d.ts\") || filename.endsWith(\".json\")) return;\n\n\t\t\t\t\t// 检查是否是组件文件\n\t\t\t\t\tconst ext = path.extname(filename).slice(1);\n\t\t\t\t\tif (!extensions.includes(ext)) return;\n\n\t\t\t\t\tgeneratePathNameMap();\n\n\t\t\t\t\t// 通知客户端刷新\n\t\t\t\t\tserver.ws.send({ type: \"full-reload\", path: \"*\" });\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\tbuildEnd(): void | Promise<void> {\n\t\t\t// 关闭监听器\n\t\t\tif (watcher) {\n\t\t\t\twatcher.close();\n\t\t\t\twatcher = null;\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","resolvedConfig","svgFiles","iconsPath","iconImportContent","iconTypeContent","exportContent","svg","idx","import_fs","import_path","import_rollup_plugin_external_globals","import_vite_plugin_externals","isDev","getModuleVersion","name","pwd","pkgFile","path","fs","isFullPath","renderUrl","url","data","getModuleInfo","module","prodUrl","v","version","pathList","p","css","cssList","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","watcher","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","eventType","filename","import_fs","import_path","pascalCase","str","_","c","extractComponentName","fileContent","defineOptionsRegex","defineOptionsMatch","buildRouterPath","options","dir","exportPath","deep","extensions","formatter","config","watcher","getAllFiles","dirPath","fileList","fs","file","filePath","path","ext","generatePathNameMap","targetDir","pathNameMap","acc","content","componentName","relativePath","finalName","fileName","error","outputPath","outputDir","outputContent","resolvedConfig","server","fullDir","eventType","filename","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
@@ -1,4 +1,4 @@
1
- import A from"fs";import j from"path";var T=t=>{let n=[];return A.readdirSync(t,{withFileTypes:!0}).forEach(a=>{if(a.isDirectory())n.push(...T(j.join(t,a.name)));else{let c=a.name.replace(".svg",""),g=A.readFileSync(j.join(t,a.name),"utf-8").replace(/<\?xml.*?\?>/,"").replace(/<!DOCTYPE svg.*?>/,"").trimStart().trimEnd().replace(/<svg([^>+].*?)>/,(p,u)=>{let s=u.match(/viewBox="[^"]+"/),C=u.match(/width="(\d+)"/),i=u.match(/height="(\d+)"/),d=1024,h=1024;C&&(d=C[0]),i&&(h=i[0]);let f="";return s?f=s[0]:f=`viewBox="0 0 ${d} ${h}"`,`<svg xmlns="http://www.w3.org/2000/svg" ${f}>`});n.push({iconName:c,componentName:c.charAt(0).toUpperCase()+c.slice(1),iconContent:g})}}),n.sort((a,c)=>a.iconName<c.iconName?-1:a.iconName>c.iconName?1:0)},J=(t,n,o)=>{A.mkdirSync(n,{recursive:!0});let a=`import { defineComponent } from "vue";
1
+ import j from"fs";import F from"path";var E=t=>{let n=[];return j.readdirSync(t,{withFileTypes:!0}).forEach(u=>{if(u.isDirectory())n.push(...E(F.join(t,u.name)));else{let r=u.name.replace(".svg",""),g=j.readFileSync(F.join(t,u.name),"utf-8").replace(/<\?xml.*?\?>/,"").replace(/<!DOCTYPE svg.*?>/,"").trimStart().trimEnd().replace(/<svg([^>+].*?)>/,(c,m)=>{let f=m.match(/viewBox="[^"]+"/),i=m.match(/width="(\d+)"/),l=m.match(/height="(\d+)"/),v=1024,d=1024;i&&(v=i[0]),l&&(d=l[0]);let h="";return f?h=f[0]:h=`viewBox="0 0 ${v} ${d}"`,`<svg xmlns="http://www.w3.org/2000/svg" ${h}>`});n.push({iconName:r,componentName:r.charAt(0).toUpperCase()+r.slice(1),iconContent:g})}}),n.sort((u,r)=>u.iconName<r.iconName?-1:u.iconName>r.iconName?1:0)},W=(t,n,o)=>{j.mkdirSync(n,{recursive:!0});let u=`import { defineComponent } from "vue";
2
2
 
3
3
  /**
4
4
  * ${t} \u56FE\u6807\u7EC4\u4EF6
@@ -8,25 +8,25 @@ export const ${t} = defineComponent({
8
8
  render() {
9
9
  return (
10
10
  ${o.split(`
11
- `).map(c=>` ${c}`).join(`
11
+ `).map(r=>` ${r}`).join(`
12
12
  `)}
13
13
  );
14
14
  },
15
15
  });
16
16
 
17
17
  export default ${t};
18
- `;A.writeFileSync(j.join(n,"index.tsx"),a)};function tt(t,n){if(!t||!n)return;let o;return{name:"fast-vite-plugin-build-svg-icon",configResolved:a=>{o=a},buildStart(){let a=T(j.resolve(o.root,t)),c=j.resolve(o.root,n);A.mkdirSync(c,{recursive:!0});let g="",p="",u="";a.forEach((s,C)=>{J(s.componentName,j.join(c,s.iconName),s.iconContent),g+=`import { ${s.componentName} } from "./${s.iconName}";
19
- `,p+=` ${s.componentName},`,u+=`export * from "./${s.iconName}";
20
- `,C+1<a.length&&(p+=`
21
- `)}),A.writeFileSync(j.join(c,"index.ts"),`import type { DefineComponent } from "vue";
22
- ${g}
23
- ${u}
18
+ `;j.writeFileSync(F.join(n,"index.tsx"),u)};function Q(t,n){if(!t||!n)return;let o,u=()=>{let r=E(F.resolve(o.root,t)),g=F.resolve(o.root,n);j.mkdirSync(g,{recursive:!0});let c="",m="",f="";r.forEach((i,l)=>{W(i.componentName,F.join(g,i.iconName),i.iconContent),c+=`import { ${i.componentName} } from "./${i.iconName}";
19
+ `,m+=` ${i.componentName},`,f+=`export * from "./${i.iconName}";
20
+ `,l+1<r.length&&(m+=`
21
+ `)}),j.writeFileSync(F.join(g,"index.ts"),`import type { DefineComponent } from "vue";
22
+ ${c}
23
+ ${f}
24
24
  export default [
25
- ${p}
25
+ ${m}
26
26
  ] as unknown as DefineComponent[];
27
- `)}}}import U from"fs";import _ from"path";import B from"rollup-plugin-external-globals";import{viteExternalsPlugin as V}from"vite-plugin-externals";var G=process.env.NODE_ENV==="development";function H(t){let n=process.cwd(),o=_.join(n,"node_modules",t,"package.json");return U.existsSync(o)?JSON.parse(U.readFileSync(o,"utf8")).version:""}function O(t){return!!(t.startsWith("http:")||t.startsWith("https:")||t.startsWith("//"))}function M(t,n){let{path:o}=n;return O(o)&&(t=o),t.replace(/\{name\}/g,n.name).replace(/\{version\}/g,n.version).replace(/\{path\}/g,o)}function z(t,n){n=t.prodUrl||n;let o=t,a=t.version||H(o.name),c=[];Array.isArray(o.path)?c=o.path:c.push(o.path);let g={...o,version:a};c=c.map(s=>{if(!a&&!O(s))throw new Error(`modules: ${g.name} package.json file does not exist`);return M(n,{name:g.name,version:g.version,path:s})});let p=o.css||[];!Array.isArray(p)&&p&&(p=[p]);let u=Array.isArray(p)?p.map(s=>M(n,{name:g.name,version:g.version,path:s})):[];return{...o,version:a,pathList:c,cssList:u}}var L="https://cdn.jsdelivr.net/npm/{name}@{version}/{path}",it="https://unpkg.com/{package}@{version}/{path}";function ct(t){let{modules:n=[],prodUrl:o=L,enableInDevMode:a=!1,generateCssLinkTag:c,generateScriptTag:g}=t,p=!1,u=(Array.isArray(n)?n:[n]).map(i=>typeof i=="function"?i(o):i).map(i=>z(i,o)),s={};u.forEach(i=>{s[i.name]=i.var,Array.isArray(i.alias)&&i.alias.forEach(d=>{s[d]=i.var})});let C=[{name:"fast-vite-plugin-cdn-import",enforce:"pre",config(i,{command:d}){p=d==="build";let h={build:{rollupOptions:{plugins:[]}}};return p&&(h.build.rollupOptions.plugins=[B(s)]),h},transformIndexHtml(i){if(!p&&!a)return i;let d=[];return u.forEach(h=>{h.pathList.forEach(f=>{let y=g?.(h.name,f)||{},D={src:f,crossorigin:"anonymous",...h?.attrs??{},...y.attrs};d.push({tag:"script",attrs:D,...y})}),h.cssList.forEach(f=>{let y=c?.(h.name,f)||{},D={href:f,rel:"stylesheet",crossorigin:"anonymous",...h?.attrs??{},...y.attrs};d.push({tag:"link",attrs:D,...y})})}),d}}];return G&&a&&C.push(V(s,{enforce:"pre"})),C}import S from"fs";import $ from"path";function I(t){return t.replace(/\\/g,"/")}function Y(t){return t.replace(/[-_](\w)/g,(n,o)=>o?o.toUpperCase():"").replace(/^\w/,n=>n.toUpperCase())}function ut(t={}){let{dir:n="src/components",exportPath:o="src/components/index.ts",dts:a=!0,dtsPath:c="types/component.d.ts",deep:g=!0,extensions:p=["vue","tsx","jsx"],formatter:u}=t,s,C=new Map,i=null,d=m=>{let r=m;for(let l of p)if(r.endsWith(`.${l}`)){r=r.slice(0,-l.length-1);break}if(r.endsWith("/index")||r.endsWith("\\index")){let l=r.split(/[\\/]/);r=l[l.length-2]||l[l.length-1]}else{let l=r.split(/[\\/]/);r=l[l.length-1]}return u?u(r):Y(r)},h=(m,r=0)=>{let l=[];if(!S.existsSync(m))return l;let e=S.readdirSync(m,{withFileTypes:!0});for(let v of e){let w=$.join(m,v.name);if(v.isDirectory()){if(v.name==="node_modules"||v.name.startsWith(". "))continue;(g||r===0)&&l.push(...h(w,r+1))}else if(v.isFile()){let x=$.extname(v.name).slice(1);p.includes(x)&&l.push(w)}}return l},f=()=>{C.clear();let m=$.resolve(s.root,n);if(!S.existsSync(m)){console.warn(`[component-auto-import] Directory not found: ${m}`);return}h(m).forEach(l=>{let e=$.relative(m,l),v=d(e);C.set(v,{name:v,from:l})})},y=()=>{if(C.size===0)return;let m=Array.from(C.values()).sort((x,b)=>x.name.localeCompare(b.name)),r=$.resolve(s.root,o),l=$.dirname(r),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(""),m.forEach(({name:x,from:b})=>{let F=I($.relative(l,b)),E=F.startsWith(".")?F:`./${F}`;e.push(`import ${x} from "${E}";`),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 {"),m.forEach(({name:x})=>{e.push(` app.component(${x}.name, ${x});`)}),e.push("}"),e.push("");let v=`${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
- `,w=S.existsSync(r)?S.readFileSync(r,"utf-8"):"";v!==w&&S.writeFileSync(r,v,"utf-8")},D=()=>{if(!a||C.size===0)return;let m=Array.from(C.values()).sort((x,b)=>x.name.localeCompare(b.name)),r=$.resolve(s.root,c),l=$.dirname(r),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 {"),m.forEach(({name:x,from:b})=>{let F=I($.relative(l,b));F=F.replace(/\.(vue|tsx|jsx)$/,"");let E=F.startsWith(".")?F:`./${F}`;e.push(` ${x}: (typeof import("${E}"))["default"];`)}),e.push(" }"),e.push("}"),e.push(""),e.push("export {};");let v=`${e.join(`
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
  `)}
31
- `;S.existsSync(l)||S.mkdirSync(l,{recursive:!0});let w=S.existsSync(r)?S.readFileSync(r,"utf-8"):"";v!==w&&S.writeFileSync(r,v,"utf-8")};return{name:"fast-vite-plugin-component-auto-import",enforce:"post",configResolved:m=>{s=m},buildStart(){f(),y(),D()},configureServer(m){let r=$.resolve(s.root,n);S.existsSync(r)&&(i=S.watch(r,{recursive:!0},(l,e)=>{if(!e||e.endsWith(".d.ts"))return;let v=$.extname(e).slice(1);p.includes(v)&&(f(),y(),D(),m.ws.send({type:"full-reload",path:"*"}))}))},buildEnd(){i&&(i.close(),i=null)}}}import N from"fs";import P from"path";function Z(t){return t.replace(/[-_](\w)/g,(n,o)=>o?o.toUpperCase():"").replace(/^\w/,n=>n.toUpperCase())}function X(t){let n=/defineOptions\(\s*\{\s*name:\s*["']([^"']+)["']/,o=t.match(n);return o?o[1]:null}function dt(t={}){let{dir:n="src/views",exportPath:o="src/router/index.json",deep:a=!0,extensions:c=["vue","tsx","jsx"],formatter:g}=t,p,u=null,s=(i,d=[])=>(N.existsSync(i)&&N.readdirSync(i).forEach(f=>{let y=P.join(i,f);if(N.statSync(y).isDirectory())a&&s(y,d);else{let m=P.extname(y).slice(1);c.includes(m)&&d.push(y)}}),d),C=()=>{let i=P.resolve(p.root,n),h=s(i).reduce((m,r)=>{try{let l=N.readFileSync(r,"utf-8"),e=X(l),v=`/${P.relative(p.root,r).replace(/\\/g,"/")}`,w;if(e)w=e;else{let x=P.basename(r,P.extname(r));w=g?g(x):Z(x)}m[v]=w}catch(l){console.error(`Error processing file ${r}:`,l)}return m},{}),f=P.resolve(p.root,o),y=P.dirname(f);N.existsSync(y)||N.mkdirSync(y,{recursive:!0});let D=JSON.stringify(h,null,2);N.writeFileSync(f,D,"utf-8")};return{name:"fast-vite-plugin-router-path",enforce:"post",configResolved:i=>{p=i},buildStart(){C()},configureServer(i){let d=P.resolve(p.root,n);N.existsSync(d)&&(u=N.watch(d,{recursive:!0},(h,f)=>{if(!f||f.endsWith(".d.ts")||f.endsWith(".json"))return;let y=P.extname(f).slice(1);c.includes(y)&&(C(),i.ws.send({type:"full-reload",path:"*"}))}))},buildEnd(){u&&(u.close(),u=null)}}}import R from"fs";import W from"path";function k(t,n=2){return t.toString().padStart(n,"0")}function q(t){let n=t.getUTCFullYear(),o=k(t.getUTCMonth()+1),a=k(t.getUTCDate()),c=k(t.getUTCHours()),g=k(t.getUTCMinutes()),p=k(t.getUTCSeconds()),u=k(t.getUTCMilliseconds(),3);return`Z ${n}-${o}-${a} ${c}:${g}:${p}.${u}`}function xt(t){let n;return{name:"fast-vite-plugin-version-update",configResolved:o=>{n=o},buildStart(){let a=q(new Date),c=n.publicDir,g=W.join(c,"version.json");R.existsSync(c)||R.mkdirSync(c);let p=JSON.stringify({version:`v${t}`,dateTime:a},null,4);R.writeFileSync(g,p);let u=W.join(n.base,"package.json");if(R.existsSync(u)){let s=JSON.parse(R.readFileSync(u,"utf-8"));s.version=t,R.writeFileSync(u,JSON.stringify(s,null,2),"utf-8")}}}}export{dt as buildRouterPath,tt as buildSvgIcon,ct as cdnImport,L as cdnJsDelivrUrl,it as cdnUnpkgUrl,ut as componentAutoImport,T as findSvgFile,xt as versionUpdatePlugin,J as writeTSXIcon};
31
+ `;S.existsSync(a)||S.mkdirSync(a,{recursive:!0});let $=S.existsSync(s)?S.readFileSync(s,"utf-8"):"";y!==$&&S.writeFileSync(s,y,"utf-8")};return{name:"fast-vite-plugin-component-auto-import",enforce:"post",configResolved:p=>{f=p},buildStart(){d(),h(),w()},configureServer(p){let s=C.resolve(f.root,n);if(S.existsSync(s)){p.watcher.add(s);let a=e=>{if(!e||e.endsWith(".d.ts"))return;let y=C.extname(e).slice(1);c.includes(y)&&(d(),h(),w())};p.watcher.on("add",a),p.watcher.on("change",a),p.watcher.on("unlink",a)}}}}import N from"fs";import D from"path";function Y(t){return t.replace(/[-_](\w)/g,(n,o)=>o?o.toUpperCase():"").replace(/^\w/,n=>n.toUpperCase())}function Z(t){let n=/defineOptions\(\s*\{\s*name:\s*["']([^"']+)["']/,o=t.match(n);return o?o[1]:null}function gt(t={}){let{dir:n="src/views",exportPath:o="src/router/index.json",deep:u=!0,extensions:r=["vue","tsx","jsx"],formatter:g}=t,c,m=(i,l=[])=>(N.existsSync(i)&&N.readdirSync(i).forEach(d=>{let h=D.join(i,d);if(N.statSync(h).isDirectory())u&&m(h,l);else{let p=D.extname(h).slice(1);r.includes(p)&&l.push(h)}}),l),f=()=>{let i=D.resolve(c.root,n),v=m(i).reduce((p,s)=>{try{let a=N.readFileSync(s,"utf-8"),e=Z(a),y=`/${D.relative(c.root,s).replace(/\\/g,"/")}`,$;if(e)$=e;else{let x=D.basename(s,D.extname(s));$=g?g(x):Y(x)}p[y]=$}catch(a){console.error(`Error processing file ${s}:`,a)}return p},{}),d=D.resolve(c.root,o),h=D.dirname(d);N.existsSync(h)||N.mkdirSync(h,{recursive:!0});let w=JSON.stringify(v,null,2);N.writeFileSync(d,w,"utf-8")};return{name:"fast-vite-plugin-router-path",enforce:"post",configResolved:i=>{c=i},buildStart(){f()},configureServer(i){let l=D.resolve(c.root,n);if(N.existsSync(l)){i.watcher.add(l);let v=d=>{if(!d||d.endsWith(".d.ts")||d.endsWith(".json"))return;let h=D.extname(d).slice(1);r.includes(h)&&f()};i.watcher.on("add",v),i.watcher.on("change",v),i.watcher.on("unlink",v)}}}}import k from"fs";import I from"path";function A(t,n=2){return t.toString().padStart(n,"0")}function X(t){let n=t.getUTCFullYear(),o=A(t.getUTCMonth()+1),u=A(t.getUTCDate()),r=A(t.getUTCHours()),g=A(t.getUTCMinutes()),c=A(t.getUTCSeconds()),m=A(t.getUTCMilliseconds(),3);return`Z ${n}-${o}-${u} ${r}:${g}:${c}.${m}`}function yt(t){let n;return{name:"fast-vite-plugin-version-update",configResolved:o=>{n=o},buildStart(){let u=X(new Date),r=n.publicDir,g=I.join(r,"version.json");k.existsSync(r)||k.mkdirSync(r);let c=JSON.stringify({version:`v${t}`,dateTime:u},null,4);k.writeFileSync(g,c);let m=I.join(n.base,"package.json");if(k.existsSync(m)){let f=JSON.parse(k.readFileSync(m,"utf-8"));f.version=t,k.writeFileSync(m,JSON.stringify(f,null,2),"utf-8")}}}}export{gt as buildRouterPath,Q as buildSvgIcon,it as cdnImport,z as cdnJsDelivrUrl,st as cdnUnpkgUrl,lt as componentAutoImport,E as findSvgFile,yt as versionUpdatePlugin,W as writeTSXIcon};
32
32
  //# sourceMappingURL=index.js.map
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 } from \"vite\";\n\n/**\n * 查找 svg 文件\n */\n\nconst findSvgFile = (dir: string): { iconName: string; componentName: string; iconContent: string }[] => {\n\t// svg 内容\n\tconst svgContents: { iconName: string; componentName: string; iconContent: string }[] = [];\n\t// 获取当前目录下的文件\n\tconst svgFiles = fs.readdirSync(dir, {\n\t\twithFileTypes: true,\n\t});\n\n\tsvgFiles.forEach((file) => {\n\t\tif (file.isDirectory()) {\n\t\t\tsvgContents.push(...findSvgFile(path.join(dir, file.name)));\n\t\t} else {\n\t\t\tconst iconName = file.name.replace(\".svg\", \"\");\n\n\t\t\tconst svgContent = fs\n\t\t\t\t.readFileSync(path.join(dir, file.name), \"utf-8\")\n\t\t\t\t.replace(/<\\?xml.*?\\?>/, \"\")\n\t\t\t\t.replace(/<!DOCTYPE svg.*?>/, \"\")\n\t\t\t\t// .replace(/(\\r)|(\\n)/g, \"\")\n\t\t\t\t.trimStart()\n\t\t\t\t.trimEnd()\n\t\t\t\t// .replace(/(fill=\"[^>+].*?\")/g, 'fill=\"\"')\n\t\t\t\t.replace(/<svg([^>+].*?)>/, (match, attr) => {\n\t\t\t\t\tconst viewBoxMatch = attr.match(/viewBox=\"[^\"]+\"/);\n\t\t\t\t\tconst widthMatch = attr.match(/width=\"(\\d+)\"/);\n\t\t\t\t\tconst heightMatch = attr.match(/height=\"(\\d+)\"/);\n\t\t\t\t\tlet width = 1024;\n\t\t\t\t\tlet height = 1024;\n\t\t\t\t\tif (widthMatch) {\n\t\t\t\t\t\twidth = widthMatch[0];\n\t\t\t\t\t}\n\t\t\t\t\tif (heightMatch) {\n\t\t\t\t\t\theight = heightMatch[0];\n\t\t\t\t\t}\n\t\t\t\t\tlet viewBoxContent = \"\";\n\t\t\t\t\tif (!viewBoxMatch) {\n\t\t\t\t\t\tviewBoxContent = `viewBox=\"0 0 ${width} ${height}\"`;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tviewBoxContent = viewBoxMatch[0];\n\t\t\t\t\t}\n\t\t\t\t\treturn `<svg xmlns=\"http://www.w3.org/2000/svg\" ${viewBoxContent}>`;\n\t\t\t\t});\n\n\t\t\tsvgContents.push({\n\t\t\t\t// iconName: iconName.charAt(0).toUpperCase() + iconName.slice(1),\n\t\t\t\ticonName,\n\t\t\t\tcomponentName: iconName.charAt(0).toUpperCase() + iconName.slice(1),\n\t\t\t\ticonContent: svgContent,\n\t\t\t});\n\t\t}\n\t});\n\n\treturn svgContents.sort((a, b) => {\n\t\tif (a.iconName < b.iconName) {\n\t\t\treturn -1;\n\t\t}\n\t\tif (a.iconName > b.iconName) {\n\t\t\treturn 1;\n\t\t}\n\t\treturn 0;\n\t});\n};\n\n/**\n * 写入 TSX 图标\n */\nconst writeTSXIcon = (componentName: string, iconDir: string, svgContent: string): void => {\n\tfs.mkdirSync(iconDir, { recursive: true });\n\n\tconst componentContent = `import { defineComponent } from \"vue\";\n\n/**\n * ${componentName} 图标组件\n */\nexport const ${componentName} = defineComponent({\n\tname: \"${componentName}\",\n\trender() {\n\t\treturn (\n${svgContent\n\t.split(\"\\n\")\n\t.map((line) => `\t\t\t${line}`)\n\t.join(\"\\n\")}\n\t\t);\n\t},\n});\n\nexport default ${componentName};\n`;\n\n\tfs.writeFileSync(path.join(iconDir, \"index.tsx\"), componentContent);\n};\n\n/**\n * 构建 svg 图标组件\n * @param dir svg 文件路径\n * @param writeDir 写入的文件路径 相对的即可\n */\nfunction buildSvgIcon(dir: string, writeDir: string): Plugin {\n\tif (!dir || !writeDir) return;\n\n\tlet config: ResolvedConfig;\n\n\treturn {\n\t\tname: \"fast-vite-plugin-build-svg-icon\",\n\t\tconfigResolved: (resolvedConfig: ResolvedConfig): void | Promise<void> => {\n\t\t\t// 存储最终解析的配置\n\t\t\tconfig = resolvedConfig;\n\t\t},\n\t\tbuildStart(): void | Promise<void> {\n\t\t\tconst svgFiles = findSvgFile(path.resolve(config.root, dir));\n\n\t\t\tconst iconsPath = path.resolve(config.root, writeDir);\n\t\t\tfs.mkdirSync(iconsPath, { recursive: true });\n\n\t\t\tlet iconImportContent = \"\";\n\t\t\tlet iconTypeContent = \"\";\n\t\t\tlet exportContent = \"\";\n\n\t\t\tsvgFiles.forEach((svg, idx) => {\n\t\t\t\twriteTSXIcon(svg.componentName, path.join(iconsPath, svg.iconName), svg.iconContent);\n\n\t\t\t\ticonImportContent += `import { ${svg.componentName} } from \"./${svg.iconName}\";\n`;\n\n\t\t\t\ticonTypeContent += `\t${svg.componentName},`;\n\n\t\t\t\texportContent += `export * from \"./${svg.iconName}\";\n`;\n\n\t\t\t\tif (idx + 1 < svgFiles.length) {\n\t\t\t\t\ticonTypeContent += \"\\n\";\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tfs.writeFileSync(\n\t\t\t\tpath.join(iconsPath, \"index.ts\"),\n\t\t\t\t`import type { DefineComponent } from \"vue\";\n${iconImportContent}\n${exportContent}\nexport default [\n${iconTypeContent}\n] as unknown as DefineComponent[];\n`\n\t\t\t);\n\t\t},\n\t};\n}\n\nexport { findSvgFile, writeTSXIcon, buildSvgIcon };\n","import fs from \"fs\";\nimport path from \"path\";\nimport externalGlobals from \"rollup-plugin-external-globals\";\nimport { viteExternalsPlugin } from \"vite-plugin-externals\";\nimport type { CdnImportOptions, Module } from \"./type\";\nimport type { HtmlTagDescriptor, Plugin, UserConfig } from \"vite\";\n\nconst isDev = process.env.NODE_ENV === \"development\";\n\n/**\n * get npm module version\n * @param name\n * @returns\n */\nfunction getModuleVersion(name: string): string {\n\tconst pwd = process.cwd();\n\tconst pkgFile = path.join(pwd, \"node_modules\", name, \"package.json\");\n\tif (fs.existsSync(pkgFile)) {\n\t\tconst pkgJson = JSON.parse(fs.readFileSync(pkgFile, \"utf8\"));\n\t\treturn pkgJson.version;\n\t}\n\n\treturn \"\";\n}\n\n/**\n * 是否完整的 url\n * @param path\n * @returns\n */\nfunction isFullPath(path: string): boolean {\n\treturn path.startsWith(\"http:\") || path.startsWith(\"https:\") || path.startsWith(\"//\") ? true : false;\n}\n\nfunction renderUrl(\n\turl: string,\n\tdata: {\n\t\tname: string;\n\t\tversion: string;\n\t\tpath: string;\n\t}\n): string {\n\tconst { path } = data;\n\tif (isFullPath(path)) {\n\t\turl = path;\n\t}\n\treturn url\n\t\t.replace(/\\{name\\}/g, data.name)\n\t\t.replace(/\\{version\\}/g, data.version)\n\t\t.replace(/\\{path\\}/g, path);\n}\n\nfunction getModuleInfo(module: Module, prodUrl: string): Module & { pathList?: string[]; cssList?: string[] } {\n\tprodUrl = module.prodUrl || prodUrl;\n\tconst v = module;\n\tconst version = module.version || getModuleVersion(v.name);\n\tlet pathList: string[] = [];\n\tif (!Array.isArray(v.path)) {\n\t\tpathList.push(v.path);\n\t} else {\n\t\tpathList = v.path;\n\t}\n\n\tconst data = {\n\t\t...v,\n\t\tversion,\n\t};\n\n\tpathList = pathList.map((p) => {\n\t\tif (!version && !isFullPath(p)) {\n\t\t\tthrow new Error(`modules: ${data.name} package.json file does not exist`);\n\t\t}\n\t\treturn renderUrl(prodUrl, {\n\t\t\tname: data.name,\n\t\t\tversion: data.version,\n\t\t\tpath: p,\n\t\t});\n\t});\n\n\tlet css = v.css || [];\n\tif (!Array.isArray(css) && css) {\n\t\tcss = [css];\n\t}\n\n\tconst cssList = !Array.isArray(css)\n\t\t? []\n\t\t: css.map((c) =>\n\t\t\t\trenderUrl(prodUrl, {\n\t\t\t\t\tname: data.name,\n\t\t\t\t\tversion: data.version,\n\t\t\t\t\tpath: c,\n\t\t\t\t})\n\t\t\t);\n\n\treturn {\n\t\t...v,\n\t\tversion,\n\t\tpathList,\n\t\tcssList,\n\t};\n}\n\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\tlet watcher: fs.FSWatcher | null = null;\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\twatcher = fs.watch(fullDir, { recursive: true }, (eventType, filename) => {\n\t\t\t\t\tif (!filename) return;\n\t\t\t\t\t// 忽略 .d.ts 文件\n\t\t\t\t\tif (filename.endsWith(\".d.ts\")) return;\n\n\t\t\t\t\t// 检查是否是组件文件\n\t\t\t\t\tconst ext = path.extname(filename).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\n\t\t\t\t\t// 通知客户端刷新\n\t\t\t\t\tserver.ws.send({ type: \"full-reload\", path: \"*\" });\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\tbuildEnd(): void | Promise<void> {\n\t\t\t// 关闭监听器\n\t\t\tif (watcher) {\n\t\t\t\twatcher.close();\n\t\t\t\twatcher = null;\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\tlet watcher: fs.FSWatcher | null = null;\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\twatcher = fs.watch(fullDir, { recursive: true }, (eventType, filename) => {\n\t\t\t\t\tif (!filename) return;\n\t\t\t\t\t// 忽略 . d.ts 文件和 JSON 文件\n\t\t\t\t\tif (filename.endsWith(\".d.ts\") || filename.endsWith(\".json\")) return;\n\n\t\t\t\t\t// 检查是否是组件文件\n\t\t\t\t\tconst ext = path.extname(filename).slice(1);\n\t\t\t\t\tif (!extensions.includes(ext)) return;\n\n\t\t\t\t\tgeneratePathNameMap();\n\n\t\t\t\t\t// 通知客户端刷新\n\t\t\t\t\tserver.ws.send({ type: \"full-reload\", path: \"*\" });\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\tbuildEnd(): void | Promise<void> {\n\t\t\t// 关闭监听器\n\t\t\tif (watcher) {\n\t\t\t\twatcher.close();\n\t\t\t\twatcher = null;\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,CAAC,EAAGY,IACvB,EAAE,SAAWA,EAAE,SACX,GAEJ,EAAE,SAAWA,EAAE,SACX,EAED,CACP,CACF,EAKMC,EAAe,CAACC,EAAuBC,EAAiBZ,IAA6B,CAC1FP,EAAG,UAAUmB,EAAS,CAAE,UAAW,EAAK,CAAC,EAEzC,IAAMC,EAAmB;AAAA;AAAA;AAAA,KAGrBF,CAAa;AAAA;AAAA,eAEHA,CAAa;AAAA,UAClBA,CAAa;AAAA;AAAA;AAAA,EAGrBX,EACA,MAAM;AAAA,CAAI,EACV,IAAKc,GAAS,MAAMA,CAAI,EAAE,EAC1B,KAAK;AAAA,CAAI,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,iBAKKH,CAAa;AAAA,EAG7BlB,EAAG,cAAcC,EAAK,KAAKkB,EAAS,WAAW,EAAGC,CAAgB,CACnE,EAOA,SAASE,GAAanB,EAAaoB,EAA0B,CAC5D,GAAI,CAACpB,GAAO,CAACoB,EAAU,OAEvB,IAAIC,EAEJ,MAAO,CACN,KAAM,kCACN,eAAiBC,GAAyD,CAEzED,EAASC,CACV,EACA,YAAmC,CAClC,IAAMC,EAAWxB,EAAYD,EAAK,QAAQuB,EAAO,KAAMrB,CAAG,CAAC,EAErDwB,EAAY1B,EAAK,QAAQuB,EAAO,KAAMD,CAAQ,EACpDvB,EAAG,UAAU2B,EAAW,CAAE,UAAW,EAAK,CAAC,EAE3C,IAAIC,EAAoB,GACpBC,EAAkB,GAClBC,EAAgB,GAEpBJ,EAAS,QAAQ,CAACK,EAAKC,IAAQ,CAC9Bf,EAAac,EAAI,cAAe9B,EAAK,KAAK0B,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,EAED7B,EAAG,cACFC,EAAK,KAAK0B,EAAW,UAAU,EAC/B;AAAA,EACFC,CAAiB;AAAA,EACjBE,CAAa;AAAA;AAAA,EAEbD,CAAe;AAAA;AAAA,CAGd,CACD,CACD,CACD,CC1JA,OAAOI,MAAQ,KACf,OAAOC,MAAU,OACjB,OAAOC,MAAqB,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,uBACV,KAAAC,EAAO,GACP,WAAAC,EAAa,CAAC,MAAO,MAAO,KAAK,EACjC,UAAAC,CACD,EAAIP,EAEAQ,EACEC,EAAe,IAAI,IASrBC,EAA+B,KAG7BC,EAAmBC,GAA6B,CAErD,IAAIC,EAAOD,EACX,QAAWE,KAAOR,EACjB,GAAIO,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,OAAIR,EACIA,EAAUM,CAAI,EAEdlB,EAAWkB,CAAI,CAExB,EAGMG,EAAgB,CAACC,EAAiBC,EAAQ,IAAgB,CAC/D,IAAMC,EAAkB,CAAC,EAEzB,GAAI,CAAC3B,EAAG,WAAWyB,CAAO,EACzB,OAAOE,EAGR,IAAMC,EAAU5B,EAAG,YAAYyB,EAAS,CAAE,cAAe,EAAK,CAAC,EAE/D,QAAWI,KAASD,EAAS,CAC5B,IAAME,EAAW7B,EAAK,KAAKwB,EAASI,EAAM,IAAI,EAE9C,GAAIA,EAAM,YAAY,EAAG,CAExB,GAAIA,EAAM,OAAS,gBAAkBA,EAAM,KAAK,WAAW,IAAI,EAC9D,UAIGhB,GAAQa,IAAU,IACrBC,EAAM,KAAK,GAAGH,EAAcM,EAAUJ,EAAQ,CAAC,CAAC,CAElD,SAAWG,EAAM,OAAO,EAAG,CAE1B,IAAMP,EAAMrB,EAAK,QAAQ4B,EAAM,IAAI,EAAE,MAAM,CAAC,EACxCf,EAAW,SAASQ,CAAG,GAC1BK,EAAM,KAAKG,CAAQ,CAErB,CACD,CAEA,OAAOH,CACR,EAGMI,EAAiB,IAAY,CAClCd,EAAa,MAAM,EAEnB,IAAMe,EAAU/B,EAAK,QAAQe,EAAO,KAAMP,CAAG,EAE7C,GAAI,CAACT,EAAG,WAAWgC,CAAO,EAAG,CAC5B,QAAQ,KAAK,gDAAgDA,CAAO,EAAE,EACtE,MACD,CAEcR,EAAcQ,CAAO,EAE7B,QAASC,GAAiB,CAC/B,IAAMC,EAAejC,EAAK,SAAS+B,EAASC,CAAY,EAClDE,EAAgBhB,EAAgBe,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,EAAG,IAAMA,EAAE,KAAK,cAAc,EAAE,IAAI,CAAC,EAE1FC,EAAmBtC,EAAK,QAAQe,EAAO,KAAMN,CAAU,EACvD8B,EAAevC,EAAK,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,EAGbJ,EAAW,QAAQ,CAAC,CAAE,KAAAhB,EAAM,KAAAqB,CAAK,IAAM,CACtC,IAAMR,EAAehC,EAAMD,EAAK,SAASuC,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,EAAe7C,EAAG,WAAWuC,CAAgB,EAAIvC,EAAG,aAAauC,EAAkB,OAAO,EAAI,GAEhGK,IAASC,GACZ7C,EAAG,cAAcuC,EAAkBK,EAAM,OAAO,CAElD,EAGME,EAAc,IAAY,CAC/B,GAAI,CAACnC,GAAOM,EAAa,OAAS,EAAG,OAErC,IAAMoB,EAAa,MAAM,KAAKpB,EAAa,OAAO,CAAC,EAAE,KAAK,CAACqB,EAAG,IAAMA,EAAE,KAAK,cAAc,EAAE,IAAI,CAAC,EAE1FS,EAAc9C,EAAK,QAAQe,EAAO,KAAMJ,CAAO,EAC/CoC,EAAS/C,EAAK,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,EAEjDJ,EAAW,QAAQ,CAAC,CAAE,KAAAhB,EAAM,KAAAqB,CAAK,IAAM,CAEtC,IAAIR,EAAehC,EAAMD,EAAK,SAAS+C,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,EAG3BzC,EAAG,WAAWgD,CAAM,GACxBhD,EAAG,UAAUgD,EAAQ,CAAE,UAAW,EAAK,CAAC,EAIzC,IAAMH,EAAe7C,EAAG,WAAW+C,CAAW,EAAI/C,EAAG,aAAa+C,EAAa,OAAO,EAAI,GAEtFH,IAASC,GACZ7C,EAAG,cAAc+C,EAAaH,EAAM,OAAO,CAE7C,EAEA,MAAO,CACN,KAAM,yCACN,QAAS,OACT,eAAiBK,GAAyD,CAEzEjC,EAASiC,CACV,EACA,YAAmC,CAClClB,EAAe,EACfK,EAAqB,EACrBU,EAAY,CACb,EAEA,gBAAgBI,EAAuB,CACtC,IAAMlB,EAAU/B,EAAK,QAAQe,EAAO,KAAMP,CAAG,EAGzCT,EAAG,WAAWgC,CAAO,IACxBd,EAAUlB,EAAG,MAAMgC,EAAS,CAAE,UAAW,EAAK,EAAG,CAACmB,EAAWC,IAAa,CAGzE,GAFI,CAACA,GAEDA,EAAS,SAAS,OAAO,EAAG,OAGhC,IAAM9B,EAAMrB,EAAK,QAAQmD,CAAQ,EAAE,MAAM,CAAC,EACrCtC,EAAW,SAASQ,CAAG,IAE5BS,EAAe,EACfK,EAAqB,EACrBU,EAAY,EAGZI,EAAO,GAAG,KAAK,CAAE,KAAM,cAAe,KAAM,GAAI,CAAC,EAClD,CAAC,EAEH,EACA,UAAiC,CAE5BhC,IACHA,EAAQ,MAAM,EACdA,EAAU,KAEZ,CACD,CACD,CCxRA,OAAOmC,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,EACAC,EAA+B,KAG7BC,EAAc,CAACC,EAAiBC,EAAqB,CAAC,KACtDrB,EAAG,WAAWoB,CAAO,GAIZpB,EAAG,YAAYoB,CAAO,EAC9B,QAASE,GAAS,CACvB,IAAMC,EAAWtB,EAAK,KAAKmB,EAASE,CAAI,EAGxC,GAFatB,EAAG,SAASuB,CAAQ,EAExB,YAAY,EAChBT,GACHK,EAAYI,EAAUF,CAAQ,MAEzB,CACN,IAAMG,EAAMvB,EAAK,QAAQsB,CAAQ,EAAE,MAAM,CAAC,EACtCR,EAAW,SAASS,CAAG,GAC1BH,EAAS,KAAKE,CAAQ,CAExB,CACD,CAAC,EAEMF,GAIFI,EAAsB,IAAY,CACvC,IAAMC,EAAYzB,EAAK,QAAQgB,EAAO,KAAML,CAAG,EAGzCe,EAFQR,EAAYO,CAAS,EAEe,OAAO,CAACE,EAAKL,IAAa,CAC3E,GAAI,CACH,IAAMM,EAAU7B,EAAG,aAAauB,EAAU,OAAO,EAC3CO,EAAgBxB,EAAqBuB,CAAO,EAG5CE,EAAe,IAAI9B,EAAK,SAASgB,EAAO,KAAMM,CAAQ,EAAE,QAAQ,MAAO,GAAG,CAAC,GAG7ES,EACJ,GAAIF,EACHE,EAAYF,MACN,CACN,IAAMG,EAAWhC,EAAK,SAASsB,EAAUtB,EAAK,QAAQsB,CAAQ,CAAC,EAC/DS,EAAYhB,EAAYA,EAAUiB,CAAQ,EAAI/B,EAAW+B,CAAQ,CAClE,CAEAL,EAAIG,CAAY,EAAIC,CACrB,OAASE,EAAO,CACf,QAAQ,MAAM,yBAAyBX,CAAQ,IAAKW,CAAK,CAC1D,CACA,OAAON,CACR,EAAG,CAAC,CAAC,EAGCO,EAAalC,EAAK,QAAQgB,EAAO,KAAMJ,CAAU,EACjDuB,EAAYnC,EAAK,QAAQkC,CAAU,EAGpCnC,EAAG,WAAWoC,CAAS,GAC3BpC,EAAG,UAAUoC,EAAW,CAAE,UAAW,EAAK,CAAC,EAG5C,IAAMC,EAAgB,KAAK,UAAUV,EAAa,KAAM,CAAC,EACzD3B,EAAG,cAAcmC,EAAYE,EAAe,OAAO,CACpD,EAEA,MAAO,CACN,KAAM,+BACN,QAAS,OACT,eAAiBC,GAAyD,CAEzErB,EAASqB,CACV,EACA,YAAmC,CAClCb,EAAoB,CACrB,EAEA,gBAAgBc,EAAuB,CACtC,IAAMC,EAAUvC,EAAK,QAAQgB,EAAO,KAAML,CAAG,EAGzCZ,EAAG,WAAWwC,CAAO,IACxBtB,EAAUlB,EAAG,MAAMwC,EAAS,CAAE,UAAW,EAAK,EAAG,CAACC,EAAWC,IAAa,CAGzE,GAFI,CAACA,GAEDA,EAAS,SAAS,OAAO,GAAKA,EAAS,SAAS,OAAO,EAAG,OAG9D,IAAMlB,EAAMvB,EAAK,QAAQyC,CAAQ,EAAE,MAAM,CAAC,EACrC3B,EAAW,SAASS,CAAG,IAE5BC,EAAoB,EAGpBc,EAAO,GAAG,KAAK,CAAE,KAAM,cAAe,KAAM,GAAI,CAAC,EAClD,CAAC,EAEH,EACA,UAAiC,CAE5BrB,IACHA,EAAQ,MAAM,EACdA,EAAU,KAEZ,CACD,CACD,CC5IA,OAAOyB,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","b","writeTSXIcon","componentName","iconDir","componentContent","line","buildSvgIcon","writeDir","config","resolvedConfig","svgFiles","iconsPath","iconImportContent","iconTypeContent","exportContent","svg","idx","fs","path","externalGlobals","viteExternalsPlugin","isDev","getModuleVersion","name","pwd","pkgFile","isFullPath","renderUrl","url","data","getModuleInfo","module","prodUrl","v","version","pathList","p","css","cssList","c","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","watcher","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","eventType","filename","fs","path","pascalCase","str","_","c","extractComponentName","fileContent","defineOptionsRegex","defineOptionsMatch","buildRouterPath","options","dir","exportPath","deep","extensions","formatter","config","watcher","getAllFiles","dirPath","fileList","file","filePath","ext","generatePathNameMap","targetDir","pathNameMap","acc","content","componentName","relativePath","finalName","fileName","error","outputPath","outputDir","outputContent","resolvedConfig","server","fullDir","eventType","filename","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":"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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"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "fast-vite-plugins",
3
- "version": "1.0.18",
3
+ "version": "1.0.20",
4
4
  "description": "Fast Vite插件库.",
5
5
  "type": "module",
6
6
  "keywords": [