feat: add nodejs internal module support
Signed-off-by: MiaoWoo <admin@yumc.pw>
This commit is contained in:
		
							
								
								
									
										3
									
								
								pom.xml
									
									
									
									
									
								
							
							
						
						
									
										3
									
								
								pom.xml
									
									
									
									
									
								
							@@ -3,7 +3,7 @@
 | 
				
			|||||||
    <modelVersion>4.0.0</modelVersion>
 | 
					    <modelVersion>4.0.0</modelVersion>
 | 
				
			||||||
    <groupId>pw.yumc</groupId>
 | 
					    <groupId>pw.yumc</groupId>
 | 
				
			||||||
    <artifactId>MiaoScript</artifactId>
 | 
					    <artifactId>MiaoScript</artifactId>
 | 
				
			||||||
    <version>0.3.1</version>
 | 
					    <version>0.4.0</version>
 | 
				
			||||||
    <developers>
 | 
					    <developers>
 | 
				
			||||||
        <developer>
 | 
					        <developer>
 | 
				
			||||||
            <id>502647092</id>
 | 
					            <id>502647092</id>
 | 
				
			||||||
@@ -54,6 +54,7 @@
 | 
				
			|||||||
    <properties>
 | 
					    <properties>
 | 
				
			||||||
        <env.GIT_COMMIT>DEV</env.GIT_COMMIT>
 | 
					        <env.GIT_COMMIT>DEV</env.GIT_COMMIT>
 | 
				
			||||||
        <update.changes>
 | 
					        <update.changes>
 | 
				
			||||||
 | 
					            §620-03-31 §afeat: require 新增 内建 nodejs 模块;
 | 
				
			||||||
            §620-03-03 §afeat: require 新增 淘宝镜像源拉取;
 | 
					            §620-03-03 §afeat: require 新增 淘宝镜像源拉取;
 | 
				
			||||||
            §620-02-27 §afeat: 异步加载脚本引擎;
 | 
					            §620-02-27 §afeat: 异步加载脚本引擎;
 | 
				
			||||||
            §620-02-25 §afeat: 新增 Nukkit 的支持;
 | 
					            §620-02-25 §afeat: 新增 Nukkit 的支持;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -207,7 +207,7 @@
 | 
				
			|||||||
            cacheModules[id] = module;
 | 
					            cacheModules[id] = module;
 | 
				
			||||||
            var cfile = _canonical(file);
 | 
					            var cfile = _canonical(file);
 | 
				
			||||||
            if (cfile.endsWith('.js')) {
 | 
					            if (cfile.endsWith('.js')) {
 | 
				
			||||||
                compileJs(module, file, optional);
 | 
					                compileJs(module, file, __assign(optional, { id: id }));
 | 
				
			||||||
            } else if (cfile.endsWith('.json')) {
 | 
					            } else if (cfile.endsWith('.json')) {
 | 
				
			||||||
                compileJson(module, file);
 | 
					                compileJson(module, file);
 | 
				
			||||||
            } else if (cfile.endsWith('.msm')) {
 | 
					            } else if (cfile.endsWith('.msm')) {
 | 
				
			||||||
@@ -234,7 +234,7 @@
 | 
				
			|||||||
            // 2019-09-19 使用 扩展函数直接 load 无需保存/删除文件
 | 
					            // 2019-09-19 使用 扩展函数直接 load 无需保存/删除文件
 | 
				
			||||||
            // 2020-02-16 结尾新增换行 防止有注释导致加载失败
 | 
					            // 2020-02-16 结尾新增换行 防止有注释导致加载失败
 | 
				
			||||||
            // @ts-ignore
 | 
					            // @ts-ignore
 | 
				
			||||||
            var compiledWrapper = engineLoad({ script: '(function $(module, exports, require, __dirname, __filename) {' + origin + '\n});', name: file });
 | 
					            var compiledWrapper = engineLoad({ script: '(function $(module, exports, require, __dirname, __filename) {' + origin + '\n});', name: optional.id });
 | 
				
			||||||
            compiledWrapper.apply(module.exports, [
 | 
					            compiledWrapper.apply(module.exports, [
 | 
				
			||||||
                module, module.exports, module.require, file.parentFile, file
 | 
					                module, module.exports, module.require, file.parentFile, file
 | 
				
			||||||
            ]);
 | 
					            ]);
 | 
				
			||||||
@@ -261,14 +261,16 @@
 | 
				
			|||||||
            // handle name es6-map/implement => es6-map @ms/common/dist/reflect => @ms/common
 | 
					            // handle name es6-map/implement => es6-map @ms/common/dist/reflect => @ms/common
 | 
				
			||||||
            var name_arr = name.split('/');
 | 
					            var name_arr = name.split('/');
 | 
				
			||||||
            var module_name = name.startsWith('@') ? name_arr[0] + '/' + name_arr[1] : name_arr[0];
 | 
					            var module_name = name.startsWith('@') ? name_arr[0] + '/' + name_arr[1] : name_arr[0];
 | 
				
			||||||
 | 
					            var target = root + separatorChar + 'node_modules' + separatorChar + module_name;
 | 
				
			||||||
 | 
					            var _package = new File(target, 'package.json');
 | 
				
			||||||
 | 
					            if (_package.exists()) { return }
 | 
				
			||||||
            // at windows need replace file name java.lang.IllegalArgumentException: Invalid prefix or suffix
 | 
					            // at windows need replace file name java.lang.IllegalArgumentException: Invalid prefix or suffix
 | 
				
			||||||
            var tempFile = Files.createTempFile(module_name.replace('/', '_'), '.json');
 | 
					            var info = fetchPackageInfo(module_name);
 | 
				
			||||||
            var info = fetchPackageInfo(module_name, tempFile);
 | 
					 | 
				
			||||||
            var url = info.versions[info['dist-tags']['latest']].dist.tarball;
 | 
					            var url = info.versions[info['dist-tags']['latest']].dist.tarball;
 | 
				
			||||||
            console.log('fetch node_module ' + module_name + ' from ' + url + ' waiting...')
 | 
					            console.log('fetch node_module ' + module_name + ' from ' + url + ' waiting...')
 | 
				
			||||||
            var tis = new TarInputStream(new BufferedInputStream(new GZIPInputStream(new URL(url).openStream())));
 | 
					            var tis = new TarInputStream(new BufferedInputStream(new GZIPInputStream(new URL(url).openStream())));
 | 
				
			||||||
            // @ts-ignore
 | 
					            // @ts-ignore
 | 
				
			||||||
            var entry; var target = root + separatorChar + 'node_modules' + separatorChar + module_name;
 | 
					            var entry;
 | 
				
			||||||
            while ((entry = tis.getNextEntry()) != null) {
 | 
					            while ((entry = tis.getNextEntry()) != null) {
 | 
				
			||||||
                var targetPath = Paths.get(target + separatorChar + entry.getName().substring(8));
 | 
					                var targetPath = Paths.get(target + separatorChar + entry.getName().substring(8));
 | 
				
			||||||
                targetPath.toFile().getParentFile().mkdirs();
 | 
					                targetPath.toFile().getParentFile().mkdirs();
 | 
				
			||||||
@@ -277,7 +279,8 @@
 | 
				
			|||||||
            return name;
 | 
					            return name;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        function fetchPackageInfo(module_name, tempFile) {
 | 
					        function fetchPackageInfo(module_name) {
 | 
				
			||||||
 | 
					            var tempFile = Files.createTempFile(module_name.replace('/', '_'), '.json');
 | 
				
			||||||
            try {
 | 
					            try {
 | 
				
			||||||
                Files.copy(new URL('https://registry.npm.taobao.org/' + module_name).openStream(), tempFile, StandardCopyOption.REPLACE_EXISTING);
 | 
					                Files.copy(new URL('https://registry.npm.taobao.org/' + module_name).openStream(), tempFile, StandardCopyOption.REPLACE_EXISTING);
 | 
				
			||||||
            } catch (ex) {
 | 
					            } catch (ex) {
 | 
				
			||||||
@@ -292,10 +295,15 @@
 | 
				
			|||||||
         * 检查核心模块
 | 
					         * 检查核心模块
 | 
				
			||||||
         * @param {string} name
 | 
					         * @param {string} name
 | 
				
			||||||
         */
 | 
					         */
 | 
				
			||||||
        function checkCoreModule(name) {
 | 
					        function checkCoreModule(name, path) {
 | 
				
			||||||
            if (CoreModules.indexOf(name) != -1) {
 | 
					            if (CoreModules.indexOf(name) != -1) {
 | 
				
			||||||
                throw new Error("Can't load nodejs core module " + name + " . maybe later will auto replace to @ms/" + name + ' to compatible...')
 | 
					                var newName = '@ms/nodejs/dist/' + name
 | 
				
			||||||
 | 
					                if (resolve(newName, path) !== undefined) {
 | 
				
			||||||
 | 
					                    return newName;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                throw new Error("Can't load nodejs core module " + name + " . maybe later will auto replace to @ms/nodejs/" + name + ' to compatible...')
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					            return name;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        /**
 | 
					        /**
 | 
				
			||||||
@@ -306,7 +314,7 @@
 | 
				
			|||||||
         * @returns {*}
 | 
					         * @returns {*}
 | 
				
			||||||
         */
 | 
					         */
 | 
				
			||||||
        function _require(name, path, optional) {
 | 
					        function _require(name, path, optional) {
 | 
				
			||||||
            checkCoreModule(name);
 | 
					            name = checkCoreModule(name, path);
 | 
				
			||||||
            var file = new File(name);
 | 
					            var file = new File(name);
 | 
				
			||||||
            file = _isFile(file) ? file : resolve(name, path);
 | 
					            file = _isFile(file) ? file : resolve(name, path);
 | 
				
			||||||
            optional = __assign({ cache: true }, optional);
 | 
					            optional = __assign({ cache: true }, optional);
 | 
				
			||||||
@@ -367,9 +375,12 @@
 | 
				
			|||||||
                 * @param {string} name
 | 
					                 * @param {string} name
 | 
				
			||||||
                 */
 | 
					                 */
 | 
				
			||||||
                function __DynamicClear__(name) {
 | 
					                function __DynamicClear__(name) {
 | 
				
			||||||
                    var moduleId = require.resolve(name)
 | 
					                    for (var cacheModule in cacheModules) {
 | 
				
			||||||
                    console.trace('Clear module ' + name + '(' + moduleId + ') ...')
 | 
					                        if (cacheModule.indexOf(name) != -1) {
 | 
				
			||||||
                    return delete cacheModules[moduleId]
 | 
					                            console.trace('Clear module ' + cacheModule + ' ...')
 | 
				
			||||||
 | 
					                            delete cacheModules[cacheModule]
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            return require;
 | 
					            return require;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
@@ -382,11 +393,11 @@
 | 
				
			|||||||
         */
 | 
					         */
 | 
				
			||||||
        var cacheModules = {};
 | 
					        var cacheModules = {};
 | 
				
			||||||
        /**
 | 
					        /**
 | 
				
			||||||
         * @type {{[key:string]:string}} cacheModules
 | 
					         * @type {{[key:string]:string}} cacheModuleIds
 | 
				
			||||||
         */
 | 
					         */
 | 
				
			||||||
        var cacheModuleIds = {};
 | 
					        var cacheModuleIds = {};
 | 
				
			||||||
        /**
 | 
					        /**
 | 
				
			||||||
         * @type {{[key:string]:boolean}} cacheModules
 | 
					         * @type {{[key:string]:boolean}} notFoundModules
 | 
				
			||||||
         */
 | 
					         */
 | 
				
			||||||
        var notFoundModules = {};
 | 
					        var notFoundModules = {};
 | 
				
			||||||
        console.info('Initialization require module. ParentDir:', _canonical(parent));
 | 
					        console.info('Initialization require module. ParentDir:', _canonical(parent));
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user