123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596 |
- "use strict";
- var Rtl = require("rtl.js");
- var Code = require("code.js");
- var Context = require("context.js");
- var oc = require("oc.js");
- var fs = require("fs");
- var path = require("path");
- var ModuleGenerator = Rtl.Class.extend({
- init: function Nodejs$ModuleGenerator(name, imports){
- this.__name = name;
- this.__imports = imports;
- },
- prolog: function(){
- var result = "";
- var modules = this.__imports;
- for(var name in modules){
- var alias = modules[name];
- result += "var " + alias + " = " + (name == "this"
- ? "GLOBAL"
- : "require(\"" + name + ".js\")") + ";\n";
- }
- return result;
- },
- epilog: function(exports){
- var result = "";
- for(var access in exports){
- var e = exports[access];
- var code = Code.genExport(e);
- if (code){
- result += "exports." + e.id() + " = " + code + ";\n";
- }
- }
- return result;
- }
- });
- var RtlCodeUsingWatcher = Rtl.Code.extend({
- init: function(){
- Rtl.Code.prototype.init.call(this);
- this.__used = false;
- },
- get: function(func){
- this.__used = true;
- return Rtl.Code.prototype.get.call(this, func);
- },
- used: function(){return this.__used;},
- reset: function(){this.__used = false;}
- });
- function writeCompiledModule(name, code, outDir){
- var filePath = path.join(outDir, name + ".js");
- fs.writeFileSync(filePath, code);
- }
- function compile(sources, handleErrors, outDir){
- var rtlCodeWatcher = new RtlCodeUsingWatcher();
- var rtl = new Rtl.RTL(rtlCodeWatcher);
- var moduleCode = function(name, imports){return new ModuleGenerator(name, imports);};
- var compiledFilesStack = [];
- oc.compileModules(
- sources,
- function(name){
- var fileName = name;
- if (!path.extname(fileName).length)
- fileName += ".ob";
- compiledFilesStack.push(fileName);
- return fs.readFileSync(fileName, "utf8");
- },
- function(moduleResolver){return new Context.Context(
- new Code.Generator(),
- moduleCode,
- rtl,
- moduleResolver);},
- function(e){handleErrors("File \"" + compiledFilesStack[compiledFilesStack.length - 1] + "\", " + e);},
- function(name, code){
- if (rtlCodeWatcher.used()){
- code = "var " + rtl.name() + " = require(\"" + rtl.name()
- + ".js\")." + rtl.name() + ";\n" + code;
- rtlCodeWatcher.reset();
- }
- writeCompiledModule(name, code, outDir);
- compiledFilesStack.pop();
- });
- var rtlCode = rtl.generate();
- if (rtlCode){
- rtlCode += "\nexports." + rtl.name() + " = " + rtl.name() + ";";
- writeCompiledModule(rtl.name(), rtlCode, outDir);
- }
- }
- exports.compile = compile;
|