copy-webpack-plugin
Advanced tools
Comparing version 0.2.0 to 0.3.0
@@ -0,1 +1,7 @@ | ||
## 0.3.0 (Nov 27, 2015) | ||
* Added `ignore` option that function lie `.gitignore` | ||
* Improved Windows support | ||
## 0.2.0 (Oct 28, 2015) | ||
@@ -2,0 +8,0 @@ |
49
index.js
@@ -6,5 +6,6 @@ var _ = require('lodash'); | ||
var dir = Promise.promisifyAll(require('node-dir')); | ||
var minimatch = require('minimatch'); | ||
function apply(patterns, compiler) { | ||
function apply(patterns, opts, compiler) { | ||
@@ -15,2 +16,8 @@ var baseDir = compiler.options.context; | ||
var lastGlobalUpdate = 0; | ||
if (!opts) { | ||
opts = {}; | ||
} | ||
var ignoreList = opts.ignore; | ||
@@ -33,8 +40,15 @@ compiler.plugin('emit', function(compilation, cb) { | ||
forceWrite: forceWrite, | ||
lastGlobalUpdate: lastGlobalUpdate | ||
lastGlobalUpdate: lastGlobalUpdate, | ||
ignoreList: ignoreList | ||
}); | ||
} else { | ||
// Skip if it matches any of our ignore list | ||
if (shouldIgnore(relSrc, ignoreList)) { | ||
return; | ||
} | ||
fileDependencies.push(absSrc); | ||
if ((path.extname(relDest) === '' || // doesn't have an extension | ||
_.last(relDest) === '/' || // doesn't end in a slash | ||
_.last(relDest) === path.sep || // ends in a path separator | ||
_.last(relDest) === '/' || // ends in a slash (kept for compatibility) | ||
pattern.toType === 'dir') && // is explicitly a dir | ||
@@ -115,11 +129,17 @@ pattern.toType !== 'file') { // is not explicitly a file | ||
var lastGlobalUpdate = opts.lastGlobalUpdate; | ||
var ignoreList = opts.ignoreList; | ||
return dir.filesAsync(absDirSrc) | ||
.each(function(absFileSrc) { | ||
var relFileSrc = absFileSrc.replace(absDirSrc, ''); | ||
var relFileSrc = path.relative(absDirSrc, absFileSrc); | ||
var relFileDest = path.join(relDirDest, relFileSrc); | ||
// Skip if it matches any of our ignore list | ||
if (shouldIgnore(relFileSrc, ignoreList)) { | ||
return; | ||
} | ||
// Make sure it doesn't start with the separator | ||
if (_.first(relFileDest) === '/') { | ||
relFileDest = relFileDest.substr(1); | ||
if (_.first(relFileDest) === path.sep) { | ||
relFileDest = relFileDest.slice(1); | ||
} | ||
@@ -137,3 +157,16 @@ | ||
module.exports = function(patterns) { | ||
function shouldIgnore(pathName, ignoreList) { | ||
var matched = _.find(ignoreList, function(glob) { | ||
return minimatch(pathName, glob, { | ||
matchBase: true | ||
}); | ||
}); | ||
if (matched) { | ||
return true; | ||
} else { | ||
return false; | ||
} | ||
} | ||
module.exports = function(patterns, options) { | ||
if (_.isUndefined(patterns)) { | ||
@@ -148,4 +181,4 @@ patterns = []; | ||
return { | ||
apply: apply.bind(this, patterns) | ||
apply: apply.bind(this, patterns, options) | ||
}; | ||
}; |
{ | ||
"name": "copy-webpack-plugin", | ||
"version": "0.2.0", | ||
"version": "0.3.0", | ||
"description": "Copy files and directories in webpack", | ||
@@ -23,10 +23,12 @@ "main": "index.js", | ||
"lodash": "^3.10.1", | ||
"minimatch": "^3.0.0", | ||
"node-dir": "^0.1.10" | ||
}, | ||
"scripts": { | ||
"test": "mocha" | ||
"test": "node ./node_modules/mocha/bin/mocha" | ||
}, | ||
"devDependencies": { | ||
"chai": "^3.4.0" | ||
"chai": "^3.4.0", | ||
"mocha": "^2.3.4" | ||
} | ||
} |
110
README.md
@@ -15,4 +15,38 @@ ## Copy Webpack Plugin | ||
`new CopyWebpackPlugin([patterns], options)` | ||
A pattern looks like: | ||
`{ from: 'source', to: 'dest' }` | ||
Pattern properties: | ||
* `from` | ||
- is required | ||
- can be an absolute or path relative to the context | ||
- can be a file or directory | ||
* `to` | ||
- is optional | ||
- is relative to the context root | ||
- defaults to `'/'` | ||
- must be a directory if `from` is a directory | ||
* `toType` | ||
- is optional | ||
- is ignored if `from` is a directory | ||
- defaults to `'file'` if `to` has an extension | ||
- defaults to `'dir'` if `to` doesn't have an extension | ||
* `force` | ||
- is optional | ||
- defaults to `false` | ||
- forces the plugin to overwrite files staged by previous plugins | ||
Available options: | ||
* `ignore` | ||
- an array of files and directories to ignore | ||
- accepts globs | ||
- globs are evaluated on the `from` path, relative to the context | ||
### Examples | ||
```javascript | ||
var CopyWebpackPlugin = require('copy-webpack-plugin'); | ||
var path = require('path'); | ||
@@ -23,13 +57,36 @@ module.exports = { | ||
new CopyWebpackPlugin([ | ||
// File examples | ||
// {context}/file.txt | ||
{ from: 'path/to/file.txt' }, | ||
// {context}/path/to/build/file.txt | ||
{ from: 'path/to/file.txt', to: 'path/to/build/file.txt' }, | ||
// {context}/path/to/build/directory/file.txt | ||
{ from: 'path/to/file.txt', to: 'path/to/build/directory' }, | ||
{ from: 'path/to/file.txt', to: 'file/without/extension', toType: 'file' }, | ||
{ from: 'path/to/file.txt', to: 'directory/with/extension.ext', toType: 'dir' }, | ||
// Directory examples | ||
// Copy directory contents to {context}/ | ||
{ from: 'path/to/directory' }, | ||
{ from: 'path/to/directory', to: 'path/to/build/directory' } | ||
]) | ||
// Copy directory contents to {context}/path/to/build/directory | ||
{ from: 'path/to/directory', to: 'path/to/build/directory' }, | ||
// {context}/file/without/extension | ||
{ | ||
from: 'path/to/file.txt', | ||
to: 'file/without/extension', | ||
toType: 'file' | ||
}, | ||
// {context}/directory/with/extension.ext/file.txt | ||
{ | ||
from: 'path/to/file.txt', | ||
to: 'directory/with/extension.ext', | ||
toType: 'dir' | ||
} | ||
], { | ||
ignore: [ | ||
// Doesn't copy any files with a txt extension | ||
'*.txt' | ||
] | ||
}) | ||
] | ||
@@ -39,45 +96,10 @@ }; | ||
### Common patterns | ||
### Testing | ||
* Copy from file to file. The destination file can be renamed. | ||
[![Build Status](https://drone.io/github.com/kevlened/copy-webpack-plugin/status.png)](https://drone.io/github.com/kevlened/copy-webpack-plugin/latest) | ||
{ from: 'path/to/file.txt', to: 'path/to/build/file.txt' } | ||
Run `npm test` | ||
* Copy from file to directory | ||
{ from: 'path/to/file.txt', to: 'path/to/build/directory' } | ||
* Copy from directory to directory. The destination directory can be renamed. | ||
{ from: 'path/to/directory', to: 'path/to/build/directory' } | ||
### Special cases | ||
* Copy from file to root | ||
{ from: 'path/to/file.txt' } | ||
* Copy from directory to root | ||
{ from: 'path/to/directory' } | ||
* Copy from file to directory that has an extension. If the `to` parameter has an extension, the plugin assumes the target is a file. Provide `toType` to override this behavior. | ||
{ from: 'path/to/file.txt', to: 'directory/with/extension.ext', toType: 'dir' } | ||
* Copy from file to file without an extension. If the `to` parameter doesn't have an extension, the plugin assumes the target is a directory. Provide `toType` to override this behavior. | ||
{ from: 'path/to/file.txt', to: 'file/without/extension', toType: 'file' } | ||
* Overwrite existing file. By default, assets that are staged by previous plugins aren't overwritten. Provide `force` to override this behavior. | ||
{ from: 'path/to/file.txt', force: true } | ||
{ from: 'path/to/directory', force: true } | ||
### Testing | ||
Run `mocha` | ||
### License | ||
MIT |
@@ -12,16 +12,16 @@ var expect = require('chai').expect; | ||
function MockCompiler() { | ||
this.options = { | ||
context: HELPER_DIR | ||
}; | ||
this.options = { | ||
context: HELPER_DIR | ||
}; | ||
} | ||
MockCompiler.prototype.plugin = function(type, fn) { | ||
switch(type) { | ||
case 'emit': | ||
this.emitFn = fn; | ||
break; | ||
case 'after-emit': | ||
this.afterEmitFn = fn; | ||
break; | ||
} | ||
switch(type) { | ||
case 'emit': | ||
this.emitFn = fn; | ||
break; | ||
case 'after-emit': | ||
this.afterEmitFn = fn; | ||
break; | ||
} | ||
}; | ||
@@ -31,341 +31,440 @@ | ||
// Ideally we pass in patterns and confirm the resulting assets | ||
function run(opts) { | ||
return new Promise(function(resolve, reject) { | ||
var plugin = new CopyWebpackPlugin(opts.patterns); | ||
// Ideally we pass in patterns and confirm the resulting assets | ||
function run(opts) { | ||
return new Promise(function(resolve, reject) { | ||
var plugin = new CopyWebpackPlugin(opts.patterns, opts.options); | ||
// Get a mock compiler to pass to plugin.apply | ||
var compiler = opts.compiler || new MockCompiler(); | ||
plugin.apply(compiler); | ||
// Get a mock compiler to pass to plugin.apply | ||
var compiler = opts.compiler || new MockCompiler(); | ||
plugin.apply(compiler); | ||
// Call the registered function with a mock compilation and callback | ||
var compilation = _.extend({ | ||
errors: [], | ||
assets: {}, | ||
fileDependencies: [], | ||
contextDependencies: [] | ||
}, opts.compilation); | ||
// Call the registered function with a mock compilation and callback | ||
var compilation = _.extend({ | ||
errors: [], | ||
assets: {}, | ||
fileDependencies: [], | ||
contextDependencies: [] | ||
}, opts.compilation); | ||
// Execute the functions in series | ||
Promise.each([compiler.emitFn, compiler.afterEmitFn], function(fn) { | ||
return new Promise(function(res, rej) { | ||
try { | ||
fn(compilation, res); | ||
} catch(e) { | ||
rej(e); | ||
} | ||
}); | ||
}) | ||
.then(function() { | ||
if (compilation.errors.length > 0) { | ||
throw compilation.errors[0]; | ||
} | ||
resolve(compilation); | ||
}) | ||
.catch(reject); | ||
}); | ||
} | ||
// Execute the functions in series | ||
Promise.each([compiler.emitFn, compiler.afterEmitFn], function(fn) { | ||
return new Promise(function(res, rej) { | ||
try { | ||
fn(compilation, res); | ||
} catch(e) { | ||
rej(e); | ||
} | ||
}); | ||
}) | ||
.then(function() { | ||
if (compilation.errors.length > 0) { | ||
throw compilation.errors[0]; | ||
} | ||
resolve(compilation); | ||
}) | ||
.catch(reject); | ||
}); | ||
} | ||
function runEmit(opts) { | ||
return run(opts) | ||
.then(function(compilation) { | ||
if (opts.expectedAssetKeys && opts.expectedAssetKeys.length > 0) { | ||
expect(compilation.assets).to.have.all.keys(opts.expectedAssetKeys); | ||
} else { | ||
expect(compilation.assets).to.be.empty; | ||
} | ||
}); | ||
} | ||
function runEmit(opts) { | ||
return run(opts) | ||
.then(function(compilation) { | ||
if (opts.expectedAssetKeys && opts.expectedAssetKeys.length > 0) { | ||
// Replace all paths with platform-specific paths | ||
var expectedAssetKeys = _.map(opts.expectedAssetKeys, path.normalize); | ||
expect(compilation.assets).to.have.all.keys(expectedAssetKeys); | ||
} else { | ||
expect(compilation.assets).to.be.empty; | ||
} | ||
}); | ||
} | ||
function runForce(opts) { | ||
opts.compilation = { | ||
assets: {} | ||
}; | ||
opts.compilation.assets[opts.existingAsset] = { | ||
source: function() { | ||
return 'existing'; | ||
} | ||
}; | ||
return run(opts) | ||
.then(function(compilation) { | ||
var assetContent = compilation.assets[opts.existingAsset].source().toString(); | ||
expect(assetContent).to.equal(opts.expectedAssetContent); | ||
}); | ||
} | ||
function runForce(opts) { | ||
opts.compilation = { | ||
assets: {} | ||
}; | ||
opts.compilation.assets[opts.existingAsset] = { | ||
source: function() { | ||
return 'existing'; | ||
} | ||
}; | ||
return run(opts) | ||
.then(function(compilation) { | ||
var assetContent = compilation.assets[opts.existingAsset].source().toString(); | ||
expect(assetContent).to.equal(opts.expectedAssetContent); | ||
}); | ||
} | ||
function runChange(opts) { | ||
// Create two test files | ||
fs.writeFileSync(opts.newFileLoc1); | ||
fs.writeFileSync(opts.newFileLoc2); | ||
function runChange(opts) { | ||
// Create two test files | ||
fs.writeFileSync(opts.newFileLoc1); | ||
fs.writeFileSync(opts.newFileLoc2); | ||
// Create a reference to the compiler | ||
var compiler = new MockCompiler(); | ||
var compilation = { | ||
errors: [], | ||
assets: {}, | ||
fileDependencies: [], | ||
contextDependencies: [] | ||
}; | ||
return run({ | ||
compiler: compiler, | ||
patterns: opts.patterns | ||
}) | ||
// mtime is only measured in whole seconds | ||
.delay(1000) | ||
.then(function() { | ||
// Create a reference to the compiler | ||
var compiler = new MockCompiler(); | ||
var compilation = { | ||
errors: [], | ||
assets: {}, | ||
fileDependencies: [], | ||
contextDependencies: [] | ||
}; | ||
return run({ | ||
compiler: compiler, | ||
patterns: opts.patterns | ||
}) | ||
// mtime is only measured in whole seconds | ||
.delay(1000) | ||
.then(function() { | ||
// Change a file | ||
fs.appendFileSync(opts.newFileLoc1, 'extra'); | ||
// Change a file | ||
fs.appendFileSync(opts.newFileLoc1, 'extra'); | ||
// Trigger another compile | ||
return new Promise(function(res, rej) { | ||
compiler.emitFn(compilation, res); | ||
}); | ||
}) | ||
.then(function() { | ||
return compilation; | ||
}) | ||
.finally(function() { | ||
fs.unlinkSync(opts.newFileLoc1); | ||
fs.unlinkSync(opts.newFileLoc2); | ||
}); | ||
} | ||
// Trigger another compile | ||
return new Promise(function(res, rej) { | ||
compiler.emitFn(compilation, res); | ||
}); | ||
}) | ||
.then(function() { | ||
return compilation; | ||
}) | ||
.finally(function() { | ||
fs.unlinkSync(opts.newFileLoc1); | ||
fs.unlinkSync(opts.newFileLoc2); | ||
}); | ||
} | ||
describe('error handling', function() { | ||
it('doesn\'t throw an error if no patterns are passed', function(done) { | ||
runEmit({ | ||
patterns: undefined, | ||
expectedAssetKeys: [] | ||
}) | ||
.then(done) | ||
.catch(done); | ||
}); | ||
describe('error handling', function() { | ||
it('doesn\'t throw an error if no patterns are passed', function(done) { | ||
runEmit({ | ||
patterns: undefined, | ||
expectedAssetKeys: [] | ||
}) | ||
.then(done) | ||
.catch(done); | ||
}); | ||
it('throws an error if the patterns are an object', function() { | ||
var createPluginWithObject = function() { | ||
new CopyWebpackPlugin({}); | ||
}; | ||
expect(createPluginWithObject).to.throw(Error); | ||
}); | ||
it('throws an error if the patterns are an object', function() { | ||
var createPluginWithObject = function() { | ||
new CopyWebpackPlugin({}); | ||
}; | ||
expect(createPluginWithObject).to.throw(Error); | ||
}); | ||
it('throws an error if the patterns are null', function() { | ||
var createPluginWithNull = function() { | ||
new CopyWebpackPlugin(null); | ||
}; | ||
expect(createPluginWithNull).to.throw(Error); | ||
}); | ||
}); | ||
it('throws an error if the patterns are null', function() { | ||
var createPluginWithNull = function() { | ||
new CopyWebpackPlugin(null); | ||
}; | ||
expect(createPluginWithNull).to.throw(Error); | ||
}); | ||
}); | ||
describe('with file in from', function() { | ||
it('can move a file to the root directory', function(done) { | ||
runEmit({ | ||
patterns: [{ from: 'file.txt' }], | ||
expectedAssetKeys: ['file.txt'] | ||
}) | ||
.then(done) | ||
.catch(done); | ||
}); | ||
describe('with file in from', function() { | ||
it('can move a file to the root directory', function(done) { | ||
runEmit({ | ||
patterns: [{ from: 'file.txt' }], | ||
expectedAssetKeys: ['file.txt'] | ||
}) | ||
.then(done) | ||
.catch(done); | ||
}); | ||
it('can move a file to a new directory without a forward slash', function(done) { | ||
runEmit({ | ||
patterns: [{ from: 'file.txt', to: 'newdirectory' }], | ||
expectedAssetKeys: ['newdirectory/file.txt'] | ||
}) | ||
.then(done) | ||
.catch(done); | ||
}); | ||
it('can use an absolute path to move a file to the root directory', function(done) { | ||
var absolutePath = path.resolve(HELPER_DIR, 'file.txt'); | ||
runEmit({ | ||
patterns: [{ from: absolutePath }], | ||
expectedAssetKeys: ['file.txt'] | ||
}) | ||
.then(done) | ||
.catch(done); | ||
}); | ||
it('can move a file to a new directory with a forward slash', function(done) { | ||
runEmit({ | ||
patterns: [{ from: 'file.txt', to: 'newdirectory/' }], | ||
expectedAssetKeys: ['newdirectory/file.txt'] | ||
}) | ||
.then(done) | ||
.catch(done); | ||
}); | ||
it('can move a file to a new directory without a forward slash', function(done) { | ||
runEmit({ | ||
patterns: [{ from: 'file.txt', to: 'newdirectory' }], | ||
expectedAssetKeys: ['newdirectory/file.txt'] | ||
}) | ||
.then(done) | ||
.catch(done); | ||
}); | ||
it('can move a file to a new directory with an extension', function(done) { | ||
runEmit({ | ||
patterns: [{ from: 'file.txt', to: 'newdirectory.ext', toType: 'dir' }], | ||
expectedAssetKeys: ['newdirectory.ext/file.txt'] | ||
}) | ||
.then(done) | ||
.catch(done); | ||
}); | ||
it('can move a file to a new directory with a forward slash', function(done) { | ||
runEmit({ | ||
patterns: [{ from: 'file.txt', to: 'newdirectory/' }], | ||
expectedAssetKeys: ['newdirectory/file.txt'] | ||
}) | ||
.then(done) | ||
.catch(done); | ||
}); | ||
it('can move a file to a new directory with an extension and forward slash', function(done) { | ||
runEmit({ | ||
patterns: [{ from: 'file.txt', to: 'newdirectory.ext/' }], | ||
expectedAssetKeys: ['newdirectory.ext/file.txt'] | ||
}) | ||
.then(done) | ||
.catch(done); | ||
}); | ||
it('can move a file to a new directory with an extension', function(done) { | ||
runEmit({ | ||
patterns: [{ from: 'file.txt', to: 'newdirectory.ext', toType: 'dir' }], | ||
expectedAssetKeys: ['newdirectory.ext/file.txt'] | ||
}) | ||
.then(done) | ||
.catch(done); | ||
}); | ||
it('can move a file to a new file with a different name', function(done) { | ||
runEmit({ | ||
patterns: [{ from: 'file.txt', to: 'newname.txt' }], | ||
expectedAssetKeys: ['newname.txt'] | ||
}) | ||
.then(done) | ||
.catch(done); | ||
}); | ||
it('can move a file to a new directory with an extension and forward slash', function(done) { | ||
runEmit({ | ||
patterns: [{ from: 'file.txt', to: 'newdirectory.ext/' }], | ||
expectedAssetKeys: ['newdirectory.ext/file.txt'] | ||
}) | ||
.then(done) | ||
.catch(done); | ||
}); | ||
it('can move a file to a new file with no extension', function(done) { | ||
runEmit({ | ||
patterns: [{ from: 'file.txt', to: 'newname', toType: 'file' }], | ||
expectedAssetKeys: ['newname'] | ||
}) | ||
.then(done) | ||
.catch(done); | ||
}); | ||
it('can move a file to a new file with a different name', function(done) { | ||
runEmit({ | ||
patterns: [{ from: 'file.txt', to: 'newname.txt' }], | ||
expectedAssetKeys: ['newname.txt'] | ||
}) | ||
.then(done) | ||
.catch(done); | ||
}); | ||
it('can move a nested file to the root directory', function(done) { | ||
runEmit({ | ||
patterns: [{ from: 'directory/directoryfile.txt' }], | ||
expectedAssetKeys: ['directoryfile.txt'] | ||
}) | ||
.then(done) | ||
.catch(done); | ||
}); | ||
it('can move a file to a new file with no extension', function(done) { | ||
runEmit({ | ||
patterns: [{ from: 'file.txt', to: 'newname', toType: 'file' }], | ||
expectedAssetKeys: ['newname'] | ||
}) | ||
.then(done) | ||
.catch(done); | ||
}); | ||
it('can move a nested file to a new directory', function(done) { | ||
runEmit({ | ||
patterns: [{ from: 'directory/directoryfile.txt', to: 'newdirectory' }], | ||
expectedAssetKeys: ['newdirectory/directoryfile.txt'] | ||
}) | ||
.then(done) | ||
.catch(done); | ||
}); | ||
it('can move a nested file to the root directory', function(done) { | ||
runEmit({ | ||
patterns: [{ from: 'directory/directoryfile.txt' }], | ||
expectedAssetKeys: ['directoryfile.txt'] | ||
}) | ||
.then(done) | ||
.catch(done); | ||
}); | ||
it('won\'t overwrite a file already in the compilation', function(done) { | ||
runForce({ | ||
patterns: [{ from: 'file.txt' }], | ||
existingAsset: 'file.txt', | ||
expectedAssetContent: 'existing' | ||
}) | ||
.then(done) | ||
.catch(done); | ||
}); | ||
it('can use an absolute path to move a nested file to the root directory', function(done) { | ||
var absolutePath = path.resolve(HELPER_DIR, 'directory', 'directoryfile.txt'); | ||
runEmit({ | ||
patterns: [{ from: absolutePath }], | ||
expectedAssetKeys: ['directoryfile.txt'] | ||
}) | ||
.then(done) | ||
.catch(done); | ||
}); | ||
it('can force overwrite of a file already in the compilation', function(done) { | ||
runForce({ | ||
patterns: [{ from: 'file.txt', force: true }], | ||
existingAsset: 'file.txt', | ||
expectedAssetContent: 'new' | ||
}) | ||
.then(done) | ||
.catch(done); | ||
}); | ||
it('can move a nested file to a new directory', function(done) { | ||
runEmit({ | ||
patterns: [{ from: 'directory/directoryfile.txt', to: 'newdirectory' }], | ||
expectedAssetKeys: ['newdirectory/directoryfile.txt'] | ||
}) | ||
.then(done) | ||
.catch(done); | ||
}); | ||
it('adds the file to the watch list', function(done) { | ||
run({ | ||
patterns: [{ from: 'file.txt' }] | ||
}) | ||
.then(function(compilation) { | ||
var absFrom = path.join(HELPER_DIR, 'file.txt'); | ||
expect(compilation.fileDependencies).to.have.members([absFrom]); | ||
}) | ||
.then(done) | ||
.catch(done); | ||
}); | ||
it('can use an absolute path to move a nested file to a new directory', function(done) { | ||
var absolutePath = path.resolve(HELPER_DIR, 'directory', 'directoryfile.txt'); | ||
runEmit({ | ||
patterns: [{ from: absolutePath, to: 'newdirectory' }], | ||
expectedAssetKeys: ['newdirectory/directoryfile.txt'] | ||
}) | ||
.then(done) | ||
.catch(done); | ||
}); | ||
it('only include files that have changed', function(done) { | ||
runChange({ | ||
patterns: [{ from: 'tempfile1.txt' }, { from: 'tempfile2.txt' }], | ||
newFileLoc1: path.join(HELPER_DIR, 'tempfile1.txt'), | ||
newFileLoc2: path.join(HELPER_DIR, 'tempfile2.txt') | ||
}) | ||
.then(function(compilation) { | ||
expect(compilation.assets).to.have.key('tempfile1.txt'); | ||
expect(compilation.assets).not.to.have.key('tempfile2.txt'); | ||
}) | ||
.then(done) | ||
.catch(done); | ||
}); | ||
}); | ||
it('won\'t overwrite a file already in the compilation', function(done) { | ||
runForce({ | ||
patterns: [{ from: 'file.txt' }], | ||
existingAsset: 'file.txt', | ||
expectedAssetContent: 'existing' | ||
}) | ||
.then(done) | ||
.catch(done); | ||
}); | ||
describe('with directory in from', function() { | ||
it('can move a directory\'s contents to the root directory', function(done) { | ||
runEmit({ | ||
patterns: [{ from: 'directory' }], | ||
expectedAssetKeys: ['directoryfile.txt', 'nested/nestedfile.txt'] | ||
}) | ||
.then(done) | ||
.catch(done); | ||
}); | ||
it('can force overwrite of a file already in the compilation', function(done) { | ||
runForce({ | ||
patterns: [{ from: 'file.txt', force: true }], | ||
existingAsset: 'file.txt', | ||
expectedAssetContent: 'new' | ||
}) | ||
.then(done) | ||
.catch(done); | ||
}); | ||
it('can move a directory\'s contents to a new directory', function(done) { | ||
runEmit({ | ||
patterns: [{ from: 'directory', to: 'newdirectory' }], | ||
expectedAssetKeys: ['newdirectory/directoryfile.txt','newdirectory/nested/nestedfile.txt'] | ||
}) | ||
.then(done) | ||
.catch(done); | ||
}); | ||
it('adds the file to the watch list', function(done) { | ||
run({ | ||
patterns: [{ from: 'file.txt' }] | ||
}) | ||
.then(function(compilation) { | ||
var absFrom = path.join(HELPER_DIR, 'file.txt'); | ||
expect(compilation.fileDependencies).to.have.members([absFrom]); | ||
}) | ||
.then(done) | ||
.catch(done); | ||
}); | ||
it('can move a nested directory\'s contents to the root directory', function(done) { | ||
runEmit({ | ||
patterns: [{ from: 'directory/nested' }], | ||
expectedAssetKeys: ['nestedfile.txt'] | ||
}) | ||
.then(done) | ||
.catch(done); | ||
}); | ||
it('only include files that have changed', function(done) { | ||
runChange({ | ||
patterns: [{ from: 'tempfile1.txt' }, { from: 'tempfile2.txt' }], | ||
newFileLoc1: path.join(HELPER_DIR, 'tempfile1.txt'), | ||
newFileLoc2: path.join(HELPER_DIR, 'tempfile2.txt') | ||
}) | ||
.then(function(compilation) { | ||
expect(compilation.assets).to.have.key('tempfile1.txt'); | ||
expect(compilation.assets).not.to.have.key('tempfile2.txt'); | ||
}) | ||
.then(done) | ||
.catch(done); | ||
}); | ||
}); | ||
it('can move a nested directory\'s contents to a new directory', function(done) { | ||
runEmit({ | ||
patterns: [{ from: 'directory/nested', to: 'newdirectory' }], | ||
expectedAssetKeys: ['newdirectory/nestedfile.txt'] | ||
}) | ||
.then(done) | ||
.catch(done); | ||
}); | ||
describe('with directory in from', function() { | ||
it('can move a directory\'s contents to the root directory', function(done) { | ||
runEmit({ | ||
patterns: [{ from: 'directory' }], | ||
expectedAssetKeys: ['directoryfile.txt', 'nested/nestedfile.txt'] | ||
}) | ||
.then(done) | ||
.catch(done); | ||
}); | ||
it('won\'t overwrite a file already in the compilation', function(done) { | ||
runForce({ | ||
patterns: [{ from: 'directory' }], | ||
existingAsset: 'directoryfile.txt', | ||
expectedAssetContent: 'existing' | ||
}) | ||
.then(done) | ||
.catch(done); | ||
}); | ||
it('can use an absolute path to move a directory\'s contents to the root directory', function(done) { | ||
var absolutePath = path.resolve(HELPER_DIR, 'directory'); | ||
runEmit({ | ||
patterns: [{ from: absolutePath }], | ||
expectedAssetKeys: ['directoryfile.txt', 'nested/nestedfile.txt'] | ||
}) | ||
.then(done) | ||
.catch(done); | ||
}); | ||
it('can force overwrite of a file already in the compilation', function(done) { | ||
runForce({ | ||
patterns: [{ from: 'directory', force: true }], | ||
existingAsset: 'directoryfile.txt', | ||
expectedAssetContent: 'new' | ||
}) | ||
.then(done) | ||
.catch(done); | ||
}); | ||
it('can move a directory\'s contents to a new directory', function(done) { | ||
runEmit({ | ||
patterns: [{ from: 'directory', to: 'newdirectory' }], | ||
expectedAssetKeys: ['newdirectory/directoryfile.txt','newdirectory/nested/nestedfile.txt'] | ||
}) | ||
.then(done) | ||
.catch(done); | ||
}); | ||
it('adds the directory to the watch list', function(done) { | ||
run({ | ||
patterns: [{ from: 'directory' }] | ||
}) | ||
.then(function(compilation) { | ||
var absFrom = path.join(HELPER_DIR, 'directory'); | ||
expect(compilation.contextDependencies).to.have.members([absFrom]); | ||
}) | ||
.then(done) | ||
.catch(done); | ||
}); | ||
it('can move a nested directory\'s contents to the root directory', function(done) { | ||
runEmit({ | ||
patterns: [{ from: 'directory/nested' }], | ||
expectedAssetKeys: ['nestedfile.txt'] | ||
}) | ||
.then(done) | ||
.catch(done); | ||
}); | ||
it('only include files that have changed', function(done) { | ||
runChange({ | ||
patterns: [{ from: 'directory' }], | ||
newFileLoc1: path.join(HELPER_DIR, 'directory', 'tempfile1.txt'), | ||
newFileLoc2: path.join(HELPER_DIR, 'directory', 'tempfile2.txt') | ||
}) | ||
.then(function(compilation) { | ||
expect(compilation.assets).to.have.key('tempfile1.txt'); | ||
expect(compilation.assets).not.to.have.key('tempfile2.txt'); | ||
}) | ||
.then(done) | ||
.catch(done); | ||
}); | ||
}); | ||
it('can move a nested directory\'s contents to a new directory', function(done) { | ||
runEmit({ | ||
patterns: [{ from: 'directory/nested', to: 'newdirectory' }], | ||
expectedAssetKeys: ['newdirectory/nestedfile.txt'] | ||
}) | ||
.then(done) | ||
.catch(done); | ||
}); | ||
it('can use an absolute path to move a nested directory\'s contents to a new directory', function(done) { | ||
var absolutePath = path.resolve(HELPER_DIR, 'directory', 'nested'); | ||
runEmit({ | ||
patterns: [{ from: absolutePath, to: 'newdirectory' }], | ||
expectedAssetKeys: ['newdirectory/nestedfile.txt'] | ||
}) | ||
.then(done) | ||
.catch(done); | ||
}); | ||
it('won\'t overwrite a file already in the compilation', function(done) { | ||
runForce({ | ||
patterns: [{ from: 'directory' }], | ||
existingAsset: 'directoryfile.txt', | ||
expectedAssetContent: 'existing' | ||
}) | ||
.then(done) | ||
.catch(done); | ||
}); | ||
it('can force overwrite of a file already in the compilation', function(done) { | ||
runForce({ | ||
patterns: [{ from: 'directory', force: true }], | ||
existingAsset: 'directoryfile.txt', | ||
expectedAssetContent: 'new' | ||
}) | ||
.then(done) | ||
.catch(done); | ||
}); | ||
it('adds the directory to the watch list', function(done) { | ||
run({ | ||
patterns: [{ from: 'directory' }] | ||
}) | ||
.then(function(compilation) { | ||
var absFrom = path.join(HELPER_DIR, 'directory'); | ||
expect(compilation.contextDependencies).to.have.members([absFrom]); | ||
}) | ||
.then(done) | ||
.catch(done); | ||
}); | ||
it('only include files that have changed', function(done) { | ||
runChange({ | ||
patterns: [{ from: 'directory' }], | ||
newFileLoc1: path.join(HELPER_DIR, 'directory', 'tempfile1.txt'), | ||
newFileLoc2: path.join(HELPER_DIR, 'directory', 'tempfile2.txt') | ||
}) | ||
.then(function(compilation) { | ||
expect(compilation.assets).to.have.key('tempfile1.txt'); | ||
expect(compilation.assets).not.to.have.key('tempfile2.txt'); | ||
}) | ||
.then(done) | ||
.catch(done); | ||
}); | ||
}); | ||
describe('options', function() { | ||
describe('ignore', function() { | ||
it('ignores files when from is a file', function(done) { | ||
runEmit({ | ||
patterns: [ | ||
{ from: 'file.txt' }, | ||
{ from: 'directory/directoryfile.txt' } | ||
], | ||
options: { | ||
ignore: [ | ||
'file.*' | ||
] | ||
}, | ||
expectedAssetKeys: ['directoryfile.txt'] | ||
}) | ||
.then(done) | ||
.catch(done); | ||
}); | ||
it('ignores files when from is a directory', function(done) { | ||
runEmit({ | ||
patterns: [{ from: 'directory' }], | ||
options: { | ||
ignore: [ | ||
'*/nestedfile.*' | ||
] | ||
}, | ||
expectedAssetKeys: ['directoryfile.txt'] | ||
}) | ||
.then(done) | ||
.catch(done); | ||
}); | ||
it('ignores files with a certain extension', function(done) { | ||
runEmit({ | ||
patterns: [{ from: 'directory' }], | ||
options: { | ||
ignore: [ | ||
'*.txt' | ||
] | ||
}, | ||
expectedAssetKeys: [] | ||
}) | ||
.then(done) | ||
.catch(done); | ||
}); | ||
}); | ||
}); | ||
}); |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
23387
578
102
0
4
2
+ Addedminimatch@^3.0.0