@plugjs/plug 0.0.27 → 0.1.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.
- package/dist/{failure.cjs → asserts.cjs} +29 -9
- package/dist/asserts.cjs.map +6 -0
- package/dist/{failure.d.ts → asserts.d.ts} +4 -1
- package/dist/asserts.mjs +51 -0
- package/dist/asserts.mjs.map +6 -0
- package/dist/async.cjs +2 -2
- package/dist/async.cjs.map +1 -1
- package/dist/async.mjs +2 -2
- package/dist/async.mjs.map +1 -1
- package/dist/build.cjs +21 -30
- package/dist/build.cjs.map +1 -1
- package/dist/build.d.ts +2 -13
- package/dist/build.mjs +16 -24
- package/dist/build.mjs.map +1 -1
- package/dist/files.cjs +3 -3
- package/dist/files.cjs.map +1 -1
- package/dist/files.mjs +1 -1
- package/dist/files.mjs.map +1 -1
- package/dist/fork.cjs +35 -30
- package/dist/fork.cjs.map +1 -1
- package/dist/fork.d.ts +6 -3
- package/dist/fork.mjs +18 -13
- package/dist/fork.mjs.map +1 -1
- package/dist/{utils/asyncfs.cjs → fs.cjs} +6 -6
- package/dist/{utils/asyncfs.cjs.map → fs.cjs.map} +2 -2
- package/dist/{utils/asyncfs.d.ts → fs.d.ts} +1 -1
- package/dist/{utils/asyncfs.mjs → fs.mjs} +3 -3
- package/dist/{utils/asyncfs.mjs.map → fs.mjs.map} +2 -2
- package/dist/helpers.cjs +21 -14
- package/dist/helpers.cjs.map +1 -1
- package/dist/helpers.d.ts +24 -1
- package/dist/helpers.mjs +13 -7
- package/dist/helpers.mjs.map +1 -1
- package/dist/index.cjs +36 -6
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +25 -8
- package/dist/index.mjs +20 -5
- package/dist/index.mjs.map +1 -1
- package/dist/{log → logging}/colors.cjs +1 -1
- package/dist/{log → logging}/colors.cjs.map +1 -1
- package/dist/{log → logging}/colors.d.ts +0 -0
- package/dist/{log → logging}/colors.mjs +1 -1
- package/dist/{log → logging}/colors.mjs.map +1 -1
- package/dist/{log → logging}/emit.cjs +1 -2
- package/dist/{log → logging}/emit.cjs.map +2 -2
- package/dist/{log → logging}/emit.d.ts +0 -0
- package/dist/{log → logging}/emit.mjs +1 -2
- package/dist/{log → logging}/emit.mjs.map +2 -2
- package/dist/{log → logging}/levels.cjs +1 -1
- package/dist/{log → logging}/levels.cjs.map +1 -1
- package/dist/{log → logging}/levels.d.ts +0 -0
- package/dist/{log → logging}/levels.mjs +1 -1
- package/dist/{log → logging}/levels.mjs.map +1 -1
- package/dist/{log → logging}/logger.cjs +13 -7
- package/dist/logging/logger.cjs.map +6 -0
- package/dist/{log → logging}/logger.d.ts +0 -0
- package/dist/{log → logging}/logger.mjs +11 -5
- package/dist/logging/logger.mjs.map +6 -0
- package/dist/{log → logging}/options.cjs +12 -6
- package/dist/logging/options.cjs.map +6 -0
- package/dist/{log → logging}/options.d.ts +1 -1
- package/dist/{log → logging}/options.mjs +12 -6
- package/dist/logging/options.mjs.map +6 -0
- package/dist/{log → logging}/report.cjs +10 -9
- package/dist/{log → logging}/report.cjs.map +2 -2
- package/dist/{log → logging}/report.d.ts +0 -0
- package/dist/{log → logging}/report.mjs +7 -6
- package/dist/{log → logging}/report.mjs.map +2 -2
- package/dist/{log → logging}/spinner.cjs +1 -1
- package/dist/{log → logging}/spinner.cjs.map +1 -1
- package/dist/{log → logging}/spinner.d.ts +0 -0
- package/dist/{log → logging}/spinner.mjs +1 -1
- package/dist/{log → logging}/spinner.mjs.map +1 -1
- package/dist/{log.cjs → logging.cjs} +12 -12
- package/dist/{log.cjs.map → logging.cjs.map} +2 -2
- package/dist/{log.d.ts → logging.d.ts} +6 -6
- package/dist/{log.mjs → logging.mjs} +9 -9
- package/dist/{log.mjs.map → logging.mjs.map} +1 -1
- package/dist/paths.cjs +5 -5
- package/dist/paths.cjs.map +1 -1
- package/dist/paths.mjs +1 -1
- package/dist/pipe.cjs +10 -13
- package/dist/pipe.cjs.map +1 -1
- package/dist/pipe.d.ts +6 -12
- package/dist/pipe.mjs +6 -9
- package/dist/pipe.mjs.map +1 -1
- package/dist/plugs/copy.cjs +14 -14
- package/dist/plugs/copy.cjs.map +1 -1
- package/dist/plugs/copy.d.ts +1 -1
- package/dist/plugs/copy.mjs +3 -3
- package/dist/plugs/copy.mjs.map +1 -1
- package/dist/plugs/debug.cjs +7 -7
- package/dist/plugs/debug.cjs.map +1 -1
- package/dist/plugs/debug.d.ts +1 -1
- package/dist/plugs/debug.mjs +1 -1
- package/dist/plugs/edit.cjs +21 -0
- package/dist/plugs/edit.cjs.map +6 -0
- package/dist/plugs/edit.d.ts +7 -0
- package/dist/plugs/edit.mjs +29 -0
- package/dist/plugs/edit.mjs.map +6 -0
- package/dist/plugs/esbuild/fix-extensions.cjs +4 -4
- package/dist/plugs/esbuild/fix-extensions.cjs.map +1 -1
- package/dist/plugs/esbuild/fix-extensions.mjs +1 -1
- package/dist/plugs/esbuild/fix-extensions.mjs.map +1 -1
- package/dist/plugs/esbuild.cjs +19 -14
- package/dist/plugs/esbuild.cjs.map +1 -1
- package/dist/plugs/esbuild.d.ts +1 -1
- package/dist/plugs/esbuild.mjs +8 -3
- package/dist/plugs/esbuild.mjs.map +1 -1
- package/dist/plugs/exec.cjs +2 -82
- package/dist/plugs/exec.cjs.map +2 -2
- package/dist/plugs/exec.d.ts +6 -32
- package/dist/plugs/exec.mjs +2 -68
- package/dist/plugs/exec.mjs.map +1 -1
- package/dist/plugs/filter.d.ts +1 -1
- package/dist/plugs/rmf.cjs +5 -5
- package/dist/plugs/rmf.cjs.map +1 -1
- package/dist/plugs/rmf.d.ts +1 -1
- package/dist/plugs/rmf.mjs +2 -2
- package/dist/plugs/rmf.mjs.map +1 -1
- package/dist/plugs.cjs +1 -4
- package/dist/plugs.cjs.map +1 -1
- package/dist/plugs.d.ts +1 -4
- package/dist/plugs.mjs +1 -4
- package/dist/plugs.mjs.map +1 -1
- package/dist/types.d.ts +1 -1
- package/dist/utils/caller.cjs +8 -5
- package/dist/utils/caller.cjs.map +1 -1
- package/dist/utils/caller.mjs +6 -3
- package/dist/utils/caller.mjs.map +1 -1
- package/dist/utils/exec.cjs +102 -0
- package/dist/utils/exec.cjs.map +6 -0
- package/dist/utils/exec.d.ts +15 -0
- package/dist/utils/exec.mjs +71 -0
- package/dist/utils/exec.mjs.map +6 -0
- package/dist/utils/walk.cjs +7 -7
- package/dist/utils/walk.cjs.map +1 -1
- package/dist/utils/walk.mjs +2 -2
- package/dist/utils/walk.mjs.map +1 -1
- package/dist/{plugs/tsc.cjs → utils.cjs} +9 -7
- package/dist/utils.cjs.map +6 -0
- package/dist/utils.d.ts +4 -0
- package/dist/utils.mjs +6 -0
- package/dist/utils.mjs.map +6 -0
- package/extra/cli.mjs +26 -5
- package/extra/ts-loader.mjs +2 -2
- package/package.json +90 -15
- package/src/{assert.ts → asserts.ts} +36 -1
- package/src/async.ts +3 -1
- package/src/files.ts +1 -1
- package/src/fork.ts +19 -11
- package/src/{utils/asyncfs.ts → fs.ts} +1 -1
- package/src/helpers.ts +40 -8
- package/src/index.ts +30 -8
- package/src/{log → logging}/colors.ts +0 -0
- package/src/{log → logging}/emit.ts +0 -1
- package/src/{log → logging}/levels.ts +0 -0
- package/src/{log → logging}/logger.ts +13 -4
- package/src/{log → logging}/options.ts +11 -7
- package/src/{log → logging}/report.ts +10 -9
- package/src/{log → logging}/spinner.ts +0 -0
- package/src/{log.ts → logging.ts} +7 -7
- package/src/paths.ts +1 -1
- package/src/pipe.ts +13 -20
- package/src/plugs/copy.ts +4 -4
- package/src/plugs/debug.ts +2 -2
- package/src/plugs/edit.ts +34 -0
- package/src/plugs/esbuild/fix-extensions.ts +2 -2
- package/src/plugs/esbuild.ts +13 -7
- package/src/plugs/exec.ts +8 -129
- package/src/plugs/filter.ts +1 -1
- package/src/plugs/rmf.ts +3 -3
- package/src/plugs.ts +1 -13
- package/src/types.ts +1 -1
- package/src/utils/caller.ts +6 -3
- package/src/utils/exec.ts +112 -0
- package/src/utils/walk.ts +3 -3
- package/src/utils.ts +4 -0
- package/types/{webassembly.d.ts → plugjs.d.ts} +7 -1
- package/dist/assert.cjs +0 -52
- package/dist/assert.cjs.map +0 -6
- package/dist/assert.d.ts +0 -4
- package/dist/assert.mjs +0 -26
- package/dist/assert.mjs.map +0 -6
- package/dist/failure.cjs.map +0 -6
- package/dist/failure.mjs +0 -33
- package/dist/failure.mjs.map +0 -6
- package/dist/log/logger.cjs.map +0 -6
- package/dist/log/logger.mjs.map +0 -6
- package/dist/log/options.cjs.map +0 -6
- package/dist/log/options.mjs.map +0 -6
- package/dist/plugs/coverage/analysis.cjs +0 -234
- package/dist/plugs/coverage/analysis.cjs.map +0 -6
- package/dist/plugs/coverage/analysis.d.ts +0 -104
- package/dist/plugs/coverage/analysis.mjs +0 -207
- package/dist/plugs/coverage/analysis.mjs.map +0 -6
- package/dist/plugs/coverage/report.cjs +0 -235
- package/dist/plugs/coverage/report.cjs.map +0 -6
- package/dist/plugs/coverage/report.d.ts +0 -59
- package/dist/plugs/coverage/report.mjs +0 -220
- package/dist/plugs/coverage/report.mjs.map +0 -6
- package/dist/plugs/coverage.cjs +0 -140
- package/dist/plugs/coverage.cjs.map +0 -6
- package/dist/plugs/coverage.d.ts +0 -49
- package/dist/plugs/coverage.mjs +0 -123
- package/dist/plugs/coverage.mjs.map +0 -6
- package/dist/plugs/eslint/runner.cjs +0 -91
- package/dist/plugs/eslint/runner.cjs.map +0 -6
- package/dist/plugs/eslint/runner.d.ts +0 -8
- package/dist/plugs/eslint/runner.mjs +0 -68
- package/dist/plugs/eslint/runner.mjs.map +0 -6
- package/dist/plugs/eslint.cjs +0 -22
- package/dist/plugs/eslint.cjs.map +0 -6
- package/dist/plugs/eslint.d.ts +0 -34
- package/dist/plugs/eslint.mjs +0 -5
- package/dist/plugs/eslint.mjs.map +0 -6
- package/dist/plugs/mocha/reporter.cjs +0 -159
- package/dist/plugs/mocha/reporter.cjs.map +0 -6
- package/dist/plugs/mocha/reporter.d.ts +0 -6
- package/dist/plugs/mocha/reporter.mjs +0 -127
- package/dist/plugs/mocha/reporter.mjs.map +0 -6
- package/dist/plugs/mocha/runner.cjs +0 -82
- package/dist/plugs/mocha/runner.cjs.map +0 -6
- package/dist/plugs/mocha/runner.d.ts +0 -8
- package/dist/plugs/mocha/runner.mjs +0 -53
- package/dist/plugs/mocha/runner.mjs.map +0 -6
- package/dist/plugs/mocha.cjs +0 -22
- package/dist/plugs/mocha.cjs.map +0 -6
- package/dist/plugs/mocha.d.ts +0 -37
- package/dist/plugs/mocha.mjs +0 -5
- package/dist/plugs/mocha.mjs.map +0 -6
- package/dist/plugs/tsc/compiler.cjs +0 -74
- package/dist/plugs/tsc/compiler.cjs.map +0 -6
- package/dist/plugs/tsc/compiler.d.ts +0 -24
- package/dist/plugs/tsc/compiler.mjs +0 -43
- package/dist/plugs/tsc/compiler.mjs.map +0 -6
- package/dist/plugs/tsc/options.cjs +0 -82
- package/dist/plugs/tsc/options.cjs.map +0 -6
- package/dist/plugs/tsc/options.d.ts +0 -8
- package/dist/plugs/tsc/options.mjs +0 -51
- package/dist/plugs/tsc/options.mjs.map +0 -6
- package/dist/plugs/tsc/report.cjs +0 -90
- package/dist/plugs/tsc/report.cjs.map +0 -6
- package/dist/plugs/tsc/report.d.ts +0 -5
- package/dist/plugs/tsc/report.mjs +0 -59
- package/dist/plugs/tsc/report.mjs.map +0 -6
- package/dist/plugs/tsc/runner.cjs +0 -124
- package/dist/plugs/tsc/runner.cjs.map +0 -6
- package/dist/plugs/tsc/runner.d.ts +0 -8
- package/dist/plugs/tsc/runner.mjs +0 -95
- package/dist/plugs/tsc/runner.mjs.map +0 -6
- package/dist/plugs/tsc.cjs.map +0 -6
- package/dist/plugs/tsc.d.ts +0 -48
- package/dist/plugs/tsc.mjs +0 -5
- package/dist/plugs/tsc.mjs.map +0 -6
- package/src/failure.ts +0 -43
- package/src/plugs/coverage/analysis.ts +0 -400
- package/src/plugs/coverage/report.ts +0 -368
- package/src/plugs/coverage.ts +0 -216
- package/src/plugs/eslint/runner.ts +0 -100
- package/src/plugs/eslint.ts +0 -42
- package/src/plugs/mocha/reporter.ts +0 -178
- package/src/plugs/mocha/runner.ts +0 -66
- package/src/plugs/mocha.ts +0 -43
- package/src/plugs/tsc/compiler.ts +0 -68
- package/src/plugs/tsc/options.ts +0 -100
- package/src/plugs/tsc/report.ts +0 -77
- package/src/plugs/tsc/runner.ts +0 -133
- package/src/plugs/tsc.ts +0 -58
- 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
|
-
}
|