diff --git a/Cakefile b/Cakefile index 06169400..66514496 100644 --- a/Cakefile +++ b/Cakefile @@ -1,8 +1,8 @@ fs = require 'fs' path = require 'path' -{extend} = require './lib/coffee-script/helpers' CoffeeScript = require './lib/coffee-script' {spawn, exec} = require 'child_process' +helpers = require './lib/coffee-script/helpers' # ANSI Terminal Colors. bold = red = green = reset = '' @@ -79,7 +79,7 @@ task 'build:full', 'rebuild the source twice, and run the tests', -> task 'build:parser', 'rebuild the Jison parser (run build first)', -> - extend global, require('util') + helpers.extend global, require('util') require 'jison' parser = require('./lib/coffee-script/grammar').parser fs.writeFile 'lib/coffee-script/parser.js', parser.generate() @@ -225,7 +225,7 @@ runTests = (CoffeeScript) -> # Run every test in the `test` folder, recording failures. files = fs.readdirSync 'test' for file in files when file.match /\.(lit)?coffee$/i - literate = path.extname(file) is '.litcoffee' + literate = helpers.isLiterate file currentFile = filename = path.join 'test', file code = fs.readFileSync filename try diff --git a/lib/coffee-script/coffee-script.js b/lib/coffee-script/coffee-script.js index 64684dfd..bed2722f 100644 --- a/lib/coffee-script/coffee-script.js +++ b/lib/coffee-script/coffee-script.js @@ -1,7 +1,6 @@ // Generated by CoffeeScript 1.5.0 (function() { - var Lexer, compile, ext, extensions, fs, lexer, loadFile, parser, path, vm, _i, _len, - __indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; }, + var Lexer, compile, ext, fs, helpers, lexer, loadFile, parser, path, vm, _i, _len, _ref, __hasProp = {}.hasOwnProperty; fs = require('fs'); @@ -12,22 +11,24 @@ parser = require('./parser').parser; - vm = require('vm'); + helpers = require('./helpers'); - extensions = ['.coffee', '.litcoffee']; + vm = require('vm'); loadFile = function(module, filename) { var raw, stripped; raw = fs.readFileSync(filename, 'utf8'); stripped = raw.charCodeAt(0) === 0xFEFF ? raw.substring(1) : raw; return module._compile(compile(stripped, { - filename: filename + filename: filename, + literate: helpers.isLiterate(filename) }), filename); }; if (require.extensions) { - for (_i = 0, _len = extensions.length; _i < _len; _i++) { - ext = extensions[_i]; + _ref = ['.coffee', '.litcoffee', '.md', '.coffee.md']; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + ext = _ref[_i]; require.extensions[ext] = loadFile; } } @@ -70,7 +71,7 @@ }; exports.run = function(code, options) { - var mainModule, _ref; + var mainModule; if (options == null) { options = {}; } @@ -78,7 +79,7 @@ mainModule.filename = process.argv[1] = options.filename ? fs.realpathSync(options.filename) : '.'; mainModule.moduleCache && (mainModule.moduleCache = {}); mainModule.paths = require('module')._nodeModulePaths(path.dirname(fs.realpathSync(options.filename))); - if ((_ref = path.extname(mainModule.filename), __indexOf.call(extensions, _ref) < 0) || require.extensions) { + if (!helpers.isCoffee(mainModule.filename) || require.extensions) { return mainModule._compile(compile(code, options), mainModule.filename); } else { return mainModule._compile(code, mainModule.filename); @@ -86,7 +87,7 @@ }; exports["eval"] = function(code, options) { - var Module, Script, js, k, o, r, sandbox, v, _j, _len1, _module, _ref, _ref1, _require; + var Module, Script, js, k, o, r, sandbox, v, _j, _len1, _module, _ref1, _ref2, _require; if (options == null) { options = {}; } @@ -100,10 +101,10 @@ sandbox = options.sandbox; } else { sandbox = Script.createContext(); - _ref = options.sandbox; - for (k in _ref) { - if (!__hasProp.call(_ref, k)) continue; - v = _ref[k]; + _ref1 = options.sandbox; + for (k in _ref1) { + if (!__hasProp.call(_ref1, k)) continue; + v = _ref1[k]; sandbox[k] = v; } } @@ -120,9 +121,9 @@ return Module._load(path, _module, true); }; _module.filename = sandbox.__filename; - _ref1 = Object.getOwnPropertyNames(require); - for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) { - r = _ref1[_j]; + _ref2 = Object.getOwnPropertyNames(require); + for (_j = 0, _len1 = _ref2.length; _j < _len1; _j++) { + r = _ref2[_j]; if (r !== 'paths') { _require[r] = require[r]; } diff --git a/lib/coffee-script/command.js b/lib/coffee-script/command.js index 03304d9d..6e6b4d99 100644 --- a/lib/coffee-script/command.js +++ b/lib/coffee-script/command.js @@ -1,7 +1,6 @@ // Generated by CoffeeScript 1.5.0 (function() { - var BANNER, CoffeeScript, EventEmitter, SWITCHES, coffee_exts, compileJoin, compileOptions, compilePath, compileScript, compileStdio, exec, exists, forkNode, fs, helpers, hidden, joinTimeout, lint, notSources, optionParser, optparse, opts, outputPath, parseOptions, path, printLine, printTokens, printWarn, removeSource, sourceCode, sources, spawn, timeLog, unwatchDir, usage, version, wait, watch, watchDir, watchers, writeJs, _ref, - __indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; }; + var BANNER, CoffeeScript, EventEmitter, SWITCHES, compileJoin, compileOptions, compilePath, compileScript, compileStdio, exec, exists, forkNode, fs, helpers, hidden, joinTimeout, lint, notSources, optionParser, optparse, opts, outputPath, parseOptions, path, printLine, printTokens, printWarn, removeSource, sourceCode, sources, spawn, timeLog, unwatchDir, usage, version, wait, watch, watchDir, watchers, writeJs, _ref; fs = require('fs'); @@ -49,8 +48,6 @@ optionParser = null; - coffee_exts = ['.coffee', '.litcoffee']; - exports.run = function() { var literals, source, _i, _len, _results; parseOptions(); @@ -91,7 +88,6 @@ compilePath = function(source, topLevel, base) { return fs.stat(source, function(err, stats) { - var _ref1; if (err && err.code !== 'ENOENT') { throw err; } @@ -131,7 +127,7 @@ return compilePath(path.join(source, file), false, base); }); }); - } else if (topLevel || (_ref1 = path.extname(source), __indexOf.call(coffee_exts, _ref1) >= 0)) { + } else if (topLevel || helpers.isCoffee(source)) { if (opts.watch) { watch(source, base); } @@ -370,7 +366,7 @@ outputPath = function(source, base) { var baseDir, dir, filename, srcDir; - filename = path.basename(source, path.extname(source)) + '.js'; + filename = helpers.getBasename(source) + '.js'; srcDir = path.dirname(source); baseDir = base === '.' ? srcDir : srcDir.substring(base.length); dir = opts.output ? path.join(opts.output, baseDir) : srcDir; @@ -455,11 +451,9 @@ }; compileOptions = function(filename) { - var literate; - literate = path.extname(filename) === '.litcoffee'; return { filename: filename, - literate: literate, + literate: helpers.isLiterate(filename), bare: opts.bare, header: opts.compile }; diff --git a/lib/coffee-script/helpers.js b/lib/coffee-script/helpers.js index 045c5b42..f215e8c8 100644 --- a/lib/coffee-script/helpers.js +++ b/lib/coffee-script/helpers.js @@ -1,6 +1,8 @@ // Generated by CoffeeScript 1.5.0 (function() { - var buildLocationData, extend, flatten, _ref; + var buildLocationData, extend, flatten, path, _ref; + + path = require('path'); exports.starts = function(string, literal, start) { return literal === string.substr(start, literal.length); @@ -121,4 +123,17 @@ } }; + exports.isCoffee = function(file) { + return /\.((lit)?coffee|coffee\.md)$/.test(file); + }; + + exports.isLiterate = function(file) { + return /\.(litcoffee|coffee\.md)$/.test(file); + }; + + exports.getBasename = function(file) { + var _ref1; + return path.basename(file, (file != null ? typeof file.match === "function" ? (_ref1 = file.match(/\.((lit)?coffee|coffee\.md)$/)) != null ? _ref1[0] : void 0 : void 0 : void 0) || path.extname(file)); + }; + }).call(this); diff --git a/src/coffee-script.coffee b/src/coffee-script.coffee index b9ee1df2..1047bfd3 100644 --- a/src/coffee-script.coffee +++ b/src/coffee-script.coffee @@ -10,19 +10,17 @@ fs = require 'fs' path = require 'path' {Lexer} = require './lexer' {parser} = require './parser' +helpers = require './helpers' vm = require 'vm' -# The file extensions that are considered to be CoffeeScript. -extensions = ['.coffee', '.litcoffee'] - # Load and run a CoffeeScript file for Node, stripping any `BOM`s. loadFile = (module, filename) -> raw = fs.readFileSync filename, 'utf8' stripped = if raw.charCodeAt(0) is 0xFEFF then raw.substring 1 else raw - module._compile compile(stripped, {filename}), filename + module._compile compile(stripped, {filename, literate: helpers.isLiterate filename}), filename if require.extensions - for ext in extensions + for ext in ['.coffee', '.litcoffee', '.md', '.coffee.md'] require.extensions[ext] = loadFile # The current CoffeeScript version number. @@ -73,7 +71,7 @@ exports.run = (code, options = {}) -> mainModule.paths = require('module')._nodeModulePaths path.dirname fs.realpathSync options.filename # Compile. - if (path.extname(mainModule.filename) not in extensions) or require.extensions + if not helpers.isCoffee(mainModule.filename) or require.extensions mainModule._compile compile(code, options), mainModule.filename else mainModule._compile code, mainModule.filename diff --git a/src/command.coffee b/src/command.coffee index 1f628e0a..3fa4b9a2 100644 --- a/src/command.coffee +++ b/src/command.coffee @@ -56,7 +56,6 @@ sourceCode = [] notSources = {} watchers = {} optionParser = null -coffee_exts = ['.coffee', '.litcoffee'] # Run `coffee` by parsing passed options and determining what action to take. # Many flags cause us to divert before compiling anything. Flags passed after @@ -79,8 +78,8 @@ exports.run = -> compilePath source, yes, path.normalize source # Compile a path, which could be a script or a directory. If a directory -# is passed, recursively compile all '.coffee' and '.litcoffee' extension source -# files in it and all subdirectories. +# is passed, recursively compile all '.coffee', '.litcoffee', and '.coffee.md' +# extension source files in it and all subdirectories. compilePath = (source, topLevel, base) -> fs.stat source, (err, stats) -> throw err if err and err.code isnt 'ENOENT' @@ -98,7 +97,7 @@ compilePath = (source, topLevel, base) -> sourceCode[index..index] = files.map -> null files.forEach (file) -> compilePath (path.join source, file), no, base - else if topLevel or path.extname(source) in coffee_exts + else if topLevel or helpers.isCoffee source watch source, base if opts.watch fs.readFile source, (err, code) -> throw err if err and err.code isnt 'ENOENT' @@ -243,7 +242,7 @@ removeSource = (source, base, removeJs) -> # Get the corresponding output JavaScript path for a source file. outputPath = (source, base) -> - filename = path.basename(source, path.extname(source)) + '.js' + filename = helpers.getBasename(source) + '.js' srcDir = path.dirname source baseDir = if base is '.' then srcDir else srcDir.substring base.length dir = if opts.output then path.join opts.output, baseDir else srcDir @@ -306,8 +305,7 @@ parseOptions = -> # The compile-time options to pass to the CoffeeScript compiler. compileOptions = (filename) -> - literate = path.extname(filename) is '.litcoffee' - {filename, literate, bare: opts.bare, header: opts.compile} + {filename, literate: helpers.isLiterate(filename), bare: opts.bare, header: opts.compile} # Start up a new Node.js instance with the arguments in `--nodejs` passed to # the `node` binary, preserving the other options. diff --git a/src/helpers.coffee b/src/helpers.coffee index 85d73cec..29606e91 100644 --- a/src/helpers.coffee +++ b/src/helpers.coffee @@ -2,6 +2,8 @@ # the **Lexer**, **Rewriter**, and the **Nodes**. Merge objects, flatten # arrays, count characters, that sort of thing. +path = require 'path' + # Peek at the beginning of a given string to see if it matches a sequence. exports.starts = (string, literal, start) -> literal is string.substr start, literal.length @@ -92,4 +94,14 @@ exports.locationDataToString = (obj) -> else "No location data" +# Determine if a filename represents a CoffeeScript file. +exports.isCoffee = (file) -> /\.((lit)?coffee|coffee\.md)$/.test file + +# Determine if a filename represents a Literate CoffeeScript file. +exports.isLiterate = (file) -> /\.(litcoffee|coffee\.md)$/.test file + +# Extract the basename from a source file name, accounting for all possible +# CoffeeScript extensions. +exports.getBasename = (file) -> path.basename file, file?.match?(/\.((lit)?coffee|coffee\.md)$/)?[0] or path.extname(file) +