Skip to content

Commit a1989d5

Browse files
feat: added the immutable flag to asset with hash in name (#525)
1 parent 1496f85 commit a1989d5

File tree

3 files changed

+65
-4
lines changed

3 files changed

+65
-4
lines changed

src/index.js

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -110,15 +110,21 @@ class CopyPlugin {
110110
return;
111111
}
112112

113-
const info = compilation.getAsset(targetPath);
113+
const existingAsset = compilation.getAsset(targetPath);
114114

115-
if (info) {
115+
if (existingAsset) {
116116
if (force) {
117117
logger.log(
118118
`force updating '${webpackTo}' to compilation assets from '${absoluteFrom}'`
119119
);
120120

121-
compilation.updateAsset(targetPath, source, { copied: true });
121+
const info = { copied: true };
122+
123+
if (asset.immutable) {
124+
info.immutable = true;
125+
}
126+
127+
compilation.updateAsset(targetPath, source, info);
122128

123129
return;
124130
}
@@ -134,7 +140,13 @@ class CopyPlugin {
134140
`writing '${webpackTo}' to compilation assets from '${absoluteFrom}'`
135141
);
136142

137-
compilation.emitAsset(targetPath, source, { copied: true });
143+
const info = { copied: true };
144+
145+
if (asset.immutable) {
146+
info.immutable = true;
147+
}
148+
149+
compilation.emitAsset(targetPath, source, info);
138150
});
139151

140152
logger.debug('end to adding additional assets');

src/postProcessPattern.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,10 @@ export default async function postProcessPattern(globalRef, pattern, file) {
9595
file.webpackTo = file.webpackTo.replace(/\.?\[ext]/g, '');
9696
}
9797

98+
file.immutable = /\[(?:([^:\]]+):)?(?:hash|contenthash)(?::([a-z]+\d*))?(?::(\d+))?\]/gi.test(
99+
file.webpackTo
100+
);
101+
98102
file.webpackTo = loaderUtils.interpolateName(
99103
{ resourcePath: file.absoluteFrom },
100104
file.webpackTo,
@@ -113,6 +117,7 @@ export default async function postProcessPattern(globalRef, pattern, file) {
113117
`transforming path '${file.webpackTo}' for '${file.absoluteFrom}'`
114118
);
115119

120+
file.immutable = false;
116121
file.webpackTo = await pattern.transformPath(
117122
file.webpackTo,
118123
file.absoluteFrom

test/CopyPlugin.test.js

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -304,6 +304,50 @@ describe('CopyPlugin', () => {
304304
.catch(done);
305305
});
306306

307+
it('should copy files with "copied" flags', (done) => {
308+
expect.assertions(5);
309+
310+
const expectedAssetKeys = [
311+
'directoryfile.5d7817ed5bc246756d73d6a4c8e94c33.txt',
312+
'.dottedfile.5e294e270db6734a42f014f0dd18d9ac',
313+
'nested/nestedfile.31d6cfe0d16ae931b73c59d7e0c089c0.txt',
314+
'nested/deep-nested/deepnested.31d6cfe0d16ae931b73c59d7e0c089c0.txt',
315+
];
316+
317+
run({
318+
preCopy: {
319+
additionalAssets: [
320+
{
321+
name: 'directoryfile.5d7817ed5bc246756d73d6a4c8e94c33.txt',
322+
data: 'Content',
323+
info: { custom: true },
324+
},
325+
],
326+
},
327+
expectedAssetKeys,
328+
patterns: [
329+
{
330+
from: 'directory',
331+
to: '[path][name].[contenthash].[ext]',
332+
force: true,
333+
},
334+
],
335+
})
336+
.then(({ stats }) => {
337+
for (const name of expectedAssetKeys) {
338+
const info = stats.compilation.assetsInfo.get(name);
339+
340+
expect(info.immutable).toBe(true);
341+
342+
if (name === 'directoryfile.5d7817ed5bc246756d73d6a4c8e94c33.txt') {
343+
expect(info.immutable).toBe(true);
344+
}
345+
}
346+
})
347+
.then(done)
348+
.catch(done);
349+
});
350+
307351
it('should copy files and print "copied" in the string representation ', (done) => {
308352
const isWebpack4 = webpack.version[0] === '4';
309353

0 commit comments

Comments
 (0)