@ali-i18n-fe/dada-component
Version:
84 lines (70 loc) • 1.66 kB
JavaScript
const Module = require("module");
const originalRequire = Module.prototype.require;
const utils = require("jsdom/lib/jsdom/utils");
let window;
function getWindow() {
if (!!window) {
return window;
}
const { JSDOM } = require("jsdom");
const jsDom = new JSDOM("", {
url: "http://localhost/",
});
window = jsDom.window;
//Mock canvas (used by qtip)
window.HTMLCanvasElement.prototype.getContext = () => {
return {};
};
return window;
}
/**
* node中Require Browser对象
* @param fn
* @param mockReactDom
* @returns {function(): *}
*/
function wrapJsDom(fn, mockReactDom = {}) {
return function () {
const envVars = [
"document",
"navigator",
"screen",
"location",
"InputEvent",
"atob",
"btoa",
];
getWindow();
global.window = window;
envVars.forEach((env) => {
global[env] = window[env];
});
global.self = global; // isomorphic-fetch need globalThis === global === self
// overwrite require
Module.prototype.require = function (moduleName) {
if (moduleName === "react-dom") {
return mockReactDom;
}
if (
/(png|jpg|gif|woff|woff2|eot|ttf|otf|svg|scss|css)$/.test(moduleName)
) {
return {};
}
return originalRequire.apply(this, arguments);
};
const result = fn(...arguments);
Module.prototype.require = originalRequire;
global.window = null;
envVars.forEach((env) => {
global[env] = null;
});
return result;
};
}
function nodeRequire() {
return wrapJsDom(require)(...arguments);
}
module.exports = {
wrapJsDom,
nodeRequire,
};