var Browserify = require('browserify'); var bresolve = require('browser-resolve'); patchResolve(); module.exports = function (grunt) { grunt.initConfig({ pkg: grunt.file.readJSON('package.json'), outputFolder: ".", browserify: { main: { src: ['index.js'], dest: '<%= outputFolder %>/<%= pkg.name %>.js', options: { browserifyOptions: { standalone: '<%= pkg.name %>' }, banner: '/*! <%= pkg.name %> <%= pkg.version %> */\n', alias: { "jsonpath": "./index.js" }, require: [ /** * When running in Node, we require('./aesprim') and that module takes care of monkey-patching esprima * using resolve, path finding, etc... * Anyways, Browserify doesn't support "resolve", so we need to trick the module. We'll actually be * returning a verbatim, non-modified "esprima" when the code runs require('./aesprim'). * That is ok because we will modify the "esprima" source code right after the bundle process, via * the postBundleCB callback. */ ["esprima", {expose: "./aesprim"}] ], ignore: [ 'file', 'system', 'source-map', 'estraverse', 'escodegen', 'underscore', 'reflect', 'JSONSelect', './lib/aesprim.js' //'assert' //can't remove because of lib/index.js, ], postBundleCB: function(err, src, next) { /** * This is ugly, but we need to make "esprima" understand '@' as a valid character. * It's either this or bundle a copy of the library with those few bytes of changes. */ src = src.toString("utf8").replace(/(function isIdentifierStart\(ch\) {\s+return)/m, '$1 (ch == 0x40) || '); next(err, new Buffer(src, "utf8")); } } } }, uglify: { options: { banner: '/*! <%= pkg.name %> <%= pkg.version %> */\n' }, build: { src: '<%= outputFolder %>/<%= pkg.name %>.js', dest: '<%= outputFolder %>/<%= pkg.name %>.min.js' } } }); grunt.loadNpmTasks('grunt-browserify'); grunt.loadNpmTasks('grunt-contrib-uglify') grunt.registerTask('default', ['browserify', 'uglify']); }; function patchResolve() { var _createDeps = Browserify.prototype._createDeps; Browserify.prototype._createDeps = function() { var returnValue = _createDeps.apply(this, arguments); this._bresolve = function(id, opts, cb) { opts.browser = 'alias'; return bresolve(id, opts, cb); }; return returnValue; } }