@scoova/mgl 1.0.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 (565) hide show
  1. package/LICENSE.txt +116 -0
  2. package/README.md +174 -0
  3. package/build/banner.ts +12 -0
  4. package/build/bump-version-changelog.js +26 -0
  5. package/build/check-bundle-size.js +77 -0
  6. package/build/generate-dist-package.js +26 -0
  7. package/build/generate-doc-images.ts +78 -0
  8. package/build/generate-docs.ts +190 -0
  9. package/build/generate-shaders.ts +68 -0
  10. package/build/generate-struct-arrays.ts +438 -0
  11. package/build/generate-style-code.ts +283 -0
  12. package/build/readme.md +56 -0
  13. package/build/release-notes.js +45 -0
  14. package/build/rollup/bundle_prelude.js +29 -0
  15. package/build/rollup/maplibregl.js +22 -0
  16. package/build/rollup_plugins.ts +58 -0
  17. package/dist/LICENSE.txt +116 -0
  18. package/dist/maplibre-gl.css +1 -0
  19. package/dist/maplibre-gl.d.ts +13304 -0
  20. package/dist/maplibre-gl.js +59 -0
  21. package/dist/maplibre-gl.js.map +1 -0
  22. package/dist/package.json +1 -0
  23. package/package.json +192 -0
  24. package/src/css/maplibre-gl.css +854 -0
  25. package/src/css/svg/maplibregl-ctrl-attrib.svg +3 -0
  26. package/src/css/svg/maplibregl-ctrl-compass.svg +4 -0
  27. package/src/css/svg/maplibregl-ctrl-fullscreen.svg +3 -0
  28. package/src/css/svg/maplibregl-ctrl-geolocate.svg +5 -0
  29. package/src/css/svg/maplibregl-ctrl-logo.svg +11 -0
  30. package/src/css/svg/maplibregl-ctrl-shrink.svg +3 -0
  31. package/src/css/svg/maplibregl-ctrl-terrain.svg +3 -0
  32. package/src/css/svg/maplibregl-ctrl-zoom-in.svg +3 -0
  33. package/src/css/svg/maplibregl-ctrl-zoom-out.svg +3 -0
  34. package/src/data/array_types.g.ts +1130 -0
  35. package/src/data/bucket/circle_attributes.ts +8 -0
  36. package/src/data/bucket/circle_bucket.ts +197 -0
  37. package/src/data/bucket/fill_attributes.ts +8 -0
  38. package/src/data/bucket/fill_bucket.test.ts +95 -0
  39. package/src/data/bucket/fill_bucket.ts +228 -0
  40. package/src/data/bucket/fill_extrusion_attributes.ts +13 -0
  41. package/src/data/bucket/fill_extrusion_bucket.ts +305 -0
  42. package/src/data/bucket/heatmap_bucket.ts +12 -0
  43. package/src/data/bucket/line_attributes.ts +8 -0
  44. package/src/data/bucket/line_attributes_ext.ts +8 -0
  45. package/src/data/bucket/line_bucket.test.ts +142 -0
  46. package/src/data/bucket/line_bucket.ts +592 -0
  47. package/src/data/bucket/pattern_attributes.ts +9 -0
  48. package/src/data/bucket/pattern_bucket_features.ts +57 -0
  49. package/src/data/bucket/symbol_attributes.ts +122 -0
  50. package/src/data/bucket/symbol_bucket.test.ts +243 -0
  51. package/src/data/bucket/symbol_bucket.ts +975 -0
  52. package/src/data/bucket.ts +123 -0
  53. package/src/data/dem_data.test.ts +237 -0
  54. package/src/data/dem_data.ts +171 -0
  55. package/src/data/evaluation_feature.ts +18 -0
  56. package/src/data/extent.ts +13 -0
  57. package/src/data/feature_index.ts +337 -0
  58. package/src/data/feature_position_map.test.ts +33 -0
  59. package/src/data/feature_position_map.ts +126 -0
  60. package/src/data/index_array_type.ts +9 -0
  61. package/src/data/load_geometry.test.ts +49 -0
  62. package/src/data/load_geometry.ts +44 -0
  63. package/src/data/pos3d_attributes.ts +5 -0
  64. package/src/data/pos_attributes.ts +5 -0
  65. package/src/data/program_configuration.ts +735 -0
  66. package/src/data/raster_bounds_attributes.ts +6 -0
  67. package/src/data/segment.ts +89 -0
  68. package/src/geo/edge_insets.test.ts +83 -0
  69. package/src/geo/edge_insets.ts +146 -0
  70. package/src/geo/lng_lat.test.ts +65 -0
  71. package/src/geo/lng_lat.ts +169 -0
  72. package/src/geo/lng_lat_bounds.test.ts +357 -0
  73. package/src/geo/lng_lat_bounds.ts +356 -0
  74. package/src/geo/mercator_coordinate.test.ts +34 -0
  75. package/src/geo/mercator_coordinate.ts +157 -0
  76. package/src/geo/projection/projection.ts +72 -0
  77. package/src/geo/transform.test.ts +509 -0
  78. package/src/geo/transform.ts +1072 -0
  79. package/src/gl/color_mode.ts +31 -0
  80. package/src/gl/context.ts +321 -0
  81. package/src/gl/cull_face_mode.ts +22 -0
  82. package/src/gl/depth_mode.ts +26 -0
  83. package/src/gl/framebuffer.ts +48 -0
  84. package/src/gl/index_buffer.ts +55 -0
  85. package/src/gl/render_pool.test.ts +69 -0
  86. package/src/gl/render_pool.ts +93 -0
  87. package/src/gl/state.test.ts +125 -0
  88. package/src/gl/stencil_mode.ts +27 -0
  89. package/src/gl/types.ts +59 -0
  90. package/src/gl/value.ts +534 -0
  91. package/src/gl/vertex_buffer.test.ts +57 -0
  92. package/src/gl/vertex_buffer.ts +111 -0
  93. package/src/gl/webgl2.ts +12 -0
  94. package/src/index.test.ts +121 -0
  95. package/src/index.ts +250 -0
  96. package/src/render/draw_background.ts +53 -0
  97. package/src/render/draw_circle.ts +113 -0
  98. package/src/render/draw_collision_debug.ts +168 -0
  99. package/src/render/draw_custom.test.ts +73 -0
  100. package/src/render/draw_custom.ts +45 -0
  101. package/src/render/draw_debug.test.ts +122 -0
  102. package/src/render/draw_debug.ts +148 -0
  103. package/src/render/draw_fill.test.ts +137 -0
  104. package/src/render/draw_fill.ts +128 -0
  105. package/src/render/draw_fill_extrusion.ts +97 -0
  106. package/src/render/draw_heatmap.ts +228 -0
  107. package/src/render/draw_hillshade.ts +119 -0
  108. package/src/render/draw_line.ts +125 -0
  109. package/src/render/draw_raster.ts +133 -0
  110. package/src/render/draw_sky.ts +44 -0
  111. package/src/render/draw_symbol.test.ts +223 -0
  112. package/src/render/draw_symbol.ts +499 -0
  113. package/src/render/draw_terrain.ts +99 -0
  114. package/src/render/glyph_atlas.ts +83 -0
  115. package/src/render/glyph_manager.test.ts +147 -0
  116. package/src/render/glyph_manager.ts +198 -0
  117. package/src/render/image_atlas.ts +159 -0
  118. package/src/render/image_manager.ts +337 -0
  119. package/src/render/line_atlas.test.ts +38 -0
  120. package/src/render/line_atlas.ts +214 -0
  121. package/src/render/mesh.ts +25 -0
  122. package/src/render/painter.test.ts +51 -0
  123. package/src/render/painter.ts +666 -0
  124. package/src/render/program/background_program.ts +100 -0
  125. package/src/render/program/circle_program.ts +61 -0
  126. package/src/render/program/clipping_mask_program.ts +19 -0
  127. package/src/render/program/collision_program.ts +47 -0
  128. package/src/render/program/debug_program.ts +29 -0
  129. package/src/render/program/fill_extrusion_program.ts +120 -0
  130. package/src/render/program/fill_program.ts +121 -0
  131. package/src/render/program/heatmap_program.ts +76 -0
  132. package/src/render/program/hillshade_program.ts +116 -0
  133. package/src/render/program/line_program.ts +207 -0
  134. package/src/render/program/pattern.ts +102 -0
  135. package/src/render/program/program_uniforms.ts +46 -0
  136. package/src/render/program/raster_program.ts +88 -0
  137. package/src/render/program/sky_program.ts +28 -0
  138. package/src/render/program/symbol_program.ts +266 -0
  139. package/src/render/program/terrain_program.ts +116 -0
  140. package/src/render/program.ts +233 -0
  141. package/src/render/render_to_texture.test.ts +151 -0
  142. package/src/render/render_to_texture.ts +197 -0
  143. package/src/render/terrain.test.ts +322 -0
  144. package/src/render/terrain.ts +464 -0
  145. package/src/render/texture.ts +114 -0
  146. package/src/render/uniform_binding.test.ts +122 -0
  147. package/src/render/uniform_binding.ts +157 -0
  148. package/src/render/update_pattern_positions_in_program.test.ts +74 -0
  149. package/src/render/update_pattern_positions_in_program.ts +50 -0
  150. package/src/render/vertex_array_object.ts +163 -0
  151. package/src/shaders/README.md +42 -0
  152. package/src/shaders/_prelude.fragment.glsl +19 -0
  153. package/src/shaders/_prelude.fragment.glsl.g.ts +2 -0
  154. package/src/shaders/_prelude.vertex.glsl +148 -0
  155. package/src/shaders/_prelude.vertex.glsl.g.ts +2 -0
  156. package/src/shaders/background.fragment.glsl +10 -0
  157. package/src/shaders/background.fragment.glsl.g.ts +2 -0
  158. package/src/shaders/background.vertex.glsl +7 -0
  159. package/src/shaders/background.vertex.glsl.g.ts +2 -0
  160. package/src/shaders/background_pattern.fragment.glsl +28 -0
  161. package/src/shaders/background_pattern.fragment.glsl.g.ts +2 -0
  162. package/src/shaders/background_pattern.vertex.glsl +19 -0
  163. package/src/shaders/background_pattern.vertex.glsl.g.ts +2 -0
  164. package/src/shaders/circle.fragment.glsl +34 -0
  165. package/src/shaders/circle.fragment.glsl.g.ts +2 -0
  166. package/src/shaders/circle.vertex.glsl +68 -0
  167. package/src/shaders/circle.vertex.glsl.g.ts +2 -0
  168. package/src/shaders/clipping_mask.fragment.glsl +3 -0
  169. package/src/shaders/clipping_mask.fragment.glsl.g.ts +2 -0
  170. package/src/shaders/clipping_mask.vertex.glsl +7 -0
  171. package/src/shaders/clipping_mask.vertex.glsl.g.ts +2 -0
  172. package/src/shaders/collision_box.fragment.glsl +20 -0
  173. package/src/shaders/collision_box.fragment.glsl.g.ts +2 -0
  174. package/src/shaders/collision_box.vertex.glsl +27 -0
  175. package/src/shaders/collision_box.vertex.glsl.g.ts +2 -0
  176. package/src/shaders/collision_circle.fragment.glsl +17 -0
  177. package/src/shaders/collision_circle.fragment.glsl.g.ts +2 -0
  178. package/src/shaders/collision_circle.vertex.glsl +59 -0
  179. package/src/shaders/collision_circle.vertex.glsl.g.ts +2 -0
  180. package/src/shaders/debug.fragment.glsl +9 -0
  181. package/src/shaders/debug.fragment.glsl.g.ts +2 -0
  182. package/src/shaders/debug.vertex.glsl +12 -0
  183. package/src/shaders/debug.vertex.glsl.g.ts +2 -0
  184. package/src/shaders/encode_attribute.test.ts +11 -0
  185. package/src/shaders/encode_attribute.ts +13 -0
  186. package/src/shaders/fill.fragment.glsl +13 -0
  187. package/src/shaders/fill.fragment.glsl.g.ts +2 -0
  188. package/src/shaders/fill.vertex.glsl +13 -0
  189. package/src/shaders/fill.vertex.glsl.g.ts +2 -0
  190. package/src/shaders/fill_extrusion.fragment.glsl +9 -0
  191. package/src/shaders/fill_extrusion.fragment.glsl.g.ts +2 -0
  192. package/src/shaders/fill_extrusion.vertex.glsl +84 -0
  193. package/src/shaders/fill_extrusion.vertex.glsl.g.ts +2 -0
  194. package/src/shaders/fill_extrusion_pattern.fragment.glsl +47 -0
  195. package/src/shaders/fill_extrusion_pattern.fragment.glsl.g.ts +2 -0
  196. package/src/shaders/fill_extrusion_pattern.vertex.glsl +96 -0
  197. package/src/shaders/fill_extrusion_pattern.vertex.glsl.g.ts +2 -0
  198. package/src/shaders/fill_outline.fragment.glsl +17 -0
  199. package/src/shaders/fill_outline.fragment.glsl.g.ts +2 -0
  200. package/src/shaders/fill_outline.vertex.glsl +17 -0
  201. package/src/shaders/fill_outline.vertex.glsl.g.ts +2 -0
  202. package/src/shaders/fill_outline_pattern.fragment.glsl +43 -0
  203. package/src/shaders/fill_outline_pattern.fragment.glsl.g.ts +2 -0
  204. package/src/shaders/fill_outline_pattern.vertex.glsl +44 -0
  205. package/src/shaders/fill_outline_pattern.vertex.glsl.g.ts +2 -0
  206. package/src/shaders/fill_pattern.fragment.glsl +39 -0
  207. package/src/shaders/fill_pattern.fragment.glsl.g.ts +2 -0
  208. package/src/shaders/fill_pattern.vertex.glsl +39 -0
  209. package/src/shaders/fill_pattern.vertex.glsl.g.ts +2 -0
  210. package/src/shaders/heatmap.fragment.glsl +22 -0
  211. package/src/shaders/heatmap.fragment.glsl.g.ts +2 -0
  212. package/src/shaders/heatmap.vertex.glsl +54 -0
  213. package/src/shaders/heatmap.vertex.glsl.g.ts +2 -0
  214. package/src/shaders/heatmap_texture.fragment.glsl +15 -0
  215. package/src/shaders/heatmap_texture.fragment.glsl.g.ts +2 -0
  216. package/src/shaders/heatmap_texture.vertex.glsl +11 -0
  217. package/src/shaders/heatmap_texture.vertex.glsl.g.ts +2 -0
  218. package/src/shaders/hillshade.fragment.glsl +52 -0
  219. package/src/shaders/hillshade.fragment.glsl.g.ts +2 -0
  220. package/src/shaders/hillshade.vertex.glsl +11 -0
  221. package/src/shaders/hillshade.vertex.glsl.g.ts +2 -0
  222. package/src/shaders/hillshade_prepare.fragment.glsl +77 -0
  223. package/src/shaders/hillshade_prepare.fragment.glsl.g.ts +2 -0
  224. package/src/shaders/hillshade_prepare.vertex.glsl +15 -0
  225. package/src/shaders/hillshade_prepare.vertex.glsl.g.ts +2 -0
  226. package/src/shaders/line.fragment.glsl +30 -0
  227. package/src/shaders/line.fragment.glsl.g.ts +2 -0
  228. package/src/shaders/line.vertex.glsl +89 -0
  229. package/src/shaders/line.vertex.glsl.g.ts +2 -0
  230. package/src/shaders/line_gradient.fragment.glsl +34 -0
  231. package/src/shaders/line_gradient.fragment.glsl.g.ts +2 -0
  232. package/src/shaders/line_gradient.vertex.glsl +92 -0
  233. package/src/shaders/line_gradient.vertex.glsl.g.ts +2 -0
  234. package/src/shaders/line_pattern.fragment.glsl +77 -0
  235. package/src/shaders/line_pattern.fragment.glsl.g.ts +2 -0
  236. package/src/shaders/line_pattern.vertex.glsl +103 -0
  237. package/src/shaders/line_pattern.vertex.glsl.g.ts +2 -0
  238. package/src/shaders/line_sdf.fragment.glsl +45 -0
  239. package/src/shaders/line_sdf.fragment.glsl.g.ts +2 -0
  240. package/src/shaders/line_sdf.vertex.glsl +101 -0
  241. package/src/shaders/line_sdf.vertex.glsl.g.ts +2 -0
  242. package/src/shaders/raster.fragment.glsl +53 -0
  243. package/src/shaders/raster.fragment.glsl.g.ts +2 -0
  244. package/src/shaders/raster.vertex.glsl +21 -0
  245. package/src/shaders/raster.vertex.glsl.g.ts +2 -0
  246. package/src/shaders/shaders.ts +197 -0
  247. package/src/shaders/sky.fragment.glsl +17 -0
  248. package/src/shaders/sky.fragment.glsl.g.ts +2 -0
  249. package/src/shaders/sky.vertex.glsl +5 -0
  250. package/src/shaders/sky.vertex.glsl.g.ts +2 -0
  251. package/src/shaders/symbol_icon.fragment.glsl +17 -0
  252. package/src/shaders/symbol_icon.fragment.glsl.g.ts +2 -0
  253. package/src/shaders/symbol_icon.vertex.glsl +117 -0
  254. package/src/shaders/symbol_icon.vertex.glsl.g.ts +2 -0
  255. package/src/shaders/symbol_sdf.fragment.glsl +58 -0
  256. package/src/shaders/symbol_sdf.fragment.glsl.g.ts +2 -0
  257. package/src/shaders/symbol_sdf.vertex.glsl +142 -0
  258. package/src/shaders/symbol_sdf.vertex.glsl.g.ts +2 -0
  259. package/src/shaders/symbol_text_and_icon.fragment.glsl +68 -0
  260. package/src/shaders/symbol_text_and_icon.fragment.glsl.g.ts +2 -0
  261. package/src/shaders/symbol_text_and_icon.vertex.glsl +140 -0
  262. package/src/shaders/symbol_text_and_icon.vertex.glsl.g.ts +2 -0
  263. package/src/shaders/terrain.fragment.glsl +32 -0
  264. package/src/shaders/terrain.fragment.glsl.g.ts +2 -0
  265. package/src/shaders/terrain.vertex.glsl +17 -0
  266. package/src/shaders/terrain.vertex.glsl.g.ts +2 -0
  267. package/src/shaders/terrain_coords.fragment.glsl +11 -0
  268. package/src/shaders/terrain_coords.fragment.glsl.g.ts +2 -0
  269. package/src/shaders/terrain_coords.vertex.glsl +13 -0
  270. package/src/shaders/terrain_coords.vertex.glsl.g.ts +2 -0
  271. package/src/shaders/terrain_depth.fragment.glsl +15 -0
  272. package/src/shaders/terrain_depth.fragment.glsl.g.ts +2 -0
  273. package/src/shaders/terrain_depth.vertex.glsl +13 -0
  274. package/src/shaders/terrain_depth.vertex.glsl.g.ts +2 -0
  275. package/src/source/canvas_source.test.ts +210 -0
  276. package/src/source/canvas_source.ts +227 -0
  277. package/src/source/geojson_source.test.ts +492 -0
  278. package/src/source/geojson_source.ts +431 -0
  279. package/src/source/geojson_source_diff.test.ts +364 -0
  280. package/src/source/geojson_source_diff.ts +172 -0
  281. package/src/source/geojson_worker_source.test.ts +399 -0
  282. package/src/source/geojson_worker_source.ts +303 -0
  283. package/src/source/geojson_wrapper.test.ts +32 -0
  284. package/src/source/geojson_wrapper.ts +81 -0
  285. package/src/source/image_source.test.ts +235 -0
  286. package/src/source/image_source.ts +338 -0
  287. package/src/source/load_tilejson.ts +47 -0
  288. package/src/source/pixels_to_tile_units.ts +25 -0
  289. package/src/source/protocol_crud.ts +48 -0
  290. package/src/source/query_features.test.ts +31 -0
  291. package/src/source/query_features.ts +252 -0
  292. package/src/source/raster_dem_tile_source.test.ts +158 -0
  293. package/src/source/raster_dem_tile_source.ts +166 -0
  294. package/src/source/raster_dem_tile_worker_source.test.ts +36 -0
  295. package/src/source/raster_dem_tile_worker_source.ts +38 -0
  296. package/src/source/raster_tile_source.test.ts +206 -0
  297. package/src/source/raster_tile_source.ts +227 -0
  298. package/src/source/rtl_text_plugin_main_thread.test.ts +170 -0
  299. package/src/source/rtl_text_plugin_main_thread.ts +89 -0
  300. package/src/source/rtl_text_plugin_status.ts +33 -0
  301. package/src/source/rtl_text_plugin_worker.ts +49 -0
  302. package/src/source/source.test.ts +41 -0
  303. package/src/source/source.ts +186 -0
  304. package/src/source/source_cache.test.ts +2069 -0
  305. package/src/source/source_cache.ts +1102 -0
  306. package/src/source/source_state.ts +157 -0
  307. package/src/source/terrain_source_cache.test.ts +105 -0
  308. package/src/source/terrain_source_cache.ts +204 -0
  309. package/src/source/tile.test.ts +290 -0
  310. package/src/source/tile.ts +478 -0
  311. package/src/source/tile_bounds.ts +34 -0
  312. package/src/source/tile_cache.test.ts +130 -0
  313. package/src/source/tile_cache.ts +208 -0
  314. package/src/source/tile_id.test.ts +112 -0
  315. package/src/source/tile_id.ts +221 -0
  316. package/src/source/vector_tile_source.test.ts +401 -0
  317. package/src/source/vector_tile_source.ts +283 -0
  318. package/src/source/vector_tile_worker_source.test.ts +396 -0
  319. package/src/source/vector_tile_worker_source.ts +199 -0
  320. package/src/source/video_source.test.ts +124 -0
  321. package/src/source/video_source.ts +204 -0
  322. package/src/source/worker.test.ts +233 -0
  323. package/src/source/worker.ts +301 -0
  324. package/src/source/worker_source.ts +117 -0
  325. package/src/source/worker_tile.test.ts +226 -0
  326. package/src/source/worker_tile.ts +208 -0
  327. package/src/style/create_style_layer.ts +39 -0
  328. package/src/style/evaluation_parameters.ts +62 -0
  329. package/src/style/format_section_override.test.ts +62 -0
  330. package/src/style/format_section_override.ts +50 -0
  331. package/src/style/light.test.ts +86 -0
  332. package/src/style/light.ts +135 -0
  333. package/src/style/load_glyph_range.test.ts +40 -0
  334. package/src/style/load_glyph_range.ts +32 -0
  335. package/src/style/load_sprite.test.ts +227 -0
  336. package/src/style/load_sprite.ts +71 -0
  337. package/src/style/parse_glyph_pbf.ts +42 -0
  338. package/src/style/pauseable_placement.ts +138 -0
  339. package/src/style/properties.ts +726 -0
  340. package/src/style/query_utils.test.ts +107 -0
  341. package/src/style/query_utils.ts +70 -0
  342. package/src/style/sky.ts +127 -0
  343. package/src/style/style.test.ts +2654 -0
  344. package/src/style/style.ts +1814 -0
  345. package/src/style/style_glyph.ts +25 -0
  346. package/src/style/style_image.ts +188 -0
  347. package/src/style/style_layer/background_style_layer.ts +17 -0
  348. package/src/style/style_layer/background_style_layer_properties.g.ts +40 -0
  349. package/src/style/style_layer/circle_style_layer.ts +98 -0
  350. package/src/style/style_layer/circle_style_layer_properties.g.ts +76 -0
  351. package/src/style/style_layer/custom_style_layer.ts +233 -0
  352. package/src/style/style_layer/fill_extrusion_style_layer.ts +224 -0
  353. package/src/style/style_layer/fill_extrusion_style_layer_properties.g.ts +55 -0
  354. package/src/style/style_layer/fill_style_layer.test.ts +37 -0
  355. package/src/style/style_layer/fill_style_layer.ts +65 -0
  356. package/src/style/style_layer/fill_style_layer_properties.g.ts +64 -0
  357. package/src/style/style_layer/heatmap_style_layer.ts +74 -0
  358. package/src/style/style_layer/heatmap_style_layer_properties.g.ts +46 -0
  359. package/src/style/style_layer/hillshade_style_layer.ts +21 -0
  360. package/src/style/style_layer/hillshade_style_layer_properties.g.ts +49 -0
  361. package/src/style/style_layer/line_style_layer.test.ts +50 -0
  362. package/src/style/style_layer/line_style_layer.ts +131 -0
  363. package/src/style/style_layer/line_style_layer_properties.g.ts +88 -0
  364. package/src/style/style_layer/overlap_mode.test.ts +57 -0
  365. package/src/style/style_layer/overlap_mode.ts +25 -0
  366. package/src/style/style_layer/raster_style_layer.ts +17 -0
  367. package/src/style/style_layer/raster_style_layer_properties.g.ts +55 -0
  368. package/src/style/style_layer/symbol_style_layer.ts +195 -0
  369. package/src/style/style_layer/symbol_style_layer_properties.g.ts +218 -0
  370. package/src/style/style_layer/typed_style_layer.ts +9 -0
  371. package/src/style/style_layer/variable_text_anchor.test.ts +117 -0
  372. package/src/style/style_layer/variable_text_anchor.ts +163 -0
  373. package/src/style/style_layer.test.ts +372 -0
  374. package/src/style/style_layer.ts +287 -0
  375. package/src/style/style_layer_index.test.ts +99 -0
  376. package/src/style/style_layer_index.ts +78 -0
  377. package/src/style/validate_style.ts +53 -0
  378. package/src/style/zoom_history.ts +40 -0
  379. package/src/symbol/anchor.test.ts +14 -0
  380. package/src/symbol/anchor.ts +22 -0
  381. package/src/symbol/check_max_angle.test.ts +54 -0
  382. package/src/symbol/check_max_angle.ts +76 -0
  383. package/src/symbol/clip_line.test.ts +154 -0
  384. package/src/symbol/clip_line.ts +66 -0
  385. package/src/symbol/collision_feature.test.ts +98 -0
  386. package/src/symbol/collision_feature.ts +114 -0
  387. package/src/symbol/collision_index.test.ts +19 -0
  388. package/src/symbol/collision_index.ts +618 -0
  389. package/src/symbol/cross_tile_symbol_index.test.ts +260 -0
  390. package/src/symbol/cross_tile_symbol_index.ts +367 -0
  391. package/src/symbol/get_anchors.test.ts +113 -0
  392. package/src/symbol/get_anchors.ts +167 -0
  393. package/src/symbol/grid_index.test.ts +75 -0
  394. package/src/symbol/grid_index.ts +414 -0
  395. package/src/symbol/merge_lines.test.ts +30 -0
  396. package/src/symbol/merge_lines.ts +80 -0
  397. package/src/symbol/one_em.ts +3 -0
  398. package/src/symbol/opacity_state.ts +23 -0
  399. package/src/symbol/path_interpolator.test.ts +134 -0
  400. package/src/symbol/path_interpolator.ts +55 -0
  401. package/src/symbol/placement.ts +1371 -0
  402. package/src/symbol/projection.test.ts +171 -0
  403. package/src/symbol/projection.ts +833 -0
  404. package/src/symbol/quads.test.ts +157 -0
  405. package/src/symbol/quads.ts +349 -0
  406. package/src/symbol/shaping.test.ts +360 -0
  407. package/src/symbol/shaping.ts +911 -0
  408. package/src/symbol/symbol_layout.ts +739 -0
  409. package/src/symbol/symbol_size.ts +129 -0
  410. package/src/symbol/symbol_style_layer.test.ts +103 -0
  411. package/src/symbol/transform_text.ts +27 -0
  412. package/src/ui/anchor.ts +27 -0
  413. package/src/ui/camera.test.ts +2301 -0
  414. package/src/ui/camera.ts +1520 -0
  415. package/src/ui/control/attribution_control.test.ts +543 -0
  416. package/src/ui/control/attribution_control.ts +209 -0
  417. package/src/ui/control/control.ts +67 -0
  418. package/src/ui/control/fullscreen_control.test.ts +114 -0
  419. package/src/ui/control/fullscreen_control.ts +189 -0
  420. package/src/ui/control/geolocate_control.test.ts +619 -0
  421. package/src/ui/control/geolocate_control.ts +725 -0
  422. package/src/ui/control/logo_control.test.ts +88 -0
  423. package/src/ui/control/logo_control.ts +86 -0
  424. package/src/ui/control/navigation_control.test.ts +238 -0
  425. package/src/ui/control/navigation_control.ts +294 -0
  426. package/src/ui/control/scale_control.test.ts +52 -0
  427. package/src/ui/control/scale_control.ts +152 -0
  428. package/src/ui/control/terrain_control.test.ts +58 -0
  429. package/src/ui/control/terrain_control.ts +74 -0
  430. package/src/ui/default_locale.ts +25 -0
  431. package/src/ui/events.ts +758 -0
  432. package/src/ui/handler/box_zoom.test.ts +163 -0
  433. package/src/ui/handler/box_zoom.ts +171 -0
  434. package/src/ui/handler/click_zoom.ts +55 -0
  435. package/src/ui/handler/cooperative_gestures.test.ts +338 -0
  436. package/src/ui/handler/cooperative_gestures.ts +111 -0
  437. package/src/ui/handler/dblclick_zoom.test.ts +151 -0
  438. package/src/ui/handler/drag_handler.ts +174 -0
  439. package/src/ui/handler/drag_move_state_manager.ts +115 -0
  440. package/src/ui/handler/drag_pan.test.ts +487 -0
  441. package/src/ui/handler/drag_rotate.test.ts +859 -0
  442. package/src/ui/handler/handler_util.ts +10 -0
  443. package/src/ui/handler/keyboard.test.ts +235 -0
  444. package/src/ui/handler/keyboard.ts +212 -0
  445. package/src/ui/handler/map_event.test.ts +158 -0
  446. package/src/ui/handler/map_event.ts +161 -0
  447. package/src/ui/handler/mouse.ts +92 -0
  448. package/src/ui/handler/mouse_handler_interface.test.ts +111 -0
  449. package/src/ui/handler/mouse_rotate.test.ts +62 -0
  450. package/src/ui/handler/one_finger_touch_drag.ts +45 -0
  451. package/src/ui/handler/one_finger_touch_drag_handler_interface.test.ts +77 -0
  452. package/src/ui/handler/scroll_zoom.test.ts +382 -0
  453. package/src/ui/handler/scroll_zoom.ts +379 -0
  454. package/src/ui/handler/shim/dblclick_zoom.ts +64 -0
  455. package/src/ui/handler/shim/drag_pan.ts +104 -0
  456. package/src/ui/handler/shim/drag_rotate.ts +76 -0
  457. package/src/ui/handler/shim/two_fingers_touch.ts +112 -0
  458. package/src/ui/handler/tap_drag_zoom.test.ts +113 -0
  459. package/src/ui/handler/tap_drag_zoom.ts +112 -0
  460. package/src/ui/handler/tap_recognizer.ts +138 -0
  461. package/src/ui/handler/tap_zoom.ts +98 -0
  462. package/src/ui/handler/touch_pan.ts +115 -0
  463. package/src/ui/handler/transform-provider.ts +44 -0
  464. package/src/ui/handler/two_fingers_touch.test.ts +283 -0
  465. package/src/ui/handler/two_fingers_touch.ts +336 -0
  466. package/src/ui/handler_inertia.ts +157 -0
  467. package/src/ui/handler_manager.ts +637 -0
  468. package/src/ui/hash.test.ts +404 -0
  469. package/src/ui/hash.ts +153 -0
  470. package/src/ui/map.ts +3393 -0
  471. package/src/ui/map_tests/map_animation.test.ts +61 -0
  472. package/src/ui/map_tests/map_basic.test.ts +223 -0
  473. package/src/ui/map_tests/map_bounds.test.ts +123 -0
  474. package/src/ui/map_tests/map_calculate_camera_options.test.ts +113 -0
  475. package/src/ui/map_tests/map_canvas.test.ts +59 -0
  476. package/src/ui/map_tests/map_control.test.ts +61 -0
  477. package/src/ui/map_tests/map_disable_handlers.test.ts +38 -0
  478. package/src/ui/map_tests/map_events.test.ts +1001 -0
  479. package/src/ui/map_tests/map_feature_state.test.ts +421 -0
  480. package/src/ui/map_tests/map_images.test.ts +175 -0
  481. package/src/ui/map_tests/map_is_moving.test.ts +164 -0
  482. package/src/ui/map_tests/map_is_rotating.test.ts +62 -0
  483. package/src/ui/map_tests/map_is_zooming.test.ts +86 -0
  484. package/src/ui/map_tests/map_layer.test.ts +457 -0
  485. package/src/ui/map_tests/map_options.test.ts +64 -0
  486. package/src/ui/map_tests/map_pitch.test.ts +90 -0
  487. package/src/ui/map_tests/map_pixel_ratio.test.ts +75 -0
  488. package/src/ui/map_tests/map_query_rendered_features.test.ts +93 -0
  489. package/src/ui/map_tests/map_render.test.ts +90 -0
  490. package/src/ui/map_tests/map_request_render_frame.test.ts +51 -0
  491. package/src/ui/map_tests/map_resize.test.ts +120 -0
  492. package/src/ui/map_tests/map_style.test.ts +541 -0
  493. package/src/ui/map_tests/map_terrian.test.ts +104 -0
  494. package/src/ui/map_tests/map_webgl.test.ts +72 -0
  495. package/src/ui/map_tests/map_world_copies.test.ts +103 -0
  496. package/src/ui/map_tests/map_zoom.test.ts +95 -0
  497. package/src/ui/marker.test.ts +1149 -0
  498. package/src/ui/marker.ts +880 -0
  499. package/src/ui/popup.test.ts +827 -0
  500. package/src/ui/popup.ts +717 -0
  501. package/src/util/abort_error.ts +21 -0
  502. package/src/util/actor.test.ts +218 -0
  503. package/src/util/actor.ts +241 -0
  504. package/src/util/actor_messages.ts +149 -0
  505. package/src/util/ajax.test.ts +237 -0
  506. package/src/util/ajax.ts +297 -0
  507. package/src/util/browser.test.ts +23 -0
  508. package/src/util/browser.ts +63 -0
  509. package/src/util/color_ramp.test.ts +105 -0
  510. package/src/util/color_ramp.ts +56 -0
  511. package/src/util/config.ts +29 -0
  512. package/src/util/dictionary_coder.ts +23 -0
  513. package/src/util/dispatcher.test.ts +76 -0
  514. package/src/util/dispatcher.ts +78 -0
  515. package/src/util/dom.ts +135 -0
  516. package/src/util/evented.test.ts +231 -0
  517. package/src/util/evented.ts +178 -0
  518. package/src/util/find_pole_of_inaccessibility.test.ts +21 -0
  519. package/src/util/find_pole_of_inaccessibility.ts +130 -0
  520. package/src/util/geolocation_support.test.ts +43 -0
  521. package/src/util/geolocation_support.ts +23 -0
  522. package/src/util/global_worker_pool.ts +65 -0
  523. package/src/util/image.ts +150 -0
  524. package/src/util/image_request.test.ts +408 -0
  525. package/src/util/image_request.ts +246 -0
  526. package/src/util/intersection_tests.ts +206 -0
  527. package/src/util/is_char_in_unicode_block.test.ts +15 -0
  528. package/src/util/is_char_in_unicode_block.ts +345 -0
  529. package/src/util/offscreen_canvas_distorted.test.ts +13 -0
  530. package/src/util/offscreen_canvas_distorted.ts +39 -0
  531. package/src/util/offscreen_canvas_supported.ts +11 -0
  532. package/src/util/performance.ts +117 -0
  533. package/src/util/primitives.test.ts +140 -0
  534. package/src/util/primitives.ts +143 -0
  535. package/src/util/request_manager.ts +42 -0
  536. package/src/util/resolve_tokens.test.ts +45 -0
  537. package/src/util/resolve_tokens.ts +17 -0
  538. package/src/util/script_detection.test.ts +138 -0
  539. package/src/util/script_detection.ts +376 -0
  540. package/src/util/smart_wrap.test.ts +97 -0
  541. package/src/util/smart_wrap.ts +58 -0
  542. package/src/util/struct_array.test.ts +101 -0
  543. package/src/util/struct_array.ts +246 -0
  544. package/src/util/style.test.ts +34 -0
  545. package/src/util/style.ts +28 -0
  546. package/src/util/task_queue.test.ts +114 -0
  547. package/src/util/task_queue.ts +64 -0
  548. package/src/util/test/util.ts +185 -0
  549. package/src/util/throttle.test.ts +42 -0
  550. package/src/util/throttle.ts +28 -0
  551. package/src/util/throttled_invoker.ts +41 -0
  552. package/src/util/transferable_grid_index.test.ts +56 -0
  553. package/src/util/transferable_grid_index.ts +214 -0
  554. package/src/util/util.test.ts +414 -0
  555. package/src/util/util.ts +724 -0
  556. package/src/util/vectortile_to_geojson.ts +72 -0
  557. package/src/util/verticalize_punctuation.ts +110 -0
  558. package/src/util/web_worker.ts +16 -0
  559. package/src/util/web_worker_transfer.test.ts +153 -0
  560. package/src/util/web_worker_transfer.ts +254 -0
  561. package/src/util/webp_supported.ts +63 -0
  562. package/src/util/worker_pool.test.ts +43 -0
  563. package/src/util/worker_pool.ts +58 -0
  564. package/src/util/world_bounds.test.ts +59 -0
  565. package/src/util/world_bounds.ts +46 -0
