Skip to content

Commit

Permalink
fix: allow square brackets in path (#264)
Browse files Browse the repository at this point in the history
* fix #231 allow brackets in path

* only need take care of [

* use character sets to escape special character to avoid issue on Windows

* [fix 220] create special directory/file through scripts

* rm helpers directory on every test

* add new line to the end of scripts

* update code, add tests
  • Loading branch information
loveky authored and evilebottnawi committed Jun 1, 2018
1 parent c779a30 commit 3ef5b6c
Show file tree
Hide file tree
Showing 9 changed files with 78 additions and 15 deletions.
6 changes: 3 additions & 3 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

10 changes: 6 additions & 4 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
"pretest": "npm run lint && npm run build && npm run build:tests",
"test": "mocha compiled_tests/",
"build": "babel src/ --out-dir dist/",
"build:tests": "babel tests/ --out-dir compiled_tests/ && ncp tests/helpers compiled_tests/helpers"
"build:tests": "babel tests/ --out-dir compiled_tests/ && rimraf compiled_tests/helpers && ncp tests/helpers compiled_tests/helpers && node scripts/createSpecialDirectory.js"
},
"dependencies": {
"globby": "^7.1.1",
Expand All @@ -34,12 +34,14 @@
"babel-cli": "^6.8.0",
"babel-preset-es2015": "^6.6.0",
"chai": "^3.4.0",
"eslint": "^2.9.0",
"enhanced-resolve": "^3.4.1",
"eslint": "^2.9.0",
"is-gzip": "^2.0.0",
"mkdirp": "^0.5.1",
"mocha": "^2.4.5",
"ncp": "^2.0.0",
"standard-version": "^4.2.0",
"is-gzip": "^2.0.0"
"rimraf": "^2.6.2",
"standard-version": "^4.2.0"
},
"homepage": "https://github.com/webpack-contrib/copy-webpack-plugin",
"bugs": "https://github.com/webpack-contrib/copy-webpack-plugin/issues",
Expand Down
20 changes: 20 additions & 0 deletions scripts/createSpecialDirectory.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
const mkdirp = require('mkdirp');
const path = require('path');
const fs = require('fs');
const removeIllegalCharacterForWindows = require('../tests/utils/removeIllegalCharacterForWindows');

const baseDir = 'compiled_tests/helpers';

const specialFiles = {
'[special?directory]/nested/nestedfile.txt': '',
'[special?directory]/(special-*file).txt': 'special',
'[special?directory]/directoryfile.txt': 'new'
};

Object.keys(specialFiles).forEach(function (originFile) {
const file = removeIllegalCharacterForWindows(originFile);
const dir = path.dirname(file);
mkdirp.sync(path.join(baseDir, dir));
fs.writeFileSync(path.join(baseDir, file), specialFiles[originFile]);
});

3 changes: 1 addition & 2 deletions src/utils/escape.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,7 @@ export default function escape(context, from) {
// Ensure context is escaped before globbing
// Handles special characters in paths
const absoluteContext = path.resolve(context)
.replace(/\\/, '/')
.replace(/[\*|\?|\!|\(|\)|\[|\]|\{|\}]/g, (substring) => `\\${substring}`);
.replace(/[\*|\?|\!|\(|\)|\[|\]|\{|\}]/g, (substring) => `[${substring}]`);

if (!from) {
return absoluteContext;
Expand Down
File renamed without changes.
1 change: 0 additions & 1 deletion tests/helpers/[special?directory]/(special-*file).txt

This file was deleted.

1 change: 0 additions & 1 deletion tests/helpers/[special?directory]/directoryfile.txt

This file was deleted.

48 changes: 44 additions & 4 deletions tests/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@ import cacache from 'cacache';
import isGzip from 'is-gzip';
import zlib from 'zlib';

import removeIllegalCharacterForWindows from './utils/removeIllegalCharacterForWindows';

const BUILD_DIR = path.join(__dirname, 'build');
const HELPER_DIR = path.join(__dirname, 'helpers');
const TEMP_DIR = path.join(__dirname, 'tempdir');
Expand Down Expand Up @@ -58,6 +60,13 @@ describe('apply function', () => {
// Ideally we pass in patterns and confirm the resulting assets
const run = (opts) => {
return new Promise((resolve, reject) => {
if (Array.isArray(opts.patterns)) {
opts.patterns.forEach(function (pattern) {
if (pattern.context) {
pattern.context = removeIllegalCharacterForWindows(pattern.context);
}
});
}
const plugin = CopyWebpackPlugin(opts.patterns, opts.options);

// Get a mock compiler to pass to plugin.apply
Expand Down Expand Up @@ -109,7 +118,7 @@ describe('apply function', () => {
return run(opts)
.then((compilation) => {
if (opts.expectedAssetKeys && opts.expectedAssetKeys.length > 0) {
expect(compilation.assets).to.have.all.keys(opts.expectedAssetKeys);
expect(compilation.assets).to.have.all.keys(opts.expectedAssetKeys.map(removeIllegalCharacterForWindows));
} else {
expect(compilation.assets).to.deep.equal({});
}
Expand Down Expand Up @@ -268,6 +277,7 @@ describe('apply function', () => {
it('can use a glob to move multiple files to the root directory', (done) => {
runEmit({
expectedAssetKeys: [
'[!]/hello.txt',
'binextension.bin',
'file.txt',
'file.txt.gz',
Expand All @@ -289,6 +299,7 @@ describe('apply function', () => {
it('can use a glob to move multiple files to a non-root directory', (done) => {
runEmit({
expectedAssetKeys: [
'nested/[!]/hello.txt',
'nested/binextension.bin',
'nested/file.txt',
'nested/file.txt.gz',
Expand Down Expand Up @@ -405,6 +416,7 @@ describe('apply function', () => {
it('can use a glob with a full path to move multiple files to the root directory', (done) => {
runEmit({
expectedAssetKeys: [
'[!]/hello.txt',
'file.txt',
'directory/directoryfile.txt',
'directory/nested/nestedfile.txt',
Expand All @@ -423,6 +435,7 @@ describe('apply function', () => {
it('can use a glob to move multiple files to a non-root directory with name, hash and ext', (done) => {
runEmit({
expectedAssetKeys: [
'nested/[!]/hello-d41d8c.txt',
'nested/binextension-d41d8c.bin',
'nested/file-22af64.txt',
'nested/file.txt-5b311c.gz',
Expand All @@ -445,13 +458,14 @@ describe('apply function', () => {
it('can flatten or normalize glob matches', (done) => {
runEmit({
expectedAssetKeys: [
'[!]-hello.txt',
'[special?directory]-(special-*file).txt',
'[special?directory]-directoryfile.txt',
'directory-directoryfile.txt'
],
patterns: [{
from: '*/*.*',
test: /([^\/]+)\/([^\/]+)\.\w+$/,
test: `([^\\${path.sep}]+)\\${path.sep}([^\\${path.sep}]+)\\.\\w+$`,
to: '[1]-[2].[ext]'
}]
})
Expand Down Expand Up @@ -887,6 +901,7 @@ describe('apply function', () => {
it('ignores files in pattern', (done) => {
runEmit({
expectedAssetKeys: [
'[!]/hello.txt',
'binextension.bin',
'directory/directoryfile.txt',
'directory/nested/nestedfile.txt',
Expand Down Expand Up @@ -984,7 +999,7 @@ describe('apply function', () => {
'nested/nestedfile.txt'
],
patterns: [{
from: '[special?directory]'
from: (path.sep === '/' ? '[special?directory]' : '[specialdirectory]')
}]
})
.then(done)
Expand Down Expand Up @@ -1324,6 +1339,7 @@ describe('apply function', () => {
it('ignores files that start with a dot', (done) => {
runEmit({
expectedAssetKeys: [
'[!]/hello.txt',
'binextension.bin',
'file.txt',
'file.txt.gz',
Expand Down Expand Up @@ -1384,13 +1400,14 @@ describe('apply function', () => {
it('ignores nested directory', (done) => {
runEmit({
expectedAssetKeys: [
'[!]/hello.txt',
'binextension.bin',
'file.txt',
'file.txt.gz',
'noextension'
],
options: {
ignore: ['directory/**/*', '\\[special\\?directory\\]/**/*']
ignore: ['directory/**/*', `[[]special${process.platform === 'win32' ? '' : '[?]'}directory]/**/*`]
},
patterns: [{
from: '.'
Expand All @@ -1401,6 +1418,29 @@ describe('apply function', () => {
.catch(done);
});

if (path.sep === '/') {
it('ignores nested directory(can use "\\" to escape if path.sep is "/")', (done) => {
runEmit({
expectedAssetKeys: [
'[!]/hello.txt',
'binextension.bin',
'file.txt',
'file.txt.gz',
'noextension'
],
options: {
ignore: ['directory/**/*', '\\[special\\?directory\\]/**/*']
},
patterns: [{
from: '.'
}]

})
.then(done)
.catch(done);
});
}

it('ignores nested directory (glob)', (done) => {
runEmit({
expectedAssetKeys: [
Expand Down
4 changes: 4 additions & 0 deletions tests/utils/removeIllegalCharacterForWindows.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
module.exports = function (string) {
return process.platform !== 'win32' ? string : string.replace(/[*?"<>|]/g, '');
};

0 comments on commit 3ef5b6c

Please sign in to comment.