mirror of
https://github.com/jashkenas/coffeescript.git
synced 2026-02-18 03:21:20 -05:00
75 lines
2.3 KiB
CoffeeScript
75 lines
2.3 KiB
CoffeeScript
# The Narwhal-compatibility wrapper for CoffeeScript.
|
|
|
|
# Require external dependencies.
|
|
OS: require 'os'
|
|
File: require 'file'
|
|
Readline: require 'readline'
|
|
|
|
# The path to the CoffeeScript Compiler.
|
|
coffeePath: File.path(module.path).dirname().dirname().dirname().dirname().join('bin', 'coffee')
|
|
|
|
# Our general-purpose error handler.
|
|
checkForErrors: (coffeeProcess) ->
|
|
return true if coffeeProcess.wait() is 0
|
|
system.stderr.print coffeeProcess.stderr.read()
|
|
throw new Error "CoffeeScript compile error"
|
|
|
|
# Run a simple REPL, round-tripping to the CoffeeScript compiler for every
|
|
# command.
|
|
exports.run: (args) ->
|
|
if args.length
|
|
for path, i in args
|
|
exports.evalCS File.read path
|
|
delete args[i]
|
|
return true
|
|
|
|
while true
|
|
try
|
|
system.stdout.write('coffee> ').flush()
|
|
result: exports.evalCS Readline.readline(), ['--globals']
|
|
print result if result isnt undefined
|
|
catch e
|
|
print e
|
|
|
|
# Compile a given CoffeeScript file into JavaScript.
|
|
exports.compileFile: (path) ->
|
|
coffee: OS.popen [coffeePath, "--print", "--no-wrap", path]
|
|
checkForErrors coffee
|
|
coffee.stdout.read()
|
|
|
|
# Compile a string of CoffeeScript into JavaScript.
|
|
exports.compile: (source, flags) ->
|
|
coffee: OS.popen [coffeePath, "--eval", "--no-wrap"].concat flags or []
|
|
coffee.stdin.write(source).flush().close()
|
|
checkForErrors coffee
|
|
coffee.stdout.read()
|
|
|
|
# Evaluating a string of CoffeeScript first compiles it externally.
|
|
exports.evalCS: (source, flags) ->
|
|
eval exports.compile source, flags
|
|
|
|
# Make a factory for the CoffeeScript environment.
|
|
exports.makeNarwhalFactory: (path) ->
|
|
code: exports.compileFile path
|
|
factoryText: "function(require,exports,module,system,print){" + code + "/**/\n}"
|
|
if system.engine is "rhino"
|
|
Packages.org.mozilla.javascript.Context.getCurrentContext().compileFunction(global, factoryText, path, 0, null)
|
|
else
|
|
# eval requires parentheses, but parentheses break compileFunction.
|
|
eval "(" + factoryText + ")"
|
|
|
|
# The Narwhal loader for '.coffee' files.
|
|
factories: {}
|
|
loader: {}
|
|
|
|
# Reload the coffee-script environment from source.
|
|
loader.reload: (topId, path) ->
|
|
factories[topId]: ->
|
|
exports.makeNarwhalFactory path
|
|
|
|
# Ensure that the coffee-script environment is loaded.
|
|
loader.load: (topId, path) ->
|
|
factories[topId] ||= this.reload topId, path
|
|
|
|
require.loader.loaders.unshift [".coffee", loader]
|