diff --git a/src/index.js b/src/index.js
index 3149f14..dce7754 100644
--- a/src/index.js
+++ b/src/index.js
@@ -1,7 +1,10 @@
import path from 'path';
+import fs from 'fs';
+
import glob from 'glob';
+
import { buildChunkMap, replaceSource } from './lib';
const pluginName = 'manifest-replace-plugin';
@@ -25,26 +28,24 @@ class ManifestReplacePlugin {
compiler.hooks.emit.tap(pluginName, (compilation) => {
const chunkMap = buildChunkMap(compilation);
- const relativeTargetDir = options.outputDir
- ? path.relative(compiler.options.output.path, options.outputDir)
- : '';
-
+ const outputDir = options.outputDir
+ ? options.outputDir
+ : compiler.options.output.path
glob
.sync(path.join(options.include, '**/**'), { nodir: true })
.filter((file) => options.test.test(path.basename(file)))
.forEach((file) => {
const source = replaceSource(file, chunkMap);
- const assetKey = path.join(
- relativeTargetDir,
- path.relative(options.include, file)
- );
+ const outputPath = path.join(outputDir, path.relative(options.include, file));
+ const dir = path.dirname(outputPath);
+ if (!fs.existsSync(dir)) {
+ fs.mkdirSync(dir, {recursive: true});
+ }
- // eslint-disable-next-line no-param-reassign
- compilation.assets[assetKey] = {
- source: () => source,
- size: () => source.length,
- };
+ fs.writeFile(outputPath, source, err => {
+ if (err) console.error(err);
+ });
});
});
}
diff --git a/src/lib.js b/src/lib.js
index e47de80..3dc623e 100644
--- a/src/lib.js
+++ b/src/lib.js
@@ -2,7 +2,7 @@ import path from 'path';
import fs from 'fs';
export function buildChunkMap(compilation) {
- const publicPath = compilation.mainTemplate.getPublicPath({
+ const publicPath = compilation.getAssetPath(compilation.outputOptions.publicPath, {
hash: compilation.hash,
});
diff --git a/test/cases/output-dir-case/expected/index.html b/test/cases/output-dir-case/expected/index.html
new file mode 100644
index 0000000..75f23e5
--- /dev/null
+++ b/test/cases/output-dir-case/expected/index.html
@@ -0,0 +1,10 @@
+
+
+
+
+ Webpack App
+
+
+
+
+
diff --git a/test/cases/output-dir-case/expected/output/output.html b/test/cases/output-dir-case/expected/output/output.html
new file mode 100644
index 0000000..2c45597
--- /dev/null
+++ b/test/cases/output-dir-case/expected/output/output.html
@@ -0,0 +1,10 @@
+
+
+
+
+ Webpack App Output Folder
+
+
+
+
+
diff --git a/test/cases/output-dir-case/index.html b/test/cases/output-dir-case/index.html
new file mode 100644
index 0000000..c511b63
--- /dev/null
+++ b/test/cases/output-dir-case/index.html
@@ -0,0 +1,10 @@
+
+
+
+
+ Webpack App
+
+
+
+
+
diff --git a/test/cases/output-dir-case/index.js b/test/cases/output-dir-case/index.js
new file mode 100644
index 0000000..303e90d
--- /dev/null
+++ b/test/cases/output-dir-case/index.js
@@ -0,0 +1 @@
+// document.write('Hello world!');
diff --git a/test/cases/output-dir-case/output/output.html b/test/cases/output-dir-case/output/output.html
new file mode 100644
index 0000000..484e1e4
--- /dev/null
+++ b/test/cases/output-dir-case/output/output.html
@@ -0,0 +1,10 @@
+
+
+
+
+ Webpack App Output Folder
+
+
+
+
+
diff --git a/test/cases/output-dir-case/webpack.config.js b/test/cases/output-dir-case/webpack.config.js
new file mode 100644
index 0000000..eacab06
--- /dev/null
+++ b/test/cases/output-dir-case/webpack.config.js
@@ -0,0 +1,19 @@
+const path = require('path');
+
+const ManifestReplacePlugin = require('../../../');
+
+module.exports = {
+ entry: {
+ 'index': './index.js',
+ },
+ output: {
+ publicPath: '',
+ filename: '[name]-[chunkhash].js',
+ },
+ plugins: [
+ new ManifestReplacePlugin({
+ include: path.resolve(__dirname),
+ outputDir: path.join(__dirname, '../../js/output-dir-case')
+ }),
+ ]
+};
diff --git a/test/webpack-manifest-replace-plugin.test.js b/test/webpack-manifest-replace-plugin.test.js
index b986ff3..2ec0e4e 100644
--- a/test/webpack-manifest-replace-plugin.test.js
+++ b/test/webpack-manifest-replace-plugin.test.js
@@ -4,6 +4,20 @@ const fs = require('fs');
const webpack = require('webpack');
+const recursiveFileRead = (expectedDir, outputDir, relativeDir) => {
+ fs.readdirSync(expectedDir).forEach((expectedFile) => {
+ const filePath = path.resolve(expectedDir, expectedFile)
+ if (fs.lstatSync(filePath).isDirectory()) {
+ recursiveFileRead(filePath, outputDir, path.relative(expectedDir, filePath))
+ return;
+ }
+ const expected = fs.readFileSync(filePath, 'utf8');
+ const actual = fs.readFileSync(path.resolve(path.join(outputDir, relativeDir), expectedFile), 'utf8');
+
+ assert.strictEqual(actual, expected);
+ });
+}
+
describe('Tests', () => {
fs.readdirSync(path.join(__dirname, 'cases')).forEach((testCase) => {
it(testCase, () => {
@@ -26,13 +40,9 @@ describe('Tests', () => {
}
const expectedDir = path.join(testDir, 'expected');
- fs.readdirSync(expectedDir).forEach((expectedFile) => {
- const expected = fs.readFileSync(path.resolve(expectedDir, expectedFile), 'utf8');
- const actual = fs.readFileSync(path.resolve(outputDir, expectedFile), 'utf8');
-
- assert.strictEqual(actual, expected);
- });
+ recursiveFileRead(expectedDir, outputDir, '.');
});
});
})
});
+