@@ -4,49 +4,79 @@ import { mkdir } from "node:fs/promises";
4
4
import { readConfig } from "./config" ;
5
5
import { blockStdin } from "./stdin" ;
6
6
import { connectBrowserFromWorker } from "./browsers" ;
7
- import type { JestPuppeteerGlobal } from "./globals" ;
7
+ import type { JestPuppeteerConfig } from "./config" ;
8
+ import type { Page , BrowserContext , Browser } from "puppeteer" ;
9
+
10
+ type JestPuppeteer = {
11
+ debug : ( ) => Promise < void > ;
12
+ resetPage : ( ) => Promise < void > ;
13
+ resetBrowser : ( ) => Promise < void > ;
14
+ } ;
15
+
16
+ type StrictGlobal = {
17
+ browser ?: Browser | undefined ;
18
+ page ?: Page | undefined ;
19
+ context ?: BrowserContext | undefined ;
20
+ puppeteerConfig : JestPuppeteerConfig ;
21
+ jestPuppeteer : JestPuppeteer ;
22
+ } ;
23
+
24
+ export type JestPuppeteerGlobal = Required < StrictGlobal > ;
25
+
26
+ declare global {
27
+ // @ts -ignore
28
+ var browser : Global [ "browser" ] ;
29
+ // @ts -ignore
30
+ var page : Global [ "page" ] ;
31
+ // @ts -ignore
32
+ var context : Global [ "context" ] ;
33
+ // @ts -ignore
34
+ var puppeteerConfig : Global [ "puppeteerConfig" ] ;
35
+ // @ts -ignore
36
+ var jestPuppeteer : Global [ "jestPuppeteer" ] ;
37
+ }
8
38
9
39
const testTimeoutSymbol = Symbol . for ( "TEST_TIMEOUT_SYMBOL" ) ;
10
40
11
41
const handlePageError = ( error : Error ) => {
12
42
process . emit ( "uncaughtException" , error ) ;
13
43
} ;
14
44
15
- const getBrowser = ( global : JestPuppeteerGlobal ) => {
45
+ const getBrowser = ( global : StrictGlobal ) => {
16
46
if ( ! global . browser ) {
17
47
throw new Error ( "Cannot access browser before launching browser." ) ;
18
48
}
19
49
return global . browser ;
20
50
} ;
21
51
22
- const getContext = ( global : JestPuppeteerGlobal ) => {
52
+ const getContext = ( global : StrictGlobal ) => {
23
53
if ( ! global . context ) {
24
54
throw new Error ( "Cannot access context before launching context." ) ;
25
55
}
26
56
return global . context ;
27
57
} ;
28
58
29
- const connectBrowser = async ( global : JestPuppeteerGlobal ) => {
59
+ const connectBrowser = async ( global : StrictGlobal ) => {
30
60
if ( global . browser ) {
31
61
throw new Error ( "Cannot connect browser before closing previous browser." ) ;
32
62
}
33
63
global . browser = await connectBrowserFromWorker ( global . puppeteerConfig ) ;
34
64
} ;
35
65
36
- const disconnectBrowser = async ( global : JestPuppeteerGlobal ) => {
66
+ const disconnectBrowser = async ( global : StrictGlobal ) => {
37
67
if ( ! global . browser ) return ;
38
68
await global . browser . disconnect ( ) ;
39
69
global . browser = undefined ;
40
70
} ;
41
71
42
- const getPage = ( global : JestPuppeteerGlobal ) => {
72
+ const getPage = ( global : StrictGlobal ) => {
43
73
if ( ! global . page ) {
44
74
throw new Error ( "Cannot access page before launching browser." ) ;
45
75
}
46
76
return global . page ;
47
77
} ;
48
78
49
- const openPage = async ( global : JestPuppeteerGlobal ) => {
79
+ const openPage = async ( global : StrictGlobal ) => {
50
80
if ( global . page ) {
51
81
throw new Error ( "Cannot open page before closing previous page." ) ;
52
82
}
@@ -57,7 +87,7 @@ const openPage = async (global: JestPuppeteerGlobal) => {
57
87
global . page = page ;
58
88
} ;
59
89
60
- const closePage = async ( global : JestPuppeteerGlobal ) => {
90
+ const closePage = async ( global : StrictGlobal ) => {
61
91
if ( ! global . page ) return ;
62
92
if ( global . puppeteerConfig . exitOnPageError ) {
63
93
global . page . off ( "pageerror" , handlePageError ) ;
@@ -68,7 +98,7 @@ const closePage = async (global: JestPuppeteerGlobal) => {
68
98
global . page = undefined ;
69
99
} ;
70
100
71
- const createContext = async ( global : JestPuppeteerGlobal ) => {
101
+ const createContext = async ( global : StrictGlobal ) => {
72
102
if ( global . context ) {
73
103
throw new Error ( "Cannot create context before closing previous context." ) ;
74
104
}
@@ -89,21 +119,21 @@ const createContext = async (global: JestPuppeteerGlobal) => {
89
119
}
90
120
} ;
91
121
92
- const closeContext = async ( global : JestPuppeteerGlobal ) => {
122
+ const closeContext = async ( global : StrictGlobal ) => {
93
123
if ( ! global . context ) return ;
94
124
if ( global . context . isIncognito ( ) ) {
95
125
await global . context . close ( ) ;
96
126
}
97
127
global . context = undefined ;
98
128
} ;
99
129
100
- const initAll = async ( global : JestPuppeteerGlobal ) => {
130
+ const initAll = async ( global : StrictGlobal ) => {
101
131
await connectBrowser ( global ) ;
102
132
await createContext ( global ) ;
103
133
await openPage ( global ) ;
104
134
} ;
105
135
106
- const closeAll = async ( global : JestPuppeteerGlobal ) => {
136
+ const closeAll = async ( global : StrictGlobal ) => {
107
137
await closePage ( global ) ;
108
138
await closeContext ( global ) ;
109
139
await disconnectBrowser ( global ) ;
@@ -118,7 +148,7 @@ export class PuppeteerEnvironment extends NodeEnvironment {
118
148
119
149
async setup ( ) : Promise < void > {
120
150
const config = await readConfig ( ) ;
121
- const global = this . global as unknown as JestPuppeteerGlobal ;
151
+ const global = this . global as unknown as StrictGlobal ;
122
152
global . puppeteerConfig = config ;
123
153
124
154
global . jestPuppeteer = {
@@ -148,7 +178,7 @@ export class PuppeteerEnvironment extends NodeEnvironment {
148
178
}
149
179
150
180
async teardown ( ) {
151
- const global = this . global as unknown as JestPuppeteerGlobal ;
181
+ const global = this . global as unknown as StrictGlobal ;
152
182
await closeAll ( global ) ;
153
183
}
154
184
}
0 commit comments