Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add prepend option to BrowserifyAsset and update readme #109

Closed
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
62 changes: 62 additions & 0 deletions lib/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -182,6 +182,68 @@ as the `filename` argument should pull in any requires you need.
* `debug` (defaults to false): enables the browserify debug option.
* `compress` (defaults to false): whether to run the javascript through a minifier.
* `extensionHandlers` (defaults to []): an array of custom extensions and associated handler function. eg: `[{ ext: 'handlebars', handler: handlebarsCompilerFunction }]`
* `prepend` (optional): prepend another javascript asset (e.g. AngularTemplatesAsset or JadeAsset) to the browserify bundled javascript.


##### Prepend Example:
_(using `rack.Rack([])` - multiple assets syntax)_

In your assets.js:
```javascript
var rack = require('asset-rack');
var angularTemplatesAsset = new rack.AngularTemplatesAsset({
url: '/templates.js',
dirname: __dirname + '/relative/path/to/templates'
});

var assets = rack.Rack([
new rack.BrowserifyAsset({
url: '/app.js',
filename: __dirname + '/myAnglarApp/app.js',
prepend: angularTemplatesAsset
});
]);

module.exports = assets;
```

In your client (angular in this case) index.html:
```html
<script src='/app.js' type='text/javascript'></script>
```

##### Prepend Example - prepend multiple assets:
_(using `rack.Rack([])` - multiple assets syntax)_

In your assets.js:
```javascript
var rack = require('asset-rack');
var widgetTemplates = new rack.AngularTemplatesAsset({
url: '/widget/templates.js',
dirname: __dirname + '/relative/path/to/widget/templates'
});
var sharedTemplates = new rack.AngularTemplatesAsset({
url: '/shared/templates.js',
dirname: __dirname + '/relative/path/to/shared/templates'
});

var assets = rack.Rack([
new rack.BrowserifyAsset({
url: '/app.js',
filename: __dirname + '/myAnglarApp/app.js',
prepend: [widgetTemplates, sharedTemplates]
});
]);

module.exports = assets;
```

In your client (angular in this case) index.html:
```html
<script src='/app.js' type='text/javascript'></script>
```

_Reference [AngularTemplatesAsset](#angulartemplatesasset) or [JadeAsset](#jadeasset) for more details specific to either._

### SnocketsAsset (js/coffeescript)

Expand Down
54 changes: 36 additions & 18 deletions lib/modules/browserify.coffee
Original file line number Diff line number Diff line change
Expand Up @@ -2,28 +2,46 @@ fs = require 'fs'
pathutil = require 'path'
browserify = require 'browserify'
uglify = require('uglify-js')
Q = require('q')
Asset = require('../index').Asset

class exports.BrowserifyAsset extends Asset
mimetype: 'text/javascript'

create: (options) ->
@filename = options.filename
@toWatch = pathutil.dirname pathutil.resolve @filename
@require = options.require
@debug = options.debug or false
@compress = options.compress
@compress ?= false
@extensionHandlers = options.extensionHandlers or []
agent = browserify watch: false, debug: @debug
for handler in @extensionHandlers
agent.register(handler.ext, handler.handler)
agent.addEntry @filename
agent.require @require if @require
if @compress is true
uncompressed = agent.bundle()
@contents = uglify.minify(uncompressed, {fromString: true}).code
@emit 'created'
else
@emit 'created', contents: agent.bundle()
@filename = options.filename
@toWatch = pathutil.dirname pathutil.resolve @filename
@require = options.require
@debug = options.debug or false
@compress = options.compress
@prependAsset = options.prepend
@compress ?= false
@extensionHandlers = options.extensionHandlers or []
@agent = browserify watch: false, debug: @debug
for handler in @extensionHandlers
@agent.register(handler.ext, handler.handler)
@agent.addEntry @filename
@agent.require @require if @require
delimiter = '\n;\n'

if @prependAsset
promises = []
unless @prependAsset instanceof Array
@prependAsset = [@prependAsset]
@prependAsset.forEach (asset)=>
deferred = Q.defer()
promises.push deferred.promise
asset.on 'complete', ()->
deferred.resolve asset.contents
Q.all(promises).done (contentsArray)=>
@finish(contentsArray.join(delimiter) + delimiter)
else
@finish('')

finish: (prependContents)->
uncompressed = prependContents + @agent.bundle()
if @compress is true
@contents = uglify.minify(uncompressed, {fromString: true}).code
@emit 'created'
else
@emit 'created', contents: uncompressed
3 changes: 2 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,8 @@
"underscore": "~1.5.2",
"coffee-script": "~1.6.3",
"markdown": "~0.5.0",
"node-sassy": "~0.0.1"
"node-sassy": "~0.0.1",
"q": "~0.9.7"
},
"devDependencies": {
"express.io": "1.1.8",
Expand Down