Official Projmate Filters


Projmate supported filters.

addHeaderAdds buffer header.
catConcatenates one or more buffers.
coffeeCompiles CoffeeScript.
commonJsifyCreates browser-compatible CommonJS package. Based on stitch.
functoidCreate ad-hoc filters.
lessCompile less scripts.
loadFilesLoads files into buffers.
recessRecess CSS tool
templateConsolidate template engines (defaults to underscore)
uglifyJavascript minifier, beautifier
writeFilesWrites 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

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(srcFileoptions) {
    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.