"use strict"; var TOUCH_DIR_PREFIX = "generated/lint/"; var path = require("path"); var touchFiles = filesToLint().map(touchFileName); var touchDirs = uniqify(touchFiles.map(path.dirname)); touchDirs.forEach(directory); // this is Jake's `directory` task task("lint", touchDirs.concat(touchFiles)); rule(".lint", sourceFileName, lintRule); function filesToLint() { var javascriptFiles = new jake.FileList(); javascriptFiles.include("src/**/*.js"); // ... more patterns return javascriptFiles.toArray(); } function touchFileName(jsFile) { return TOUCH_DIR_PREFIX + jsFile.replace(/\.js$/, ".lint"); } function sourceFileName(touchFile) { var prefix = new RegExp("^" + TOUCH_DIR_PREFIX); var suffix = new RegExp("\\.lint$"); return touchFile .replace(prefix, "") .replace(suffix, ".js"); } function lintRule() { var fs = require("fs"); if (yourLintFunction(this.source)) { fs.writeFileSync(this.name, "lint ok"); } else { fail("Lint failed"); } } function uniqify(array) { return array.reduce(function (result, value) { return (result.indexOf(value) < 0) ? result.concat(value) : result; }, []); }