@angular/build
Version:
Official build system for Angular
119 lines (118 loc) • 3.68 kB
JavaScript
;
/**
* @license
* Copyright Google LLC All Rights Reserved.
*
* Use of this source code is governed by an MIT-style license that can be
* found in the LICENSE file at https://angular.dev/license
*/
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.ChangedFiles = void 0;
exports.createWatcher = createWatcher;
const watchpack_1 = __importDefault(require("watchpack"));
class ChangedFiles {
added = new Set();
modified = new Set();
removed = new Set();
get all() {
return [...this.added, ...this.modified, ...this.removed];
}
toDebugString() {
const content = {
added: Array.from(this.added),
modified: Array.from(this.modified),
removed: Array.from(this.removed),
};
return JSON.stringify(content, null, 2);
}
}
exports.ChangedFiles = ChangedFiles;
function createWatcher(options) {
const watcher = new watchpack_1.default({
poll: options?.polling ? options?.interval ?? true : false,
ignored: options?.ignored,
followSymlinks: options?.followSymlinks,
aggregateTimeout: 250,
});
const watchedFiles = new Set();
const nextQueue = [];
let currentChangedFiles;
watcher.on('aggregated', (changes, removals) => {
const changedFiles = currentChangedFiles ?? new ChangedFiles();
for (const file of changes) {
changedFiles.modified.add(file);
}
for (const file of removals) {
changedFiles.removed.add(file);
}
const next = nextQueue.shift();
if (next) {
currentChangedFiles = undefined;
next(changedFiles);
}
else {
currentChangedFiles = changedFiles;
}
});
return {
[Symbol.asyncIterator]() {
return this;
},
async next() {
if (currentChangedFiles && nextQueue.length === 0) {
const result = { value: currentChangedFiles };
currentChangedFiles = undefined;
return result;
}
return new Promise((resolve) => {
nextQueue.push((value) => resolve(value ? { value } : { done: true, value }));
});
},
add(paths) {
const previousSize = watchedFiles.size;
if (typeof paths === 'string') {
watchedFiles.add(paths);
}
else {
for (const file of paths) {
watchedFiles.add(file);
}
}
if (previousSize !== watchedFiles.size) {
watcher.watch({
files: watchedFiles,
});
}
},
remove(paths) {
const previousSize = watchedFiles.size;
if (typeof paths === 'string') {
watchedFiles.delete(paths);
}
else {
for (const file of paths) {
watchedFiles.delete(file);
}
}
if (previousSize !== watchedFiles.size) {
watcher.watch({
files: watchedFiles,
});
}
},
async close() {
try {
watcher.close();
}
finally {
let next;
while ((next = nextQueue.shift()) !== undefined) {
next();
}
}
},
};
}