Skip to content

Commit

Permalink
Merge branch 'main' into fix/coverage-workspaces
Browse files Browse the repository at this point in the history
  • Loading branch information
sheremet-va committed Apr 25, 2023
2 parents 8aacdaf + 21942db commit e015b52
Show file tree
Hide file tree
Showing 17 changed files with 1,775 additions and 1,161 deletions.
19 changes: 16 additions & 3 deletions .github/actions/setup-and-cache/action.yml
Expand Up @@ -26,15 +26,28 @@ runs:
node -e "
const fs = require('fs');
const lockfile = fs.readFileSync('./pnpm-lock.yaml', 'utf8');
const cypressVersion = lockfile.match(/cypress: (\d+\.\d+\.\d+)/)[1];
const playwrightVersion = lockfile.match(/playwright: (\d+\.\d+\.\d+)/)[1];
const puppeteerVersion = lockfile.match(/puppeteer: (\d+\.\d+\.\d+)/)[1];
const pattern = (name) => new RegExp(name + ':\\\s+specifier: [\\\s\\\w\\\.^]+version: (\\\d+\\\.\\\d+\\\.\\\d+)');
const cypressVersion = lockfile.match(pattern('cypress'))[1];
const playwrightVersion = lockfile.match(pattern('playwright'))[1];
const puppeteerVersion = lockfile.match(pattern('puppeteer'))[1];
console.log('CYPRESS_VERSION=' + cypressVersion);
console.log('PLAYWRIGHT_VERSION=' + playwrightVersion);
console.log('PUPPETEER_VERSION=' + puppeteerVersion);
"
)" >> $GITHUB_OUTPUT
- name: Print versions
shell: bash
run: echo "${{ toJson(steps.resolve-package-versions.outputs) }}"

- name: Check resolved package versions
shell: bash
if: |
contains(fromJSON('[null, "", "undefined"]'), steps.resolve-package-versions.outputs.CYPRESS_VERSION) ||
contains(fromJSON('[null, "", "undefined"]'), steps.resolve-package-versions.outputs.PLAYWRIGHT_VERSION) ||
contains(fromJSON('[null, "", "undefined"]'), steps.resolve-package-versions.outputs.PUPPETEER_VERSION)
run: echo "Failed to resolve package versions. See log above." && exit 1

- name: Cache Cypress v${{ steps.resolve-package-versions.outputs.CYPRESS_VERSION }}
uses: actions/cache@v3
id: cypress-cache
Expand Down
2 changes: 1 addition & 1 deletion packages/browser/package.json
Expand Up @@ -42,7 +42,7 @@
"vitest": ">=0.29.4"
},
"dependencies": {
"modern-node-polyfills": "0.1.0",
"modern-node-polyfills": "^0.1.1",
"sirv": "^2.0.2"
},
"devDependencies": {
Expand Down
2 changes: 2 additions & 0 deletions packages/coverage-c8/package.json
Expand Up @@ -45,7 +45,9 @@
"vitest": ">=0.30.0 <1"
},
"dependencies": {
"@ampproject/remapping": "^2.2.0",
"c8": "^7.13.0",
"magic-string": "^0.30.0",
"picocolors": "^1.0.0",
"std-env": "^3.3.2"
},
Expand Down
31 changes: 30 additions & 1 deletion packages/coverage-c8/src/provider.ts
@@ -1,6 +1,8 @@
import { existsSync, promises as fs } from 'node:fs'
import _url from 'node:url'
import type { Profiler } from 'node:inspector'
import MagicString from 'magic-string'
import remapping from '@ampproject/remapping'
import { extname, resolve } from 'pathe'
import c from 'picocolors'
import { provider } from 'std-env'
Expand All @@ -18,6 +20,9 @@ import { checkCoverages } from 'c8/lib/commands/check-coverage.js'

type Options = ResolvedCoverageOptions<'c8'>

// Note that this needs to match the line ending as well
const VITE_EXPORTS_LINE_PATTERN = /Object\.defineProperty\(__vite_ssr_exports__.*\n/g

export class C8CoverageProvider extends BaseCoverageProvider implements CoverageProvider {
name = 'c8'

Expand Down Expand Up @@ -173,7 +178,7 @@ export class C8CoverageProvider extends BaseCoverageProvider implements Coverage

return {
sourceMap: {
sourcemap: data.map,
sourcemap: removeViteHelpersFromSourceMaps(data.source, data.map),
},
source: Array(offset).fill('.').join('') + data.source,
}
Expand All @@ -197,3 +202,27 @@ export class C8CoverageProvider extends BaseCoverageProvider implements Coverage
}
}
}

