| 19 | // vitest doesn't use this plugin directly |
| 20 | |
| 21 | export function mockerPlugin(options: MockerPluginOptions = {}): Plugin[] { |
| 22 | let server: ViteDevServer |
| 23 | const registerPath = resolve(fileURLToPath(new URL('./register.js', import.meta.url))) |
| 24 | return [ |
| 25 | { |
| 26 | name: 'vitest:mocker:ws-rpc', |
| 27 | config(_, { command }) { |
| 28 | if (command !== 'serve') { |
| 29 | return |
| 30 | } |
| 31 | return { |
| 32 | server: { |
| 33 | // don't pre-transform request because they might be mocked at runtime |
| 34 | preTransformRequests: false, |
| 35 | }, |
| 36 | optimizeDeps: { |
| 37 | exclude: ['@vitest/mocker/register', '@vitest/mocker/browser'], |
| 38 | }, |
| 39 | } |
| 40 | }, |
| 41 | configureServer(server_) { |
| 42 | server = server_ |
| 43 | const mockResolver = new ServerMockResolver(server) |
| 44 | server.ws.on('vitest:mocks:resolveId', async ({ id, importer }: { id: string; importer: string }) => { |
| 45 | const resolved = await mockResolver.resolveId(id, importer) |
| 46 | server.ws.send('vitest:mocks:resolvedId:result', resolved) |
| 47 | }) |
| 48 | server.ws.on('vitest:mocks:resolveMock', async ({ id, importer, options }: { id: string; importer: string; options: any }) => { |
| 49 | const resolved = await mockResolver.resolveMock(id, importer, options) |
| 50 | server.ws.send('vitest:mocks:resolveMock:result', resolved) |
| 51 | }) |
| 52 | server.ws.on('vitest:mocks:invalidate', async ({ ids }: { ids: string[] }) => { |
| 53 | mockResolver.invalidate(ids) |
| 54 | server.ws.send('vitest:mocks:invalidate:result') |
| 55 | }) |
| 56 | }, |
| 57 | async load(id) { |
| 58 | if (id !== registerPath) { |
| 59 | return |
| 60 | } |
| 61 | |
| 62 | if (!server) { |
| 63 | // mocker doesn't work during build |
| 64 | return 'export {}' |
| 65 | } |
| 66 | |
| 67 | const content = await readFile(registerPath, 'utf-8') |
| 68 | const result = content |
| 69 | .replace( |
| 70 | /__VITEST_GLOBAL_THIS_ACCESSOR__/g, |
| 71 | options.globalThisAccessor ?? '"__vitest_mocker__"', |
| 72 | ) |
| 73 | .replace( |
| 74 | '__VITEST_MOCKER_ROOT__', |
| 75 | JSON.stringify(server.config.root), |
| 76 | ) |
| 77 | return result |
| 78 | }, |