Research
Security News
Quasar RAT Disguised as an npm Package for Detecting Vulnerabilities in Ethereum Smart Contracts
Socket researchers uncover a malicious npm package posing as a tool for detecting vulnerabilities in Etherium smart contracts.
broccoli-funnel
Advanced tools
Broccoli plugin that allows you to filter files selected from an input node down based on regular expressions.
broccoli-funnel is a Broccoli plugin that allows you to filter and move files around within a Broccoli build pipeline. It is commonly used to include or exclude specific files or directories, rename files, and restructure the output directory tree.
Filtering Files
This feature allows you to filter files based on a pattern. In this example, only JavaScript files from the 'src' directory are included in the output.
const Funnel = require('broccoli-funnel');
const filteredTree = new Funnel('src', {
include: ['**/*.js']
});
Excluding Files
This feature allows you to exclude files based on a pattern. In this example, all test JavaScript files are excluded from the 'src' directory.
const Funnel = require('broccoli-funnel');
const filteredTree = new Funnel('src', {
exclude: ['**/*.test.js']
});
Renaming Files
This feature allows you to rename files during the build process. In this example, 'index.html' is renamed to 'main.html'.
const Funnel = require('broccoli-funnel');
const renamedTree = new Funnel('src', {
getDestinationPath: function(relativePath) {
if (relativePath === 'index.html') {
return 'main.html';
}
return relativePath;
}
});
Moving Files
This feature allows you to move files to a different directory. In this example, all files from the 'src' directory are moved to the 'output' directory.
const Funnel = require('broccoli-funnel');
const movedTree = new Funnel('src', {
destDir: 'output'
});
broccoli-merge-trees is a Broccoli plugin that allows you to merge multiple trees into a single tree. It is useful for combining the output of different Broccoli plugins. Unlike broccoli-funnel, which focuses on filtering and moving files, broccoli-merge-trees is used for combining multiple sets of files.
broccoli-stew is a collection of Broccoli plugins that provide various utilities for working with Broccoli trees. It includes functionality for debugging, filtering, and transforming files. While broccoli-funnel focuses on filtering and moving files, broccoli-stew offers a broader range of utilities.
broccoli-concat is a Broccoli plugin that concatenates multiple files into a single file. It is useful for bundling JavaScript or CSS files. Unlike broccoli-funnel, which is used for filtering and moving files, broccoli-concat is specifically designed for concatenation.
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.
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:
const funnel = require('broccoli-funnel');
const cssFiles = funnel('src/css');
/*
cssFiles contains the following files:
├── reset.css
└── todos.css
*/
// export the node for Broccoli to begin processing
module.exports = cssFiles;
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:
const funnel = require('broccoli-funnel');
const merge = require('broccoli-merge-trees');
// root of our source files
const projectFiles = 'src';
/* get a new node of only files in the 'src/css' directory
cssFiles contains the following files:
├── reset.css
└── todos.css
*/
const cssFiles = funnel(projectFiles, {
srcDir: 'css'
});
/* get a new node of only files in the 'src/icons' directory
imageFiles contains the following files:
├── check-mark.png
└── logo.jpg
*/
const imageFiles = funnel(projectFiles, {
srcDir: 'icons'
});
module.exports = merge([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:
const funnel = require('broccoli-funnel');
const cssFiles = funnel('src/css', {
destDir: 'build'
});
/*
cssFiles contains the following files:
build/
├── reset.css
└── todos.css
*/
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:
const funnel = require('broccoli-funnel');
// finds all files that match /todo/ and moves them
// the destDir
const todoRelatedFiles = funnel('src', {
include: ['**/todo*']
});
/*
todoRelatedFiles contains the following files:
.
├── css
│ └── todos.css
└── javascript
└── todo.js
*/
module.exports = todoRelatedFiles;
exclude
{Array of Glob Strings|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:
const funnel = require('broccoli-funnel');
// finds all files in 'src' EXCEPT `todo.js` in any directory
// or sub-directory and adds them to a node.
const nobodyLikesTodosAnyway = funnel('src', {
exclude: ['**/todo.js']
});
/*
nobodyLikesTodosAnyway contains the following files:
.
├── css
│ └── reset.css
├── icons
│ ├── check-mark.png
│ └── logo.jpg
└── javascript
└── app.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:
const funnel = require('broccoli-funnel');
// finds these specific files and moves them to the destDir
const someFiles = funnel('src', {
files: ['css/reset.css', 'icons/check-mark.png']
});
/*
someFiles contains the following 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
:
const node = funnel('packages/ember-metal/lib', {
destDir: 'ember-metal',
getDestinationPath: function(relativePath) {
if (relativePath === 'lib/main.js') {
return 'ember-metal.js';
}
return relativePath;
}
});
If you desire to extend funnel follow the below snippet
const { Funnel } = require('broccoli-funnel');
class CustomFunnel extends Funnel {
// cutstom implementation
}
I know, right?
Running the tests:
npm install
npm test
This project is distributed under the MIT license.
FAQs
Broccoli plugin that allows you to filter files selected from an input node down based on regular expressions.
The npm package broccoli-funnel receives a total of 605,495 weekly downloads. As such, broccoli-funnel popularity was classified as popular.
We found that broccoli-funnel demonstrated a not healthy version release cadence and project activity because the last version was released a year ago. It has 3 open source maintainers collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Research
Security News
Socket researchers uncover a malicious npm package posing as a tool for detecting vulnerabilities in Etherium smart contracts.
Security News
Research
A supply chain attack on Rspack's npm packages injected cryptomining malware, potentially impacting thousands of developers.
Research
Security News
Socket researchers discovered a malware campaign on npm delivering the Skuld infostealer via typosquatted packages, exposing sensitive data.