A simple Rollup plugin to copy files to the build directory

A friend asked me today what is a simple way to copy files from a directory (in their case, extract some images from a node module) to the build directory, using Rollup.

My solution is to create a simple plugin like this:

import path from "path"
import fs from "fs"

function copyFiles(from, to, overwrite = false) {
	return {
		name: 'copy-files',
		generateBundle() {
			const log = msg => console.log('\x1b[36m%s\x1b[0m', msg)
			log(`copy files: ${from} → ${to}`)
			fs.readdirSync(from).forEach(file => {
				const fromFile = `${from}/${file}`
				const toFile = `${to}/${file}`
				if (fs.existsSync(toFile) && !overwrite)
					return
				log(`• ${fromFile} → ${toFile}`)
				fs.copyFileSync(
					path.resolve(fromFile),
					path.resolve(toFile)
				)
			})
		}
	}
}

You can then use it as other plugins:

plugins: [
		//...
		copyFiles("./node_modules/leaflet/dist/images", "./public/build"),
		//...
]

No need for 3rd party dependencies, just a simple function that doesn't do anything fancy!