@vpmedia/phaser 1.123.0 → 1.125.0

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.
Files changed (221) hide show
  1. package/dist/index.js +635 -623
  2. package/dist/index.js.map +1 -1
  3. package/dist/phaser/core/animation.d.ts +3 -3
  4. package/dist/phaser/core/animation.d.ts.map +1 -1
  5. package/dist/phaser/core/animation_manager.d.ts.map +1 -1
  6. package/dist/phaser/core/animation_parser.d.ts +27 -2
  7. package/dist/phaser/core/animation_parser.d.ts.map +1 -1
  8. package/dist/phaser/core/array_set.d.ts +11 -11
  9. package/dist/phaser/core/array_set.d.ts.map +1 -1
  10. package/dist/phaser/core/cache.d.ts.map +1 -1
  11. package/dist/phaser/core/callback.d.ts.map +1 -1
  12. package/dist/phaser/core/dom.d.ts +125 -19
  13. package/dist/phaser/core/dom.d.ts.map +1 -1
  14. package/dist/phaser/core/factory.d.ts +3 -2
  15. package/dist/phaser/core/factory.d.ts.map +1 -1
  16. package/dist/phaser/core/frame_data.d.ts.map +1 -1
  17. package/dist/phaser/core/input.d.ts +3 -2
  18. package/dist/phaser/core/input.d.ts.map +1 -1
  19. package/dist/phaser/core/input_handler.d.ts.map +1 -1
  20. package/dist/phaser/core/input_mouse.d.ts +5 -1
  21. package/dist/phaser/core/input_mouse.d.ts.map +1 -1
  22. package/dist/phaser/core/input_pointer.d.ts +3 -3
  23. package/dist/phaser/core/input_pointer.d.ts.map +1 -1
  24. package/dist/phaser/core/input_touch.d.ts +8 -8
  25. package/dist/phaser/core/input_touch.d.ts.map +1 -1
  26. package/dist/phaser/core/loader.d.ts +11 -2
  27. package/dist/phaser/core/loader.d.ts.map +1 -1
  28. package/dist/phaser/core/loader_parser.d.ts +14 -1
  29. package/dist/phaser/core/loader_parser.d.ts.map +1 -1
  30. package/dist/phaser/core/raf.d.ts +1 -1
  31. package/dist/phaser/core/raf.d.ts.map +1 -1
  32. package/dist/phaser/core/scale_manager.d.ts.map +1 -1
  33. package/dist/phaser/core/scene_manager.d.ts.map +1 -1
  34. package/dist/phaser/core/signal.d.ts.map +1 -1
  35. package/dist/phaser/core/sound.d.ts.map +1 -1
  36. package/dist/phaser/core/sound_manager.d.ts +1 -1
  37. package/dist/phaser/core/sound_manager.d.ts.map +1 -1
  38. package/dist/phaser/core/stage.d.ts +16 -6
  39. package/dist/phaser/core/stage.d.ts.map +1 -1
  40. package/dist/phaser/core/time.d.ts.map +1 -1
  41. package/dist/phaser/core/timer.d.ts +1 -1
  42. package/dist/phaser/core/timer.d.ts.map +1 -1
  43. package/dist/phaser/core/tween.d.ts +13 -5
  44. package/dist/phaser/core/tween.d.ts.map +1 -1
  45. package/dist/phaser/core/tween_data.d.ts +9 -7
  46. package/dist/phaser/core/tween_data.d.ts.map +1 -1
  47. package/dist/phaser/core/tween_manager.d.ts.map +1 -1
  48. package/dist/phaser/display/button.d.ts +6 -5
  49. package/dist/phaser/display/button.d.ts.map +1 -1
  50. package/dist/phaser/display/canvas/buffer.d.ts +1 -1
  51. package/dist/phaser/display/canvas/buffer.d.ts.map +1 -1
  52. package/dist/phaser/display/canvas/masker.d.ts +1 -1
  53. package/dist/phaser/display/canvas/masker.d.ts.map +1 -1
  54. package/dist/phaser/display/canvas/pool.d.ts +2 -2
  55. package/dist/phaser/display/canvas/pool.d.ts.map +1 -1
  56. package/dist/phaser/display/canvas/renderer.d.ts +9 -8
  57. package/dist/phaser/display/canvas/renderer.d.ts.map +1 -1
  58. package/dist/phaser/display/display_object.d.ts +5 -3
  59. package/dist/phaser/display/display_object.d.ts.map +1 -1
  60. package/dist/phaser/display/graphics.d.ts +1 -1
  61. package/dist/phaser/display/graphics.d.ts.map +1 -1
  62. package/dist/phaser/display/group.d.ts +1 -1
  63. package/dist/phaser/display/group.d.ts.map +1 -1
  64. package/dist/phaser/display/image.d.ts +6 -5
  65. package/dist/phaser/display/image.d.ts.map +1 -1
  66. package/dist/phaser/display/sprite_util.d.ts +3 -2
  67. package/dist/phaser/display/sprite_util.d.ts.map +1 -1
  68. package/dist/phaser/display/text.d.ts +2 -16
  69. package/dist/phaser/display/text.d.ts.map +1 -1
  70. package/dist/phaser/display/webgl/abstract_filter.d.ts +14 -8
  71. package/dist/phaser/display/webgl/abstract_filter.d.ts.map +1 -1
  72. package/dist/phaser/display/webgl/blend_manager.d.ts +2 -3
  73. package/dist/phaser/display/webgl/blend_manager.d.ts.map +1 -1
  74. package/dist/phaser/display/webgl/earcut.d.ts.map +1 -1
  75. package/dist/phaser/display/webgl/fast_sprite_batch.d.ts +11 -5
  76. package/dist/phaser/display/webgl/fast_sprite_batch.d.ts.map +1 -1
  77. package/dist/phaser/display/webgl/filter_manager.d.ts +6 -4
  78. package/dist/phaser/display/webgl/filter_manager.d.ts.map +1 -1
  79. package/dist/phaser/display/webgl/filter_texture.d.ts +4 -4
  80. package/dist/phaser/display/webgl/filter_texture.d.ts.map +1 -1
  81. package/dist/phaser/display/webgl/graphics.d.ts +2 -2
  82. package/dist/phaser/display/webgl/graphics.d.ts.map +1 -1
  83. package/dist/phaser/display/webgl/mask_manager.d.ts +3 -2
  84. package/dist/phaser/display/webgl/mask_manager.d.ts.map +1 -1
  85. package/dist/phaser/display/webgl/render_texture.d.ts +11 -8
  86. package/dist/phaser/display/webgl/render_texture.d.ts.map +1 -1
  87. package/dist/phaser/display/webgl/renderer.d.ts +8 -4
  88. package/dist/phaser/display/webgl/renderer.d.ts.map +1 -1
  89. package/dist/phaser/display/webgl/shader/normal.d.ts +28 -3
  90. package/dist/phaser/display/webgl/shader/normal.d.ts.map +1 -1
  91. package/dist/phaser/display/webgl/sprite_batch.d.ts +6 -5
  92. package/dist/phaser/display/webgl/sprite_batch.d.ts.map +1 -1
  93. package/dist/phaser/display/webgl/stencil_manager.d.ts +3 -3
  94. package/dist/phaser/display/webgl/stencil_manager.d.ts.map +1 -1
  95. package/dist/phaser/display/webgl/texture.d.ts.map +1 -1
  96. package/dist/phaser/display/webgl/texture_util.d.ts +2 -2
  97. package/dist/phaser/display/webgl/texture_util.d.ts.map +1 -1
  98. package/dist/phaser/display/webgl/util.d.ts +1 -1
  99. package/dist/phaser/display/webgl/util.d.ts.map +1 -1
  100. package/dist/phaser/geom/circle.d.ts.map +1 -1
  101. package/dist/phaser/geom/line.d.ts +10 -1
  102. package/dist/phaser/geom/line.d.ts.map +1 -1
  103. package/dist/phaser/geom/rectangle.d.ts.map +1 -1
  104. package/dist/phaser/geom/util/circle.d.ts +2 -1
  105. package/dist/phaser/geom/util/circle.d.ts.map +1 -1
  106. package/dist/phaser/geom/util/point.d.ts +1 -1
  107. package/dist/phaser/geom/util/point.d.ts.map +1 -1
  108. package/dist/phaser/geom/util/rectangle.d.ts +1 -1
  109. package/dist/phaser/geom/util/rectangle.d.ts.map +1 -1
  110. package/dist/phaser/util/math.d.ts.map +1 -1
  111. package/package.json +1 -1
  112. package/src/phaser/core/animation.ts +11 -11
  113. package/src/phaser/core/animation_manager.ts +12 -12
  114. package/src/phaser/core/animation_parser.ts +39 -37
  115. package/src/phaser/core/array_set.ts +28 -28
  116. package/src/phaser/core/cache.test.ts +33 -33
  117. package/src/phaser/core/cache.ts +7 -7
  118. package/src/phaser/core/callback.ts +1 -0
  119. package/src/phaser/core/callback_context.test.ts +8 -8
  120. package/src/phaser/core/device_util.ts +4 -4
  121. package/src/phaser/core/dom.ts +38 -24
  122. package/src/phaser/core/factory.ts +9 -2
  123. package/src/phaser/core/frame_data.test.ts +23 -23
  124. package/src/phaser/core/frame_data.ts +2 -5
  125. package/src/phaser/core/game.ts +12 -12
  126. package/src/phaser/core/input.ts +11 -10
  127. package/src/phaser/core/input_handler.test.ts +18 -18
  128. package/src/phaser/core/input_handler.ts +14 -14
  129. package/src/phaser/core/input_mouse.ts +13 -12
  130. package/src/phaser/core/input_pointer.test.ts +26 -26
  131. package/src/phaser/core/input_pointer.ts +4 -4
  132. package/src/phaser/core/input_touch.ts +8 -8
  133. package/src/phaser/core/loader.test.ts +26 -26
  134. package/src/phaser/core/loader.ts +63 -75
  135. package/src/phaser/core/loader_parser.test.ts +16 -16
  136. package/src/phaser/core/loader_parser.ts +16 -6
  137. package/src/phaser/core/raf.ts +1 -1
  138. package/src/phaser/core/registry.test.ts +6 -6
  139. package/src/phaser/core/scale_manager.ts +12 -11
  140. package/src/phaser/core/scene_manager.test.ts +30 -30
  141. package/src/phaser/core/scene_manager.ts +3 -3
  142. package/src/phaser/core/signal.test.ts +8 -8
  143. package/src/phaser/core/signal.ts +3 -3
  144. package/src/phaser/core/signal_dispatch.test.ts +30 -30
  145. package/src/phaser/core/sound.ts +45 -40
  146. package/src/phaser/core/sound_manager.ts +18 -22
  147. package/src/phaser/core/sound_sprite.ts +1 -1
  148. package/src/phaser/core/stage.ts +22 -12
  149. package/src/phaser/core/time.ts +1 -1
  150. package/src/phaser/core/timer.test.ts +47 -47
  151. package/src/phaser/core/timer.ts +2 -2
  152. package/src/phaser/core/tween.ts +34 -36
  153. package/src/phaser/core/tween_data.test.ts +119 -0
  154. package/src/phaser/core/tween_data.ts +54 -39
  155. package/src/phaser/core/tween_easing.test.ts +5 -5
  156. package/src/phaser/core/tween_manager.ts +2 -2
  157. package/src/phaser/display/bitmap_text.test.ts +30 -30
  158. package/src/phaser/display/bitmap_text.ts +3 -3
  159. package/src/phaser/display/button.ts +20 -18
  160. package/src/phaser/display/canvas/buffer.ts +2 -2
  161. package/src/phaser/display/canvas/graphics.ts +2 -2
  162. package/src/phaser/display/canvas/masker.ts +1 -1
  163. package/src/phaser/display/canvas/pool.test.ts +20 -20
  164. package/src/phaser/display/canvas/pool.ts +6 -6
  165. package/src/phaser/display/canvas/renderer.ts +18 -16
  166. package/src/phaser/display/canvas/tinter.ts +1 -1
  167. package/src/phaser/display/canvas/util.test.ts +25 -25
  168. package/src/phaser/display/canvas/util.ts +2 -2
  169. package/src/phaser/display/display_object.ts +16 -15
  170. package/src/phaser/display/graphics.test.ts +70 -20
  171. package/src/phaser/display/graphics.ts +46 -42
  172. package/src/phaser/display/group.ts +13 -12
  173. package/src/phaser/display/image.ts +35 -31
  174. package/src/phaser/display/sprite_util.ts +4 -3
  175. package/src/phaser/display/text.test.ts +28 -25
  176. package/src/phaser/display/text.ts +56 -62
  177. package/src/phaser/display/webgl/abstract_filter.ts +21 -11
  178. package/src/phaser/display/webgl/blend_manager.ts +4 -5
  179. package/src/phaser/display/webgl/earcut.test.ts +20 -20
  180. package/src/phaser/display/webgl/earcut.ts +46 -42
  181. package/src/phaser/display/webgl/fast_sprite_batch.ts +21 -16
  182. package/src/phaser/display/webgl/filter_manager.ts +7 -4
  183. package/src/phaser/display/webgl/filter_texture.ts +5 -5
  184. package/src/phaser/display/webgl/graphics.ts +3 -3
  185. package/src/phaser/display/webgl/mask_manager.ts +9 -14
  186. package/src/phaser/display/webgl/render_texture.ts +15 -14
  187. package/src/phaser/display/webgl/renderer.ts +10 -9
  188. package/src/phaser/display/webgl/shader/normal.ts +45 -35
  189. package/src/phaser/display/webgl/shader/shader.test.ts +24 -24
  190. package/src/phaser/display/webgl/shader_manager.test.ts +18 -18
  191. package/src/phaser/display/webgl/shader_manager.ts +1 -1
  192. package/src/phaser/display/webgl/sprite_batch.ts +10 -10
  193. package/src/phaser/display/webgl/stencil_manager.ts +4 -4
  194. package/src/phaser/display/webgl/texture.ts +2 -1
  195. package/src/phaser/display/webgl/texture_util.ts +2 -2
  196. package/src/phaser/display/webgl/util.ts +4 -4
  197. package/src/phaser/geom/circle.test.ts +38 -38
  198. package/src/phaser/geom/circle.ts +7 -7
  199. package/src/phaser/geom/ellipse.test.ts +12 -12
  200. package/src/phaser/geom/line.test.ts +15 -15
  201. package/src/phaser/geom/line.ts +5 -2
  202. package/src/phaser/geom/matrix.test.ts +31 -31
  203. package/src/phaser/geom/point.test.ts +31 -31
  204. package/src/phaser/geom/polygon.test.ts +27 -27
  205. package/src/phaser/geom/polygon.ts +2 -2
  206. package/src/phaser/geom/rectangle.test.ts +87 -87
  207. package/src/phaser/geom/rectangle.ts +12 -13
  208. package/src/phaser/geom/rounded_rectangle.test.ts +9 -9
  209. package/src/phaser/geom/util/circle.test.ts +5 -5
  210. package/src/phaser/geom/util/circle.ts +8 -11
  211. package/src/phaser/geom/util/ellipse.test.ts +2 -2
  212. package/src/phaser/geom/util/line.test.ts +2 -2
  213. package/src/phaser/geom/util/matrix.test.ts +4 -4
  214. package/src/phaser/geom/util/point.test.ts +2 -2
  215. package/src/phaser/geom/util/point.ts +6 -8
  216. package/src/phaser/geom/util/polygon.test.ts +2 -2
  217. package/src/phaser/geom/util/rectangle.test.ts +2 -2
  218. package/src/phaser/geom/util/rectangle.ts +1 -1
  219. package/src/phaser/geom/util/rounded_rectangle.test.ts +2 -2
  220. package/src/phaser/util/math.test.ts +41 -41
  221. package/src/phaser/util/math.ts +7 -5
