import type { RequestListener } from 'http' ; import defu from 'defu' ; import { NuxtConfig , NuxtOptions } from '@nuxt/types' ; import type { Listener } from 'listhen' ; import type { Browser , LaunchOptions } from 'playwright' ; export interface NuxtTestOptions { rootDir : string ; configFile : string ; config : NuxtConfig ; randomBuildDir : boolean ; randomPort : boolean ; build : boolean ; generate : boolean ; setupTimeout : number ; waitFor : number ; browser : boolean ; browserOptions : { type : 'chromium' | 'firefox' | 'webkit' ; launch ? : LaunchOptions ; } ; server : boolean ; } export interface Nuxt { server : { app : RequestListener ; } ; options : NuxtOptions ; ready : ( ) => any ; close : ( callback ? : Function ) => any ; resolver : any ; moduleContainer : any ; resolveAlias ( path ) : string ; resolvePath ( path , opts ? ) : string ; renderRoute ( ... args ) : any ; renderAndGetWindow ( url , opts ? , config ? ) : any ; } export interface NuxtTestContext { options : Partial < NuxtTestOptions > ; nuxt ? : Nuxt ; builder ? : { build : ( ) => any ; } ; listener ? : Listener ; browser ? : Browser ; } let currentContext ; export function createContext ( options = { } ) { const _options = defu ( options , { rootDir : '.' , configFile : 'nuxt.config' , randomBuildDir : true , randomPort : true , setupTimeout : 60000 , server : options . browser , build : options . browser || options . server , browserOptions : { type : 'chromium' } } ) ; return setContext ( { options : _options as NuxtTestOptions } ) ; } export function getContext ( ) { if ( ! currentContext ) { throw new Error ( 'No context is available. (Forgot calling setup or createContext?)' ) ; } return currentContext ; } export function setContext ( context ) { currentContext = context ; return currentContext ; }