@nestjs/cli
Version:
Nest - modern, fast, powerful node.js web framework (@cli)
104 lines (103 loc) • 4.52 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
exports.AssetsManager = void 0;
const chokidar = require("chokidar");
const path_1 = require("path");
const shell = require("shelljs");
const copy_path_resolve_1 = require("./helpers/copy-path-resolve");
const get_value_or_default_1 = require("./helpers/get-value-or-default");
class AssetsManager {
constructor() {
this.watchAssetsKeyValue = {};
this.watchers = [];
this.actionInProgress = false;
}
/**
* Using on `nest build` to close file watch or the build process will not end
* Interval like process
* If no action has been taken recently close watchers
* If action has been taken recently flag and try again
*/
closeWatchers() {
// Consider adjusting this for larger files
const timeoutMs = 500;
const closeFn = () => {
if (this.actionInProgress) {
this.actionInProgress = false;
setTimeout(closeFn, timeoutMs);
}
else {
this.watchers.forEach((watcher) => watcher.close());
}
};
setTimeout(closeFn, timeoutMs);
}
copyAssets(configuration, appName, outDir, watchAssetsMode) {
const assets = (0, get_value_or_default_1.getValueOrDefault)(configuration, 'compilerOptions.assets', appName) || [];
if (assets.length <= 0) {
return;
}
try {
let sourceRoot = (0, get_value_or_default_1.getValueOrDefault)(configuration, 'sourceRoot', appName);
sourceRoot = (0, path_1.join)(process.cwd(), sourceRoot);
const filesToCopy = assets.map((item) => {
if (typeof item === 'string') {
return {
glob: (0, path_1.join)(sourceRoot, item),
outDir,
};
}
return {
outDir: item.outDir || outDir,
glob: (0, path_1.join)(sourceRoot, item.include),
exclude: item.exclude ? (0, path_1.join)(sourceRoot, item.exclude) : undefined,
flat: item.flat,
watchAssets: item.watchAssets,
};
});
const isWatchEnabled = (0, get_value_or_default_1.getValueOrDefault)(configuration, 'compilerOptions.watchAssets', appName) || watchAssetsMode;
for (const item of filesToCopy) {
const option = {
action: 'change',
item,
path: '',
sourceRoot,
watchAssetsMode: isWatchEnabled,
};
// prettier-ignore
const watcher = chokidar
.watch(item.glob, { ignored: item.exclude })
.on('add', (path) => this.actionOnFile(Object.assign(Object.assign({}, option), { path, action: 'change' })))
.on('change', (path) => this.actionOnFile(Object.assign(Object.assign({}, option), { path, action: 'change' })))
.on('unlink', (path) => this.actionOnFile(Object.assign(Object.assign({}, option), { path, action: 'unlink' })));
this.watchers.push(watcher);
}
}
catch (err) {
throw new Error(`An error occurred during the assets copying process. ${err.message}`);
}
}
actionOnFile(option) {
const { action, item, path, sourceRoot, watchAssetsMode } = option;
const isWatchEnabled = watchAssetsMode || item.watchAssets;
// Allow to do action for the first time before check watchMode
if (!isWatchEnabled && this.watchAssetsKeyValue[path]) {
return;
}
// Set path value to true for watching the first time
this.watchAssetsKeyValue[path] = true;
// Set action to true to avoid watches getting cutoff
this.actionInProgress = true;
const dest = (0, copy_path_resolve_1.copyPathResolve)(path, item.outDir, sourceRoot.split(path_1.sep).length);
// Copy to output dir if file is changed or added
if (action === 'change') {
shell.mkdir('-p', (0, path_1.dirname)(dest));
shell.cp(path, dest);
}
else if (action === 'unlink') {
// Remove from output dir if file is deleted
shell.rm(dest);
}
}
}
exports.AssetsManager = AssetsManager;
;