|
1 | 1 | import { importModule } from 'local-pkg' |
2 | | -import type { EnvironmentNuxt } from '../types' |
| 2 | +import type { DOMWindow, SupportedContentTypes } from 'jsdom' |
| 3 | +import defu from 'defu' |
| 4 | +import type { JSDOMOptions } from 'vitest' |
| 5 | +import type { EnvironmentNuxt, NuxtWindow } from '../types' |
3 | 6 |
|
4 | 7 | export default <EnvironmentNuxt> async function (global, { jsdom = {} }) { |
5 | | - const { CookieJar, JSDOM, ResourceLoader, VirtualConsole } |
6 | | - = (await importModule('jsdom')) as typeof import('jsdom') |
7 | | - const { |
8 | | - html = '<!DOCTYPE html>', |
9 | | - userAgent, |
10 | | - url = 'http://localhost:3000', |
11 | | - contentType = 'text/html', |
12 | | - pretendToBeVisual = true, |
13 | | - includeNodeLocations = false, |
14 | | - runScripts = 'dangerously', |
15 | | - resources, |
16 | | - console = false, |
17 | | - cookieJar = false, |
18 | | - ...restOptions |
19 | | - } = jsdom as any |
20 | | - const window = new JSDOM(html, { |
21 | | - pretendToBeVisual, |
22 | | - resources: |
23 | | - resources ?? (userAgent ? new ResourceLoader({ userAgent }) : undefined), |
24 | | - runScripts, |
25 | | - url, |
26 | | - virtualConsole: |
27 | | - console && global.console |
28 | | - ? new VirtualConsole().sendTo(global.console) |
29 | | - : undefined, |
30 | | - cookieJar: cookieJar ? new CookieJar() : undefined, |
31 | | - includeNodeLocations, |
32 | | - contentType, |
33 | | - userAgent, |
34 | | - ...restOptions, |
35 | | - }).window as any |
| 8 | + const { CookieJar, JSDOM, ResourceLoader, VirtualConsole } = (await importModule('jsdom')) as typeof import('jsdom') |
| 9 | + const jsdomOptions = defu(jsdom, { |
| 10 | + html: '<!DOCTYPE html>', |
| 11 | + url: 'http://localhost:3000', |
| 12 | + contentType: 'text/html' as const, |
| 13 | + pretendToBeVisual: true, |
| 14 | + includeNodeLocations: false, |
| 15 | + runScripts: 'dangerously', |
| 16 | + console: false, |
| 17 | + cookieJar: false, |
| 18 | + } satisfies JSDOMOptions) as JSDOMOptions & { contentType: SupportedContentTypes } |
| 19 | + |
| 20 | + const window = new JSDOM(jsdomOptions.html, { |
| 21 | + ...jsdomOptions, |
| 22 | + resources: jsdomOptions.resources ?? (jsdomOptions.userAgent ? new ResourceLoader({ userAgent: jsdomOptions.userAgent }) : undefined), |
| 23 | + virtualConsole: jsdomOptions.console && global.console ? new VirtualConsole().sendTo(global.console) : undefined, |
| 24 | + cookieJar: jsdomOptions.cookieJar ? new CookieJar() : undefined, |
| 25 | + }).window as DOMWindow & NuxtWindow |
36 | 26 |
|
37 | 27 | // Vue-router relies on scrollTo being available if run in a browser. |
38 | 28 | // The scrollTo implementation from JSDOM throws a "Not Implemented" error |
|
0 commit comments