lite
Version:
A cross platform template engine base on xml/html and javascript expression.
257 lines (248 loc) • 10.2 kB
JavaScript
//do export java-proxy.js:
//node ./java-proxy.js lite/src/main/js/compiler
//兼容 java8/IE console 缺失的情况
if(typeof console == 'undefined' || !console.dir){
//console.log(typeof console ,!this.console, !console.dir)
console = this.console || {
log:print
};
console.warn || "trace,debug,info,warn,error".replace(/\w+/g,function(n){
console[n] = function(){
arguments[0] = n + ':' + arguments[0]
this.log.apply(this,arguments);
}
});
console.dir = function(o){for(var n in o){console.log(n,o[n]);}}
console.time = console.time || function(l){this['#'+l] = +new Date}
console.timeEnd = console.timeEnd || function(l){console.log(l + (new Date-this['#'+l]));}
console.assert = console.assert || function(l){if(!l){console.error('Assert Failed!!!')}}
}
var require = function(){
moduleCached = {};
function requireAbs(path,base){
//console.error(path,base)
var absPath = initPath(path,base);
if(!absPath){
return;
}
var modulePath = absPath.replace(/.*\/node_modules\//,'');
var module = moduleCached[modulePath];
if(!module){
module = moduleCached[modulePath] = {exports:{},id:modulePath};
var define = require.cached[modulePath];
if(typeof define =='string'){
if(typeof __java_engine == 'object') {
try{
var oldPath = this['javax.script.filename'];
this['javax.script.filename'] = absPath
define = __java_engine.eval("function (require,exports,module,__filename,__dirname){"+define+"\n}");
}finally{
this['javax.script.filename'] =oldPath;
}
}else{
define= new Function('require','exports','module','__filename','__dirname',define);
}
}
//console.log(modulePath,JSON.stringify(require.cached))
define(function(path){
return requireAbs(path,absPath);
},module.exports,module,absPath,absPath.replace(/[^\\\/]*$/,''));
//console.log(script)
}
//console.log(path,module.exports)
return module.exports;
}
function initPath(path,base){
//console.log(path)
if(path.charAt() == '.'){//relative path
path = path.replace(/(?:\.js)?$/,'.js');
var dir = require('fs').realpathSync(base).replace(/[^\\\/]*$/,'');
var absPath = dir+path;
//console.log('start',path)
while(absPath != (absPath =absPath.replace( /[^\/]+\/\.\.\/|(\/)?\.\//,'$1')));
var modulePath= absPath.replace(/\\/g,'/').replace(/.*\/node_modules\//,'');
if(modulePath in require.cached ){
}else{
var define = require('fs').readFileSync(absPath).toString();
require.cached[modulePath] = define;
}
return absPath;
}else{
if(path.indexOf('/')>=0){
path = path.replace(/(?:\.js)?$/,'.js');
}
var modulePath = path;
if(modulePath in require.cached ){
return modulePath;
}
var dir = require('fs').realpathSync(base).replace(/[^\\\/]*$/,'');
var absPath = findExternalModule(path,dir);
if(absPath){
absPath = absPath.replace(/\\/g,'/');
var modulePath= absPath.replace(/\\/g,'/').replace(/.*\/node_modules\//,'');
if(modulePath.indexOf('/')>0){
var define = require('fs').readFileSync(absPath).toString();
require.cached[modulePath] = define;
}
return absPath;
}
}
//console.error('absPath:',path,base,absPath)
}
function findExternalModule(path,dir){
//absolute node path
var moduleName = path.replace(/\/.*/,'');
//var dir = base.replace(/[^\\\/]*$/,'');
while(dir){
var moduleDir = dir+'node_modules/'+moduleName;
if(require('fs').existsSync(moduleDir)){
//console.log(moduleName , path,absPath)
if(moduleName == path){
var main = JSON.parse(require('fs').readFileSync(moduleDir+'/package.json')+'').main;
var path = moduleName + main.replace(/^(:?.\/)?/,'/')
require.cached[moduleName] = 'module.exports = require("'+path+'");'
//console.log(main,moduleName , path,absPath)
return moduleDir
}
return dir+'node_modules/'+path.replace(/(?:\.js)?$/,'.js');
}
dir = dir.replace(/[^\/]*\/?$/,'');
}
if(!absPath){
console.error('missed path! :',path,dir)
return;
}
}
var absPath ;
return function requireMock(path){
if(path in moduleCached ){
return moduleCached[path].exports;
}
var exports = requireAbs(path,'./')
if(exports===undefined){
var absPath = require('fs').realpathSync('./').replace(/\.$/,'');
console.error('module not found: '+path+"\t @"+absPath);
}
return exports;
}
}()
//console.log(typeof java.io.File,typeof java)
require.cached = {
fs:function(require,exports,m){
var isJavaEnv = typeof window == 'undefined' && typeof java == 'object' && typeof (java.io && java.io.File) == 'function';
if(isJavaEnv) {
exports.readFileSync = function(path){
var ins = new java.io.FileInputStream(path);
//Buffer
return {
toString:function(encoding){
var s = new java.io.InputStreamReader(ins,encoding||'utf-8')
var buf = [],c;
while((c = s.read())>=0){
//console.log(c)
buf.push(c)
}
//console.log(String.fromCharCode.apply(String,buf))
return String.fromCharCode.apply(String,buf)
}
}
};
exports.existsSync =function(path){
return new java.io.File(path).exists();
};
exports.realpathSync = function(path){
return new java.io.File(path).getAbsolutePath()
}
}else if(typeof module == 'object'){
m.exports = module.require('fs');
}
},
path : function(require,exports,m,__filename,__dirname){
var isJavaEnv = typeof window == 'undefined' && typeof java == 'object' && typeof (java.io && java.io.File) == 'function';
if(isJavaEnv) {
exports.resolve = function () {
var i = 0;
var file = new java.io.File(arguments[i++]);
while (i < arguments.length) {
file = new java.io.File(file, arguments[i++]);
}
return file.getAbsoluteFile().getCanonicalPath();
}
}else if(typeof module == 'object'){
m.exports = module.require('path');
}
}
}
function stringifyFunction(fn){
var ls= String(fn).split(/\r\n?|\n/);
for(var i = ls.length-1,prefix = ls[i].replace(/[\S].*/,'');
i>=0; i--){
var l = ls[i];
if(l.indexOf(prefix)==0){
ls[i] = l.substr(prefix.length);
}
}
return ls.join('\n')
}
if(typeof process =='object' && process.argv instanceof Array && typeof module == 'object'){//for node client
module.exports = require;
//require.cached.path = function(require,exports,m){m.exports = module.require('path')};
//var code = require('./java-proxy').exports('lite/src/main/js/compiler');
//console.log(code)
function exportSource(){
var buf = ["if(typeof console == 'undefined'){",
"console = {};'log,warn,error,info,debug'.replace(/\\w+/g,function(a){console[a] = print});",
"console.dir = function(o){for(var n in o){console.log(n,o[n]);}};\n",
"console.time = console.time || function(l){this['#'+l] = +new Date};\n",
"console.timeEnd = console.timeEnd || function(l){console.log(l + (new Date-this['#'+l]));};\n",
"console.assert = console.assert || function(l){if(!l){console.error('Assert Failed!!!')}};\n",
"}\n"]
var requireMock = require;//require('./java-proxy.js');
for(var i =0;i<arguments.length;i++){
//requireMock('lite/src/main/js/compiler');
//console.log(arguments[i])
requireMock(arguments[i]);
}
//console.log('~',arguments.callee,'()')
buf.push(stringifyFunction(function require(id){
id = id.replace(/(\/.*?)(?:\.js)?$/,'$1.js')
if(id in require.module){
return require.module[id].exports;
}
var module = require.module[id] = {exports:{},id:id};
var dir = id.replace(/[^\/\\]+$/,'');
//console.log(id)
require.cached[id].call(null,function(id2){
if(id2.charAt() == '.'){
id2 = dir+id2;
while(id2 != (id2 =id2.replace( /[^\/]+\/\.\.\/|(\/)?\.\//,'$1')));
}
return require(id2);
},module.exports,module,id,dir);
return module.exports;
}),'\nrequire.cached={}\nrequire.module={}\nif(typeof module == "object"){module.exports = require};\n');
for(var n in requireMock.cached) {
var v = requireMock.cached[n];
if (typeof v == 'string') {
//v = v.indexOf('`')<0?'`'+v+'`':JSON.stringify(v)
v = 'function (require,exports,module,__filename,__dirname){' + v + '\n}'
}else if(v instanceof Function){
v = stringifyFunction(v);
}
buf.push('require.cached["' + n + '"]=', v, ';\n')
}
return buf.join('')
}
require.exportSource =exportSource;
var exportModules = process.argv.slice(2);
//console.log()
if(exportModules.length){
console.log("Exports modules:",JSON.stringify(exportModules))
var source = exportSource.apply(null,exportModules);
var fileName = exportModules.join('\n').replace(/.*\//mg,'').replace(/\n/g,'_')
var file = 'packed-'+fileName+'.js';
//file = __filename.replace(/[^\\\/]+$/),
require('fs').writeFileSync(file,source.replace(/<\/(script)>/ig,'<\\/$1>'));
console.log('file updated!!',file)
}
}