Browserify transform for ractive components (and by extension templates) which allows for compilation of embedded scripts and styles!
Switch branches/tags
Nothing to show
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
compilers
src
test
.gitignore
.travis.yml
Gruntfile.coffee
README.md
index.js
package.json

README.md

Ractiveify Build Status

Browserify transform and general ractive component parser (see ractiveify.parse below).

Browserify transform for ractive components (and by extension templates) which allows for compilation of embedded scripts and styles!

This module plays very nicely with debowerify and deamdify! I'm using it in my current project. Which is why I don't have any tests...yet...

However! Debowerify (the original) filters out extensions. Which is why I made my own fork at norcalli/debowerify which accepts an extensions option (debowerify.extensions.push('ract')). This is the only way that debowerify will work with ractive components which have been require'd.

You can include this in your package.json by simply switching the version to norcalli/debowerify like this:

"dependencies": {
  ...
  "debowerify": "norcalli/debowerify"
  ...
}

Quick Tip

In case you didn't know, you could do:

var ractiveify = require('ractiveify');

ractiveify.extensions.push('ractive');

var b = browserify();
b.transform(ractiveify);
b.bundle();

Example component file

'messages.ract'

{{#each filter(messages)}}
<p>{{.}}</p>
{{/each}}

<style type='text/scss'>
$base-color: #abc;

.p {
  font-color: $base-color;
}
</style>

<script type='text/ls'>
component.exports =
  init: ->
  data:
    filter: -> [.. for it when /monkey/i != ..]
    messages: ['Cat', 'Dog', 'Squirrel', 'Monkey', 'Mankey']
</script>

var messageTemplate = require('./messages.ract');

messageTemplate will then be populated as such:

messageTemplate == {
  template: ...
  css: ...
  init: function() {}
  data:
    filter: ...
    messages: ...

The transform will populate the template property with the markup, the css property with the compiled output of your <style> tags and will use the rest as parameters for messageTemplate.

You can then use the plugin by:

var MessageTemplate = Ractive.extend(require('./messages.ract'));

var messageComponent = MessageTemplate({
  el: container,
  data:
    messages: ['My', 'Better', 'Messages']
});

Transform programmatic usage, API, and adding compilers

I will soon be adding the option to specify these things in package.json, where compilers would be specified with filepaths.

var ractiveify = require('ractiveify');

Initialization

ractiveify.parse(filename, scriptSource, callback(errors, data))

I've exposed the parse method that I use in case anyone wants to use this plugin as the basis for anything else as well.

  • filename is mostly unimportant. It is passed forward to the compilers.

  • scriptSource is the actual file contents of the component. Obviously required.

  • callback is should be of the format function(errors, data){}

ractiveify.removeUnsupported

Default:

ractiveify.removeUnsupported = true

A <script> tag without a type is assumed to be text/javascript and a <style> tag without a type is assumed to be test/css.

If a type can't be matched in ractiveify.compilers, then removeUnsupported = true means that these tags will not show up in the output.

ractiveify.extensions

File extensions recognized by the transform.

Default:

ractiveify.extensions = ['ract', 'rtv']

ractiveify.compilers

Currently I added support for coffeescript and livescript.

Default:

ractiveify.compilers = {
  'text/livescript': livescript,
  'text/ls': livescript,
  'text/coffeescript': coffeescript,
  'text/coffee': coffeescript,
  'text/coffee-script': coffeescript
}

Just register the mime-type you would use in the type attribute for the script and then add the function to compile it.

The format:

ractiveify.compilers['text/butt'] = function(filename, scriptSource) {...}

Example addon for scss!

require! {
  'path'
  'node-sass'
}

ractiveify.compilers['text/scss'] = (file, data) ->
  sass.renderSync {data: data, includePaths: ['assets/stylesheets', path.dirname file]}