maplibre-gl 6.0.0 → 6.2.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 (181) hide show
  1. package/build/readme.md +0 -2
  2. package/dist/maplibre-gl-dev.mjs +433 -573
  3. package/dist/maplibre-gl-dev.mjs.map +1 -1
  4. package/dist/maplibre-gl-shared-dev.mjs +984 -850
  5. package/dist/maplibre-gl-shared-dev.mjs.map +1 -1
  6. package/dist/maplibre-gl-shared.mjs +2 -2
  7. package/dist/maplibre-gl-shared.mjs.map +1 -1
  8. package/dist/maplibre-gl-worker-dev.mjs +14 -12
  9. package/dist/maplibre-gl-worker-dev.mjs.map +1 -1
  10. package/dist/maplibre-gl-worker.mjs +2 -2
  11. package/dist/maplibre-gl-worker.mjs.map +1 -1
  12. package/dist/maplibre-gl.css +1 -1
  13. package/dist/maplibre-gl.d.ts +119 -42
  14. package/dist/maplibre-gl.mjs +22 -22
  15. package/dist/maplibre-gl.mjs.map +1 -1
  16. package/package.json +20 -22
  17. package/src/css/maplibre-gl.css +4 -0
  18. package/src/data/bucket/circle_bucket.ts +3 -2
  19. package/src/data/bucket/fill_bucket.ts +3 -2
  20. package/src/data/bucket/fill_extrusion_bucket.test.ts +22 -0
  21. package/src/data/bucket/fill_extrusion_bucket.ts +17 -4
  22. package/src/data/bucket/line_bucket.test.ts +5 -5
  23. package/src/data/bucket/line_bucket.ts +3 -2
  24. package/src/data/bucket/round_polygon_corners.test.ts +159 -0
  25. package/src/data/bucket/round_polygon_corners.ts +121 -0
  26. package/src/data/bucket/symbol_bucket.test.ts +7 -7
  27. package/src/data/dem_data.test.ts +23 -23
  28. package/src/data/feature_position_map.test.ts +1 -1
  29. package/src/data/segment.test.ts +14 -14
  30. package/src/geo/bounds.test.ts +4 -4
  31. package/src/geo/lng_lat_bounds.test.ts +1 -1
  32. package/src/geo/projection/covering_tiles.bench.ts +39 -0
  33. package/src/geo/projection/covering_tiles.test.ts +3 -7
  34. package/src/geo/projection/covering_tiles.ts +37 -2
  35. package/src/geo/projection/globe_covering_tiles_details_provider.ts +4 -4
  36. package/src/geo/projection/globe_projection.test.ts +2 -2
  37. package/src/geo/projection/globe_projection.ts +6 -15
  38. package/src/geo/projection/globe_transform.test.ts +3 -6
  39. package/src/geo/projection/globe_transform.ts +4 -7
  40. package/src/geo/projection/mercator_covering_tiles_details_provider.ts +4 -4
  41. package/src/geo/projection/mercator_projection.ts +1 -13
  42. package/src/geo/projection/mercator_transform.test.ts +1 -1
  43. package/src/geo/projection/mercator_transform.ts +2 -1
  44. package/src/geo/projection/mercator_utils.test.ts +8 -8
  45. package/src/geo/projection/projection.ts +0 -27
  46. package/src/geo/projection/projection_data.ts +8 -0
  47. package/src/geo/projection/projection_factory.ts +3 -3
  48. package/src/geo/projection/vertical_perspective_projection.ts +3 -60
  49. package/src/geo/projection/vertical_perspective_transform.ts +16 -23
  50. package/src/geo/transform_interface.ts +1 -2
  51. package/src/index.test.ts +7 -12
  52. package/src/index.ts +4 -2
  53. package/src/render/glyph_manager.test.ts +7 -22
  54. package/src/render/painter.test.ts +2 -0
  55. package/src/render/painter.ts +8 -11
  56. package/src/render/subdivision.bench.ts +39 -0
  57. package/src/render/subdivision.test.ts +22 -23
  58. package/src/render/subdivision.ts +46 -0
  59. package/src/render/terrain.test.ts +68 -34
  60. package/src/render/terrain.ts +69 -26
  61. package/src/shaders/glsl/_projection_globe.fragment.glsl +12 -0
  62. package/src/shaders/glsl/_projection_globe.fragment.glsl.g.ts +2 -0
  63. package/src/shaders/glsl/_projection_globe.vertex.glsl +29 -10
  64. package/src/shaders/glsl/_projection_globe.vertex.glsl.g.ts +1 -1
  65. package/src/shaders/glsl/_projection_mercator.fragment.glsl +4 -0
  66. package/src/shaders/glsl/_projection_mercator.fragment.glsl.g.ts +2 -0
  67. package/src/shaders/glsl/line.fragment.glsl +2 -0
  68. package/src/shaders/glsl/line.fragment.glsl.g.ts +1 -1
  69. package/src/shaders/glsl/line_gradient.fragment.glsl +2 -0
  70. package/src/shaders/glsl/line_gradient.fragment.glsl.g.ts +1 -1
  71. package/src/shaders/glsl/line_gradient_sdf.fragment.glsl +2 -0
  72. package/src/shaders/glsl/line_gradient_sdf.fragment.glsl.g.ts +1 -1
  73. package/src/shaders/glsl/line_pattern.fragment.glsl +2 -0
  74. package/src/shaders/glsl/line_pattern.fragment.glsl.g.ts +1 -1
  75. package/src/shaders/glsl/line_sdf.fragment.glsl +2 -0
  76. package/src/shaders/glsl/line_sdf.fragment.glsl.g.ts +1 -1
  77. package/src/shaders/shaders.ts +4 -6
  78. package/src/source/canvas_source.test.ts +1 -1
  79. package/src/source/geojson_source.test.ts +32 -4
  80. package/src/source/geojson_source.ts +41 -0
  81. package/src/source/geojson_source_diff.test.ts +2 -2
  82. package/src/source/geojson_worker_source.test.ts +9 -5
  83. package/src/source/image_source.test.ts +137 -62
  84. package/src/source/image_source.ts +49 -12
  85. package/src/source/raster_dem_tile_source.test.ts +2 -2
  86. package/src/source/raster_tile_source.test.ts +64 -9
  87. package/src/source/raster_tile_source.ts +2 -1
  88. package/src/source/rtl_text_plugin_main_thread.test.ts +14 -14
  89. package/src/source/source.test.ts +8 -8
  90. package/src/source/vector_tile_source.test.ts +1 -1
  91. package/src/source/vector_tile_worker_source.test.ts +7 -5
  92. package/src/source/video_source.test.ts +1 -1
  93. package/src/source/worker.test.ts +1 -1
  94. package/src/source/worker_tile.test.ts +10 -8
  95. package/src/style/light.test.ts +9 -9
  96. package/src/style/light.ts +3 -3
  97. package/src/style/load_glyph_range.test.ts +8 -8
  98. package/src/style/load_sprite.test.ts +1 -1
  99. package/src/style/properties.test.ts +94 -2
  100. package/src/style/properties.ts +30 -1
  101. package/src/style/sky.test.ts +9 -9
  102. package/src/style/sky.ts +2 -2
  103. package/src/style/style.test.ts +38 -36
  104. package/src/style/style.ts +3 -3
  105. package/src/style/style_layer/color_relief_style_layer.test.ts +1 -1
  106. package/src/style/style_layer/fill_extrusion_style_layer.ts +6 -3
  107. package/src/style/style_layer/fill_extrusion_style_layer_properties.g.ts +14 -1
  108. package/src/style/style_layer/raster_style_layer.test.ts +2 -2
  109. package/src/style/style_layer.test.ts +5 -51
  110. package/src/style/validate_style.test.ts +1 -1
  111. package/src/symbol/collision_index.test.ts +1 -1
  112. package/src/symbol/grid_index.test.ts +1 -1
  113. package/src/tile/terrain_tile_manager.test.ts +2 -2
  114. package/src/tile/tile_id.test.ts +5 -5
  115. package/src/tile/tile_manager.test.ts +113 -72
  116. package/src/tile/tile_manager.ts +2 -2
  117. package/src/tile/tile_manager_in_view_tiles.test.ts +2 -2
  118. package/src/ui/camera.test.ts +138 -135
  119. package/src/ui/control/geolocate_control.test.ts +7 -30
  120. package/src/ui/handler/dblclick_zoom.test.ts +2 -2
  121. package/src/ui/handler/mouse.ts +15 -7
  122. package/src/ui/handler/mouse_handler_interface.test.ts +21 -1
  123. package/src/ui/handler/scroll_zoom.test.ts +2 -0
  124. package/src/ui/handler_manager.test.ts +7 -7
  125. package/src/ui/hash.test.ts +1 -0
  126. package/src/ui/map.ts +45 -20
  127. package/src/ui/map_tests/map_basic.test.ts +11 -23
  128. package/src/ui/map_tests/map_calculate_camera_options.test.ts +6 -6
  129. package/src/ui/map_tests/map_events.test.ts +5 -7
  130. package/src/ui/map_tests/map_global_state.test.ts +3 -3
  131. package/src/ui/map_tests/map_images.test.ts +4 -3
  132. package/src/ui/map_tests/map_is_moving.test.ts +1 -1
  133. package/src/ui/map_tests/map_is_rotating.test.ts +1 -1
  134. package/src/ui/map_tests/map_layer.test.ts +2 -1
  135. package/src/ui/map_tests/map_options.test.ts +1 -5
  136. package/src/ui/map_tests/map_pitch.test.ts +6 -6
  137. package/src/ui/map_tests/map_refresh_tiles.test.ts +2 -2
  138. package/src/ui/map_tests/map_render.test.ts +1 -1
  139. package/src/ui/map_tests/map_set_lod_params.test.ts +1 -1
  140. package/src/ui/map_tests/map_style.test.ts +9 -1
  141. package/src/ui/map_tests/map_terrain.test.ts +41 -1
  142. package/src/ui/map_tests/map_zoom.test.ts +15 -15
  143. package/src/ui/marker.test.ts +71 -14
  144. package/src/ui/marker.ts +30 -6
  145. package/src/ui/popup.test.ts +3 -3
  146. package/src/util/actor.test.ts +6 -6
  147. package/src/util/ajax.test.ts +27 -39
  148. package/src/util/browser.test.ts +7 -9
  149. package/src/util/create_tile_mesh.test.ts +2 -2
  150. package/src/util/dispatcher.test.ts +1 -1
  151. package/src/util/evented.test.ts +4 -1
  152. package/src/util/fast_maths.test.ts +4 -4
  153. package/src/util/image_request.test.ts +6 -4
  154. package/src/util/primitives/bounding_volume_cache.ts +3 -1
  155. package/src/util/struct_array.test.ts +2 -2
  156. package/src/util/task_queue.test.ts +1 -1
  157. package/src/util/test/util.ts +1 -0
  158. package/src/util/time_control.test.ts +2 -2
  159. package/src/util/transferable_grid_index.test.ts +1 -1
  160. package/src/util/util.test.ts +27 -13
  161. package/src/util/verticalize_punctuation.test.ts +4 -4
  162. package/src/util/web_worker_transfer.test.ts +5 -5
  163. package/src/webgl/draw/draw_custom.test.ts +13 -13
  164. package/src/webgl/draw/draw_debug.test.ts +1 -1
  165. package/src/webgl/draw/draw_fill.test.ts +13 -12
  166. package/src/webgl/draw/draw_symbol.test.ts +17 -16
  167. package/src/webgl/program/program_uniforms.ts +0 -3
  168. package/src/webgl/program/projection_program.ts +12 -10
  169. package/src/webgl/program/terrain_program.test.ts +2 -2
  170. package/src/webgl/program.ts +6 -4
  171. package/src/webgl/render_to_texture.test.ts +5 -5
  172. package/src/webgl/state.test.ts +1 -1
  173. package/src/webgl/texture.test.ts +3 -3
  174. package/src/webgl/vertex_buffer.test.ts +1 -1
  175. package/build/rolldown_plugins.ts +0 -18
  176. package/src/geo/projection/globe_projection_error_measurement.ts +0 -229
  177. package/src/shaders/glsl/projection_error_measurement.fragment.glsl +0 -5
  178. package/src/shaders/glsl/projection_error_measurement.fragment.glsl.g.ts +0 -2
  179. package/src/shaders/glsl/projection_error_measurement.vertex.glsl +0 -22
  180. package/src/shaders/glsl/projection_error_measurement.vertex.glsl.g.ts +0 -2
  181. package/src/webgl/program/projection_error_measurement_program.ts +0 -23
