Skip to content

Commit 8f5e638

Browse files
authoredFeb 19, 2019
fix: normalize path segment separation (#339)
1 parent a1c5372 commit 8f5e638

File tree

7 files changed

+298
-47
lines changed

7 files changed

+298
-47
lines changed
 

‎package-lock.json

+19-15
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

‎package.json

+2-1
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,8 @@
4747
"is-glob": "^4.0.0",
4848
"loader-utils": "^1.1.0",
4949
"minimatch": "^3.0.4",
50-
"p-limit": "^2.1.0"
50+
"p-limit": "^2.1.0",
51+
"normalize-path": "^3.0.0"
5152
},
5253
"devDependencies": {
5354
"@babel/cli": "^7.1.5",

‎src/preProcessPattern.js

+13-6
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
import path from 'path';
22

33
import isGlob from 'is-glob';
4+
import normalizePath from 'normalize-path';
45

5-
import escape from './utils/escape';
6+
import normalize from './utils/normalize';
67
import isObject from './utils/isObject';
78
import { stat } from './utils/promisify';
89

@@ -41,6 +42,7 @@ export default function preProcessPattern(globalRef, pattern) {
4142
pattern.context = path.join(context, pattern.context);
4243
}
4344

45+
pattern.context = normalizePath(pattern.context);
4446
pattern.ignore = globalRef.ignore.concat(pattern.ignore || []);
4547

4648
info(`processing from: '${pattern.from}' to: '${pattern.to}'`);
@@ -68,9 +70,11 @@ export default function preProcessPattern(globalRef, pattern) {
6870
const globOptions = Object.assign({}, pattern.from);
6971
delete globOptions.glob;
7072

71-
pattern.glob = escape(pattern.context, pattern.from.glob);
73+
pattern.glob = normalize(pattern.context, pattern.from.glob);
7274
pattern.globOptions = globOptions;
73-
pattern.absoluteFrom = path.resolve(pattern.context, pattern.from.glob);
75+
pattern.absoluteFrom = normalizePath(
76+
path.resolve(pattern.context, pattern.from.glob)
77+
);
7478

7579
return Promise.resolve(pattern);
7680
}
@@ -81,6 +85,9 @@ export default function preProcessPattern(globalRef, pattern) {
8185
pattern.absoluteFrom = path.resolve(pattern.context, pattern.from);
8286
}
8387

88+
// Normalize path when path separators are mixed (like `C:\\directory/nested-directory/`)
89+
pattern.absoluteFrom = normalizePath(pattern.absoluteFrom);
90+
8491
debug(
8592
`determined '${pattern.from}' to be read from '${pattern.absoluteFrom}'`
8693
);
@@ -89,7 +96,7 @@ export default function preProcessPattern(globalRef, pattern) {
8996
// If from doesn't appear to be a glob, then log a warning
9097
if (isGlob(pattern.from) || pattern.from.indexOf('*') !== -1) {
9198
pattern.fromType = 'glob';
92-
pattern.glob = escape(pattern.context, pattern.from);
99+
pattern.glob = normalize(pattern.context, pattern.from);
93100

94101
// We need to add context directory as dependencies to avoid problems when new files added in directories
95102
// when we already in watch mode and this directories are not in context dependencies
@@ -130,7 +137,7 @@ export default function preProcessPattern(globalRef, pattern) {
130137

131138
pattern.fromType = 'dir';
132139
pattern.context = pattern.absoluteFrom;
133-
pattern.glob = escape(pattern.absoluteFrom, '**/*');
140+
pattern.glob = normalize(pattern.absoluteFrom, '**/*');
134141
pattern.absoluteFrom = path.join(pattern.absoluteFrom, '**/*');
135142
pattern.globOptions = {
136143
dot: true,
@@ -140,7 +147,7 @@ export default function preProcessPattern(globalRef, pattern) {
140147

141148
pattern.fromType = 'file';
142149
pattern.context = path.dirname(pattern.absoluteFrom);
143-
pattern.glob = escape(pattern.absoluteFrom);
150+
pattern.glob = normalize(pattern.absoluteFrom);
144151
pattern.globOptions = {
145152
dot: true,
146153
};

‎src/processPattern.js

+6-2
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import path from 'path';
33
import globby from 'globby';
44
import pLimit from 'p-limit';
55
import minimatch from 'minimatch';
6+
import normalizePath from 'normalize-path';
67

78
import isObject from './utils/isObject';
89

@@ -41,6 +42,9 @@ export default function processPattern(globalRef, pattern) {
4142
file.relativeFrom = path.basename(file.relativeFrom);
4243
}
4344

45+
// Ensure forward slashes
46+
file.relativeFrom = normalizePath(file.relativeFrom);
47+
4448
debug(`found ${from}`);
4549

4650
// Check the ignore list
@@ -106,8 +110,8 @@ export default function processPattern(globalRef, pattern) {
106110
file.webpackTo = path.relative(output, file.webpackTo);
107111
}
108112

109-
// ensure forward slashes
110-
file.webpackTo = file.webpackTo.replace(/\\/g, '/');
113+
// Ensure forward slashes
114+
file.webpackTo = normalizePath(file.webpackTo);
111115

112116
info(`determined that '${from}' should write to '${file.webpackTo}'`);
113117

‎src/utils/escape.js ‎src/utils/normalize.js

+7-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
import path from 'path';
22

3-
export default function escape(context, from) {
3+
import normalizePath from 'normalize-path';
4+
5+
function escape(context, from) {
46
if (from && path.isAbsolute(from)) {
57
return from;
68
}
@@ -24,3 +26,7 @@ export default function escape(context, from) {
2426

2527
return `${absoluteContext}/${from}`;
2628
}
29+
30+
export default function normalize(context, from) {
31+
return normalizePath(escape(context, from));
32+
}

‎test/CopyPlugin.test.js

+251-22
Large diffs are not rendered by default.

‎test/helpers/directory/nested/deep-nested/deepnested.txt

Whitespace-only changes.

0 commit comments

Comments
 (0)
Please sign in to comment.