You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

92 lines
1.9 KiB

'use strict';
const path = require('path');
const fs = require('fs');
function getAllFiles(root) {
var res = [],
files = fs.readdirSync(root);
files.forEach(function (file) {
var pathname = root + '/' + file,
stat = fs.lstatSync(pathname);
if (!stat.isDirectory()) {
res.push(pathname);
} else {
res = res.concat(getAllFiles(pathname));
}
});
return res
}
function replace(file, rules) {
const src = path.resolve(file);
let template = fs.readFileSync(src, 'utf8');
template = rules.reduce(
(template, rule) => template.replace(
rule.search, (typeof rule.replace === 'string' ? rule.replace : rule.replace.bind(global))
),
template
);
fs.writeFileSync(src, template);
}
function ReplaceInFilePlugin(options = []) {
this.options = options;
};
ReplaceInFilePlugin.prototype.apply = function (compiler) {
const root = compiler.options.context;
const done = (statsData) => {
if (statsData.hasErrors()) {
return
}
this.options.forEach(option => {
const dir = option.dir || root;
const files = option.files;
if(option.files){
const files = option.files;
if(Array.isArray(files) && files.length) {
files.forEach(file => {
replace(path.resolve(dir, file), option.rules);
})
}
} else if (option.test) {
const test = option.test;
const testArray = Array.isArray(test) ? test : [test];
const files = getAllFiles(dir);
files.forEach(file => {
const match = testArray.some((test, index, array) => {
return test.test(file);
})
if (!match) {
return;
}
replace(file, option.rules);
})
} else {
const files = getAllFiles(dir);
files.forEach(file => {
replace(file, option.rules);
})
}
})
}
if (compiler.hooks) {
const plugin = {
name: "ReplaceInFilePlugin"
};
compiler.hooks.done.tap(plugin, done);
} else {
compiler.plugin('done', done);
}
};
module.exports = ReplaceInFilePlugin;