@jsenv/core 27.0.0-alpha.8 → 27.0.0-alpha.82

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 (254) hide show
  1. package/dist/babel_helpers/AsyncGenerator/AsyncGenerator.js +95 -0
  2. package/dist/babel_helpers/AwaitValue/AwaitValue.js +3 -0
  3. package/dist/babel_helpers/applyDecoratorDescriptor/applyDecoratorDescriptor.js +29 -0
  4. package/dist/babel_helpers/applyDecs/applyDecs.js +756 -0
  5. package/dist/babel_helpers/arrayLikeToArray/arrayLikeToArray.js +9 -0
  6. package/dist/babel_helpers/arrayWithHoles/arrayWithHoles.js +4 -0
  7. package/dist/babel_helpers/arrayWithoutHoles/arrayWithoutHoles.js +5 -0
  8. package/dist/babel_helpers/assertThisInitialized/assertThisInitialized.js +8 -0
  9. package/dist/babel_helpers/asyncGeneratorDelegate/asyncGeneratorDelegate.js +52 -0
  10. package/dist/babel_helpers/asyncIterator/asyncIterator.js +78 -0
  11. package/dist/babel_helpers/asyncToGenerator/asyncToGenerator.js +39 -0
  12. package/dist/babel_helpers/awaitAsyncGenerator/awaitAsyncGenerator.js +4 -0
  13. package/dist/babel_helpers/classApplyDescriptorDestructureSet/classApplyDescriptorDestructureSet.js +24 -0
  14. package/dist/babel_helpers/classApplyDescriptorGet/classApplyDescriptorGet.js +7 -0
  15. package/dist/babel_helpers/classApplyDescriptorSet/classApplyDescriptorSet.js +14 -0
  16. package/dist/babel_helpers/classCallCheck/classCallCheck.js +5 -0
  17. package/dist/babel_helpers/classCheckPrivateStaticAccess/classCheckPrivateStaticAccess.js +5 -0
  18. package/dist/babel_helpers/classCheckPrivateStaticFieldDescriptor/classCheckPrivateStaticFieldDescriptor.js +6 -0
  19. package/dist/babel_helpers/classExtractFieldDescriptor/classExtractFieldDescriptor.js +8 -0
  20. package/dist/babel_helpers/classNameTDZError/classNameTDZError.js +4 -0
  21. package/dist/babel_helpers/classPrivateFieldDestructureSet/classPrivateFieldDestructureSet.js +6 -0
  22. package/dist/babel_helpers/classPrivateFieldGet/classPrivateFieldGet.js +6 -0
  23. package/dist/babel_helpers/classPrivateFieldLooseBase/classPrivateFieldLooseBase.js +7 -0
  24. package/dist/babel_helpers/classPrivateFieldLooseKey/classPrivateFieldLooseKey.js +5 -0
  25. package/dist/babel_helpers/classPrivateFieldSet/classPrivateFieldSet.js +7 -0
  26. package/dist/babel_helpers/classPrivateMethodGet/classPrivateMethodGet.js +7 -0
  27. package/dist/babel_helpers/classPrivateMethodSet/classPrivateMethodSet.js +3 -0
  28. package/dist/babel_helpers/classStaticPrivateFieldSpecGet/classStaticPrivateFieldSpecGet.js +8 -0
  29. package/dist/babel_helpers/classStaticPrivateFieldSpecSet/classStaticPrivateFieldSpecSet.js +9 -0
  30. package/dist/babel_helpers/classStaticPrivateMethodGet/classStaticPrivateMethodGet.js +5 -0
  31. package/dist/babel_helpers/classStaticPrivateMethodSet/classStaticPrivateMethodSet.js +3 -0
  32. package/dist/babel_helpers/construct/construct.js +15 -0
  33. package/dist/babel_helpers/createClass/createClass.js +18 -0
  34. package/dist/babel_helpers/createForOfIteratorHelper/createForOfIteratorHelper.js +63 -0
  35. package/dist/babel_helpers/createForOfIteratorHelperLoose/createForOfIteratorHelperLoose.js +22 -0
  36. package/dist/babel_helpers/createRawReactElement/createRawReactElement.js +50 -0
  37. package/dist/babel_helpers/createSuper/createSuper.js +22 -0
  38. package/dist/babel_helpers/decorate/decorate.js +622 -0
  39. package/dist/babel_helpers/defaults/defaults.js +14 -0
  40. package/dist/babel_helpers/defineEnumerableProperties/defineEnumerableProperties.js +26 -0
  41. package/dist/babel_helpers/defineProperty/defineProperty.js +19 -0
  42. package/dist/babel_helpers/extends/extends.js +16 -0
  43. package/dist/babel_helpers/get/get.js +21 -0
  44. package/dist/babel_helpers/getPrototypeOf/getPrototypeOf.js +2 -0
  45. package/dist/babel_helpers/identity/identity.js +3 -0
  46. package/dist/babel_helpers/inherits/inherits.js +21 -0
  47. package/dist/babel_helpers/inheritsLoose/inheritsLoose.js +6 -0
  48. package/dist/babel_helpers/initializerDefineProperty/initializerDefineProperty.js +10 -0
  49. package/dist/babel_helpers/initializerWarningHelper/initializerWarningHelper.js +3 -0
  50. package/dist/babel_helpers/instanceof/instanceof.js +7 -0
  51. package/dist/babel_helpers/interopRequireDefault/interopRequireDefault.js +5 -0
  52. package/dist/babel_helpers/interopRequireWildcard/interopRequireWildcard.js +49 -0
  53. package/dist/babel_helpers/isNativeFunction/isNativeFunction.js +4 -0
  54. package/dist/babel_helpers/isNativeReflectConstruct/isNativeReflectConstruct.js +21 -0
  55. package/dist/babel_helpers/iterableToArray/iterableToArray.js +3 -0
  56. package/dist/babel_helpers/iterableToArrayLimit/iterableToArrayLimit.js +38 -0
  57. package/dist/babel_helpers/iterableToArrayLimitLoose/iterableToArrayLimitLoose.js +13 -0
  58. package/dist/babel_helpers/jsx/jsx.js +49 -0
  59. package/dist/babel_helpers/maybeArrayLike/maybeArrayLike.js +10 -0
  60. package/dist/babel_helpers/newArrowCheck/newArrowCheck.js +5 -0
  61. package/dist/babel_helpers/nonIterableRest/nonIterableRest.js +3 -0
  62. package/dist/babel_helpers/nonIterableSpread/nonIterableSpread.js +3 -0
  63. package/dist/babel_helpers/objectDestructuringEmpty/objectDestructuringEmpty.js +3 -0
  64. package/dist/babel_helpers/objectSpread/objectSpread.js +22 -0
  65. package/dist/babel_helpers/objectSpread2/objectSpread2.js +41 -0
  66. package/dist/babel_helpers/objectWithoutProperties/objectWithoutProperties.js +20 -0
  67. package/dist/babel_helpers/objectWithoutPropertiesLoose/objectWithoutPropertiesLoose.js +15 -0
  68. package/dist/babel_helpers/possibleConstructorReturn/possibleConstructorReturn.js +10 -0
  69. package/dist/babel_helpers/readOnlyError/readOnlyError.js +4 -0
  70. package/dist/babel_helpers/set/set.js +51 -0
  71. package/dist/babel_helpers/setPrototypeOf/setPrototypeOf.js +5 -0
  72. package/dist/babel_helpers/skipFirstGeneratorNext/skipFirstGeneratorNext.js +8 -0
  73. package/dist/babel_helpers/slicedToArray/slicedToArray.js +5 -0
  74. package/dist/babel_helpers/slicedToArrayLoose/slicedToArrayLoose.js +7 -0
  75. package/dist/babel_helpers/superPropBase/superPropBase.js +10 -0
  76. package/dist/babel_helpers/taggedTemplateLiteral/taggedTemplateLiteral.js +11 -0
  77. package/dist/babel_helpers/taggedTemplateLiteralLoose/taggedTemplateLiteralLoose.js +8 -0
  78. package/dist/babel_helpers/tdz/tdz.js +4 -0
  79. package/dist/babel_helpers/temporalRef/temporalRef.js +5 -0
  80. package/dist/babel_helpers/temporalUndefined/temporalUndefined.js +3 -0
  81. package/dist/babel_helpers/toArray/toArray.js +5 -0
  82. package/dist/babel_helpers/toConsumableArray/toConsumableArray.js +5 -0
  83. package/dist/babel_helpers/toPrimitive/toPrimitive.js +14 -0
  84. package/dist/babel_helpers/toPropertyKey/toPropertyKey.js +5 -0
  85. package/dist/babel_helpers/typeof/typeof.js +7 -0
  86. package/dist/babel_helpers/unsupportedIterableToArray/unsupportedIterableToArray.js +10 -0
  87. package/dist/babel_helpers/wrapAsyncGenerator/wrapAsyncGenerator.js +7 -0
  88. package/dist/babel_helpers/wrapNativeSuper/wrapNativeSuper.js +35 -0
  89. package/dist/babel_helpers/wrapRegExp/wrapRegExp.js +67 -0
  90. package/dist/babel_helpers/writeOnlyError/writeOnlyError.js +4 -0
  91. package/dist/html/explorer.html +557 -0
  92. package/dist/js/controllable_file.mjs +227 -0
  93. package/dist/js/event_source_client.js +324 -0
  94. package/dist/js/global_this.js +32 -0
  95. package/dist/js/html_supervisor_installer.js +522 -0
  96. package/dist/js/html_supervisor_setup.js +82 -0
  97. package/dist/js/import_meta_hot.js +84 -0
  98. package/dist/js/inline_content.js +8 -0
  99. package/dist/js/new_stylesheet.js +409 -0
  100. package/dist/js/regenerator_runtime.js +721 -0
  101. package/dist/js/s.js +429 -0
  102. package/dist/main.js +13422 -0
  103. package/dist/other/jsenv.png +0 -0
  104. package/dist/s.js +626 -0
  105. package/dist/s.js.map +204 -0
  106. package/package.json +57 -51
  107. package/readme.md +6 -14
  108. package/src/build/build.js +1074 -563
  109. package/src/build/build_urls_generator.js +65 -24
  110. package/src/build/graph_utils.js +31 -0
  111. package/src/build/{inject_version_mappings.js → inject_global_version_mappings.js} +49 -18
  112. package/src/build/inject_service_worker_urls.js +79 -0
  113. package/src/build/resync_ressource_hints.js +115 -0
  114. package/src/build/start_build_server.js +210 -0
  115. package/src/dev/plugins/explorer/client/explorer.html +1 -1
  116. package/src/dev/plugins/explorer/jsenv_plugin_explorer.js +9 -13
  117. package/src/dev/plugins/toolbar/jsenv_plugin_toolbar.js +3 -1
  118. package/src/dev/start_dev_server.js +165 -38
  119. package/src/execute/execute.js +35 -8
  120. package/src/execute/run.js +21 -57
  121. package/src/execute/runtimes/browsers/from_playwright.js +220 -150
  122. package/src/execute/runtimes/node/child_exec_options.js +1 -1
  123. package/src/execute/runtimes/node/controllable_file.mjs +26 -10
  124. package/src/execute/runtimes/node/kill_process_tree.js +2 -4
  125. package/src/execute/runtimes/node/node_execution_performance.js +67 -0
  126. package/src/execute/runtimes/node/node_process.js +288 -39
  127. package/src/main.js +27 -0
  128. package/src/omega/{runtime_support/features_compatibility.js → compat/features_compats.js} +30 -7
  129. package/src/omega/{runtime_support/runtime_support.js → compat/runtime_compat.js} +14 -16
  130. package/src/omega/errors.js +63 -67
  131. package/src/omega/fetched_content_compliance.js +24 -0
  132. package/src/omega/file_url_converter.js +9 -51
  133. package/src/omega/kitchen.js +605 -467
  134. package/src/omega/omega_server.js +2 -3
  135. package/src/omega/server/file_service.js +88 -41
  136. package/src/omega/server/user_agent.js +5 -6
  137. package/src/omega/url_graph/url_graph_load.js +31 -23
  138. package/src/omega/url_graph/url_graph_report.js +94 -51
  139. package/src/omega/url_graph/url_info_transformations.js +37 -17
  140. package/src/omega/url_graph.js +88 -19
  141. package/src/omega/url_specifier_encoding.js +59 -0
  142. package/src/omega/web_workers.js +42 -0
  143. package/src/{dev/plugins/autoreload → plugins/autoreload/dev_sse}/client/autoreload_preference.js +0 -0
  144. package/src/{dev/plugins/autoreload → plugins/autoreload/dev_sse}/client/event_source_client.js +19 -12
  145. package/src/{dev/plugins/autoreload → plugins/autoreload/dev_sse}/client/reload.js +0 -0
  146. package/src/{dev/plugins/autoreload → plugins/autoreload/dev_sse}/client/url_helpers.js +0 -0
  147. package/src/plugins/autoreload/dev_sse/jsenv_plugin_dev_sse_client.js +41 -0
  148. package/src/plugins/autoreload/dev_sse/jsenv_plugin_dev_sse_server.js +204 -0
  149. package/src/plugins/autoreload/jsenv_plugin_autoreload.js +25 -0
  150. package/src/plugins/autoreload/jsenv_plugin_hmr.js +35 -0
  151. package/src/plugins/bundling/css/bundle_css.js +140 -0
  152. package/src/plugins/bundling/js_classic_workers/bundle_js_classic_workers.js +13 -0
  153. package/src/plugins/bundling/js_module/bundle_js_module.js +343 -0
  154. package/src/plugins/bundling/jsenv_plugin_bundling.js +54 -0
  155. package/src/plugins/cache_control/jsenv_plugin_cache_control.js +34 -0
  156. package/src/{omega/core_plugins → plugins}/commonjs_globals/jsenv_plugin_commonjs_globals.js +54 -41
  157. package/src/plugins/file_urls/jsenv_plugin_file_urls.js +183 -0
  158. package/src/{omega/core_plugins → plugins}/html_supervisor/client/error_in_document.js +0 -0
  159. package/src/{omega/core_plugins → plugins}/html_supervisor/client/error_in_notification.js +0 -0
  160. package/src/plugins/html_supervisor/client/html_supervisor_installer.js +254 -0
  161. package/src/plugins/html_supervisor/client/html_supervisor_setup.js +82 -0
  162. package/src/{omega/core_plugins → plugins}/html_supervisor/client/perf_browser.js +0 -0
  163. package/src/{omega/core_plugins → plugins}/html_supervisor/client/uneval_exception.js +0 -0
  164. package/src/{omega/core_plugins → plugins}/html_supervisor/jsenv_plugin_html_supervisor.js +73 -55
  165. package/src/plugins/http_urls/jsenv_plugin_http_urls.js +12 -0
  166. package/src/{dev/plugins/autoreload → plugins/import_meta_hot}/babel_plugin_metadata_import_meta_hot.js +4 -5
  167. package/src/{dev/plugins/autoreload → plugins/import_meta_hot}/client/import_meta_hot.js +3 -1
  168. package/src/{dev/plugins/autoreload → plugins/import_meta_hot}/html_hot_dependencies.js +7 -4
  169. package/src/plugins/import_meta_hot/jsenv_plugin_import_meta_hot.js +100 -0
  170. package/src/{omega/core_plugins → plugins}/import_meta_scenarios/jsenv_plugin_import_meta_scenarios.js +33 -8
  171. package/src/plugins/import_meta_url/client/import_meta_url_browser.js +52 -0
  172. package/src/plugins/import_meta_url/client/import_meta_url_commonjs.mjs +9 -0
  173. package/src/{omega/core_plugins → plugins}/importmap/jsenv_plugin_importmap.js +40 -36
  174. package/src/plugins/inject_globals/inject_globals.js +57 -0
  175. package/src/plugins/inject_globals/jsenv_plugin_inject_globals.js +24 -0
  176. package/src/{omega/core_plugins → plugins}/inline/client/inline_content.js +0 -0
  177. package/src/{omega/core_plugins → plugins}/inline/jsenv_plugin_data_urls.js +22 -21
  178. package/src/plugins/inline/jsenv_plugin_html_inline_content.js +161 -0
  179. package/src/plugins/inline/jsenv_plugin_inline.js +36 -0
  180. package/src/{omega/core_plugins → plugins}/inline/jsenv_plugin_inline_query_param.js +8 -11
  181. package/src/plugins/inline/jsenv_plugin_js_inline_content.js +294 -0
  182. package/src/plugins/leading_slash/jsenv_plugin_leading_slash.js +13 -0
  183. package/src/plugins/minification/css/minify_css.js +9 -0
  184. package/src/plugins/minification/html/minify_html.js +13 -0
  185. package/src/{build/plugins/minify_js/jsenv_plugin_minify_js.js → plugins/minification/js/minify_js.js} +6 -22
  186. package/src/plugins/minification/jsenv_plugin_minification.js +78 -0
  187. package/src/plugins/minification/json/minify_json.js +8 -0
  188. package/src/plugins/node_esm_resolution/jsenv_plugin_node_esm_resolution.js +162 -0
  189. package/src/plugins/node_runtime/jsenv_plugin_node_runtime.js +12 -0
  190. package/src/{omega → plugins}/plugin_controller.js +57 -12
  191. package/src/plugins/plugins.js +89 -0
  192. package/src/plugins/transpilation/as_js_classic/client/s.js +429 -0
  193. package/src/plugins/transpilation/as_js_classic/helpers/babel_plugin_transform_import_meta_url.js +47 -0
  194. package/src/plugins/transpilation/as_js_classic/helpers/systemjs_old.js +43 -0
  195. package/src/plugins/transpilation/as_js_classic/jsenv_plugin_as_js_classic.js +211 -0
  196. package/src/plugins/transpilation/as_js_classic/jsenv_plugin_as_js_classic_html.js +304 -0
  197. package/src/plugins/transpilation/as_js_classic/jsenv_plugin_as_js_classic_workers.js +55 -0
  198. package/src/{omega/core_plugins → plugins/transpilation}/babel/global_this/babel_plugin_global_this_as_jsenv_import.js +0 -0
  199. package/src/{omega/core_plugins → plugins/transpilation}/babel/global_this/client/global_this.js +0 -0
  200. package/src/{omega/core_plugins → plugins/transpilation}/babel/helpers/babel_plugin_babel_helpers_as_jsenv_imports.js +0 -0
  201. package/src/{omega/core_plugins → plugins/transpilation}/babel/helpers/babel_plugin_structure.js +14 -17
  202. package/src/{omega/core_plugins → plugins/transpilation}/babel/helpers/babel_plugins_compatibility.js +0 -0
  203. package/src/{omega/core_plugins → plugins/transpilation}/babel/jsenv_plugin_babel.js +39 -32
  204. package/src/{omega/core_plugins → plugins/transpilation}/babel/new_stylesheet/babel_plugin_new_stylesheet_as_jsenv_import.js +30 -6
  205. package/src/{omega/core_plugins → plugins/transpilation}/babel/new_stylesheet/client/new_stylesheet.js +0 -0
  206. package/src/{omega/core_plugins → plugins/transpilation}/babel/regenerator_runtime/babel_plugin_regenerator_runtime_as_jsenv_import.js +0 -0
  207. package/src/{omega/core_plugins → plugins/transpilation}/babel/regenerator_runtime/client/regenerator_runtime.js +0 -0
  208. package/src/plugins/transpilation/babel/require_babel_plugin.js +8 -0
  209. package/src/plugins/transpilation/css_parcel/jsenv_plugin_css_parcel.js +18 -0
  210. package/src/plugins/transpilation/import_assertions/jsenv_plugin_import_assertions.js +184 -0
  211. package/src/plugins/transpilation/jsenv_plugin_top_level_await.js +79 -0
  212. package/src/plugins/transpilation/jsenv_plugin_transpilation.js +46 -0
  213. package/src/plugins/url_analysis/css/css_urls.js +49 -0
  214. package/src/plugins/url_analysis/html/html_urls.js +272 -0
  215. package/src/plugins/url_analysis/js/js_urls.js +68 -0
  216. package/src/plugins/url_analysis/jsenv_plugin_url_analysis.js +103 -0
  217. package/src/plugins/url_analysis/webmanifest/webmanifest_urls.js +20 -0
  218. package/src/{omega/core_plugins → plugins}/url_resolution/jsenv_plugin_url_resolution.js +9 -5
  219. package/src/plugins/url_version/jsenv_plugin_url_version.js +28 -0
  220. package/src/require_from_jsenv.js +3 -0
  221. package/src/test/execute_plan.js +85 -44
  222. package/src/test/execute_test_plan.js +37 -25
  223. package/src/test/execution_steps.js +2 -5
  224. package/src/test/logs_file_execution.js +56 -49
  225. package/main.js +0 -19
  226. package/src/build/plugins/bundle_js_module/jsenv_plugin_bundle_js_module.js +0 -227
  227. package/src/build/plugins/minify_html/jsenv_plugin_minify_html.js +0 -30
  228. package/src/dev/plugins/autoreload/client/event_source_connection.js +0 -195
  229. package/src/dev/plugins/autoreload/jsenv_plugin_autoreload.js +0 -374
  230. package/src/dev/plugins/autoreload/sse_service.js +0 -149
  231. package/src/execute/runtimes/node/controlled_process.js +0 -316
  232. package/src/omega/core_plugins/babel/new_stylesheet/client/.eslintrc.cjs +0 -24
  233. package/src/omega/core_plugins/file_urls/jsenv_plugin_file_urls.js +0 -67
  234. package/src/omega/core_plugins/filesystem_magic/jsenv_plugin_filesystem_magic.js +0 -58
  235. package/src/omega/core_plugins/html_supervisor/client/html_supervisor_installer.js +0 -168
  236. package/src/omega/core_plugins/html_supervisor/client/html_supervisor_setup.js +0 -77
  237. package/src/omega/core_plugins/import_assertions/helpers/babel_plugin_metadata_import_assertions.js +0 -98
  238. package/src/omega/core_plugins/import_assertions/helpers/json_module.js +0 -12
  239. package/src/omega/core_plugins/import_assertions/helpers/text_module.js +0 -6
  240. package/src/omega/core_plugins/import_assertions/jsenv_plugin_import_assertions.js +0 -211
  241. package/src/omega/core_plugins/inline/jsenv_plugin_inline.js +0 -13
  242. package/src/omega/core_plugins/inline/jsenv_plugin_js_and_css_inside_html.js +0 -142
  243. package/src/omega/core_plugins/inline/jsenv_plugin_new_inline_content.js +0 -207
  244. package/src/omega/core_plugins/leading_slash/jsenv_plugin_leading_slash.js +0 -12
  245. package/src/omega/core_plugins/node_esm_resolution/jsenv_plugin_node_esm_resolution.js +0 -77
  246. package/src/omega/core_plugins/url_version/jsenv_plugin_url_version.js +0 -50
  247. package/src/omega/core_plugins.js +0 -39
  248. package/src/omega/runtime_support/default_runtime_support.js +0 -13
  249. package/src/omega/url_graph/url_graph_sort.js +0 -29
  250. package/src/omega/url_mentions/css_url_mentions.js +0 -63
  251. package/src/omega/url_mentions/html_url_mentions.js +0 -185
  252. package/src/omega/url_mentions/js_module_url_mentions.js +0 -91
  253. package/src/omega/url_mentions/parse_url_mentions.js +0 -37
  254. package/src/omega/url_mentions/worker_classic_url_mentions.js +0 -37
