UNPKG

@ali-i18n-fe/dada-component

Version:
84 lines (70 loc) 1.66 kB
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, };