@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.
- package/LICENSE.txt +116 -0
- package/README.md +174 -0
- package/build/banner.ts +12 -0
- package/build/bump-version-changelog.js +26 -0
- package/build/check-bundle-size.js +77 -0
- package/build/generate-dist-package.js +26 -0
- package/build/generate-doc-images.ts +78 -0
- package/build/generate-docs.ts +190 -0
- package/build/generate-shaders.ts +68 -0
- package/build/generate-struct-arrays.ts +438 -0
- package/build/generate-style-code.ts +283 -0
- package/build/readme.md +56 -0
- package/build/release-notes.js +45 -0
- package/build/rollup/bundle_prelude.js +29 -0
- package/build/rollup/maplibregl.js +22 -0
- package/build/rollup_plugins.ts +58 -0
- package/dist/LICENSE.txt +116 -0
- package/dist/maplibre-gl.css +1 -0
- package/dist/maplibre-gl.d.ts +13304 -0
- package/dist/maplibre-gl.js +59 -0
- package/dist/maplibre-gl.js.map +1 -0
- package/dist/package.json +1 -0
- package/package.json +192 -0
- package/src/css/maplibre-gl.css +854 -0
- package/src/css/svg/maplibregl-ctrl-attrib.svg +3 -0
- package/src/css/svg/maplibregl-ctrl-compass.svg +4 -0
- package/src/css/svg/maplibregl-ctrl-fullscreen.svg +3 -0
- package/src/css/svg/maplibregl-ctrl-geolocate.svg +5 -0
- package/src/css/svg/maplibregl-ctrl-logo.svg +11 -0
- package/src/css/svg/maplibregl-ctrl-shrink.svg +3 -0
- package/src/css/svg/maplibregl-ctrl-terrain.svg +3 -0
- package/src/css/svg/maplibregl-ctrl-zoom-in.svg +3 -0
- package/src/css/svg/maplibregl-ctrl-zoom-out.svg +3 -0
- package/src/data/array_types.g.ts +1130 -0
- package/src/data/bucket/circle_attributes.ts +8 -0
- package/src/data/bucket/circle_bucket.ts +197 -0
- package/src/data/bucket/fill_attributes.ts +8 -0
- package/src/data/bucket/fill_bucket.test.ts +95 -0
- package/src/data/bucket/fill_bucket.ts +228 -0
- package/src/data/bucket/fill_extrusion_attributes.ts +13 -0
- package/src/data/bucket/fill_extrusion_bucket.ts +305 -0
- package/src/data/bucket/heatmap_bucket.ts +12 -0
- package/src/data/bucket/line_attributes.ts +8 -0
- package/src/data/bucket/line_attributes_ext.ts +8 -0
- package/src/data/bucket/line_bucket.test.ts +142 -0
- package/src/data/bucket/line_bucket.ts +592 -0
- package/src/data/bucket/pattern_attributes.ts +9 -0
- package/src/data/bucket/pattern_bucket_features.ts +57 -0
- package/src/data/bucket/symbol_attributes.ts +122 -0
- package/src/data/bucket/symbol_bucket.test.ts +243 -0
- package/src/data/bucket/symbol_bucket.ts +975 -0
- package/src/data/bucket.ts +123 -0
- package/src/data/dem_data.test.ts +237 -0
- package/src/data/dem_data.ts +171 -0
- package/src/data/evaluation_feature.ts +18 -0
- package/src/data/extent.ts +13 -0
- package/src/data/feature_index.ts +337 -0
- package/src/data/feature_position_map.test.ts +33 -0
- package/src/data/feature_position_map.ts +126 -0
- package/src/data/index_array_type.ts +9 -0
- package/src/data/load_geometry.test.ts +49 -0
- package/src/data/load_geometry.ts +44 -0
- package/src/data/pos3d_attributes.ts +5 -0
- package/src/data/pos_attributes.ts +5 -0
- package/src/data/program_configuration.ts +735 -0
- package/src/data/raster_bounds_attributes.ts +6 -0
- package/src/data/segment.ts +89 -0
- package/src/geo/edge_insets.test.ts +83 -0
- package/src/geo/edge_insets.ts +146 -0
- package/src/geo/lng_lat.test.ts +65 -0
- package/src/geo/lng_lat.ts +169 -0
- package/src/geo/lng_lat_bounds.test.ts +357 -0
- package/src/geo/lng_lat_bounds.ts +356 -0
- package/src/geo/mercator_coordinate.test.ts +34 -0
- package/src/geo/mercator_coordinate.ts +157 -0
- package/src/geo/projection/projection.ts +72 -0
- package/src/geo/transform.test.ts +509 -0
- package/src/geo/transform.ts +1072 -0
- package/src/gl/color_mode.ts +31 -0
- package/src/gl/context.ts +321 -0
- package/src/gl/cull_face_mode.ts +22 -0
- package/src/gl/depth_mode.ts +26 -0
- package/src/gl/framebuffer.ts +48 -0
- package/src/gl/index_buffer.ts +55 -0
- package/src/gl/render_pool.test.ts +69 -0
- package/src/gl/render_pool.ts +93 -0
- package/src/gl/state.test.ts +125 -0
- package/src/gl/stencil_mode.ts +27 -0
- package/src/gl/types.ts +59 -0
- package/src/gl/value.ts +534 -0
- package/src/gl/vertex_buffer.test.ts +57 -0
- package/src/gl/vertex_buffer.ts +111 -0
- package/src/gl/webgl2.ts +12 -0
- package/src/index.test.ts +121 -0
- package/src/index.ts +250 -0
- package/src/render/draw_background.ts +53 -0
- package/src/render/draw_circle.ts +113 -0
- package/src/render/draw_collision_debug.ts +168 -0
- package/src/render/draw_custom.test.ts +73 -0
- package/src/render/draw_custom.ts +45 -0
- package/src/render/draw_debug.test.ts +122 -0
- package/src/render/draw_debug.ts +148 -0
- package/src/render/draw_fill.test.ts +137 -0
- package/src/render/draw_fill.ts +128 -0
- package/src/render/draw_fill_extrusion.ts +97 -0
- package/src/render/draw_heatmap.ts +228 -0
- package/src/render/draw_hillshade.ts +119 -0
- package/src/render/draw_line.ts +125 -0
- package/src/render/draw_raster.ts +133 -0
- package/src/render/draw_sky.ts +44 -0
- package/src/render/draw_symbol.test.ts +223 -0
- package/src/render/draw_symbol.ts +499 -0
- package/src/render/draw_terrain.ts +99 -0
- package/src/render/glyph_atlas.ts +83 -0
- package/src/render/glyph_manager.test.ts +147 -0
- package/src/render/glyph_manager.ts +198 -0
- package/src/render/image_atlas.ts +159 -0
- package/src/render/image_manager.ts +337 -0
- package/src/render/line_atlas.test.ts +38 -0
- package/src/render/line_atlas.ts +214 -0
- package/src/render/mesh.ts +25 -0
- package/src/render/painter.test.ts +51 -0
- package/src/render/painter.ts +666 -0
- package/src/render/program/background_program.ts +100 -0
- package/src/render/program/circle_program.ts +61 -0
- package/src/render/program/clipping_mask_program.ts +19 -0
- package/src/render/program/collision_program.ts +47 -0
- package/src/render/program/debug_program.ts +29 -0
- package/src/render/program/fill_extrusion_program.ts +120 -0
- package/src/render/program/fill_program.ts +121 -0
- package/src/render/program/heatmap_program.ts +76 -0
- package/src/render/program/hillshade_program.ts +116 -0
- package/src/render/program/line_program.ts +207 -0
- package/src/render/program/pattern.ts +102 -0
- package/src/render/program/program_uniforms.ts +46 -0
- package/src/render/program/raster_program.ts +88 -0
- package/src/render/program/sky_program.ts +28 -0
- package/src/render/program/symbol_program.ts +266 -0
- package/src/render/program/terrain_program.ts +116 -0
- package/src/render/program.ts +233 -0
- package/src/render/render_to_texture.test.ts +151 -0
- package/src/render/render_to_texture.ts +197 -0
- package/src/render/terrain.test.ts +322 -0
- package/src/render/terrain.ts +464 -0
- package/src/render/texture.ts +114 -0
- package/src/render/uniform_binding.test.ts +122 -0
- package/src/render/uniform_binding.ts +157 -0
- package/src/render/update_pattern_positions_in_program.test.ts +74 -0
- package/src/render/update_pattern_positions_in_program.ts +50 -0
- package/src/render/vertex_array_object.ts +163 -0
- package/src/shaders/README.md +42 -0
- package/src/shaders/_prelude.fragment.glsl +19 -0
- package/src/shaders/_prelude.fragment.glsl.g.ts +2 -0
- package/src/shaders/_prelude.vertex.glsl +148 -0
- package/src/shaders/_prelude.vertex.glsl.g.ts +2 -0
- package/src/shaders/background.fragment.glsl +10 -0
- package/src/shaders/background.fragment.glsl.g.ts +2 -0
- package/src/shaders/background.vertex.glsl +7 -0
- package/src/shaders/background.vertex.glsl.g.ts +2 -0
- package/src/shaders/background_pattern.fragment.glsl +28 -0
- package/src/shaders/background_pattern.fragment.glsl.g.ts +2 -0
- package/src/shaders/background_pattern.vertex.glsl +19 -0
- package/src/shaders/background_pattern.vertex.glsl.g.ts +2 -0
- package/src/shaders/circle.fragment.glsl +34 -0
- package/src/shaders/circle.fragment.glsl.g.ts +2 -0
- package/src/shaders/circle.vertex.glsl +68 -0
- package/src/shaders/circle.vertex.glsl.g.ts +2 -0
- package/src/shaders/clipping_mask.fragment.glsl +3 -0
- package/src/shaders/clipping_mask.fragment.glsl.g.ts +2 -0
- package/src/shaders/clipping_mask.vertex.glsl +7 -0
- package/src/shaders/clipping_mask.vertex.glsl.g.ts +2 -0
- package/src/shaders/collision_box.fragment.glsl +20 -0
- package/src/shaders/collision_box.fragment.glsl.g.ts +2 -0
- package/src/shaders/collision_box.vertex.glsl +27 -0
- package/src/shaders/collision_box.vertex.glsl.g.ts +2 -0
- package/src/shaders/collision_circle.fragment.glsl +17 -0
- package/src/shaders/collision_circle.fragment.glsl.g.ts +2 -0
- package/src/shaders/collision_circle.vertex.glsl +59 -0
- package/src/shaders/collision_circle.vertex.glsl.g.ts +2 -0
- package/src/shaders/debug.fragment.glsl +9 -0
- package/src/shaders/debug.fragment.glsl.g.ts +2 -0
- package/src/shaders/debug.vertex.glsl +12 -0
- package/src/shaders/debug.vertex.glsl.g.ts +2 -0
- package/src/shaders/encode_attribute.test.ts +11 -0
- package/src/shaders/encode_attribute.ts +13 -0
- package/src/shaders/fill.fragment.glsl +13 -0
- package/src/shaders/fill.fragment.glsl.g.ts +2 -0
- package/src/shaders/fill.vertex.glsl +13 -0
- package/src/shaders/fill.vertex.glsl.g.ts +2 -0
- package/src/shaders/fill_extrusion.fragment.glsl +9 -0
- package/src/shaders/fill_extrusion.fragment.glsl.g.ts +2 -0
- package/src/shaders/fill_extrusion.vertex.glsl +84 -0
- package/src/shaders/fill_extrusion.vertex.glsl.g.ts +2 -0
- package/src/shaders/fill_extrusion_pattern.fragment.glsl +47 -0
- package/src/shaders/fill_extrusion_pattern.fragment.glsl.g.ts +2 -0
- package/src/shaders/fill_extrusion_pattern.vertex.glsl +96 -0
- package/src/shaders/fill_extrusion_pattern.vertex.glsl.g.ts +2 -0
- package/src/shaders/fill_outline.fragment.glsl +17 -0
- package/src/shaders/fill_outline.fragment.glsl.g.ts +2 -0
- package/src/shaders/fill_outline.vertex.glsl +17 -0
- package/src/shaders/fill_outline.vertex.glsl.g.ts +2 -0
- package/src/shaders/fill_outline_pattern.fragment.glsl +43 -0
- package/src/shaders/fill_outline_pattern.fragment.glsl.g.ts +2 -0
- package/src/shaders/fill_outline_pattern.vertex.glsl +44 -0
- package/src/shaders/fill_outline_pattern.vertex.glsl.g.ts +2 -0
- package/src/shaders/fill_pattern.fragment.glsl +39 -0
- package/src/shaders/fill_pattern.fragment.glsl.g.ts +2 -0
- package/src/shaders/fill_pattern.vertex.glsl +39 -0
- package/src/shaders/fill_pattern.vertex.glsl.g.ts +2 -0
- package/src/shaders/heatmap.fragment.glsl +22 -0
- package/src/shaders/heatmap.fragment.glsl.g.ts +2 -0
- package/src/shaders/heatmap.vertex.glsl +54 -0
- package/src/shaders/heatmap.vertex.glsl.g.ts +2 -0
- package/src/shaders/heatmap_texture.fragment.glsl +15 -0
- package/src/shaders/heatmap_texture.fragment.glsl.g.ts +2 -0
- package/src/shaders/heatmap_texture.vertex.glsl +11 -0
- package/src/shaders/heatmap_texture.vertex.glsl.g.ts +2 -0
- package/src/shaders/hillshade.fragment.glsl +52 -0
- package/src/shaders/hillshade.fragment.glsl.g.ts +2 -0
- package/src/shaders/hillshade.vertex.glsl +11 -0
- package/src/shaders/hillshade.vertex.glsl.g.ts +2 -0
- package/src/shaders/hillshade_prepare.fragment.glsl +77 -0
- package/src/shaders/hillshade_prepare.fragment.glsl.g.ts +2 -0
- package/src/shaders/hillshade_prepare.vertex.glsl +15 -0
- package/src/shaders/hillshade_prepare.vertex.glsl.g.ts +2 -0
- package/src/shaders/line.fragment.glsl +30 -0
- package/src/shaders/line.fragment.glsl.g.ts +2 -0
- package/src/shaders/line.vertex.glsl +89 -0
- package/src/shaders/line.vertex.glsl.g.ts +2 -0
- package/src/shaders/line_gradient.fragment.glsl +34 -0
- package/src/shaders/line_gradient.fragment.glsl.g.ts +2 -0
- package/src/shaders/line_gradient.vertex.glsl +92 -0
- package/src/shaders/line_gradient.vertex.glsl.g.ts +2 -0
- package/src/shaders/line_pattern.fragment.glsl +77 -0
- package/src/shaders/line_pattern.fragment.glsl.g.ts +2 -0
- package/src/shaders/line_pattern.vertex.glsl +103 -0
- package/src/shaders/line_pattern.vertex.glsl.g.ts +2 -0
- package/src/shaders/line_sdf.fragment.glsl +45 -0
- package/src/shaders/line_sdf.fragment.glsl.g.ts +2 -0
- package/src/shaders/line_sdf.vertex.glsl +101 -0
- package/src/shaders/line_sdf.vertex.glsl.g.ts +2 -0
- package/src/shaders/raster.fragment.glsl +53 -0
- package/src/shaders/raster.fragment.glsl.g.ts +2 -0
- package/src/shaders/raster.vertex.glsl +21 -0
- package/src/shaders/raster.vertex.glsl.g.ts +2 -0
- package/src/shaders/shaders.ts +197 -0
- package/src/shaders/sky.fragment.glsl +17 -0
- package/src/shaders/sky.fragment.glsl.g.ts +2 -0
- package/src/shaders/sky.vertex.glsl +5 -0
- package/src/shaders/sky.vertex.glsl.g.ts +2 -0
- package/src/shaders/symbol_icon.fragment.glsl +17 -0
- package/src/shaders/symbol_icon.fragment.glsl.g.ts +2 -0
- package/src/shaders/symbol_icon.vertex.glsl +117 -0
- package/src/shaders/symbol_icon.vertex.glsl.g.ts +2 -0
- package/src/shaders/symbol_sdf.fragment.glsl +58 -0
- package/src/shaders/symbol_sdf.fragment.glsl.g.ts +2 -0
- package/src/shaders/symbol_sdf.vertex.glsl +142 -0
- package/src/shaders/symbol_sdf.vertex.glsl.g.ts +2 -0
- package/src/shaders/symbol_text_and_icon.fragment.glsl +68 -0
- package/src/shaders/symbol_text_and_icon.fragment.glsl.g.ts +2 -0
- package/src/shaders/symbol_text_and_icon.vertex.glsl +140 -0
- package/src/shaders/symbol_text_and_icon.vertex.glsl.g.ts +2 -0
- package/src/shaders/terrain.fragment.glsl +32 -0
- package/src/shaders/terrain.fragment.glsl.g.ts +2 -0
- package/src/shaders/terrain.vertex.glsl +17 -0
- package/src/shaders/terrain.vertex.glsl.g.ts +2 -0
- package/src/shaders/terrain_coords.fragment.glsl +11 -0
- package/src/shaders/terrain_coords.fragment.glsl.g.ts +2 -0
- package/src/shaders/terrain_coords.vertex.glsl +13 -0
- package/src/shaders/terrain_coords.vertex.glsl.g.ts +2 -0
- package/src/shaders/terrain_depth.fragment.glsl +15 -0
- package/src/shaders/terrain_depth.fragment.glsl.g.ts +2 -0
- package/src/shaders/terrain_depth.vertex.glsl +13 -0
- package/src/shaders/terrain_depth.vertex.glsl.g.ts +2 -0
- package/src/source/canvas_source.test.ts +210 -0
- package/src/source/canvas_source.ts +227 -0
- package/src/source/geojson_source.test.ts +492 -0
- package/src/source/geojson_source.ts +431 -0
- package/src/source/geojson_source_diff.test.ts +364 -0
- package/src/source/geojson_source_diff.ts +172 -0
- package/src/source/geojson_worker_source.test.ts +399 -0
- package/src/source/geojson_worker_source.ts +303 -0
- package/src/source/geojson_wrapper.test.ts +32 -0
- package/src/source/geojson_wrapper.ts +81 -0
- package/src/source/image_source.test.ts +235 -0
- package/src/source/image_source.ts +338 -0
- package/src/source/load_tilejson.ts +47 -0
- package/src/source/pixels_to_tile_units.ts +25 -0
- package/src/source/protocol_crud.ts +48 -0
- package/src/source/query_features.test.ts +31 -0
- package/src/source/query_features.ts +252 -0
- package/src/source/raster_dem_tile_source.test.ts +158 -0
- package/src/source/raster_dem_tile_source.ts +166 -0
- package/src/source/raster_dem_tile_worker_source.test.ts +36 -0
- package/src/source/raster_dem_tile_worker_source.ts +38 -0
- package/src/source/raster_tile_source.test.ts +206 -0
- package/src/source/raster_tile_source.ts +227 -0
- package/src/source/rtl_text_plugin_main_thread.test.ts +170 -0
- package/src/source/rtl_text_plugin_main_thread.ts +89 -0
- package/src/source/rtl_text_plugin_status.ts +33 -0
- package/src/source/rtl_text_plugin_worker.ts +49 -0
- package/src/source/source.test.ts +41 -0
- package/src/source/source.ts +186 -0
- package/src/source/source_cache.test.ts +2069 -0
- package/src/source/source_cache.ts +1102 -0
- package/src/source/source_state.ts +157 -0
- package/src/source/terrain_source_cache.test.ts +105 -0
- package/src/source/terrain_source_cache.ts +204 -0
- package/src/source/tile.test.ts +290 -0
- package/src/source/tile.ts +478 -0
- package/src/source/tile_bounds.ts +34 -0
- package/src/source/tile_cache.test.ts +130 -0
- package/src/source/tile_cache.ts +208 -0
- package/src/source/tile_id.test.ts +112 -0
- package/src/source/tile_id.ts +221 -0
- package/src/source/vector_tile_source.test.ts +401 -0
- package/src/source/vector_tile_source.ts +283 -0
- package/src/source/vector_tile_worker_source.test.ts +396 -0
- package/src/source/vector_tile_worker_source.ts +199 -0
- package/src/source/video_source.test.ts +124 -0
- package/src/source/video_source.ts +204 -0
- package/src/source/worker.test.ts +233 -0
- package/src/source/worker.ts +301 -0
- package/src/source/worker_source.ts +117 -0
- package/src/source/worker_tile.test.ts +226 -0
- package/src/source/worker_tile.ts +208 -0
- package/src/style/create_style_layer.ts +39 -0
- package/src/style/evaluation_parameters.ts +62 -0
- package/src/style/format_section_override.test.ts +62 -0
- package/src/style/format_section_override.ts +50 -0
- package/src/style/light.test.ts +86 -0
- package/src/style/light.ts +135 -0
- package/src/style/load_glyph_range.test.ts +40 -0
- package/src/style/load_glyph_range.ts +32 -0
- package/src/style/load_sprite.test.ts +227 -0
- package/src/style/load_sprite.ts +71 -0
- package/src/style/parse_glyph_pbf.ts +42 -0
- package/src/style/pauseable_placement.ts +138 -0
- package/src/style/properties.ts +726 -0
- package/src/style/query_utils.test.ts +107 -0
- package/src/style/query_utils.ts +70 -0
- package/src/style/sky.ts +127 -0
- package/src/style/style.test.ts +2654 -0
- package/src/style/style.ts +1814 -0
- package/src/style/style_glyph.ts +25 -0
- package/src/style/style_image.ts +188 -0
- package/src/style/style_layer/background_style_layer.ts +17 -0
- package/src/style/style_layer/background_style_layer_properties.g.ts +40 -0
- package/src/style/style_layer/circle_style_layer.ts +98 -0
- package/src/style/style_layer/circle_style_layer_properties.g.ts +76 -0
- package/src/style/style_layer/custom_style_layer.ts +233 -0
- package/src/style/style_layer/fill_extrusion_style_layer.ts +224 -0
- package/src/style/style_layer/fill_extrusion_style_layer_properties.g.ts +55 -0
- package/src/style/style_layer/fill_style_layer.test.ts +37 -0
- package/src/style/style_layer/fill_style_layer.ts +65 -0
- package/src/style/style_layer/fill_style_layer_properties.g.ts +64 -0
- package/src/style/style_layer/heatmap_style_layer.ts +74 -0
- package/src/style/style_layer/heatmap_style_layer_properties.g.ts +46 -0
- package/src/style/style_layer/hillshade_style_layer.ts +21 -0
- package/src/style/style_layer/hillshade_style_layer_properties.g.ts +49 -0
- package/src/style/style_layer/line_style_layer.test.ts +50 -0
- package/src/style/style_layer/line_style_layer.ts +131 -0
- package/src/style/style_layer/line_style_layer_properties.g.ts +88 -0
- package/src/style/style_layer/overlap_mode.test.ts +57 -0
- package/src/style/style_layer/overlap_mode.ts +25 -0
- package/src/style/style_layer/raster_style_layer.ts +17 -0
- package/src/style/style_layer/raster_style_layer_properties.g.ts +55 -0
- package/src/style/style_layer/symbol_style_layer.ts +195 -0
- package/src/style/style_layer/symbol_style_layer_properties.g.ts +218 -0
- package/src/style/style_layer/typed_style_layer.ts +9 -0
- package/src/style/style_layer/variable_text_anchor.test.ts +117 -0
- package/src/style/style_layer/variable_text_anchor.ts +163 -0
- package/src/style/style_layer.test.ts +372 -0
- package/src/style/style_layer.ts +287 -0
- package/src/style/style_layer_index.test.ts +99 -0
- package/src/style/style_layer_index.ts +78 -0
- package/src/style/validate_style.ts +53 -0
- package/src/style/zoom_history.ts +40 -0
- package/src/symbol/anchor.test.ts +14 -0
- package/src/symbol/anchor.ts +22 -0
- package/src/symbol/check_max_angle.test.ts +54 -0
- package/src/symbol/check_max_angle.ts +76 -0
- package/src/symbol/clip_line.test.ts +154 -0
- package/src/symbol/clip_line.ts +66 -0
- package/src/symbol/collision_feature.test.ts +98 -0
- package/src/symbol/collision_feature.ts +114 -0
- package/src/symbol/collision_index.test.ts +19 -0
- package/src/symbol/collision_index.ts +618 -0
- package/src/symbol/cross_tile_symbol_index.test.ts +260 -0
- package/src/symbol/cross_tile_symbol_index.ts +367 -0
- package/src/symbol/get_anchors.test.ts +113 -0
- package/src/symbol/get_anchors.ts +167 -0
- package/src/symbol/grid_index.test.ts +75 -0
- package/src/symbol/grid_index.ts +414 -0
- package/src/symbol/merge_lines.test.ts +30 -0
- package/src/symbol/merge_lines.ts +80 -0
- package/src/symbol/one_em.ts +3 -0
- package/src/symbol/opacity_state.ts +23 -0
- package/src/symbol/path_interpolator.test.ts +134 -0
- package/src/symbol/path_interpolator.ts +55 -0
- package/src/symbol/placement.ts +1371 -0
- package/src/symbol/projection.test.ts +171 -0
- package/src/symbol/projection.ts +833 -0
- package/src/symbol/quads.test.ts +157 -0
- package/src/symbol/quads.ts +349 -0
- package/src/symbol/shaping.test.ts +360 -0
- package/src/symbol/shaping.ts +911 -0
- package/src/symbol/symbol_layout.ts +739 -0
- package/src/symbol/symbol_size.ts +129 -0
- package/src/symbol/symbol_style_layer.test.ts +103 -0
- package/src/symbol/transform_text.ts +27 -0
- package/src/ui/anchor.ts +27 -0
- package/src/ui/camera.test.ts +2301 -0
- package/src/ui/camera.ts +1520 -0
- package/src/ui/control/attribution_control.test.ts +543 -0
- package/src/ui/control/attribution_control.ts +209 -0
- package/src/ui/control/control.ts +67 -0
- package/src/ui/control/fullscreen_control.test.ts +114 -0
- package/src/ui/control/fullscreen_control.ts +189 -0
- package/src/ui/control/geolocate_control.test.ts +619 -0
- package/src/ui/control/geolocate_control.ts +725 -0
- package/src/ui/control/logo_control.test.ts +88 -0
- package/src/ui/control/logo_control.ts +86 -0
- package/src/ui/control/navigation_control.test.ts +238 -0
- package/src/ui/control/navigation_control.ts +294 -0
- package/src/ui/control/scale_control.test.ts +52 -0
- package/src/ui/control/scale_control.ts +152 -0
- package/src/ui/control/terrain_control.test.ts +58 -0
- package/src/ui/control/terrain_control.ts +74 -0
- package/src/ui/default_locale.ts +25 -0
- package/src/ui/events.ts +758 -0
- package/src/ui/handler/box_zoom.test.ts +163 -0
- package/src/ui/handler/box_zoom.ts +171 -0
- package/src/ui/handler/click_zoom.ts +55 -0
- package/src/ui/handler/cooperative_gestures.test.ts +338 -0
- package/src/ui/handler/cooperative_gestures.ts +111 -0
- package/src/ui/handler/dblclick_zoom.test.ts +151 -0
- package/src/ui/handler/drag_handler.ts +174 -0
- package/src/ui/handler/drag_move_state_manager.ts +115 -0
- package/src/ui/handler/drag_pan.test.ts +487 -0
- package/src/ui/handler/drag_rotate.test.ts +859 -0
- package/src/ui/handler/handler_util.ts +10 -0
- package/src/ui/handler/keyboard.test.ts +235 -0
- package/src/ui/handler/keyboard.ts +212 -0
- package/src/ui/handler/map_event.test.ts +158 -0
- package/src/ui/handler/map_event.ts +161 -0
- package/src/ui/handler/mouse.ts +92 -0
- package/src/ui/handler/mouse_handler_interface.test.ts +111 -0
- package/src/ui/handler/mouse_rotate.test.ts +62 -0
- package/src/ui/handler/one_finger_touch_drag.ts +45 -0
- package/src/ui/handler/one_finger_touch_drag_handler_interface.test.ts +77 -0
- package/src/ui/handler/scroll_zoom.test.ts +382 -0
- package/src/ui/handler/scroll_zoom.ts +379 -0
- package/src/ui/handler/shim/dblclick_zoom.ts +64 -0
- package/src/ui/handler/shim/drag_pan.ts +104 -0
- package/src/ui/handler/shim/drag_rotate.ts +76 -0
- package/src/ui/handler/shim/two_fingers_touch.ts +112 -0
- package/src/ui/handler/tap_drag_zoom.test.ts +113 -0
- package/src/ui/handler/tap_drag_zoom.ts +112 -0
- package/src/ui/handler/tap_recognizer.ts +138 -0
- package/src/ui/handler/tap_zoom.ts +98 -0
- package/src/ui/handler/touch_pan.ts +115 -0
- package/src/ui/handler/transform-provider.ts +44 -0
- package/src/ui/handler/two_fingers_touch.test.ts +283 -0
- package/src/ui/handler/two_fingers_touch.ts +336 -0
- package/src/ui/handler_inertia.ts +157 -0
- package/src/ui/handler_manager.ts +637 -0
- package/src/ui/hash.test.ts +404 -0
- package/src/ui/hash.ts +153 -0
- package/src/ui/map.ts +3393 -0
- package/src/ui/map_tests/map_animation.test.ts +61 -0
- package/src/ui/map_tests/map_basic.test.ts +223 -0
- package/src/ui/map_tests/map_bounds.test.ts +123 -0
- package/src/ui/map_tests/map_calculate_camera_options.test.ts +113 -0
- package/src/ui/map_tests/map_canvas.test.ts +59 -0
- package/src/ui/map_tests/map_control.test.ts +61 -0
- package/src/ui/map_tests/map_disable_handlers.test.ts +38 -0
- package/src/ui/map_tests/map_events.test.ts +1001 -0
- package/src/ui/map_tests/map_feature_state.test.ts +421 -0
- package/src/ui/map_tests/map_images.test.ts +175 -0
- package/src/ui/map_tests/map_is_moving.test.ts +164 -0
- package/src/ui/map_tests/map_is_rotating.test.ts +62 -0
- package/src/ui/map_tests/map_is_zooming.test.ts +86 -0
- package/src/ui/map_tests/map_layer.test.ts +457 -0
- package/src/ui/map_tests/map_options.test.ts +64 -0
- package/src/ui/map_tests/map_pitch.test.ts +90 -0
- package/src/ui/map_tests/map_pixel_ratio.test.ts +75 -0
- package/src/ui/map_tests/map_query_rendered_features.test.ts +93 -0
- package/src/ui/map_tests/map_render.test.ts +90 -0
- package/src/ui/map_tests/map_request_render_frame.test.ts +51 -0
- package/src/ui/map_tests/map_resize.test.ts +120 -0
- package/src/ui/map_tests/map_style.test.ts +541 -0
- package/src/ui/map_tests/map_terrian.test.ts +104 -0
- package/src/ui/map_tests/map_webgl.test.ts +72 -0
- package/src/ui/map_tests/map_world_copies.test.ts +103 -0
- package/src/ui/map_tests/map_zoom.test.ts +95 -0
- package/src/ui/marker.test.ts +1149 -0
- package/src/ui/marker.ts +880 -0
- package/src/ui/popup.test.ts +827 -0
- package/src/ui/popup.ts +717 -0
- package/src/util/abort_error.ts +21 -0
- package/src/util/actor.test.ts +218 -0
- package/src/util/actor.ts +241 -0
- package/src/util/actor_messages.ts +149 -0
- package/src/util/ajax.test.ts +237 -0
- package/src/util/ajax.ts +297 -0
- package/src/util/browser.test.ts +23 -0
- package/src/util/browser.ts +63 -0
- package/src/util/color_ramp.test.ts +105 -0
- package/src/util/color_ramp.ts +56 -0
- package/src/util/config.ts +29 -0
- package/src/util/dictionary_coder.ts +23 -0
- package/src/util/dispatcher.test.ts +76 -0
- package/src/util/dispatcher.ts +78 -0
- package/src/util/dom.ts +135 -0
- package/src/util/evented.test.ts +231 -0
- package/src/util/evented.ts +178 -0
- package/src/util/find_pole_of_inaccessibility.test.ts +21 -0
- package/src/util/find_pole_of_inaccessibility.ts +130 -0
- package/src/util/geolocation_support.test.ts +43 -0
- package/src/util/geolocation_support.ts +23 -0
- package/src/util/global_worker_pool.ts +65 -0
- package/src/util/image.ts +150 -0
- package/src/util/image_request.test.ts +408 -0
- package/src/util/image_request.ts +246 -0
- package/src/util/intersection_tests.ts +206 -0
- package/src/util/is_char_in_unicode_block.test.ts +15 -0
- package/src/util/is_char_in_unicode_block.ts +345 -0
- package/src/util/offscreen_canvas_distorted.test.ts +13 -0
- package/src/util/offscreen_canvas_distorted.ts +39 -0
- package/src/util/offscreen_canvas_supported.ts +11 -0
- package/src/util/performance.ts +117 -0
- package/src/util/primitives.test.ts +140 -0
- package/src/util/primitives.ts +143 -0
- package/src/util/request_manager.ts +42 -0
- package/src/util/resolve_tokens.test.ts +45 -0
- package/src/util/resolve_tokens.ts +17 -0
- package/src/util/script_detection.test.ts +138 -0
- package/src/util/script_detection.ts +376 -0
- package/src/util/smart_wrap.test.ts +97 -0
- package/src/util/smart_wrap.ts +58 -0
- package/src/util/struct_array.test.ts +101 -0
- package/src/util/struct_array.ts +246 -0
- package/src/util/style.test.ts +34 -0
- package/src/util/style.ts +28 -0
- package/src/util/task_queue.test.ts +114 -0
- package/src/util/task_queue.ts +64 -0
- package/src/util/test/util.ts +185 -0
- package/src/util/throttle.test.ts +42 -0
- package/src/util/throttle.ts +28 -0
- package/src/util/throttled_invoker.ts +41 -0
- package/src/util/transferable_grid_index.test.ts +56 -0
- package/src/util/transferable_grid_index.ts +214 -0
- package/src/util/util.test.ts +414 -0
- package/src/util/util.ts +724 -0
- package/src/util/vectortile_to_geojson.ts +72 -0
- package/src/util/verticalize_punctuation.ts +110 -0
- package/src/util/web_worker.ts +16 -0
- package/src/util/web_worker_transfer.test.ts +153 -0
- package/src/util/web_worker_transfer.ts +254 -0
- package/src/util/webp_supported.ts +63 -0
- package/src/util/worker_pool.test.ts +43 -0
- package/src/util/worker_pool.ts +58 -0
- package/src/util/world_bounds.test.ts +59 -0
- 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
|
+
}
|