Modify extension handling to allow for .coffee.md
Move filename processing to a `parseFileName` function in helpers.coffee. Map `.coffee.md` as a Literate CoffeeScript extension. Also, make .litcoffee and .coffee.md files executable without their file extension - eg. `coffee test` would work for a file called `test.litcoffee`.
This commit is contained in:
parent
1666716c31
commit
1a8354482a
6
Cakefile
6
Cakefile
|
@ -1,8 +1,8 @@
|
||||||
fs = require 'fs'
|
fs = require 'fs'
|
||||||
path = require 'path'
|
path = require 'path'
|
||||||
{extend} = require './lib/coffee-script/helpers'
|
|
||||||
CoffeeScript = require './lib/coffee-script'
|
CoffeeScript = require './lib/coffee-script'
|
||||||
{spawn, exec} = require 'child_process'
|
{spawn, exec} = require 'child_process'
|
||||||
|
helpers = require './lib/coffee-script/helpers'
|
||||||
|
|
||||||
# ANSI Terminal Colors.
|
# ANSI Terminal Colors.
|
||||||
bold = red = green = reset = ''
|
bold = red = green = reset = ''
|
||||||
|
@ -77,7 +77,7 @@ task 'build:full', 'rebuild the source twice, and run the tests', ->
|
||||||
|
|
||||||
|
|
||||||
task 'build:parser', 'rebuild the Jison parser (run build first)', ->
|
task 'build:parser', 'rebuild the Jison parser (run build first)', ->
|
||||||
extend global, require('util')
|
helpers.extend global, require('util')
|
||||||
require 'jison'
|
require 'jison'
|
||||||
parser = require('./lib/coffee-script/grammar').parser
|
parser = require('./lib/coffee-script/grammar').parser
|
||||||
fs.writeFile 'lib/coffee-script/parser.js', parser.generate()
|
fs.writeFile 'lib/coffee-script/parser.js', parser.generate()
|
||||||
|
@ -223,7 +223,7 @@ runTests = (CoffeeScript) ->
|
||||||
# Run every test in the `test` folder, recording failures.
|
# Run every test in the `test` folder, recording failures.
|
||||||
files = fs.readdirSync 'test'
|
files = fs.readdirSync 'test'
|
||||||
for file in files when file.match /\.(lit)?coffee$/i
|
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
|
currentFile = filename = path.join 'test', file
|
||||||
code = fs.readFileSync filename
|
code = fs.readFileSync filename
|
||||||
try
|
try
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
// Generated by CoffeeScript 1.5.0
|
// Generated by CoffeeScript 1.5.0
|
||||||
(function() {
|
(function() {
|
||||||
var Lexer, compile, ext, extensions, fs, lexer, loadFile, parser, path, vm, _i, _len,
|
var Lexer, compile, ext, fs, helpers, lexer, loadFile, parser, path, vm, _i, _len, _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; },
|
|
||||||
__hasProp = {}.hasOwnProperty;
|
__hasProp = {}.hasOwnProperty;
|
||||||
|
|
||||||
fs = require('fs');
|
fs = require('fs');
|
||||||
|
@ -12,22 +11,24 @@
|
||||||
|
|
||||||
parser = require('./parser').parser;
|
parser = require('./parser').parser;
|
||||||
|
|
||||||
vm = require('vm');
|
helpers = require('./helpers');
|
||||||
|
|
||||||
extensions = ['.coffee', '.litcoffee'];
|
vm = require('vm');
|
||||||
|
|
||||||
loadFile = function(module, filename) {
|
loadFile = function(module, filename) {
|
||||||
var raw, stripped;
|
var raw, stripped;
|
||||||
raw = fs.readFileSync(filename, 'utf8');
|
raw = fs.readFileSync(filename, 'utf8');
|
||||||
stripped = raw.charCodeAt(0) === 0xFEFF ? raw.substring(1) : raw;
|
stripped = raw.charCodeAt(0) === 0xFEFF ? raw.substring(1) : raw;
|
||||||
return module._compile(compile(stripped, {
|
return module._compile(compile(stripped, {
|
||||||
filename: filename
|
filename: filename,
|
||||||
|
literate: helpers.isLiterate(filename)
|
||||||
}), filename);
|
}), filename);
|
||||||
};
|
};
|
||||||
|
|
||||||
if (require.extensions) {
|
if (require.extensions) {
|
||||||
for (_i = 0, _len = extensions.length; _i < _len; _i++) {
|
_ref = ['.coffee', '.litcoffee', '.md', '.coffee.md'];
|
||||||
ext = extensions[_i];
|
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
|
||||||
|
ext = _ref[_i];
|
||||||
require.extensions[ext] = loadFile;
|
require.extensions[ext] = loadFile;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -70,7 +71,7 @@
|
||||||
};
|
};
|
||||||
|
|
||||||
exports.run = function(code, options) {
|
exports.run = function(code, options) {
|
||||||
var mainModule, _ref;
|
var mainModule;
|
||||||
if (options == null) {
|
if (options == null) {
|
||||||
options = {};
|
options = {};
|
||||||
}
|
}
|
||||||
|
@ -78,7 +79,7 @@
|
||||||
mainModule.filename = process.argv[1] = options.filename ? fs.realpathSync(options.filename) : '.';
|
mainModule.filename = process.argv[1] = options.filename ? fs.realpathSync(options.filename) : '.';
|
||||||
mainModule.moduleCache && (mainModule.moduleCache = {});
|
mainModule.moduleCache && (mainModule.moduleCache = {});
|
||||||
mainModule.paths = require('module')._nodeModulePaths(path.dirname(fs.realpathSync(options.filename)));
|
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);
|
return mainModule._compile(compile(code, options), mainModule.filename);
|
||||||
} else {
|
} else {
|
||||||
return mainModule._compile(code, mainModule.filename);
|
return mainModule._compile(code, mainModule.filename);
|
||||||
|
@ -86,7 +87,7 @@
|
||||||
};
|
};
|
||||||
|
|
||||||
exports["eval"] = function(code, options) {
|
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) {
|
if (options == null) {
|
||||||
options = {};
|
options = {};
|
||||||
}
|
}
|
||||||
|
@ -100,10 +101,10 @@
|
||||||
sandbox = options.sandbox;
|
sandbox = options.sandbox;
|
||||||
} else {
|
} else {
|
||||||
sandbox = Script.createContext();
|
sandbox = Script.createContext();
|
||||||
_ref = options.sandbox;
|
_ref1 = options.sandbox;
|
||||||
for (k in _ref) {
|
for (k in _ref1) {
|
||||||
if (!__hasProp.call(_ref, k)) continue;
|
if (!__hasProp.call(_ref1, k)) continue;
|
||||||
v = _ref[k];
|
v = _ref1[k];
|
||||||
sandbox[k] = v;
|
sandbox[k] = v;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -120,9 +121,9 @@
|
||||||
return Module._load(path, _module, true);
|
return Module._load(path, _module, true);
|
||||||
};
|
};
|
||||||
_module.filename = sandbox.__filename;
|
_module.filename = sandbox.__filename;
|
||||||
_ref1 = Object.getOwnPropertyNames(require);
|
_ref2 = Object.getOwnPropertyNames(require);
|
||||||
for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) {
|
for (_j = 0, _len1 = _ref2.length; _j < _len1; _j++) {
|
||||||
r = _ref1[_j];
|
r = _ref2[_j];
|
||||||
if (r !== 'paths') {
|
if (r !== 'paths') {
|
||||||
_require[r] = require[r];
|
_require[r] = require[r];
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
// Generated by CoffeeScript 1.5.0
|
// Generated by CoffeeScript 1.5.0
|
||||||
(function() {
|
(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,
|
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,
|
||||||
__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; };
|
__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; };
|
||||||
|
|
||||||
fs = require('fs');
|
fs = require('fs');
|
||||||
|
@ -49,8 +49,6 @@
|
||||||
|
|
||||||
optionParser = null;
|
optionParser = null;
|
||||||
|
|
||||||
coffee_exts = ['.coffee', '.litcoffee'];
|
|
||||||
|
|
||||||
exports.run = function() {
|
exports.run = function() {
|
||||||
var literals, source, _i, _len, _results;
|
var literals, source, _i, _len, _results;
|
||||||
parseOptions();
|
parseOptions();
|
||||||
|
@ -91,7 +89,7 @@
|
||||||
|
|
||||||
compilePath = function(source, topLevel, base) {
|
compilePath = function(source, topLevel, base) {
|
||||||
return fs.stat(source, function(err, stats) {
|
return fs.stat(source, function(err, stats) {
|
||||||
var _ref1, _ref2;
|
var _ref1;
|
||||||
if (err && err.code !== 'ENOENT') {
|
if (err && err.code !== 'ENOENT') {
|
||||||
throw err;
|
throw err;
|
||||||
}
|
}
|
||||||
|
@ -138,7 +136,7 @@
|
||||||
return compilePath(path.join(source, file), false, base);
|
return compilePath(path.join(source, file), false, base);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
} else if (topLevel || (_ref2 = path.extname(source), __indexOf.call(coffee_exts, _ref2) >= 0)) {
|
} else if (topLevel || helpers.isCoffee(source)) {
|
||||||
if (opts.watch) {
|
if (opts.watch) {
|
||||||
watch(source, base);
|
watch(source, base);
|
||||||
}
|
}
|
||||||
|
@ -377,7 +375,7 @@
|
||||||
|
|
||||||
outputPath = function(source, base) {
|
outputPath = function(source, base) {
|
||||||
var baseDir, dir, filename, srcDir;
|
var baseDir, dir, filename, srcDir;
|
||||||
filename = path.basename(source, path.extname(source)) + '.js';
|
filename = helpers.getBasename(source) + '.js';
|
||||||
srcDir = path.dirname(source);
|
srcDir = path.dirname(source);
|
||||||
baseDir = base === '.' ? srcDir : srcDir.substring(base.length);
|
baseDir = base === '.' ? srcDir : srcDir.substring(base.length);
|
||||||
dir = opts.output ? path.join(opts.output, baseDir) : srcDir;
|
dir = opts.output ? path.join(opts.output, baseDir) : srcDir;
|
||||||
|
@ -462,11 +460,9 @@
|
||||||
};
|
};
|
||||||
|
|
||||||
compileOptions = function(filename) {
|
compileOptions = function(filename) {
|
||||||
var literate;
|
|
||||||
literate = path.extname(filename) === '.litcoffee';
|
|
||||||
return {
|
return {
|
||||||
filename: filename,
|
filename: filename,
|
||||||
literate: literate,
|
literate: helpers.isLiterate(filename),
|
||||||
bare: opts.bare,
|
bare: opts.bare,
|
||||||
header: opts.compile
|
header: opts.compile
|
||||||
};
|
};
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
// Generated by CoffeeScript 1.5.0
|
// Generated by CoffeeScript 1.5.0
|
||||||
(function() {
|
(function() {
|
||||||
var buildLocationData, extend, flatten, _ref;
|
var buildLocationData, extend, flatten, path, _ref;
|
||||||
|
|
||||||
|
path = require('path');
|
||||||
|
|
||||||
exports.starts = function(string, literal, start) {
|
exports.starts = function(string, literal, start) {
|
||||||
return literal === string.substr(start, literal.length);
|
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);
|
}).call(this);
|
||||||
|
|
|
@ -10,19 +10,17 @@ fs = require 'fs'
|
||||||
path = require 'path'
|
path = require 'path'
|
||||||
{Lexer} = require './lexer'
|
{Lexer} = require './lexer'
|
||||||
{parser} = require './parser'
|
{parser} = require './parser'
|
||||||
|
helpers = require './helpers'
|
||||||
vm = require 'vm'
|
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.
|
# Load and run a CoffeeScript file for Node, stripping any `BOM`s.
|
||||||
loadFile = (module, filename) ->
|
loadFile = (module, filename) ->
|
||||||
raw = fs.readFileSync filename, 'utf8'
|
raw = fs.readFileSync filename, 'utf8'
|
||||||
stripped = if raw.charCodeAt(0) is 0xFEFF then raw.substring 1 else raw
|
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
|
if require.extensions
|
||||||
for ext in extensions
|
for ext in ['.coffee', '.litcoffee', '.md', '.coffee.md']
|
||||||
require.extensions[ext] = loadFile
|
require.extensions[ext] = loadFile
|
||||||
|
|
||||||
# The current CoffeeScript version number.
|
# The current CoffeeScript version number.
|
||||||
|
@ -73,7 +71,7 @@ exports.run = (code, options = {}) ->
|
||||||
mainModule.paths = require('module')._nodeModulePaths path.dirname fs.realpathSync options.filename
|
mainModule.paths = require('module')._nodeModulePaths path.dirname fs.realpathSync options.filename
|
||||||
|
|
||||||
# Compile.
|
# 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
|
mainModule._compile compile(code, options), mainModule.filename
|
||||||
else
|
else
|
||||||
mainModule._compile code, mainModule.filename
|
mainModule._compile code, mainModule.filename
|
||||||
|
|
|
@ -56,7 +56,6 @@ sourceCode = []
|
||||||
notSources = {}
|
notSources = {}
|
||||||
watchers = {}
|
watchers = {}
|
||||||
optionParser = null
|
optionParser = null
|
||||||
coffee_exts = ['.coffee', '.litcoffee']
|
|
||||||
|
|
||||||
# Run `coffee` by parsing passed options and determining what action to take.
|
# Run `coffee` by parsing passed options and determining what action to take.
|
||||||
# Many flags cause us to divert before compiling anything. Flags passed after
|
# Many flags cause us to divert before compiling anything. Flags passed after
|
||||||
|
@ -79,8 +78,8 @@ exports.run = ->
|
||||||
compilePath source, yes, path.normalize source
|
compilePath source, yes, path.normalize source
|
||||||
|
|
||||||
# Compile a path, which could be a script or a directory. If a directory
|
# Compile a path, which could be a script or a directory. If a directory
|
||||||
# is passed, recursively compile all '.coffee' and '.litcoffee' extension source
|
# is passed, recursively compile all '.coffee', '.litcoffee', and '.coffee.md'
|
||||||
# files in it and all subdirectories.
|
# extension source files in it and all subdirectories.
|
||||||
compilePath = (source, topLevel, base) ->
|
compilePath = (source, topLevel, base) ->
|
||||||
fs.stat source, (err, stats) ->
|
fs.stat source, (err, stats) ->
|
||||||
throw err if err and err.code isnt 'ENOENT'
|
throw err if err and err.code isnt 'ENOENT'
|
||||||
|
@ -103,7 +102,7 @@ compilePath = (source, topLevel, base) ->
|
||||||
sourceCode[index..index] = files.map -> null
|
sourceCode[index..index] = files.map -> null
|
||||||
files.forEach (file) ->
|
files.forEach (file) ->
|
||||||
compilePath (path.join source, file), no, base
|
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
|
watch source, base if opts.watch
|
||||||
fs.readFile source, (err, code) ->
|
fs.readFile source, (err, code) ->
|
||||||
throw err if err and err.code isnt 'ENOENT'
|
throw err if err and err.code isnt 'ENOENT'
|
||||||
|
@ -248,7 +247,7 @@ removeSource = (source, base, removeJs) ->
|
||||||
|
|
||||||
# Get the corresponding output JavaScript path for a source file.
|
# Get the corresponding output JavaScript path for a source file.
|
||||||
outputPath = (source, base) ->
|
outputPath = (source, base) ->
|
||||||
filename = path.basename(source, path.extname(source)) + '.js'
|
filename = helpers.getBasename(source) + '.js'
|
||||||
srcDir = path.dirname source
|
srcDir = path.dirname source
|
||||||
baseDir = if base is '.' then srcDir else srcDir.substring base.length
|
baseDir = if base is '.' then srcDir else srcDir.substring base.length
|
||||||
dir = if opts.output then path.join opts.output, baseDir else srcDir
|
dir = if opts.output then path.join opts.output, baseDir else srcDir
|
||||||
|
@ -311,8 +310,7 @@ parseOptions = ->
|
||||||
|
|
||||||
# The compile-time options to pass to the CoffeeScript compiler.
|
# The compile-time options to pass to the CoffeeScript compiler.
|
||||||
compileOptions = (filename) ->
|
compileOptions = (filename) ->
|
||||||
literate = path.extname(filename) is '.litcoffee'
|
{filename, literate: helpers.isLiterate(filename), bare: opts.bare, header: opts.compile}
|
||||||
{filename, literate, bare: opts.bare, header: opts.compile}
|
|
||||||
|
|
||||||
# Start up a new Node.js instance with the arguments in `--nodejs` passed to
|
# Start up a new Node.js instance with the arguments in `--nodejs` passed to
|
||||||
# the `node` binary, preserving the other options.
|
# the `node` binary, preserving the other options.
|
||||||
|
|
|
@ -2,6 +2,8 @@
|
||||||
# the **Lexer**, **Rewriter**, and the **Nodes**. Merge objects, flatten
|
# the **Lexer**, **Rewriter**, and the **Nodes**. Merge objects, flatten
|
||||||
# arrays, count characters, that sort of thing.
|
# 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.
|
# Peek at the beginning of a given string to see if it matches a sequence.
|
||||||
exports.starts = (string, literal, start) ->
|
exports.starts = (string, literal, start) ->
|
||||||
literal is string.substr start, literal.length
|
literal is string.substr start, literal.length
|
||||||
|
@ -92,4 +94,14 @@ exports.locationDataToString = (obj) ->
|
||||||
else
|
else
|
||||||
"No location data"
|
"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)
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue