@jsenv/core 23.6.1 → 23.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (135) hide show
  1. package/{license → LICENSE} +21 -21
  2. package/dist/jsenv_browser_system.js +35 -35
  3. package/dist/jsenv_browser_system.js.map +14 -14
  4. package/dist/jsenv_compile_proxy.js +47 -128
  5. package/dist/jsenv_compile_proxy.js.map +25 -62
  6. package/dist/jsenv_exploring_index.js.map +5 -5
  7. package/dist/jsenv_exploring_redirector.js +47 -54
  8. package/dist/jsenv_exploring_redirector.js.map +17 -19
  9. package/dist/jsenv_toolbar.js +47 -130
  10. package/dist/jsenv_toolbar.js.map +13 -48
  11. package/dist/jsenv_toolbar_injector.js.map +5 -5
  12. package/helpers/babel/.eslintrc.cjs +24 -24
  13. package/helpers/babel/AsyncGenerator/AsyncGenerator.js +81 -81
  14. package/helpers/babel/AwaitValue/AwaitValue.js +3 -3
  15. package/helpers/babel/applyDecoratorDescriptor/applyDecoratorDescriptor.js +33 -33
  16. package/helpers/babel/arrayLikeToArray/arrayLikeToArray.js +7 -7
  17. package/helpers/babel/arrayWithHoles/arrayWithHoles.js +4 -4
  18. package/helpers/babel/arrayWithoutHoles/arrayWithoutHoles.js +6 -6
  19. package/helpers/babel/assertThisInitialized/assertThisInitialized.js +7 -7
  20. package/helpers/babel/asyncGeneratorDelegate/asyncGeneratorDelegate.js +40 -40
  21. package/helpers/babel/asyncIterator/asyncIterator.js +12 -12
  22. package/helpers/babel/asyncToGenerator/asyncToGenerator.js +34 -34
  23. package/helpers/babel/awaitAsyncGenerator/awaitAsyncGenerator.js +5 -5
  24. package/helpers/babel/classApplyDescriptorDestructureSet/classApplyDescriptorDestructureSet.js +20 -20
  25. package/helpers/babel/classApplyDescriptorGet/classApplyDescriptorGet.js +6 -6
  26. package/helpers/babel/classApplyDescriptorSet/classApplyDescriptorSet.js +13 -13
  27. package/helpers/babel/classCallCheck/classCallCheck.js +5 -5
  28. package/helpers/babel/classCheckPrivateStaticAccess/classCheckPrivateStaticAccess.js +5 -5
  29. package/helpers/babel/classCheckPrivateStaticFieldDescriptor/classCheckPrivateStaticFieldDescriptor.js +6 -6
  30. package/helpers/babel/classExtractFieldDescriptor/classExtractFieldDescriptor.js +7 -7
  31. package/helpers/babel/classNameTDZError/classNameTDZError.js +4 -4
  32. package/helpers/babel/classPrivateFieldDestructureSet/classPrivateFieldDestructureSet.js +7 -7
  33. package/helpers/babel/classPrivateFieldGet/classPrivateFieldGet.js +7 -7
  34. package/helpers/babel/classPrivateFieldLooseBase/classPrivateFieldLooseBase.js +6 -6
  35. package/helpers/babel/classPrivateFieldLooseKey/classPrivateFieldLooseKey.js +5 -5
  36. package/helpers/babel/classPrivateFieldSet/classPrivateFieldSet.js +8 -8
  37. package/helpers/babel/classPrivateMethodGet/classPrivateMethodGet.js +6 -6
  38. package/helpers/babel/classPrivateMethodSet/classPrivateMethodSet.js +3 -3
  39. package/helpers/babel/classStaticPrivateFieldSpecGet/classStaticPrivateFieldSpecGet.js +9 -9
  40. package/helpers/babel/classStaticPrivateFieldSpecSet/classStaticPrivateFieldSpecSet.js +15 -15
  41. package/helpers/babel/classStaticPrivateMethodGet/classStaticPrivateMethodGet.js +6 -6
  42. package/helpers/babel/classStaticPrivateMethodSet/classStaticPrivateMethodSet.js +3 -3
  43. package/helpers/babel/construct/construct.js +16 -16
  44. package/helpers/babel/createClass/createClass.js +15 -15
  45. package/helpers/babel/createForOfIteratorHelper/createForOfIteratorHelper.js +60 -60
  46. package/helpers/babel/createForOfIteratorHelperLoose/createForOfIteratorHelperLoose.js +23 -23
  47. package/helpers/babel/createRawReactElement/createRawReactElement.js +50 -50
  48. package/helpers/babel/createSuper/createSuper.js +22 -22
  49. package/helpers/babel/decorate/decorate.js +403 -403
  50. package/helpers/babel/defaults/defaults.js +11 -11
  51. package/helpers/babel/defineEnumerableProperties/defineEnumerableProperties.js +23 -23
  52. package/helpers/babel/defineProperty/defineProperty.js +18 -18
  53. package/helpers/babel/extends/extends.js +14 -14
  54. package/helpers/babel/get/get.js +13 -13
  55. package/helpers/babel/getPrototypeOf/getPrototypeOf.js +4 -4
  56. package/helpers/babel/inherits/inherits.js +15 -15
  57. package/helpers/babel/inheritsLoose/inheritsLoose.js +7 -7
  58. package/helpers/babel/initializerDefineProperty/initializerDefineProperty.js +10 -10
  59. package/helpers/babel/initializerWarningHelper/initializerWarningHelper.js +6 -6
  60. package/helpers/babel/instanceof/instanceof.js +6 -6
  61. package/helpers/babel/interopRequireDefault/interopRequireDefault.js +3 -3
  62. package/helpers/babel/interopRequireWildcard/interopRequireWildcard.js +37 -37
  63. package/helpers/babel/isNativeFunction/isNativeFunction.js +4 -4
  64. package/helpers/babel/isNativeReflectConstruct/isNativeReflectConstruct.js +21 -21
  65. package/helpers/babel/iterableToArray/iterableToArray.js +7 -7
  66. package/helpers/babel/iterableToArrayLimit/iterableToArrayLimit.js +36 -36
  67. package/helpers/babel/iterableToArrayLimitLoose/iterableToArrayLimitLoose.js +10 -10
  68. package/helpers/babel/jsx/jsx.js +45 -45
  69. package/helpers/babel/maybeArrayLike/maybeArrayLike.js +10 -10
  70. package/helpers/babel/newArrowCheck/newArrowCheck.js +5 -5
  71. package/helpers/babel/nonIterableRest/nonIterableRest.js +5 -5
  72. package/helpers/babel/nonIterableSpread/nonIterableSpread.js +5 -5
  73. package/helpers/babel/objectDestructuringEmpty/objectDestructuringEmpty.js +3 -3
  74. package/helpers/babel/objectSpread/objectSpread.js +23 -23
  75. package/helpers/babel/objectSpread2/objectSpread2.js +33 -33
  76. package/helpers/babel/objectWithoutProperties/objectWithoutProperties.js +19 -19
  77. package/helpers/babel/objectWithoutPropertiesLoose/objectWithoutPropertiesLoose.js +13 -13
  78. package/helpers/babel/possibleConstructorReturn/possibleConstructorReturn.js +10 -10
  79. package/helpers/babel/readOnlyError/readOnlyError.js +4 -4
  80. package/helpers/babel/readme.md +9 -9
  81. package/helpers/babel/set/set.js +44 -44
  82. package/helpers/babel/setPrototypeOf/setPrototypeOf.js +6 -6
  83. package/helpers/babel/skipFirstGeneratorNext/skipFirstGeneratorNext.js +8 -8
  84. package/helpers/babel/slicedToArray/slicedToArray.js +10 -10
  85. package/helpers/babel/slicedToArrayLoose/slicedToArrayLoose.js +13 -13
  86. package/helpers/babel/superPropBase/superPropBase.js +10 -10
  87. package/helpers/babel/taggedTemplateLiteral/taggedTemplateLiteral.js +10 -10
  88. package/helpers/babel/taggedTemplateLiteralLoose/taggedTemplateLiteralLoose.js +7 -7
  89. package/helpers/babel/tdz/tdz.js +4 -4
  90. package/helpers/babel/temporalRef/temporalRef.js +6 -6
  91. package/helpers/babel/temporalUndefined/temporalUndefined.js +3 -3
  92. package/helpers/babel/toArray/toArray.js +10 -10
  93. package/helpers/babel/toConsumableArray/toConsumableArray.js +10 -10
  94. package/helpers/babel/toPrimitive/toPrimitive.js +10 -10
  95. package/helpers/babel/toPropertyKey/toPropertyKey.js +6 -6
  96. package/helpers/babel/typeof/typeof.js +14 -14
  97. package/helpers/babel/unsupportedIterableToArray/unsupportedIterableToArray.js +12 -12
  98. package/helpers/babel/wrapAsyncGenerator/wrapAsyncGenerator.js +8 -8
  99. package/helpers/babel/wrapNativeSuper/wrapNativeSuper.js +30 -30
  100. package/helpers/babel/wrapRegExp/wrapRegExp.js +63 -63
  101. package/helpers/babel/writeOnlyError/writeOnlyError.js +4 -4
  102. package/helpers/regenerator-runtime/regenerator-runtime.js +748 -748
  103. package/package.json +5 -3
  104. package/src/buildProject.js +300 -300
  105. package/src/execute.js +184 -184
  106. package/src/internal/browser-launcher/jsenv-browser-system.js +199 -199
  107. package/src/internal/compiling/babel_plugin_import_assertions.js +121 -100
  108. package/src/internal/compiling/babel_plugin_import_metadata.js +22 -0
  109. package/src/internal/compiling/babel_plugin_import_visitor.js +84 -0
  110. package/src/internal/compiling/compile-directory/getOrGenerateCompiledFile.js +268 -265
  111. package/src/internal/compiling/compile-directory/updateMeta.js +154 -150
  112. package/src/internal/compiling/compile-directory/validateCache.js +265 -265
  113. package/src/internal/compiling/compileFile.js +215 -200
  114. package/src/internal/compiling/compileHtml.js +550 -494
  115. package/src/internal/compiling/createCompiledFileService.js +291 -290
  116. package/src/internal/compiling/html_source_file_service.js +403 -379
  117. package/src/internal/compiling/js-compilation-service/jsenvTransform.js +270 -269
  118. package/src/internal/compiling/jsenvCompilerForHtml.js +300 -293
  119. package/src/internal/compiling/startCompileServer.js +1048 -1131
  120. package/src/internal/compiling/transformResultToCompilationResult.js +220 -217
  121. package/src/internal/executing/coverage/babel_plugin_instrument.js +90 -90
  122. package/src/internal/executing/coverage/reportToCoverage.js +187 -187
  123. package/src/internal/executing/executePlan.js +183 -183
  124. package/src/internal/executing/launchAndExecute.js +458 -450
  125. package/src/internal/runtime/createBrowserRuntime/scanBrowserRuntimeFeatures.js +246 -250
  126. package/src/internal/runtime/createNodeRuntime/scanNodeRuntimeFeatures.js +112 -115
  127. package/src/internal/runtime/s.js +727 -727
  128. package/src/internal/toolbar/jsenv-logo.svg +144 -144
  129. package/src/internal/toolbar/toolbar.main.css +196 -188
  130. package/src/internal/toolbar/toolbar.main.js +227 -228
  131. package/src/internal/url_conversion.js +317 -317
  132. package/src/startExploring.js +309 -309
  133. package/src/internal/compiling/babel_plugin_transform_import_specifier.js +0 -86
  134. package/src/internal/toolbar/animation/animation.css +0 -5
  135. package/src/internal/toolbar/variant/variant.css +0 -3