@@ -1,4 +1,14 @@
1
1
  import { Point } from '../geom/point.js';
2
+
3
+ /** An element rectangle after the cushion has been applied to every edge. */
4
+ export type CalibratedBounds = {
5
+ width: number;
6
+ height: number;
7
+ left: number;
8
+ right: number;
9
+ top: number;
10
+ bottom: number;
11
+ };
2
12
  import type { Device } from './device.js';
3
13
 
4
14
  class VisualBoundsDesktopRectangle {
@@ -7,7 +17,7 @@ class VisualBoundsDesktopRectangle {
7
17
  * @returns {number} The horizontal scroll position in pixels.
8
18
  */
9
19
  public get x(): number {
10
- return globalThis && 'pageXOffset' in globalThis ? window.pageXOffset : document.documentElement.scrollLeft;
20
+ return 'pageXOffset' in globalThis ? window.pageXOffset : document.documentElement.scrollLeft;
11
21
  }
12
22
 
13
23
  /**
@@ -15,7 +25,7 @@ class VisualBoundsDesktopRectangle {
15
25
  * @returns {number} The vertical scroll position in pixels.
16
26
  */
17
27
  public get y(): number {
18
- return globalThis && 'pageYOffset' in globalThis ? window.pageYOffset : document.documentElement.scrollTop;
28
+ return 'pageYOffset' in globalThis ? window.pageYOffset : document.documentElement.scrollTop;
19
29
  }
20
30
 
21
31
  /**
@@ -71,7 +81,7 @@ class VisualBoundsRectangle {
71
81
  * @returns {number} The horizontal scroll position in pixels.
72
82
  */
73
83
  public get x(): number {
74
- return globalThis && 'pageXOffset' in globalThis ? window.pageXOffset : document.documentElement.scrollLeft;
84
+ return 'pageXOffset' in globalThis ? window.pageXOffset : document.documentElement.scrollLeft;
75
85
  }
76
86
 
77
87
  /**
@@ -79,7 +89,7 @@ class VisualBoundsRectangle {
79
89
  * @returns {number} The vertical scroll position in pixels.
80
90
  */
81
91
  public get y(): number {
82
- return globalThis && 'pageYOffset' in globalThis ? window.pageYOffset : document.documentElement.scrollTop;
92
+ return 'pageYOffset' in globalThis ? window.pageYOffset : document.documentElement.scrollTop;
83
93
  }
84
94
 
85
95
  /**
@@ -170,9 +180,9 @@ class DocumentBoundsRectangle {
170
180
 
171
181
  export class DOM {
172
182
  public treatAsDesktop: boolean;
173
- public visualBounds: any;
174
- public layoutBounds: any;
175
- public documentBounds: any;
183
+ public visualBounds: VisualBoundsDesktopRectangle | VisualBoundsRectangle;
184
+ public layoutBounds: LayoutBoundsDesktopRectangle | LayoutBoundsRectangle;
185
+ public documentBounds: DocumentBoundsRectangle;
176
186
  public scrollXProvider: () => number;
177
187
  public scrollYProvider: () => number;
178
188
 
@@ -189,13 +199,11 @@ export class DOM {
189
199
  this.layoutBounds = this.treatAsDesktop ? new LayoutBoundsDesktopRectangle() : new LayoutBoundsRectangle();
190
200
  this.documentBounds = new DocumentBoundsRectangle();
191
201
  this.scrollXProvider =
192
- globalThis && 'pageXOffset' in globalThis
202
+ 'pageXOffset' in globalThis
193
203
  ? (): number => window.pageXOffset
194
204
  : (): number => document.documentElement.scrollLeft;
195
205
  this.scrollYProvider =
196
- globalThis && 'pageYOffset' in globalThis
197
- ? (): number => window.pageYOffset
198
- : (): number => document.documentElement.scrollTop;
206
+ 'pageYOffset' in globalThis ? (): number => window.pageYOffset : (): number => document.documentElement.scrollTop;
199
207
  }
200
208
 
201
209
  /**
@@ -222,12 +230,13 @@ export class DOM {
222
230
  * @param {number} cushion - Optional padding to add around the element.
223
231
  * @returns {boolean} True if bounds were successfully retrieved, false otherwise.
224
232
  */
225
- public getBounds(element: HTMLCanvasElement, cushion = 0) {
226
- element = element && !element.nodeType ? (element as unknown as HTMLCanvasElement[])[0]! : element;
227
- if (!element || element.nodeType !== 1) {
233
+ public getBounds(element: HTMLCanvasElement, cushion = 0): CalibratedBounds | false {
234
+ // a jQuery-style wrapper was accepted here historically, so unwrap the first entry of one
235
+ const target = element.nodeType === undefined ? (element as unknown as HTMLCanvasElement[])[0] : element;
236
+ if (target?.nodeType !== 1) {
228
237
  return false;
229
238
  }
230
- return this.calibrate(element.getBoundingClientRect(), cushion);
239
+ return this.calibrate(target.getBoundingClientRect(), cushion);
231
240
  }
232
241
 
233
242
  /**
@@ -236,7 +245,7 @@ export class DOM {
236
245
  * @param {number} cushion - Optional padding to add around the rectangle.
237
246
  * @returns {{width: number, height: number, left: number, right: number, top: number, bottom: number}} The calibrated rectangle.
238
247
  */
239
- public calibrate(coords: DOMRect, cushion = 0) {
248
+ public calibrate(coords: DOMRect, cushion = 0): CalibratedBounds {
240
249
  const output = {
241
250
  width: 0,
242
251
  height: 0,
@@ -256,16 +265,21 @@ export class DOM {
256
265
  * @returns {string} The screen orientation ('portrait-primary', 'landscape-primary', etc.).
257
266
  */
258
267
  public getScreenOrientation(primaryFallback: string | null = null): OrientationType {
259
- const { screen } = globalThis;
260
- // @ts-expect-error the prefixed orientation properties predate the standard one and are absent from lib.dom
261
- const orientation = screen.orientation || screen.mozOrientation || screen.msOrientation;
262
- if (orientation && typeof orientation.type === 'string') {
263
- // Screen Orientation API specification
264
- return orientation.type;
265
- } else if (typeof orientation === 'string') {
268
+ // the prefixed orientation properties predate the standard one and are absent from lib.dom
269
+ const screen = globalThis.screen as Screen & {
270
+ mozOrientation?: string;
271
+ msOrientation?: string;
272
+ };
273
+ const orientation: ScreenOrientation | string | undefined =
274
+ screen.orientation ?? screen.mozOrientation ?? screen.msOrientation;
275
+ if (typeof orientation === 'string') {
266
276
  // moz/ms-orientation are strings
267
277
  return orientation;
268
278
  }
279
+ if (typeof orientation?.type === 'string') {
280
+ // Screen Orientation API specification
281
+ return orientation.type;
282
+ }
269
283
  const PORTRAIT = 'portrait-primary';
270
284
  const LANDSCAPE = 'landscape-primary';
271
285
  if (primaryFallback === 'screen') {
@@ -278,7 +292,7 @@ export class DOM {
278
292
  if (primaryFallback === 'window.orientation' && typeof legacyOrientation === 'number') {
279
293
  // This may change by device based on "natural" orientation.
280
294
  return legacyOrientation === 0 || legacyOrientation === 180 ? PORTRAIT : LANDSCAPE;
281
- } else if (globalThis.matchMedia) {
295
+ } else if (typeof globalThis.matchMedia === 'function') {
282
296
  if (globalThis.matchMedia('(orientation: portrait)').matches) {
283
297
  return PORTRAIT;
284
298
  } else if (globalThis.matchMedia('(orientation: landscape)').matches) {
@@ -6,6 +6,7 @@ import { Image } from '../display/image.js';
6
6
  import { Text } from '../display/text.js';
7
7
  import type { Game } from './game.js';
8
8
  import type { SignalListener } from './signal.js';
9
+ import type { TextStyle } from '../display/text.js';
9
10
 
10
11
  export class GameObjectFactory {
11
12
  public game!: Game;
@@ -26,7 +27,13 @@ export class GameObjectFactory {
26
27
  * @param {Group} group - The parent group for the image.
27
28
  * @returns {Image} The created Image object.
28
29
  */
29
- public image(x: number, y: number, key: string, frame: any, group: Group | null = null): Image {
30
+ public image(
31
+ x: number,
32
+ y: number,
33
+ key: string,
34
+ frame: string | number | null = null,
35
+ group: Group | null = null
36
+ ): Image {
30
37
  const target = group ?? this.game.world;
31
38
  return target.add(new Image(this.game, x, y, key, frame));
32
39
  }
@@ -51,7 +58,7 @@ export class GameObjectFactory {
51
58
  * @param {Group | null} group - The parent group for the text.
52
59
  * @returns {Text} The created Text object.
53
60
  */
54
- public text(x: number, y: number, text: any, style: any, group: Group | null = null): Text {
61
+ public text(x: number, y: number, text: string | number, style: TextStyle, group: Group | null = null): Text {
55
62
  const parent = group ?? this.game.world;
56
63
  return parent.add(new Text(this.game, x, y, text, style));
57
64
  }
@@ -10,89 +10,89 @@ const seed = (names: string[]): FrameData => {
10
10
  return data;
11
11
  };
12
12
 
13
- describe('FrameData', () => {
14
- describe('addFrame', () => {
15
- it('assigns a sequential index and registers the name', () => {
13
+ describe('FrameData', (): void => {
14
+ describe('addFrame', (): void => {
15
+ it('assigns a sequential index and registers the name', (): void => {
16
16
  const data = seed(['a', 'b']);
17
- expect(data._frames.map((frame) => frame.index)).toStrictEqual([0, 1]);
17
+ expect(data._frames.map((frame): number => frame.index)).toStrictEqual([0, 1]);
18
18
  expect(data._frameNames).toStrictEqual({ a: 0, b: 1 });
19
19
  });
20
20
 
21
- it('does not register an empty name', () => {
21
+ it('does not register an empty name', (): void => {
22
22
  const data = new FrameData();
23
23
  data.addFrame(new Frame(0, 0, 0, 10, 10, ''));
24
24
  expect(data._frameNames).toStrictEqual({});
25
25
  });
26
26
  });
27
27
 
28
- describe('getFrame', () => {
29
- it('returns the frame at the index', () => {
28
+ describe('getFrame', (): void => {
29
+ it('returns the frame at the index', (): void => {
30
30
  const data = seed(['a', 'b', 'c']);
31
31
  expect(data.getFrame(1).name).toBe('b');
32
32
  });
33
33
 
34
- it('falls back to the first frame when the index is out of range', () => {
34
+ it('falls back to the first frame when the index is out of range', (): void => {
35
35
  const data = seed(['a', 'b']);
36
36
  expect(data.getFrame(9).name).toBe('a');
37
37
  });
38
38
  });
39
39
 
40
- describe('getFrameByName', () => {
41
- it('finds a registered frame', () => {
40
+ describe('getFrameByName', (): void => {
41
+ it('finds a registered frame', (): void => {
42
42
  const data = seed(['a', 'b']);
43
43
  expect(data.getFrameByName('b')?.index).toBe(1);
44
44
  });
45
45
 
46
- it('returns null for an unknown name', () => {
46
+ it('returns null for an unknown name', (): void => {
47
47
  const data = seed(['a']);
48
48
  expect(data.getFrameByName('missing')).toBeNull();
49
49
  });
50
50
 
51
- it('returns null when the name maps to a frame that is gone', () => {
51
+ it('returns null when the name maps to a frame that is gone', (): void => {
52
52
  const data = seed(['a']);
53
53
  data._frames.length = 0;
54
54
  expect(data.getFrameByName('a')).toBeNull();
55
55
  });
56
56
  });
57
57
 
58
- describe('checkFrameName', () => {
59
- it('distinguishes known from unknown names', () => {
58
+ describe('checkFrameName', (): void => {
59
+ it('distinguishes known from unknown names', (): void => {
60
60
  const data = seed(['a']);
61
61
  expect(data.checkFrameName('a')).toBe(true);
62
62
  expect(data.checkFrameName('b')).toBe(false);
63
63
  });
64
64
  });
65
65
 
66
- describe('getFrameRange', () => {
67
- it('collects the inclusive range', () => {
66
+ describe('getFrameRange', (): void => {
67
+ it('collects the inclusive range', (): void => {
68
68
  const data = seed(['a', 'b', 'c', 'd']);
69
- expect(data.getFrameRange(1, 2).map((frame) => frame.name)).toStrictEqual(['b', 'c']);
69
+ expect(data.getFrameRange(1, 2).map((frame): string => frame.name)).toStrictEqual(['b', 'c']);
70
70
  });
71
71
 
72
- it('appends into a supplied output array', () => {
72
+ it('appends into a supplied output array', (): void => {
73
73
  const data = seed(['a', 'b']);
74
74
  const output = [data.getFrame(0)];
75
75
  expect(data.getFrameRange(1, 1, output)).toHaveLength(2);
76
76
  });
77
77
  });
78
78
 
79
- describe('getFrameIndexes', () => {
80
- it('maps numeric indexes through', () => {
79
+ describe('getFrameIndexes', (): void => {
80
+ it('maps numeric indexes through', (): void => {
81
81
  const data = seed(['a', 'b', 'c']);
82
82
  expect(data.getFrameIndexes([0, 2])).toStrictEqual([0, 2]);
83
83
  });
84
84
 
85
- it('maps names when numeric indexing is off', () => {
85
+ it('maps names when numeric indexing is off', (): void => {
86
86
  const data = seed(['a', 'b', 'c']);
87
87
  expect(data.getFrameIndexes(['c', 'a'], false)).toStrictEqual([2, 0]);
88
88
  });
89
89
 
90
- it('skips names that do not resolve', () => {
90
+ it('skips names that do not resolve', (): void => {
91
91
  const data = seed(['a']);
92
92
  expect(data.getFrameIndexes(['a', 'missing'], false)).toStrictEqual([0]);
93
93
  });
94
94
 
95
- it('returns every index when given no frames', () => {
95
+ it('returns every index when given no frames', (): void => {
96
96
  const data = seed(['a', 'b', 'c']);
97
97
  expect(data.getFrameIndexes([])).toStrictEqual([0, 1, 2]);
98
98
  });
@@ -20,10 +20,7 @@ export class FrameData {
20
20
  }
21
21
 
22
22
  public getFrame(index = 0): Frame {
23
- if (index >= this._frames.length) {
24
- index = 0;
25
- }
26
- return this._frames[index]!;
23
+ return this._frames[index >= this._frames.length ? 0 : index]!;
27
24
  }
28
25
 
29
26
  public getFrameByName(name: string): Frame | null {
@@ -59,7 +56,7 @@ export class FrameData {
59
56
  output: number[] | null = null
60
57
  ): number[] {
61
58
  const result = output ?? [];
62
- if (frames && frames.length > 0) {
59
+ if (frames.length > 0) {
63
60
  for (const f of frames) {
64
61
  if (useNumericIndex && this._frames[f as number]) {
65
62
  result.push(this._frames[f as number]!.index);
@@ -165,10 +165,10 @@ export class Game {
165
165
  this.input.boot();
166
166
  this.sound.boot();
167
167
  this.state.boot();
168
- if (window.focus) {
168
+ if (typeof window.focus === 'function') {
169
169
  window.focus();
170
170
  }
171
- if (!this.config.isSkipTicker) {
171
+ if (this.config.isSkipTicker !== true) {
172
172
  this.raf = new RequestAnimationFrame(this);
173
173
  this.raf.start();
174
174
  }
@@ -180,7 +180,7 @@ export class Game {
180
180
  */
181
181
  public createRendererCanvas(): void {
182
182
  this.logger.info('createRendererCanvas');
183
- if (this.canvas) {
183
+ if (this.canvas as HTMLCanvasElement | undefined) {
184
184
  removeFromDOM(this.canvas);
185
185
  }
186
186
  this.canvas = this.config.canvas ?? create(this, this.width, this.height, this.config.canvasID, true);
@@ -212,10 +212,10 @@ export class Game {
212
212
  isWebGlReady = true;
213
213
  } catch (error) {
214
214
  isWebGlReady = false;
215
- if (globalThis.PhaserRegistry?.GL_PROGRAM_INFO_LOG) {
215
+ if (globalThis.PhaserRegistry?.GL_PROGRAM_INFO_LOG != null) {
216
216
  this.logger.warn('WebGL program info', { log: globalThis.PhaserRegistry.GL_PROGRAM_INFO_LOG });
217
217
  }
218
- if (globalThis.PhaserRegistry?.GL_SHADER_INFO_LOG) {
218
+ if (globalThis.PhaserRegistry?.GL_SHADER_INFO_LOG != null) {
219
219
  this.logger.warn('WebGL shader info', { log: globalThis.PhaserRegistry.GL_SHADER_INFO_LOG });
220
220
  }
221
221
  const typedError = error instanceof Error ? error : new Error(String(error));
@@ -229,7 +229,7 @@ export class Game {
229
229
  if (this.contextRestoredBinded) {
230
230
  this.canvas.removeEventListener('webglcontextlost', this.contextRestoredBinded, false);
231
231
  }
232
- if (this.renderer) {
232
+ if (this.renderer as CanvasRenderer | WebGLRenderer | undefined) {
233
233
  this.renderer.destroy();
234
234
  }
235
235
  this.createRendererCanvas();
@@ -278,7 +278,7 @@ export class Game {
278
278
  this.parseConfigElement(config, 'renderType', RENDER_AUTO);
279
279
  this.parseConfigElement(config, 'isForceDisabledAudio', false);
280
280
  this.parseConfigElement(config, 'maxParallelDownloads', 16);
281
- if (config.parent) {
281
+ if (config.parent !== undefined) {
282
282
  this.parent = config.parent;
283
283
  }
284
284
  this.state = new SceneManager(this, config.state ?? null);
@@ -291,7 +291,7 @@ export class Game {
291
291
  public contextLost(event: Event): void {
292
292
  this.logger.info('contextLost', { type: event.type });
293
293
  event.preventDefault();
294
- if (this.renderer) {
294
+ if (this.renderer as CanvasRenderer | WebGLRenderer | undefined) {
295
295
  this.renderer.contextLost = true;
296
296
  }
297
297
  }
@@ -302,7 +302,7 @@ export class Game {
302
302
  */
303
303
  public contextRestored(event: Event): void {
304
304
  this.logger.info('contextRestored', { type: event.type });
305
- if (this.renderer) {
305
+ if (this.renderer as CanvasRenderer | WebGLRenderer | undefined) {
306
306
  this.renderer.initContext(this);
307
307
  // This.cache.clearGLTextures();
308
308
  this.renderer.contextLost = false;
@@ -340,10 +340,10 @@ export class Game {
340
340
  this.logger.info('destroy');
341
341
  this.isPaused = true;
342
342
 
343
- if (!this.cache) {
343
+ if (!(this.cache as Cache | undefined)) {
344
344
  return;
345
345
  }
346
- if (this.raf) {
346
+ if (this.raf as RequestAnimationFrame | undefined) {
347
347
  this.raf.stop();
348
348
  }
349
349
 
@@ -354,7 +354,7 @@ export class Game {
354
354
  this.stage.destroy();
355
355
  this.input.destroy();
356
356
 
357
- if (this.canvas) {
357
+ if (this.canvas as HTMLCanvasElement | undefined) {
358
358
  if (this.contextLostBinded) {
359
359
  this.canvas.removeEventListener('webglcontextlost', this.contextLostBinded, false);
360
360
  }
@@ -14,6 +14,7 @@ import type { Game } from './game.js';
14
14
  import type { DisplayObject } from '../display/display_object.js';
15
15
  import type { InputEvent } from './input_event.js';
16
16
  import type { CandidateHandler, PointerMoveCallback } from './callback.js';
17
+ import type { InputHandler } from './input_handler.js';
17
18
 
18
19
  const MAX_POINTERS = 10;
19
20
 
@@ -50,7 +51,7 @@ export class Input {
50
51
  public pointer7!: Pointer | null;
51
52
  public pointer8!: Pointer | null;
52
53
  public pointer9!: Pointer | null;
53
- public pointer10!: any;
54
+ public pointer10!: Pointer | null;
54
55
  public pointers!: Pointer[];
55
56
  public activePointer!: Pointer;
56
57
  public mousePointer!: Pointer;
@@ -63,7 +64,7 @@ export class Input {
63
64
  public onTap!: Signal;
64
65
  public onHold!: Signal;
65
66
  public minPriorityID!: number;
66
- public interactiveItems!: ArraySet;
67
+ public interactiveItems!: ArraySet<InputHandler>;
67
68
  public _localPoint!: Point;
68
69
  public _pollCounter!: number;
69
70
  public _oldPosition!: Point;
@@ -118,7 +119,7 @@ export class Input {
118
119
  this.onTap = null!;
119
120
  this.onHold = null!;
120
121
  this.minPriorityID = 0;
121
- this.interactiveItems = new ArraySet();
122
+ this.interactiveItems = new ArraySet<InputHandler>();
122
123
  this._localPoint = new Point();
123
124
  this._pollCounter = 0;
124
125
  this._oldPosition = null!;
@@ -291,7 +292,7 @@ export class Input {
291
292
  * @param {MouseEvent|TouchEvent|PointerEvent} event - TBD.
292
293
  * @returns {Pointer} TBD.
293
294
  */
294
- public startPointer(event: InputEvent) {
295
+ public startPointer(event: InputEvent): Pointer | null {
295
296
  if (this.maxPointers >= 0 && this.countActivePointers(this.maxPointers) >= this.maxPointers) {
296
297
  return null;
297
298
  }
@@ -315,7 +316,7 @@ export class Input {
315
316
  * @param {MouseEvent|TouchEvent|PointerEvent} event - TBD.
316
317
  * @returns {Pointer} TBD.
317
318
  */
318
- public updatePointer(event: InputEvent) {
319
+ public updatePointer(event: InputEvent): Pointer | null {
319
320
  if (this.pointer1.active && this.pointer1.identifier === event.identifier) {
320
321
  return this.pointer1.move(event);
321
322
  }
@@ -336,7 +337,7 @@ export class Input {
336
337
  * @param {MouseEvent|TouchEvent|PointerEvent} event - TBD.
337
338
  * @returns {Pointer} TBD.
338
339
  */
339
- public stopPointer(event: InputEvent) {
340
+ public stopPointer(event: InputEvent): Pointer | null {
340
341
  if (this.pointer1.active && this.pointer1.identifier === event.identifier) {
341
342
  return this.pointer1.stop(event);
342
343
  }
@@ -442,7 +443,7 @@ export class Input {
442
443
  }
443
444
  this.getLocalPosition(displayObject, pointer, this._localPoint);
444
445
  localPoint.copyFrom(this._localPoint);
445
- if (displayObject.hitArea && displayObject.hitArea.contains) {
446
+ if (displayObject.hitArea !== null) {
446
447
  return displayObject.hitArea.contains(this._localPoint.x, this._localPoint.y);
447
448
  } else if (displayObject instanceof Image) {
448
449
  const { width } = displayObject.texture.frame;
@@ -456,7 +457,7 @@ export class Input {
456
457
  }
457
458
  } else if (displayObject instanceof Graphics) {
458
459
  for (const data of displayObject.graphicsData) {
459
- if (data.fill && data.shape && data.shape.contains(this._localPoint.x, this._localPoint.y)) {
460
+ if (data.fill && (data.shape?.contains(this._localPoint.x, this._localPoint.y) ?? false)) {
460
461
  // Only deal with fills..
461
462
  return true;
462
463
  }
@@ -489,7 +490,7 @@ export class Input {
489
490
  /**
490
491
  * TBD.
491
492
  */
492
- public set x(value) {
493
+ public set x(value: number) {
493
494
  this._x = Math.floor(value);
494
495
  }
495
496
 
@@ -504,7 +505,7 @@ export class Input {
504
505
  /**
505
506
  * TBD.
506
507
  */
507
- public set y(value) {
508
+ public set y(value: number) {
508
509
  this._y = Math.floor(value);
509
510
  }
510
511
 
@@ -9,28 +9,28 @@ const createSprite = (): Image =>
9
9
  game: {
10
10
  time: { time: 0 },
11
11
  canvas: { style: { cursor: 'default' } },
12
- input: { interactiveItems: { add: () => undefined, remove: () => undefined } },
12
+ input: { interactiveItems: { add: (): undefined => undefined, remove: (): undefined => undefined } },
13
13
  },
14
14
  events: {
15
- onAddedToGroup: { add: () => undefined },
16
- onRemovedFromGroup: { add: () => undefined },
15
+ onAddedToGroup: { add: (): undefined => undefined },
16
+ onRemovedFromGroup: { add: (): undefined => undefined },
17
17
  },
18
18
  }) as unknown as Image;
19
19
 
20
- describe('InputHandler', () => {
21
- describe('pointerData', () => {
22
- it('seeds pointer 0 from the constructor', () => {
20
+ describe('InputHandler', (): void => {
21
+ describe('pointerData', (): void => {
22
+ it('seeds pointer 0 from the constructor', (): void => {
23
23
  const handler = new InputHandler(createSprite());
24
24
  expect(handler._pointerData).toHaveLength(1);
25
25
  expect(handler.pointerData(0).id).toBe(0);
26
26
  });
27
27
 
28
- it('returns the same record on repeat access', () => {
28
+ it('returns the same record on repeat access', (): void => {
29
29
  const handler = new InputHandler(createSprite());
30
30
  expect(handler.pointerData(0)).toBe(handler.pointerData(0));
31
31
  });
32
32
 
33
- it('creates a record on first access of an unseeded pointer', () => {
33
+ it('creates a record on first access of an unseeded pointer', (): void => {
34
34
  const handler = new InputHandler(createSprite());
35
35
  const data = handler.pointerData(7);
36
36
  expect(data.id).toBe(7);
@@ -38,13 +38,13 @@ describe('InputHandler', () => {
38
38
  expect(handler.pointerData(7)).toBe(data);
39
39
  });
40
40
 
41
- it('hands back a record whose mutations are visible through the array', () => {
41
+ it('hands back a record whose mutations are visible through the array', (): void => {
42
42
  const handler = new InputHandler(createSprite());
43
43
  handler.pointerData(3).isOver = true;
44
44
  expect(handler._pointerData[3]?.isOver).toBe(true);
45
45
  });
46
46
 
47
- it('exposes every field a fresh record needs', () => {
47
+ it('exposes every field a fresh record needs', (): void => {
48
48
  const handler = new InputHandler(createSprite());
49
49
  expect(handler.pointerData(1)).toStrictEqual({
50
50
  id: 1,
@@ -66,18 +66,18 @@ describe('InputHandler', () => {
66
66
  });
67
67
  });
68
68
 
69
- describe('start', () => {
70
- it('populates the ten pointer slots the input system tracks', () => {
69
+ describe('start', (): void => {
70
+ it('populates the ten pointer slots the input system tracks', (): void => {
71
71
  const handler = new InputHandler(createSprite());
72
72
  handler.start();
73
73
  expect(handler._pointerData).toHaveLength(10);
74
- expect(handler._pointerData.map((data) => data.id)).toStrictEqual([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]);
74
+ expect(handler._pointerData.map((data): number => data.id)).toStrictEqual([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]);
75
75
  expect(handler.enabled).toBe(true);
76
76
  });
77
77
  });
78
78
 
79
- describe('reset', () => {
80
- it('clears pointer state back to a fresh record', () => {
79
+ describe('reset', (): void => {
80
+ it('clears pointer state back to a fresh record', (): void => {
81
81
  const handler = new InputHandler(createSprite());
82
82
  handler.start();
83
83
  handler.pointerData(2).isDown = true;
@@ -89,8 +89,8 @@ describe('InputHandler', () => {
89
89
  });
90
90
  });
91
91
 
92
- describe('pointer accessors', () => {
93
- it('read through to the backing record', () => {
92
+ describe('pointer accessors', (): void => {
93
+ it('read through to the backing record', (): void => {
94
94
  const handler = new InputHandler(createSprite());
95
95
  handler.start();
96
96
  const data = handler.pointerData(4);
@@ -104,7 +104,7 @@ describe('InputHandler', () => {
104
104
  expect(handler.pointerTimeDown(4)).toBe(99);
105
105
  });
106
106
 
107
- it('default to pointer 0', () => {
107
+ it('default to pointer 0', (): void => {
108
108
  const handler = new InputHandler(createSprite());
109
109
  handler.pointerData(0).x = 5;
110
110
  expect(handler.pointerX()).toBe(5);