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