assets-pipeline

Smart assets pipeline for node.js.

assets-pipeline

Smart assets pipeline for node.js. Minify, compile and deploy Javascript, CSS and Less locally, to S3 or via SCP. Cachebuster included.

Usage

var Assets = require("assets-pipeline").Assets;
 
var assets = new Assets({
    js: { // all .js files are minified using UglifyJS 
        app: [ // files are merged to "js/app.js" 
            "js/myapp.js"
        ],
        lib: [ // files are merged to "js/lib.js" 
            "js/jquery.js",
            "js/angular.js"
        ]
    },
    css: { // all .css files are minified using clean-css 
        app: [ // "css/app.css" 
            "css/theme.css"
        ]
    },
    less: { // all .less files are converted to .css 
        lib: [ // "css/lib.css" 
            "less/theme.less"
        ]
    },
    statics: [ // static files are copied recursively 
        "favico.ico", // a file 
        "img" // a directory 
    ],
    assetsDirectory: __dirname + "/assets", // where our source files are 
    deployment: {
        method: "cp",
        prefix: "/opt/assets/"
    },
    production: process.env.NODE_ENV === 'production', // render sources or deployed 
    localPrefix: '/assets', // sources are rendered with this prefix 
    productionPrefix: 'http://mycdn.com/myapp', // deployed are rendered with this prefix 
    useCachebuster: true // use git versin or Date() as css and js files suffix ("app.js" -> "app-12312312312312.js"). default false 
    // lessScriptUrl: '/assets/js/less.js' // defaults to a cdn file 
});
 
// "/assets/app.js" or "http://mycdn.com/myapp/app.js" 
console.log(assets.jsToHtml('app'));
console.log(assets.cssToHtml('app'));
console.log(assets.lessToHtml('app'));
console.log(assets.staticUrl('favicon.ico'));
 
assets.deploy(function(err) {
  if (err) {
    console.log(err.stack)
    console.error(err);
    console.log("Not deployed");
  } else {
    console.log("Deployed!");
  }
});
 

Deployers

  • cp

Copy files locally.

deployment: {
   method: "cp",
   prefix: "/opt/myapp/assets", // directory where assets are uploaded 
}
  • scp

Copy files remotely (See scp2 npm module for more configuration options).

deployment: {
   method: "scp",
   prefix: "/opt/myapp/assets" // directory on the server where assets are uploaded 
   host: "mycdn.com",
   username: "me",
   privateKey: require('fs').readFileSync("/Users/me/.ssh/id_rsa"),
}
  • s3

Upload files to S3 (See knox npm module for more configuration options). The deployer will guess MIME type of each file and add a relevant Content-Type header.

deployment: {
   method: "s3",
   key: process.env.S3_KEY,
   secret: process.env.S3_SECRET,
   bucket: 'my-cdn-bucket',
   prefix: '/assets', // prefix (directory) added to every file name. 
   headers: {'x-amz-meta-extra-header': 'bar'}, // optional S3 metadata 
   gzipContentTypes: ['text/css', 'application/javascript'], // gzip content of the files with the following type before uploading. This will also add 'Content-Encoding: gzip' to these files. By default the list is empty (nothing is gzipped). 
}

Example

There is an example express application in examples directory to try it out.