read-modify-write
Version:
Node module for reading, modifying and writing files recursively
43 lines (41 loc) • 1.44 kB
JavaScript
const fs = require('fs');
const path = require('path');
const walkSync = (ref, filter) => {
const list = item => walkSync(path.join(ref, item), filter);
if(fs.statSync(ref).isDirectory()) {
return fs.readdirSync(ref).flatMap(list);
}
if(typeof filter !== 'function' || filter(ref)) {
return [ref];
}
return [];
};
const copy = function(ref) {
const { src, move, modify } = this;
const read = () => fs.readFileSync(ref, 'utf8');
if(!move) {
return { content: modify ? modify(read()) : read() };
}
const target = move(ref);
const writeContent = content => {
fs.writeFileSync(target, content, 'utf8');
return { target, content };
};
fs.mkdirSync(path.dirname(target), { recursive: true });
if (modify) {
const content = modify(read());
if (content instanceof Promise) {
return content.then(writeContent);
}
fs.writeFileSync(target, content, 'utf8');
return writeContent(content);
}
fs.copyFileSync(ref, target);
return { target };
};
module.exports = (src, move, filter, modify) => {
const keys = walkSync(path.join(__dirname.split('node_modules')[0], src), filter);
const values = keys.map(copy, { modify, src, move });
const assign = (key, idx) => [key, values[idx]];
return Object.fromEntries(keys.map(assign));
};