From 3f581439cea659b0424a80256a4ef8b2d487eb55 Mon Sep 17 00:00:00 2001 From: yongsoo-lee2 Date: Wed, 31 Aug 2022 21:54:04 +0900 Subject: [PATCH 1/2] support webpack 5 --- src/index.js | 25 ++++++++++++------------- src/lib.js | 2 +- 2 files changed, 13 insertions(+), 14 deletions(-) diff --git a/src/index.js b/src/index.js index 3149f14..980091e 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,22 @@ 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.writeFileSync(outputPath, source); }); }); } 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, }); From b9a18e30694dc3d37a702c5489e92c99c350bcb4 Mon Sep 17 00:00:00 2001 From: yongsoo-lee2 Date: Thu, 1 Sep 2022 15:11:27 +0900 Subject: [PATCH 2/2] add test case for specifir output dir --- src/index.js | 4 +++- .../cases/output-dir-case/expected/index.html | 10 +++++++++ .../expected/output/output.html | 10 +++++++++ test/cases/output-dir-case/index.html | 10 +++++++++ test/cases/output-dir-case/index.js | 1 + test/cases/output-dir-case/output/output.html | 10 +++++++++ test/cases/output-dir-case/webpack.config.js | 19 ++++++++++++++++ test/webpack-manifest-replace-plugin.test.js | 22 ++++++++++++++----- 8 files changed, 79 insertions(+), 7 deletions(-) create mode 100644 test/cases/output-dir-case/expected/index.html create mode 100644 test/cases/output-dir-case/expected/output/output.html create mode 100644 test/cases/output-dir-case/index.html create mode 100644 test/cases/output-dir-case/index.js create mode 100644 test/cases/output-dir-case/output/output.html create mode 100644 test/cases/output-dir-case/webpack.config.js diff --git a/src/index.js b/src/index.js index 980091e..dce7754 100644 --- a/src/index.js +++ b/src/index.js @@ -43,7 +43,9 @@ class ManifestReplacePlugin { fs.mkdirSync(dir, {recursive: true}); } - fs.writeFileSync(outputPath, source); + fs.writeFile(outputPath, source, err => { + if (err) console.error(err); + }); }); }); } 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, '.'); }); }); }) }); +