@happy-dom/jest-environment 11.0.3 → 11.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/index.d.ts CHANGED
@@ -15,6 +15,7 @@ export default class HappyDOMEnvironment implements JestEnvironment {
15
15
  window: IWindow;
16
16
  global: Global.Global;
17
17
  moduleMocker: ModuleMocker;
18
+ private errorEventListener;
18
19
  /**
19
20
  * Constructor.
20
21
  *
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,MAAM,IAAI,CAAC;AAEpB,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACvE,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACxE,OAAO,EAAU,OAAO,EAAE,MAAM,WAAW,CAAC;AAC5C,OAAO,EAAE,MAAM,EAAE,MAAM,IAAI,CAAC;AAC5B,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAE7C;;GAEG;AACH,MAAM,CAAC,OAAO,OAAO,mBAAoB,YAAW,eAAe;IAC3D,UAAU,EAAE,gBAAgB,CAAC,MAAM,CAAC,CAAQ;IAC5C,gBAAgB,EAAE,gBAAgB,CAAQ;IAC1C,MAAM,EAAE,OAAO,CAA+C;IAC9D,MAAM,EAAE,MAAM,CAAC,MAAM,CAAyC;IAC9D,YAAY,EAAE,YAAY,CAA+D;IAEhG;;;;;;;OAOG;gBAEF,MAAM,EACH;QAAE,YAAY,EAAE,MAAM,CAAC,YAAY,CAAC;QAAC,aAAa,EAAE,MAAM,CAAC,aAAa,CAAA;KAAE,GAC1E,MAAM,CAAC,aAAa,EACvB,OAAO,CAAC,EAAE,kBAAkB;IAyD7B;;;;OAIG;IACU,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAEnC;;;;OAIG;IACU,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAYtC;;;;;OAKG;IACI,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAItC;;;;OAIG;IACI,YAAY,IAAI,EAAE,CAAC,OAAO;CAGjC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,MAAM,IAAI,CAAC;AAEpB,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACvE,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACxE,OAAO,EAAU,OAAO,EAAc,MAAM,WAAW,CAAC;AACxD,OAAO,EAAE,MAAM,EAAE,MAAM,IAAI,CAAC;AAC5B,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAE7C;;GAEG;AACH,MAAM,CAAC,OAAO,OAAO,mBAAoB,YAAW,eAAe;IAC3D,UAAU,EAAE,gBAAgB,CAAC,MAAM,CAAC,CAAQ;IAC5C,gBAAgB,EAAE,gBAAgB,CAAQ;IAC1C,MAAM,EAAE,OAAO,CAA+C;IAC9D,MAAM,EAAE,MAAM,CAAC,MAAM,CAAyC;IAC9D,YAAY,EAAE,YAAY,CAA+D;IAChG,OAAO,CAAC,kBAAkB,CAA4C;IAEtE;;;;;;;OAOG;gBAEF,MAAM,EACH;QAAE,YAAY,EAAE,MAAM,CAAC,YAAY,CAAC;QAAC,aAAa,EAAE,MAAM,CAAC,aAAa,CAAA;KAAE,GAC1E,MAAM,CAAC,aAAa,EACvB,OAAO,CAAC,EAAE,kBAAkB;IA6E7B;;;;OAIG;IACU,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAEnC;;;;OAIG;IACU,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAiBtC;;;;;OAKG;IACI,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAItC;;;;OAIG;IACI,YAAY,IAAI,EAAE,CAAC,OAAO;CAGjC"}
package/lib/index.js CHANGED
@@ -46,6 +46,7 @@ class HappyDOMEnvironment {
46
46
  this.window = new happy_dom_1.Window({ console: globalThis.console });
47
47
  this.global = this.window;
48
48
  this.moduleMocker = new jest_mock_1.ModuleMocker(this.window);
49
+ this.errorEventListener = null;
49
50
  // Node's error-message stack size is limited to 10, but it's pretty useful to see more than that when a test fails.
50
51
  this.global.Error.stackTraceLimit = 100;
51
52
  // TODO: Remove this ASAP as it currently causes tests to run really slow.
@@ -80,6 +81,14 @@ class HappyDOMEnvironment {
80
81
  else {
81
82
  this.window.happyDOM.setURL('http://localhost/');
82
83
  }
84
+ // Report uncaught errors.
85
+ this.errorEventListener = (event) => {
86
+ if (this.window['_listeners']?.['error']?.length === 0 && event.error !== null) {
87
+ process.emit('uncaughtException', event.error);
88
+ }
89
+ };
90
+ this.window.addEventListener('error', this.errorEventListener);
91
+ this.moduleMocker = new jest_mock_1.ModuleMocker(global);
83
92
  this.fakeTimers = new fake_timers_1.LegacyFakeTimers({
84
93
  config: projectConfig,
85
94
  global: this.window,
@@ -93,6 +102,15 @@ class HappyDOMEnvironment {
93
102
  config: projectConfig,
94
103
  global: this.window
95
104
  });
105
+ // Jest is using the setTimeout function from Happy DOM internally for detecting when a test times out, but this causes Window.happyDOM.whenAsyncComplete() and Window.happyDOM.cancelAsync() to not work as expected.
106
+ // Hopefully Jest can fix this in the future as this fix is not very pretty.
107
+ const happyDOMSetTimeout = this.global.setTimeout;
108
+ this.global.setTimeout = (...args) => {
109
+ if (new Error('stack').stack.includes('/jest-jasmine')) {
110
+ return global.setTimeout.call(global, ...args);
111
+ }
112
+ return happyDOMSetTimeout.call(this.global, ...args);
113
+ };
96
114
  }
97
115
  /**
98
116
  * Setup.
@@ -109,6 +127,10 @@ class HappyDOMEnvironment {
109
127
  this.fakeTimers.dispose();
110
128
  this.fakeTimersModern.dispose();
111
129
  this.global.happyDOM.cancelAsync();
130
+ if (this.errorEventListener) {
131
+ this.window.removeEventListener('error', this.errorEventListener);
132
+ this.errorEventListener = null;
133
+ }
112
134
  this.global = null;
113
135
  this.moduleMocker = null;
114
136
  this.fakeTimers = null;
package/lib/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@happy-dom/jest-environment",
3
- "version": "11.0.3",
3
+ "version": "11.0.4",
4
4
  "license": "MIT",
5
5
  "homepage": "https://github.com/capricorn86/happy-dom/tree/master/packages/jest-environment",
6
6
  "repository": "https://github.com/capricorn86/happy-dom",
@@ -54,7 +54,7 @@
54
54
  "@jest/types": "^29.4.0",
55
55
  "jest-mock": "^29.4.0",
56
56
  "jest-util": "^29.4.0",
57
- "happy-dom": "11.0.3"
57
+ "happy-dom": "11.0.4"
58
58
  },
59
59
  "devDependencies": {
60
60
  "@typescript-eslint/eslint-plugin": "^5.16.0",
package/src/index.ts CHANGED
@@ -5,7 +5,7 @@ import * as JestUtil from 'jest-util';
5
5
  import { ModuleMocker } from 'jest-mock';
6
6
  import { LegacyFakeTimers, ModernFakeTimers } from '@jest/fake-timers';
7
7
  import { JestEnvironment, EnvironmentContext } from '@jest/environment';
8
- import { Window, IWindow } from 'happy-dom';
8
+ import { Window, IWindow, ErrorEvent } from 'happy-dom';
9
9
  import { Script } from 'vm';
10
10
  import { Global, Config } from '@jest/types';
11
11
 
@@ -18,6 +18,7 @@ export default class HappyDOMEnvironment implements JestEnvironment {
18
18
  public window: IWindow = new Window({ console: globalThis.console });
19
19
  public global: Global.Global = <Global.Global>(<unknown>this.window);
20
20
  public moduleMocker: ModuleMocker = new ModuleMocker(<typeof globalThis>(<unknown>this.window));
21
+ private errorEventListener: (event: ErrorEvent) => void | null = null;
21
22
 
22
23
  /**
23
24
  * Constructor.
@@ -72,6 +73,16 @@ export default class HappyDOMEnvironment implements JestEnvironment {
72
73
  this.window.happyDOM.setURL('http://localhost/');
73
74
  }
74
75
 
76
+ // Report uncaught errors.
77
+ this.errorEventListener = (event: ErrorEvent) => {
78
+ if (this.window['_listeners']?.['error']?.length === 0 && event.error !== null) {
79
+ process.emit('uncaughtException', event.error);
80
+ }
81
+ };
82
+ this.window.addEventListener('error', this.errorEventListener);
83
+
84
+ this.moduleMocker = new ModuleMocker(global);
85
+
75
86
  this.fakeTimers = new LegacyFakeTimers({
76
87
  config: projectConfig,
77
88
  global: <typeof globalThis>(<unknown>this.window),
@@ -86,6 +97,16 @@ export default class HappyDOMEnvironment implements JestEnvironment {
86
97
  config: projectConfig,
87
98
  global: <typeof globalThis>(<unknown>this.window)
88
99
  });
100
+
101
+ // Jest is using the setTimeout function from Happy DOM internally for detecting when a test times out, but this causes Window.happyDOM.whenAsyncComplete() and Window.happyDOM.cancelAsync() to not work as expected.
102
+ // Hopefully Jest can fix this in the future as this fix is not very pretty.
103
+ const happyDOMSetTimeout = this.global.setTimeout;
104
+ (<(...args: unknown[]) => number>this.global.setTimeout) = (...args: unknown[]): number => {
105
+ if (new Error('stack').stack.includes('/jest-jasmine')) {
106
+ return global.setTimeout.call(global, ...args);
107
+ }
108
+ return happyDOMSetTimeout.call(this.global, ...args);
109
+ };
89
110
  }
90
111
 
91
112
  /**
@@ -106,6 +127,11 @@ export default class HappyDOMEnvironment implements JestEnvironment {
106
127
 
107
128
  (<IWindow>(<unknown>this.global)).happyDOM.cancelAsync();
108
129
 
130
+ if (this.errorEventListener) {
131
+ this.window.removeEventListener('error', this.errorEventListener);
132
+ this.errorEventListener = null;
133
+ }
134
+
109
135
  this.global = null;
110
136
  this.moduleMocker = null;
111
137
  this.fakeTimers = null;