Skip to content

Commit 7f08be6

Browse files
fix: use posix separator for emitting assets (#392)
1 parent 89c73c8 commit 7f08be6

File tree

2 files changed

+38
-27
lines changed

2 files changed

+38
-27
lines changed

src/postProcessPattern.js

Lines changed: 19 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import loaderUtils from 'loader-utils';
66
import cacache from 'cacache';
77
import serialize from 'serialize-javascript';
88
import findCacheDir from 'find-cache-dir';
9+
import normalizePath from 'normalize-path';
910

1011
import { name, version } from '../package.json';
1112

@@ -138,26 +139,29 @@ export default function postProcessPattern(globalRef, pattern, file) {
138139
`transforming path '${file.webpackTo}' for '${file.absoluteFrom}'`
139140
);
140141

141-
return Promise.resolve(
142-
pattern.transformPath(file.webpackTo, file.absoluteFrom)
143-
)
142+
return Promise.resolve()
143+
.then(() =>
144+
pattern.transformPath(file.webpackTo, file.absoluteFrom)
145+
)
144146
.then((newPath) => {
145-
// Developers can use invalid slashes we should fix it
146-
file.webpackTo = path.normalize(newPath);
147-
})
148-
.then(() => content);
147+
file.webpackTo = newPath;
148+
149+
return content;
150+
});
149151
}
150152

151153
return content;
152154
})
153155
.then((content) => {
154156
const hash = loaderUtils.getHashDigest(content);
157+
const targetPath = normalizePath(file.webpackTo);
158+
const targetAbsolutePath = normalizePath(file.absoluteFrom);
155159

156160
if (
157161
!copyUnmodified &&
158-
written[file.webpackTo] &&
159-
written[file.webpackTo][file.absoluteFrom] &&
160-
written[file.webpackTo][file.absoluteFrom] === hash
162+
written[targetPath] &&
163+
written[targetPath][targetAbsolutePath] &&
164+
written[targetPath][targetAbsolutePath] === hash
161165
) {
162166
logger.info(
163167
`skipping '${file.webpackTo}', because content hasn't changed`
@@ -168,13 +172,13 @@ export default function postProcessPattern(globalRef, pattern, file) {
168172

169173
logger.debug(`adding '${file.webpackTo}' for tracking content changes`);
170174

171-
if (!written[file.webpackTo]) {
172-
written[file.webpackTo] = {};
175+
if (!written[targetPath]) {
176+
written[targetPath] = {};
173177
}
174178

175-
written[file.webpackTo][file.absoluteFrom] = hash;
179+
written[targetPath][targetAbsolutePath] = hash;
176180

177-
if (compilation.assets[file.webpackTo] && !file.force) {
181+
if (compilation.assets[targetPath] && !file.force) {
178182
logger.info(
179183
`skipping '${file.webpackTo}', because it already exists`
180184
);
@@ -186,7 +190,7 @@ export default function postProcessPattern(globalRef, pattern, file) {
186190
`writing '${file.webpackTo}' to compilation assets from '${file.absoluteFrom}'`
187191
);
188192

189-
compilation.assets[file.webpackTo] = {
193+
compilation.assets[targetPath] = {
190194
size() {
191195
return stats.size;
192196
},

test/CopyPlugin.test.js

Lines changed: 19 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -162,24 +162,19 @@ describe('apply function', () => {
162162

163163
if (opts.expectedAssetKeys && opts.expectedAssetKeys.length > 0) {
164164
expect(Object.keys(compilation.assets).sort()).toEqual(
165-
opts.expectedAssetKeys
166-
.sort()
167-
.map(removeIllegalCharacterForWindows)
168-
.map((item) => item.replace(/\//g, path.sep))
165+
opts.expectedAssetKeys.sort().map(removeIllegalCharacterForWindows)
169166
);
170167
} else {
171168
expect(compilation.assets).toEqual({});
172169
}
173170

174171
if (opts.expectedAssetContent) {
175172
// eslint-disable-next-line guard-for-in
176-
for (const key in opts.expectedAssetContent) {
177-
const assetName = key.replace(/(\/|\\)/g, path.sep);
178-
173+
for (const assetName in opts.expectedAssetContent) {
179174
expect(compilation.assets[assetName]).toBeDefined();
180175

181176
if (compilation.assets[assetName]) {
182-
let expectedContent = opts.expectedAssetContent[key];
177+
let expectedContent = opts.expectedAssetContent[assetName];
183178

184179
if (!Buffer.isBuffer(expectedContent)) {
185180
expectedContent = Buffer.from(expectedContent);
@@ -244,10 +239,7 @@ describe('apply function', () => {
244239
.then(() => {
245240
if (opts.expectedAssetKeys && opts.expectedAssetKeys.length > 0) {
246241
expect(Object.keys(compilation.assets).sort()).toEqual(
247-
opts.expectedAssetKeys
248-
.sort()
249-
.map(removeIllegalCharacterForWindows)
250-
.map((item) => item.replace(/\//g, path.sep))
242+
opts.expectedAssetKeys.sort().map(removeIllegalCharacterForWindows)
251243
);
252244
} else {
253245
expect(compilation.assets).toEqual({});
@@ -2566,4 +2558,19 @@ describe('apply function', () => {
25662558
});
25672559
});
25682560
});
2561+
2562+
it('should move a file and use posix separator for emitting assets', (done) => {
2563+
runEmit({
2564+
expectedAssetKeys: ['dir/nestedfile.txt'],
2565+
patterns: [
2566+
{
2567+
context: HELPER_DIR,
2568+
from: 'directory/nested/nestedfile.txt',
2569+
to: 'dir',
2570+
},
2571+
],
2572+
})
2573+
.then(done)
2574+
.catch(done);
2575+
});
25692576
});

0 commit comments

Comments
 (0)