@@ -1,12 +1,13 @@
1
1
  import { Script } from "node:vm"
2
- import { createDetailedMessage } from "@jsenv/logger"
2
+
3
+ import { createDetailedMessage } from "@jsenv/log"
3
4
  import {
4
5
  Abort,
5
6
  createCallbackListNotifiedOnce,
6
7
  raceProcessTeardownEvents,
8
+ raceCallbacks,
7
9
  } from "@jsenv/abort"
8
- import { moveUrl } from "@jsenv/filesystem"
9
-
10
+ import { moveUrl } from "@jsenv/urls"
10
11
  import { memoize } from "@jsenv/utils/memoize/memoize.js"
11
12
  import { filterV8Coverage } from "@jsenv/utils/coverage/v8_coverage_from_directory.js"
12
13
  import { composeTwoFileByFileIstanbulCoverages } from "@jsenv/utils/coverage/istanbul_coverage_composition.js"
@@ -34,7 +35,7 @@ export const createRuntimeFromPlaywright = ({
34
35
  server,
35
36
 
36
37
  // measurePerformance,
37
- // collectPerformance,
38
+ collectPerformance,
38
39
  collectCoverage = false,
39
40
  coverageForceIstanbul,
40
41
  urlShouldBeCovered,
@@ -42,10 +43,7 @@ export const createRuntimeFromPlaywright = ({
42
43
  stopAfterAllSignal,
43
44
  stopSignal,
44
45
  keepRunning,
45
- onStop,
46
- onError,
47
46
  onConsole,
48
- onResult,
49
47
 
50
48
  executablePath,
51
49
  headful = false,
@@ -74,11 +72,27 @@ export const createRuntimeFromPlaywright = ({
74
72
  }
75
73
  const { browser, browserContext } = await browserAndContextPromise
76
74
  const closeBrowser = async () => {
75
+ const disconnected = browser.isConnected()
76
+ ? new Promise((resolve) => {
77
+ const disconnectedCallback = () => {
78
+ browser.removeListener("disconnected", disconnectedCallback)
79
+ resolve()
80
+ }
81
+ browser.on("disconnected", disconnectedCallback)
82
+ })
83
+ : Promise.resolve()
84
+ // for some reason without this 100ms timeout
85
+ // browser.close() never resolves (playwright does not like something)
86
+ await new Promise((resolve) => setTimeout(resolve, 100))
77
87
  try {
78
- await stopBrowser(browser)
88
+ await browser.close()
79
89
  } catch (e) {
80
- onError(e)
90
+ if (isTargetClosedError(e)) {
91
+ return
92
+ }
93
+ throw e
81
94
  }
95
+ await disconnected
82
96
  }
83
97
  const page = await browserContext.newPage()
84
98
  const closePage = async () => {
@@ -88,44 +102,9 @@ export const createRuntimeFromPlaywright = ({
88
102
  if (isTargetClosedError(e)) {
89
103
  return
90
104
  }
91
- onError(e)
105
+ throw e
92
106
  }
93
107
  }
94
- // https://github.com/GoogleChrome/puppeteer/blob/v1.4.0/docs/api.md#event-disconnected
95
- if (isBrowserDedicatedToExecution) {
96
- browser.on("disconnected", async () => {
97
- await cleanup("browser disconnected")
98
- onStop({ reason: "browser disconnected" })
99
- })
100
- cleanupCallbackList.add(closePage)
101
- cleanupCallbackList.add(closeBrowser)
102
- } else {
103
- const disconnectedCallback = async () => {
104
- await cleanup("browser disconnected")
105
- onError(new Error("browser disconnected during execution"))
106
- }
107
- browser.on("disconnected", disconnectedCallback)
108
- page.on("close", () => {
109
- onStop({ reason: "page closed" })
110
- })
111
- cleanupCallbackList.add(closePage)
112
- const notifyPrevious = stopAfterAllSignal.notify
113
- stopAfterAllSignal.notify = async () => {
114
- await notifyPrevious()
115
- browser.removeListener("disconnected", disconnectedCallback)
116
- await closeBrowser()
117
- }
118
- }
119
- const stopTrackingToNotify = trackPageToNotify(page, {
120
- onError: (error) => {
121
- error = transformErrorHook(error)
122
- if (!ignoreErrorHook(error)) {
123
- onError(error)
124
- }
125
- },
126
- onConsole,
127
- })
128
- cleanupCallbackList.add(stopTrackingToNotify)
129
108
 
130
109
  let resultTransformer = (result) => result
131
110
  if (collectCoverage) {
@@ -169,30 +148,213 @@ export const createRuntimeFromPlaywright = ({
169
148
  resultTransformer = composeTransformer(
170
149
  resultTransformer,
171
150
  async (result) => {
172
- result.coverage = generateCoverageForPage(result.namespace)
151
+ const scriptExecutionResults = result.namespace
152
+ if (scriptExecutionResults) {
153
+ result.coverage = generateCoverageForPage(scriptExecutionResults)
154
+ }
173
155
  return result
174
156
  },
175
157
  )
176
158
  }
177
159
  } else {
178
160
  resultTransformer = composeTransformer(resultTransformer, (result) => {
179
- const { namespace: fileExecutionResultMap } = result
180
- Object.keys(fileExecutionResultMap).forEach((fileRelativeUrl) => {
181
- delete fileExecutionResultMap[fileRelativeUrl].coverage
182
- })
161
+ const scriptExecutionResults = result.namespace
162
+ if (scriptExecutionResults) {
163
+ Object.keys(scriptExecutionResults).forEach((fileRelativeUrl) => {
164
+ delete scriptExecutionResults[fileRelativeUrl].coverage
165
+ })
166
+ }
183
167
  return result
184
168
  })
185
169
  }
170
+
171
+ if (collectPerformance) {
172
+ resultTransformer = composeTransformer(
173
+ resultTransformer,
174
+ async (result) => {
175
+ const performance = await page.evaluate(
176
+ /* eslint-disable no-undef */
177
+ /* istanbul ignore next */
178
+ () => {
179
+ const { performance } = window
180
+ if (!performance) {
181
+ return null
182
+ }
183
+ const measures = {}
184
+ const measurePerfEntries = performance.getEntriesByType("measure")
185
+ measurePerfEntries.forEach((measurePerfEntry) => {
186
+ measures[measurePerfEntry.name] = measurePerfEntry.duration
187
+ })
188
+ return {
189
+ timeOrigin: performance.timeOrigin,
190
+ timing: performance.timing.toJSON(),
191
+ navigation: performance.navigation.toJSON(),
192
+ measures,
193
+ }
194
+ },
195
+ /* eslint-enable no-undef */
196
+ )
197
+ result.performance = performance
198
+ return result
199
+ },
200
+ )
201
+ }
202
+
186
203
  const fileClientUrl = new URL(fileRelativeUrl, `${server.origin}/`).href
187
- await page.goto(fileClientUrl, { timeout: 0 })
188
- let result = await getResult({
189
- page,
190
- rootDirectoryUrl,
191
- server,
192
- transformErrorHook,
204
+
205
+ // https://github.com/GoogleChrome/puppeteer/blob/v1.4.0/docs/api.md#event-console
206
+ const removeConsoleListener = registerEvent({
207
+ object: page,
208
+ eventType: "console",
209
+ // https://github.com/microsoft/playwright/blob/master/docs/api.md#event-console
210
+ callback: async (consoleMessage) => {
211
+ onConsole({
212
+ type: consoleMessage.type(),
213
+ text: `${extractTextFromConsoleMessage(consoleMessage)}
214
+ `,
215
+ })
216
+ },
217
+ })
218
+ cleanupCallbackList.add(removeConsoleListener)
219
+ const actionOperation = Abort.startOperation()
220
+ actionOperation.addAbortSignal(signal)
221
+ const winnerPromise = new Promise((resolve, reject) => {
222
+ raceCallbacks(
223
+ {
224
+ aborted: (cb) => {
225
+ return actionOperation.addAbortCallback(cb)
226
+ },
227
+ // https://github.com/GoogleChrome/puppeteer/blob/v1.4.0/docs/api.md#event-error
228
+ error: (cb) => {
229
+ return registerEvent({
230
+ object: page,
231
+ eventType: "error",
232
+ callback: (error) => {
233
+ if (ignoreErrorHook(error)) {
234
+ return
235
+ }
236
+ cb(transformErrorHook(error))
237
+ },
238
+ })
239
+ },
240
+ // https://github.com/GoogleChrome/puppeteer/blob/v1.4.0/docs/api.md#event-pageerror
241
+ pageerror: (cb) => {
242
+ return registerEvent({
243
+ object: page,
244
+ eventType: "pageerror",
245
+ callback: (error) => {
246
+ if (ignoreErrorHook(error)) {
247
+ return
248
+ }
249
+ cb(transformErrorHook(error))
250
+ },
251
+ })
252
+ },
253
+ closed: (cb) => {
254
+ // https://github.com/GoogleChrome/puppeteer/blob/v1.4.0/docs/api.md#event-disconnected
255
+ if (isBrowserDedicatedToExecution) {
256
+ browser.on("disconnected", async () => {
257
+ cb({ reason: "browser disconnected" })
258
+ })
259
+ cleanupCallbackList.add(closePage)
260
+ cleanupCallbackList.add(closeBrowser)
261
+ } else {
262
+ const disconnectedCallback = async () => {
263
+ throw new Error("browser disconnected during execution")
264
+ }
265
+ browser.on("disconnected", disconnectedCallback)
266
+ page.on("close", () => {
267
+ cb({ reason: "page closed" })
268
+ })
269
+ cleanupCallbackList.add(closePage)
270
+ cleanupCallbackList.add(() => {
271
+ browser.removeListener("disconnected", disconnectedCallback)
272
+ })
273
+ const notifyPrevious = stopAfterAllSignal.notify
274
+ stopAfterAllSignal.notify = async () => {
275
+ await notifyPrevious()
276
+ browser.removeListener("disconnected", disconnectedCallback)
277
+ await closeBrowser()
278
+ }
279
+ }
280
+ },
281
+ response: async (cb) => {
282
+ try {
283
+ await page.goto(fileClientUrl, { timeout: 0 })
284
+ const result = await page.evaluate(
285
+ /* eslint-disable no-undef */
286
+ /* istanbul ignore next */
287
+ () => {
288
+ if (!window.__html_supervisor__) {
289
+ throw new Error(`window.__html_supervisor__ not found`)
290
+ }
291
+ return window.__html_supervisor__.getScriptExecutionResults()
292
+ },
293
+ /* eslint-enable no-undef */
294
+ )
295
+ const { status, scriptExecutionResults } = result
296
+ if (status === "errored") {
297
+ const { exceptionSource } = result
298
+ const error = evalException(exceptionSource, {
299
+ rootDirectoryUrl,
300
+ server,
301
+ transformErrorHook,
302
+ })
303
+ cb({
304
+ status: "errored",
305
+ error,
306
+ namespace: scriptExecutionResults,
307
+ })
308
+ } else {
309
+ cb({
310
+ status: "completed",
311
+ namespace: scriptExecutionResults,
312
+ })
313
+ }
314
+ } catch (e) {
315
+ reject(e)
316
+ }
317
+ },
318
+ },
319
+ resolve,
320
+ )
193
321
  })
194
- result = await resultTransformer(result)
195
- onResult(result)
322
+
323
+ const getResult = async () => {
324
+ const winner = await winnerPromise
325
+ if (winner.name === "aborted") {
326
+ return {
327
+ status: "aborted",
328
+ }
329
+ }
330
+ if (winner.name === "error" || winner.name === "pageerror") {
331
+ const error = winner.data
332
+ return {
333
+ status: "errored",
334
+ error,
335
+ }
336
+ }
337
+ if (winner.name === "closed") {
338
+ return {
339
+ status: "errored",
340
+ error: isBrowserDedicatedToExecution
341
+ ? new Error(`browser disconnected during execution`)
342
+ : new Error(`page closed during execution`),
343
+ }
344
+ }
345
+ return winner.data
346
+ }
347
+ let result
348
+
349
+ try {
350
+ result = await getResult()
351
+ result = await resultTransformer(result)
352
+ } catch (e) {
353
+ result = {
354
+ status: "errored",
355
+ error: e,
356
+ }
357
+ }
196
358
  if (keepRunning) {
197
359
  stopSignal.notify = cleanup
198
360
  } else {
@@ -214,40 +376,6 @@ export const createRuntimeFromPlaywright = ({
214
376
  return runtime
215
377
  }
216
378
 
217
- const getResult = async ({
218
- page,
219
- rootDirectoryUrl,
220
- server,
221
- transformErrorHook,
222
- }) => {
223
- const result = await page.evaluate(
224
- /* eslint-disable no-undef */
225
- /* istanbul ignore next */
226
- () => {
227
- return window.__html_supervisor__.getScriptExecutionResults()
228
- },
229
- /* eslint-enable no-undef */
230
- )
231
- const { status, scriptExecutionResults } = result
232
- if (status === "errored") {
233
- const { exceptionSource } = result
234
- const error = evalException(exceptionSource, {
235
- rootDirectoryUrl,
236
- server,
237
- transformErrorHook,
238
- })
239
- return {
240
- status: "errored",
241
- error,
242
- namespace: scriptExecutionResults,
243
- }
244
- }
245
- return {
246
- status: "completed",
247
- namespace: scriptExecutionResults,
248
- }
249
- }
250
-
251
379
  const generateCoverageForPage = (scriptExecutionResults) => {
252
380
  let istanbulCoverageComposed = null
253
381
  Object.keys(scriptExecutionResults).forEach((fileRelativeUrl) => {
@@ -262,31 +390,6 @@ const generateCoverageForPage = (scriptExecutionResults) => {
262
390
  return istanbulCoverageComposed
263
391
  }
264
392
 
265
- const stopBrowser = async (browser) => {
266
- const disconnected = browser.isConnected()
267
- ? new Promise((resolve) => {
268
- const disconnectedCallback = () => {
269
- browser.removeListener("disconnected", disconnectedCallback)
270
- resolve()
271
- }
272
- browser.on("disconnected", disconnectedCallback)
273
- })
274
- : Promise.resolve()
275
-
276
- // for some reason without this 100ms timeout
277
- // browser.close() never resolves (playwright does not like something)
278
- await new Promise((resolve) => setTimeout(resolve, 100))
279
- try {
280
- await browser.close()
281
- } catch (e) {
282
- if (isTargetClosedError(e)) {
283
- return
284
- }
285
- throw e
286
- }
287
- await disconnected
288
- }
289
-
290
393
  const launchBrowserUsingPlaywright = async ({
291
394
  signal,
292
395
  browserName,
@@ -366,39 +469,6 @@ const isTargetClosedError = (error) => {
366
469
  return false
367
470
  }
368
471
 
369
- const trackPageToNotify = (page, { onError, onConsole }) => {
370
- // https://github.com/GoogleChrome/puppeteer/blob/v1.4.0/docs/api.md#event-error
371
- const removeErrorListener = registerEvent({
372
- object: page,
373
- eventType: "error",
374
- callback: onError,
375
- })
376
- // https://github.com/GoogleChrome/puppeteer/blob/v1.4.0/docs/api.md#event-pageerror
377
- const removePageErrorListener = registerEvent({
378
- object: page,
379
- eventType: "pageerror",
380
- callback: onError,
381
- })
382
- // https://github.com/GoogleChrome/puppeteer/blob/v1.4.0/docs/api.md#event-console
383
- const removeConsoleListener = registerEvent({
384
- object: page,
385
- eventType: "console",
386
- // https://github.com/microsoft/playwright/blob/master/docs/api.md#event-console
387
- callback: async (consoleMessage) => {
388
- onConsole({
389
- type: consoleMessage.type(),
390
- text: `${extractTextFromConsoleMessage(consoleMessage)}
391
- `,
392
- })
393
- },
394
- })
395
- return () => {
396
- removeErrorListener()
397
- removePageErrorListener()
398
- removeConsoleListener()
399
- }
400
- }
401
-
402
472
  const composeTransformer = (previousTransformer, transformer) => {
403
473
  return async (value) => {
404
474
  const transformedValue = await previousTransformer(value)
@@ -1,6 +1,6 @@
1
1
  import { findFreePort } from "@jsenv/server"
2
- import { createDetailedMessage } from "@jsenv/logger"
3
2
 
3
+ import { createDetailedMessage } from "@jsenv/log"
4
4
  import { ExecOptions } from "./exec_options.js"
5
5
 
6
6
  export const createChildExecOptions = async ({
@@ -1,17 +1,33 @@
1
1
  import v8 from "node:v8"
2
2
  import { uneval } from "@jsenv/uneval"
3
+ import { startObservingPerformances } from "./node_execution_performance.js"
3
4
 
4
5
  const ACTIONS_AVAILABLE = {
5
- "execute-using-dynamic-import": async ({ fileUrl }) => {
6
- const namespace = await import(fileUrl)
7
- const namespaceResolved = {}
8
- await Promise.all([
9
- ...Object.keys(namespace).map(async (key) => {
10
- const value = await namespace[key]
11
- namespaceResolved[key] = value
12
- }),
13
- ])
14
- return namespaceResolved
6
+ "execute-using-dynamic-import": async ({ fileUrl, collectPerformance }) => {
7
+ const getNamespace = async () => {
8
+ const namespace = await import(fileUrl)
9
+ const namespaceResolved = {}
10
+ await Promise.all([
11
+ ...Object.keys(namespace).map(async (key) => {
12
+ const value = await namespace[key]
13
+ namespaceResolved[key] = value
14
+ }),
15
+ ])
16
+ return namespaceResolved
17
+ }
18
+ if (collectPerformance) {
19
+ const getPerformance = startObservingPerformances()
20
+ const namespace = await getNamespace()
21
+ const performance = await getPerformance()
22
+ return {
23
+ namespace,
24
+ performance,
25
+ }
26
+ }
27
+ const namespace = await getNamespace()
28
+ return {
29
+ namespace,
30
+ }
15
31
  },
16
32
  "execute-using-require": async ({ fileUrl }) => {
17
33
  const { createRequire } = await import("module")
@@ -1,13 +1,11 @@
1
- import { createRequire } from "node:module"
2
-
3
- const require = createRequire(import.meta.url)
1
+ import { requireFromJsenv } from "@jsenv/core/src/require_from_jsenv.js"
4
2
 
5
3
  // see also https://github.com/sindresorhus/execa/issues/96
6
4
  export const killProcessTree = async (
7
5
  processId,
8
6
  { signal, timeout = 2000 },
9
7
  ) => {
10
- const pidtree = require("pidtree")
8
+ const pidtree = requireFromJsenv("pidtree")
11
9
 
12
10
  let descendantProcessIds
13
11
  try {
@@ -0,0 +1,67 @@
1
+ import { PerformanceObserver, performance } from "node:perf_hooks"
2
+
3
+ export const startObservingPerformances = () => {
4
+ const measureEntries = []
5
+ // https://nodejs.org/dist/latest-v16.x/docs/api/perf_hooks.html
6
+ const perfObserver = new PerformanceObserver(
7
+ (
8
+ // https://nodejs.org/dist/latest-v16.x/docs/api/perf_hooks.html#perf_hooks_class_performanceobserverentrylist
9
+ list,
10
+ ) => {
11
+ const perfMeasureEntries = list.getEntriesByType("measure")
12
+ measureEntries.push(...perfMeasureEntries)
13
+ },
14
+ )
15
+ perfObserver.observe({
16
+ entryTypes: ["measure"],
17
+ })
18
+ return async () => {
19
+ // wait for node to call the performance observer
20
+ await new Promise((resolve) => {
21
+ setTimeout(resolve)
22
+ })
23
+ performance.clearMarks()
24
+ perfObserver.disconnect()
25
+ return {
26
+ ...readNodePerformance(),
27
+ measures: measuresFromMeasureEntries(measureEntries),
28
+ }
29
+ }
30
+ }
31
+
32
+ const readNodePerformance = () => {
33
+ const nodePerformance = {
34
+ nodeTiming: asPlainObject(performance.nodeTiming),
35
+ timeOrigin: performance.timeOrigin,
36
+ eventLoopUtilization: performance.eventLoopUtilization(),
37
+ }
38
+ return nodePerformance
39
+ }
40
+
41
+ // remove getters that cannot be stringified
42
+ const asPlainObject = (objectWithGetters) => {
43
+ const objectWithoutGetters = {}
44
+ Object.keys(objectWithGetters).forEach((key) => {
45
+ objectWithoutGetters[key] = objectWithGetters[key]
46
+ })
47
+ return objectWithoutGetters
48
+ }
49
+
50
+ const measuresFromMeasureEntries = (measureEntries) => {
51
+ const measures = {}
52
+ // Sort to ensure measures order is predictable
53
+ // It seems to be already predictable on Node 16+ but
54
+ // it's not the case on Node 14.
55
+ measureEntries.sort((a, b) => {
56
+ return a.startTime - b.startTime
57
+ })
58
+ measureEntries.forEach(
59
+ (
60
+ // https://nodejs.org/dist/latest-v16.x/docs/api/perf_hooks.html#perf_hooks_class_performanceentry
61
+ perfMeasureEntry,
62
+ ) => {
63
+ measures[perfMeasureEntry.name] = perfMeasureEntry.duration
64
+ },
65
+ )
66
+ return measures
67
+ }