@polyfill-io-aot/builder
Version:
This is the builder module for polyfill-io-aot.
67 lines • 2.66 kB
JavaScript
;
const Bluebird = require("bluebird");
const fs = require("fs-extra");
const path_1 = require("path");
const CopyPath_1 = require("../CopyPath");
const Executor_1 = require("../Executor");
const BuildEvent_1 = require("../interfaces/BuildEvent");
const symbols_1 = require("../symbols");
/** @internal */
class FormatSourceDirsExecutor extends Executor_1.Executor {
execute() {
this.emit(BuildEvent_1.BuildEvent.FORMAT_DIRS_BEGIN);
this._ora.start('Formatting source directory paths');
const out = [];
const extraCopies$ = [];
Bluebird
.reduce(this.conf.dirs, (acc, dir) => this.createReducer(dir, extraCopies$)(acc, dir), out)
.then(() => {
this._ora.succeed('Source directories formatted');
this.builder[symbols_1.COPY_DIRS] = out;
this.builder[symbols_1.COPY_FILES] = extraCopies$;
this.emit(BuildEvent_1.BuildEvent.FORMAT_DIRS_OK);
}, (e) => {
this._ora.fail(`Failed formatting source dirs: ${this.formatError(e)}`);
this.onError(e);
});
}
createReducer(root, extraCopies$) {
const reducer = async (acc, dir) => {
try {
dir = path_1.resolve(dir);
this.emit(BuildEvent_1.BuildEvent.FORMAT_DIR_BEGIN, dir);
let hasSubdirs = false;
const entries = (await fs.readdir(dir))
.map((p) => path_1.join(dir, p));
const stats = {};
for (const entry of entries) {
const stat = await fs.stat(entry);
stats[entry] = stat;
if (stat.isDirectory()) {
hasSubdirs = true;
await reducer(acc, entry);
}
}
if (hasSubdirs) {
for (const entry of entries) {
if (stats[entry].isFile()) {
extraCopies$.push(new CopyPath_1.CopyPath(entry, root));
}
}
}
else {
acc.push(new CopyPath_1.CopyPath(dir, root));
}
this.emit(BuildEvent_1.BuildEvent.FORMAT_DIR_OK, dir);
this._ora.text = `Formatted ${dir}`;
return acc;
}
catch (e) {
this.emit(BuildEvent_1.BuildEvent.FORMAT_DIR_ERR, dir, e);
}
};
return reducer;
}
}
module.exports = FormatSourceDirsExecutor;
//# sourceMappingURL=FormatSourceDirsExecutor.js.map