'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;