@@ -1,187 +1,187 @@
1
- import { readFile } from "@jsenv/filesystem"
2
- import { Abort } from "@jsenv/abort"
3
-
4
- import {
5
- visitNodeV8Directory,
6
- filterV8Coverage,
7
- } from "../coverage_utils/v8_coverage_from_directory.js"
8
- import { composeTwoV8Coverages } from "../coverage_utils/v8_coverage_composition.js"
9
- import { composeTwoFileByFileIstanbulCoverages } from "../coverage_utils/istanbul_coverage_composition.js"
10
- import { v8CoverageToIstanbul } from "../coverage_utils/v8_coverage_to_istanbul.js"
11
- import { composeV8AndIstanbul } from "../coverage_utils/v8_and_istanbul.js"
12
- import { normalizeFileByFileCoveragePaths } from "../coverage_utils/file_by_file_coverage.js"
13
- import { getMissingFileByFileCoverage } from "../coverage_missing/missing_coverage.js"
14
-
15
- export const reportToCoverage = async (
16
- report,
17
- {
18
- signal,
19
- logger,
20
- projectDirectoryUrl,
21
- babelPluginMap,
22
- coverageConfig,
23
- coverageIncludeMissing,
24
- coverageIgnorePredicate,
25
- coverageForceIstanbul,
26
- coverageV8ConflictWarning,
27
- },
28
- ) => {
29
- // collect v8 and istanbul coverage from executions
30
- let { v8Coverage, fileByFileIstanbulCoverage } = await getCoverageFromReport({
31
- signal,
32
- report,
33
- onMissing: ({ file, executionResult, executionName }) => {
34
- // several reasons not to have coverage here:
35
- // 1. the file we executed did not import an instrumented file.
36
- // - a test file without import
37
- // - a test file importing only file excluded from coverage
38
- // - a coverDescription badly configured so that we don't realize
39
- // a file should be covered
40
-
41
- // 2. the file we wanted to executed timedout
42
- // - infinite loop
43
- // - too extensive operation
44
- // - a badly configured or too low allocatedMs for that execution.
45
-
46
- // 3. the file we wanted to execute contains syntax-error
47
-
48
- // in any scenario we are fine because
49
- // coverDescription will generate empty coverage for files
50
- // that were suppose to be coverage but were not.
51
- if (executionResult.status === "completed") {
52
- logger.debug(
53
- `No execution.coverageFileUrl from execution named "${executionName}" of ${file}`,
54
- )
55
- }
56
- },
57
- })
58
-
59
- if (!coverageForceIstanbul && process.env.NODE_V8_COVERAGE) {
60
- await visitNodeV8Directory({
61
- signal,
62
- NODE_V8_COVERAGE: process.env.NODE_V8_COVERAGE,
63
- onV8Coverage: (nodeV8Coverage) => {
64
- const nodeV8CoverageLight = filterV8Coverage(nodeV8Coverage, {
65
- coverageIgnorePredicate,
66
- })
67
- v8Coverage = v8Coverage
68
- ? composeTwoV8Coverages(v8Coverage, nodeV8CoverageLight)
69
- : nodeV8CoverageLight
70
- },
71
- })
72
- }
73
-
74
- // try to merge v8 with istanbul, if any
75
- let fileByFileCoverage
76
- if (v8Coverage) {
77
- let v8FileByFileCoverage = await v8CoverageToIstanbul(v8Coverage, {
78
- signal,
79
- })
80
-
81
- v8FileByFileCoverage = normalizeFileByFileCoveragePaths(
82
- v8FileByFileCoverage,
83
- projectDirectoryUrl,
84
- )
85
-
86
- if (fileByFileIstanbulCoverage) {
87
- fileByFileIstanbulCoverage = normalizeFileByFileCoveragePaths(
88
- fileByFileIstanbulCoverage,
89
- projectDirectoryUrl,
90
- )
91
- fileByFileCoverage = composeV8AndIstanbul(
92
- v8FileByFileCoverage,
93
- fileByFileIstanbulCoverage,
94
- { coverageV8ConflictWarning },
95
- )
96
- } else {
97
- fileByFileCoverage = v8FileByFileCoverage
98
- }
99
- }
100
- // get istanbul only
101
- else if (fileByFileIstanbulCoverage) {
102
- fileByFileCoverage = normalizeFileByFileCoveragePaths(
103
- fileByFileIstanbulCoverage,
104
- projectDirectoryUrl,
105
- )
106
- }
107
- // no coverage found in execution (or zero file where executed)
108
- else {
109
- fileByFileCoverage = {}
110
- }
111
-
112
- // now add coverage for file not covered
113
- if (coverageIncludeMissing) {
114
- const missingFileByFileCoverage = await getMissingFileByFileCoverage({
115
- signal,
116
- projectDirectoryUrl,
117
- coverageConfig,
118
- fileByFileCoverage,
119
- babelPluginMap,
120
- })
121
- Object.assign(fileByFileCoverage, missingFileByFileCoverage)
122
- }
123
-
124
- return fileByFileCoverage
125
- }
126
-
127
- const getCoverageFromReport = async ({ signal, report, onMissing }) => {
128
- const operation = Abort.startOperation()
129
- operation.addAbortSignal(signal)
130
-
131
- try {
132
- let v8Coverage
133
- let fileByFileIstanbulCoverage
134
-
135
- // collect v8 and istanbul coverage from executions
136
- await Object.keys(report).reduce(async (previous, file) => {
137
- operation.throwIfAborted()
138
- await previous
139
-
140
- const executionResultForFile = report[file]
141
- await Object.keys(executionResultForFile).reduce(
142
- async (previous, executionName) => {
143
- operation.throwIfAborted()
144
- await previous
145
-
146
- const executionResultForFileOnRuntime =
147
- executionResultForFile[executionName]
148
- const { coverageFileUrl } = executionResultForFileOnRuntime
149
- if (!coverageFileUrl) {
150
- onMissing({
151
- executionName,
152
- file,
153
- executionResult: executionResultForFileOnRuntime,
154
- })
155
- return
156
- }
157
-
158
- const executionCoverage = await readFile(coverageFileUrl, {
159
- as: "json",
160
- })
161
- if (isV8Coverage(executionCoverage)) {
162
- v8Coverage = v8Coverage
163
- ? composeTwoV8Coverages(v8Coverage, executionCoverage)
164
- : executionCoverage
165
- } else {
166
- fileByFileIstanbulCoverage = fileByFileIstanbulCoverage
167
- ? composeTwoFileByFileIstanbulCoverages(
168
- fileByFileIstanbulCoverage,
169
- executionCoverage,
170
- )
171
- : executionCoverage
172
- }
173
- },
174
- Promise.resolve(),
175
- )
176
- }, Promise.resolve())
177
-
178
- return {
179
- v8Coverage,
180
- fileByFileIstanbulCoverage,
181
- }
182
- } finally {
183
- await operation.end()
184
- }
185
- }
186
-
187
- const isV8Coverage = (coverage) => Boolean(coverage.result)
1
+ import { readFile } from "@jsenv/filesystem"
2
+ import { Abort } from "@jsenv/abort"
3
+
4
+ import {
5
+ visitNodeV8Directory,
6
+ filterV8Coverage,
7
+ } from "../coverage_utils/v8_coverage_from_directory.js"
8
+ import { composeTwoV8Coverages } from "../coverage_utils/v8_coverage_composition.js"
9
+ import { composeTwoFileByFileIstanbulCoverages } from "../coverage_utils/istanbul_coverage_composition.js"
10
+ import { v8CoverageToIstanbul } from "../coverage_utils/v8_coverage_to_istanbul.js"
11
+ import { composeV8AndIstanbul } from "../coverage_utils/v8_and_istanbul.js"
12
+ import { normalizeFileByFileCoveragePaths } from "../coverage_utils/file_by_file_coverage.js"
13
+ import { getMissingFileByFileCoverage } from "../coverage_missing/missing_coverage.js"
14
+
15
+ export const reportToCoverage = async (
16
+ report,
17
+ {
18
+ signal,
19
+ logger,
20
+ projectDirectoryUrl,
21
+ babelPluginMap,
22
+ coverageConfig,
23
+ coverageIncludeMissing,
24
+ coverageIgnorePredicate,
25
+ coverageForceIstanbul,
26
+ coverageV8ConflictWarning,
27
+ },
28
+ ) => {
29
+ // collect v8 and istanbul coverage from executions
30
+ let { v8Coverage, fileByFileIstanbulCoverage } = await getCoverageFromReport({
31
+ signal,
32
+ report,
33
+ onMissing: ({ file, executionResult, executionName }) => {
34
+ // several reasons not to have coverage here:
35
+ // 1. the file we executed did not import an instrumented file.
36
+ // - a test file without import
37
+ // - a test file importing only file excluded from coverage
38
+ // - a coverDescription badly configured so that we don't realize
39
+ // a file should be covered
40
+
41
+ // 2. the file we wanted to executed timedout
42
+ // - infinite loop
43
+ // - too extensive operation
44
+ // - a badly configured or too low allocatedMs for that execution.
45
+
46
+ // 3. the file we wanted to execute contains syntax-error
47
+
48
+ // in any scenario we are fine because
49
+ // coverDescription will generate empty coverage for files
50
+ // that were suppose to be coverage but were not.
51
+ if (executionResult.status === "completed") {
52
+ logger.debug(
53
+ `No execution.coverageFileUrl from execution named "${executionName}" of ${file}`,
54
+ )
55
+ }
56
+ },
57
+ })
58
+
59
+ if (!coverageForceIstanbul && process.env.NODE_V8_COVERAGE) {
60
+ await visitNodeV8Directory({
61
+ signal,
62
+ NODE_V8_COVERAGE: process.env.NODE_V8_COVERAGE,
63
+ onV8Coverage: (nodeV8Coverage) => {
64
+ const nodeV8CoverageLight = filterV8Coverage(nodeV8Coverage, {
65
+ coverageIgnorePredicate,
66
+ })
67
+ v8Coverage = v8Coverage
68
+ ? composeTwoV8Coverages(v8Coverage, nodeV8CoverageLight)
69
+ : nodeV8CoverageLight
70
+ },
71
+ })
72
+ }
73
+
74
+ // try to merge v8 with istanbul, if any
75
+ let fileByFileCoverage
76
+ if (v8Coverage) {
77
+ let v8FileByFileCoverage = await v8CoverageToIstanbul(v8Coverage, {
78
+ signal,
79
+ })
80
+
81
+ v8FileByFileCoverage = normalizeFileByFileCoveragePaths(
82
+ v8FileByFileCoverage,
83
+ projectDirectoryUrl,
84
+ )
85
+
86
+ if (fileByFileIstanbulCoverage) {
87
+ fileByFileIstanbulCoverage = normalizeFileByFileCoveragePaths(
88
+ fileByFileIstanbulCoverage,
89
+ projectDirectoryUrl,
90
+ )
91
+ fileByFileCoverage = composeV8AndIstanbul(
92
+ v8FileByFileCoverage,
93
+ fileByFileIstanbulCoverage,
94
+ { coverageV8ConflictWarning },
95
+ )
96
+ } else {
97
+ fileByFileCoverage = v8FileByFileCoverage
98
+ }
99
+ }
100
+ // get istanbul only
101
+ else if (fileByFileIstanbulCoverage) {
102
+ fileByFileCoverage = normalizeFileByFileCoveragePaths(
103
+ fileByFileIstanbulCoverage,
104
+ projectDirectoryUrl,
105
+ )
106
+ }
107
+ // no coverage found in execution (or zero file where executed)
108
+ else {
109
+ fileByFileCoverage = {}
110
+ }
111
+
112
+ // now add coverage for file not covered
113
+ if (coverageIncludeMissing) {
114
+ const missingFileByFileCoverage = await getMissingFileByFileCoverage({
115
+ signal,
116
+ projectDirectoryUrl,
117
+ coverageConfig,
118
+ fileByFileCoverage,
119
+ babelPluginMap,
120
+ })
121
+ Object.assign(fileByFileCoverage, missingFileByFileCoverage)
122
+ }
123
+
124
+ return fileByFileCoverage
125
+ }
126
+
127
+ const getCoverageFromReport = async ({ signal, report, onMissing }) => {
128
+ const operation = Abort.startOperation()
129
+ operation.addAbortSignal(signal)
130
+
131
+ try {
132
+ let v8Coverage
133
+ let fileByFileIstanbulCoverage
134
+
135
+ // collect v8 and istanbul coverage from executions
136
+ await Object.keys(report).reduce(async (previous, file) => {
137
+ operation.throwIfAborted()
138
+ await previous
139
+
140
+ const executionResultForFile = report[file]
141
+ await Object.keys(executionResultForFile).reduce(
142
+ async (previous, executionName) => {
143
+ operation.throwIfAborted()
144
+ await previous
145
+
146
+ const executionResultForFileOnRuntime =
147
+ executionResultForFile[executionName]
148
+ const { coverageFileUrl } = executionResultForFileOnRuntime
149
+ if (!coverageFileUrl) {
150
+ onMissing({
151
+ executionName,
152
+ file,
153
+ executionResult: executionResultForFileOnRuntime,
154
+ })
155
+ return
156
+ }
157
+
158
+ const executionCoverage = await readFile(coverageFileUrl, {
159
+ as: "json",
160
+ })
161
+ if (isV8Coverage(executionCoverage)) {
162
+ v8Coverage = v8Coverage
163
+ ? composeTwoV8Coverages(v8Coverage, executionCoverage)
164
+ : executionCoverage
165
+ } else {
166
+ fileByFileIstanbulCoverage = fileByFileIstanbulCoverage
167
+ ? composeTwoFileByFileIstanbulCoverages(
168
+ fileByFileIstanbulCoverage,
169
+ executionCoverage,
170
+ )
171
+ : executionCoverage
172
+ }
173
+ },
174
+ Promise.resolve(),
175
+ )
176
+ }, Promise.resolve())
177
+
178
+ return {
179
+ v8Coverage,
180
+ fileByFileIstanbulCoverage,
181
+ }
182
+ } finally {
183
+ await operation.end()
184
+ }
185
+ }
186
+
187
+ const isV8Coverage = (coverage) => Boolean(coverage.result)