Normalize bower files so checked in structure is consistent.
Switch branches/tags
Nothing to show
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Type Name Latest commit message Commit time
Failed to load latest commit information.

gulp-bower-normalize Build Status

Use rules in the bower.json or implicit rules to normalize the files being copied out of bower_components so that a consistent and clean version of the bower dependencies can be checked into the repo. This is intended to work with main-bower-files.


npm install --save-dev gulp-bower-normalize


Designed to work with main-bower-files as so:

gulp.task('default', function() {
    var bower = require('main-bower-files');
    var bowerNormalizer = require('gulp-bower-normalize');
    return gulp.src(bower(), {base: './bower_components'})
        .pipe(bowerNormalizer({bowerJson: './bower.json'}))


    name and otherstuff
    "dependencies": {
        "dependency1": "~1.0.1"
        "dependency2": "~1.0.1"
        "dependency3": "~1.0.1"
        "dependency4": "~1.0.1"
    "overrides": {
        // Muli allows one normalize definition to span multiple dependencies
        // NOTE: This is first one in wins for the multi list and will always
        // defer to the overrides.
        "normalizeMulti": [
                "dependencies": ["dependency1", "dependency2"],
                "normalize": {
                    "img": ["*.jpeg", "*.png", "*.jpg"],
                    "font": ["*.ttf", "*.woff2"]
                "dependencies": ["dependency2", "dependency3"],
                "normalize": {
                    // Note since dependency3 defines js, it won't get this definition
                    "js": ["*.js", "*.less"],
                "dependencies": ["dependency2"],
                "normalize": {
                    // Note since dependency2 already had js defined by the multi, it won't get this definition
                    "js": ["*.*"],
        // Implicitly normalizes this file by file extension 'dependency1/js/some.js'
        "dependency1": {
            "main": "some.js"
        // Implicitly organized into 'dependency2/js/some.js' 'dependency2/js/some.js'
        "dependency2": {
            "main": ["some.js", "some.css"]
        // Explicitly organized into 'dependency3/js/some.js', 'dependency3/css/some.ext', 'dependency3/css/some.css'
        "dependency3": {
            "main": ["some.js", "some.ext", "some.css"],
            "normalize": {
                "js": "*.js",
                "css": ["*.ext", "*.css"]
        } // dependency4 is implicitly organized into 'dependency4/<ext>/<file>

Note: Comments are not valid JSON, so if you're copying this, you'll need to remove them.




Type: string Default: process.cwd()

Path to search for the bower.json file in.


Type: string Default: ./bower.json

Path to bower.json that overrides will come from. This should be relative to options.BasePath.


Type: boolean Default: false

Option to remove the component level folders. This would turn /lib/jquery/js/jquery.js into /lib/js/jquery.js.

Note: If your components have files with the same name then only one of them will be included in the results.


Type: boolean Default: false

Option to put the type folder on top of the hierarchy. This would turn /lib/jquery/js/jquery.js into /lib/js/jquery/jquery.js.


Type: boolean Default: false

This option allows a multi-level path on the normalization destination. This allows matching similar to the following:

 "dependency7": {
      "main": ["some.js", "some/other.js"],
      "normalize": {
        "js": "*.js",
        "js/some": "**/some/*.js"

Note: This will not work in conjunction with the flatten option.

Frequently Asked Questions

Unexpected folder normalization

Be aware of your JSON keys of the normalize property of your bower.json.
Only unique JSON keys could be parsed correctly into your expected destination folder structure.


This could lead to unexpected normalization

"normalize": {
  ".": "**/*.scss",
  ".": "**/*.js"

The right expression should be

"normalize": {
  ".": ["**/*.scss", "**/*.js"]


MIT © Myles Bostwick