@@ -0,0 +1,150 @@
1
+ import {register} from './web_worker_transfer';
2
+
3
+ export type Size = {
4
+ width: number;
5
+ height: number;
6
+ };
7
+
8
+ type Point2D = {
9
+ x: number;
10
+ y: number;
11
+ };
12
+
13
+ function createImage(image: any, {
14
+ width,
15
+ height
16
+ }: Size, channels: number, data?: Uint8Array | Uint8ClampedArray) {
17
+ if (!data) {
18
+ data = new Uint8Array(width * height * channels);
19
+ } else if (data instanceof Uint8ClampedArray) {
20
+ data = new Uint8Array(data.buffer);
21
+ } else if (data.length !== width * height * channels) {
22
+ throw new RangeError(`mismatched image size. expected: ${data.length} but got: ${width * height * channels}`);
23
+ }
24
+ image.width = width;
25
+ image.height = height;
26
+ image.data = data;
27
+ return image;
28
+ }
29
+
30
+ function resizeImage(image: any, {
31
+ width,
32
+ height
33
+ }: Size, channels: number) {
34
+ if (width === image.width && height === image.height) {
35
+ return;
36
+ }
37
+
38
+ const newImage = createImage({}, {width, height}, channels);
39
+
40
+ copyImage(image, newImage, {x: 0, y: 0}, {x: 0, y: 0}, {
41
+ width: Math.min(image.width, width),
42
+ height: Math.min(image.height, height)
43
+ }, channels);
44
+
45
+ image.width = width;
46
+ image.height = height;
47
+ image.data = newImage.data;
48
+ }
49
+
50
+ function copyImage(srcImg: any, dstImg: any, srcPt: Point2D, dstPt: Point2D, size: Size, channels: number) {
51
+ if (size.width === 0 || size.height === 0) {
52
+ return dstImg;
53
+ }
54
+
55
+ if (size.width > srcImg.width ||
56
+ size.height > srcImg.height ||
57
+ srcPt.x > srcImg.width - size.width ||
58
+ srcPt.y > srcImg.height - size.height) {
59
+ throw new RangeError('out of range source coordinates for image copy');
60
+ }
61
+
62
+ if (size.width > dstImg.width ||
63
+ size.height > dstImg.height ||
64
+ dstPt.x > dstImg.width - size.width ||
65
+ dstPt.y > dstImg.height - size.height) {
66
+ throw new RangeError('out of range destination coordinates for image copy');
67
+ }
68
+
69
+ const srcData = srcImg.data;
70
+ const dstData = dstImg.data;
71
+
72
+ if (srcData === dstData) throw new Error('srcData equals dstData, so image is already copied');
73
+
74
+ for (let y = 0; y < size.height; y++) {
75
+ const srcOffset = ((srcPt.y + y) * srcImg.width + srcPt.x) * channels;
76
+ const dstOffset = ((dstPt.y + y) * dstImg.width + dstPt.x) * channels;
77
+ for (let i = 0; i < size.width * channels; i++) {
78
+ dstData[dstOffset + i] = srcData[srcOffset + i];
79
+ }
80
+ }
81
+ return dstImg;
82
+ }
83
+
84
+ /**
85
+ * An image with alpha color value
86
+ */
87
+ export class AlphaImage {
88
+ width: number;
89
+ height: number;
90
+ data: Uint8Array;
91
+
92
+ constructor(size: Size, data?: Uint8Array | Uint8ClampedArray) {
93
+ createImage(this, size, 1, data);
94
+ }
95
+
96
+ resize(size: Size) {
97
+ resizeImage(this, size, 1);
98
+ }
99
+
100
+ clone() {
101
+ return new AlphaImage({width: this.width, height: this.height}, new Uint8Array(this.data));
102
+ }
103
+
104
+ static copy(srcImg: AlphaImage, dstImg: AlphaImage, srcPt: Point2D, dstPt: Point2D, size: Size) {
105
+ copyImage(srcImg, dstImg, srcPt, dstPt, size, 1);
106
+ }
107
+ }
108
+
109
+ /**
110
+ * An object to store image data not premultiplied, because ImageData is not premultiplied.
111
+ * UNPACK_PREMULTIPLY_ALPHA_WEBGL must be used when uploading to a texture.
112
+ */
113
+ export class RGBAImage {
114
+ width: number;
115
+ height: number;
116
+
117
+ /**
118
+ * data must be a Uint8Array instead of Uint8ClampedArray because texImage2D does not support Uint8ClampedArray in all browsers.
119
+ */
120
+ data: Uint8Array;
121
+
122
+ constructor(size: Size, data?: Uint8Array | Uint8ClampedArray) {
123
+ createImage(this, size, 4, data);
124
+ }
125
+
126
+ resize(size: Size) {
127
+ resizeImage(this, size, 4);
128
+ }
129
+
130
+ replace(data: Uint8Array | Uint8ClampedArray, copy?: boolean) {
131
+ if (copy) {
132
+ this.data.set(data);
133
+ } else if (data instanceof Uint8ClampedArray) {
134
+ this.data = new Uint8Array(data.buffer);
135
+ } else {
136
+ this.data = data;
137
+ }
138
+ }
139
+
140
+ clone() {
141
+ return new RGBAImage({width: this.width, height: this.height}, new Uint8Array(this.data));
142
+ }
143
+
144
+ static copy(srcImg: RGBAImage | ImageData, dstImg: RGBAImage, srcPt: Point2D, dstPt: Point2D, size: Size) {
145
+ copyImage(srcImg, dstImg, srcPt, dstPt, size, 4);
146
+ }
147
+ }
148
+
149
+ register('AlphaImage', AlphaImage);
150
+ register('RGBAImage', RGBAImage);
@@ -0,0 +1,408 @@
1
+ import {config} from './config';
2
+ import {webpSupported} from './webp_supported';
3
+ import {sleep, stubAjaxGetImage} from './test/util';
4
+ import {fakeServer, type FakeServer} from 'nise';
5
+ import {ImageRequest} from './image_request';
6
+ import {isAbortError} from './abort_error';
7
+ import * as ajax from './ajax';
8
+
9
+ describe('ImageRequest', () => {
10
+ let server: FakeServer;
11
+ beforeEach(() => {
12
+ global.fetch = null;
13
+ server = fakeServer.create();
14
+ ImageRequest.resetRequestQueue();
15
+ stubAjaxGetImage(undefined);
16
+ });
17
+ afterEach(() => {
18
+ server.restore();
19
+ });
20
+
21
+ test('getImage respects maxParallelImageRequests', async () => {
22
+ server.respondWith(request => request.respond(200, {'Content-Type': 'image/png'}, ''));
23
+
24
+ const maxRequests = config.MAX_PARALLEL_IMAGE_REQUESTS;
25
+
26
+ const promises: Promise<any>[] = [];
27
+ for (let i = 0; i < maxRequests + 5; i++) {
28
+ promises.push(ImageRequest.getImage({url: ''}, new AbortController()));
29
+
30
+ }
31
+ expect(server.requests).toHaveLength(maxRequests);
32
+
33
+ server.requests[0].respond(200);
34
+ await promises[0];
35
+ expect(server.requests).toHaveLength(maxRequests + 1);
36
+ server.requests[1].respond(200);
37
+ await promises[1];
38
+ expect(server.requests).toHaveLength(maxRequests + 2);
39
+ });
40
+
41
+ test('getImage respects maxParallelImageRequests and continues to respond even when server returns 404', async () => {
42
+ server.respondWith(request => request.respond(404));
43
+
44
+ const maxRequests = config.MAX_PARALLEL_IMAGE_REQUESTS;
45
+
46
+ for (let i = 0; i < maxRequests + 5; i++) {
47
+ ImageRequest.getImage({url: ''}, new AbortController()).catch(() => {});
48
+ }
49
+ expect(server.requests).toHaveLength(maxRequests);
50
+ server.respond();
51
+ await sleep(0);
52
+ expect(server.requests).toHaveLength(maxRequests + 5);
53
+ });
54
+
55
+ test('Cancel: getImage cancelling frees up request for maxParallelImageRequests', async () => {
56
+ const maxRequests = config.MAX_PARALLEL_IMAGE_REQUESTS;
57
+
58
+ for (let i = 0; i < maxRequests + 1; i++) {
59
+ const abortController = new AbortController();
60
+ ImageRequest.getImage({url: ''}, abortController).catch((e) => expect(isAbortError(e)).toBeTruthy());
61
+ abortController.abort();
62
+ await sleep(0);
63
+ }
64
+ expect(server.requests).toHaveLength(maxRequests + 1);
65
+ });
66
+
67
+ test('Cancel: getImage requests that were once queued are still abortable', async () => {
68
+ const maxRequests = config.MAX_PARALLEL_IMAGE_REQUESTS;
69
+
70
+ const abortControllers: AbortController[] = [];
71
+ for (let i = 0; i < maxRequests; i++) {
72
+ const abortController = new AbortController();
73
+ abortControllers.push(abortController);
74
+ ImageRequest.getImage({url: ''}, abortController).catch(() => {});
75
+ }
76
+
77
+ // the limit of allowed requests is reached
78
+ expect(server.requests).toHaveLength(maxRequests);
79
+
80
+ const queuedURL = 'this-is-the-queued-request';
81
+ const abortController = new AbortController();
82
+ ImageRequest.getImage({url: queuedURL}, abortController).catch((e) => expect(isAbortError(e)).toBeTruthy());
83
+
84
+ // the new requests is queued because the limit is reached
85
+ expect(server.requests).toHaveLength(maxRequests);
86
+
87
+ // cancel the first request to let the queued request start
88
+ abortControllers[0].abort();
89
+ await sleep(0);
90
+ expect(server.requests).toHaveLength(maxRequests + 1);
91
+
92
+ // abort the previously queued request and confirm that it is aborted
93
+ const queuedRequest = server.requests[server.requests.length - 1];
94
+ expect(queuedRequest.url).toBe(queuedURL);
95
+ expect((queuedRequest as any).aborted).toBeUndefined();
96
+ abortController.abort();
97
+ expect((queuedRequest as any).aborted).toBe(true);
98
+ });
99
+
100
+ test('getImage sends accept/webp when supported', async () => {
101
+ server.respondWith((request) => {
102
+ expect(request.requestHeaders.accept.includes('image/webp')).toBeTruthy();
103
+ request.respond(200, {'Content-Type': 'image/webp'}, '');
104
+ });
105
+
106
+ // mock webp support
107
+ webpSupported.supported = true;
108
+
109
+ const promise = ImageRequest.getImage({url: ''}, new AbortController());
110
+
111
+ server.respond();
112
+
113
+ await expect(promise).resolves.toBeDefined();
114
+ });
115
+
116
+ test('getImage uses createImageBitmap when supported', async () => {
117
+ server.respondWith(request => request.respond(200, {'Content-Type': 'image/png',
118
+ 'Cache-Control': 'cache',
119
+ 'Expires': 'expires'}, ''));
120
+
121
+ stubAjaxGetImage(() => Promise.resolve(new ImageBitmap()));
122
+ const promise = ImageRequest.getImage({url: ''}, new AbortController());
123
+ server.respond();
124
+
125
+ const response = await promise;
126
+
127
+ expect(response.data).toBeInstanceOf(ImageBitmap);
128
+ expect(response.cacheControl).toBe('cache');
129
+ expect(response.expires).toBe('expires');
130
+ });
131
+
132
+ test('getImage using createImageBitmap throws exception', async () => {
133
+ server.respondWith(request => request.respond(200, {'Content-Type': 'image/png',
134
+ 'Cache-Control': 'cache',
135
+ 'Expires': 'expires'}, ''));
136
+
137
+ stubAjaxGetImage(() => Promise.reject(new Error('error')));
138
+
139
+ const promise = ImageRequest.getImage({url: ''}, new AbortController());
140
+
141
+ server.respond();
142
+
143
+ await expect(promise).rejects.toThrow();
144
+ });
145
+
146
+ test('getImage uses HTMLImageElement when createImageBitmap is not supported', async () => {
147
+ const makeRequestSky = jest.spyOn(ajax, 'makeRequest');
148
+ server.respondWith(request => request.respond(200, {'Content-Type': 'image/png',
149
+ 'Cache-Control': 'cache',
150
+ 'Expires': 'expires'}, ''));
151
+
152
+ const promise = ImageRequest.getImage({url: ''}, new AbortController());
153
+
154
+ server.respond();
155
+ expect(makeRequestSky).toHaveBeenCalledTimes(1);
156
+ makeRequestSky.mockClear();
157
+ const response = await promise;
158
+ expect(response.data).toBeInstanceOf(HTMLImageElement);
159
+ expect(response.cacheControl).toBe('cache');
160
+ expect(response.expires).toBe('expires');
161
+ });
162
+
163
+ test('getImage using HTMLImageElement with same-origin credentials', async () => {
164
+ const makeRequestSky = jest.spyOn(ajax, 'makeRequest');
165
+ const promise = ImageRequest.getImage({url: '', credentials: 'same-origin'}, new AbortController(), false);
166
+
167
+ expect(makeRequestSky).toHaveBeenCalledTimes(0);
168
+ makeRequestSky.mockClear();
169
+
170
+ const response = await promise;
171
+
172
+ expect(response.data).toBeInstanceOf(HTMLImageElement);
173
+ expect((response.data as HTMLImageElement).crossOrigin).toBe('anonymous');
174
+ });
175
+
176
+ test('getImage using HTMLImageElement with include credentials', async () => {
177
+ const makeRequestSky = jest.spyOn(ajax, 'makeRequest');
178
+ const promise = ImageRequest.getImage({url: '', credentials: 'include'}, new AbortController(), false);
179
+
180
+ expect(makeRequestSky).toHaveBeenCalledTimes(0);
181
+ makeRequestSky.mockClear();
182
+
183
+ const response = await promise;
184
+
185
+ expect(response.data).toBeInstanceOf(HTMLImageElement);
186
+ expect((response.data as HTMLImageElement).crossOrigin).toBe('use-credentials');
187
+ });
188
+
189
+ test('getImage using HTMLImageElement with accept header', async () => {
190
+ const makeRequestSky = jest.spyOn(ajax, 'makeRequest');
191
+ const promise = ImageRequest.getImage({url: '', credentials: 'include', headers: {accept: 'accept'}}, new AbortController(), false);
192
+
193
+ expect(makeRequestSky).toHaveBeenCalledTimes(0);
194
+ makeRequestSky.mockClear();
195
+
196
+ const response = await promise;
197
+ expect(response.data).toBeInstanceOf(HTMLImageElement);
198
+ expect((response.data as HTMLImageElement).crossOrigin).toBe('use-credentials');
199
+ });
200
+
201
+ test('getImage uses makeRequest when custom Headers are added', () => {
202
+ const makeRequestSky = jest.spyOn(ajax, 'makeRequest');
203
+
204
+ ImageRequest.getImage({url: '', credentials: 'include', headers: {custom: 'test', accept: 'image'}}, new AbortController(), false);
205
+
206
+ expect(makeRequestSky).toHaveBeenCalledTimes(1);
207
+ makeRequestSky.mockClear();
208
+ });
209
+
210
+ test('getImage request returned 404 response for fetch request', async () => {
211
+ server.respondWith(request => request.respond(404));
212
+
213
+ const promise = ImageRequest.getImage({url: ''}, new AbortController());
214
+
215
+ server.respond();
216
+
217
+ await expect(promise).rejects.toThrow('Not Found');
218
+ });
219
+
220
+ test('getImage request failed for HTTPImageRequest', async () => {
221
+ const promise = ImageRequest.getImage({url: 'error'}, new AbortController(), false);
222
+ await expect(promise).rejects.toThrow(/Could not load image.*/);
223
+ });
224
+
225
+ test('Cancel: getImage request cancelled for HTTPImageRequest', async () => {
226
+ let imageUrl;
227
+ const requestUrl = 'test';
228
+ // eslint-disable-next-line accessor-pairs
229
+ Object.defineProperty(global.Image.prototype, 'src', {
230
+ set(url: string) {
231
+ imageUrl = url;
232
+ }
233
+ });
234
+
235
+ const abortController = new AbortController();
236
+ ImageRequest.getImage({url: requestUrl}, abortController, false).catch(() => {});
237
+
238
+ expect(imageUrl).toBe(requestUrl);
239
+ expect(abortController.signal.aborted).toBeFalsy();
240
+ abortController.abort();
241
+ expect(abortController.signal.aborted).toBeTruthy();
242
+ expect(imageUrl).toBe('');
243
+ });
244
+
245
+ test('Cancel: getImage request cancelled', async () => {
246
+ server.respondWith(request => request.respond(200, {'Content-Type': 'image/png',
247
+ 'Cache-Control': 'cache',
248
+ 'Expires': 'expires'}, ''));
249
+
250
+ const abortController = new AbortController();
251
+ let response = false;
252
+ ImageRequest.getImage({url: ''}, abortController)
253
+ .then(() => { response = true; })
254
+ .catch(() => { response = true; });
255
+
256
+ abortController.abort();
257
+
258
+ server.respond();
259
+
260
+ expect(response).toBeFalsy();
261
+ });
262
+
263
+ test('Cancel: Cancellation of an image which has not yet been requested', async () => {
264
+ const maxRequests = config.MAX_PARALLEL_IMAGE_REQUESTS;
265
+
266
+ let callbackCounter = 0;
267
+ const promiseCallback = () => { callbackCounter++; };
268
+
269
+ const abortConstollers: {url: string; abortController: AbortController}[] = [];
270
+ for (let i = 0; i < maxRequests + 100; i++) {
271
+ const url = `${i}`;
272
+ const abortController = new AbortController();
273
+ abortConstollers.push({url, abortController});
274
+ ImageRequest.getImage({url}, abortController).then(promiseCallback).catch(() => {});
275
+ }
276
+
277
+ abortConstollers[0].abortController.abort();
278
+ await sleep(0);
279
+ // Queue should move forward and next request is made
280
+ expect(server.requests).toHaveLength(maxRequests + 1);
281
+
282
+ // Cancel request should not call callback
283
+ expect(callbackCounter).toBe(0);
284
+
285
+ // Cancel request which is not yet issued. It should not fire callback
286
+ const nextRequestInQueue = abortConstollers[server.requests.length];
287
+ const cancelledImageUrl = nextRequestInQueue.url;
288
+ nextRequestInQueue.abortController.abort();
289
+
290
+ // Queue should not move forward as cancelled image was sitting in queue
291
+ expect(server.requests).toHaveLength(maxRequests + 1);
292
+ expect(callbackCounter).toBe(0);
293
+
294
+ // On server response, next image queued should not be the cancelled image
295
+ server.requests[1].respond(200);
296
+ await sleep(0);
297
+ expect(callbackCounter).toBe(1);
298
+ expect(server.requests).toHaveLength(maxRequests + 2);
299
+ // Verify that the last request made skipped the cancelled image request
300
+ expect(server.requests[server.requests.length - 1].url).toBe((parseInt(cancelledImageUrl) + 1).toString());
301
+ });
302
+
303
+ test('throttling: one throttling client will result in throttle behavior for all', () => {
304
+ const maxRequestsPerFrame = config.MAX_PARALLEL_IMAGE_REQUESTS_PER_FRAME;
305
+ const callbackHandles = [];
306
+
307
+ // add one for each
308
+ callbackHandles.push(ImageRequest.addThrottleControl(() => false));
309
+ callbackHandles.push(ImageRequest.addThrottleControl(() => true));
310
+
311
+ let callbackCounter = 0;
312
+ const promiseCallback = () => { callbackCounter++; };
313
+
314
+ for (let i = 0; i < maxRequestsPerFrame + 1; i++) {
315
+ ImageRequest.getImage({url: ''}, new AbortController()).then(promiseCallback);
316
+ }
317
+
318
+ expect(server.requests).toHaveLength(maxRequestsPerFrame);
319
+
320
+ // all pending
321
+ expect(callbackCounter).toBe(0);
322
+
323
+ for (const handle of callbackHandles) {
324
+ ImageRequest.removeThrottleControl(handle);
325
+ }
326
+ });
327
+
328
+ test('throttling: image queue will process MAX_PARALLEL_IMAGE_REQUESTS_PER_FRAME if throttling control returns true', () => {
329
+ const maxRequestsPerFrame = config.MAX_PARALLEL_IMAGE_REQUESTS_PER_FRAME;
330
+ const maxRequests = config.MAX_PARALLEL_IMAGE_REQUESTS;
331
+ const controlId = ImageRequest.addThrottleControl(() => true);
332
+
333
+ let callbackCounter = 0;
334
+ const promiseCallback = () => { callbackCounter++; };
335
+
336
+ for (let i = 0; i < maxRequests; i++) {
337
+ ImageRequest.getImage({url: ''}, new AbortController()).then(promiseCallback);
338
+ }
339
+
340
+ // Should only fire request to a max allowed per frame
341
+ expect(server.requests).toHaveLength(maxRequestsPerFrame);
342
+
343
+ // all pending
344
+ expect(callbackCounter).toBe(0);
345
+
346
+ ImageRequest.removeThrottleControl(controlId);
347
+ });
348
+
349
+ test('throttling: image queue will process MAX_PARALLEL_IMAGE_REQUESTS if throttling control returns false', () => {
350
+ const maxRequests = config.MAX_PARALLEL_IMAGE_REQUESTS;
351
+ const controlId = ImageRequest.addThrottleControl(() => false);
352
+
353
+ let callbackCounter = 0;
354
+ const promiseCallback = () => { callbackCounter++; };
355
+
356
+ for (let i = 0; i < maxRequests + 100; i++) {
357
+ ImageRequest.getImage({url: ''}, new AbortController()).then(promiseCallback);
358
+ }
359
+
360
+ // all should be processed because throttle control is returning false
361
+ expect(server.requests).toHaveLength(maxRequests);
362
+
363
+ // all pending
364
+ expect(callbackCounter).toBe(0);
365
+
366
+ ImageRequest.removeThrottleControl(controlId);
367
+ });
368
+
369
+ test('throttling: removing throttling client will process all requests', async () => {
370
+ const requestParameter = {'Content-Type': 'image/png', url: ''};
371
+ const maxRequestsPerFrame = config.MAX_PARALLEL_IMAGE_REQUESTS_PER_FRAME;
372
+
373
+ // add 10, and one of them is throttling
374
+ const throttlingIndex = 5;
375
+ for (let i = 0; i < 10; i++) {
376
+ const throttlingClient: boolean = (i === throttlingIndex);
377
+ ImageRequest.addThrottleControl(() => throttlingClient);
378
+ }
379
+
380
+ // make 2 times + 1 more requests
381
+ const requestsMade = 2 * maxRequestsPerFrame + 1;
382
+ const completedMap: {[index: number]: boolean} = {};
383
+ for (let i = 0; i < requestsMade; i++) {
384
+ const promise = ImageRequest.getImage(requestParameter, new AbortController());
385
+ promise.catch(() => {});
386
+ promise.then(() => { completedMap[i] = true; });
387
+ }
388
+
389
+ // up to the config value
390
+ expect(server.requests).toHaveLength(maxRequestsPerFrame);
391
+
392
+ const itemIndexToComplete = 6;
393
+ server.requests[itemIndexToComplete].respond(200);
394
+
395
+ // unleash it by removing the throttling client
396
+ ImageRequest.removeThrottleControl(throttlingIndex);
397
+ await sleep(0);
398
+ expect(server.requests).toHaveLength(requestsMade);
399
+
400
+ // all pending
401
+ expect(Object.keys(completedMap)).toHaveLength(1);
402
+
403
+ // everything should still be pending except itemIndexToComplete
404
+ for (let i = 0; i < maxRequestsPerFrame + 1; i++) {
405
+ expect(completedMap[i]).toBe(i === itemIndexToComplete ? true : undefined);
406
+ }
407
+ });
408
+ });