import { readdir, stat } from 'fs'; 
 | 
import type { Plugin } from 'vite'; 
 | 
  
 | 
import { sum } from 'lodash'; 
 | 
  
 | 
import picocolors from 'picocolors'; 
 | 
const { green, blue, bold } = picocolors; 
 | 
  
 | 
import dayjs, { Dayjs } from 'dayjs'; 
 | 
import duration from 'dayjs/plugin/duration.js'; 
 | 
import pkg from '../package.json'; 
 | 
  
 | 
dayjs.extend(duration); 
 | 
  
 | 
const staticPath = 'dist'; 
 | 
const fileListTotal: number[] = []; 
 | 
  
 | 
const recursiveDirectory = (folder: string, callback: Function): void => { 
 | 
  readdir(folder, (err, files: string[]) => { 
 | 
    if (err) throw err; 
 | 
    let count = 0; 
 | 
    const checkEnd = () => { 
 | 
      ++count === files.length && callback(); 
 | 
    }; 
 | 
    files.forEach((item: string) => { 
 | 
      stat(folder + '/' + item, (err, stats) => { 
 | 
        if (err) throw err; 
 | 
        if (stats.isFile()) { 
 | 
          fileListTotal.push(stats.size); 
 | 
          checkEnd(); 
 | 
        } else if (stats.isDirectory()) { 
 | 
          recursiveDirectory(`${folder}/${item}/`, checkEnd); 
 | 
        } 
 | 
      }); 
 | 
    }); 
 | 
    files.length === 0 && callback(); 
 | 
  }); 
 | 
}; 
 | 
  
 | 
const formatBytes = (a: number, b?: number): string => { 
 | 
  if (0 === a) return '0 Bytes'; 
 | 
  const c = 1024, 
 | 
    d = b || 2, 
 | 
    e = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'], 
 | 
    f = Math.floor(Math.log(a) / Math.log(c)); 
 | 
  return parseFloat((a / Math.pow(c, f)).toFixed(d)) + ' ' + e[f]; 
 | 
}; 
 | 
  
 | 
export function viteBuildInfo(): Plugin { 
 | 
  let config: { command: string }; 
 | 
  let startTime: Dayjs; 
 | 
  let endTime: Dayjs; 
 | 
  
 | 
  return { 
 | 
    name: 'vite:buildInfo', 
 | 
    configResolved(resolvedConfig: { command: string }) { 
 | 
      config = resolvedConfig; 
 | 
    }, 
 | 
    buildStart() { 
 | 
      if (config.command === 'build') { 
 | 
        startTime = dayjs(new Date()); 
 | 
      } 
 | 
    }, 
 | 
    closeBundle() { 
 | 
      if (config.command === 'build') { 
 | 
        console.log(bold(green(`👏欢迎使用${blue(pkg.name)}`))); 
 | 
        endTime = dayjs(new Date()); 
 | 
        recursiveDirectory(staticPath, () => { 
 | 
          console.log( 
 | 
            bold( 
 | 
              green( 
 | 
                `恭喜打包完成🎉(总用时${dayjs 
 | 
                  .duration(endTime.diff(startTime)) 
 | 
                  .format('mm分ss秒')},打包后的大小为${formatBytes( 
 | 
                  sum(fileListTotal) 
 | 
                )}); 请确认.env文件的 VITE_PROXY_DOMAIN_REAL和VITE_OSS_URL` 
 | 
              ) 
 | 
            ) 
 | 
          ); 
 | 
        }); 
 | 
      } 
 | 
    }, 
 | 
  }; 
 | 
} 
 |