solid-register
Version:
integrated package to run solid browser code in node
61 lines (60 loc) • 2.09 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.init = exports.registerCompiler = void 0;
const fs_1 = require("fs");
const compile_aliases_1 = require("./compile-aliases");
const registeredCompilers = {};
const registerCompiler = (extension, compiler) => {
if (!(extension in registeredCompilers)) {
registeredCompilers[extension] = [];
}
registeredCompilers[extension].push(compiler);
};
exports.registerCompiler = registerCompiler;
const originalLoader = require.extensions[".js"];
const loadModule = (module, filename) => {
try {
originalLoader(module, filename);
}
catch (error) {
if (error && error.code) {
if (error.code === "ERR_REQUIRE_ESM") {
try {
const code = (0, fs_1.readFileSync)(filename, "utf-8");
return module._compile(code, filename);
}
catch (e) {
throw e ?? error;
}
}
}
throw error ?? new Error(`error when compiling ${filename}`);
}
};
const registerExtension = (extension) => {
if (Array.isArray(extension)) {
extension.forEach((ext) => registerExtension(ext));
}
else {
require.extensions[extension] = (module, filename) => {
const oldname = filename;
filename = (0, compile_aliases_1.solidAliasing)(filename);
if (registeredCompilers[extension]) {
const mod = module;
const modCompile = mod._compile.bind(mod);
mod._compile = (code) => modCompile(registeredCompilers[extension].reduce((code, compiler) => compiler.call(module, code, filename), code), code);
loadModule(mod, filename);
}
else {
loadModule(module, filename);
}
};
}
};
const init = () => {
registerExtension(Object.keys(registeredCompilers));
if (!registeredCompilers[".cjs"]) {
registerExtension(".cjs");
}
};
exports.init = init;