@plugjs/plug 0.0.27 → 0.1.1

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 (282) hide show
  1. package/dist/{failure.cjs → asserts.cjs} +30 -10
  2. package/dist/asserts.cjs.map +6 -0
  3. package/dist/{failure.d.ts → asserts.d.ts} +4 -1
  4. package/dist/asserts.mjs +51 -0
  5. package/dist/asserts.mjs.map +6 -0
  6. package/dist/async.cjs +2 -2
  7. package/dist/async.cjs.map +1 -1
  8. package/dist/async.mjs +2 -2
  9. package/dist/async.mjs.map +1 -1
  10. package/dist/build.cjs +22 -33
  11. package/dist/build.cjs.map +1 -1
  12. package/dist/build.d.ts +2 -13
  13. package/dist/build.mjs +17 -27
  14. package/dist/build.mjs.map +1 -1
  15. package/dist/files.cjs +7 -11
  16. package/dist/files.cjs.map +1 -1
  17. package/dist/files.mjs +5 -9
  18. package/dist/files.mjs.map +1 -1
  19. package/dist/fork.cjs +35 -30
  20. package/dist/fork.cjs.map +1 -1
  21. package/dist/fork.d.ts +6 -3
  22. package/dist/fork.mjs +18 -13
  23. package/dist/fork.mjs.map +1 -1
  24. package/dist/{utils/asyncfs.cjs → fs.cjs} +6 -6
  25. package/dist/fs.cjs.map +6 -0
  26. package/dist/{utils/asyncfs.d.ts → fs.d.ts} +1 -1
  27. package/dist/{utils/asyncfs.mjs → fs.mjs} +3 -3
  28. package/dist/fs.mjs.map +6 -0
  29. package/dist/helpers.cjs +31 -14
  30. package/dist/helpers.cjs.map +1 -1
  31. package/dist/helpers.d.ts +30 -1
  32. package/dist/helpers.mjs +22 -7
  33. package/dist/helpers.mjs.map +1 -1
  34. package/dist/index.cjs +36 -6
  35. package/dist/index.cjs.map +1 -1
  36. package/dist/index.d.ts +25 -8
  37. package/dist/index.mjs +20 -5
  38. package/dist/index.mjs.map +1 -1
  39. package/dist/{log → logging}/colors.cjs +1 -1
  40. package/dist/{log → logging}/colors.cjs.map +1 -1
  41. package/dist/{log → logging}/colors.d.ts +0 -0
  42. package/dist/{log → logging}/colors.mjs +1 -1
  43. package/dist/{log → logging}/colors.mjs.map +1 -1
  44. package/dist/{log → logging}/emit.cjs +1 -2
  45. package/dist/{log → logging}/emit.cjs.map +2 -2
  46. package/dist/{log → logging}/emit.d.ts +1 -1
  47. package/dist/{log → logging}/emit.mjs +1 -2
  48. package/dist/{log → logging}/emit.mjs.map +2 -2
  49. package/dist/{log → logging}/levels.cjs +1 -1
  50. package/dist/{log → logging}/levels.cjs.map +1 -1
  51. package/dist/{log → logging}/levels.d.ts +6 -6
  52. package/dist/{log → logging}/levels.mjs +1 -1
  53. package/dist/{log → logging}/levels.mjs.map +1 -1
  54. package/dist/{log → logging}/logger.cjs +13 -7
  55. package/dist/logging/logger.cjs.map +6 -0
  56. package/dist/{log → logging}/logger.d.ts +0 -0
  57. package/dist/{log → logging}/logger.mjs +11 -5
  58. package/dist/logging/logger.mjs.map +6 -0
  59. package/dist/{log → logging}/options.cjs +12 -6
  60. package/dist/logging/options.cjs.map +6 -0
  61. package/dist/{log → logging}/options.d.ts +1 -1
  62. package/dist/{log → logging}/options.mjs +12 -6
  63. package/dist/logging/options.mjs.map +6 -0
  64. package/dist/{log → logging}/report.cjs +11 -11
  65. package/dist/logging/report.cjs.map +6 -0
  66. package/dist/{log → logging}/report.d.ts +1 -1
  67. package/dist/{log → logging}/report.mjs +8 -8
  68. package/dist/logging/report.mjs.map +6 -0
  69. package/dist/{log → logging}/spinner.cjs +1 -1
  70. package/dist/{log → logging}/spinner.cjs.map +1 -1
  71. package/dist/{log → logging}/spinner.d.ts +0 -0
  72. package/dist/{log → logging}/spinner.mjs +1 -1
  73. package/dist/{log → logging}/spinner.mjs.map +1 -1
  74. package/dist/{log.cjs → logging.cjs} +13 -16
  75. package/dist/logging.cjs.map +6 -0
  76. package/dist/logging.d.ts +10 -0
  77. package/dist/{log.mjs → logging.mjs} +10 -13
  78. package/dist/logging.mjs.map +6 -0
  79. package/dist/paths.cjs +25 -27
  80. package/dist/paths.cjs.map +1 -1
  81. package/dist/paths.d.ts +8 -8
  82. package/dist/paths.mjs +23 -25
  83. package/dist/paths.mjs.map +1 -1
  84. package/dist/pipe.cjs +10 -13
  85. package/dist/pipe.cjs.map +1 -1
  86. package/dist/pipe.d.ts +13 -19
  87. package/dist/pipe.mjs +6 -9
  88. package/dist/pipe.mjs.map +1 -1
  89. package/dist/plugs/copy.cjs +14 -14
  90. package/dist/plugs/copy.cjs.map +1 -1
  91. package/dist/plugs/copy.d.ts +1 -1
  92. package/dist/plugs/copy.mjs +3 -3
  93. package/dist/plugs/copy.mjs.map +1 -1
  94. package/dist/plugs/debug.cjs +7 -7
  95. package/dist/plugs/debug.cjs.map +1 -1
  96. package/dist/plugs/debug.d.ts +1 -1
  97. package/dist/plugs/debug.mjs +1 -1
  98. package/dist/plugs/edit.cjs +21 -0
  99. package/dist/plugs/edit.cjs.map +6 -0
  100. package/dist/plugs/edit.d.ts +7 -0
  101. package/dist/plugs/edit.mjs +29 -0
  102. package/dist/plugs/edit.mjs.map +6 -0
  103. package/dist/plugs/esbuild/fix-extensions.cjs +7 -8
  104. package/dist/plugs/esbuild/fix-extensions.cjs.map +1 -1
  105. package/dist/plugs/esbuild/fix-extensions.mjs +4 -5
  106. package/dist/plugs/esbuild/fix-extensions.mjs.map +1 -1
  107. package/dist/plugs/esbuild.cjs +19 -14
  108. package/dist/plugs/esbuild.cjs.map +1 -1
  109. package/dist/plugs/esbuild.d.ts +2 -2
  110. package/dist/plugs/esbuild.mjs +8 -3
  111. package/dist/plugs/esbuild.mjs.map +1 -1
  112. package/dist/plugs/exec.cjs +2 -82
  113. package/dist/plugs/exec.cjs.map +2 -2
  114. package/dist/plugs/exec.d.ts +6 -32
  115. package/dist/plugs/exec.mjs +2 -68
  116. package/dist/plugs/exec.mjs.map +1 -1
  117. package/dist/plugs/filter.d.ts +1 -1
  118. package/dist/plugs/rmf.cjs +5 -5
  119. package/dist/plugs/rmf.cjs.map +1 -1
  120. package/dist/plugs/rmf.d.ts +1 -1
  121. package/dist/plugs/rmf.mjs +2 -2
  122. package/dist/plugs/rmf.mjs.map +1 -1
  123. package/dist/plugs.cjs +1 -4
  124. package/dist/plugs.cjs.map +1 -1
  125. package/dist/plugs.d.ts +1 -4
  126. package/dist/plugs.mjs +1 -4
  127. package/dist/plugs.mjs.map +1 -1
  128. package/dist/types.d.ts +8 -8
  129. package/dist/utils/caller.cjs +8 -5
  130. package/dist/utils/caller.cjs.map +1 -1
  131. package/dist/utils/caller.mjs +6 -3
  132. package/dist/utils/caller.mjs.map +1 -1
  133. package/dist/utils/exec.cjs +102 -0
  134. package/dist/utils/exec.cjs.map +6 -0
  135. package/dist/utils/exec.d.ts +15 -0
  136. package/dist/utils/exec.mjs +71 -0
  137. package/dist/utils/exec.mjs.map +6 -0
  138. package/dist/utils/match.d.ts +1 -1
  139. package/dist/utils/options.d.ts +3 -3
  140. package/dist/utils/walk.cjs +7 -7
  141. package/dist/utils/walk.cjs.map +1 -1
  142. package/dist/utils/walk.mjs +2 -2
  143. package/dist/utils/walk.mjs.map +1 -1
  144. package/dist/{plugs/tsc.cjs → utils.cjs} +9 -7
  145. package/dist/utils.cjs.map +6 -0
  146. package/dist/utils.d.ts +4 -0
  147. package/dist/utils.mjs +6 -0
  148. package/dist/utils.mjs.map +6 -0
  149. package/extra/cli.mjs +26 -5
  150. package/extra/ts-loader.mjs +4 -4
  151. package/package.json +101 -20
  152. package/src/{assert.ts → asserts.ts} +36 -1
  153. package/src/async.ts +3 -1
  154. package/src/build.ts +179 -0
  155. package/src/files.ts +5 -5
  156. package/src/fork.ts +19 -11
  157. package/src/{utils/asyncfs.ts → fs.ts} +7 -6
  158. package/src/helpers.ts +56 -8
  159. package/src/index.ts +30 -8
  160. package/src/{log → logging}/colors.ts +0 -0
  161. package/src/{log → logging}/emit.ts +0 -1
  162. package/src/{log → logging}/levels.ts +0 -0
  163. package/src/{log → logging}/logger.ts +13 -4
  164. package/src/{log → logging}/options.ts +11 -7
  165. package/src/{log → logging}/report.ts +10 -9
  166. package/src/{log → logging}/spinner.ts +0 -0
  167. package/src/{log.ts → logging.ts} +7 -7
  168. package/src/paths.ts +36 -41
  169. package/src/pipe.ts +13 -20
  170. package/src/plugs/copy.ts +4 -4
  171. package/src/plugs/debug.ts +2 -2
  172. package/src/plugs/edit.ts +34 -0
  173. package/src/plugs/esbuild/fix-extensions.ts +2 -2
  174. package/src/plugs/esbuild.ts +13 -7
  175. package/src/plugs/exec.ts +8 -129
  176. package/src/plugs/filter.ts +1 -1
  177. package/src/plugs/rmf.ts +3 -3
  178. package/src/plugs.ts +1 -13
  179. package/src/types.ts +1 -1
  180. package/src/utils/caller.ts +6 -3
  181. package/src/utils/exec.ts +112 -0
  182. package/src/utils/walk.ts +3 -3
  183. package/src/utils.ts +4 -0
  184. package/types/{webassembly.d.ts → plugjs.d.ts} +7 -1
  185. package/dist/assert.cjs +0 -52
  186. package/dist/assert.cjs.map +0 -6
  187. package/dist/assert.d.ts +0 -4
  188. package/dist/assert.mjs +0 -26
  189. package/dist/assert.mjs.map +0 -6
  190. package/dist/failure.cjs.map +0 -6
  191. package/dist/failure.mjs +0 -33
  192. package/dist/failure.mjs.map +0 -6
  193. package/dist/log/logger.cjs.map +0 -6
  194. package/dist/log/logger.mjs.map +0 -6
  195. package/dist/log/options.cjs.map +0 -6
  196. package/dist/log/options.mjs.map +0 -6
  197. package/dist/log/report.cjs.map +0 -6
  198. package/dist/log/report.mjs.map +0 -6
  199. package/dist/log.cjs.map +0 -6
  200. package/dist/log.d.ts +0 -10
  201. package/dist/log.mjs.map +0 -6
  202. package/dist/plugs/coverage/analysis.cjs +0 -234
  203. package/dist/plugs/coverage/analysis.cjs.map +0 -6
  204. package/dist/plugs/coverage/analysis.d.ts +0 -104
  205. package/dist/plugs/coverage/analysis.mjs +0 -207
  206. package/dist/plugs/coverage/analysis.mjs.map +0 -6
  207. package/dist/plugs/coverage/report.cjs +0 -235
  208. package/dist/plugs/coverage/report.cjs.map +0 -6
  209. package/dist/plugs/coverage/report.d.ts +0 -59
  210. package/dist/plugs/coverage/report.mjs +0 -220
  211. package/dist/plugs/coverage/report.mjs.map +0 -6
  212. package/dist/plugs/coverage.cjs +0 -140
  213. package/dist/plugs/coverage.cjs.map +0 -6
  214. package/dist/plugs/coverage.d.ts +0 -49
  215. package/dist/plugs/coverage.mjs +0 -123
  216. package/dist/plugs/coverage.mjs.map +0 -6
  217. package/dist/plugs/eslint/runner.cjs +0 -91
  218. package/dist/plugs/eslint/runner.cjs.map +0 -6
  219. package/dist/plugs/eslint/runner.d.ts +0 -8
  220. package/dist/plugs/eslint/runner.mjs +0 -68
  221. package/dist/plugs/eslint/runner.mjs.map +0 -6
  222. package/dist/plugs/eslint.cjs +0 -22
  223. package/dist/plugs/eslint.cjs.map +0 -6
  224. package/dist/plugs/eslint.d.ts +0 -34
  225. package/dist/plugs/eslint.mjs +0 -5
  226. package/dist/plugs/eslint.mjs.map +0 -6
  227. package/dist/plugs/mocha/reporter.cjs +0 -159
  228. package/dist/plugs/mocha/reporter.cjs.map +0 -6
  229. package/dist/plugs/mocha/reporter.d.ts +0 -6
  230. package/dist/plugs/mocha/reporter.mjs +0 -127
  231. package/dist/plugs/mocha/reporter.mjs.map +0 -6
  232. package/dist/plugs/mocha/runner.cjs +0 -82
  233. package/dist/plugs/mocha/runner.cjs.map +0 -6
  234. package/dist/plugs/mocha/runner.d.ts +0 -8
  235. package/dist/plugs/mocha/runner.mjs +0 -53
  236. package/dist/plugs/mocha/runner.mjs.map +0 -6
  237. package/dist/plugs/mocha.cjs +0 -22
  238. package/dist/plugs/mocha.cjs.map +0 -6
  239. package/dist/plugs/mocha.d.ts +0 -37
  240. package/dist/plugs/mocha.mjs +0 -5
  241. package/dist/plugs/mocha.mjs.map +0 -6
  242. package/dist/plugs/tsc/compiler.cjs +0 -74
  243. package/dist/plugs/tsc/compiler.cjs.map +0 -6
  244. package/dist/plugs/tsc/compiler.d.ts +0 -24
  245. package/dist/plugs/tsc/compiler.mjs +0 -43
  246. package/dist/plugs/tsc/compiler.mjs.map +0 -6
  247. package/dist/plugs/tsc/options.cjs +0 -82
  248. package/dist/plugs/tsc/options.cjs.map +0 -6
  249. package/dist/plugs/tsc/options.d.ts +0 -8
  250. package/dist/plugs/tsc/options.mjs +0 -51
  251. package/dist/plugs/tsc/options.mjs.map +0 -6
  252. package/dist/plugs/tsc/report.cjs +0 -90
  253. package/dist/plugs/tsc/report.cjs.map +0 -6
  254. package/dist/plugs/tsc/report.d.ts +0 -5
  255. package/dist/plugs/tsc/report.mjs +0 -59
  256. package/dist/plugs/tsc/report.mjs.map +0 -6
  257. package/dist/plugs/tsc/runner.cjs +0 -124
  258. package/dist/plugs/tsc/runner.cjs.map +0 -6
  259. package/dist/plugs/tsc/runner.d.ts +0 -8
  260. package/dist/plugs/tsc/runner.mjs +0 -95
  261. package/dist/plugs/tsc/runner.mjs.map +0 -6
  262. package/dist/plugs/tsc.cjs.map +0 -6
  263. package/dist/plugs/tsc.d.ts +0 -48
  264. package/dist/plugs/tsc.mjs +0 -5
  265. package/dist/plugs/tsc.mjs.map +0 -6
  266. package/dist/utils/asyncfs.cjs.map +0 -6
  267. package/dist/utils/asyncfs.mjs.map +0 -6
  268. package/src/failure.ts +0 -43
  269. package/src/plugs/coverage/analysis.ts +0 -400
  270. package/src/plugs/coverage/report.ts +0 -368
  271. package/src/plugs/coverage.ts +0 -216
  272. package/src/plugs/eslint/runner.ts +0 -100
  273. package/src/plugs/eslint.ts +0 -42
  274. package/src/plugs/mocha/reporter.ts +0 -178
  275. package/src/plugs/mocha/runner.ts +0 -66
  276. package/src/plugs/mocha.ts +0 -43
  277. package/src/plugs/tsc/compiler.ts +0 -68
  278. package/src/plugs/tsc/options.ts +0 -100
  279. package/src/plugs/tsc/report.ts +0 -77
  280. package/src/plugs/tsc/runner.ts +0 -133
  281. package/src/plugs/tsc.ts +0 -58
  282. package/types/globals.d.ts +0 -15
