/*
 * @FilePath     : /public/js/zip.js
 * @Description  :
 */
/*
 * @Author: suhang suhang_max@163.com
 * @Date: 2023-06-01 00:14:29
 * @LastEditors: suhang suhang_max@163.com
 * @LastEditTime: 2023-06-01 10:56:19
 * @FilePath: \train-assessd:\Code\basic-frontend\zip.js
 * @Description: 将打包后的文件夹自动压缩成zip
 */
// console.log(import.meta, 'import.meta.env.VITE_APP_GISURL')
import path from 'path'
import fs from 'fs'
import JSZip from 'jszip'
const plugin = (fileName = 'pms-front', output) => {
  // if (!output) output = path.resolve(__dirname, `../..${import.meta.env.VITE_BASE_URL}`)
  output = path.resolve(__dirname, `../..${output}`)
  fileName += '.zip'
  const makeZip = () => {
    const zip = new JSZip()
    const distPath = path.resolve(output)
    const readDir = (zip, dirPath) => {
      // 读取dist下的根文件目录
      const files = fs.readdirSync(dirPath)
      files.forEach(fileName => {
        const fillPath = path.join(dirPath, './', fileName)
        const file = fs.statSync(fillPath)
        // 如果是文件夹的话需要递归遍历下面的子文件
        if (file.isDirectory()) {
          const dirZip = zip.folder(fileName)
          readDir(dirZip, fillPath)
        } else {
          // 读取每个文件为buffer存到zip中
          zip.file(fileName, fs.readFileSync(fillPath))
        }
      })
    }
    const removeExistedZip = () => {
      const dest = path.join(distPath, './' + fileName)
      if (fs.existsSync(dest)) {
        fs.unlinkSync(dest)
      }
    }
    const zipDir = () => {
      readDir(zip, distPath)
      zip
        .generateAsync({
          type: 'nodebuffer', // 压缩类型
          compression: 'DEFLATE', // 压缩算法
          compressionOptions: {
            // 压缩级别
            level: 9,
          },
        })
        .then(content => {
          const dest = path.join(distPath, '../' + fileName)
          removeExistedZip()
          // 把zip包写到硬盘中，这个content现在是一段buffer
          fs.writeFileSync(dest, content)
        })
    }
    removeExistedZip()
    zipDir(distPath)
  }
  return {
    name: 'vite-plugin-auto-zip',
    apply: 'build',
    closeBundle() {
      makeZip()
    },
  }
}
export default plugin
