@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,231 @@
1
+ import {Event, Evented} from './evented';
2
+
3
+ describe('Evented', () => {
4
+
5
+ test('calls listeners added with "on"', () => {
6
+ const evented = new Evented();
7
+ const listener = jest.fn();
8
+ evented.on('a', listener);
9
+ evented.fire(new Event('a'));
10
+ evented.fire(new Event('a'));
11
+ expect(listener).toHaveBeenCalledTimes(2);
12
+ });
13
+
14
+ test('calls listeners added with "once" once', () => {
15
+ const evented = new Evented();
16
+ const listener = jest.fn();
17
+ evented.once('a', listener);
18
+ evented.fire(new Event('a'));
19
+ evented.fire(new Event('a'));
20
+ expect(listener).toHaveBeenCalledTimes(1);
21
+ expect(evented.listens('a')).toBeFalsy();
22
+
23
+ });
24
+
25
+ test('returns a promise when no listener is provided to "once" method', async () => {
26
+ const evented = new Evented();
27
+ const promise = evented.once('a');
28
+ evented.fire(new Event('a'));
29
+ evented.fire(new Event('a'));
30
+ await promise;
31
+ expect(evented.listens('a')).toBeFalsy();
32
+
33
+ });
34
+
35
+ test('passes data to listeners', () => {
36
+ const evented = new Evented();
37
+ evented.on('a', (data) => {
38
+ expect(data.foo).toBe('bar');
39
+ });
40
+ evented.fire(new Event('a', {foo: 'bar'}));
41
+
42
+ });
43
+
44
+ test('passes "target" to listeners', () => {
45
+ const evented = new Evented();
46
+ evented.on('a', (data) => {
47
+ expect(data.target).toBe(evented);
48
+ });
49
+ evented.fire(new Event('a'));
50
+
51
+ });
52
+
53
+ test('passes "type" to listeners', () => {
54
+ const evented = new Evented();
55
+ evented.on('a', (data) => {
56
+ expect(data.type).toBe('a');
57
+ });
58
+ evented.fire(new Event('a'));
59
+
60
+ });
61
+
62
+ test('removes listeners with "off"', () => {
63
+ const evented = new Evented();
64
+ const listener = jest.fn();
65
+ evented.on('a', listener);
66
+ evented.off('a', listener);
67
+ evented.fire(new Event('a'));
68
+ expect(listener).not.toHaveBeenCalled();
69
+ });
70
+
71
+ test('removes one-time listeners with "off"', () => {
72
+ const evented = new Evented();
73
+ const listener = jest.fn();
74
+ evented.once('a', listener);
75
+ evented.off('a', listener);
76
+ evented.fire(new Event('a'));
77
+ expect(listener).not.toHaveBeenCalled();
78
+ });
79
+
80
+ test('once listener is removed prior to call', () => {
81
+ const evented = new Evented();
82
+ const listener = jest.fn();
83
+ evented.once('a', () => {
84
+ listener();
85
+ evented.fire(new Event('a'));
86
+ });
87
+ evented.fire(new Event('a'));
88
+ expect(listener).toHaveBeenCalledTimes(1);
89
+ });
90
+
91
+ test('reports if an event has listeners with "listens"', () => {
92
+ const evented = new Evented();
93
+ evented.on('a', () => {});
94
+ expect(evented.listens('a')).toBeTruthy();
95
+ expect(evented.listens('b')).toBeFalsy();
96
+
97
+ });
98
+
99
+ test('does not report true to "listens" if all listeners have been removed', () => {
100
+ const evented = new Evented();
101
+ const listener = () => {};
102
+ evented.on('a', listener);
103
+ evented.off('a', listener);
104
+ expect(evented.listens('a')).toBeFalsy();
105
+
106
+ });
107
+
108
+ test('does not immediately call listeners added within another listener', () => {
109
+ const evented = new Evented();
110
+ evented.on('a', () => {
111
+ evented.on('a', () => { throw new Error('fail'); });
112
+ });
113
+ evented.fire(new Event('a'));
114
+ });
115
+
116
+ test('has backward compatibility for fire(string, object) API', () => {
117
+ const evented = new Evented();
118
+ const listener = jest.fn(x => x);
119
+ evented.on('a', listener);
120
+ evented.fire('a' as any as Event, {foo: 'bar'});
121
+ expect(listener).toHaveBeenCalledTimes(1);
122
+ expect(listener.mock.calls[0][0].foo).toBe('bar');
123
+
124
+ });
125
+
126
+ test('on is idempotent', () => {
127
+ const evented = new Evented();
128
+ const order = [];
129
+ const listenerA = jest.fn(() => order.push('A'));
130
+ const listenerB = jest.fn(() => order.push('B'));
131
+ evented.on('a', listenerA);
132
+ evented.on('a', listenerB);
133
+ evented.on('a', listenerA);
134
+ evented.fire(new Event('a'));
135
+ expect(listenerA).toHaveBeenCalledTimes(1);
136
+ expect(order).toEqual(['A', 'B']);
137
+
138
+ });
139
+ });
140
+
141
+ describe('evented parents', () => {
142
+
143
+ test('adds parents with "setEventedParent"', () => {
144
+ const listener = jest.fn();
145
+ const eventedSource = new Evented();
146
+ const eventedSink = new Evented();
147
+ eventedSource.setEventedParent(eventedSink);
148
+ eventedSink.on('a', listener);
149
+ eventedSource.fire(new Event('a'));
150
+ eventedSource.fire(new Event('a'));
151
+ expect(listener).toHaveBeenCalledTimes(2);
152
+ });
153
+
154
+ test('passes original data to parent listeners', () => {
155
+ const eventedSource = new Evented();
156
+ const eventedSink = new Evented();
157
+ eventedSource.setEventedParent(eventedSink);
158
+ eventedSink.on('a', (data) => {
159
+ expect(data.foo).toBe('bar');
160
+ });
161
+ eventedSource.fire(new Event('a', {foo: 'bar'}));
162
+
163
+ });
164
+
165
+ test('attaches parent data to parent listeners', () => {
166
+ const eventedSource = new Evented();
167
+ const eventedSink = new Evented();
168
+ eventedSource.setEventedParent(eventedSink, {foz: 'baz'});
169
+ eventedSink.on('a', (data) => {
170
+ expect(data.foz).toBe('baz');
171
+ });
172
+ eventedSource.fire(new Event('a', {foo: 'bar'}));
173
+
174
+ });
175
+
176
+ test('attaches parent data from a function to parent listeners', () => {
177
+ const eventedSource = new Evented();
178
+ const eventedSink = new Evented();
179
+ eventedSource.setEventedParent(eventedSink, () => ({foz: 'baz'}));
180
+ eventedSink.on('a', (data) => {
181
+ expect(data.foz).toBe('baz');
182
+ });
183
+ eventedSource.fire(new Event('a', {foo: 'bar'}));
184
+
185
+ });
186
+
187
+ test('passes original "target" to parent listeners', () => {
188
+ const eventedSource = new Evented();
189
+ const eventedSink = new Evented();
190
+ eventedSource.setEventedParent(eventedSink);
191
+ eventedSource.setEventedParent(null);
192
+ eventedSink.on('a', (data) => {
193
+ expect(data.target).toBe(eventedSource);
194
+ });
195
+ eventedSource.fire(new Event('a'));
196
+
197
+ });
198
+
199
+ test('removes parents with "setEventedParent(null)"', () => {
200
+ const listener = jest.fn();
201
+ const eventedSource = new Evented();
202
+ const eventedSink = new Evented();
203
+ eventedSink.on('a', listener);
204
+ eventedSource.setEventedParent(eventedSink);
205
+ eventedSource.setEventedParent(null);
206
+ eventedSource.fire(new Event('a'));
207
+ expect(listener).not.toHaveBeenCalled();
208
+ });
209
+
210
+ test('reports if an event has parent listeners with "listens"', () => {
211
+ const eventedSource = new Evented();
212
+ const eventedSink = new Evented();
213
+ eventedSink.on('a', () => {});
214
+ eventedSource.setEventedParent(eventedSink);
215
+ expect(eventedSink.listens('a')).toBeTruthy();
216
+
217
+ });
218
+
219
+ test('eventedParent data function is evaluated on every fire', () => {
220
+ const eventedSource = new Evented();
221
+ const eventedParent = new Evented();
222
+ let i = 0;
223
+ eventedSource.setEventedParent(eventedParent, () => i++);
224
+ eventedSource.on('a', () => {});
225
+ eventedSource.fire(new Event('a'));
226
+ expect(i).toBe(1);
227
+ eventedSource.fire(new Event('a'));
228
+ expect(i).toBe(2);
229
+
230
+ });
231
+ });
@@ -0,0 +1,178 @@
1
+ import {extend} from './util';
2
+
3
+ /**
4
+ * A listener method used as a callback to events
5
+ */
6
+ export type Listener = (a: any) => any;
7
+
8
+ type Listeners = {[_: string]: Array<Listener>};
9
+
10
+ function _addEventListener(type: string, listener: Listener, listenerList: Listeners) {
11
+ const listenerExists = listenerList[type] && listenerList[type].indexOf(listener) !== -1;
12
+ if (!listenerExists) {
13
+ listenerList[type] = listenerList[type] || [];
14
+ listenerList[type].push(listener);
15
+ }
16
+ }
17
+
18
+ function _removeEventListener(type: string, listener: Listener, listenerList: Listeners) {
19
+ if (listenerList && listenerList[type]) {
20
+ const index = listenerList[type].indexOf(listener);
21
+ if (index !== -1) {
22
+ listenerList[type].splice(index, 1);
23
+ }
24
+ }
25
+ }
26
+
27
+ /**
28
+ * The event class
29
+ */
30
+ export class Event {
31
+ readonly type: string;
32
+
33
+ constructor(type: string, data: any = {}) {
34
+ extend(this, data);
35
+ this.type = type;
36
+ }
37
+ }
38
+
39
+ interface ErrorLike {
40
+ message: string;
41
+ }
42
+
43
+ /**
44
+ * An error event
45
+ */
46
+ export class ErrorEvent extends Event {
47
+ error: ErrorLike;
48
+
49
+ constructor(error: ErrorLike, data: any = {}) {
50
+ super('error', extend({error}, data));
51
+ }
52
+ }
53
+
54
+ /**
55
+ * Methods mixed in to other classes for event capabilities.
56
+ *
57
+ * @group Event Related
58
+ */
59
+ export class Evented {
60
+ _listeners: Listeners;
61
+ _oneTimeListeners: Listeners;
62
+ _eventedParent: Evented;
63
+ _eventedParentData: any | (() => any);
64
+
65
+ /**
66
+ * Adds a listener to a specified event type.
67
+ *
68
+ * @param type - The event type to add a listen for.
69
+ * @param listener - The function to be called when the event is fired.
70
+ * The listener function is called with the data object passed to `fire`,
71
+ * extended with `target` and `type` properties.
72
+ */
73
+ on(type: string, listener: Listener): this {
74
+ this._listeners = this._listeners || {};
75
+ _addEventListener(type, listener, this._listeners);
76
+
77
+ return this;
78
+ }
79
+
80
+ /**
81
+ * Removes a previously registered event listener.
82
+ *
83
+ * @param type - The event type to remove listeners for.
84
+ * @param listener - The listener function to remove.
85
+ */
86
+ off(type: string, listener: Listener) {
87
+ _removeEventListener(type, listener, this._listeners);
88
+ _removeEventListener(type, listener, this._oneTimeListeners);
89
+
90
+ return this;
91
+ }
92
+
93
+ /**
94
+ * Adds a listener that will be called only once to a specified event type.
95
+ *
96
+ * The listener will be called first time the event fires after the listener is registered.
97
+ *
98
+ * @param type - The event type to listen for.
99
+ * @param listener - The function to be called when the event is fired the first time.
100
+ * @returns `this` or a promise if a listener is not provided
101
+ */
102
+ once(type: string, listener?: Listener): this | Promise<any> {
103
+ if (!listener) {
104
+ return new Promise((resolve) => this.once(type, resolve));
105
+ }
106
+ this._oneTimeListeners = this._oneTimeListeners || {};
107
+ _addEventListener(type, listener, this._oneTimeListeners);
108
+
109
+ return this;
110
+ }
111
+
112
+ fire(event: Event | string, properties?: any) {
113
+ // Compatibility with (type: string, properties: Object) signature from previous versions.
114
+ // See https://github.com/mapbox/mapbox-gl-js/issues/6522,
115
+ // https://github.com/mapbox/mapbox-gl-draw/issues/766
116
+ if (typeof event === 'string') {
117
+ event = new Event(event, properties || {});
118
+ }
119
+
120
+ const type = event.type;
121
+
122
+ if (this.listens(type)) {
123
+ (event as any).target = this;
124
+
125
+ // make sure adding or removing listeners inside other listeners won't cause an infinite loop
126
+ const listeners = this._listeners && this._listeners[type] ? this._listeners[type].slice() : [];
127
+ for (const listener of listeners) {
128
+ listener.call(this, event);
129
+ }
130
+
131
+ const oneTimeListeners = this._oneTimeListeners && this._oneTimeListeners[type] ? this._oneTimeListeners[type].slice() : [];
132
+ for (const listener of oneTimeListeners) {
133
+ _removeEventListener(type, listener, this._oneTimeListeners);
134
+ listener.call(this, event);
135
+ }
136
+
137
+ const parent = this._eventedParent;
138
+ if (parent) {
139
+ extend(
140
+ event,
141
+ typeof this._eventedParentData === 'function' ? this._eventedParentData() : this._eventedParentData
142
+ );
143
+ parent.fire(event);
144
+ }
145
+
146
+ // To ensure that no error events are dropped, print them to the
147
+ // console if they have no listeners.
148
+ } else if (event instanceof ErrorEvent) {
149
+ console.error(event.error);
150
+ }
151
+
152
+ return this;
153
+ }
154
+
155
+ /**
156
+ * Returns a true if this instance of Evented or any forwardeed instances of Evented have a listener for the specified type.
157
+ *
158
+ * @param type - The event type
159
+ * @returns `true` if there is at least one registered listener for specified event type, `false` otherwise
160
+ */
161
+ listens(type: string): boolean {
162
+ return (
163
+ (this._listeners && this._listeners[type] && this._listeners[type].length > 0) ||
164
+ (this._oneTimeListeners && this._oneTimeListeners[type] && this._oneTimeListeners[type].length > 0) ||
165
+ (this._eventedParent && this._eventedParent.listens(type))
166
+ );
167
+ }
168
+
169
+ /**
170
+ * Bubble all events fired by this instance of Evented to this parent instance of Evented.
171
+ */
172
+ setEventedParent(parent?: Evented | null, data?: any | (() => any)) {
173
+ this._eventedParent = parent;
174
+ this._eventedParentData = data;
175
+
176
+ return this;
177
+ }
178
+ }
@@ -0,0 +1,21 @@
1
+ import Point from '@mapbox/point-geometry';
2
+ import {findPoleOfInaccessibility} from './find_pole_of_inaccessibility';
3
+
4
+ test('polygon_poi', () => {
5
+
6
+ const closedRing = [
7
+ new Point(0, 0),
8
+ new Point(10, 10),
9
+ new Point(10, 0),
10
+ new Point(0, 0)
11
+ ];
12
+ const closedRingHole = [
13
+ new Point(2, 1),
14
+ new Point(6, 6),
15
+ new Point(6, 1),
16
+ new Point(2, 1)
17
+ ];
18
+ expect(findPoleOfInaccessibility([closedRing], 0.1)).toEqual(new Point(7.0703125, 2.9296875));
19
+ expect(findPoleOfInaccessibility([closedRing, closedRingHole], 0.1)).toEqual(new Point(7.96875, 2.03125));
20
+
21
+ });
@@ -0,0 +1,130 @@
1
+ import Queue from 'tinyqueue';
2
+
3
+ import Point from '@mapbox/point-geometry';
4
+ import {distToSegmentSquared} from './intersection_tests';
5
+
6
+ /**
7
+ * Finds an approximation of a polygon's Pole Of Inaccessibility https://en.wikipedia.org/wiki/Pole_of_inaccessibility
8
+ * This is a copy of https://github.com/mapbox/polylabel adapted to use Points
9
+ *
10
+ * @param polygonRings - first item in array is the outer ring followed optionally by the list of holes, should be an element of the result of util/classify_rings
11
+ * @param precision - Specified in input coordinate units. If 0 returns after first run, if `> 0` repeatedly narrows the search space until the radius of the area searched for the best pole is less than precision
12
+ * @param debug - Print some statistics to the console during execution
13
+ * @returns Pole of Inaccessibility.
14
+ */
15
+ export function findPoleOfInaccessibility(
16
+ polygonRings: Array<Array<Point>>,
17
+ precision: number = 1,
18
+ debug: boolean = false
19
+ ): Point {
20
+ // find the bounding box of the outer ring
21
+ let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity;
22
+ const outerRing = polygonRings[0];
23
+ for (let i = 0; i < outerRing.length; i++) {
24
+ const p = outerRing[i];
25
+ if (!i || p.x < minX) minX = p.x;
26
+ if (!i || p.y < minY) minY = p.y;
27
+ if (!i || p.x > maxX) maxX = p.x;
28
+ if (!i || p.y > maxY) maxY = p.y;
29
+ }
30
+
31
+ const width = maxX - minX;
32
+ const height = maxY - minY;
33
+ const cellSize = Math.min(width, height);
34
+ let h = cellSize / 2;
35
+
36
+ // a priority queue of cells in order of their "potential" (max distance to polygon)
37
+ const cellQueue = new Queue([], compareMax);
38
+
39
+ if (cellSize === 0) return new Point(minX, minY);
40
+
41
+ // cover polygon with initial cells
42
+ for (let x = minX; x < maxX; x += cellSize) {
43
+ for (let y = minY; y < maxY; y += cellSize) {
44
+ cellQueue.push(new Cell(x + h, y + h, h, polygonRings));
45
+ }
46
+ }
47
+
48
+ // take centroid as the first best guess
49
+ let bestCell = getCentroidCell(polygonRings);
50
+ let numProbes = cellQueue.length;
51
+
52
+ while (cellQueue.length) {
53
+ // pick the most promising cell from the queue
54
+ const cell = cellQueue.pop();
55
+
56
+ // update the best cell if we found a better one
57
+ if (cell.d > bestCell.d || !bestCell.d) {
58
+ bestCell = cell;
59
+ if (debug) console.log('found best %d after %d probes', Math.round(1e4 * cell.d) / 1e4, numProbes);
60
+ }
61
+
62
+ // do not drill down further if there's no chance of a better solution
63
+ if (cell.max - bestCell.d <= precision) continue;
64
+
65
+ // split the cell into four cells
66
+ h = cell.h / 2;
67
+ cellQueue.push(new Cell(cell.p.x - h, cell.p.y - h, h, polygonRings));
68
+ cellQueue.push(new Cell(cell.p.x + h, cell.p.y - h, h, polygonRings));
69
+ cellQueue.push(new Cell(cell.p.x - h, cell.p.y + h, h, polygonRings));
70
+ cellQueue.push(new Cell(cell.p.x + h, cell.p.y + h, h, polygonRings));
71
+ numProbes += 4;
72
+ }
73
+
74
+ if (debug) {
75
+ console.log(`num probes: ${numProbes}`);
76
+ console.log(`best distance: ${bestCell.d}`);
77
+ }
78
+
79
+ return bestCell.p;
80
+ }
81
+
82
+ function compareMax(a, b) {
83
+ return b.max - a.max;
84
+ }
85
+
86
+ function Cell(x, y, h, polygon) {
87
+ this.p = new Point(x, y);
88
+ this.h = h; // half the cell size
89
+ this.d = pointToPolygonDist(this.p, polygon); // distance from cell center to polygon
90
+ this.max = this.d + this.h * Math.SQRT2; // max distance to polygon within a cell
91
+ }
92
+
93
+ // signed distance from point to polygon outline (negative if point is outside)
94
+ function pointToPolygonDist(p, polygon) {
95
+ let inside = false;
96
+ let minDistSq = Infinity;
97
+
98
+ for (let k = 0; k < polygon.length; k++) {
99
+ const ring = polygon[k];
100
+
101
+ for (let i = 0, len = ring.length, j = len - 1; i < len; j = i++) {
102
+ const a = ring[i];
103
+ const b = ring[j];
104
+
105
+ if ((a.y > p.y !== b.y > p.y) &&
106
+ (p.x < (b.x - a.x) * (p.y - a.y) / (b.y - a.y) + a.x)) inside = !inside;
107
+
108
+ minDistSq = Math.min(minDistSq, distToSegmentSquared(p, a, b));
109
+ }
110
+ }
111
+
112
+ return (inside ? 1 : -1) * Math.sqrt(minDistSq);
113
+ }
114
+
115
+ // get polygon centroid
116
+ function getCentroidCell(polygon) {
117
+ let area = 0;
118
+ let x = 0;
119
+ let y = 0;
120
+ const points = polygon[0];
121
+ for (let i = 0, len = points.length, j = len - 1; i < len; j = i++) {
122
+ const a = points[i];
123
+ const b = points[j];
124
+ const f = a.x * b.y - b.x * a.y;
125
+ x += (a.x + b.x) * f;
126
+ y += (a.y + b.y) * f;
127
+ area += f * 3;
128
+ }
129
+ return new Cell(x / area, y / area, 0, polygon);
130
+ }
@@ -0,0 +1,43 @@
1
+ import {checkGeolocationSupport} from './geolocation_support';
2
+
3
+ describe('checkGeolocationSupport', () => {
4
+ beforeEach(() => {
5
+ jest.resetModules();
6
+ });
7
+
8
+ test('it should return false if geolocation is not defined', async () => {
9
+ await expect(checkGeolocationSupport()).resolves.toBeFalsy();
10
+ });
11
+
12
+ test('it should return the cached value on second call', async () => {
13
+ const returnValue = await checkGeolocationSupport();
14
+ expect(returnValue).toBeFalsy();
15
+ (window.navigator as any).geolocation = {};
16
+ const rv = await checkGeolocationSupport();
17
+ expect(rv).toBe(returnValue);
18
+ });
19
+
20
+ test('it should return the true if geolocation is defined', async () => {
21
+ (window.navigator as any).geolocation = {};
22
+ const returnValue = await checkGeolocationSupport(true);
23
+ expect(returnValue).toBeTruthy();
24
+ });
25
+
26
+ test('it should check permissions if possible', async () => {
27
+ (window.navigator as any).geolocation = {};
28
+ (window.navigator as any).permissions = {
29
+ query: () => Promise.resolve({state: 'granted'})
30
+ };
31
+ const returnValue = await checkGeolocationSupport(true);
32
+ expect(returnValue).toBeTruthy();
33
+ });
34
+
35
+ test('it should check permissions and geolocation for iOS 16 promise rejection', async () => {
36
+ (window.navigator as any).geolocation = undefined;
37
+ (window.navigator as any).permissions = {
38
+ query: () => Promise.reject(new Error('perissions error'))
39
+ };
40
+ const returnValue = await checkGeolocationSupport(true);
41
+ expect(returnValue).toBeFalsy();
42
+ });
43
+ });
@@ -0,0 +1,23 @@
1
+ let supportsGeolocation;
2
+
3
+ export async function checkGeolocationSupport(forceRecalculation = false): Promise<boolean> {
4
+ if (supportsGeolocation !== undefined && !forceRecalculation) {
5
+ return supportsGeolocation;
6
+ }
7
+ if (window.navigator.permissions === undefined) {
8
+ supportsGeolocation = !!window.navigator.geolocation;
9
+ return supportsGeolocation;
10
+ }
11
+ // navigator.permissions has incomplete browser support
12
+ // https://caniuse.com/#feat=permissions-api
13
+ // Test for the case where a browser disables Geolocation because of an
14
+ // insecure origin
15
+ try {
16
+ const permissions = await window.navigator.permissions.query({name: 'geolocation'});
17
+ supportsGeolocation = permissions.state !== 'denied'; // eslint-disable-line require-atomic-updates
18
+ } catch {
19
+ // Fix for iOS16 which rejects query but still supports geolocation
20
+ supportsGeolocation = !!window.navigator.geolocation; // eslint-disable-line require-atomic-updates
21
+ }
22
+ return supportsGeolocation;
23
+ }
@@ -0,0 +1,65 @@
1
+ import {WorkerPool, PRELOAD_POOL_ID} from './worker_pool';
2
+
3
+ let globalWorkerPool;
4
+
5
+ /**
6
+ * Creates (if necessary) and returns the single, global WorkerPool instance
7
+ * to be shared across each Map
8
+ */
9
+ export function getGlobalWorkerPool() {
10
+ if (!globalWorkerPool) {
11
+ globalWorkerPool = new WorkerPool();
12
+ }
13
+ return globalWorkerPool;
14
+ }
15
+
16
+ /**
17
+ * Initializes resources like WebWorkers that can be shared across maps to lower load
18
+ * times in some situations. `setWorkerUrl()` and `setWorkerCount()`, if being
19
+ * used, must be set before `prewarm()` is called to have an effect.
20
+ *
21
+ * By default, the lifecycle of these resources is managed automatically, and they are
22
+ * lazily initialized when a Map is first created. By invoking `prewarm()`, these
23
+ * resources will be created ahead of time, and will not be cleared when the last Map
24
+ * is removed from the page. This allows them to be re-used by new Map instances that
25
+ * are created later. They can be manually cleared by calling
26
+ * `clearPrewarmedResources()`. This is only necessary if your web page remains
27
+ * active but stops using maps altogether.
28
+ *
29
+ * This is primarily useful when using GL-JS maps in a single page app, wherein a user
30
+ * would navigate between various views that can cause Map instances to constantly be
31
+ * created and destroyed.
32
+ *
33
+ * @example
34
+ * ```ts
35
+ * prewarm()
36
+ * ```
37
+ */
38
+ export function prewarm() {
39
+ const workerPool = getGlobalWorkerPool();
40
+ workerPool.acquire(PRELOAD_POOL_ID);
41
+ }
42
+
43
+ /**
44
+ * Clears up resources that have previously been created by `prewarm()`.
45
+ * Note that this is typically not necessary. You should only call this function
46
+ * if you expect the user of your app to not return to a Map view at any point
47
+ * in your application.
48
+ *
49
+ * @example
50
+ * ```ts
51
+ * clearPrewarmedResources()
52
+ * ```
53
+ */
54
+ export function clearPrewarmedResources() {
55
+ const pool = globalWorkerPool;
56
+ if (pool) {
57
+ // Remove the pool only if all maps that referenced the preloaded global worker pool have been removed.
58
+ if (pool.isPreloaded() && pool.numActive() === 1) {
59
+ pool.release(PRELOAD_POOL_ID);
60
+ globalWorkerPool = null;
61
+ } else {
62
+ console.warn('Could not clear WebWorkers since there are active Map instances that still reference it. The pre-warmed WebWorker pool can only be cleared when all map instances have been removed with map.remove()');
63
+ }
64
+ }
65
+ }