'use strict'; import {extend} from "../../source/data/extend.mjs"; import {getGlobal} from "../../source/types/global.mjs"; //import Storage from "dom-storage"; export const isBrowser = new Function("try {return this===window;}catch(e){ return false;}"); export const isNode = new Function("try {return this===global;}catch(e){return false;}"); let JSDOMExport = null; /** * this helper function creates the dom stack in the node environment * * @return {Promise<unknown>|Promise<void>} */ function initJSDOM(options) { if (typeof window === "object" && window['DOMParser']) return Promise.resolve(); const g = getGlobal(); options = extend({}, { pretendToBeVisual: true, contentType: "text/html", includeNodeLocations: true, storageQuota: 10000000, runScripts: "dangerously", resources: "usable" }, options || {}) return import("jsdom").then(({JSDOM}) => { JSDOMExport = JSDOM; const {window} = new JSDOM(`<html> <head> </head> <body> <div id="mocks"></div> </body>`, options); g['window'] = window; return new Promise((resolve, reject) => window.addEventListener("load", () => { [ 'Blob', 'CSSStyleSheet', 'customElements', 'CustomEvent', 'document', 'Document', 'DocumentFragment', 'DOMParser', 'Element', 'ElementInternals', 'Event', 'EventTarget', 'getComputedStyle', 'HTMLButtonElement', 'HTMLCollection', 'HTMLDivElement', 'HTMLDocument', 'HTMLElement', 'HTMLFormElement', 'HTMLInputElement', 'HTMLScriptElement', 'HTMLSelectElement', 'HTMLTemplateElement', 'HTMLTextAreaElement', 'InputEvent', 'KeyboardEvent', 'MutationObserver', 'navigator', 'Node', 'NodeFilter', 'NodeList', 'self', 'ShadowRoot', 'XMLSerializer', ].forEach(key => { g[key] = window[key] }); import("dom-storage").then(({default: Storage}) => { g.localStorage = new Storage(null, {strict: true}); g.sessionStorage = new Storage(null, {strict: true}); window['localStorage'] = g.localStorage; window['sessionStorage'] = g.sessionStorage; resolve(g); }).catch(e => { console.error(e); reject(e); }); }) ); }); } export {initJSDOM, JSDOMExport}