/**
* Remove generated code from the source maps:
* - Vite's export helpers: e.g. `Object.defineProperty(__vite_ssr_exports__, "sum", { enumerable: true, configurable: true, get(){ return sum }});`
*/
function removeViteHelpersFromSourceMaps(source: string | undefined, map: EncodedSourceMap) {
if (!source || !source.match(VITE_EXPORTS_LINE_PATTERN))
return map

const sourceWithoutHelpers = new MagicString(source)
sourceWithoutHelpers.replaceAll(VITE_EXPORTS_LINE_PATTERN, '\n')

const mapWithoutHelpers = sourceWithoutHelpers.generateMap({
hires: true,
})

// A merged source map where the first one excludes helpers
const combinedMap = remapping(
[{ ...mapWithoutHelpers, version: 3 }, map],
() => null,
)

return combinedMap
}
4 changes: 4 additions & 0 deletions packages/coverage-c8/src/takeCoverage.ts
Expand Up @@ -4,6 +4,7 @@

import inspector from 'node:inspector'
import type { Profiler } from 'node:inspector'
import { provider } from 'std-env'

const session = new inspector.Session()

Expand All @@ -27,6 +28,9 @@ export async function takeCoverage() {

resolve({ result })
})

if (provider === 'stackblitz')
resolve({ result: [] })
})
}

Expand Down
2 changes: 1 addition & 1 deletion packages/vitest/package.json
Expand Up @@ -152,7 +152,6 @@
"magic-string": "^0.30.0",
"pathe": "^1.1.0",
"picocolors": "^1.0.0",
"source-map": "^0.6.1",
"std-env": "^3.3.2",
"strip-literal": "^1.0.1",
"tinybench": "^2.4.0",
Expand All @@ -165,6 +164,7 @@
"@ampproject/remapping": "^2.2.0",
"@antfu/install-pkg": "^0.1.1",
"@edge-runtime/vm": "2.1.2",
"@jridgewell/trace-mapping": "^0.3.17",
"@sinonjs/fake-timers": "^10.0.2",
"@types/diff": "^5.0.3",
"@types/istanbul-lib-coverage": "^2.0.4",
Expand Down
4 changes: 4 additions & 0 deletions packages/vitest/src/integrations/coverage.ts
Expand Up @@ -17,6 +17,10 @@ async function resolveCoverageProviderModule(options: CoverageOptions | undefine

if (provider === 'c8' || provider === 'istanbul') {
const { default: coverageModule } = await loader.executeId(CoverageProviderMap[provider])

if (!coverageModule)
throw new Error(`Failed to load ${CoverageProviderMap[provider]}. Default export is missing.`)

return coverageModule
}

Expand Down
17 changes: 10 additions & 7 deletions packages/vitest/src/typecheck/typechecker.ts
Expand Up @@ -2,7 +2,8 @@ import { rm } from 'node:fs/promises'
import type { ExecaChildProcess } from 'execa'
import { execa } from 'execa'
import { basename, extname, resolve } from 'pathe'
import { SourceMapConsumer } from 'source-map'
import { TraceMap, generatedPositionFor } from '@jridgewell/trace-mapping'
import type { RawSourceMap } from '@ampproject/remapping'
import { getTasks } from '../utils'
import { ensurePackageInstalled } from '../node/pkg'
import type { Awaitable, File, ParsedStack, Task, TaskResultPack, TaskState, TscErrorInfo } from '../types'
Expand Down Expand Up @@ -119,7 +120,7 @@ export class Typechecker {
}
const sortedDefinitions = [...definitions.sort((a, b) => b.start - a.start)]
// has no map for ".js" files that use // @ts-check
const mapConsumer = map && new SourceMapConsumer(map)
const traceMap = map && new TraceMap(map as unknown as RawSourceMap)
const indexMap = createIndexMap(parsed)
const markState = (task: Task, state: TaskState) => {
task.result = {
Expand All @@ -129,11 +130,13 @@ export class Typechecker {
markState(task.suite, state)
}
errors.forEach(({ error, originalError }) => {
const processedPos = mapConsumer?.generatedPositionFor({
line: originalError.line,
column: originalError.column,
source: basename(path),
}) || originalError
const processedPos = traceMap
? generatedPositionFor(traceMap, {
line: originalError.line,
column: originalError.column,
source: basename(path),
})
: originalError
const line = processedPos.line ?? originalError.line
const column = processedPos.column ?? originalError.column
const index = indexMap.get(`${line}:${column}`)
Expand Down
3 changes: 1 addition & 2 deletions packages/vitest/src/types/rpc.ts
@@ -1,5 +1,4 @@
import type { RawSourceMap } from 'source-map'
import type { FetchResult, ViteNodeResolveId } from 'vite-node'
import type { FetchResult, RawSourceMap, ViteNodeResolveId } from 'vite-node'
import type { EnvironmentOptions, ResolvedConfig, VitestEnvironment } from './config'
import type { UserConsoleLog } from './general'
import type { SnapshotResult } from './snapshot'
Expand Down

0 comments on commit e015b52

Please sign in to comment.