diff --git a/lib-js/coffee-script.js b/lib-js/coffee-script.js index 99889dd8..0f1e2e22 100644 --- a/lib-js/coffee-script.js +++ b/lib-js/coffee-script.js @@ -1,6 +1,22 @@ (function(){ - var File = require('file'); + + // This (javascript) file is generated from lib/coffee_script/narwhal/coffee-script.cs Executes the `coffee-script` Ruby program to convert from CoffeeScript + // to Javascript. Eventually this will hopefully happen entirely within JS. Require external dependencies. var OS = require('os'); + var File = require('file'); + var Readline = require('readline'); + // The path to the CoffeeScript Compiler. + var coffeePath = File.path(module.path).dirname().dirname().join('bin', 'coffee-script'); + // Our general-purpose error handler. + var checkForErrors = function(coffeeProcess) { + if (coffeeProcess.wait() === 0) { + return true; + } + system.stderr.print(coffeeProcess.stderr.read()); + throw new Error("coffee-script compile error"); + }; + // Run a simple REPL, round-tripping to the CoffeeScript compiler for every + // command. exports.run = function(args) { args.shift(); if (args.length) { @@ -9,7 +25,7 @@ while (true) { try { system.stdout.write('cs> ').flush(); - var result = exports.cs_eval(require('readline').readline()); + var result = exports.evalCS(Readline.readline()); if (result !== undefined) { print(result); } @@ -18,34 +34,25 @@ } } }; - // executes the coffee-script Ruby program to convert from CoffeeScript to Objective-J. - // eventually this will hopefully be replaced by a JavaScript program. - var coffeePath = File.path(module.path).dirname().dirname().join('bin', 'coffee-script'); + // Compile a given CoffeeScript file into JavaScript. exports.compileFile = function(path) { var coffee = OS.popen([coffeePath, "--print", "--no-wrap", path]); - if (coffee.wait() !== 0) { - system.stderr.print(coffee.stderr.read()); - throw new Error("coffee-script compile error"); - } + checkForErrors(coffee); return coffee.stdout.read(); }; + // Compile a string of CoffeeScript into JavaScript. exports.compile = function(source) { var coffee = OS.popen([coffeePath, "--eval", "--no-wrap"]); coffee.stdin.write(source).flush().close(); - if (coffee.wait() !== 0) { - system.stderr.print(coffee.stderr.read()); - throw new Error("coffee-script compile error"); - } + checkForErrors(coffee); return coffee.stdout.read(); }; - // these two functions are equivalent to objective-j's objj_eval/make_narwhal_factory. - // implemented as a call to coffee and objj_eval/make_narwhal_factory - exports.cs_eval = function(source) { - init(); + // Evaluating a string of CoffeeScript first compiles it externally. + exports.evalCS = function(source) { return eval(exports.compile(source)); }; - exports.make_narwhal_factory = function(path) { - init(); + // Make a factory for the CoffeeScript environment. + exports.makeNarwhalFactory = function(path) { var code = exports.compileFile(path); var factoryText = "function(require,exports,module,system,print){" + code + "/**/\n}"; if (system.engine === "rhino") { @@ -55,10 +62,4 @@ return eval("(" + factoryText + ")"); } }; - var init = function() { - // make sure it's only done once - init = function() { - }; - return init; - }; })(); diff --git a/lib-js/coffee-script/loader.js b/lib-js/coffee-script/loader.js index e0ec9d9d..6e08cd61 100644 --- a/lib-js/coffee-script/loader.js +++ b/lib-js/coffee-script/loader.js @@ -1,23 +1,20 @@ (function(){ + + // This (javascript) file is generated from lib/coffee_script/narwhal/loader.cs var coffeescript = null; - var CoffeeScriptLoader = function() { - var loader = { - }; - var factories = { - }; - loader.reload = function(topId, path) { - coffeescript = coffeescript || require('coffee-script'); - // print("loading objective-j: " + topId + " (" + path + ")"); - factories[topId] = coffeescript.make_narwhal_factory(path); - return factories[topId]; - }; - loader.load = function(topId, path) { - if (!(factories.hasOwnProperty(topId))) { - loader.reload(topId, path); - } - return factories[topId]; - }; - return loader; + var factories = { }; - require.loader.loaders.unshift([".cs", CoffeeScriptLoader()]); + var loader = { + // Reload the coffee-script environment from source. + reload: function(topId, path) { + coffeescript = coffeescript || require('coffee-script'); + factories[topId] = coffeescript.makeNarwhalFactory(path); + return factories[topId]; + }, + // Ensure that the coffee-script environment is loaded. + load: function(topId, path) { + return factories[topId] = factories[topId] || this.reload(topId, path); + } + }; + require.loader.loaders.unshift([".cs", loader]); })(); diff --git a/lib/coffee_script/narwhal/coffee-script.cs b/lib/coffee_script/narwhal/coffee-script.cs index ca868779..09706312 100644 --- a/lib/coffee_script/narwhal/coffee-script.cs +++ b/lib/coffee_script/narwhal/coffee-script.cs @@ -1,8 +1,24 @@ # This (javascript) file is generated from lib/coffee_script/narwhal/coffee-script.cs -File: require('file') -OS: require('os') +# Executes the `coffee-script` Ruby program to convert from CoffeeScript +# to Javascript. Eventually this will hopefully happen entirely within JS. +# 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().join('bin', 'coffee-script') + +# Our general-purpose error handler. +checkForErrors: coffeeProcess => + return true if coffeeProcess.wait() is 0 + system.stderr.print(coffeeProcess.stderr.read()) + throw new Error("coffee-script compile error"). + +# Run a simple REPL, round-tripping to the CoffeeScript compiler for every +# command. exports.run: args => args.shift() return require(File.absolute(args[0])) if args.length @@ -10,54 +26,34 @@ exports.run: args => while true try system.stdout.write('cs> ').flush() - result: exports.cs_eval(require('readline').readline()) + result: exports.evalCS(Readline.readline()) print(result) if result isnt undefined catch e print(e)... -# executes the coffee-script Ruby program to convert from CoffeeScript to Objective-J. -# eventually this will hopefully be replaced by a JavaScript program. -coffeePath: File.path(module.path).dirname().dirname().join('bin', 'coffee-script') - +# Compile a given CoffeeScript file into JavaScript. exports.compileFile: path => coffee: OS.popen([coffeePath, "--print", "--no-wrap", path]) - - if coffee.wait() isnt 0 - system.stderr.print(coffee.stderr.read()) - throw new Error("coffee-script compile error"). - + checkForErrors(coffee) coffee.stdout.read(). +# Compile a string of CoffeeScript into JavaScript. exports.compile: source => - coffee: OS.popen([coffeePath, "--eval", "--no-wrap"]) + coffee: OS.popen([coffeePath, "--eval", "--no-wrap"]) + coffee.stdin.write(source).flush().close() + checkForErrors(coffee) + coffee.stdout.read(). - coffee.stdin.write(source).flush().close() +# Evaluating a string of CoffeeScript first compiles it externally. +exports.evalCS: source => + eval(exports.compile(source)). - if coffee.wait() isnt 0 - system.stderr.print(coffee.stderr.read()) - throw new Error("coffee-script compile error"). - - coffee.stdout.read(). - -# these two functions are equivalent to objective-j's objj_eval/make_narwhal_factory. -# implemented as a call to coffee and objj_eval/make_narwhal_factory -exports.cs_eval: source => - init() - eval(exports.compile(source)). - -exports.make_narwhal_factory: path => - init() +# 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 parenthesis, but parenthesis break compileFunction. eval("(" + factoryText + ")").. - - -init: => - # make sure it's only done once - init: => .. \ No newline at end of file diff --git a/lib/coffee_script/narwhal/loader.cs b/lib/coffee_script/narwhal/loader.cs index 8928ed1c..a8942576 100644 --- a/lib/coffee_script/narwhal/loader.cs +++ b/lib/coffee_script/narwhal/loader.cs @@ -1,20 +1,19 @@ # This (javascript) file is generated from lib/coffee_script/narwhal/loader.cs coffeescript: null +factories: {} -CoffeeScriptLoader: => - loader: {} - factories: {} +loader: { - loader.reload: topId, path => + # Reload the coffee-script environment from source. + reload: topId, path => coffeescript ||: require('coffee-script') - # print("loading objective-j: " + topId + " (" + path + ")"); - factories[topId]: coffeescript.make_narwhal_factory(path). + factories[topId]: coffeescript.makeNarwhalFactory(path). - loader.load: topId, path => - loader.reload(topId, path) unless factories.hasOwnProperty(topId) - factories[topId]. + # Ensure that the coffee-script environment is loaded. + load: topId, path => + factories[topId] ||: this.reload(topId, path). - loader. +} -require.loader.loaders.unshift([".cs", CoffeeScriptLoader()]) +require.loader.loaders.unshift([".cs", loader])