Skip to content
Snippets Groups Projects
copy_plugin.js 1001 B
import serveStatic from 'serve-static'
import { resolve } from 'node:path'
import { cp } from 'node:fs/promises'

const getPrefix = s => {
  const padEnd = s.endsWith('/') ? s : s + '/'
  return padEnd.startsWith('/') ? padEnd : '/' + padEnd
}

const copyPlugin = ({ inUrl, inFs }) => {
  const prefix = getPrefix(inUrl)
  const subdir = prefix.slice(1)
  let copyTarget
  const handler = serveStatic(inFs)

  return [{
    name: 'copy-plugin-serve',
    apply: 'serve',
    configureServer (server) {
      server.middlewares.use(prefix, handler)
    }
  }, {
    name: 'copy-plugin-build',
    apply: 'build',
    configResolved (config) {
      copyTarget = resolve(config.root, config.build.outDir, subdir)
    },
    closeBundle: {
      order: 'post',
      sequential: true,
      async handler () {
        console.log(`Copying '${inFs}' to ${copyTarget}...`)
        await cp(inFs, copyTarget, { recursive: true })
        console.log('Done.')
      }
    }
  }]
}

export default copyPlugin