less-watcher
Version:
A script that can watch a directory and recompile your .less scripts if they change.
98 lines (77 loc) • 3.64 kB
text/coffeescript
# **less-watcher** is a script that can watch
# a directory and recompile your [.less styles](http://lesscss.org/) if they change.
#
# It's very useful for development as you don't need to think about
# recompiling your Less files. Search is done in a recursive manner
# so sub-directories are handled as well.
#
# Usage:
# less-watcher -p [prefix] -d [directory]
#
# Options:
# -d Specify which directory to scan. [default: "."]
# -p Which prefix should the compiled files have? Default is style.less will be compiled to .less.style.css. [default: ".less."]
# -h Prints help [boolean]
#
# Installing less-watcher is easy with [npm](http://npmjs.org/):
#
# sudo npm install less-watcher
#
# Run this to watch for changes in the current working directory:
#
# less-watcher
#
# Run this to watch for changes in a specified directory:
#
# less-watcher -d ~/Desktop/my_project
#
# less-watcher requires:
#
# * [node.js](http://nodejs.org/)
# * [find](http://en.wikipedia.org/wiki/Find)
# * [watcher_lib](https://github.com/amix/watcher_lib)
# * [optimist](https://github.com/amix/optimist)
# Specify the command line arguments for the script (using optimist)
usage = "Watch a directory and recompile .less styles if they change.\nUsage: less-watcher -p [prefix] -d [directory]."
specs = require('optimist')
.usage(usage)
.default('d', '.')
.describe('d', 'Specify which directory to scan.')
.default('t', '.')
.describe('t', 'Specify which directory to compile.')
.default('f', '*.less')
.describe('f', 'Specify which file to compile.')
.default('p', '.less.')
.describe('p', 'Which prefix should the compiled files have? Default is style.less will be compiled to .less.style.css.')
.boolean('h')
.describe('h', 'Prints help')
# Handle the special -h case
if specs.parse(process.argv).h
specs.showHelp()
process.exit()
else
argv = specs.argv
# Use `watcher-lib`, a library that abstracts away most of the implementation details.
# This library also makes it possible to implement any watchers (see coffee-watcher for an example).
watcher_lib = require 'watcher_lib'
# Searches through a directory structure for *.less files using `find`.
# For each .less file it runs `compileIfNeeded` to compile the file if it's modified.
findLessFiles = (dir) ->
watcher_lib.findFiles('*.less', dir, compileIfNeeded)
# Keeps a track of modified times for .less files in a in-memory object,
# if a .less file is modified it recompiles it using compileLessScript.
#
# When starting the script all files will be recompiled.
WATCHED_FILES = {}
compileIfNeeded = (file) ->
watcher_lib.compileIfNeeded(WATCHED_FILES, file, compileLessScript)
# Compiles a file using `lessc`. Compilation errors are printed out to stdout.
compileLessScript = (file) ->
prefix = if argv.p == true then '' else argv.p
targetDir = if argv.t == '.' then '' else argv.t
targetFiles = if argv.f == '*.less' then file else argv.f
fnGetOutputFile = (file) -> file.replace(/([^\/\\]+)\.less/, "#{targetDir + prefix}$1.css")
watcher_lib.compileFile("lessc #{targetFiles}", targetFiles, fnGetOutputFile)
# Starts a poller that polls each second in a directory that's
# either by default the current working directory or a directory that's passed through process arguments.
watcher_lib.startDirectoryPoll(argv.d, findLessFiles)