sb-babel-cli
Version:
A smarter babel-cli
85 lines (84 loc) • 3.48 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const fs_1 = __importDefault(require("fs"));
const del_1 = __importDefault(require("del"));
const path_1 = __importDefault(require("path"));
const p_map_1 = __importDefault(require("p-map"));
const make_dir_1 = __importDefault(require("make-dir"));
const anymatch_1 = __importDefault(require("anymatch"));
const helpers_1 = require("./helpers");
async function iterate({ config, callback, getOutputFilePath, }) {
const contents = await fs_1.default.promises.readdir(config.sourceDirectory);
let outputStats = null;
let outputDirectoryExists = false;
try {
outputStats = await fs_1.default.promises.stat(config.outputDirectory);
}
catch (_) {
/* No Op */
}
if (outputStats) {
if (outputStats.isDirectory()) {
outputDirectoryExists = true;
}
else {
await del_1.default(config.outputDirectory);
outputStats = null;
}
}
const outputContents = outputStats ? await fs_1.default.promises.readdir(config.outputDirectory) : [];
if (!config.keepExtraFiles) {
let whitelist = contents.map(getOutputFilePath);
if (config.sourceMaps === true) {
whitelist = whitelist.concat(whitelist.map((item) => `${item}.map`));
}
const filesToDelete = outputContents
.filter((item) => !whitelist.includes(item))
.map((item) => path_1.default.resolve(config.outputDirectory, item));
await Promise.all(filesToDelete.map((item) => del_1.default(item)));
}
await p_map_1.default(contents, async function (itemName) {
const filePath = path_1.default.join(config.sourceDirectory, itemName);
const stats = await fs_1.default.promises.lstat(filePath);
if (stats.isSymbolicLink()) {
// NOTE: We ignore symlinks
return;
}
if (config.ignored &&
(anymatch_1.default(config.ignored, itemName) ||
anymatch_1.default(config.ignored, helpers_1.posixifyPath(filePath)) ||
anymatch_1.default(config.ignored, helpers_1.posixifyPath(path_1.default.relative(config.rootDirectory, filePath))))
// TODO: Convert above to posix
) {
// NOTE: We ignore ignored files
return;
}
if (stats.isFile()) {
const foundExt = config.extensions.find((ext) => itemName.endsWith(ext));
if (!foundExt) {
return;
}
if (!outputDirectoryExists) {
await make_dir_1.default(config.outputDirectory);
outputDirectoryExists = true;
}
const outputFile = getOutputFilePath(path_1.default.join(config.outputDirectory, itemName));
await callback(filePath, outputFile, stats);
}
else if (stats.isDirectory()) {
await iterate({
config: {
...config,
sourceDirectory: path_1.default.join(config.sourceDirectory, itemName),
outputDirectory: path_1.default.join(config.outputDirectory, itemName),
},
getOutputFilePath,
callback,
});
}
});
}
exports.default = iterate;