@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
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { readFile } from "@jsenv/filesystem"
|
|
2
|
+
import { resolveUrl } from "@jsenv/urls"
|
|
3
|
+
import { Abort } from "@jsenv/abort"
|
|
4
|
+
import { applyBabelPlugins } from "@jsenv/ast"
|
|
5
|
+
|
|
6
|
+
import { requireFromJsenv } from "@jsenv/core/src/require_from_jsenv.js"
|
|
7
|
+
import { babelPluginInstrument } from "./babel_plugin_instrument.js"
|
|
8
|
+
|
|
9
|
+
export const relativeUrlToEmptyCoverage = async (
|
|
10
|
+
relativeUrl,
|
|
11
|
+
{ signal, rootDirectoryUrl },
|
|
12
|
+
) => {
|
|
13
|
+
const operation = Abort.startOperation()
|
|
14
|
+
operation.addAbortSignal(signal)
|
|
15
|
+
|
|
16
|
+
try {
|
|
17
|
+
const fileUrl = resolveUrl(relativeUrl, rootDirectoryUrl)
|
|
18
|
+
const content = await readFile(fileUrl, { as: "string" })
|
|
19
|
+
|
|
20
|
+
operation.throwIfAborted()
|
|
21
|
+
const { metadata } = await applyBabelPlugins({
|
|
22
|
+
babelPlugins: [[babelPluginInstrument, { rootDirectoryUrl }]],
|
|
23
|
+
urlInfo: {
|
|
24
|
+
originalUrl: fileUrl,
|
|
25
|
+
content,
|
|
26
|
+
},
|
|
27
|
+
})
|
|
28
|
+
const { coverage } = metadata
|
|
29
|
+
if (!coverage) {
|
|
30
|
+
throw new Error(`missing coverage for file`)
|
|
31
|
+
}
|
|
32
|
+
// https://github.com/gotwarlost/istanbul/blob/bc84c315271a5dd4d39bcefc5925cfb61a3d174a/lib/command/common/run-with-cover.js#L229
|
|
33
|
+
Object.keys(coverage.s).forEach(function (key) {
|
|
34
|
+
coverage.s[key] = 0
|
|
35
|
+
})
|
|
36
|
+
return coverage
|
|
37
|
+
} catch (e) {
|
|
38
|
+
if (e && e.code === "PARSE_ERROR") {
|
|
39
|
+
// return an empty coverage for that file when
|
|
40
|
+
// it contains a syntax error
|
|
41
|
+
return createEmptyCoverage(relativeUrl)
|
|
42
|
+
}
|
|
43
|
+
throw e
|
|
44
|
+
} finally {
|
|
45
|
+
await operation.end()
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
const createEmptyCoverage = (relativeUrl) => {
|
|
50
|
+
const { createFileCoverage } = requireFromJsenv("istanbul-lib-coverage")
|
|
51
|
+
return createFileCoverage(relativeUrl).toJSON()
|
|
52
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import {
|
|
2
|
+
urlToRelativeUrl,
|
|
3
|
+
fileSystemPathToUrl,
|
|
4
|
+
isFileSystemPath,
|
|
5
|
+
} from "@jsenv/urls"
|
|
6
|
+
|
|
7
|
+
export const normalizeFileByFileCoveragePaths = (
|
|
8
|
+
fileByFileCoverage,
|
|
9
|
+
rootDirectoryUrl,
|
|
10
|
+
) => {
|
|
11
|
+
const fileByFileNormalized = {}
|
|
12
|
+
Object.keys(fileByFileCoverage).forEach((key) => {
|
|
13
|
+
const fileCoverage = fileByFileCoverage[key]
|
|
14
|
+
const { path } = fileCoverage
|
|
15
|
+
const url = isFileSystemPath(path)
|
|
16
|
+
? fileSystemPathToUrl(path)
|
|
17
|
+
: new URL(path, rootDirectoryUrl).href
|
|
18
|
+
const relativeUrl = urlToRelativeUrl(url, rootDirectoryUrl)
|
|
19
|
+
fileByFileNormalized[`./${relativeUrl}`] = {
|
|
20
|
+
...fileCoverage,
|
|
21
|
+
path: `./${relativeUrl}`,
|
|
22
|
+
}
|
|
23
|
+
})
|
|
24
|
+
return fileByFileNormalized
|
|
25
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { requireFromJsenv } from "@jsenv/core/src/require_from_jsenv.js"
|
|
2
|
+
|
|
3
|
+
export const composeTwoFileByFileIstanbulCoverages = (
|
|
4
|
+
firstFileByFileIstanbulCoverage,
|
|
5
|
+
secondFileByFileIstanbulCoverage,
|
|
6
|
+
) => {
|
|
7
|
+
const fileByFileIstanbulCoverage = {}
|
|
8
|
+
Object.keys(firstFileByFileIstanbulCoverage).forEach((key) => {
|
|
9
|
+
fileByFileIstanbulCoverage[key] = firstFileByFileIstanbulCoverage[key]
|
|
10
|
+
})
|
|
11
|
+
Object.keys(secondFileByFileIstanbulCoverage).forEach((key) => {
|
|
12
|
+
const firstCoverage = firstFileByFileIstanbulCoverage[key]
|
|
13
|
+
const secondCoverage = secondFileByFileIstanbulCoverage[key]
|
|
14
|
+
fileByFileIstanbulCoverage[key] = firstCoverage
|
|
15
|
+
? merge(firstCoverage, secondCoverage)
|
|
16
|
+
: secondCoverage
|
|
17
|
+
})
|
|
18
|
+
|
|
19
|
+
return fileByFileIstanbulCoverage
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
const merge = (firstIstanbulCoverage, secondIstanbulCoverage) => {
|
|
23
|
+
const { createFileCoverage } = requireFromJsenv("istanbul-lib-coverage")
|
|
24
|
+
const istanbulFileCoverageObject = createFileCoverage(firstIstanbulCoverage)
|
|
25
|
+
istanbulFileCoverageObject.merge(secondIstanbulCoverage)
|
|
26
|
+
const istanbulCoverage = istanbulFileCoverageObject.toJSON()
|
|
27
|
+
return istanbulCoverage
|
|
28
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { requireFromJsenv } from "@jsenv/core/src/require_from_jsenv.js"
|
|
2
|
+
|
|
3
|
+
export const istanbulCoverageMapFromCoverage = (coverage) => {
|
|
4
|
+
const { createCoverageMap } = requireFromJsenv("istanbul-lib-coverage")
|
|
5
|
+
|
|
6
|
+
const coverageAdjusted = {}
|
|
7
|
+
Object.keys(coverage).forEach((key) => {
|
|
8
|
+
coverageAdjusted[key.slice(2)] = {
|
|
9
|
+
...coverage[key],
|
|
10
|
+
path: key.slice(2),
|
|
11
|
+
}
|
|
12
|
+
})
|
|
13
|
+
|
|
14
|
+
const coverageMap = createCoverageMap(coverageAdjusted)
|
|
15
|
+
return coverageMap
|
|
16
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { collectFiles } from "@jsenv/filesystem"
|
|
2
|
+
|
|
3
|
+
export const listRelativeFileUrlToCover = async ({
|
|
4
|
+
signal,
|
|
5
|
+
rootDirectoryUrl,
|
|
6
|
+
coverageConfig,
|
|
7
|
+
}) => {
|
|
8
|
+
const matchingFileResultArray = await collectFiles({
|
|
9
|
+
signal,
|
|
10
|
+
directoryUrl: rootDirectoryUrl,
|
|
11
|
+
associations: { cover: coverageConfig },
|
|
12
|
+
predicate: ({ cover }) => cover,
|
|
13
|
+
})
|
|
14
|
+
return matchingFileResultArray.map(({ relativeUrl }) => relativeUrl)
|
|
15
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { Abort } from "@jsenv/abort"
|
|
2
|
+
|
|
3
|
+
import { listRelativeFileUrlToCover } from "./list_files_not_covered.js"
|
|
4
|
+
import { relativeUrlToEmptyCoverage } from "./empty_coverage_factory.js"
|
|
5
|
+
|
|
6
|
+
export const getMissingFileByFileCoverage = async ({
|
|
7
|
+
signal,
|
|
8
|
+
rootDirectoryUrl,
|
|
9
|
+
coverageConfig,
|
|
10
|
+
fileByFileCoverage,
|
|
11
|
+
}) => {
|
|
12
|
+
const relativeUrlsToCover = await listRelativeFileUrlToCover({
|
|
13
|
+
signal,
|
|
14
|
+
rootDirectoryUrl,
|
|
15
|
+
coverageConfig,
|
|
16
|
+
})
|
|
17
|
+
const relativeUrlsMissing = relativeUrlsToCover.filter((relativeUrlToCover) =>
|
|
18
|
+
Object.keys(fileByFileCoverage).every((key) => {
|
|
19
|
+
return key !== `./${relativeUrlToCover}`
|
|
20
|
+
}),
|
|
21
|
+
)
|
|
22
|
+
|
|
23
|
+
const operation = Abort.startOperation()
|
|
24
|
+
operation.addAbortSignal(signal)
|
|
25
|
+
const missingFileByFileCoverage = {}
|
|
26
|
+
await relativeUrlsMissing.reduce(async (previous, relativeUrlMissing) => {
|
|
27
|
+
operation.throwIfAborted()
|
|
28
|
+
await previous
|
|
29
|
+
await operation.withSignal(async (signal) => {
|
|
30
|
+
const emptyCoverage = await relativeUrlToEmptyCoverage(
|
|
31
|
+
relativeUrlMissing,
|
|
32
|
+
{
|
|
33
|
+
signal,
|
|
34
|
+
rootDirectoryUrl,
|
|
35
|
+
},
|
|
36
|
+
)
|
|
37
|
+
missingFileByFileCoverage[`./${relativeUrlMissing}`] = emptyCoverage
|
|
38
|
+
})
|
|
39
|
+
}, Promise.resolve())
|
|
40
|
+
return missingFileByFileCoverage
|
|
41
|
+
}
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
import { readFile } from "@jsenv/filesystem"
|
|
2
|
+
import { Abort } from "@jsenv/abort"
|
|
3
|
+
|
|
4
|
+
import {
|
|
5
|
+
visitNodeV8Directory,
|
|
6
|
+
filterV8Coverage,
|
|
7
|
+
} from "./v8_coverage_from_directory.js"
|
|
8
|
+
import { composeTwoV8Coverages } from "./v8_coverage_composition.js"
|
|
9
|
+
import { composeTwoFileByFileIstanbulCoverages } from "./istanbul_coverage_composition.js"
|
|
10
|
+
import { v8CoverageToIstanbul } from "./v8_coverage_to_istanbul.js"
|
|
11
|
+
import { composeV8AndIstanbul } from "./v8_and_istanbul.js"
|
|
12
|
+
import { normalizeFileByFileCoveragePaths } from "./file_by_file_coverage.js"
|
|
13
|
+
import { getMissingFileByFileCoverage } from "./missing_coverage.js"
|
|
14
|
+
|
|
15
|
+
export const reportToCoverage = async (
|
|
16
|
+
report,
|
|
17
|
+
{
|
|
18
|
+
signal,
|
|
19
|
+
logger,
|
|
20
|
+
rootDirectoryUrl,
|
|
21
|
+
coverageConfig,
|
|
22
|
+
coverageIncludeMissing,
|
|
23
|
+
urlShouldBeCovered,
|
|
24
|
+
coverageForceIstanbul,
|
|
25
|
+
coverageV8ConflictWarning,
|
|
26
|
+
},
|
|
27
|
+
) => {
|
|
28
|
+
// collect v8 and istanbul coverage from executions
|
|
29
|
+
let { v8Coverage, fileByFileIstanbulCoverage } = await getCoverageFromReport({
|
|
30
|
+
signal,
|
|
31
|
+
report,
|
|
32
|
+
onMissing: ({ file, executionResult, executionName }) => {
|
|
33
|
+
// several reasons not to have coverage here:
|
|
34
|
+
// 1. the file we executed did not import an instrumented file.
|
|
35
|
+
// - a test file without import
|
|
36
|
+
// - a test file importing only file excluded from coverage
|
|
37
|
+
// - a coverDescription badly configured so that we don't realize
|
|
38
|
+
// a file should be covered
|
|
39
|
+
|
|
40
|
+
// 2. the file we wanted to executed timedout
|
|
41
|
+
// - infinite loop
|
|
42
|
+
// - too extensive operation
|
|
43
|
+
// - a badly configured or too low allocatedMs for that execution.
|
|
44
|
+
|
|
45
|
+
// 3. the file we wanted to execute contains syntax-error
|
|
46
|
+
|
|
47
|
+
// in any scenario we are fine because
|
|
48
|
+
// coverDescription will generate empty coverage for files
|
|
49
|
+
// that were suppose to be coverage but were not.
|
|
50
|
+
if (
|
|
51
|
+
executionResult.status === "completed" &&
|
|
52
|
+
executionResult.runtimeName !== "node" &&
|
|
53
|
+
!process.env.NODE_V8_COVERAGE
|
|
54
|
+
) {
|
|
55
|
+
logger.warn(
|
|
56
|
+
`No execution.coverageFileUrl from execution named "${executionName}" of ${file}`,
|
|
57
|
+
)
|
|
58
|
+
}
|
|
59
|
+
},
|
|
60
|
+
})
|
|
61
|
+
|
|
62
|
+
if (!coverageForceIstanbul && process.env.NODE_V8_COVERAGE) {
|
|
63
|
+
await visitNodeV8Directory({
|
|
64
|
+
logger,
|
|
65
|
+
signal,
|
|
66
|
+
NODE_V8_COVERAGE: process.env.NODE_V8_COVERAGE,
|
|
67
|
+
onV8Coverage: (nodeV8Coverage) => {
|
|
68
|
+
const nodeV8CoverageLight = filterV8Coverage(nodeV8Coverage, {
|
|
69
|
+
urlShouldBeCovered,
|
|
70
|
+
})
|
|
71
|
+
v8Coverage = v8Coverage
|
|
72
|
+
? composeTwoV8Coverages(v8Coverage, nodeV8CoverageLight)
|
|
73
|
+
: nodeV8CoverageLight
|
|
74
|
+
},
|
|
75
|
+
})
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
// try to merge v8 with istanbul, if any
|
|
79
|
+
let fileByFileCoverage
|
|
80
|
+
if (v8Coverage) {
|
|
81
|
+
let v8FileByFileCoverage = await v8CoverageToIstanbul(v8Coverage, {
|
|
82
|
+
signal,
|
|
83
|
+
})
|
|
84
|
+
|
|
85
|
+
v8FileByFileCoverage = normalizeFileByFileCoveragePaths(
|
|
86
|
+
v8FileByFileCoverage,
|
|
87
|
+
rootDirectoryUrl,
|
|
88
|
+
)
|
|
89
|
+
|
|
90
|
+
if (fileByFileIstanbulCoverage) {
|
|
91
|
+
fileByFileIstanbulCoverage = normalizeFileByFileCoveragePaths(
|
|
92
|
+
fileByFileIstanbulCoverage,
|
|
93
|
+
rootDirectoryUrl,
|
|
94
|
+
)
|
|
95
|
+
fileByFileCoverage = composeV8AndIstanbul(
|
|
96
|
+
v8FileByFileCoverage,
|
|
97
|
+
fileByFileIstanbulCoverage,
|
|
98
|
+
{ coverageV8ConflictWarning },
|
|
99
|
+
)
|
|
100
|
+
} else {
|
|
101
|
+
fileByFileCoverage = v8FileByFileCoverage
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
// get istanbul only
|
|
105
|
+
else if (fileByFileIstanbulCoverage) {
|
|
106
|
+
fileByFileCoverage = normalizeFileByFileCoveragePaths(
|
|
107
|
+
fileByFileIstanbulCoverage,
|
|
108
|
+
rootDirectoryUrl,
|
|
109
|
+
)
|
|
110
|
+
}
|
|
111
|
+
// no coverage found in execution (or zero file where executed)
|
|
112
|
+
else {
|
|
113
|
+
fileByFileCoverage = {}
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
// now add coverage for file not covered
|
|
117
|
+
if (coverageIncludeMissing) {
|
|
118
|
+
const missingFileByFileCoverage = await getMissingFileByFileCoverage({
|
|
119
|
+
signal,
|
|
120
|
+
rootDirectoryUrl,
|
|
121
|
+
coverageConfig,
|
|
122
|
+
fileByFileCoverage,
|
|
123
|
+
})
|
|
124
|
+
Object.assign(
|
|
125
|
+
fileByFileCoverage,
|
|
126
|
+
normalizeFileByFileCoveragePaths(
|
|
127
|
+
missingFileByFileCoverage,
|
|
128
|
+
rootDirectoryUrl,
|
|
129
|
+
),
|
|
130
|
+
)
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
return fileByFileCoverage
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
const getCoverageFromReport = async ({ signal, report, onMissing }) => {
|
|
137
|
+
const operation = Abort.startOperation()
|
|
138
|
+
operation.addAbortSignal(signal)
|
|
139
|
+
|
|
140
|
+
try {
|
|
141
|
+
let v8Coverage
|
|
142
|
+
let fileByFileIstanbulCoverage
|
|
143
|
+
|
|
144
|
+
// collect v8 and istanbul coverage from executions
|
|
145
|
+
await Object.keys(report).reduce(async (previous, file) => {
|
|
146
|
+
operation.throwIfAborted()
|
|
147
|
+
await previous
|
|
148
|
+
|
|
149
|
+
const executionResultForFile = report[file]
|
|
150
|
+
await Object.keys(executionResultForFile).reduce(
|
|
151
|
+
async (previous, executionName) => {
|
|
152
|
+
operation.throwIfAborted()
|
|
153
|
+
await previous
|
|
154
|
+
|
|
155
|
+
const executionResultForFileOnRuntime =
|
|
156
|
+
executionResultForFile[executionName]
|
|
157
|
+
const { coverageFileUrl } = executionResultForFileOnRuntime
|
|
158
|
+
if (!coverageFileUrl) {
|
|
159
|
+
onMissing({
|
|
160
|
+
executionName,
|
|
161
|
+
file,
|
|
162
|
+
executionResult: executionResultForFileOnRuntime,
|
|
163
|
+
})
|
|
164
|
+
return
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
const executionCoverage = await readFile(coverageFileUrl, {
|
|
168
|
+
as: "json",
|
|
169
|
+
})
|
|
170
|
+
if (isV8Coverage(executionCoverage)) {
|
|
171
|
+
v8Coverage = v8Coverage
|
|
172
|
+
? composeTwoV8Coverages(v8Coverage, executionCoverage)
|
|
173
|
+
: executionCoverage
|
|
174
|
+
} else {
|
|
175
|
+
fileByFileIstanbulCoverage = fileByFileIstanbulCoverage
|
|
176
|
+
? composeTwoFileByFileIstanbulCoverages(
|
|
177
|
+
fileByFileIstanbulCoverage,
|
|
178
|
+
executionCoverage,
|
|
179
|
+
)
|
|
180
|
+
: executionCoverage
|
|
181
|
+
}
|
|
182
|
+
},
|
|
183
|
+
Promise.resolve(),
|
|
184
|
+
)
|
|
185
|
+
}, Promise.resolve())
|
|
186
|
+
|
|
187
|
+
return {
|
|
188
|
+
v8Coverage,
|
|
189
|
+
fileByFileIstanbulCoverage,
|
|
190
|
+
}
|
|
191
|
+
} finally {
|
|
192
|
+
await operation.end()
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
const isV8Coverage = (coverage) => Boolean(coverage.result)
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { createDetailedMessage } from "@jsenv/log"
|
|
2
|
+
|
|
3
|
+
export const composeV8AndIstanbul = (
|
|
4
|
+
v8FileByFileCoverage,
|
|
5
|
+
istanbulFileByFileCoverage,
|
|
6
|
+
{ coverageV8ConflictWarning },
|
|
7
|
+
) => {
|
|
8
|
+
const fileByFileCoverage = {}
|
|
9
|
+
const v8Files = Object.keys(v8FileByFileCoverage)
|
|
10
|
+
const istanbulFiles = Object.keys(istanbulFileByFileCoverage)
|
|
11
|
+
|
|
12
|
+
v8Files.forEach((key) => {
|
|
13
|
+
fileByFileCoverage[key] = v8FileByFileCoverage[key]
|
|
14
|
+
})
|
|
15
|
+
istanbulFiles.forEach((key) => {
|
|
16
|
+
const v8Coverage = v8FileByFileCoverage[key]
|
|
17
|
+
if (v8Coverage) {
|
|
18
|
+
if (coverageV8ConflictWarning) {
|
|
19
|
+
console.warn(
|
|
20
|
+
createDetailedMessage(
|
|
21
|
+
`Coverage conflict on "${key}", found two coverage that cannot be merged together: v8 and istanbul. The istanbul coverage will be ignored.`,
|
|
22
|
+
{
|
|
23
|
+
details: `This happens when a file is executed on a runtime using v8 coverage (node or chromium) and on runtime using istanbul coverage (firefox or webkit)`,
|
|
24
|
+
suggestion:
|
|
25
|
+
"You can disable this warning with coverageV8ConflictWarning: false",
|
|
26
|
+
},
|
|
27
|
+
),
|
|
28
|
+
)
|
|
29
|
+
}
|
|
30
|
+
fileByFileCoverage[key] = v8Coverage
|
|
31
|
+
} else {
|
|
32
|
+
fileByFileCoverage[key] = istanbulFileByFileCoverage[key]
|
|
33
|
+
}
|
|
34
|
+
})
|
|
35
|
+
|
|
36
|
+
return fileByFileCoverage
|
|
37
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { requireFromJsenv } from "@jsenv/core/src/require_from_jsenv.js"
|
|
2
|
+
|
|
3
|
+
export const composeTwoV8Coverages = (firstV8Coverage, secondV8Coverage) => {
|
|
4
|
+
if (secondV8Coverage.result.length === 0) {
|
|
5
|
+
return firstV8Coverage
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
// eslint-disable-next-line import/no-unresolved
|
|
9
|
+
const { mergeProcessCovs } = requireFromJsenv("@c88/v8-coverage")
|
|
10
|
+
// "mergeProcessCovs" do not preserves source-map-cache during the merge
|
|
11
|
+
// so we store sourcemap cache now
|
|
12
|
+
const sourceMapCache = {}
|
|
13
|
+
const visit = (coverageReport) => {
|
|
14
|
+
if (coverageReport["source-map-cache"]) {
|
|
15
|
+
Object.assign(sourceMapCache, coverageReport["source-map-cache"])
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
visit(firstV8Coverage)
|
|
19
|
+
visit(secondV8Coverage)
|
|
20
|
+
const v8Coverage = mergeProcessCovs([firstV8Coverage, secondV8Coverage])
|
|
21
|
+
v8Coverage["source-map-cache"] = sourceMapCache
|
|
22
|
+
|
|
23
|
+
return v8Coverage
|
|
24
|
+
}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import {
|
|
2
|
+
assertAndNormalizeDirectoryUrl,
|
|
3
|
+
readDirectory,
|
|
4
|
+
readFile,
|
|
5
|
+
} from "@jsenv/filesystem"
|
|
6
|
+
import { resolveUrl } from "@jsenv/urls"
|
|
7
|
+
import { createDetailedMessage } from "@jsenv/log"
|
|
8
|
+
import { Abort } from "@jsenv/abort"
|
|
9
|
+
|
|
10
|
+
export const visitNodeV8Directory = async ({
|
|
11
|
+
logger,
|
|
12
|
+
signal,
|
|
13
|
+
NODE_V8_COVERAGE,
|
|
14
|
+
onV8Coverage,
|
|
15
|
+
maxMsWaitingForNodeToWriteCoverageFile = 2000,
|
|
16
|
+
}) => {
|
|
17
|
+
const operation = Abort.startOperation()
|
|
18
|
+
operation.addAbortSignal(signal)
|
|
19
|
+
|
|
20
|
+
const tryReadDirectory = async () => {
|
|
21
|
+
const dirContent = await readDirectory(NODE_V8_COVERAGE)
|
|
22
|
+
if (dirContent.length > 0) {
|
|
23
|
+
return dirContent
|
|
24
|
+
}
|
|
25
|
+
logger.warn(`v8 coverage directory is empty at ${NODE_V8_COVERAGE}`)
|
|
26
|
+
return dirContent
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
try {
|
|
30
|
+
operation.throwIfAborted()
|
|
31
|
+
const dirContent = await tryReadDirectory()
|
|
32
|
+
|
|
33
|
+
const coverageDirectoryUrl =
|
|
34
|
+
assertAndNormalizeDirectoryUrl(NODE_V8_COVERAGE)
|
|
35
|
+
await dirContent.reduce(async (previous, dirEntry) => {
|
|
36
|
+
operation.throwIfAborted()
|
|
37
|
+
await previous
|
|
38
|
+
|
|
39
|
+
const dirEntryUrl = resolveUrl(dirEntry, coverageDirectoryUrl)
|
|
40
|
+
const tryReadJsonFile = async (timeSpentTrying = 0) => {
|
|
41
|
+
const fileContent = await readFile(dirEntryUrl, { as: "string" })
|
|
42
|
+
if (fileContent === "") {
|
|
43
|
+
if (timeSpentTrying < 400) {
|
|
44
|
+
await new Promise((resolve) => setTimeout(resolve, 200))
|
|
45
|
+
return tryReadJsonFile(timeSpentTrying + 200)
|
|
46
|
+
}
|
|
47
|
+
console.warn(`Coverage JSON file is empty at ${dirEntryUrl}`)
|
|
48
|
+
return null
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
try {
|
|
52
|
+
const fileAsJson = JSON.parse(fileContent)
|
|
53
|
+
return fileAsJson
|
|
54
|
+
} catch (e) {
|
|
55
|
+
if (timeSpentTrying < maxMsWaitingForNodeToWriteCoverageFile) {
|
|
56
|
+
await new Promise((resolve) => setTimeout(resolve, 200))
|
|
57
|
+
return tryReadJsonFile(timeSpentTrying + 200)
|
|
58
|
+
}
|
|
59
|
+
console.warn(
|
|
60
|
+
createDetailedMessage(`Error while reading coverage file`, {
|
|
61
|
+
"error stack": e.stack,
|
|
62
|
+
"file": dirEntryUrl,
|
|
63
|
+
}),
|
|
64
|
+
)
|
|
65
|
+
return null
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
const fileContent = await tryReadJsonFile()
|
|
70
|
+
if (fileContent) {
|
|
71
|
+
onV8Coverage(fileContent)
|
|
72
|
+
}
|
|
73
|
+
}, Promise.resolve())
|
|
74
|
+
} finally {
|
|
75
|
+
await operation.end()
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
export const filterV8Coverage = (v8Coverage, { urlShouldBeCovered }) => {
|
|
80
|
+
const v8CoverageFiltered = {
|
|
81
|
+
...v8Coverage,
|
|
82
|
+
result: v8Coverage.result.filter((fileReport) =>
|
|
83
|
+
urlShouldBeCovered(fileReport.url),
|
|
84
|
+
),
|
|
85
|
+
}
|
|
86
|
+
return v8CoverageFiltered
|
|
87
|
+
}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { urlToFileSystemPath } from "@jsenv/urls"
|
|
2
|
+
import { Abort } from "@jsenv/abort"
|
|
3
|
+
|
|
4
|
+
import { requireFromJsenv } from "@jsenv/core/src/require_from_jsenv.js"
|
|
5
|
+
import { composeTwoFileByFileIstanbulCoverages } from "./istanbul_coverage_composition.js"
|
|
6
|
+
|
|
7
|
+
export const v8CoverageToIstanbul = async (v8Coverage, { signal }) => {
|
|
8
|
+
const operation = Abort.startOperation()
|
|
9
|
+
operation.addAbortSignal(signal)
|
|
10
|
+
|
|
11
|
+
try {
|
|
12
|
+
const v8ToIstanbul = requireFromJsenv("v8-to-istanbul")
|
|
13
|
+
const sourcemapCache = v8Coverage["source-map-cache"]
|
|
14
|
+
let istanbulCoverageComposed = null
|
|
15
|
+
|
|
16
|
+
await v8Coverage.result.reduce(async (previous, fileV8Coverage) => {
|
|
17
|
+
operation.throwIfAborted()
|
|
18
|
+
await previous
|
|
19
|
+
|
|
20
|
+
const { source } = fileV8Coverage
|
|
21
|
+
let sources
|
|
22
|
+
// when v8 coverage comes from playwright (chromium) v8Coverage.source is set
|
|
23
|
+
if (typeof source === "string") {
|
|
24
|
+
sources = { source }
|
|
25
|
+
}
|
|
26
|
+
// when v8 coverage comes from Node.js, the source can be read from sourcemapCache
|
|
27
|
+
else if (sourcemapCache) {
|
|
28
|
+
sources = sourcesFromSourceMapCache(fileV8Coverage.url, sourcemapCache)
|
|
29
|
+
}
|
|
30
|
+
const path = urlToFileSystemPath(fileV8Coverage.url)
|
|
31
|
+
|
|
32
|
+
const converter = v8ToIstanbul(
|
|
33
|
+
path,
|
|
34
|
+
// wrapperLength is undefined we don't need it
|
|
35
|
+
// https://github.com/istanbuljs/v8-to-istanbul/blob/2b54bc97c5edf8a37b39a171ec29134ba9bfd532/lib/v8-to-istanbul.js#L27
|
|
36
|
+
undefined,
|
|
37
|
+
sources,
|
|
38
|
+
)
|
|
39
|
+
await converter.load()
|
|
40
|
+
|
|
41
|
+
converter.applyCoverage(fileV8Coverage.functions)
|
|
42
|
+
const istanbulCoverage = converter.toIstanbul()
|
|
43
|
+
|
|
44
|
+
istanbulCoverageComposed = istanbulCoverageComposed
|
|
45
|
+
? composeTwoFileByFileIstanbulCoverages(
|
|
46
|
+
istanbulCoverageComposed,
|
|
47
|
+
istanbulCoverage,
|
|
48
|
+
)
|
|
49
|
+
: istanbulCoverage
|
|
50
|
+
}, Promise.resolve())
|
|
51
|
+
|
|
52
|
+
if (!istanbulCoverageComposed) {
|
|
53
|
+
return {}
|
|
54
|
+
}
|
|
55
|
+
istanbulCoverageComposed = markAsConvertedFromV8(istanbulCoverageComposed)
|
|
56
|
+
return istanbulCoverageComposed
|
|
57
|
+
} finally {
|
|
58
|
+
await operation.end()
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
const markAsConvertedFromV8 = (fileByFileCoverage) => {
|
|
63
|
+
const fileByFileMarked = {}
|
|
64
|
+
Object.keys(fileByFileCoverage).forEach((key) => {
|
|
65
|
+
const fileCoverage = fileByFileCoverage[key]
|
|
66
|
+
fileByFileMarked[key] = {
|
|
67
|
+
...fileCoverage,
|
|
68
|
+
fromV8: true,
|
|
69
|
+
}
|
|
70
|
+
})
|
|
71
|
+
return fileByFileMarked
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
const sourcesFromSourceMapCache = (url, sourceMapCache) => {
|
|
75
|
+
const sourceMapAndLineLengths = sourceMapCache[url]
|
|
76
|
+
if (!sourceMapAndLineLengths) {
|
|
77
|
+
return {}
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
const { data, lineLengths } = sourceMapAndLineLengths
|
|
81
|
+
// See: https://github.com/nodejs/node/pull/34305
|
|
82
|
+
if (!data) {
|
|
83
|
+
return undefined
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
const sources = {
|
|
87
|
+
sourcemap: data,
|
|
88
|
+
...(lineLengths ? { source: sourcesFromLineLengths(lineLengths) } : {}),
|
|
89
|
+
}
|
|
90
|
+
return sources
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
const sourcesFromLineLengths = (lineLengths) => {
|
|
94
|
+
let source = ""
|
|
95
|
+
lineLengths.forEach((length) => {
|
|
96
|
+
source += `${"".padEnd(length, ".")}\n`
|
|
97
|
+
})
|
|
98
|
+
return source
|
|
99
|
+
}
|