@jsenv/core 23.6.2 → 23.7.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 (119) 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 -128
  10. package/dist/jsenv_toolbar.js.map +12 -47
  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 +4 -2
  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/createCompiledFileService.js +290 -290
  108. package/src/internal/compiling/startCompileServer.js +1052 -1131
  109. package/src/internal/executing/coverage/babel_plugin_instrument.js +90 -90
  110. package/src/internal/executing/coverage/reportToCoverage.js +187 -187
  111. package/src/internal/executing/executePlan.js +183 -183
  112. package/src/internal/executing/launchAndExecute.js +458 -450
  113. package/src/internal/runtime/createBrowserRuntime/scanBrowserRuntimeFeatures.js +246 -250
  114. package/src/internal/runtime/createNodeRuntime/scanNodeRuntimeFeatures.js +112 -115
  115. package/src/internal/runtime/s.js +727 -727
  116. package/src/internal/toolbar/jsenv-logo.svg +144 -144
  117. package/src/internal/url_conversion.js +317 -317
  118. package/src/launchNode.js +210 -210
  119. package/src/startExploring.js +309 -309
@@ -1,90 +1,90 @@
1
- import {
2
- resolveUrl,
3
- normalizeStructuredMetaMap,
4
- urlToMeta,
5
- } from "@jsenv/filesystem"
6
-
7
- import { require } from "../../require.js"
8
-
9
- // https://github.com/istanbuljs/babel-plugin-istanbul/blob/321740f7b25d803f881466ea819d870f7ed6a254/src/index.js
10
-
11
- export const babelPluginInstrument = (api, options) => {
12
- const { programVisitor } = require("istanbul-lib-instrument")
13
-
14
- const { types } = api
15
- const {
16
- useInlineSourceMaps = false,
17
- projectDirectoryUrl,
18
- coverageConfig = { "./**/*": true },
19
- } = options
20
-
21
- const structuredMetaMapForCover = normalizeStructuredMetaMap(
22
- {
23
- cover: coverageConfig,
24
- },
25
- projectDirectoryUrl,
26
- )
27
- const shouldInstrument = (relativeUrl) => {
28
- return urlToMeta({
29
- url: resolveUrl(relativeUrl, projectDirectoryUrl),
30
- structuredMetaMap: structuredMetaMapForCover,
31
- }).cover
32
- }
33
-
34
- return {
35
- name: "transform-instrument",
36
- visitor: {
37
- Program: {
38
- enter(path) {
39
- const { file } = this
40
- const { opts } = file
41
-
42
- const relativeUrl = optionsToRelativeUrl(opts)
43
- if (!relativeUrl) {
44
- console.warn("file without relativeUrl", relativeUrl)
45
- return
46
- }
47
- if (!shouldInstrument(relativeUrl)) return
48
-
49
- this.__dv__ = null
50
-
51
- let inputSourceMap
52
-
53
- if (useInlineSourceMaps) {
54
- // https://github.com/istanbuljs/babel-plugin-istanbul/commit/a9e15643d249a2985e4387e4308022053b2cd0ad#diff-1fdf421c05c1140f6d71444ea2b27638R65
55
- inputSourceMap =
56
- opts.inputSourceMap || file.inputMap
57
- ? file.inputMap.sourcemap
58
- : null
59
- } else {
60
- inputSourceMap = opts.inputSourceMap
61
- }
62
-
63
- this.__dv__ = programVisitor(
64
- types,
65
- opts.filenameRelative || opts.filename,
66
- {
67
- coverageVariable: "__coverage__",
68
- inputSourceMap,
69
- },
70
- )
71
- this.__dv__.enter(path)
72
- },
73
-
74
- exit(path) {
75
- if (!this.__dv__) {
76
- return
77
- }
78
- const object = this.__dv__.exit(path)
79
- // object got two properties: fileCoverage and sourceMappingURL
80
- this.file.metadata.coverage = object.fileCoverage
81
- },
82
- },
83
- },
84
- }
85
- }
86
-
87
- const optionsToRelativeUrl = ({ filenameRelative }) => {
88
- if (filenameRelative) return filenameRelative
89
- return ""
90
- }
1
+ import {
2
+ resolveUrl,
3
+ normalizeStructuredMetaMap,
4
+ urlToMeta,
5
+ } from "@jsenv/filesystem"
6
+
7
+ import { require } from "../../require.js"
8
+
9
+ // https://github.com/istanbuljs/babel-plugin-istanbul/blob/321740f7b25d803f881466ea819d870f7ed6a254/src/index.js
10
+
11
+ export const babelPluginInstrument = (api, options) => {
12
+ const { programVisitor } = require("istanbul-lib-instrument")
13
+
14
+ const { types } = api
15
+ const {
16
+ useInlineSourceMaps = false,
17
+ projectDirectoryUrl,
18
+ coverageConfig = { "./**/*": true },
19
+ } = options
20
+
21
+ const structuredMetaMapForCover = normalizeStructuredMetaMap(
22
+ {
23
+ cover: coverageConfig,
24
+ },
25
+ projectDirectoryUrl,
26
+ )
27
+ const shouldInstrument = (relativeUrl) => {
28
+ return urlToMeta({
29
+ url: resolveUrl(relativeUrl, projectDirectoryUrl),
30
+ structuredMetaMap: structuredMetaMapForCover,
31
+ }).cover
32
+ }
33
+
34
+ return {
35
+ name: "transform-instrument",
36
+ visitor: {
37
+ Program: {
38
+ enter(path) {
39
+ const { file } = this
40
+ const { opts } = file
41
+
42
+ const relativeUrl = optionsToRelativeUrl(opts)
43
+ if (!relativeUrl) {
44
+ console.warn("file without relativeUrl", relativeUrl)
45
+ return
46
+ }
47
+ if (!shouldInstrument(relativeUrl)) return
48
+
49
+ this.__dv__ = null
50
+
51
+ let inputSourceMap
52
+
53
+ if (useInlineSourceMaps) {
54
+ // https://github.com/istanbuljs/babel-plugin-istanbul/commit/a9e15643d249a2985e4387e4308022053b2cd0ad#diff-1fdf421c05c1140f6d71444ea2b27638R65
55
+ inputSourceMap =
56
+ opts.inputSourceMap || file.inputMap
57
+ ? file.inputMap.sourcemap
58
+ : null
59
+ } else {
60
+ inputSourceMap = opts.inputSourceMap
61
+ }
62
+
63
+ this.__dv__ = programVisitor(
64
+ types,
65
+ opts.filenameRelative || opts.filename,
66
+ {
67
+ coverageVariable: "__coverage__",
68
+ inputSourceMap,
69
+ },
70
+ )
71
+ this.__dv__.enter(path)
72
+ },
73
+
74
+ exit(path) {
75
+ if (!this.__dv__) {
76
+ return
77
+ }
78
+ const object = this.__dv__.exit(path)
79
+ // object got two properties: fileCoverage and sourceMappingURL
80
+ this.file.metadata.coverage = object.fileCoverage
81
+ },
82
+ },
83
+ },
84
+ }
85
+ }
86
+
87
+ const optionsToRelativeUrl = ({ filenameRelative }) => {
88
+ if (filenameRelative) return filenameRelative
89
+ return ""
90
+ }
@@ -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)