How can I use grunt-contrib-watch and grunt-contrib-coffee to compile CoffeeScript only as needed?

coffeescript, grunt-contrib-coffee, grunt-contrib-watch, gruntjs

Solution

Try to add something like this to your c task

 coffee:
  all:
    filter: (filepath) ->
        fs = require('fs')
        now = new Date()
        modified =  fs.statSync(filepath).mtime
        return (now - modified) < 10000 # or another difference in millyseconds

Read more in documentation

Problem

I'd like to run coffee lint and coffee compile on only the single file that I'm saving. There are hundreds of CoffeeScript files in my project, and compiling all of them takes too much time. Here's my Gruntfile: ``` module.exports = (grunt) -> grunt.initConfig pkg: grunt.file.readJSON 'package.json' coffee: all: expand: true bare: true cwd: 'src/coffeescript/' src: '**/*.coffee' dest: 'public/js/compiled' ext: '.js' coffeelint: all: ['src/coffeescript/**/*.coffee'] watch: coffeescript: files: ['src/**/*.coffee'] tasks: ['coffeelint', 'coffee'] options: spawn: false grunt.event.on 'watch', (action, filepath) -> grunt.config(['coffeelint', 'all'], filepath) grunt.config(['coffee', 'all'], filepath) grunt.loadNpmTasks 'grunt-coffeelint' grunt.loadNpmTasks 'grunt-contrib-coffee' grunt.loadNpmTasks 'grunt-contrib-watch' grunt.registerTask 'default', ['coffeelint', 'coffee', 'watch'] ``` The coffeelint task runs successfully only on the changed file. The coffee compilation doesn't produce any JS files, even though grunt says it runs. Here's the output after saving a single coffee file: ``` OK >> File "src/coffeescript/app.coffee" changed. Running "coffeelint:all" (coffeelint) task >> 1 file lint free. Running "coffee:all" (coffee) task Running "watch" task Completed in 0.009s at Sat Feb 01 2014 13:10:07 GMT-0600 (CST) - Waiting... ``` What's wrong here? Any help would be greatly appreciated! Update: Here's a working example: ``` module.exports = (grunt) -> fs = require 'fs' isModified = (filepath) -> now = new Date() modified = fs.statSync(filepath).mtime return (now - modified) < 10000 grunt.initConfig coffee: options: sourceMap: true bare: true force: true # needs to be added to the plugin all: expand: true cwd: 'src/coffeescript/' src: '**/*.coffee' dest: 'public/js/compiled' ext: '.js' modified: expand: true cwd: 'src/coffeescript/' src: '**/*.coffee' dest: 'public/js/compiled' ext: '.js' filter: isModified coffeelint: options: force: true all: expand: true cwd: 'src/coffeescript/' src: '**/*.coffee' modified: expand: true cwd: 'src/coffeescript/' src: '**/*.coffee' filter: isModified watch: coffeescript: files: ['src/**/*.coffee'] tasks: ['coffeelint:modified', 'coffee:modified'] grunt.loadNpmTasks 'grunt-coffeelint' grunt.loadNpmTasks 'grunt-contrib-coffee' grunt.loadNpmTasks 'grunt-contrib-watch' grunt.registerTask 'default', ['coffeelint:all', 'coffee:all', 'watch'] ```

Original source