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.
Files changed (372) hide show
  1. package/cjs/PropertySymbol.cjs +13 -1
  2. package/cjs/PropertySymbol.cjs.map +1 -1
  3. package/cjs/PropertySymbol.d.ts +12 -0
  4. package/cjs/PropertySymbol.d.ts.map +1 -1
  5. package/cjs/async-task-manager/AsyncTaskManager.cjs +67 -18
  6. package/cjs/async-task-manager/AsyncTaskManager.cjs.map +1 -1
  7. package/cjs/async-task-manager/AsyncTaskManager.d.ts +5 -0
  8. package/cjs/async-task-manager/AsyncTaskManager.d.ts.map +1 -1
  9. package/cjs/browser/BrowserSettingsFactory.cjs +4 -0
  10. package/cjs/browser/BrowserSettingsFactory.cjs.map +1 -1
  11. package/cjs/browser/BrowserSettingsFactory.d.ts.map +1 -1
  12. package/cjs/browser/DefaultBrowserSettings.cjs +3 -0
  13. package/cjs/browser/DefaultBrowserSettings.cjs.map +1 -1
  14. package/cjs/browser/DefaultBrowserSettings.d.ts.map +1 -1
  15. package/cjs/browser/types/IBrowserSettings.d.ts +6 -0
  16. package/cjs/browser/types/IBrowserSettings.d.ts.map +1 -1
  17. package/cjs/browser/types/IOptionalBrowserSettings.d.ts +6 -0
  18. package/cjs/browser/types/IOptionalBrowserSettings.d.ts.map +1 -1
  19. package/cjs/browser/utilities/BrowserFrameNavigator.cjs.map +1 -1
  20. package/cjs/browser/utilities/BrowserFrameNavigator.d.ts.map +1 -1
  21. package/cjs/dom/DOMTokenList.cjs +7 -4
  22. package/cjs/dom/DOMTokenList.cjs.map +1 -1
  23. package/cjs/dom/DOMTokenList.d.ts +5 -3
  24. package/cjs/dom/DOMTokenList.d.ts.map +1 -1
  25. package/cjs/event/EventTarget.cjs +31 -5
  26. package/cjs/event/EventTarget.cjs.map +1 -1
  27. package/cjs/event/EventTarget.d.ts.map +1 -1
  28. package/cjs/fetch/Fetch.cjs +67 -13
  29. package/cjs/fetch/Fetch.cjs.map +1 -1
  30. package/cjs/fetch/Fetch.d.ts +3 -0
  31. package/cjs/fetch/Fetch.d.ts.map +1 -1
  32. package/cjs/fetch/Request.cjs +119 -27
  33. package/cjs/fetch/Request.cjs.map +1 -1
  34. package/cjs/fetch/Request.d.ts +65 -9
  35. package/cjs/fetch/Request.d.ts.map +1 -1
  36. package/cjs/fetch/ResourceFetch.cjs +91 -13
  37. package/cjs/fetch/ResourceFetch.cjs.map +1 -1
  38. package/cjs/fetch/ResourceFetch.d.ts +21 -11
  39. package/cjs/fetch/ResourceFetch.d.ts.map +1 -1
  40. package/cjs/fetch/SyncFetch.cjs +36 -7
  41. package/cjs/fetch/SyncFetch.cjs.map +1 -1
  42. package/cjs/fetch/SyncFetch.d.ts.map +1 -1
  43. package/cjs/fetch/preload/PreloadEntry.cjs +44 -0
  44. package/cjs/fetch/preload/PreloadEntry.cjs.map +1 -0
  45. package/cjs/fetch/preload/PreloadEntry.d.ts +26 -0
  46. package/cjs/fetch/preload/PreloadEntry.d.ts.map +1 -0
  47. package/cjs/fetch/preload/PreloadUtility.cjs +29 -0
  48. package/cjs/fetch/preload/PreloadUtility.cjs.map +1 -0
  49. package/cjs/fetch/preload/PreloadUtility.d.ts +26 -0
  50. package/cjs/fetch/preload/PreloadUtility.d.ts.map +1 -0
  51. package/cjs/fetch/types/IRequestInit.d.ts +2 -0
  52. package/cjs/fetch/types/IRequestInit.d.ts.map +1 -1
  53. package/cjs/fetch/types/IRequestMode.cjs +3 -0
  54. package/cjs/fetch/types/IRequestMode.cjs.map +1 -0
  55. package/cjs/fetch/types/IRequestMode.d.ts +3 -0
  56. package/cjs/fetch/types/IRequestMode.d.ts.map +1 -0
  57. package/cjs/fetch/utilities/FetchRequestReferrerUtility.cjs +1 -1
  58. package/cjs/fetch/utilities/FetchRequestReferrerUtility.cjs.map +1 -1
  59. package/cjs/module/CSSModule.cjs +47 -0
  60. package/cjs/module/CSSModule.cjs.map +1 -0
  61. package/cjs/module/CSSModule.d.ts +34 -0
  62. package/cjs/module/CSSModule.d.ts.map +1 -0
  63. package/cjs/module/ECMAScriptModule.cjs +157 -0
  64. package/cjs/module/ECMAScriptModule.cjs.map +1 -0
  65. package/cjs/module/ECMAScriptModule.d.ts +36 -0
  66. package/cjs/module/ECMAScriptModule.d.ts.map +1 -0
  67. package/cjs/module/ECMAScriptModuleCompiler.cjs +550 -0
  68. package/cjs/module/ECMAScriptModuleCompiler.cjs.map +1 -0
  69. package/cjs/module/ECMAScriptModuleCompiler.d.ts +31 -0
  70. package/cjs/module/ECMAScriptModuleCompiler.d.ts.map +1 -0
  71. package/cjs/module/IECMAScriptModuleCompiledResult.cjs +3 -0
  72. package/cjs/module/IECMAScriptModuleCompiledResult.cjs.map +1 -0
  73. package/cjs/module/IECMAScriptModuleCompiledResult.d.ts +21 -0
  74. package/cjs/module/IECMAScriptModuleCompiledResult.d.ts.map +1 -0
  75. package/cjs/module/IECMAScriptModuleImport.cjs +3 -0
  76. package/cjs/module/IECMAScriptModuleImport.cjs.map +1 -0
  77. package/cjs/module/IECMAScriptModuleImport.d.ts +5 -0
  78. package/cjs/module/IECMAScriptModuleImport.d.ts.map +1 -0
  79. package/cjs/module/IModule.cjs +3 -0
  80. package/cjs/module/IModule.cjs.map +1 -0
  81. package/cjs/module/IModule.d.ts +21 -0
  82. package/cjs/module/IModule.d.ts.map +1 -0
  83. package/cjs/module/IModuleImportMap.cjs +3 -0
  84. package/cjs/module/IModuleImportMap.cjs.map +1 -0
  85. package/cjs/module/IModuleImportMap.d.ts +10 -0
  86. package/cjs/module/IModuleImportMap.d.ts.map +1 -0
  87. package/cjs/module/IModuleImportMapRule.cjs +3 -0
  88. package/cjs/module/IModuleImportMapRule.cjs.map +1 -0
  89. package/cjs/module/IModuleImportMapRule.d.ts +5 -0
  90. package/cjs/module/IModuleImportMapRule.d.ts.map +1 -0
  91. package/cjs/module/IModuleImportMapScope.cjs +3 -0
  92. package/cjs/module/IModuleImportMapScope.cjs.map +1 -0
  93. package/cjs/module/IModuleImportMapScope.d.ts +6 -0
  94. package/cjs/module/IModuleImportMapScope.d.ts.map +1 -0
  95. package/cjs/module/JSONModule.cjs +52 -0
  96. package/cjs/module/JSONModule.cjs.map +1 -0
  97. package/cjs/module/JSONModule.d.ts +33 -0
  98. package/cjs/module/JSONModule.d.ts.map +1 -0
  99. package/cjs/module/ModuleFactory.cjs +136 -0
  100. package/cjs/module/ModuleFactory.cjs.map +1 -0
  101. package/cjs/module/ModuleFactory.d.ts +33 -0
  102. package/cjs/module/ModuleFactory.d.ts.map +1 -0
  103. package/cjs/module/ModuleURLUtility.cjs +67 -0
  104. package/cjs/module/ModuleURLUtility.cjs.map +1 -0
  105. package/cjs/module/ModuleURLUtility.d.ts +17 -0
  106. package/cjs/module/ModuleURLUtility.d.ts.map +1 -0
  107. package/cjs/module/UnresolvedModule.cjs +70 -0
  108. package/cjs/module/UnresolvedModule.cjs.map +1 -0
  109. package/cjs/module/UnresolvedModule.d.ts +43 -0
  110. package/cjs/module/UnresolvedModule.d.ts.map +1 -0
  111. package/cjs/nodes/document/Document.cjs +1 -0
  112. package/cjs/nodes/document/Document.cjs.map +1 -1
  113. package/cjs/nodes/document/Document.d.ts +2 -0
  114. package/cjs/nodes/document/Document.d.ts.map +1 -1
  115. package/cjs/nodes/element/Element.cjs +21 -5
  116. package/cjs/nodes/element/Element.cjs.map +1 -1
  117. package/cjs/nodes/element/Element.d.ts +6 -0
  118. package/cjs/nodes/element/Element.d.ts.map +1 -1
  119. package/cjs/nodes/element/NamedNodeMap.cjs +1 -0
  120. package/cjs/nodes/element/NamedNodeMap.cjs.map +1 -1
  121. package/cjs/nodes/element/NamedNodeMap.d.ts.map +1 -1
  122. package/cjs/nodes/html-anchor-element/HTMLAnchorElement.cjs +8 -0
  123. package/cjs/nodes/html-anchor-element/HTMLAnchorElement.cjs.map +1 -1
  124. package/cjs/nodes/html-anchor-element/HTMLAnchorElement.d.ts +6 -0
  125. package/cjs/nodes/html-anchor-element/HTMLAnchorElement.d.ts.map +1 -1
  126. package/cjs/nodes/html-area-element/HTMLAreaElement.cjs +8 -0
  127. package/cjs/nodes/html-area-element/HTMLAreaElement.cjs.map +1 -1
  128. package/cjs/nodes/html-area-element/HTMLAreaElement.d.ts +6 -0
  129. package/cjs/nodes/html-area-element/HTMLAreaElement.d.ts.map +1 -1
  130. package/cjs/nodes/html-element/HTMLElement.cjs +3 -0
  131. package/cjs/nodes/html-element/HTMLElement.cjs.map +1 -1
  132. package/cjs/nodes/html-element/HTMLElement.d.ts.map +1 -1
  133. package/cjs/nodes/html-iframe-element/HTMLIFrameElement.cjs +7 -3
  134. package/cjs/nodes/html-iframe-element/HTMLIFrameElement.cjs.map +1 -1
  135. package/cjs/nodes/html-iframe-element/HTMLIFrameElement.d.ts.map +1 -1
  136. package/cjs/nodes/html-link-element/HTMLLinkElement.cjs +147 -19
  137. package/cjs/nodes/html-link-element/HTMLLinkElement.cjs.map +1 -1
  138. package/cjs/nodes/html-link-element/HTMLLinkElement.d.ts +8 -2
  139. package/cjs/nodes/html-link-element/HTMLLinkElement.d.ts.map +1 -1
  140. package/cjs/nodes/html-media-element/HTMLMediaElement.cjs +8 -0
  141. package/cjs/nodes/html-media-element/HTMLMediaElement.cjs.map +1 -1
  142. package/cjs/nodes/html-media-element/HTMLMediaElement.d.ts +6 -0
  143. package/cjs/nodes/html-media-element/HTMLMediaElement.d.ts.map +1 -1
  144. package/cjs/nodes/html-script-element/HTMLScriptElement.cjs +380 -46
  145. package/cjs/nodes/html-script-element/HTMLScriptElement.cjs.map +1 -1
  146. package/cjs/nodes/html-script-element/HTMLScriptElement.d.ts +80 -0
  147. package/cjs/nodes/html-script-element/HTMLScriptElement.d.ts.map +1 -1
  148. package/cjs/nodes/html-table-cell-element/HTMLTableCellElement.cjs +0 -1
  149. package/cjs/nodes/html-table-cell-element/HTMLTableCellElement.cjs.map +1 -1
  150. package/cjs/nodes/html-table-cell-element/HTMLTableCellElement.d.ts +0 -3
  151. package/cjs/nodes/html-table-cell-element/HTMLTableCellElement.d.ts.map +1 -1
  152. package/cjs/utilities/AttributeUtility.cjs +36 -0
  153. package/cjs/utilities/AttributeUtility.cjs.map +1 -0
  154. package/cjs/utilities/AttributeUtility.d.ts +18 -0
  155. package/cjs/utilities/AttributeUtility.d.ts.map +1 -0
  156. package/cjs/window/BrowserWindow.cjs +73 -6
  157. package/cjs/window/BrowserWindow.cjs.map +1 -1
  158. package/cjs/window/BrowserWindow.d.ts +14 -0
  159. package/cjs/window/BrowserWindow.d.ts.map +1 -1
  160. package/lib/PropertySymbol.d.ts +12 -0
  161. package/lib/PropertySymbol.d.ts.map +1 -1
  162. package/lib/PropertySymbol.js +12 -0
  163. package/lib/PropertySymbol.js.map +1 -1
  164. package/lib/async-task-manager/AsyncTaskManager.d.ts +5 -0
  165. package/lib/async-task-manager/AsyncTaskManager.d.ts.map +1 -1
  166. package/lib/async-task-manager/AsyncTaskManager.js +67 -18
  167. package/lib/async-task-manager/AsyncTaskManager.js.map +1 -1
  168. package/lib/browser/BrowserSettingsFactory.d.ts.map +1 -1
  169. package/lib/browser/BrowserSettingsFactory.js +4 -0
  170. package/lib/browser/BrowserSettingsFactory.js.map +1 -1
  171. package/lib/browser/DefaultBrowserSettings.d.ts.map +1 -1
  172. package/lib/browser/DefaultBrowserSettings.js +3 -0
  173. package/lib/browser/DefaultBrowserSettings.js.map +1 -1
  174. package/lib/browser/types/IBrowserSettings.d.ts +6 -0
  175. package/lib/browser/types/IBrowserSettings.d.ts.map +1 -1
  176. package/lib/browser/types/IOptionalBrowserSettings.d.ts +6 -0
  177. package/lib/browser/types/IOptionalBrowserSettings.d.ts.map +1 -1
  178. package/lib/browser/utilities/BrowserFrameNavigator.d.ts.map +1 -1
  179. package/lib/browser/utilities/BrowserFrameNavigator.js.map +1 -1
  180. package/lib/dom/DOMTokenList.d.ts +5 -3
  181. package/lib/dom/DOMTokenList.d.ts.map +1 -1
  182. package/lib/dom/DOMTokenList.js +7 -4
  183. package/lib/dom/DOMTokenList.js.map +1 -1
  184. package/lib/event/EventTarget.d.ts.map +1 -1
  185. package/lib/event/EventTarget.js +31 -5
  186. package/lib/event/EventTarget.js.map +1 -1
  187. package/lib/fetch/Fetch.d.ts +3 -0
  188. package/lib/fetch/Fetch.d.ts.map +1 -1
  189. package/lib/fetch/Fetch.js +64 -10
  190. package/lib/fetch/Fetch.js.map +1 -1
  191. package/lib/fetch/Request.d.ts +65 -9
  192. package/lib/fetch/Request.d.ts.map +1 -1
  193. package/lib/fetch/Request.js +116 -24
  194. package/lib/fetch/Request.js.map +1 -1
  195. package/lib/fetch/ResourceFetch.d.ts +21 -11
  196. package/lib/fetch/ResourceFetch.d.ts.map +1 -1
  197. package/lib/fetch/ResourceFetch.js +68 -13
  198. package/lib/fetch/ResourceFetch.js.map +1 -1
  199. package/lib/fetch/SyncFetch.d.ts.map +1 -1
  200. package/lib/fetch/SyncFetch.js +36 -7
  201. package/lib/fetch/SyncFetch.js.map +1 -1
  202. package/lib/fetch/preload/PreloadEntry.d.ts +26 -0
  203. package/lib/fetch/preload/PreloadEntry.d.ts.map +1 -0
  204. package/lib/fetch/preload/PreloadEntry.js +41 -0
  205. package/lib/fetch/preload/PreloadEntry.js.map +1 -0
  206. package/lib/fetch/preload/PreloadUtility.d.ts +26 -0
  207. package/lib/fetch/preload/PreloadUtility.d.ts.map +1 -0
  208. package/lib/fetch/preload/PreloadUtility.js +26 -0
  209. package/lib/fetch/preload/PreloadUtility.js.map +1 -0
  210. package/lib/fetch/types/IRequestInit.d.ts +2 -0
  211. package/lib/fetch/types/IRequestInit.d.ts.map +1 -1
  212. package/lib/fetch/types/IRequestMode.d.ts +3 -0
  213. package/lib/fetch/types/IRequestMode.d.ts.map +1 -0
  214. package/lib/fetch/types/IRequestMode.js +2 -0
  215. package/lib/fetch/types/IRequestMode.js.map +1 -0
  216. package/lib/fetch/utilities/FetchRequestReferrerUtility.js +1 -1
  217. package/lib/fetch/utilities/FetchRequestReferrerUtility.js.map +1 -1
  218. package/lib/module/CSSModule.d.ts +34 -0
  219. package/lib/module/CSSModule.d.ts.map +1 -0
  220. package/lib/module/CSSModule.js +44 -0
  221. package/lib/module/CSSModule.js.map +1 -0
  222. package/lib/module/ECMAScriptModule.d.ts +36 -0
  223. package/lib/module/ECMAScriptModule.d.ts.map +1 -0
  224. package/lib/module/ECMAScriptModule.js +128 -0
  225. package/lib/module/ECMAScriptModule.js.map +1 -0
  226. package/lib/module/ECMAScriptModuleCompiler.d.ts +31 -0
  227. package/lib/module/ECMAScriptModuleCompiler.d.ts.map +1 -0
  228. package/lib/module/ECMAScriptModuleCompiler.js +521 -0
  229. package/lib/module/ECMAScriptModuleCompiler.js.map +1 -0
  230. package/lib/module/IECMAScriptModuleCompiledResult.d.ts +21 -0
  231. package/lib/module/IECMAScriptModuleCompiledResult.d.ts.map +1 -0
  232. package/lib/module/IECMAScriptModuleCompiledResult.js +2 -0
  233. package/lib/module/IECMAScriptModuleCompiledResult.js.map +1 -0
  234. package/lib/module/IECMAScriptModuleImport.d.ts +5 -0
  235. package/lib/module/IECMAScriptModuleImport.d.ts.map +1 -0
  236. package/lib/module/IECMAScriptModuleImport.js +2 -0
  237. package/lib/module/IECMAScriptModuleImport.js.map +1 -0
  238. package/lib/module/IModule.d.ts +21 -0
  239. package/lib/module/IModule.d.ts.map +1 -0
  240. package/lib/module/IModule.js +2 -0
  241. package/lib/module/IModule.js.map +1 -0
  242. package/lib/module/IModuleImportMap.d.ts +10 -0
  243. package/lib/module/IModuleImportMap.d.ts.map +1 -0
  244. package/lib/module/IModuleImportMap.js +2 -0
  245. package/lib/module/IModuleImportMap.js.map +1 -0
  246. package/lib/module/IModuleImportMapRule.d.ts +5 -0
  247. package/lib/module/IModuleImportMapRule.d.ts.map +1 -0
  248. package/lib/module/IModuleImportMapRule.js +2 -0
  249. package/lib/module/IModuleImportMapRule.js.map +1 -0
  250. package/lib/module/IModuleImportMapScope.d.ts +6 -0
  251. package/lib/module/IModuleImportMapScope.d.ts.map +1 -0
  252. package/lib/module/IModuleImportMapScope.js +2 -0
  253. package/lib/module/IModuleImportMapScope.js.map +1 -0
  254. package/lib/module/JSONModule.d.ts +33 -0
  255. package/lib/module/JSONModule.d.ts.map +1 -0
  256. package/lib/module/JSONModule.js +49 -0
  257. package/lib/module/JSONModule.js.map +1 -0
  258. package/lib/module/ModuleFactory.d.ts +33 -0
  259. package/lib/module/ModuleFactory.d.ts.map +1 -0
  260. package/lib/module/ModuleFactory.js +107 -0
  261. package/lib/module/ModuleFactory.js.map +1 -0
  262. package/lib/module/ModuleURLUtility.d.ts +17 -0
  263. package/lib/module/ModuleURLUtility.d.ts.map +1 -0
  264. package/lib/module/ModuleURLUtility.js +41 -0
  265. package/lib/module/ModuleURLUtility.js.map +1 -0
  266. package/lib/module/UnresolvedModule.d.ts +43 -0
  267. package/lib/module/UnresolvedModule.d.ts.map +1 -0
  268. package/lib/module/UnresolvedModule.js +67 -0
  269. package/lib/module/UnresolvedModule.js.map +1 -0
  270. package/lib/nodes/document/Document.d.ts +2 -0
  271. package/lib/nodes/document/Document.d.ts.map +1 -1
  272. package/lib/nodes/document/Document.js +1 -0
  273. package/lib/nodes/document/Document.js.map +1 -1
  274. package/lib/nodes/element/Element.d.ts +6 -0
  275. package/lib/nodes/element/Element.d.ts.map +1 -1
  276. package/lib/nodes/element/Element.js +21 -5
  277. package/lib/nodes/element/Element.js.map +1 -1
  278. package/lib/nodes/element/NamedNodeMap.d.ts.map +1 -1
  279. package/lib/nodes/element/NamedNodeMap.js +1 -0
  280. package/lib/nodes/element/NamedNodeMap.js.map +1 -1
  281. package/lib/nodes/html-anchor-element/HTMLAnchorElement.d.ts +6 -0
  282. package/lib/nodes/html-anchor-element/HTMLAnchorElement.d.ts.map +1 -1
  283. package/lib/nodes/html-anchor-element/HTMLAnchorElement.js +8 -0
  284. package/lib/nodes/html-anchor-element/HTMLAnchorElement.js.map +1 -1
  285. package/lib/nodes/html-area-element/HTMLAreaElement.d.ts +6 -0
  286. package/lib/nodes/html-area-element/HTMLAreaElement.d.ts.map +1 -1
  287. package/lib/nodes/html-area-element/HTMLAreaElement.js +8 -0
  288. package/lib/nodes/html-area-element/HTMLAreaElement.js.map +1 -1
  289. package/lib/nodes/html-element/HTMLElement.d.ts.map +1 -1
  290. package/lib/nodes/html-element/HTMLElement.js +3 -0
  291. package/lib/nodes/html-element/HTMLElement.js.map +1 -1
  292. package/lib/nodes/html-iframe-element/HTMLIFrameElement.d.ts.map +1 -1
  293. package/lib/nodes/html-iframe-element/HTMLIFrameElement.js +7 -3
  294. package/lib/nodes/html-iframe-element/HTMLIFrameElement.js.map +1 -1
  295. package/lib/nodes/html-link-element/HTMLLinkElement.d.ts +8 -2
  296. package/lib/nodes/html-link-element/HTMLLinkElement.d.ts.map +1 -1
  297. package/lib/nodes/html-link-element/HTMLLinkElement.js +147 -19
  298. package/lib/nodes/html-link-element/HTMLLinkElement.js.map +1 -1
  299. package/lib/nodes/html-media-element/HTMLMediaElement.d.ts +6 -0
  300. package/lib/nodes/html-media-element/HTMLMediaElement.d.ts.map +1 -1
  301. package/lib/nodes/html-media-element/HTMLMediaElement.js +8 -0
  302. package/lib/nodes/html-media-element/HTMLMediaElement.js.map +1 -1
  303. package/lib/nodes/html-script-element/HTMLScriptElement.d.ts +80 -0
  304. package/lib/nodes/html-script-element/HTMLScriptElement.d.ts.map +1 -1
  305. package/lib/nodes/html-script-element/HTMLScriptElement.js +380 -46
  306. package/lib/nodes/html-script-element/HTMLScriptElement.js.map +1 -1
  307. package/lib/nodes/html-table-cell-element/HTMLTableCellElement.d.ts +0 -3
  308. package/lib/nodes/html-table-cell-element/HTMLTableCellElement.d.ts.map +1 -1
  309. package/lib/nodes/html-table-cell-element/HTMLTableCellElement.js +0 -1
  310. package/lib/nodes/html-table-cell-element/HTMLTableCellElement.js.map +1 -1
  311. package/lib/utilities/AttributeUtility.d.ts +18 -0
  312. package/lib/utilities/AttributeUtility.d.ts.map +1 -0
  313. package/lib/utilities/AttributeUtility.js +29 -0
  314. package/lib/utilities/AttributeUtility.js.map +1 -0
  315. package/lib/window/BrowserWindow.d.ts +14 -0
  316. package/lib/window/BrowserWindow.d.ts.map +1 -1
  317. package/lib/window/BrowserWindow.js +73 -6
  318. package/lib/window/BrowserWindow.js.map +1 -1
  319. package/package.json +1 -1
  320. package/src/PropertySymbol.ts +12 -0
  321. package/src/async-task-manager/AsyncTaskManager.ts +81 -19
  322. package/src/browser/BrowserSettingsFactory.ts +4 -0
  323. package/src/browser/DefaultBrowserSettings.ts +3 -0
  324. package/src/browser/types/IBrowserSettings.ts +7 -0
  325. package/src/browser/types/IOptionalBrowserSettings.ts +7 -0
  326. package/src/browser/utilities/BrowserFrameNavigator.ts +2 -7
  327. package/src/dom/DOMTokenList.ts +12 -4
  328. package/src/event/EventTarget.ts +31 -11
  329. package/src/fetch/Fetch.ts +82 -16
  330. package/src/fetch/Request.ts +132 -24
  331. package/src/fetch/ResourceFetch.ts +99 -14
  332. package/src/fetch/SyncFetch.ts +41 -9
  333. package/src/fetch/preload/PreloadEntry.ts +46 -0
  334. package/src/fetch/preload/PreloadUtility.ts +33 -0
  335. package/src/fetch/types/IRequestInit.ts +2 -0
  336. package/src/fetch/types/IRequestMode.ts +2 -0
  337. package/src/fetch/utilities/FetchRequestReferrerUtility.ts +1 -1
  338. package/src/module/CSSModule.ts +54 -0
  339. package/src/module/ECMAScriptModule.ts +171 -0
  340. package/src/module/ECMAScriptModuleCompiler.ts +567 -0
  341. package/src/module/IECMAScriptModuleCompiledResult.ts +14 -0
  342. package/src/module/IECMAScriptModuleImport.ts +4 -0
  343. package/src/module/IModule.ts +20 -0
  344. package/src/module/IModuleImportMap.ts +10 -0
  345. package/src/module/IModuleImportMapRule.ts +4 -0
  346. package/src/module/IModuleImportMapScope.ts +6 -0
  347. package/src/module/JSONModule.ts +59 -0
  348. package/src/module/ModuleFactory.ts +134 -0
  349. package/src/module/ModuleURLUtility.ts +51 -0
  350. package/src/module/UnresolvedModule.ts +77 -0
  351. package/src/nodes/document/Document.ts +2 -0
  352. package/src/nodes/element/Element.ts +25 -7
  353. package/src/nodes/element/NamedNodeMap.ts +1 -0
  354. package/src/nodes/html-anchor-element/HTMLAnchorElement.ts +9 -0
  355. package/src/nodes/html-area-element/HTMLAreaElement.ts +9 -0
  356. package/src/nodes/html-element/HTMLElement.ts +3 -0
  357. package/src/nodes/html-iframe-element/HTMLIFrameElement.ts +9 -8
  358. package/src/nodes/html-link-element/HTMLLinkElement.ts +181 -28
  359. package/src/nodes/html-media-element/HTMLMediaElement.ts +9 -0
  360. package/src/nodes/html-script-element/HTMLScriptElement.ts +441 -69
  361. package/src/nodes/html-table-cell-element/HTMLTableCellElement.ts +0 -3
  362. package/src/utilities/AttributeUtility.ts +43 -0
  363. package/src/window/BrowserWindow.ts +77 -10
  364. package/cjs/window/WindowErrorUtility.cjs +0 -85
  365. package/cjs/window/WindowErrorUtility.cjs.map +0 -1
  366. package/cjs/window/WindowErrorUtility.d.ts +0 -27
  367. package/cjs/window/WindowErrorUtility.d.ts.map +0 -1
  368. package/lib/window/WindowErrorUtility.d.ts +0 -27
  369. package/lib/window/WindowErrorUtility.d.ts.map +0 -1
  370. package/lib/window/WindowErrorUtility.js +0 -56
  371. package/lib/window/WindowErrorUtility.js.map +0 -1
  372. 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,4 @@
1
+ export default interface IECMAScriptModuleImport {
2
+ url: string;
3
+ type: string;
4
+ }
@@ -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,4 @@
1
+ export default interface IModuleImportMapRule {
2
+ from: string;
3
+ to: string;
4
+ }
@@ -0,0 +1,6 @@
1
+ import IModuleImportMapRule from './IModuleImportMapRule.js';
2
+
3
+ export default interface IModuleImportMapScope {
4
+ scope: string;
5
+ rules: IModuleImportMapRule[];
6
+ }
@@ -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
+ }