@@ -343,16 +343,24 @@ describe('TileManager.removeTile', () => {
343
343
 
344
344
  });
345
345
 
346
- test('_tileLoaded after _removeTile skips tile.added', () => {
346
+ test('_tileLoaded after _removeTile skips tile.added', async () => {
347
347
  const tileID = new OverscaledTileID(0, 0, 0, 0, 0);
348
348
 
349
349
  const tileManager = createTileManager();
350
+ let releaseLoad: () => void;
351
+ const tileRegistered = new Promise<void>((resolve) => { releaseLoad = resolve; });
350
352
  tileManager._source.loadTile = async () => {
353
+ await tileRegistered;
351
354
  tileManager._removeTile(tileID.key);
352
355
  };
353
356
  tileManager.map = {painter: {crossTileSymbolIndex: '', tileExtentVAO: {}}} as any;
354
357
 
355
- tileManager._addTile(tileID);
358
+ const abortPromise = tileManager.once('dataabort');
359
+ const tile = tileManager._addTile(tileID);
360
+ releaseLoad();
361
+ await abortPromise;
362
+
363
+ expect(tile.aborted).toBe(true);
356
364
  });
357
365
 
358
366
  test('fires dataabort event', async () => {
@@ -454,8 +462,11 @@ describe('TileManager / Source lifecycle', () => {
454
462
 
455
463
  test('suppress 404 errors', () => {
456
464
  const tileManager = createTileManager({status: 404, message: 'Not found'});
457
- tileManager.on('error', () => { throw new Error('test failed: error event fired'); });
465
+ const errorListener = vi.fn();
466
+ tileManager.on('error', errorListener);
458
467
  tileManager.onAdd(undefined);
468
+
469
+ expect(errorListener).not.toHaveBeenCalled();
459
470
  });
460
471
 
461
472
  test('loaded() true after source error', async () => {
@@ -588,6 +599,34 @@ describe('TileManager / Source lifecycle', () => {
588
599
 
589
600
  });
590
601
 
602
+ test('reloads errored tiles as loading, not expired, on source data change', () => {
603
+ const transform = new MercatorTransform();
604
+ transform.resize(511, 511);
605
+ transform.setZoom(1);
606
+
607
+ const tileManager = createTileManager();
608
+ tileManager._source.loadTile = async (tile) => {
609
+ // the four z1 tiles error, the single z0 tile loads
610
+ tile.state = tile.tileID.canonical.z === 1 ? 'errored' : 'loaded';
611
+ };
612
+
613
+ tileManager.on('data', (e) => {
614
+ if (e.dataType === 'source' && e.sourceDataType === 'metadata') {
615
+ tileManager.update(transform);
616
+ // hold the reload in-flight so the state each tile is reloaded into stays observable
617
+ tileManager._source.loadTile = () => new Promise<void>(() => {});
618
+ tileManager.getSource().fire(new Event('data', {dataType: 'source', sourceDataType: 'content', sourceDataChanged: true}));
619
+ }
620
+ });
621
+ tileManager.onAdd(undefined);
622
+
623
+ // errored tiles have no texture; reloaded as 'expired' they'd count as renderable and
624
+ // crash the raster renderer, so only the z0 tile that had data should be renderable.
625
+ const renderableZooms = tileManager.getRenderableIds().map((id) => tileManager.getTileByID(id).tileID.canonical.z);
626
+ expect(renderableZooms).toEqual([0]);
627
+
628
+ });
629
+
591
630
  });
592
631
 
593
632
  describe('TileManager.update', () => {
@@ -773,7 +812,7 @@ describe('TileManager.update', () => {
773
812
  ]);
774
813
  });
775
814
 
776
- test('retains children tiles for pending parents', () => {
815
+ test('retains children tiles for pending parents', async () => {
777
816
  const transform = new GlobeTransform();
778
817
  transform.resize(511, 511);
779
818
  transform.setZoom(1);
@@ -784,29 +823,28 @@ describe('TileManager.update', () => {
784
823
  tile.state = (tile.tileID.key === new OverscaledTileID(0, 1, 0, 0, 0).key) ? 'loading' : 'loaded';
785
824
  };
786
825
 
787
- tileManager.on('data', (e) => {
788
- if (e.sourceDataType === 'metadata') {
789
- tileManager.update(transform);
790
- expect(tileManager.getIds()).toEqual([
791
- new OverscaledTileID(1, 1, 1, 1, 1).key,
792
- new OverscaledTileID(1, 1, 1, 0, 1).key,
793
- new OverscaledTileID(1, 1, 1, 1, 0).key,
794
- new OverscaledTileID(1, 1, 1, 0, 0).key
795
- ]);
796
-
797
- transform.setZoom(0);
798
- tileManager.update(transform);
799
-
800
- expect(tileManager.getIds()).toEqual([
801
- new OverscaledTileID(0, 1, 0, 0, 0).key,
802
- new OverscaledTileID(1, 1, 1, 1, 1).key,
803
- new OverscaledTileID(1, 1, 1, 0, 1).key,
804
- new OverscaledTileID(1, 1, 1, 1, 0).key,
805
- new OverscaledTileID(1, 1, 1, 0, 0).key
806
- ]);
807
- }
808
- });
826
+ const metadataPromise = waitForEvent(tileManager, 'data', e => e.sourceDataType === 'metadata');
809
827
  tileManager.onAdd(undefined);
828
+ await metadataPromise;
829
+
830
+ tileManager.update(transform);
831
+ expect(tileManager.getIds()).toEqual([
832
+ new OverscaledTileID(1, 1, 1, 1, 1).key,
833
+ new OverscaledTileID(1, 1, 1, 0, 1).key,
834
+ new OverscaledTileID(1, 1, 1, 1, 0).key,
835
+ new OverscaledTileID(1, 1, 1, 0, 0).key
836
+ ]);
837
+
838
+ transform.setZoom(0);
839
+ tileManager.update(transform);
840
+
841
+ expect(tileManager.getIds()).toEqual([
842
+ new OverscaledTileID(0, 1, 0, 0, 0).key,
843
+ new OverscaledTileID(1, 1, 1, 1, 1).key,
844
+ new OverscaledTileID(1, 1, 1, 0, 1).key,
845
+ new OverscaledTileID(1, 1, 1, 1, 0).key,
846
+ new OverscaledTileID(1, 1, 1, 0, 0).key
847
+ ]);
810
848
  });
811
849
 
812
850
  test('retains overscaled loaded children', async () => {
@@ -1108,7 +1146,7 @@ describe('TileManager._updateRetainedTiles', () => {
1108
1146
  const secondGeneration = idealTile
1109
1147
  .children(10)
1110
1148
  .flatMap(child => child.children(10));
1111
- expect(secondGeneration.length).toEqual(16);
1149
+ expect(secondGeneration).toHaveLength(16);
1112
1150
 
1113
1151
  for (const id of secondGeneration) {
1114
1152
  tileManager._inViewTiles.setTile(id.key, new Tile(id, undefined));
@@ -1746,7 +1784,7 @@ describe('TileManager.tilesIn', () => {
1746
1784
  expect(round(tiles[1].queryGeometry)).toEqual([{x: -4096, y: 4050}, {x: 4096, y: 8146}]);
1747
1785
  });
1748
1786
 
1749
- test('reparsed overscaled tiles', () => {
1787
+ test('reparsed overscaled tiles', async () => {
1750
1788
  const tileManager = createTileManager({
1751
1789
  reparseOverscaled: true,
1752
1790
  minzoom: 1,
@@ -1757,44 +1795,42 @@ describe('TileManager.tilesIn', () => {
1757
1795
  tile.state = 'loaded';
1758
1796
  };
1759
1797
 
1760
- tileManager.on('data', (e) => {
1761
- if (e.sourceDataType === 'metadata') {
1762
- const transform = new MercatorTransform();
1763
- transform.resize(1024, 1024);
1764
- transform.setZoom(2);
1765
- transform.setCenter(new LngLat(0, 1));
1766
- tileManager.update(transform);
1798
+ const metadataPromise = waitForEvent(tileManager, 'data', e => e.sourceDataType === 'metadata');
1799
+ tileManager.onAdd(undefined);
1800
+ await metadataPromise;
1801
+
1802
+ const transform = new MercatorTransform();
1803
+ transform.resize(1024, 1024);
1804
+ transform.setZoom(2);
1805
+ transform.setCenter(new LngLat(0, 1));
1806
+ tileManager.update(transform);
1767
1807
 
1768
- expect(tileManager.getIds()).toEqual([
1769
- new OverscaledTileID(2, 0, 1, 1, 1).key,
1770
- new OverscaledTileID(2, 0, 1, 0, 1).key,
1771
- new OverscaledTileID(2, 0, 1, 1, 0).key,
1772
- new OverscaledTileID(2, 0, 1, 0, 0).key
1773
- ]);
1774
-
1775
- const tiles = tileManager.tilesIn([
1776
- new Point(0, 0),
1777
- new Point(1024, 512)
1778
- ], 1, true);
1779
-
1780
- tiles.sort((a, b) => { return a.tile.tileID.canonical.x - b.tile.tileID.canonical.x; });
1781
- for (const result of tiles) {
1782
- delete result.tile.uid;
1783
- }
1784
-
1785
- expect(tiles[0].tile.tileID.key).toBe('012');
1786
- expect(tiles[0].tile.tileSize).toBe(1024);
1787
- expect(tiles[0].scale).toBe(1);
1788
- expect(round(tiles[0].queryGeometry)).toEqual([{x: 4096, y: 4050}, {x: 12288, y: 8146}]);
1789
-
1790
- expect(tiles[1].tile.tileID.key).toBe('112');
1791
- expect(tiles[1].tile.tileSize).toBe(1024);
1792
- expect(tiles[1].scale).toBe(1);
1793
- expect(round(tiles[1].queryGeometry)).toEqual([{x: -4096, y: 4050}, {x: 4096, y: 8146}]);
1808
+ expect(tileManager.getIds()).toEqual([
1809
+ new OverscaledTileID(2, 0, 1, 1, 1).key,
1810
+ new OverscaledTileID(2, 0, 1, 0, 1).key,
1811
+ new OverscaledTileID(2, 0, 1, 1, 0).key,
1812
+ new OverscaledTileID(2, 0, 1, 0, 0).key
1813
+ ]);
1794
1814
 
1795
- }
1796
- });
1797
- tileManager.onAdd(undefined);
1815
+ const tiles = tileManager.tilesIn([
1816
+ new Point(0, 0),
1817
+ new Point(1024, 512)
1818
+ ], 1, true);
1819
+
1820
+ tiles.sort((a, b) => { return a.tile.tileID.canonical.x - b.tile.tileID.canonical.x; });
1821
+ for (const result of tiles) {
1822
+ delete result.tile.uid;
1823
+ }
1824
+
1825
+ expect(tiles[0].tile.tileID.key).toBe('012');
1826
+ expect(tiles[0].tile.tileSize).toBe(1024);
1827
+ expect(tiles[0].scale).toBe(1);
1828
+ expect(round(tiles[0].queryGeometry)).toEqual([{x: 4096, y: 4050}, {x: 12288, y: 8146}]);
1829
+
1830
+ expect(tiles[1].tile.tileID.key).toBe('112');
1831
+ expect(tiles[1].tile.tileSize).toBe(1024);
1832
+ expect(tiles[1].scale).toBe(1);
1833
+ expect(round(tiles[1].queryGeometry)).toEqual([{x: -4096, y: 4050}, {x: 4096, y: 8146}]);
1798
1834
  });
1799
1835
 
1800
1836
  test('overscaled tiles', async () => {
@@ -1815,6 +1851,13 @@ describe('TileManager.tilesIn', () => {
1815
1851
  transform.resize(512, 512);
1816
1852
  transform.setZoom(2.0);
1817
1853
  tileManager.update(transform);
1854
+
1855
+ expect(tileManager.getIds()).toEqual([
1856
+ new OverscaledTileID(1, 0, 1, 1, 1).key,
1857
+ new OverscaledTileID(1, 0, 1, 0, 1).key,
1858
+ new OverscaledTileID(1, 0, 1, 1, 0).key,
1859
+ new OverscaledTileID(1, 0, 1, 0, 0).key
1860
+ ]);
1818
1861
  });
1819
1862
 
1820
1863
  test('globe wrap', async () => {
@@ -2255,7 +2298,7 @@ describe('tile manager loaded', () => {
2255
2298
  tileManager.update(tr);
2256
2299
 
2257
2300
  await sourceLoadedPromise;
2258
- expect(spy.mock.calls.length).toBe(5); // 4 tiles + 1 source loaded
2301
+ expect(spy).toHaveBeenCalledTimes(5); // 4 tiles + 1 source loaded
2259
2302
  });
2260
2303
 
2261
2304
  test('TileManager.loaded (tiles outside bounds, idle)', async () => {
@@ -2286,10 +2329,8 @@ describe('tile manager loaded', () => {
2286
2329
  const sourceLoadedPromise = waitForEvent(tileManager, 'data', () => tileManager.loaded());
2287
2330
 
2288
2331
  tileManager.on('data', (e) => {
2289
- if (e.sourceDataType !== 'idle') {
2290
- expect(tileManager.loaded()).toBeFalsy();
2291
- // 'idle' emission when source bounds are outside of viewport bounds
2292
- }
2332
+ if (e.sourceDataType === 'idle') return;
2333
+ expect(tileManager.loaded()).toBe(false);
2293
2334
  });
2294
2335
 
2295
2336
  tileManager.onAdd(undefined);
@@ -2490,7 +2531,7 @@ describe('TileManager::refreshTiles', () => {
2490
2531
 
2491
2532
  tileManager._addTile(coord);
2492
2533
  tileManager.refreshTiles([new CanonicalTileID(1, 0, 1)]);
2493
- expect(spy).toHaveBeenCalledOnce();
2534
+ expect(spy).toHaveBeenCalledTimes(1);
2494
2535
  expect(spy.mock.calls[0][1]).toBe('expired');
2495
2536
  });
2496
2537
 
@@ -2521,7 +2562,7 @@ describe('TileManager::refreshTiles', () => {
2521
2562
 
2522
2563
  tileManager._addTile(coord);
2523
2564
  tileManager.refreshTiles([new CanonicalTileID(1, 0, 1)]);
2524
- expect(spy).toHaveBeenCalledOnce();
2565
+ expect(spy).toHaveBeenCalledTimes(1);
2525
2566
  expect(spy.mock.calls[0][1]).toBe('expired');
2526
2567
  });
2527
2568
 
@@ -2537,7 +2578,7 @@ describe('TileManager::refreshTiles', () => {
2537
2578
 
2538
2579
  tileManager._addTile(coord);
2539
2580
  tileManager.refreshTiles([new CanonicalTileID(1, 0, 1)]);
2540
- expect(spy).toHaveBeenCalledOnce();
2581
+ expect(spy).toHaveBeenCalledTimes(1);
2541
2582
  expect(spy.mock.calls[0][1]).toBe('expired');
2542
2583
  });
2543
2584
 
@@ -253,7 +253,7 @@ export class TileManager extends Evented {
253
253
 
254
254
  /**
255
255
  * Reload tiles based on the current state of the source.
256
- * @param sourceDataChanged - If `true`, reload all tiles using a state of 'expired', otherwise reload only non-errored tiles using state of 'reloading'.
256
+ * @param sourceDataChanged - If `true`, reload all tiles using a state of 'expired' (errored tiles use 'loading' since they have nothing to show yet), otherwise reload only non-errored tiles using state of 'reloading'.
257
257
  * @param shouldReloadTileOptions - Set of options associated with a `MapSourceDataChangedEvent` that can be passed back to the associated `Source` determine whether a tile should be reloaded.
258
258
  */
259
259
  reload(
@@ -272,7 +272,7 @@ export class TileManager extends Evented {
272
272
  if (shouldReloadTileOptions && !this._source.shouldReloadTile(tile, shouldReloadTileOptions)) {
273
273
  continue;
274
274
  } else if (sourceDataChanged) {
275
- this._reloadTile(id, 'expired');
275
+ this._reloadTile(id, tile.state === 'errored' ? 'loading' : 'expired');
276
276
  } else if (tile.state !== 'errored') {
277
277
  this._reloadTile(id, 'reloading');
278
278
  }
@@ -81,7 +81,7 @@ describe('InViewTiles', () => {
81
81
  inViewTiles.handleWrapJump(1);
82
82
 
83
83
  const tiles = inViewTiles.getAllTiles();
84
- expect(tiles.length).toBe(1);
84
+ expect(tiles).toHaveLength(1);
85
85
  expect(tiles[0].tileID.wrap).toBe(1);
86
86
  expect(inViewTiles.getTileById(tiles[0].tileID.key)).toBe(tiles[0]);
87
87
  });
@@ -96,7 +96,7 @@ describe('InViewTiles', () => {
96
96
  inViewTiles.handleWrapJump(-1);
97
97
 
98
98
  const tiles = inViewTiles.getAllTiles();
99
- expect(tiles.length).toBe(2);
99
+ expect(tiles).toHaveLength(2);
100
100
 
101
101
  const updatedTile1 = tiles.find(t => t.uid === tile1.uid);
102
102
  const updatedTile2 = tiles.find(t => t.uid === tile2.uid);