/* eslint-disable import/no-extraneous-dependencies */ import { async as glob } from "fast-glob"; import fs from "fs"; import path from "path"; interface CopyOption { cwd?: string; rename?: (basename: string) => string; parents?: boolean; } const identity = (x: string) => x; export const copy = async ( src: string | string[], dest: string, { cwd, rename = identity, parents = true }: CopyOption = {}, ) => { const source = typeof src === "string" ? [src] : src; if (source.length === 0 || !dest) { throw new TypeError("`src` and `dest` are required"); } const sourceFiles = await glob(source, { cwd, dot: true, absolute: false, stats: false, }); const destRelativeToCwd = cwd ? path.resolve(cwd, dest) : dest; return Promise.all( sourceFiles.map(async (p) => { const dirname = path.dirname(p); const basename = rename(path.basename(p)); const from = cwd ? path.resolve(cwd, p) : p; const to = parents ? path.join(destRelativeToCwd, dirname, basename) : path.join(destRelativeToCwd, basename); // Ensure the destination directory exists await fs.promises.mkdir(path.dirname(to), { recursive: true }); return fs.promises.copyFile(from, to); }), ); }; export const assetRelocator = (name: string) => { switch (name) { case "gitignore": case "npmrc": case "eslintrc.json": { return `.${name}`; } // README.md is ignored by webpack-asset-relocator-loader used by ncc: // https://github.com/vercel/webpack-asset-relocator-loader/blob/e9308683d47ff507253e37c9bcbb99474603192b/src/asset-relocator.js#L227 case "README-template.md": { return "README.md"; } default: { return name; } } };