From b44ea3f30c8f115ad82e19b69bed63b763d9a819 Mon Sep 17 00:00:00 2001 From: David Ortner Date: Thu, 5 May 2022 17:42:49 +0200 Subject: [PATCH] #462@patch: Fixes problem with Vitest hanging in some scenarios. It was caused by the import of the package "sync-request". --- package-lock.json | 124 +++++++++--------- .../src/fetch/ResourceFetchHandler.ts | 4 +- packages/happy-dom/src/window/GlobalWindow.ts | 9 ++ packages/happy-dom/src/window/Window.ts | 36 +++-- 4 files changed, 97 insertions(+), 76 deletions(-) diff --git a/package-lock.json b/package-lock.json index 275f676ae..58c76de3f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -88,9 +88,9 @@ } }, "node_modules/@angular/common/node_modules/tslib": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", - "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" }, "node_modules/@angular/compiler": { "version": "10.2.5", @@ -101,9 +101,9 @@ } }, "node_modules/@angular/compiler/node_modules/tslib": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", - "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" }, "node_modules/@angular/core": { "version": "10.2.5", @@ -118,9 +118,9 @@ } }, "node_modules/@angular/core/node_modules/tslib": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", - "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" }, "node_modules/@angular/platform-browser": { "version": "10.2.5", @@ -155,14 +155,14 @@ } }, "node_modules/@angular/platform-browser-dynamic/node_modules/tslib": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", - "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" }, "node_modules/@angular/platform-browser/node_modules/tslib": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", - "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" }, "node_modules/@babel/code-frame": { "version": "7.16.7", @@ -2152,9 +2152,9 @@ } }, "node_modules/@lit/reactive-element": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@lit/reactive-element/-/reactive-element-1.3.1.tgz", - "integrity": "sha512-nOJARIr3pReqK3hfFCSW2Zg/kFcFsSAlIE7z4a0C9D2dPrgD/YSn3ZP2ET/rxKB65SXyG7jJbkynBRm+tGlacw==" + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@lit/reactive-element/-/reactive-element-1.3.2.tgz", + "integrity": "sha512-A2e18XzPMrIh35nhIdE4uoqRzoIpEU5vZYuQN4S3Ee1zkGdYC27DP12pewbw/RLgPHzaE4kx/YqxMzebOpm0dA==" }, "node_modules/@mrmlnc/readdir-enhanced": { "version": "2.2.1", @@ -9041,9 +9041,9 @@ "dev": true }, "node_modules/lit": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/lit/-/lit-2.2.2.tgz", - "integrity": "sha512-eN3+2QRHn/erxYB88AXiiRgQA6RltE9MhzySCwX+ACOxA/MLWN3VdXvcbZD9PN09zmUwlgzDvW3T84YWj2Sa0A==", + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/lit/-/lit-2.2.3.tgz", + "integrity": "sha512-5/v+r9dH3Pw/o0rhp/qYk3ERvOUclNF31bWb0FiW6MPgwdQIr+/KCt/p3zcd8aPl8lIGnxdGrVcZA+gWS6oFOQ==", "dependencies": { "@lit/reactive-element": "^1.3.0", "lit-element": "^3.2.0", @@ -9060,9 +9060,9 @@ } }, "node_modules/lit-html": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/lit-html/-/lit-html-2.2.2.tgz", - "integrity": "sha512-cJofCRXuizwyaiGt9pJjJOcauezUlSB6t87VBXsPwRhbzF29MgD8GH6fZ0BuZdXAAC02IRONZBd//VPUuU8QbQ==", + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/lit-html/-/lit-html-2.2.3.tgz", + "integrity": "sha512-vI4j3eWwtQaR8q/O63juZVliBIFMio716X719/lSsGH4UWPy2/7Qf377jsNs4cx3gCHgIbx8yxFgXFQ/igZyXQ==", "dependencies": { "@types/trusted-types": "^2.0.2" } @@ -9768,9 +9768,9 @@ "dev": true }, "node_modules/nanoid": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.2.tgz", - "integrity": "sha512-CuHBogktKwpm5g2sRgv83jEy2ijFzBwMoYA60orPDR7ynsLijJDqgsi4RDGj3OJpy3Ieb+LYwiRmIOGyytgITA==", + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", + "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==", "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -11013,9 +11013,9 @@ } }, "node_modules/postcss": { - "version": "8.4.12", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.12.tgz", - "integrity": "sha512-lg6eITwYe9v6Hr5CncVbK70SoioNQIq81nsaG86ev5hAidQvmOeETBqs7jm43K2F5/Ley3ytDtriImV6TpNiSg==", + "version": "8.4.13", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.13.tgz", + "integrity": "sha512-jtL6eTBrza5MPzy8oJLFuUscHDXTV5KcLlqAWHl5q5WYRfnNRGSmOZmOZ1T6Gy7A99mOZfqungmZMpMmCVJ8ZA==", "funding": [ { "type": "opencollective", @@ -11027,7 +11027,7 @@ } ], "dependencies": { - "nanoid": "^3.3.1", + "nanoid": "^3.3.3", "picocolors": "^1.0.0", "source-map-js": "^1.0.2" }, @@ -14021,9 +14021,9 @@ }, "dependencies": { "tslib": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", - "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" } } }, @@ -14036,9 +14036,9 @@ }, "dependencies": { "tslib": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", - "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" } } }, @@ -14051,9 +14051,9 @@ }, "dependencies": { "tslib": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", - "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" } } }, @@ -14066,9 +14066,9 @@ }, "dependencies": { "tslib": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", - "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" } } }, @@ -14081,9 +14081,9 @@ }, "dependencies": { "tslib": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", - "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" } } }, @@ -15664,9 +15664,9 @@ } }, "@lit/reactive-element": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@lit/reactive-element/-/reactive-element-1.3.1.tgz", - "integrity": "sha512-nOJARIr3pReqK3hfFCSW2Zg/kFcFsSAlIE7z4a0C9D2dPrgD/YSn3ZP2ET/rxKB65SXyG7jJbkynBRm+tGlacw==" + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@lit/reactive-element/-/reactive-element-1.3.2.tgz", + "integrity": "sha512-A2e18XzPMrIh35nhIdE4uoqRzoIpEU5vZYuQN4S3Ee1zkGdYC27DP12pewbw/RLgPHzaE4kx/YqxMzebOpm0dA==" }, "@mrmlnc/readdir-enhanced": { "version": "2.2.1", @@ -21077,9 +21077,9 @@ "dev": true }, "lit": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/lit/-/lit-2.2.2.tgz", - "integrity": "sha512-eN3+2QRHn/erxYB88AXiiRgQA6RltE9MhzySCwX+ACOxA/MLWN3VdXvcbZD9PN09zmUwlgzDvW3T84YWj2Sa0A==", + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/lit/-/lit-2.2.3.tgz", + "integrity": "sha512-5/v+r9dH3Pw/o0rhp/qYk3ERvOUclNF31bWb0FiW6MPgwdQIr+/KCt/p3zcd8aPl8lIGnxdGrVcZA+gWS6oFOQ==", "requires": { "@lit/reactive-element": "^1.3.0", "lit-element": "^3.2.0", @@ -21096,9 +21096,9 @@ } }, "lit-html": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/lit-html/-/lit-html-2.2.2.tgz", - "integrity": "sha512-cJofCRXuizwyaiGt9pJjJOcauezUlSB6t87VBXsPwRhbzF29MgD8GH6fZ0BuZdXAAC02IRONZBd//VPUuU8QbQ==", + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/lit-html/-/lit-html-2.2.3.tgz", + "integrity": "sha512-vI4j3eWwtQaR8q/O63juZVliBIFMio716X719/lSsGH4UWPy2/7Qf377jsNs4cx3gCHgIbx8yxFgXFQ/igZyXQ==", "requires": { "@types/trusted-types": "^2.0.2" } @@ -21657,9 +21657,9 @@ "dev": true }, "nanoid": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.2.tgz", - "integrity": "sha512-CuHBogktKwpm5g2sRgv83jEy2ijFzBwMoYA60orPDR7ynsLijJDqgsi4RDGj3OJpy3Ieb+LYwiRmIOGyytgITA==" + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", + "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==" }, "nanomatch": { "version": "1.2.13", @@ -22610,11 +22610,11 @@ "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=" }, "postcss": { - "version": "8.4.12", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.12.tgz", - "integrity": "sha512-lg6eITwYe9v6Hr5CncVbK70SoioNQIq81nsaG86ev5hAidQvmOeETBqs7jm43K2F5/Ley3ytDtriImV6TpNiSg==", + "version": "8.4.13", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.13.tgz", + "integrity": "sha512-jtL6eTBrza5MPzy8oJLFuUscHDXTV5KcLlqAWHl5q5WYRfnNRGSmOZmOZ1T6Gy7A99mOZfqungmZMpMmCVJ8ZA==", "requires": { - "nanoid": "^3.3.1", + "nanoid": "^3.3.3", "picocolors": "^1.0.0", "source-map-js": "^1.0.2" } diff --git a/packages/happy-dom/src/fetch/ResourceFetchHandler.ts b/packages/happy-dom/src/fetch/ResourceFetchHandler.ts index 6f1419b95..41c2a1c92 100644 --- a/packages/happy-dom/src/fetch/ResourceFetchHandler.ts +++ b/packages/happy-dom/src/fetch/ResourceFetchHandler.ts @@ -1,7 +1,6 @@ import RelativeURL from '../location/RelativeURL'; import DOMException from '../exception/DOMException'; import IDocument from '../nodes/document/IDocument'; -import SyncRequest from 'sync-request'; /** * Helper class for performing fetch of resources. @@ -34,7 +33,8 @@ export default class ResourceFetchHandler { public static fetchSync(document: IDocument, url: string): string { // We want to only load SyncRequest when it is needed to improve performance and not have direct dependencies to server side packages. const absoluteURL = RelativeURL.getAbsoluteURL(document.defaultView.location, url); - const response = SyncRequest('GET', absoluteURL); + const syncRequest = require('sync-request'); + const response = syncRequest('GET', absoluteURL); if (response.isError()) { throw new DOMException( diff --git a/packages/happy-dom/src/window/GlobalWindow.ts b/packages/happy-dom/src/window/GlobalWindow.ts index 40a849a63..4dcefd933 100644 --- a/packages/happy-dom/src/window/GlobalWindow.ts +++ b/packages/happy-dom/src/window/GlobalWindow.ts @@ -79,4 +79,13 @@ export default class GlobalWindow extends Window { public eval(code: string): unknown { return eval(code); } + + /** + * Setup of VM context. + * + * @override + */ + protected _setupVMContext(): void { + // Do nothing + } } diff --git a/packages/happy-dom/src/window/Window.ts b/packages/happy-dom/src/window/Window.ts index e6dd2225f..64bd981d6 100644 --- a/packages/happy-dom/src/window/Window.ts +++ b/packages/happy-dom/src/window/Window.ts @@ -280,6 +280,12 @@ export default class Window extends EventTarget implements IWindow { public Object; public Function; + // Private properties + private _setTimeout = setTimeout; + private _clearTimeout = clearTimeout; + private _setInterval = setInterval; + private _clearInterval = clearInterval; + /** * Constructor. */ @@ -317,14 +323,7 @@ export default class Window extends EventTarget implements IWindow { } } - // Only contextify if there isn't any sub-class handling globals (like GlobalWindow) - if (this.Array === undefined && !VM.isContext(this)) { - VM.createContext(this); - - // Sets global properties from the VM to the Window object. - // Otherwise "this.Array" will be undefined for example. - VM.runInContext(VMGlobalPropertyScript, this); - } + this._setupVMContext(); } /** @@ -435,7 +434,7 @@ export default class Window extends EventTarget implements IWindow { * @returns Timeout ID. */ public setTimeout(callback: () => void, delay = 0): NodeJS.Timeout { - const id = setTimeout(() => { + const id = this._setTimeout(() => { this.happyDOM.asyncTaskManager.endTimer(id); callback(); }, delay); @@ -450,7 +449,7 @@ export default class Window extends EventTarget implements IWindow { * @param id ID of the timeout. */ public clearTimeout(id: NodeJS.Timeout): void { - clearTimeout(id); + this._clearTimeout(id); this.happyDOM.asyncTaskManager.endTimer(id); } @@ -463,7 +462,7 @@ export default class Window extends EventTarget implements IWindow { * @returns Interval ID. */ public setInterval(callback: () => void, delay = 0): NodeJS.Timeout { - const id = setInterval(callback, delay); + const id = this._setInterval(callback, delay); this.happyDOM.asyncTaskManager.startTimer(id); return id; } @@ -475,7 +474,7 @@ export default class Window extends EventTarget implements IWindow { * @param id ID of the interval. */ public clearInterval(id: NodeJS.Timeout): void { - clearInterval(id); + this._clearInterval(id); this.happyDOM.asyncTaskManager.endTimer(id); } @@ -513,4 +512,17 @@ export default class Window extends EventTarget implements IWindow { public async fetch(url: string, init?: IRequestInit): Promise { return await FetchHandler.fetch(this.document, url, init); } + + /** + * Setup of VM context. + */ + protected _setupVMContext(): void { + if (!VM.isContext(this)) { + VM.createContext(this); + + // Sets global properties from the VM to the Window object. + // Otherwise "this.Array" will be undefined for example. + VM.runInContext(VMGlobalPropertyScript, this); + } + } }