@@ -1,400 +0,0 @@
1
- import { fileURLToPath, pathToFileURL } from 'node:url'
2
-
3
- import { SourceMapConsumer } from 'source-map'
4
-
5
- import { assert } from '../../assert'
6
- import { $gry, $p } from '../../log'
7
- import { readFile } from '../../utils/asyncfs'
8
-
9
- import type { Logger } from '../../log'
10
- import type { RawSourceMap } from 'source-map'
11
- import type { AbsolutePath } from '../../paths'
12
-
13
- /* ========================================================================== *
14
- * V8 COVERAGE TYPES *
15
- * ========================================================================== */
16
-
17
- /** Coverage range */
18
- export interface V8CoveredRange {
19
- /** The offset in the script of the first character covered */
20
- startOffset: number,
21
- /** The offset (exclusive) in the script of the last character covered */
22
- endOffset: number,
23
- /** The number of times the specified offset was covered */
24
- count: number,
25
- }
26
-
27
- /** Coverage report per function as invoked by Node */
28
- export interface V8CoveredFunction {
29
- /** The name of the function being covered */
30
- functionName: string,
31
- /** A flag indicating whether fine-grained (precise) coverage is available */
32
- isBlockCoverage: boolean,
33
- /**
34
- * The ranges covered.
35
- *
36
- * The first range indicates the whole function.
37
- */
38
- ranges: V8CoveredRange[],
39
- }
40
-
41
- /** Coverage result for a particlar script as seen by Node */
42
- export interface V8CoverageResult {
43
- /** The script ID, uniquely identifying the script within the Node process */
44
- scriptId: string,
45
- /** The URL of the script (might not be unique, if the script is loaded multiple times) */
46
- url: string,
47
- /** Per-function report of coverage */
48
- functions: V8CoveredFunction[]
49
- }
50
-
51
- /** Cached source map for a coverage result */
52
- export interface V8SourceMapCache {
53
- /** The line lengths (sans EOL) in the transpiled code */
54
- lineLengths: number[],
55
- /** The source map associated with the transpiled code */
56
- data: RawSourceMap | null,
57
- /** The url (if any) of the sourcemap, for resolving relative paths */
58
- url: string | null,
59
- }
60
-
61
- /** The RAW coverage data as emitted by Node, parsed from JSON */
62
- export interface V8CoverageData {
63
- /**
64
- * Coverage results, per script.
65
- *
66
- * The first element in the array describes the coverage for the whole script.
67
- */
68
- 'result': V8CoverageResult[],
69
- /** Timestamp when coverage was taken */
70
- 'timestamp'?: number,
71
- /** Source maps caches keyed by `result[?].url` */
72
- 'source-map-cache'?: Record<string, V8SourceMapCache>
73
- }
74
-
75
- /* ========================================================================== *
76
- * COVERAGE ANALYSIS *
77
- * ========================================================================== */
78
-
79
- /**
80
- * The bias for source map analisys (defaults to `least_upper_bound`).
81
- *
82
- * We use `least_upper_bound` here, as it's the _opposite_ of the default
83
- * `greatest_lower_bound`, and we _reverse_ the lookup of the sourcemaps (from
84
- * source code to generated code).
85
- */
86
- export type SourceMapBias = 'greatest_lower_bound' | 'least_upper_bound' | 'none' | undefined
87
-
88
- /** Interface providing coverage data */
89
- export interface CoverageAnalyser {
90
- /** Return the number of coverage passes for the given location */
91
- coverage(source: string, line: number, column: number): number
92
- /** Destroy this instance */
93
- destroy(): void
94
- }
95
-
96
- /* ========================================================================== */
97
-
98
- /** Basic abstract class implementing the {@link CoverageAnalyser} class */
99
- abstract class CoverageAnalyserImpl implements CoverageAnalyser {
100
- constructor(protected readonly _log: Logger) {}
101
-
102
- abstract init(): Promise<this>
103
- abstract destroy(): void
104
- abstract coverage(source: string, line: number, column: number): number
105
- }
106
-
107
-
108
- /* ========================================================================== */
109
-
110
- /** Return coverage data from a V8 {@link V8CoverageResult} structure */
111
- class CoverageResultAnalyser extends CoverageAnalyserImpl {
112
- /** Number of passes at each character in the result */
113
- protected readonly _coverage: readonly (number | undefined)[]
114
- /** Internal private field for init/_lineLengths getter */
115
- protected _lineLengths?: readonly number[]
116
-
117
- constructor(
118
- log: Logger,
119
- protected readonly _result: V8CoverageResult,
120
- ) {
121
- super(log)
122
-
123
- const _coverage: (number | undefined)[] = []
124
-
125
- for (const coveredFunction of _result.functions) {
126
- for (const range of coveredFunction.ranges) {
127
- for (let i = range.startOffset; i < range.endOffset; i ++) {
128
- _coverage[i] = range.count
129
- }
130
- }
131
- }
132
-
133
- this._coverage = _coverage
134
- }
135
-
136
- async init(): Promise<this> {
137
- const filename = fileURLToPath(this._result.url)
138
- const source = await readFile(filename, 'utf-8')
139
- this._lineLengths = source.split('\n').map((line) => line.length)
140
- return this
141
- }
142
-
143
- destroy(): void {
144
- // Nothing to do
145
- }
146
-
147
- /** Return the number of coverage passes for the given location */
148
- coverage(source: string, line: number, column: number): number {
149
- assert(this._lineLengths, 'Analyser not initialized')
150
- assert(source === this._result.url, `Wrong source ${source} (should be ${this._result.url})`)
151
-
152
- const { _lineLengths, _coverage } = this
153
- let offset = 0
154
-
155
- /* Calculate the offset at the beginning of the line */
156
- for (let l = line - 2; l >= 0; l--) offset += _lineLengths[l] + 1
157
-
158
- /* Return the number of passes from the coverage data */
159
- return _coverage[offset + column] || 0
160
- }
161
- }
162
-
163
- /* ========================================================================== */
164
-
165
- /** Return coverage from a V8 {@link V8CoverageResult} with a sitemap */
166
- class CoverageSitemapAnalyser extends CoverageResultAnalyser {
167
- private _preciseMappings = new Map<string, { line: number, column: number }>()
168
- private _sourceMap?: SourceMapConsumer
169
-
170
- constructor(
171
- log: Logger,
172
- result: V8CoverageResult,
173
- private readonly _sourceMapCache: V8SourceMapCache,
174
- private readonly _sourceMapBias: SourceMapBias,
175
- ) {
176
- super(log, result)
177
- this._lineLengths = _sourceMapCache.lineLengths
178
- }
179
-
180
- private _key(source: string, line: number, column: number): string {
181
- return `${line}:${column}:${source}`
182
- }
183
-
184
- async init(): Promise<this> {
185
- const sourceMap = this._sourceMapCache.data
186
- assert(sourceMap, 'Missing source map data from cache')
187
- this._sourceMap = await new SourceMapConsumer(sourceMap)
188
-
189
- if (this._sourceMapBias === 'none') {
190
- this._sourceMap.eachMapping((m) => {
191
- const location = { line: m.generatedLine, column: m.generatedColumn }
192
- const key = this._key(m.source, m.originalLine, m.originalColumn)
193
- this._preciseMappings.set(key, location)
194
- })
195
- }
196
-
197
- return this
198
- }
199
-
200
- destroy(): void {
201
- this._sourceMap?.destroy()
202
- }
203
-
204
- coverage(source: string, line: number, column: number): number {
205
- assert(this._sourceMap, 'Analyser not initialized')
206
-
207
- if (this._sourceMapBias === 'none') {
208
- const key = this._key(source, line, column)
209
- const location = this._preciseMappings.get(key)
210
- if (! location) {
211
- this._log.debug(`No precise mapping for ${source}:${line}:${column}`)
212
- return 0
213
- } else {
214
- return super.coverage(this._result.url, location.line, location.column)
215
- }
216
- }
217
-
218
- const bias =
219
- this._sourceMapBias === 'greatest_lower_bound' ? SourceMapConsumer.GREATEST_LOWER_BOUND :
220
- this._sourceMapBias === 'least_upper_bound' ? SourceMapConsumer.LEAST_UPPER_BOUND :
221
- undefined
222
-
223
- const generated = this._sourceMap.generatedPositionFor({ source, line, column, bias })
224
-
225
- if (! generated) {
226
- this._log.debug(`No position generated for ${source}:${line}:${column}`)
227
- return 0
228
- }
229
-
230
- if (generated.line == null) {
231
- this._log.debug(`No line generated for ${source}:${line}:${column}`)
232
- return 0
233
- }
234
-
235
- if (generated.column == null) {
236
- this._log.debug(`No column generated for ${source}:${line}:${column}`)
237
- return 0
238
- }
239
-
240
- return super.coverage(this._result.url, generated.line, generated.column)
241
- }
242
- }
243
-
244
- /* ========================================================================== */
245
-
246
- /** Combine (add) all coverage data from all analysers */
247
- function combineCoverage(
248
- analysers: Set<CoverageAnalyser> | undefined,
249
- source: string,
250
- line: number,
251
- column: number,
252
- ): number {
253
- let coverage = 0
254
-
255
- if (! analysers) return coverage
256
-
257
- for (const analyser of analysers) {
258
- coverage += analyser.coverage(source, line, column)
259
- }
260
-
261
- return coverage
262
- }
263
-
264
- /* ========================================================================== */
265
-
266
- /** Associate one or more {@link CoverageAnalyser} with different sources */
267
- export class SourcesCoverageAnalyser extends CoverageAnalyserImpl {
268
- private readonly _mappings = new Map<string, Set<CoverageAnalyserImpl>>()
269
-
270
- constructor(log: Logger, private readonly _filename: AbsolutePath) {
271
- super(log)
272
- }
273
-
274
- hasMappings(): boolean {
275
- return this._mappings.size > 0
276
- }
277
-
278
- add(source: string, analyser: CoverageAnalyserImpl): void {
279
- const analysers = this._mappings.get(source) || new Set()
280
- analysers.add(analyser)
281
- this._mappings.set(source, analysers)
282
- }
283
-
284
- async init(): Promise<this> {
285
- this._log.debug('SourcesCoverageAnalyser', $p(this._filename), $gry(`(${this._mappings.size} mappings)`))
286
- for (const analysers of this._mappings.values()) {
287
- for (const analyser of analysers) {
288
- await analyser.init()
289
- }
290
- }
291
- return this
292
- }
293
-
294
- destroy(): void {
295
- for (const analysers of this._mappings.values()) {
296
- for (const analyser of analysers) {
297
- analyser.destroy()
298
- }
299
- }
300
- }
301
-
302
- coverage(source: string, line: number, column: number): number {
303
- const analysers = this._mappings.get(source)
304
- return combineCoverage(analysers, source, line, column)
305
- }
306
- }
307
-
308
- /** Combine multiple {@link CoverageAnalyser} instances together */
309
- export class CombiningCoverageAnalyser extends CoverageAnalyserImpl {
310
- private readonly _analysers = new Set<CoverageAnalyserImpl>()
311
-
312
- add(analyser: CoverageAnalyserImpl): void {
313
- this._analysers.add(analyser)
314
- }
315
-
316
- async init(): Promise<this> {
317
- this._log.debug('CombiningCoverageAnalyser', $gry(`(${this._analysers.size} analysers)`))
318
- this._log.enter()
319
- try {
320
- for (const analyser of this._analysers) await analyser.init()
321
- return this
322
- } finally {
323
- this._log.leave()
324
- }
325
- }
326
-
327
- destroy(): void {
328
- for (const analyser of this._analysers) analyser.destroy()
329
- }
330
-
331
- coverage(source: string, line: number, column: number): number {
332
- return combineCoverage(this._analysers, source, line, column)
333
- }
334
- }
335
-
336
- /* ========================================================================== */
337
-
338
- /**
339
- * Analyse coverage for the specified source files, using the data from the
340
- * specified coverage files and produce a {@link CoverageReport}.
341
- */
342
- export async function createAnalyser(
343
- sourceFiles: AbsolutePath[],
344
- coverageFiles: AbsolutePath[],
345
- sourceMapBias: SourceMapBias,
346
- log: Logger,
347
- ): Promise<CoverageAnalyser> {
348
- /* Internally V8 coverage uses URLs for everything */
349
- const urls = sourceFiles.map((path) => pathToFileURL(path).toString())
350
-
351
- /* The coverage analyser combining all coverage files in the directory */
352
- const analyser = new CombiningCoverageAnalyser(log)
353
-
354
- /* Resolve and walk the coverage directory, finding "coverage-*.json" files */
355
- for await (const coverageFile of coverageFiles) {
356
- /* The "SourceCoverageAnalyser" for this coverage file */
357
- const coverageFileAnalyser = new SourcesCoverageAnalyser(log, coverageFile)
358
-
359
- /* Parse our coverage file from JSON */
360
- log.info('Parsing coverage file', $p(coverageFile))
361
- const contents = await readFile(coverageFile, 'utf-8')
362
- const coverage: V8CoverageData = JSON.parse(contents)
363
-
364
- /* Let's look inside of the coverage file... */
365
- for (const result of coverage.result) {
366
- /*
367
- * Each coverage result (script) can be associated with a sitemap or
368
- * not... Sometimes (as in with ts-node) the sitemap simply points to
369
- * itself (same file), but embeds all the transformation information
370
- * between the file on disk, and what's been used by Node.JS.
371
- */
372
- const mapping = coverage['source-map-cache']?.[result.url]
373
- if (mapping) {
374
- /*
375
- * If we have mapping, we want to see if any of the sourcemap's source
376
- * files matches one of the sources we have to analyse.
377
- */
378
- const matches = urls.filter((url) => mapping.data?.sources.includes(url))
379
-
380
- /* If we map any file, we associate it with our source map analyser */
381
- if (matches.length) {
382
- const sourceAnalyser = new CoverageSitemapAnalyser(log, result, mapping, sourceMapBias)
383
- for (const match of matches) coverageFileAnalyser.add(match, sourceAnalyser)
384
- }
385
-
386
- /*
387
- * If we have no source map for the file, but it matches one of the
388
- * ones we have to analyse coverage for, we add that directly...
389
- */
390
- } else if (urls.includes(result.url)) {
391
- coverageFileAnalyser.add(result.url, new CoverageResultAnalyser(log, result))
392
- }
393
- }
394
-
395
- /* Add the analyser if it has some mappings */
396
- if (coverageFileAnalyser.hasMappings()) analyser.add(coverageFileAnalyser)
397
- }
398
-
399
- return await analyser.init()
400
- }