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