node package manager



Projmate supported filters.


Filter Description
addHeader Adds buffer header.
cat Concatenates one or more buffers.
coffee Compiles CoffeeScript.
commonJsify Creates browser-compatible CommonJS package. Based on stitch.
functoid Create ad-hoc filters.
less Compile less scripts.
loadFiles Loads files into buffers.
preproc Preprocessor
recess Recess CSS tool
template Consolidate template engines (defaults to underscore)
uglify Javascript minifier, beautifier
writeFiles Writes files to file system.


A FileAsset is a file based asset. Assets, for now, are from the local file system but there is no reason an asset could not from the cloud via a URL, or a database.

A Filter is reponsible for processing a single asset.

A TaskProcessor processes one or more assets and directly set properties on a task. For example commonJisfy, loadFiles and writeFiles are task processors as they manipulate multiple assets. loadFiles also sets the initial assets for a task.

Projmate filter v GruntJS plugin

Projmate filter

module.exports = (Projmate) ->
  class Coffee extends Projmate.Filter
    extnames: ".coffee"
    outExtname: ".js"
    process: (asset, options, cb) ->
        js = coffee.compile(asset.textoptions)
        cb nulljs
      catch ex
        cb ex

GruntJS plugin

module.exports = function(grunt) {
  'use strict';
  grunt.registerMultiTask('coffee', 'Compile CoffeeScript files into JavaScript', function() {
    var path = require('path');
    var options = this.options({
      bare: false,
      separator: grunt.util.linefeed
    if (options.basePath || options.flatten) {'Experimental destination wildcards are no longer supported. please refer to README.');
    grunt.verbose.writeflags(options, 'Options');
    this.files.forEach(function(f) {
      var output = f.src.filter(function(filepath) {
        // Warn on and remove invalid source files (if nonull was set). 
        if (!grunt.file.exists(filepath)) {
          grunt.log.warn('Source file "' + filepath + '" not found.');
          return false;
        } else {
          return true;
      }).map(function(filepath) {
        return compileCoffee(filepath, options);
      if (output.length < 1) {
        grunt.log.warn('Destination not written because compiled files were empty.');
      } else {
        grunt.file.write(f.dest, output);
        grunt.log.writeln('File ' + f.dest + ' created.');
  var compileCoffee = function(srcFile, options) {
    options = grunt.util._.extend({filename: srcFile}, options);
    if (require('path').extname(srcFile) === '.litcoffee') {
      options.literate = true;
    var srcCode =;
    try {
      return require('coffee-script').compile(srcCode, options);
    } catch (e) {
      grunt.log.error(e);'CoffeeScript failed to compile.');


Copyright (c) 2013 Mario Gutierrez

See the file LICENSE for copying permission.