From aadf6996e27c71df72fff76ed650378a03431930 Mon Sep 17 00:00:00 2001 From: sbosse Date: Mon, 21 Jul 2025 23:19:29 +0200 Subject: [PATCH] Mon 21 Jul 22:43:21 CEST 2025 --- js/top/module.js | 133 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 133 insertions(+) create mode 100644 js/top/module.js diff --git a/js/top/module.js b/js/top/module.js new file mode 100644 index 0000000..225da73 --- /dev/null +++ b/js/top/module.js @@ -0,0 +1,133 @@ +/** + ** ============================== + ** O O O OOOO + ** O O O O O O + ** O O O O O O + ** OOOO OOOO O OOO OOOO + ** O O O O O O O + ** O O O O O O O + ** OOOO OOOO O O OOOO + ** ============================== + ** Dr. Stefan Bosse http://www.bsslab.de + ** + ** COPYRIGHT: THIS SOFTWARE, EXECUTABLE AND SOURCE CODE IS OWNED + ** BY THE AUTHOR(S). + ** THIS SOURCE CODE MAY NOT BE COPIED, EXTRACTED, + ** MODIFIED, OR OTHERWISE USED IN A CONTEXT + ** OUTSIDE OF THE SOFTWARE SYSTEM. + ** + ** $AUTHORS: Stefan Bosse + ** $INITIAL: (C) 2006-2017 bLAB + ** $CREATED: sbosse on 23-12-15 + ** $VERSION: 1.3.1 + ** $RCS: $Id: module.js,v 1.3 2020/02/03 09:45:01 sbosse Exp sbosse $ + ** + ** $INFO: + * + * Module management for bundled applications. + * + * $ENDINFO + */ + +var CoreModule={}; +CoreModule['buffer']='buffer'; +CoreModule['events']='events'; +CoreModule['util']='util'; +CoreModule['http']='http'; +CoreModule['fs']='fs'; +CoreModule['os']='os'; +CoreModule['net']='net'; +CoreModule['http']='http'; +CoreModule['dgram']='dgram'; +CoreModule['path']='path'; +CoreModule['zlib']='zlib'; +CoreModule['assert']='assert'; +CoreModule['child_process']='child_process'; +CoreModule['string_decoder']='string_decoder'; + +module.exports= function (paths) { + var Fs = require('fs'); + var Modules = []; + var Files = []; + var Objects = []; + global.FilesEmbedded = []; + /* + ** Search paths + */ + global.PATH=paths; + function FileExtension(filename) { + return filename.split('.').pop(); + } + /* + ** Search a file + */ + function search(index,file) { + if (PATH.length==index) return file; + var path=PATH[index]; + if (Fs.existsSync(path+'/'+file+'.js')) return path+'/'+file+'.js'; + else if (Fs.existsSync(path+'/'+file)) return path+'/'+file; + else return search(index+1,file); + } + /* + ** Load either an embedded (tried first) or an external module. + */ + global.Require = function (module) { + try { + //console.log(module) + if (CoreModule[module]) return require(module); + if (Modules[module]) return Modules[module]; + var file=search(0,module); + var filepath=Fs.realpathSync(file); + Files.push([module,filepath]); + if (FileExtension(filepath)=='json') { + var Object = require(file); + Objects[module]=Object; + return Object; + } else { + var Module = require(file); + Modules[module]=Module; + return Module; + } + } catch (e) { + console.log('Require import of module '+module+' ['+filepath+'] failed: '+e); + if (e.name==='SyntaxError' && filepath) { + var src=Fs.readFileSync(filepath,'utf8'); + var Esprima = Require('parser/esprima'); + try { + var ast = Esprima.parse(src, { tolerant: true, loc:true }); + if (ast.errors && ast.errors.length>0) console.log(" .. "+ast.errors[0]); + } catch (e) { + if (e.lineNumber) console.log('.. in line '+e.lineNumber) + } + } + if (e.stack) console.log(e.stack); + } + }; + /* + ** Look-up an embedded file + */ + global.FileEmbedded = function (path,format) { + return FilesEmbedded[path]; + }; + /* + ** Embedd a file. Only performed in makeapp... + */ + global.FileEmbedd = function (path,format) {}; + + global.open = function(name,context,as) { + var module = Require(name); + if (!context) context=global; + for (var p in module) { + context[p] = module[p]; + }; + if (as) context[as]=module; + } + + return { + Files:Files, + FilesEmbedded:FilesEmbedded, + Modules:Modules, + Objects:Objects + } +} +