-
-
Notifications
You must be signed in to change notification settings - Fork 84
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
e8311bb
commit a8dd1ef
Showing
6 changed files
with
142 additions
and
36 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,73 @@ | ||
import { Worker } from 'node:worker_threads' | ||
import type * as vscode from 'vscode' | ||
import { dirname, resolve } from 'pathe' | ||
import { type BirpcReturn, createBirpc } from 'birpc' | ||
import type { ResolvedConfig } from 'vitest' | ||
import { log } from './log' | ||
import { workerPath } from './constants' | ||
|
||
export interface BirpcMethods { | ||
getFiles: () => Promise<string[]> | ||
getConfig: () => Promise<ResolvedConfig> | ||
terminate: () => void | ||
} | ||
|
||
export interface BirpcEvents { | ||
onReady: () => void | ||
onError: (err: object) => void | ||
} | ||
|
||
type VitestAPI = BirpcReturn<BirpcMethods, BirpcEvents> | ||
|
||
export async function createVitestAPI(workspace: vscode.WorkspaceFolder) { | ||
try { | ||
const root = workspace.uri.fsPath | ||
const vitestPath = require.resolve('vitest', { paths: [root] }) // resolves to cjs | ||
const vitestNodePath = resolve(dirname(vitestPath), './dist/node.js') | ||
log.info('[API]', 'Running Vitest from', vitestNodePath) | ||
const worker = new Worker(workerPath, { | ||
workerData: { | ||
root, | ||
vitestPath: vitestNodePath, | ||
}, | ||
}) | ||
worker.stdout.on('data', (d) => { | ||
log.info('[Worker]', d.toString()) | ||
}) | ||
worker.stderr.on('data', (d) => { | ||
log.error('[Worker]', d.toString()) | ||
}) | ||
|
||
return await new Promise<VitestAPI>((resolve, reject) => { | ||
const api = createBirpc<BirpcMethods, BirpcEvents>( | ||
{ | ||
onReady() { | ||
log.info('[API]', `Vitest for "${workspace.name}" workspace folder is resolved.`) | ||
resolve(new Proxy(api, { | ||
get(target, prop, receiver) { | ||
if (prop === 'then') | ||
return undefined | ||
return Reflect.get(target, prop, receiver) | ||
}, | ||
})) | ||
}, | ||
onError(err) { | ||
reject(err) | ||
}, | ||
}, | ||
{ | ||
on(listener) { | ||
worker.on('message', listener) | ||
}, | ||
post(message) { | ||
worker.postMessage(message) | ||
}, | ||
}, | ||
) | ||
}) | ||
} | ||
catch (err: any) { | ||
log.error('[API]', err?.stack) | ||
return null | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,40 @@ | ||
import { parentPort } from 'node:worker_threads' | ||
import { createBirpc } from 'birpc' | ||
import type { Vitest } from 'vitest' | ||
import type { BirpcEvents, BirpcMethods } from '../api' | ||
|
||
export function createWorkerRPC(vitest: Vitest) { | ||
return createBirpc<BirpcEvents, BirpcMethods>({ | ||
async getFiles() { | ||
const files = await vitest.globTestFiles() | ||
return files.map(([_, spec]) => spec) | ||
}, | ||
async getConfig() { | ||
const config = vitest.getCoreWorkspaceProject().getSerializableConfig() | ||
return config | ||
}, | ||
async terminate() { | ||
await vitest.close() | ||
}, | ||
}, { | ||
eventNames: ['onReady', 'onError'], | ||
on(listener) { | ||
parentPort!.on('message', listener) | ||
}, | ||
post(message) { | ||
parentPort!.postMessage(message) | ||
}, | ||
}) | ||
} | ||
|
||
export function createErrorRPC() { | ||
return createBirpc<BirpcEvents>({}, { | ||
eventNames: ['onError'], | ||
on(listener) { | ||
parentPort!.on('message', listener) | ||
}, | ||
post(message) { | ||
parentPort!.postMessage(message) | ||
}, | ||
}) | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,21 +1,22 @@ | ||
import { parentPort, workerData } from 'node:worker_threads' | ||
import { workerData } from 'node:worker_threads' | ||
import { createErrorRPC, createWorkerRPC } from './rpc' | ||
|
||
(async () => { | ||
parentPort!.postMessage({ msg: 'hello from worker', p: workerData.vitestPath }) | ||
try { | ||
const vitestMode = await import(workerData.vitestPath) as typeof import('vitest/node') | ||
const vitest = await vitestMode.createVitest('test', { | ||
watch: false, | ||
watch: true, | ||
root: workerData.root, | ||
}) | ||
parentPort!.postMessage({ msg: 'vitest created' }) | ||
const files = await vitest.globTestFiles() | ||
parentPort!.postMessage({ | ||
files: files.map(([_, spec]) => spec), | ||
}) | ||
await vitest.close() | ||
const rpc = createWorkerRPC(vitest) | ||
await rpc.onReady() | ||
} | ||
catch (err: any) { | ||
parentPort!.postMessage({ error: err.message, stack: String(err.stack) }) | ||
const closeRpc = createErrorRPC() | ||
closeRpc.onError({ | ||
message: err.message, | ||
stack: String(err.stack), | ||
name: err.name, | ||
}) | ||
} | ||
})() |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters