happy-dom 16.8.0 → 17.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/cjs/PropertySymbol.cjs +13 -1
- package/cjs/PropertySymbol.cjs.map +1 -1
- package/cjs/PropertySymbol.d.ts +12 -0
- package/cjs/PropertySymbol.d.ts.map +1 -1
- package/cjs/async-task-manager/AsyncTaskManager.cjs +67 -18
- package/cjs/async-task-manager/AsyncTaskManager.cjs.map +1 -1
- package/cjs/async-task-manager/AsyncTaskManager.d.ts +5 -0
- package/cjs/async-task-manager/AsyncTaskManager.d.ts.map +1 -1
- package/cjs/browser/BrowserSettingsFactory.cjs +4 -0
- package/cjs/browser/BrowserSettingsFactory.cjs.map +1 -1
- package/cjs/browser/BrowserSettingsFactory.d.ts.map +1 -1
- package/cjs/browser/DefaultBrowserSettings.cjs +3 -0
- package/cjs/browser/DefaultBrowserSettings.cjs.map +1 -1
- package/cjs/browser/DefaultBrowserSettings.d.ts.map +1 -1
- package/cjs/browser/types/IBrowserSettings.d.ts +6 -0
- package/cjs/browser/types/IBrowserSettings.d.ts.map +1 -1
- package/cjs/browser/types/IOptionalBrowserSettings.d.ts +6 -0
- package/cjs/browser/types/IOptionalBrowserSettings.d.ts.map +1 -1
- package/cjs/browser/utilities/BrowserFrameNavigator.cjs.map +1 -1
- package/cjs/browser/utilities/BrowserFrameNavigator.d.ts.map +1 -1
- package/cjs/dom/DOMTokenList.cjs +7 -4
- package/cjs/dom/DOMTokenList.cjs.map +1 -1
- package/cjs/dom/DOMTokenList.d.ts +5 -3
- package/cjs/dom/DOMTokenList.d.ts.map +1 -1
- package/cjs/event/EventTarget.cjs +31 -5
- package/cjs/event/EventTarget.cjs.map +1 -1
- package/cjs/event/EventTarget.d.ts.map +1 -1
- package/cjs/fetch/Fetch.cjs +67 -13
- package/cjs/fetch/Fetch.cjs.map +1 -1
- package/cjs/fetch/Fetch.d.ts +3 -0
- package/cjs/fetch/Fetch.d.ts.map +1 -1
- package/cjs/fetch/Request.cjs +119 -27
- package/cjs/fetch/Request.cjs.map +1 -1
- package/cjs/fetch/Request.d.ts +65 -9
- package/cjs/fetch/Request.d.ts.map +1 -1
- package/cjs/fetch/ResourceFetch.cjs +91 -13
- package/cjs/fetch/ResourceFetch.cjs.map +1 -1
- package/cjs/fetch/ResourceFetch.d.ts +21 -11
- package/cjs/fetch/ResourceFetch.d.ts.map +1 -1
- package/cjs/fetch/SyncFetch.cjs +36 -7
- package/cjs/fetch/SyncFetch.cjs.map +1 -1
- package/cjs/fetch/SyncFetch.d.ts.map +1 -1
- package/cjs/fetch/preload/PreloadEntry.cjs +44 -0
- package/cjs/fetch/preload/PreloadEntry.cjs.map +1 -0
- package/cjs/fetch/preload/PreloadEntry.d.ts +26 -0
- package/cjs/fetch/preload/PreloadEntry.d.ts.map +1 -0
- package/cjs/fetch/preload/PreloadUtility.cjs +29 -0
- package/cjs/fetch/preload/PreloadUtility.cjs.map +1 -0
- package/cjs/fetch/preload/PreloadUtility.d.ts +26 -0
- package/cjs/fetch/preload/PreloadUtility.d.ts.map +1 -0
- package/cjs/fetch/types/IRequestInit.d.ts +2 -0
- package/cjs/fetch/types/IRequestInit.d.ts.map +1 -1
- package/cjs/fetch/types/IRequestMode.cjs +3 -0
- package/cjs/fetch/types/IRequestMode.cjs.map +1 -0
- package/cjs/fetch/types/IRequestMode.d.ts +3 -0
- package/cjs/fetch/types/IRequestMode.d.ts.map +1 -0
- package/cjs/fetch/utilities/FetchRequestReferrerUtility.cjs +1 -1
- package/cjs/fetch/utilities/FetchRequestReferrerUtility.cjs.map +1 -1
- package/cjs/module/CSSModule.cjs +47 -0
- package/cjs/module/CSSModule.cjs.map +1 -0
- package/cjs/module/CSSModule.d.ts +34 -0
- package/cjs/module/CSSModule.d.ts.map +1 -0
- package/cjs/module/ECMAScriptModule.cjs +157 -0
- package/cjs/module/ECMAScriptModule.cjs.map +1 -0
- package/cjs/module/ECMAScriptModule.d.ts +36 -0
- package/cjs/module/ECMAScriptModule.d.ts.map +1 -0
- package/cjs/module/ECMAScriptModuleCompiler.cjs +550 -0
- package/cjs/module/ECMAScriptModuleCompiler.cjs.map +1 -0
- package/cjs/module/ECMAScriptModuleCompiler.d.ts +31 -0
- package/cjs/module/ECMAScriptModuleCompiler.d.ts.map +1 -0
- package/cjs/module/IECMAScriptModuleCompiledResult.cjs +3 -0
- package/cjs/module/IECMAScriptModuleCompiledResult.cjs.map +1 -0
- package/cjs/module/IECMAScriptModuleCompiledResult.d.ts +21 -0
- package/cjs/module/IECMAScriptModuleCompiledResult.d.ts.map +1 -0
- package/cjs/module/IECMAScriptModuleImport.cjs +3 -0
- package/cjs/module/IECMAScriptModuleImport.cjs.map +1 -0
- package/cjs/module/IECMAScriptModuleImport.d.ts +5 -0
- package/cjs/module/IECMAScriptModuleImport.d.ts.map +1 -0
- package/cjs/module/IModule.cjs +3 -0
- package/cjs/module/IModule.cjs.map +1 -0
- package/cjs/module/IModule.d.ts +21 -0
- package/cjs/module/IModule.d.ts.map +1 -0
- package/cjs/module/IModuleImportMap.cjs +3 -0
- package/cjs/module/IModuleImportMap.cjs.map +1 -0
- package/cjs/module/IModuleImportMap.d.ts +10 -0
- package/cjs/module/IModuleImportMap.d.ts.map +1 -0
- package/cjs/module/IModuleImportMapRule.cjs +3 -0
- package/cjs/module/IModuleImportMapRule.cjs.map +1 -0
- package/cjs/module/IModuleImportMapRule.d.ts +5 -0
- package/cjs/module/IModuleImportMapRule.d.ts.map +1 -0
- package/cjs/module/IModuleImportMapScope.cjs +3 -0
- package/cjs/module/IModuleImportMapScope.cjs.map +1 -0
- package/cjs/module/IModuleImportMapScope.d.ts +6 -0
- package/cjs/module/IModuleImportMapScope.d.ts.map +1 -0
- package/cjs/module/JSONModule.cjs +52 -0
- package/cjs/module/JSONModule.cjs.map +1 -0
- package/cjs/module/JSONModule.d.ts +33 -0
- package/cjs/module/JSONModule.d.ts.map +1 -0
- package/cjs/module/ModuleFactory.cjs +136 -0
- package/cjs/module/ModuleFactory.cjs.map +1 -0
- package/cjs/module/ModuleFactory.d.ts +33 -0
- package/cjs/module/ModuleFactory.d.ts.map +1 -0
- package/cjs/module/ModuleURLUtility.cjs +67 -0
- package/cjs/module/ModuleURLUtility.cjs.map +1 -0
- package/cjs/module/ModuleURLUtility.d.ts +17 -0
- package/cjs/module/ModuleURLUtility.d.ts.map +1 -0
- package/cjs/module/UnresolvedModule.cjs +70 -0
- package/cjs/module/UnresolvedModule.cjs.map +1 -0
- package/cjs/module/UnresolvedModule.d.ts +43 -0
- package/cjs/module/UnresolvedModule.d.ts.map +1 -0
- package/cjs/nodes/document/Document.cjs +1 -0
- package/cjs/nodes/document/Document.cjs.map +1 -1
- package/cjs/nodes/document/Document.d.ts +2 -0
- package/cjs/nodes/document/Document.d.ts.map +1 -1
- package/cjs/nodes/element/Element.cjs +21 -5
- package/cjs/nodes/element/Element.cjs.map +1 -1
- package/cjs/nodes/element/Element.d.ts +6 -0
- package/cjs/nodes/element/Element.d.ts.map +1 -1
- package/cjs/nodes/element/NamedNodeMap.cjs +1 -0
- package/cjs/nodes/element/NamedNodeMap.cjs.map +1 -1
- package/cjs/nodes/element/NamedNodeMap.d.ts.map +1 -1
- package/cjs/nodes/html-anchor-element/HTMLAnchorElement.cjs +8 -0
- package/cjs/nodes/html-anchor-element/HTMLAnchorElement.cjs.map +1 -1
- package/cjs/nodes/html-anchor-element/HTMLAnchorElement.d.ts +6 -0
- package/cjs/nodes/html-anchor-element/HTMLAnchorElement.d.ts.map +1 -1
- package/cjs/nodes/html-area-element/HTMLAreaElement.cjs +8 -0
- package/cjs/nodes/html-area-element/HTMLAreaElement.cjs.map +1 -1
- package/cjs/nodes/html-area-element/HTMLAreaElement.d.ts +6 -0
- package/cjs/nodes/html-area-element/HTMLAreaElement.d.ts.map +1 -1
- package/cjs/nodes/html-element/HTMLElement.cjs +3 -0
- package/cjs/nodes/html-element/HTMLElement.cjs.map +1 -1
- package/cjs/nodes/html-element/HTMLElement.d.ts.map +1 -1
- package/cjs/nodes/html-iframe-element/HTMLIFrameElement.cjs +7 -3
- package/cjs/nodes/html-iframe-element/HTMLIFrameElement.cjs.map +1 -1
- package/cjs/nodes/html-iframe-element/HTMLIFrameElement.d.ts.map +1 -1
- package/cjs/nodes/html-link-element/HTMLLinkElement.cjs +147 -19
- package/cjs/nodes/html-link-element/HTMLLinkElement.cjs.map +1 -1
- package/cjs/nodes/html-link-element/HTMLLinkElement.d.ts +8 -2
- package/cjs/nodes/html-link-element/HTMLLinkElement.d.ts.map +1 -1
- package/cjs/nodes/html-media-element/HTMLMediaElement.cjs +8 -0
- package/cjs/nodes/html-media-element/HTMLMediaElement.cjs.map +1 -1
- package/cjs/nodes/html-media-element/HTMLMediaElement.d.ts +6 -0
- package/cjs/nodes/html-media-element/HTMLMediaElement.d.ts.map +1 -1
- package/cjs/nodes/html-script-element/HTMLScriptElement.cjs +380 -46
- package/cjs/nodes/html-script-element/HTMLScriptElement.cjs.map +1 -1
- package/cjs/nodes/html-script-element/HTMLScriptElement.d.ts +80 -0
- package/cjs/nodes/html-script-element/HTMLScriptElement.d.ts.map +1 -1
- package/cjs/nodes/html-table-cell-element/HTMLTableCellElement.cjs +0 -1
- package/cjs/nodes/html-table-cell-element/HTMLTableCellElement.cjs.map +1 -1
- package/cjs/nodes/html-table-cell-element/HTMLTableCellElement.d.ts +0 -3
- package/cjs/nodes/html-table-cell-element/HTMLTableCellElement.d.ts.map +1 -1
- package/cjs/utilities/AttributeUtility.cjs +36 -0
- package/cjs/utilities/AttributeUtility.cjs.map +1 -0
- package/cjs/utilities/AttributeUtility.d.ts +18 -0
- package/cjs/utilities/AttributeUtility.d.ts.map +1 -0
- package/cjs/window/BrowserWindow.cjs +73 -6
- package/cjs/window/BrowserWindow.cjs.map +1 -1
- package/cjs/window/BrowserWindow.d.ts +14 -0
- package/cjs/window/BrowserWindow.d.ts.map +1 -1
- package/lib/PropertySymbol.d.ts +12 -0
- package/lib/PropertySymbol.d.ts.map +1 -1
- package/lib/PropertySymbol.js +12 -0
- package/lib/PropertySymbol.js.map +1 -1
- package/lib/async-task-manager/AsyncTaskManager.d.ts +5 -0
- package/lib/async-task-manager/AsyncTaskManager.d.ts.map +1 -1
- package/lib/async-task-manager/AsyncTaskManager.js +67 -18
- package/lib/async-task-manager/AsyncTaskManager.js.map +1 -1
- package/lib/browser/BrowserSettingsFactory.d.ts.map +1 -1
- package/lib/browser/BrowserSettingsFactory.js +4 -0
- package/lib/browser/BrowserSettingsFactory.js.map +1 -1
- package/lib/browser/DefaultBrowserSettings.d.ts.map +1 -1
- package/lib/browser/DefaultBrowserSettings.js +3 -0
- package/lib/browser/DefaultBrowserSettings.js.map +1 -1
- package/lib/browser/types/IBrowserSettings.d.ts +6 -0
- package/lib/browser/types/IBrowserSettings.d.ts.map +1 -1
- package/lib/browser/types/IOptionalBrowserSettings.d.ts +6 -0
- package/lib/browser/types/IOptionalBrowserSettings.d.ts.map +1 -1
- package/lib/browser/utilities/BrowserFrameNavigator.d.ts.map +1 -1
- package/lib/browser/utilities/BrowserFrameNavigator.js.map +1 -1
- package/lib/dom/DOMTokenList.d.ts +5 -3
- package/lib/dom/DOMTokenList.d.ts.map +1 -1
- package/lib/dom/DOMTokenList.js +7 -4
- package/lib/dom/DOMTokenList.js.map +1 -1
- package/lib/event/EventTarget.d.ts.map +1 -1
- package/lib/event/EventTarget.js +31 -5
- package/lib/event/EventTarget.js.map +1 -1
- package/lib/fetch/Fetch.d.ts +3 -0
- package/lib/fetch/Fetch.d.ts.map +1 -1
- package/lib/fetch/Fetch.js +64 -10
- package/lib/fetch/Fetch.js.map +1 -1
- package/lib/fetch/Request.d.ts +65 -9
- package/lib/fetch/Request.d.ts.map +1 -1
- package/lib/fetch/Request.js +116 -24
- package/lib/fetch/Request.js.map +1 -1
- package/lib/fetch/ResourceFetch.d.ts +21 -11
- package/lib/fetch/ResourceFetch.d.ts.map +1 -1
- package/lib/fetch/ResourceFetch.js +68 -13
- package/lib/fetch/ResourceFetch.js.map +1 -1
- package/lib/fetch/SyncFetch.d.ts.map +1 -1
- package/lib/fetch/SyncFetch.js +36 -7
- package/lib/fetch/SyncFetch.js.map +1 -1
- package/lib/fetch/preload/PreloadEntry.d.ts +26 -0
- package/lib/fetch/preload/PreloadEntry.d.ts.map +1 -0
- package/lib/fetch/preload/PreloadEntry.js +41 -0
- package/lib/fetch/preload/PreloadEntry.js.map +1 -0
- package/lib/fetch/preload/PreloadUtility.d.ts +26 -0
- package/lib/fetch/preload/PreloadUtility.d.ts.map +1 -0
- package/lib/fetch/preload/PreloadUtility.js +26 -0
- package/lib/fetch/preload/PreloadUtility.js.map +1 -0
- package/lib/fetch/types/IRequestInit.d.ts +2 -0
- package/lib/fetch/types/IRequestInit.d.ts.map +1 -1
- package/lib/fetch/types/IRequestMode.d.ts +3 -0
- package/lib/fetch/types/IRequestMode.d.ts.map +1 -0
- package/lib/fetch/types/IRequestMode.js +2 -0
- package/lib/fetch/types/IRequestMode.js.map +1 -0
- package/lib/fetch/utilities/FetchRequestReferrerUtility.js +1 -1
- package/lib/fetch/utilities/FetchRequestReferrerUtility.js.map +1 -1
- package/lib/module/CSSModule.d.ts +34 -0
- package/lib/module/CSSModule.d.ts.map +1 -0
- package/lib/module/CSSModule.js +44 -0
- package/lib/module/CSSModule.js.map +1 -0
- package/lib/module/ECMAScriptModule.d.ts +36 -0
- package/lib/module/ECMAScriptModule.d.ts.map +1 -0
- package/lib/module/ECMAScriptModule.js +128 -0
- package/lib/module/ECMAScriptModule.js.map +1 -0
- package/lib/module/ECMAScriptModuleCompiler.d.ts +31 -0
- package/lib/module/ECMAScriptModuleCompiler.d.ts.map +1 -0
- package/lib/module/ECMAScriptModuleCompiler.js +521 -0
- package/lib/module/ECMAScriptModuleCompiler.js.map +1 -0
- package/lib/module/IECMAScriptModuleCompiledResult.d.ts +21 -0
- package/lib/module/IECMAScriptModuleCompiledResult.d.ts.map +1 -0
- package/lib/module/IECMAScriptModuleCompiledResult.js +2 -0
- package/lib/module/IECMAScriptModuleCompiledResult.js.map +1 -0
- package/lib/module/IECMAScriptModuleImport.d.ts +5 -0
- package/lib/module/IECMAScriptModuleImport.d.ts.map +1 -0
- package/lib/module/IECMAScriptModuleImport.js +2 -0
- package/lib/module/IECMAScriptModuleImport.js.map +1 -0
- package/lib/module/IModule.d.ts +21 -0
- package/lib/module/IModule.d.ts.map +1 -0
- package/lib/module/IModule.js +2 -0
- package/lib/module/IModule.js.map +1 -0
- package/lib/module/IModuleImportMap.d.ts +10 -0
- package/lib/module/IModuleImportMap.d.ts.map +1 -0
- package/lib/module/IModuleImportMap.js +2 -0
- package/lib/module/IModuleImportMap.js.map +1 -0
- package/lib/module/IModuleImportMapRule.d.ts +5 -0
- package/lib/module/IModuleImportMapRule.d.ts.map +1 -0
- package/lib/module/IModuleImportMapRule.js +2 -0
- package/lib/module/IModuleImportMapRule.js.map +1 -0
- package/lib/module/IModuleImportMapScope.d.ts +6 -0
- package/lib/module/IModuleImportMapScope.d.ts.map +1 -0
- package/lib/module/IModuleImportMapScope.js +2 -0
- package/lib/module/IModuleImportMapScope.js.map +1 -0
- package/lib/module/JSONModule.d.ts +33 -0
- package/lib/module/JSONModule.d.ts.map +1 -0
- package/lib/module/JSONModule.js +49 -0
- package/lib/module/JSONModule.js.map +1 -0
- package/lib/module/ModuleFactory.d.ts +33 -0
- package/lib/module/ModuleFactory.d.ts.map +1 -0
- package/lib/module/ModuleFactory.js +107 -0
- package/lib/module/ModuleFactory.js.map +1 -0
- package/lib/module/ModuleURLUtility.d.ts +17 -0
- package/lib/module/ModuleURLUtility.d.ts.map +1 -0
- package/lib/module/ModuleURLUtility.js +41 -0
- package/lib/module/ModuleURLUtility.js.map +1 -0
- package/lib/module/UnresolvedModule.d.ts +43 -0
- package/lib/module/UnresolvedModule.d.ts.map +1 -0
- package/lib/module/UnresolvedModule.js +67 -0
- package/lib/module/UnresolvedModule.js.map +1 -0
- package/lib/nodes/document/Document.d.ts +2 -0
- package/lib/nodes/document/Document.d.ts.map +1 -1
- package/lib/nodes/document/Document.js +1 -0
- package/lib/nodes/document/Document.js.map +1 -1
- package/lib/nodes/element/Element.d.ts +6 -0
- package/lib/nodes/element/Element.d.ts.map +1 -1
- package/lib/nodes/element/Element.js +21 -5
- package/lib/nodes/element/Element.js.map +1 -1
- package/lib/nodes/element/NamedNodeMap.d.ts.map +1 -1
- package/lib/nodes/element/NamedNodeMap.js +1 -0
- package/lib/nodes/element/NamedNodeMap.js.map +1 -1
- package/lib/nodes/html-anchor-element/HTMLAnchorElement.d.ts +6 -0
- package/lib/nodes/html-anchor-element/HTMLAnchorElement.d.ts.map +1 -1
- package/lib/nodes/html-anchor-element/HTMLAnchorElement.js +8 -0
- package/lib/nodes/html-anchor-element/HTMLAnchorElement.js.map +1 -1
- package/lib/nodes/html-area-element/HTMLAreaElement.d.ts +6 -0
- package/lib/nodes/html-area-element/HTMLAreaElement.d.ts.map +1 -1
- package/lib/nodes/html-area-element/HTMLAreaElement.js +8 -0
- package/lib/nodes/html-area-element/HTMLAreaElement.js.map +1 -1
- package/lib/nodes/html-element/HTMLElement.d.ts.map +1 -1
- package/lib/nodes/html-element/HTMLElement.js +3 -0
- package/lib/nodes/html-element/HTMLElement.js.map +1 -1
- package/lib/nodes/html-iframe-element/HTMLIFrameElement.d.ts.map +1 -1
- package/lib/nodes/html-iframe-element/HTMLIFrameElement.js +7 -3
- package/lib/nodes/html-iframe-element/HTMLIFrameElement.js.map +1 -1
- package/lib/nodes/html-link-element/HTMLLinkElement.d.ts +8 -2
- package/lib/nodes/html-link-element/HTMLLinkElement.d.ts.map +1 -1
- package/lib/nodes/html-link-element/HTMLLinkElement.js +147 -19
- package/lib/nodes/html-link-element/HTMLLinkElement.js.map +1 -1
- package/lib/nodes/html-media-element/HTMLMediaElement.d.ts +6 -0
- package/lib/nodes/html-media-element/HTMLMediaElement.d.ts.map +1 -1
- package/lib/nodes/html-media-element/HTMLMediaElement.js +8 -0
- package/lib/nodes/html-media-element/HTMLMediaElement.js.map +1 -1
- package/lib/nodes/html-script-element/HTMLScriptElement.d.ts +80 -0
- package/lib/nodes/html-script-element/HTMLScriptElement.d.ts.map +1 -1
- package/lib/nodes/html-script-element/HTMLScriptElement.js +380 -46
- package/lib/nodes/html-script-element/HTMLScriptElement.js.map +1 -1
- package/lib/nodes/html-table-cell-element/HTMLTableCellElement.d.ts +0 -3
- package/lib/nodes/html-table-cell-element/HTMLTableCellElement.d.ts.map +1 -1
- package/lib/nodes/html-table-cell-element/HTMLTableCellElement.js +0 -1
- package/lib/nodes/html-table-cell-element/HTMLTableCellElement.js.map +1 -1
- package/lib/utilities/AttributeUtility.d.ts +18 -0
- package/lib/utilities/AttributeUtility.d.ts.map +1 -0
- package/lib/utilities/AttributeUtility.js +29 -0
- package/lib/utilities/AttributeUtility.js.map +1 -0
- package/lib/window/BrowserWindow.d.ts +14 -0
- package/lib/window/BrowserWindow.d.ts.map +1 -1
- package/lib/window/BrowserWindow.js +73 -6
- package/lib/window/BrowserWindow.js.map +1 -1
- package/package.json +1 -1
- package/src/PropertySymbol.ts +12 -0
- package/src/async-task-manager/AsyncTaskManager.ts +81 -19
- package/src/browser/BrowserSettingsFactory.ts +4 -0
- package/src/browser/DefaultBrowserSettings.ts +3 -0
- package/src/browser/types/IBrowserSettings.ts +7 -0
- package/src/browser/types/IOptionalBrowserSettings.ts +7 -0
- package/src/browser/utilities/BrowserFrameNavigator.ts +2 -7
- package/src/dom/DOMTokenList.ts +12 -4
- package/src/event/EventTarget.ts +31 -11
- package/src/fetch/Fetch.ts +82 -16
- package/src/fetch/Request.ts +132 -24
- package/src/fetch/ResourceFetch.ts +99 -14
- package/src/fetch/SyncFetch.ts +41 -9
- package/src/fetch/preload/PreloadEntry.ts +46 -0
- package/src/fetch/preload/PreloadUtility.ts +33 -0
- package/src/fetch/types/IRequestInit.ts +2 -0
- package/src/fetch/types/IRequestMode.ts +2 -0
- package/src/fetch/utilities/FetchRequestReferrerUtility.ts +1 -1
- package/src/module/CSSModule.ts +54 -0
- package/src/module/ECMAScriptModule.ts +171 -0
- package/src/module/ECMAScriptModuleCompiler.ts +567 -0
- package/src/module/IECMAScriptModuleCompiledResult.ts +14 -0
- package/src/module/IECMAScriptModuleImport.ts +4 -0
- package/src/module/IModule.ts +20 -0
- package/src/module/IModuleImportMap.ts +10 -0
- package/src/module/IModuleImportMapRule.ts +4 -0
- package/src/module/IModuleImportMapScope.ts +6 -0
- package/src/module/JSONModule.ts +59 -0
- package/src/module/ModuleFactory.ts +134 -0
- package/src/module/ModuleURLUtility.ts +51 -0
- package/src/module/UnresolvedModule.ts +77 -0
- package/src/nodes/document/Document.ts +2 -0
- package/src/nodes/element/Element.ts +25 -7
- package/src/nodes/element/NamedNodeMap.ts +1 -0
- package/src/nodes/html-anchor-element/HTMLAnchorElement.ts +9 -0
- package/src/nodes/html-area-element/HTMLAreaElement.ts +9 -0
- package/src/nodes/html-element/HTMLElement.ts +3 -0
- package/src/nodes/html-iframe-element/HTMLIFrameElement.ts +9 -8
- package/src/nodes/html-link-element/HTMLLinkElement.ts +181 -28
- package/src/nodes/html-media-element/HTMLMediaElement.ts +9 -0
- package/src/nodes/html-script-element/HTMLScriptElement.ts +441 -69
- package/src/nodes/html-table-cell-element/HTMLTableCellElement.ts +0 -3
- package/src/utilities/AttributeUtility.ts +43 -0
- package/src/window/BrowserWindow.ts +77 -10
- package/cjs/window/WindowErrorUtility.cjs +0 -85
- package/cjs/window/WindowErrorUtility.cjs.map +0 -1
- package/cjs/window/WindowErrorUtility.d.ts +0 -27
- package/cjs/window/WindowErrorUtility.d.ts.map +0 -1
- package/lib/window/WindowErrorUtility.d.ts +0 -27
- package/lib/window/WindowErrorUtility.d.ts.map +0 -1
- package/lib/window/WindowErrorUtility.js +0 -56
- package/lib/window/WindowErrorUtility.js.map +0 -1
- package/src/window/WindowErrorUtility.ts +0 -68
@@ -0,0 +1,567 @@
|
|
1
|
+
import BrowserErrorCaptureEnum from '../browser/enums/BrowserErrorCaptureEnum.js';
|
2
|
+
import BrowserWindow from '../window/BrowserWindow.js';
|
3
|
+
import WindowBrowserContext from '../window/WindowBrowserContext.js';
|
4
|
+
import IECMAScriptModuleCompiledResult from './IECMAScriptModuleCompiledResult.js';
|
5
|
+
import IECMAScriptModuleImport from './IECMAScriptModuleImport.js';
|
6
|
+
import ModuleURLUtility from './ModuleURLUtility.js';
|
7
|
+
import * as PropertySymbol from '../PropertySymbol.js';
|
8
|
+
|
9
|
+
/**
|
10
|
+
* Code regexp.
|
11
|
+
*
|
12
|
+
* Group 1: Import without exported properties.
|
13
|
+
* Group 2: Dynamic import function call.
|
14
|
+
* Group 3: Import exported variables.
|
15
|
+
* Group 4: Import exported url.
|
16
|
+
* Group 5: Import with group.
|
17
|
+
* Group 6: Import with type.
|
18
|
+
* Group 7: Modules in export from module statement.
|
19
|
+
* Group 8: Import in export from module statement.
|
20
|
+
* Group 9: Export default statement.
|
21
|
+
* Group 10: Export function or class type.
|
22
|
+
* Group 11: Export function or class name.
|
23
|
+
* Group 12: Export object.
|
24
|
+
* Group 13: Export variable type (var, let or const).
|
25
|
+
* Group 14: Export variable name.
|
26
|
+
* Group 15: Export variable name end character (= or ;).
|
27
|
+
* Group 16: Slash (RegExp or comment).
|
28
|
+
* Group 17: Parentheses.
|
29
|
+
* Group 18: Curly braces.
|
30
|
+
* Group 19: Square brackets.
|
31
|
+
* Group 20: Escape template string (${).
|
32
|
+
* Group 21: Template string apostrophe (`).
|
33
|
+
* Group 22: String apostrophe (').
|
34
|
+
* Group 23: String apostrophe (").
|
35
|
+
* Group 24: Line feed character.
|
36
|
+
*/
|
37
|
+
const CODE_REGEXP =
|
38
|
+
/import\s*["']([^"']+)["'];{0,1}|import\s*\(([^)]+)\)|(import[\s{])|[\s}]from\s*["']([^"']+)["'](\s+with\s*{\s*type\s*:\s*["']([^"']+)["']\s*}){0,1}|export\s([a-zA-Z0-9-_$]+|\*|\*\s+as\s+["'a-zA-Z0-9-_$]+|{[^}]+})\s*from\s["']([^"']+)["']|(export\s*default\s*)|export\s*(function\*{0,1}|class)\s*([^({\s]+)|export\s*{([^}]+)}|export\s+(var|let|const)\s+([^=;]+)(=|;)|(\/)|(\(|\))|({|})|(\[|\])|(\${)|(`)|(')|(")|(\n)/gm;
|
39
|
+
|
40
|
+
/**
|
41
|
+
* Import regexp.
|
42
|
+
*
|
43
|
+
* Group 1: Import braces.
|
44
|
+
* Group 2: Import all as.
|
45
|
+
* Group 3: Import default.
|
46
|
+
*/
|
47
|
+
const IMPORT_REGEXP = /{([^}]+)}|\*\s+as\s+([a-zA-Z0-9-_$]+)|([a-zA-Z0-9-_$]+)/gm;
|
48
|
+
|
49
|
+
/**
|
50
|
+
* Valid preceding token before a statement.
|
51
|
+
*/
|
52
|
+
const PRECEDING_STATEMENT_TOKEN_REGEXP = /['"`(){}\s;=>]/;
|
53
|
+
|
54
|
+
/**
|
55
|
+
* Valid preceding token before a regexp.
|
56
|
+
*/
|
57
|
+
const PRECEDING_REGEXP_TOKEN_REGEXP = /[([=\{\},;"'+-]/;
|
58
|
+
|
59
|
+
/**
|
60
|
+
* Multiline comment regexp.
|
61
|
+
*/
|
62
|
+
const MULTILINE_COMMENT_REGEXP = /\/\*|\*\//gm;
|
63
|
+
|
64
|
+
/**
|
65
|
+
* ECMAScript module compiler.
|
66
|
+
*/
|
67
|
+
export default class ECMAScriptModuleCompiler {
|
68
|
+
public readonly window: BrowserWindow;
|
69
|
+
|
70
|
+
/**
|
71
|
+
* Constructor.
|
72
|
+
*
|
73
|
+
* @param window Window.
|
74
|
+
* @param url Module URL.
|
75
|
+
*/
|
76
|
+
constructor(window: BrowserWindow) {
|
77
|
+
this.window = window;
|
78
|
+
}
|
79
|
+
|
80
|
+
/**
|
81
|
+
* Compiles code and returns imports and compiled code.
|
82
|
+
*
|
83
|
+
* @param moduleURL Module URL.
|
84
|
+
* @param code Code.
|
85
|
+
* @returns Result.
|
86
|
+
*/
|
87
|
+
public compile(moduleURL: string, code: string): IECMAScriptModuleCompiledResult {
|
88
|
+
const browserSettings = new WindowBrowserContext(this.window).getSettings();
|
89
|
+
const regExp = new RegExp(CODE_REGEXP);
|
90
|
+
const imports: IECMAScriptModuleImport[] = [];
|
91
|
+
const count = {
|
92
|
+
comment: 0,
|
93
|
+
singleLineComment: 0,
|
94
|
+
parantheses: 0,
|
95
|
+
curlyBraces: 0,
|
96
|
+
squareBrackets: 0,
|
97
|
+
regExp: 0,
|
98
|
+
regExpSquareBrackets: 0,
|
99
|
+
escapeTemplateString: 0,
|
100
|
+
simpleString: 0,
|
101
|
+
doubleString: 0
|
102
|
+
};
|
103
|
+
const stack: { templateString: { index: number | null; code: string[] } } = {
|
104
|
+
templateString: { index: null, code: [] }
|
105
|
+
};
|
106
|
+
const templateString: number[] = [];
|
107
|
+
const exportSpreadVariables: Array<Map<string, string>> = [];
|
108
|
+
let newCode = `(async function anonymous($happy_dom) {\n//# sourceURL=${moduleURL}\n`;
|
109
|
+
let match: RegExpExecArray;
|
110
|
+
let precedingToken: string;
|
111
|
+
let isEscaped: boolean;
|
112
|
+
let lastIndex = 0;
|
113
|
+
let importStartIndex = -1;
|
114
|
+
let skipMatchedCode = false;
|
115
|
+
|
116
|
+
if (
|
117
|
+
!browserSettings.disableErrorCapturing &&
|
118
|
+
browserSettings.errorCapture === BrowserErrorCaptureEnum.tryAndCatch
|
119
|
+
) {
|
120
|
+
newCode += 'try {\n';
|
121
|
+
}
|
122
|
+
|
123
|
+
while ((match = regExp.exec(code))) {
|
124
|
+
if (importStartIndex === -1) {
|
125
|
+
newCode += code.substring(lastIndex, match.index);
|
126
|
+
}
|
127
|
+
precedingToken = code[match.index - 1] || ' ';
|
128
|
+
isEscaped = precedingToken === '\\' && code[match.index - 2] !== '\\';
|
129
|
+
|
130
|
+
// Imports and exports are only valid outside any statement, string or comment at the top level
|
131
|
+
if (
|
132
|
+
count.comment === 0 &&
|
133
|
+
count.singleLineComment === 0 &&
|
134
|
+
count.parantheses === 0 &&
|
135
|
+
count.curlyBraces === 0 &&
|
136
|
+
count.squareBrackets === 0 &&
|
137
|
+
count.regExp === 0 &&
|
138
|
+
count.simpleString === 0 &&
|
139
|
+
count.doubleString === 0 &&
|
140
|
+
templateString.length === 0
|
141
|
+
) {
|
142
|
+
if (match[1] && PRECEDING_STATEMENT_TOKEN_REGEXP.test(precedingToken)) {
|
143
|
+
// Import without exported properties
|
144
|
+
imports.push({
|
145
|
+
url: ModuleURLUtility.getURL(this.window, moduleURL, match[1]).href,
|
146
|
+
type: 'esm'
|
147
|
+
});
|
148
|
+
skipMatchedCode = true;
|
149
|
+
} else if (match[3] && PRECEDING_STATEMENT_TOKEN_REGEXP.test(precedingToken)) {
|
150
|
+
// Import statement start
|
151
|
+
if (importStartIndex !== -1) {
|
152
|
+
throw new this.window.TypeError(
|
153
|
+
`Failed to parse module: Unexpected import statement in "${moduleURL}"`
|
154
|
+
);
|
155
|
+
}
|
156
|
+
importStartIndex = match.index + match[0].length - 1;
|
157
|
+
skipMatchedCode = true;
|
158
|
+
} else if (match[4]) {
|
159
|
+
// Import statement end
|
160
|
+
if (importStartIndex !== -1) {
|
161
|
+
const url = ModuleURLUtility.getURL(this.window, moduleURL, match[4]).href;
|
162
|
+
const variables = code.substring(importStartIndex, match.index + 1);
|
163
|
+
const importRegExp = new RegExp(IMPORT_REGEXP);
|
164
|
+
const importCode: string[] = [];
|
165
|
+
let importMatch: RegExpExecArray;
|
166
|
+
while ((importMatch = importRegExp.exec(variables))) {
|
167
|
+
if (importMatch[1]) {
|
168
|
+
// Import braces
|
169
|
+
importCode.push(
|
170
|
+
`const {${importMatch[1].replace(
|
171
|
+
/\s+as\s+/gm,
|
172
|
+
': '
|
173
|
+
)}} = $happy_dom.imports.get('${url}')`
|
174
|
+
);
|
175
|
+
} else if (importMatch[2]) {
|
176
|
+
// Import all as
|
177
|
+
importCode.push(`const ${importMatch[2]} = $happy_dom.imports.get('${url}')`);
|
178
|
+
} else if (importMatch[3]) {
|
179
|
+
// Import default
|
180
|
+
importCode.push(
|
181
|
+
`const ${importMatch[3]} = $happy_dom.imports.get('${url}').default`
|
182
|
+
);
|
183
|
+
}
|
184
|
+
}
|
185
|
+
newCode += importCode.join(';\n');
|
186
|
+
importStartIndex = -1;
|
187
|
+
imports.push({ url, type: match[6] || 'esm' });
|
188
|
+
skipMatchedCode = true;
|
189
|
+
}
|
190
|
+
} else if (match[7] && match[8] && PRECEDING_STATEMENT_TOKEN_REGEXP.test(precedingToken)) {
|
191
|
+
// Export from module statement
|
192
|
+
|
193
|
+
const url = ModuleURLUtility.getURL(this.window, moduleURL, match[8]).href;
|
194
|
+
const imported = match[7];
|
195
|
+
|
196
|
+
if (imported === '*') {
|
197
|
+
newCode += `Object.assign($happy_dom.exports, $happy_dom.imports.get('${url}'))`;
|
198
|
+
imports.push({ url, type: 'esm' });
|
199
|
+
} else if (imported[0] === '*') {
|
200
|
+
const parts = imported.split(/\s+as\s+/);
|
201
|
+
if (parts.length === 2) {
|
202
|
+
const exportName = parts[1].replace(/["']/g, '');
|
203
|
+
newCode += `$happy_dom.exports['${exportName}'] = $happy_dom.imports.get('${url}')`;
|
204
|
+
imports.push({ url, type: 'esm' });
|
205
|
+
}
|
206
|
+
} else if (imported[0] === '{') {
|
207
|
+
const parts = this.removeMultilineComments(imported)
|
208
|
+
.slice(1, -1)
|
209
|
+
.split(/\s*,\s*/);
|
210
|
+
const exportCode: string[] = [];
|
211
|
+
for (const part of parts) {
|
212
|
+
const nameParts = part.trim().split(/\s+as\s+/);
|
213
|
+
const exportName = (nameParts[1] || nameParts[0]).replace(/["']/g, '');
|
214
|
+
const importName = nameParts[0].replace(/["']/g, '');
|
215
|
+
if (exportName && importName) {
|
216
|
+
exportCode.push(
|
217
|
+
`$happy_dom.exports['${exportName}'] = $happy_dom.imports.get('${url}')['${importName}']`
|
218
|
+
);
|
219
|
+
}
|
220
|
+
}
|
221
|
+
newCode += exportCode.join(';\n');
|
222
|
+
imports.push({ url, type: 'esm' });
|
223
|
+
}
|
224
|
+
skipMatchedCode = true;
|
225
|
+
} else if (match[9] && PRECEDING_STATEMENT_TOKEN_REGEXP.test(precedingToken)) {
|
226
|
+
// Export default statement
|
227
|
+
newCode += '$happy_dom.exports.default = ';
|
228
|
+
skipMatchedCode = true;
|
229
|
+
} else if (
|
230
|
+
match[10] &&
|
231
|
+
match[11] &&
|
232
|
+
PRECEDING_STATEMENT_TOKEN_REGEXP.test(precedingToken)
|
233
|
+
) {
|
234
|
+
// Export function or class type
|
235
|
+
newCode += `$happy_dom.exports['${match[11]}'] = ${match[10]} ${match[11]}`;
|
236
|
+
skipMatchedCode = true;
|
237
|
+
} else if (match[12] && PRECEDING_STATEMENT_TOKEN_REGEXP.test(precedingToken)) {
|
238
|
+
// Export object
|
239
|
+
const parts = this.removeMultilineComments(match[12]).split(/\s*,\s*/);
|
240
|
+
const exportCode: string[] = [];
|
241
|
+
for (const part of parts) {
|
242
|
+
const nameParts = part.trim().split(/\s+as\s+/);
|
243
|
+
const exportName = (nameParts[1] || nameParts[0]).replace(/["']/g, '');
|
244
|
+
const importName = nameParts[0].replace(/["']/g, '');
|
245
|
+
if (exportName && importName) {
|
246
|
+
exportCode.push(`$happy_dom.exports['${exportName}'] = ${importName}`);
|
247
|
+
}
|
248
|
+
}
|
249
|
+
newCode += exportCode.join(';\n');
|
250
|
+
skipMatchedCode = true;
|
251
|
+
} else if (match[13] && PRECEDING_STATEMENT_TOKEN_REGEXP.test(precedingToken)) {
|
252
|
+
// Export variable
|
253
|
+
if (match[15] === '=') {
|
254
|
+
const exportName = this.removeMultilineComments(match[14]).trim();
|
255
|
+
if (
|
256
|
+
(exportName[0] === '{' && exportName[exportName.length - 1] === '}') ||
|
257
|
+
(exportName[0] === '[' && exportName[exportName.length - 1] === ']')
|
258
|
+
) {
|
259
|
+
const parts = exportName.slice(1, -1).split(/\s*,\s*/);
|
260
|
+
const variableObject: Map<string, string> = new Map();
|
261
|
+
|
262
|
+
for (const part of parts) {
|
263
|
+
const nameParts = part.trim().split(/\s*:\s*/);
|
264
|
+
const exportName = (nameParts[1] || nameParts[0]).replace(/["']/g, '');
|
265
|
+
const importName = nameParts[0].replace(/["']/g, '');
|
266
|
+
if (exportName && importName) {
|
267
|
+
variableObject.set(exportName, importName);
|
268
|
+
}
|
269
|
+
}
|
270
|
+
|
271
|
+
newCode += `const $happy_dom_export_${exportSpreadVariables.length} =`;
|
272
|
+
exportSpreadVariables.push(variableObject);
|
273
|
+
} else {
|
274
|
+
newCode += `$happy_dom.exports['${exportName}'] =`;
|
275
|
+
}
|
276
|
+
} else {
|
277
|
+
// TODO: If there is no =, we should ignore until we know what is is useful for
|
278
|
+
// Example: export let name1, name2, name3;
|
279
|
+
newCode += `/*Unknown export: ${match[0]}*/`;
|
280
|
+
this.window.console.warn(`Unknown export in "${moduleURL}": ${match[0]}`);
|
281
|
+
}
|
282
|
+
skipMatchedCode = true;
|
283
|
+
}
|
284
|
+
}
|
285
|
+
|
286
|
+
if (match[2]) {
|
287
|
+
// Dynamic import function call
|
288
|
+
if (
|
289
|
+
count.simpleString === 0 &&
|
290
|
+
count.doubleString === 0 &&
|
291
|
+
count.comment === 0 &&
|
292
|
+
count.singleLineComment === 0 &&
|
293
|
+
count.regExp === 0 &&
|
294
|
+
(templateString.length === 0 || templateString[0] > 0) &&
|
295
|
+
PRECEDING_STATEMENT_TOKEN_REGEXP.test(precedingToken)
|
296
|
+
) {
|
297
|
+
newCode += `$happy_dom.dynamicImport(${match[2]})`;
|
298
|
+
skipMatchedCode = true;
|
299
|
+
}
|
300
|
+
} else if (match[16]) {
|
301
|
+
// Slash (RegExp or Comment)
|
302
|
+
if (
|
303
|
+
count.simpleString === 0 &&
|
304
|
+
count.doubleString === 0 &&
|
305
|
+
count.singleLineComment === 0 &&
|
306
|
+
count.regExpSquareBrackets === 0 &&
|
307
|
+
(templateString.length === 0 || templateString[0] > 0)
|
308
|
+
) {
|
309
|
+
if (count.comment === 1) {
|
310
|
+
if (precedingToken === '*') {
|
311
|
+
count.comment = 0;
|
312
|
+
}
|
313
|
+
} else {
|
314
|
+
if (count.regExp === 0) {
|
315
|
+
if (code[match.index + 1] === '*') {
|
316
|
+
count.comment = 1;
|
317
|
+
} else if (code[match.index + 1] === '/') {
|
318
|
+
count.singleLineComment = 1;
|
319
|
+
} else {
|
320
|
+
if (!isEscaped) {
|
321
|
+
let index = match.index - 1;
|
322
|
+
let nonSpacePrecedingToken = code[index];
|
323
|
+
|
324
|
+
while (nonSpacePrecedingToken === ' ' || nonSpacePrecedingToken === '\n') {
|
325
|
+
index--;
|
326
|
+
nonSpacePrecedingToken = code[index];
|
327
|
+
}
|
328
|
+
|
329
|
+
if (PRECEDING_REGEXP_TOKEN_REGEXP.test(nonSpacePrecedingToken)) {
|
330
|
+
count.regExp = 1;
|
331
|
+
}
|
332
|
+
}
|
333
|
+
}
|
334
|
+
} else if (!isEscaped) {
|
335
|
+
count.regExp = 0;
|
336
|
+
}
|
337
|
+
}
|
338
|
+
}
|
339
|
+
} else if (match[17]) {
|
340
|
+
// Parentheses
|
341
|
+
if (
|
342
|
+
count.simpleString === 0 &&
|
343
|
+
count.doubleString === 0 &&
|
344
|
+
count.regExp === 0 &&
|
345
|
+
count.comment === 0 &&
|
346
|
+
count.singleLineComment === 0 &&
|
347
|
+
(templateString.length === 0 || templateString[0] > 0)
|
348
|
+
) {
|
349
|
+
if (match[17] === '(') {
|
350
|
+
count.parantheses++;
|
351
|
+
} else if (match[17] === ')' && count.parantheses > 0) {
|
352
|
+
count.parantheses--;
|
353
|
+
}
|
354
|
+
}
|
355
|
+
} else if (match[18]) {
|
356
|
+
// Curly braces
|
357
|
+
if (
|
358
|
+
count.simpleString === 0 &&
|
359
|
+
count.doubleString === 0 &&
|
360
|
+
count.regExp === 0 &&
|
361
|
+
count.comment === 0 &&
|
362
|
+
count.singleLineComment === 0 &&
|
363
|
+
(templateString.length === 0 || templateString[0] > 0)
|
364
|
+
) {
|
365
|
+
if (match[18] === '{') {
|
366
|
+
if (templateString.length) {
|
367
|
+
templateString[0]++;
|
368
|
+
}
|
369
|
+
count.curlyBraces++;
|
370
|
+
} else if (match[18] === '}') {
|
371
|
+
if (templateString.length && templateString[0] > 0) {
|
372
|
+
templateString[0]--;
|
373
|
+
}
|
374
|
+
if (count.curlyBraces > 0) {
|
375
|
+
count.curlyBraces--;
|
376
|
+
}
|
377
|
+
}
|
378
|
+
}
|
379
|
+
} else if (match[19]) {
|
380
|
+
// Square brackets
|
381
|
+
if (
|
382
|
+
count.simpleString === 0 &&
|
383
|
+
count.doubleString === 0 &&
|
384
|
+
count.comment === 0 &&
|
385
|
+
count.singleLineComment === 0 &&
|
386
|
+
(templateString.length === 0 || templateString[0] > 0)
|
387
|
+
) {
|
388
|
+
// We need to check for square brackets in RegExp as well to know when the RegExp ends
|
389
|
+
if (count.regExp === 1) {
|
390
|
+
if (!isEscaped) {
|
391
|
+
if (match[19] === '[' && count.regExpSquareBrackets === 0) {
|
392
|
+
count.regExpSquareBrackets = 1;
|
393
|
+
} else if (match[19] === ']' && count.regExpSquareBrackets === 1) {
|
394
|
+
count.regExpSquareBrackets = 0;
|
395
|
+
}
|
396
|
+
}
|
397
|
+
} else {
|
398
|
+
if (match[19] === '[') {
|
399
|
+
count.squareBrackets++;
|
400
|
+
} else if (match[19] === ']' && count.squareBrackets > 0) {
|
401
|
+
count.squareBrackets--;
|
402
|
+
}
|
403
|
+
}
|
404
|
+
}
|
405
|
+
} else if (match[20]) {
|
406
|
+
// Escape template string (${)
|
407
|
+
if (
|
408
|
+
count.simpleString === 0 &&
|
409
|
+
count.doubleString === 0 &&
|
410
|
+
count.comment === 0 &&
|
411
|
+
count.singleLineComment === 0 &&
|
412
|
+
count.regExp === 0 &&
|
413
|
+
!isEscaped
|
414
|
+
) {
|
415
|
+
if (templateString.length > 0) {
|
416
|
+
templateString[0]++;
|
417
|
+
}
|
418
|
+
count.curlyBraces++;
|
419
|
+
}
|
420
|
+
} else if (match[21]) {
|
421
|
+
// Template string
|
422
|
+
if (
|
423
|
+
count.simpleString === 0 &&
|
424
|
+
count.doubleString === 0 &&
|
425
|
+
count.comment === 0 &&
|
426
|
+
count.singleLineComment === 0 &&
|
427
|
+
count.regExp === 0 &&
|
428
|
+
!isEscaped
|
429
|
+
) {
|
430
|
+
if (templateString?.[0] == 0) {
|
431
|
+
templateString.shift();
|
432
|
+
stack.templateString.code.push(
|
433
|
+
code.substring(stack.templateString.index, match.index + 1)
|
434
|
+
);
|
435
|
+
} else {
|
436
|
+
templateString.unshift(0);
|
437
|
+
stack.templateString.index = match.index;
|
438
|
+
}
|
439
|
+
}
|
440
|
+
} else if (match[22]) {
|
441
|
+
// String apostrophe (')
|
442
|
+
if (
|
443
|
+
count.doubleString === 0 &&
|
444
|
+
count.comment === 0 &&
|
445
|
+
count.singleLineComment === 0 &&
|
446
|
+
count.regExp === 0 &&
|
447
|
+
!isEscaped &&
|
448
|
+
(templateString.length === 0 || templateString[0] > 0)
|
449
|
+
) {
|
450
|
+
if (count.simpleString === 0) {
|
451
|
+
count.simpleString = 1;
|
452
|
+
} else {
|
453
|
+
count.simpleString = 0;
|
454
|
+
}
|
455
|
+
}
|
456
|
+
} else if (match[23]) {
|
457
|
+
// String apostrophe (")
|
458
|
+
if (
|
459
|
+
count.simpleString === 0 &&
|
460
|
+
count.comment === 0 &&
|
461
|
+
count.singleLineComment === 0 &&
|
462
|
+
count.regExp === 0 &&
|
463
|
+
!isEscaped &&
|
464
|
+
(templateString.length === 0 || templateString[0] > 0)
|
465
|
+
) {
|
466
|
+
if (count.doubleString === 0) {
|
467
|
+
count.doubleString = 1;
|
468
|
+
} else {
|
469
|
+
count.doubleString = 0;
|
470
|
+
}
|
471
|
+
}
|
472
|
+
} else if (match[24]) {
|
473
|
+
// Line feed character
|
474
|
+
count.singleLineComment = 0;
|
475
|
+
}
|
476
|
+
|
477
|
+
// Unless the code has been handled by transforming imports or exports, we add it to the new code
|
478
|
+
if (!skipMatchedCode && importStartIndex === -1) {
|
479
|
+
newCode += match[0];
|
480
|
+
}
|
481
|
+
|
482
|
+
skipMatchedCode = false;
|
483
|
+
lastIndex = regExp.lastIndex;
|
484
|
+
}
|
485
|
+
|
486
|
+
if (importStartIndex !== -1) {
|
487
|
+
// We will end up here if there is an import statement without a valid "from" part
|
488
|
+
// E.g. "import defaultExport from invalid;" or just "import defaultExport;"
|
489
|
+
throw new this.window.TypeError(
|
490
|
+
`Failed to parse module: Unexpected import statement in "${moduleURL}"`
|
491
|
+
);
|
492
|
+
}
|
493
|
+
|
494
|
+
newCode += code.substring(lastIndex);
|
495
|
+
|
496
|
+
if (exportSpreadVariables.length > 0) {
|
497
|
+
newCode += '\n\n';
|
498
|
+
|
499
|
+
for (let i = 0; i < exportSpreadVariables.length; i++) {
|
500
|
+
for (const [exportName, importName] of exportSpreadVariables[i]) {
|
501
|
+
newCode += `$happy_dom.exports['${exportName}'] = $happy_dom_export_${i}['${importName}'];\n`;
|
502
|
+
}
|
503
|
+
}
|
504
|
+
}
|
505
|
+
|
506
|
+
if (
|
507
|
+
!browserSettings.disableErrorCapturing &&
|
508
|
+
browserSettings.errorCapture === BrowserErrorCaptureEnum.tryAndCatch
|
509
|
+
) {
|
510
|
+
newCode += `\n} catch(e) {\n $happy_dom.dispatchError(e);\n}`;
|
511
|
+
}
|
512
|
+
|
513
|
+
newCode += '\n})';
|
514
|
+
|
515
|
+
try {
|
516
|
+
return { imports, execute: this.window.eval(newCode) };
|
517
|
+
} catch (e) {
|
518
|
+
const error = new this.window.SyntaxError(
|
519
|
+
`Failed to parse module '${moduleURL}': ${e.message}`
|
520
|
+
);
|
521
|
+
if (
|
522
|
+
browserSettings.disableErrorCapturing ||
|
523
|
+
browserSettings.errorCapture !== BrowserErrorCaptureEnum.tryAndCatch
|
524
|
+
) {
|
525
|
+
throw error;
|
526
|
+
} else {
|
527
|
+
this.window[PropertySymbol.dispatchError](error);
|
528
|
+
return {
|
529
|
+
imports,
|
530
|
+
execute: () => {}
|
531
|
+
};
|
532
|
+
}
|
533
|
+
}
|
534
|
+
}
|
535
|
+
|
536
|
+
/**
|
537
|
+
* Remove multiline comments.
|
538
|
+
*
|
539
|
+
* @param code Code.
|
540
|
+
* @returns Code without multiline comments.
|
541
|
+
*/
|
542
|
+
private removeMultilineComments(code: string): string {
|
543
|
+
const regexp = new RegExp(MULTILINE_COMMENT_REGEXP);
|
544
|
+
let match: RegExpExecArray;
|
545
|
+
let count = 0;
|
546
|
+
let lastIndex = 0;
|
547
|
+
let newCode = '';
|
548
|
+
|
549
|
+
while ((match = regexp.exec(code))) {
|
550
|
+
if (count === 0) {
|
551
|
+
newCode += code.substring(lastIndex, match.index);
|
552
|
+
}
|
553
|
+
|
554
|
+
if (match[0] === '/*') {
|
555
|
+
count++;
|
556
|
+
} else if (match[0] === '*/' && count > 0) {
|
557
|
+
count--;
|
558
|
+
}
|
559
|
+
|
560
|
+
lastIndex = regexp.lastIndex;
|
561
|
+
}
|
562
|
+
|
563
|
+
newCode += code.substring(lastIndex);
|
564
|
+
|
565
|
+
return newCode;
|
566
|
+
}
|
567
|
+
}
|
@@ -0,0 +1,14 @@
|
|
1
|
+
import IECMAScriptModuleImport from './IECMAScriptModuleImport.js';
|
2
|
+
|
3
|
+
export default interface IECMAScriptModuleCompiledResult {
|
4
|
+
imports: IECMAScriptModuleImport[];
|
5
|
+
execute: (options: {
|
6
|
+
dispatchError: (error: Error) => void;
|
7
|
+
dynamicImport: (
|
8
|
+
url: string,
|
9
|
+
options?: { with?: { type?: string } }
|
10
|
+
) => Promise<{ [key: string]: any }>;
|
11
|
+
imports: Map<string, { [key: string]: any }>;
|
12
|
+
exports: { [key: string]: any };
|
13
|
+
}) => void;
|
14
|
+
}
|
@@ -0,0 +1,20 @@
|
|
1
|
+
/**
|
2
|
+
* Module interface.
|
3
|
+
*/
|
4
|
+
export default interface IModule {
|
5
|
+
url: URL;
|
6
|
+
|
7
|
+
/**
|
8
|
+
* Compiles and evaluates the module.
|
9
|
+
*
|
10
|
+
* @returns Module exports.
|
11
|
+
*/
|
12
|
+
evaluate(): Promise<{ [key: string]: any }>;
|
13
|
+
|
14
|
+
/**
|
15
|
+
* Compiles and preloads the module and its imports.
|
16
|
+
*
|
17
|
+
* @returns Promise.
|
18
|
+
*/
|
19
|
+
preload(): Promise<void>;
|
20
|
+
}
|
@@ -0,0 +1,10 @@
|
|
1
|
+
import IModuleImportMapRule from './IModuleImportMapRule.js';
|
2
|
+
import IModuleImportMapScope from './IModuleImportMapScope.js';
|
3
|
+
|
4
|
+
/**
|
5
|
+
* @see https://html.spec.whatwg.org/multipage/webappapis.html#import-map
|
6
|
+
*/
|
7
|
+
export default interface IModuleImportMap {
|
8
|
+
imports: IModuleImportMapRule[];
|
9
|
+
scopes: IModuleImportMapScope[];
|
10
|
+
}
|
@@ -0,0 +1,59 @@
|
|
1
|
+
import BrowserWindow from '../window/BrowserWindow.js';
|
2
|
+
import { URL } from 'url';
|
3
|
+
import IModule from './IModule.js';
|
4
|
+
|
5
|
+
/**
|
6
|
+
* JSON module.
|
7
|
+
*/
|
8
|
+
export default class JSONModule implements IModule {
|
9
|
+
public readonly url: URL;
|
10
|
+
readonly #window: BrowserWindow;
|
11
|
+
readonly #source: string;
|
12
|
+
#exports: { default: object } | null = null;
|
13
|
+
|
14
|
+
/**
|
15
|
+
* Constructor.
|
16
|
+
*
|
17
|
+
* @param window Window.
|
18
|
+
* @param url Module URL.
|
19
|
+
* @param source Source code.
|
20
|
+
*/
|
21
|
+
constructor(window: BrowserWindow, url: URL, source: string) {
|
22
|
+
this.#window = window;
|
23
|
+
this.url = url;
|
24
|
+
this.#source = source;
|
25
|
+
}
|
26
|
+
|
27
|
+
/**
|
28
|
+
* Compiles and evaluates the module.
|
29
|
+
*
|
30
|
+
* @returns Module exports.
|
31
|
+
*/
|
32
|
+
public async evaluate(): Promise<{ default: object }> {
|
33
|
+
if (this.#exports) {
|
34
|
+
return this.#exports;
|
35
|
+
}
|
36
|
+
|
37
|
+
let result: object;
|
38
|
+
try {
|
39
|
+
result = JSON.parse(this.#source);
|
40
|
+
} catch (error) {
|
41
|
+
throw new this.#window.TypeError(
|
42
|
+
`Failed to parse module "${this.url.href}": ${error.message}`
|
43
|
+
);
|
44
|
+
}
|
45
|
+
|
46
|
+
this.#exports = { default: result };
|
47
|
+
|
48
|
+
return this.#exports;
|
49
|
+
}
|
50
|
+
|
51
|
+
/**
|
52
|
+
* Compiles and preloads the module and its imports.
|
53
|
+
*
|
54
|
+
* @returns Promise.
|
55
|
+
*/
|
56
|
+
public async preload(): Promise<void> {
|
57
|
+
await this.evaluate();
|
58
|
+
}
|
59
|
+
}
|