Broccoli Funnel
Given an input node, the Broccoli Funnel plugin returns a new node with only a
subset of the files from the input node. The files can be moved to different
paths. You can use regular expressions to select which files to include or
exclude.
Documentation
new Funnel(inputNode, options)
inputNode
{Single node}
A Broccoli node (formerly: "tree"). A node in Broccoli can be either a string
that references a directory in your project or a node object returned from
running another Broccoli plugin.
If your project has the following file structure:
.
├── Brocfile.js
└── src/
├── css/
│ ├── reset.css
│ └── todos.css
├── icons/
│ ├── check-mark.png
│ └── logo.jpg
└── javascript/
├── app.js
└── todo.js
You can select a subsection of the tree via Funnel:
var Funnel = require('broccoli-funnel');
var cssFiles = new Funnel('src/css');
module.exports = cssFiles;
Options
srcDir
{String}
A string representing the portion of the input node to start the funneling
from. This will be the base path for any include
/exclude
regexps.
Default: '.'
, the root path of the input node.
If your project has the following file structure:
.
├── Brocfile.js
└── src/
├── css/
│ ├── reset.css
│ └── todos.css
├── icons/
│ ├── check-mark.png
│ └── logo.jpg
└── javascript/
├── app.js
└── todo.js
You can select a subsection of the node via Funnel:
var Funnel = require('broccoli-funnel');
var MergeTrees = require('broccoli-merge-trees');
var projectFiles = 'src';
var cssFiles = new Funnel(projectFiles, {
srcDir: 'css'
});
var imageFiles = new Funnel(projectFiles, {
srcDir: 'icons'
});
module.exports = new MergeTrees([cssFiles, imageFiles]);
destDir
{String}
A string representing the destination path that filtered files will be copied to.
Default: '.'
, the root path of input node.
If your project has the following file structure:
.
├── Brocfile.js
└── src/
├── css/
│ ├── reset.css
│ └── todos.css
├── icons/
│ ├── check-mark.png
│ └── logo.jpg
└── javascript/
├── app.js
└── todo.js
You can select a subsection of the directory structure via Funnel and copy it to a new location:
var Funnel = require('broccoli-funnel');
var cssFiles = new Funnel('src/css', {
destDir: 'build'
});
module.exports = cssFiles;
allowEmpty
{Boolean}
When using srcDir
/destDir
options only (aka no filtering via include
/exclude
options), if the srcDir
were missing an error would be thrown.
Setting allowEmpty
to true, will prevent that error by creating an empty directory at the destination path.
include
{Array of GlobStrings|RegExps|Functions}
One or more matcher expression (regular expression, glob string, or function). Files within the node whose names match this
expression will be copied (with the location inside their parent directories
preserved) to the destDir
.
Default: []
.
If your project has the following file structure
.
├── Brocfile.js
└── src/
├── css/
│ ├── reset.css
│ └── todos.css
├── icons/
│ ├── check-mark.png
│ └── logo.jpg
└── javascript/
├── app.js
└── todo.js
You can select files that match a glob expression and copy those subdirectories to a
new location, preserving their location within parent directories:
var Funnel = require('broccoli-funnel');
var todoRelatedFiles = new Funnel('src', {
include: ['todo/**/*']
});
module.exports = todoRelatedFiles;
exclude
{Array of Glob Strings|Glob String|Function}
One or more matcher expression (regular expression, glob string, or function). Files within the node whose names match this
expression will not be copied to the destDir
if they otherwise would have
been.
Note, in the case when a file matches both an include and exclude pattern,
the exclude pattern wins
Default: []
.
If your project has the following file structure:
.
├── Brocfile.js
└── src/
├── css/
│ ├── reset.css
│ └── todos.css
├── icons/
│ ├── check-mark.png
│ └── logo.jpg
└── javascript/
├── app.js
└── todo.js
You can select files that match a glob expression and exclude them from copying:
var Funnel = require('broccoli-funnel');
var nobodyLikesTodosAnyway = new Funnel('src', {
exclude: ['**/todo.js']
});
module.exports = nobodyLikesTodosAnyway;
files
{Array of Strings}
One or more relative file paths. Files within the node whose relative paths match
will be copied (with the location inside their parent directories
preserved) to the destDir
.
Default: []
.
If your project has the following file structure
.
├── Brocfile.js
└── src/
├── css/
│ ├── reset.css
│ └── todos.css
├── icons/
│ ├── check-mark.png
│ └── logo.jpg
└── javascript/
├── app.js
└── todo.js
You can select a specific list of files copy those subdirectories to a
new location, preserving their location within parent directories:
var Funnel = require('broccoli-funnel');
var someFiles = new Funnel('src', {
files: ['css/reset.css', 'icons/check-mark.png']
});
module.exports = someFiles;
getDestinationPath
{Function}
This method will get called for each file, receiving the currently processing
relativePath
as its first argument. The value returned from
getDestinationPath
will be used as the destination for the new node. This is
a very simple way to rename files or move them from one path to another (replacing the need
for broccoli-file-mover
for example).
The return value of this method is cached for each input file. This means that
getDestinationPath
will only be called once per relativePath
.
In the following example, getDestinationPath
is used to move main.js
to
ember-metal.js
:
var node = new Funnel('packages/ember-metal/lib', {
destDir: 'ember-metal',
getDestinationPath: function(relativePath) {
if (relativePath === 'lib/main.js') {
return 'ember-metal.js';
}
return relativePath;
}
});
ZOMG!!! TESTS?!?!!?
I know, right?
Running the tests:
npm install
npm test
License
This project is distributed under the MIT license.