UNPKG

@tsbb/core

Version:

TSBB is a zero-config CLI that helps you develop, test, and publish modern TypeScript project.

69 lines (68 loc) 2.91 kB
import chokidar from 'chokidar'; import path from 'node:path'; import fs from 'fs-extra'; import { Log } from '@tsbb/typescript'; /** * Used to monitor file changes and copy related files, such as: xx.jpg * @param entry ['/path/to/main.ts', '/path/to/demo/'] * @param options */ export const watcherCopyFiles = (entry = [], options = {}) => { const { rootDirsRelative, outputDir, currentDir } = options; const log = new Log(); log.name(); return new Promise((resolve, reject) => { const watcher = chokidar.watch(entry, { persistent: true, }); watcher.on('all', async (eventName, filepath, stats) => { if (/\.(test|spec)\.(js|jsx|ts|tsx)$/i.test(filepath) || /[/\\]tsconfig\.json$/i.test(filepath)) { return; } if (!/\.(m?js|jsx?|m?ts|tsx?|c?js)$/i.test(filepath) && rootDirsRelative && rootDirsRelative.length > 0 && currentDir && outputDir) { let outputPath = ''; if (rootDirsRelative.length > 1) { rootDirsRelative.forEach((item) => { const itemResolve = path.resolve(currentDir, item); if (filepath.indexOf(itemResolve) > -1) { outputPath = path.resolve(outputDir, item, path.relative(itemResolve, filepath)); } }); } else { const itemResolve = path.resolve(currentDir, rootDirsRelative[0]); if (filepath.indexOf(itemResolve) > -1) { outputPath = path.resolve(outputDir, path.relative(itemResolve, filepath)); } } if (outputPath && filepath) { if (/^(add|change)$/.test(eventName)) { fs.ensureDirSync(path.dirname(outputPath)); fs.copyFile(filepath, outputPath); log.icon('🐶').success(`┈┈▶ \x1b[32;1m${path.relative(currentDir, outputPath)}\x1b[0m`); } if (/^(unlink|unlinkDir)$/.test(eventName)) { fs.remove(filepath); log.icon('🗑️').success(`┈┈▶ \x1b[32;1m${path.relative(currentDir, outputPath)}\x1b[0m`); } } } options.onFilesChange && options.onFilesChange(eventName, filepath, stats); }); watcher.on('error', (error) => { options.onError && options.onError(error); reject(error); }); watcher.on('ready', () => { options.onReady && options.onReady(); if (!options.isWatch) { watcher.close(); } resolve(); }); }); };