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