core: add jsc loader

This commit is contained in:
undefined committed 2022-02-28 14:21:44 +08:00
1 parent 5d27bce80e
commit 6a289f788d
5 files changed
+48 -39

No files matched your search

+32
View File
@@ -18,6 +18,7 @@ require('source-map-support').install({
});
const os = require('os');
const path = require('path');
const vm = require('vm');
const fs = require('fs-extra');
const argv = require('cac')().parse();
const child = require('child_process');
@@ -60,6 +61,10 @@ function transform(filename) {
return result.code;
}
const ESM = ['p-queue', 'p-timeout'];
const _script = new vm.Script('"Hydro"', { produceCachedData: true });
const bytecode = (_script.createCachedData && _script.createCachedData.call)
? _script.createCachedData()
: _script.cachedData;
require.extensions['.js'] = function loader(module, filename) {
if (ESM.filter((i) => filename.includes(i)).length || major < 14) {
return module._compile(transform(filename), filename);
@@ -70,6 +75,33 @@ require.extensions['.js'] = function loader(module, filename) {
require.extensions['.ts'] = require.extensions['.tsx'] = function loader(module, filename) {
return module._compile(transform(filename), filename);
};
require.extensions['.jsc'] = function loader(module, filename) {
const buf = fs.readFileSync(filename);
bytecode.slice(12, 16).copy(buf, 12);
if (![12, 13, 14, 15, 16, 17].filter((i) => process.version.startsWith(`v${i}`)).length) {
bytecode.slice(16, 20).copy(buf, 16);
}
// eslint-disable-next-line no-return-assign
const length = buf.slice(8, 12).reduce((sum, number, power) => sum += number * (256 ** power), 0);
let dummyCode = '';
if (length > 1) dummyCode = `"${'\u200b'.repeat(length - 2)}"`;
const script = new vm.Script(dummyCode, {
filename,
lineOffset: 0,
displayErrors: true,
cachedData: buf,
});
if (script.cachedDataRejected) throw new Error(`cacheDataRejected on ${filename}`);
const compiledWrapper = script.runInThisContext({
filename,
lineOffset: 0,
columnOffset: 0,
displayErrors: true,
});
const dirname = path.dirname(filename);
const args = [module.exports, require, module, filename, dirname, process, global];
return compiledWrapper.apply(module.exports, args);
};
function buildUrl(opts) {
let mongourl = `${opts.protocol || 'mongodb'}://`;