diff --git a/src/postProcessPattern.js b/src/postProcessPattern.js index 3a57d557..241023d6 100644 --- a/src/postProcessPattern.js +++ b/src/postProcessPattern.js @@ -114,17 +114,14 @@ export default function postProcessPattern(globalRef, pattern, file) { file.webpackTo = file.webpackTo.replace(/\.?\[ext\]/g, ''); } - // Developers can use invalid slashes in regex we should fix it - file.webpackTo = normalizePath( - loaderUtils.interpolateName( - { resourcePath: file.absoluteFrom }, - file.webpackTo, - { - content, - regExp: file.webpackToRegExp, - context: pattern.context, - } - ) + file.webpackTo = loaderUtils.interpolateName( + { resourcePath: file.absoluteFrom }, + file.webpackTo, + { + content, + regExp: file.webpackToRegExp, + context: pattern.context, + } ); } diff --git a/src/preProcessPattern.js b/src/preProcessPattern.js index 95737a3f..8b828795 100644 --- a/src/preProcessPattern.js +++ b/src/preProcessPattern.js @@ -45,7 +45,16 @@ export default function preProcessPattern(globalRef, pattern) { pattern.context = path.join(context, pattern.context); } + const isFromGlobPatten = isObject(pattern.from) && pattern.from.glob; + // Todo remove this in next major + const isToDirectory = + path.extname(pattern.to) === '' || pattern.to.slice(-1) === path.sep; + + // Normalize path + pattern.from = isFromGlobPatten ? pattern.from : normalizePath(pattern.from); pattern.context = normalizePath(pattern.context); + pattern.to = normalizePath(pattern.to); + pattern.ignore = globalRef.ignore.concat(pattern.ignore || []); logger.debug(`processing from: '${pattern.from}' to: '${pattern.to}'`); @@ -57,7 +66,7 @@ export default function preProcessPattern(globalRef, pattern) { case isTemplateLike.test(pattern.to): pattern.toType = 'template'; break; - case path.extname(pattern.to) === '' || pattern.to.slice(-1) === '/': + case isToDirectory: pattern.toType = 'dir'; break; default: @@ -65,7 +74,7 @@ export default function preProcessPattern(globalRef, pattern) { } // If we know it's a glob, then bail early - if (isObject(pattern.from) && pattern.from.glob) { + if (isFromGlobPatten) { logger.debug(`determined '${pattern.absoluteFrom}' is a glob`); pattern.fromType = 'glob'; @@ -75,9 +84,7 @@ export default function preProcessPattern(globalRef, pattern) { pattern.glob = normalize(pattern.context, pattern.from.glob); pattern.globOptions = globOptions; - pattern.absoluteFrom = normalizePath( - path.resolve(pattern.context, pattern.from.glob) - ); + pattern.absoluteFrom = path.resolve(pattern.context, pattern.from.glob); return Promise.resolve(pattern); } @@ -88,9 +95,6 @@ export default function preProcessPattern(globalRef, pattern) { pattern.absoluteFrom = path.resolve(pattern.context, pattern.from); } - // Normalize path when path separators are mixed (like `C:\\directory/nested-directory/`) - pattern.absoluteFrom = normalizePath(pattern.absoluteFrom); - logger.debug( `determined '${pattern.from}' to be read from '${pattern.absoluteFrom}'` ); @@ -147,9 +151,7 @@ export default function preProcessPattern(globalRef, pattern) { pattern.fromType = 'dir'; pattern.context = pattern.absoluteFrom; pattern.glob = normalize(pattern.absoluteFrom, '**/*'); - pattern.absoluteFrom = normalizePath( - path.join(pattern.absoluteFrom, '**/*') - ); + pattern.absoluteFrom = path.join(pattern.absoluteFrom, '**/*'); pattern.globOptions = { dot: true, }; @@ -159,7 +161,7 @@ export default function preProcessPattern(globalRef, pattern) { fileDependencies.add(pattern.absoluteFrom); pattern.fromType = 'file'; - pattern.context = normalizePath(path.dirname(pattern.absoluteFrom)); + pattern.context = path.dirname(pattern.absoluteFrom); pattern.glob = normalize(pattern.absoluteFrom); pattern.globOptions = { dot: true, diff --git a/src/processPattern.js b/src/processPattern.js index 2dfd1cd0..1469eab1 100644 --- a/src/processPattern.js +++ b/src/processPattern.js @@ -3,7 +3,6 @@ import path from 'path'; import globby from 'globby'; import pLimit from 'p-limit'; import minimatch from 'minimatch'; -import normalizePath from 'normalize-path'; import isObject from './utils/isObject'; @@ -42,9 +41,6 @@ export default function processPattern(globalRef, pattern) { file.relativeFrom = path.basename(file.relativeFrom); } - // Ensure forward slashes - file.relativeFrom = normalizePath(file.relativeFrom); - logger.debug(`found ${from}`); // Check the ignore list @@ -113,9 +109,6 @@ export default function processPattern(globalRef, pattern) { file.webpackTo = path.relative(output, file.webpackTo); } - // Ensure forward slashes - file.webpackTo = normalizePath(file.webpackTo); - logger.info( `determined that '${from}' should write to '${file.webpackTo}'` ); diff --git a/test/CopyPlugin.test.js b/test/CopyPlugin.test.js index 2fe21de9..a6f5ff33 100644 --- a/test/CopyPlugin.test.js +++ b/test/CopyPlugin.test.js @@ -10,7 +10,6 @@ import findCacheDir from 'find-cache-dir'; import cacache from 'cacache'; import isGzip from 'is-gzip'; import mkdirp from 'mkdirp'; -import normalizePath from 'normalize-path'; import CopyPlugin from '../src/index'; @@ -687,9 +686,9 @@ describe('apply function', () => { .then((compilation) => { expect( Array.from(compilation.contextDependencies) - .map((contextDependency) => normalizePath(contextDependency)) + .map((contextDependency) => contextDependency) .sort() - ).toEqual([normalizePath(path.join(HELPER_DIR, 'directory'))].sort()); + ).toEqual([path.join(HELPER_DIR, 'directory')].sort()); }) .then(done) .catch(done); @@ -797,9 +796,7 @@ describe('apply function', () => { expectedAssetKeys: [], expectedWarnings: [ new Error( - `unable to locate 'nonexistent.txt' at '${normalizePath( - HELPER_DIR - )}/nonexistent.txt'` + `unable to locate 'nonexistent.txt' at '${HELPER_DIR}/nonexistent.txt'` ), ], patterns: [ @@ -818,9 +815,7 @@ describe('apply function', () => { expectedAssetKeys: [], expectedWarnings: [ new Error( - `unable to locate 'nonexistent.txt' at '${normalizePath( - HELPER_DIR - )}/nonexistent.txt'` + `unable to locate 'nonexistent.txt' at '${HELPER_DIR}/nonexistent.txt'` ), ], patterns: [ @@ -1057,13 +1052,13 @@ describe('apply function', () => { .catch(done); }); - it('can move a file to a new directory with an extension and forward slash', (done) => { + it('can move a file to a new directory with an extension and path separator at end', (done) => { runEmit({ expectedAssetKeys: ['newdirectory.ext/file.txt'], patterns: [ { from: 'file.txt', - to: 'newdirectory.ext/', + to: `newdirectory.ext${path.sep}`, }, ], }) @@ -1236,7 +1231,7 @@ describe('apply function', () => { ], }) .then((compilation) => { - const absFrom = normalizePath(path.join(HELPER_DIR, 'file.txt')); + const absFrom = path.join(HELPER_DIR, 'file.txt'); expect(Array.from(compilation.fileDependencies).sort()).toEqual( [absFrom].sort() @@ -1478,9 +1473,7 @@ describe('apply function', () => { expectedAssetKeys: [], expectedWarnings: [ new Error( - `unable to locate 'nonexistent' at '${normalizePath( - HELPER_DIR - )}/nonexistent'` + `unable to locate 'nonexistent' at '${HELPER_DIR}/nonexistent'` ), ], patterns: [ @@ -1680,7 +1673,7 @@ describe('apply function', () => { ], }) .then((compilation) => { - const absFrom = normalizePath(path.resolve(HELPER_DIR, 'directory')); + const absFrom = path.resolve(HELPER_DIR, 'directory'); expect(Array.from(compilation.contextDependencies).sort()).toEqual( [absFrom].sort() );