@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,246 @@
|
|
|
1
|
+
// Note: all "sizes" are measured in bytes
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @internal
|
|
5
|
+
* A view type size
|
|
6
|
+
*/
|
|
7
|
+
const viewTypes = {
|
|
8
|
+
'Int8': Int8Array,
|
|
9
|
+
'Uint8': Uint8Array,
|
|
10
|
+
'Int16': Int16Array,
|
|
11
|
+
'Uint16': Uint16Array,
|
|
12
|
+
'Int32': Int32Array,
|
|
13
|
+
'Uint32': Uint32Array,
|
|
14
|
+
'Float32': Float32Array
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* @internal
|
|
19
|
+
* A view type size
|
|
20
|
+
*/
|
|
21
|
+
export type ViewType = keyof typeof viewTypes;
|
|
22
|
+
|
|
23
|
+
/** @internal */
|
|
24
|
+
class Struct {
|
|
25
|
+
_pos1: number;
|
|
26
|
+
_pos2: number;
|
|
27
|
+
_pos4: number;
|
|
28
|
+
_pos8: number;
|
|
29
|
+
readonly _structArray: StructArray;
|
|
30
|
+
|
|
31
|
+
// The following properties are defined on the prototype of sub classes.
|
|
32
|
+
size: number;
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* @param structArray - The StructArray the struct is stored in
|
|
36
|
+
* @param index - The index of the struct in the StructArray.
|
|
37
|
+
*/
|
|
38
|
+
constructor(structArray: StructArray, index: number) {
|
|
39
|
+
(this as any)._structArray = structArray;
|
|
40
|
+
this._pos1 = index * this.size;
|
|
41
|
+
this._pos2 = this._pos1 / 2;
|
|
42
|
+
this._pos4 = this._pos1 / 4;
|
|
43
|
+
this._pos8 = this._pos1 / 8;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
const DEFAULT_CAPACITY = 128;
|
|
48
|
+
const RESIZE_MULTIPLIER = 5;
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* @internal
|
|
52
|
+
* A struct array member
|
|
53
|
+
*/
|
|
54
|
+
export type StructArrayMember = {
|
|
55
|
+
name: string;
|
|
56
|
+
type: ViewType;
|
|
57
|
+
components: number;
|
|
58
|
+
offset: number;
|
|
59
|
+
};
|
|
60
|
+
|
|
61
|
+
export type StructArrayLayout = {
|
|
62
|
+
members: Array<StructArrayMember>;
|
|
63
|
+
size: number;
|
|
64
|
+
alignment: number;
|
|
65
|
+
};
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* An array that can be deserialized
|
|
69
|
+
*/
|
|
70
|
+
export type SerializedStructArray = {
|
|
71
|
+
length: number;
|
|
72
|
+
arrayBuffer: ArrayBuffer;
|
|
73
|
+
};
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* @internal
|
|
77
|
+
* `StructArray` provides an abstraction over `ArrayBuffer` and `TypedArray`
|
|
78
|
+
* making it behave like an array of typed structs.
|
|
79
|
+
*
|
|
80
|
+
* Conceptually, a StructArray is comprised of elements, i.e., instances of its
|
|
81
|
+
* associated struct type. Each particular struct type, together with an
|
|
82
|
+
* alignment size, determines the memory layout of a StructArray whose elements
|
|
83
|
+
* are of that type. Thus, for each such layout that we need, we have
|
|
84
|
+
* a corresponding StructArrayLayout class, inheriting from StructArray and
|
|
85
|
+
* implementing `emplaceBack()` and `_refreshViews()`.
|
|
86
|
+
*
|
|
87
|
+
* In some cases, where we need to access particular elements of a StructArray,
|
|
88
|
+
* we implement a more specific subclass that inherits from one of the
|
|
89
|
+
* StructArrayLayouts and adds a `get(i): T` accessor that returns a structured
|
|
90
|
+
* object whose properties are proxies into the underlying memory space for the
|
|
91
|
+
* i-th element. This affords the convenience of working with (seemingly) plain
|
|
92
|
+
* Javascript objects without the overhead of serializing/deserializing them
|
|
93
|
+
* into ArrayBuffers for efficient web worker transfer.
|
|
94
|
+
*/
|
|
95
|
+
abstract class StructArray {
|
|
96
|
+
capacity: number;
|
|
97
|
+
length: number;
|
|
98
|
+
isTransferred: boolean;
|
|
99
|
+
arrayBuffer: ArrayBuffer;
|
|
100
|
+
uint8: Uint8Array;
|
|
101
|
+
|
|
102
|
+
// The following properties are defined on the prototype.
|
|
103
|
+
members: Array<StructArrayMember>;
|
|
104
|
+
bytesPerElement: number;
|
|
105
|
+
abstract emplaceBack(...v: number[]);
|
|
106
|
+
abstract emplace(i: number, ...v: number[]);
|
|
107
|
+
|
|
108
|
+
constructor() {
|
|
109
|
+
this.isTransferred = false;
|
|
110
|
+
this.capacity = -1;
|
|
111
|
+
this.resize(0);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/**
|
|
115
|
+
* Serialize a StructArray instance. Serializes both the raw data and the
|
|
116
|
+
* metadata needed to reconstruct the StructArray base class during
|
|
117
|
+
* deserialization.
|
|
118
|
+
*/
|
|
119
|
+
static serialize(array: StructArray, transferables?: Array<Transferable>): SerializedStructArray {
|
|
120
|
+
|
|
121
|
+
array._trim();
|
|
122
|
+
|
|
123
|
+
if (transferables) {
|
|
124
|
+
array.isTransferred = true;
|
|
125
|
+
transferables.push(array.arrayBuffer);
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
return {
|
|
129
|
+
length: array.length,
|
|
130
|
+
arrayBuffer: array.arrayBuffer,
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
static deserialize(input: SerializedStructArray) {
|
|
135
|
+
const structArray = Object.create(this.prototype);
|
|
136
|
+
structArray.arrayBuffer = input.arrayBuffer;
|
|
137
|
+
structArray.length = input.length;
|
|
138
|
+
structArray.capacity = input.arrayBuffer.byteLength / structArray.bytesPerElement;
|
|
139
|
+
structArray._refreshViews();
|
|
140
|
+
return structArray;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
/**
|
|
144
|
+
* Resize the array to discard unused capacity.
|
|
145
|
+
*/
|
|
146
|
+
_trim() {
|
|
147
|
+
if (this.length !== this.capacity) {
|
|
148
|
+
this.capacity = this.length;
|
|
149
|
+
this.arrayBuffer = this.arrayBuffer.slice(0, this.length * this.bytesPerElement);
|
|
150
|
+
this._refreshViews();
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
/**
|
|
155
|
+
* Resets the length of the array to 0 without de-allocating capacity.
|
|
156
|
+
*/
|
|
157
|
+
clear() {
|
|
158
|
+
this.length = 0;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
/**
|
|
162
|
+
* Resize the array.
|
|
163
|
+
* If `n` is greater than the current length then additional elements with undefined values are added.
|
|
164
|
+
* If `n` is less than the current length then the array will be reduced to the first `n` elements.
|
|
165
|
+
* @param n - The new size of the array.
|
|
166
|
+
*/
|
|
167
|
+
resize(n: number) {
|
|
168
|
+
this.reserve(n);
|
|
169
|
+
this.length = n;
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
/**
|
|
173
|
+
* Indicate a planned increase in size, so that any necessary allocation may
|
|
174
|
+
* be done once, ahead of time.
|
|
175
|
+
* @param n - The expected size of the array.
|
|
176
|
+
*/
|
|
177
|
+
reserve(n: number) {
|
|
178
|
+
if (n > this.capacity) {
|
|
179
|
+
this.capacity = Math.max(n, Math.floor(this.capacity * RESIZE_MULTIPLIER), DEFAULT_CAPACITY);
|
|
180
|
+
this.arrayBuffer = new ArrayBuffer(this.capacity * this.bytesPerElement);
|
|
181
|
+
|
|
182
|
+
const oldUint8Array = this.uint8;
|
|
183
|
+
this._refreshViews();
|
|
184
|
+
if (oldUint8Array) this.uint8.set(oldUint8Array);
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
/**
|
|
189
|
+
* Create TypedArray views for the current ArrayBuffer.
|
|
190
|
+
*/
|
|
191
|
+
_refreshViews() {
|
|
192
|
+
throw new Error('_refreshViews() must be implemented by each concrete StructArray layout');
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
/**
|
|
197
|
+
* Given a list of member fields, create a full StructArrayLayout, in
|
|
198
|
+
* particular calculating the correct byte offset for each field. This data
|
|
199
|
+
* is used at build time to generate StructArrayLayout_*#emplaceBack() and
|
|
200
|
+
* other accessors, and at runtime for binding vertex buffer attributes.
|
|
201
|
+
*/
|
|
202
|
+
function createLayout(
|
|
203
|
+
members: Array<{
|
|
204
|
+
name: string;
|
|
205
|
+
type: ViewType;
|
|
206
|
+
readonly components?: number;
|
|
207
|
+
}>,
|
|
208
|
+
alignment: number = 1
|
|
209
|
+
): StructArrayLayout {
|
|
210
|
+
|
|
211
|
+
let offset = 0;
|
|
212
|
+
let maxSize = 0;
|
|
213
|
+
const layoutMembers = members.map((member) => {
|
|
214
|
+
const typeSize = sizeOf(member.type);
|
|
215
|
+
const memberOffset = offset = align(offset, Math.max(alignment, typeSize));
|
|
216
|
+
const components = member.components || 1;
|
|
217
|
+
|
|
218
|
+
maxSize = Math.max(maxSize, typeSize);
|
|
219
|
+
offset += typeSize * components;
|
|
220
|
+
|
|
221
|
+
return {
|
|
222
|
+
name: member.name,
|
|
223
|
+
type: member.type,
|
|
224
|
+
components,
|
|
225
|
+
offset: memberOffset,
|
|
226
|
+
};
|
|
227
|
+
});
|
|
228
|
+
|
|
229
|
+
const size = align(offset, Math.max(maxSize, alignment));
|
|
230
|
+
|
|
231
|
+
return {
|
|
232
|
+
members: layoutMembers,
|
|
233
|
+
size,
|
|
234
|
+
alignment
|
|
235
|
+
};
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
function sizeOf(type: ViewType): number {
|
|
239
|
+
return viewTypes[type].BYTES_PER_ELEMENT;
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
function align(offset: number, size: number): number {
|
|
243
|
+
return Math.ceil(offset / size) * size;
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
export {StructArray, Struct, viewTypes, createLayout};
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import {coerceSpriteToArray} from './style';
|
|
2
|
+
|
|
3
|
+
describe('style utils', () => {
|
|
4
|
+
describe('#coerceSpriteToArray', () => {
|
|
5
|
+
test('input === output when array', () => {
|
|
6
|
+
const inputSpriteArray = [{id: 'id', url: 'url'}];
|
|
7
|
+
const outputSpriteArray = coerceSpriteToArray(inputSpriteArray);
|
|
8
|
+
expect(outputSpriteArray).toHaveLength(1);
|
|
9
|
+
expect(outputSpriteArray[0].id).toBe('id');
|
|
10
|
+
expect(outputSpriteArray[0].url).toBe('url');
|
|
11
|
+
});
|
|
12
|
+
|
|
13
|
+
test('coerced to array when string', () => {
|
|
14
|
+
const expected = [{id: 'default', url: 'url'}];
|
|
15
|
+
expect(coerceSpriteToArray('url')).toEqual(expected);
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
test('returns an empty array when nothing\'s passed in', () => {
|
|
19
|
+
expect(coerceSpriteToArray()).toEqual([]);
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
test('duplicated entries should be removed', () => {
|
|
23
|
+
const spriteWithDuplicatedEntries = [
|
|
24
|
+
{id: 'sprite1', url: 'https://example.com'},
|
|
25
|
+
{id: 'sprite1', url: 'https://example.com'}];
|
|
26
|
+
|
|
27
|
+
const result = coerceSpriteToArray(spriteWithDuplicatedEntries);
|
|
28
|
+
|
|
29
|
+
expect(result).toHaveLength(1);
|
|
30
|
+
expect(result[0].id).toBe('sprite1');
|
|
31
|
+
expect(result[0].url).toBe('https://example.com');
|
|
32
|
+
});
|
|
33
|
+
});
|
|
34
|
+
});
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type {SpriteSpecification} from '@maplibre/maplibre-gl-style-spec';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Takes a SpriteSpecification value and returns it in its array form. If `undefined` is passed as an input value, an
|
|
5
|
+
* empty array is returned.
|
|
6
|
+
* duplicated entries with identical id/url will be removed in returned array
|
|
7
|
+
* @param sprite - optional sprite to coerce
|
|
8
|
+
* @returns an empty array in case `undefined` is passed; id-url pairs otherwise
|
|
9
|
+
*/
|
|
10
|
+
export function coerceSpriteToArray(sprite?: SpriteSpecification): {id: string; url: string}[] {
|
|
11
|
+
const resultArray: {id: string; url: string}[] = [];
|
|
12
|
+
|
|
13
|
+
if (typeof sprite === 'string') {
|
|
14
|
+
resultArray.push({id: 'default', url: sprite});
|
|
15
|
+
} else if (sprite && sprite.length > 0) {
|
|
16
|
+
const dedupArray: string[] = [];
|
|
17
|
+
for (const {id, url} of sprite) {
|
|
18
|
+
const key = `${id}${url}`;
|
|
19
|
+
if (dedupArray.indexOf(key) === -1) {
|
|
20
|
+
dedupArray.push(key);
|
|
21
|
+
resultArray.push({id, url});
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
return resultArray;
|
|
27
|
+
|
|
28
|
+
}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import {TaskQueue} from './task_queue';
|
|
2
|
+
|
|
3
|
+
describe('TaskQueue', () => {
|
|
4
|
+
test('Calls callbacks, in order', () => {
|
|
5
|
+
const q = new TaskQueue();
|
|
6
|
+
let first = 0;
|
|
7
|
+
let second = 0;
|
|
8
|
+
q.add(() => {
|
|
9
|
+
expect(++first).toBe(1);
|
|
10
|
+
expect(second).toBe(0);
|
|
11
|
+
});
|
|
12
|
+
q.add(() => {
|
|
13
|
+
expect(first).toBe(1);
|
|
14
|
+
expect(++second).toBe(1);
|
|
15
|
+
});
|
|
16
|
+
q.run();
|
|
17
|
+
expect(first).toBe(1);
|
|
18
|
+
expect(second).toBe(1);
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
test('Allows a given callback to be queued multiple times', () => {
|
|
22
|
+
const q = new TaskQueue();
|
|
23
|
+
const fn = jest.fn();
|
|
24
|
+
q.add(fn);
|
|
25
|
+
q.add(fn);
|
|
26
|
+
q.run();
|
|
27
|
+
expect(fn).toHaveBeenCalledTimes(2);
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
test('Does not call a callback that was cancelled before the queue was run', () => {
|
|
31
|
+
const q = new TaskQueue();
|
|
32
|
+
const yes = jest.fn();
|
|
33
|
+
const no = jest.fn();
|
|
34
|
+
q.add(yes);
|
|
35
|
+
const id = q.add(no);
|
|
36
|
+
q.remove(id);
|
|
37
|
+
q.run();
|
|
38
|
+
expect(yes).toHaveBeenCalledTimes(1);
|
|
39
|
+
expect(no).not.toHaveBeenCalled();
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
test('Does not call a callback that was cancelled while the queue was running', () => {
|
|
43
|
+
const q = new TaskQueue();
|
|
44
|
+
const yes = jest.fn();
|
|
45
|
+
const no = jest.fn();
|
|
46
|
+
q.add(yes);
|
|
47
|
+
let id; // eslint-disable-line prefer-const
|
|
48
|
+
q.add(() => q.remove(id));
|
|
49
|
+
id = q.add(no);
|
|
50
|
+
q.run();
|
|
51
|
+
expect(yes).toHaveBeenCalledTimes(1);
|
|
52
|
+
expect(no).not.toHaveBeenCalled();
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
test('Allows each instance of a multiply-queued callback to be cancelled independently', () => {
|
|
56
|
+
const q = new TaskQueue();
|
|
57
|
+
const cb = jest.fn();
|
|
58
|
+
q.add(cb);
|
|
59
|
+
const id = q.add(cb);
|
|
60
|
+
q.remove(id);
|
|
61
|
+
q.run();
|
|
62
|
+
expect(cb).toHaveBeenCalledTimes(1);
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
test('Does not throw if a remove() is called after running the queue', () => {
|
|
66
|
+
const q = new TaskQueue();
|
|
67
|
+
const cb = jest.fn();
|
|
68
|
+
const id = q.add(cb);
|
|
69
|
+
q.run();
|
|
70
|
+
q.remove(id);
|
|
71
|
+
expect(cb).toHaveBeenCalledTimes(1);
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
test('Does not add tasks to the currently-running queue', () => {
|
|
75
|
+
const q = new TaskQueue();
|
|
76
|
+
const cb = jest.fn();
|
|
77
|
+
q.add(() => q.add(cb));
|
|
78
|
+
q.run();
|
|
79
|
+
expect(cb).not.toHaveBeenCalled();
|
|
80
|
+
q.run();
|
|
81
|
+
expect(cb).toHaveBeenCalledTimes(1);
|
|
82
|
+
});
|
|
83
|
+
|
|
84
|
+
test('TaskQueue#run() throws on attempted re-entrance', () => {
|
|
85
|
+
const q = new TaskQueue();
|
|
86
|
+
q.add(() => q.run());
|
|
87
|
+
expect(() => q.run()).toThrow();
|
|
88
|
+
});
|
|
89
|
+
|
|
90
|
+
test('TaskQueue#clear() prevents queued task from being executed', () => {
|
|
91
|
+
const q = new TaskQueue();
|
|
92
|
+
const before = jest.fn();
|
|
93
|
+
const after = jest.fn();
|
|
94
|
+
q.add(before);
|
|
95
|
+
q.clear();
|
|
96
|
+
q.add(after);
|
|
97
|
+
q.run();
|
|
98
|
+
expect(before).not.toHaveBeenCalled();
|
|
99
|
+
expect(after).toHaveBeenCalledTimes(1);
|
|
100
|
+
});
|
|
101
|
+
|
|
102
|
+
test('TaskQueue#clear() interrupts currently-running queue', () => {
|
|
103
|
+
const q = new TaskQueue();
|
|
104
|
+
const before = jest.fn();
|
|
105
|
+
const after = jest.fn();
|
|
106
|
+
q.add(() => q.add(after));
|
|
107
|
+
q.add(() => q.clear());
|
|
108
|
+
q.add(before);
|
|
109
|
+
q.run();
|
|
110
|
+
expect(before).not.toHaveBeenCalled();
|
|
111
|
+
q.run();
|
|
112
|
+
expect(after).not.toHaveBeenCalled();
|
|
113
|
+
});
|
|
114
|
+
});
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
export type TaskID = number;
|
|
2
|
+
|
|
3
|
+
type Task = {
|
|
4
|
+
callback: (timeStamp: number) => void;
|
|
5
|
+
id: TaskID;
|
|
6
|
+
cancelled: boolean;
|
|
7
|
+
};
|
|
8
|
+
|
|
9
|
+
export class TaskQueue {
|
|
10
|
+
_queue: Array<Task>;
|
|
11
|
+
_id: TaskID;
|
|
12
|
+
_cleared: boolean;
|
|
13
|
+
_currentlyRunning: Array<Task> | false;
|
|
14
|
+
|
|
15
|
+
constructor() {
|
|
16
|
+
this._queue = [];
|
|
17
|
+
this._id = 0;
|
|
18
|
+
this._cleared = false;
|
|
19
|
+
this._currentlyRunning = false;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
add(callback: (timeStamp: number) => void): TaskID {
|
|
23
|
+
const id = ++this._id;
|
|
24
|
+
const queue = this._queue;
|
|
25
|
+
queue.push({callback, id, cancelled: false});
|
|
26
|
+
return id;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
remove(id: TaskID) {
|
|
30
|
+
const running = this._currentlyRunning;
|
|
31
|
+
const queue = running ? this._queue.concat(running) : this._queue;
|
|
32
|
+
for (const task of queue) {
|
|
33
|
+
if (task.id === id) {
|
|
34
|
+
task.cancelled = true;
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
run(timeStamp: number = 0) {
|
|
41
|
+
if (this._currentlyRunning) throw new Error('Attempting to run(), but is already running.');
|
|
42
|
+
const queue = this._currentlyRunning = this._queue;
|
|
43
|
+
|
|
44
|
+
// Tasks queued by callbacks in the current queue should be executed
|
|
45
|
+
// on the next run, not the current run.
|
|
46
|
+
this._queue = [];
|
|
47
|
+
|
|
48
|
+
for (const task of queue) {
|
|
49
|
+
if (task.cancelled) continue;
|
|
50
|
+
task.callback(timeStamp);
|
|
51
|
+
if (this._cleared) break;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
this._cleared = false;
|
|
55
|
+
this._currentlyRunning = false;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
clear() {
|
|
59
|
+
if (this._currentlyRunning) {
|
|
60
|
+
this._cleared = true;
|
|
61
|
+
}
|
|
62
|
+
this._queue = [];
|
|
63
|
+
}
|
|
64
|
+
}
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
import {Map} from '../../ui/map';
|
|
2
|
+
import {extend} from '../../util/util';
|
|
3
|
+
import {Dispatcher} from '../../util/dispatcher';
|
|
4
|
+
import {IActor} from '../actor';
|
|
5
|
+
import type {Evented} from '../evented';
|
|
6
|
+
import {SourceSpecification, StyleSpecification} from '@maplibre/maplibre-gl-style-spec';
|
|
7
|
+
|
|
8
|
+
export function createMap(options?, callback?) {
|
|
9
|
+
const container = window.document.createElement('div');
|
|
10
|
+
const defaultOptions = {
|
|
11
|
+
container,
|
|
12
|
+
interactive: false,
|
|
13
|
+
attributionControl: false,
|
|
14
|
+
maplibreLogo: false,
|
|
15
|
+
trackResize: true,
|
|
16
|
+
style: {
|
|
17
|
+
'version': 8,
|
|
18
|
+
'sources': {},
|
|
19
|
+
'layers': []
|
|
20
|
+
}
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
Object.defineProperty(container, 'clientWidth', {value: 200, configurable: true});
|
|
24
|
+
Object.defineProperty(container, 'clientHeight', {value: 200, configurable: true});
|
|
25
|
+
|
|
26
|
+
if (options?.deleteStyle) delete defaultOptions.style;
|
|
27
|
+
|
|
28
|
+
const map = new Map(extend(defaultOptions, options));
|
|
29
|
+
if (callback) map.on('load', () => {
|
|
30
|
+
callback(null, map);
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
return map;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export function equalWithPrecision(test, expected, actual, multiplier, message, extra) {
|
|
37
|
+
message = message || `should be equal to within ${multiplier}`;
|
|
38
|
+
const expectedRounded = Math.round(expected / multiplier) * multiplier;
|
|
39
|
+
const actualRounded = Math.round(actual / multiplier) * multiplier;
|
|
40
|
+
|
|
41
|
+
return test.equal(expectedRounded, actualRounded, message, extra);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
export function setPerformance() {
|
|
45
|
+
window.performance.mark = jest.fn();
|
|
46
|
+
window.performance.clearMeasures = jest.fn();
|
|
47
|
+
window.performance.clearMarks = jest.fn();
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
export function setMatchMedia() {
|
|
51
|
+
// https://jestjs.io/docs/manual-mocks#mocking-methods-which-are-not-implemented-in-jsdom
|
|
52
|
+
Object.defineProperty(window, 'matchMedia', {
|
|
53
|
+
writable: true,
|
|
54
|
+
value: jest.fn().mockImplementation(query => ({
|
|
55
|
+
matches: false,
|
|
56
|
+
media: query,
|
|
57
|
+
onchange: null,
|
|
58
|
+
addListener: jest.fn(), // deprecated
|
|
59
|
+
removeListener: jest.fn(), // deprecated
|
|
60
|
+
addEventListener: jest.fn(),
|
|
61
|
+
removeEventListener: jest.fn(),
|
|
62
|
+
dispatchEvent: jest.fn(),
|
|
63
|
+
})),
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
function setResizeObserver() {
|
|
68
|
+
global.ResizeObserver = jest.fn().mockImplementation(() => ({
|
|
69
|
+
observe: jest.fn(),
|
|
70
|
+
unobserve: jest.fn(),
|
|
71
|
+
disconnect: jest.fn(),
|
|
72
|
+
}));
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
export function beforeMapTest() {
|
|
76
|
+
setPerformance();
|
|
77
|
+
setMatchMedia();
|
|
78
|
+
setResizeObserver();
|
|
79
|
+
// remove the following when the following is merged and released: https://github.com/Adamfsk/jest-webgl-canvas-mock/pull/5
|
|
80
|
+
(WebGLRenderingContext.prototype as any).bindVertexArray = WebGLRenderingContext.prototype.getExtension('OES_vertex_array_object').bindVertexArrayOES;
|
|
81
|
+
(WebGLRenderingContext.prototype as any).createVertexArray = WebGLRenderingContext.prototype.getExtension('OES_vertex_array_object').createVertexArrayOES;
|
|
82
|
+
if (!WebGLRenderingContext.prototype.drawingBufferHeight && !WebGLRenderingContext.prototype.drawingBufferWidth) {
|
|
83
|
+
Object.defineProperty(WebGLRenderingContext.prototype, 'drawingBufferWidth', {
|
|
84
|
+
get: jest.fn(),
|
|
85
|
+
configurable: true,
|
|
86
|
+
});
|
|
87
|
+
Object.defineProperty(WebGLRenderingContext.prototype, 'drawingBufferHeight', {
|
|
88
|
+
get: jest.fn(),
|
|
89
|
+
configurable: true,
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
export function getWrapDispatcher() {
|
|
95
|
+
const wrapDispatcher = (actor: IActor) => {
|
|
96
|
+
return {
|
|
97
|
+
getActor() {
|
|
98
|
+
return actor;
|
|
99
|
+
}
|
|
100
|
+
} as any as Dispatcher;
|
|
101
|
+
};
|
|
102
|
+
|
|
103
|
+
return wrapDispatcher;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
export function getMockDispatcher() {
|
|
107
|
+
const wrapDispatcher = getWrapDispatcher();
|
|
108
|
+
|
|
109
|
+
const mockDispatcher = wrapDispatcher({
|
|
110
|
+
sendAsync() { return Promise.resolve({}); },
|
|
111
|
+
});
|
|
112
|
+
|
|
113
|
+
return mockDispatcher;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
export function stubAjaxGetImage(createImageBitmap) {
|
|
117
|
+
global.createImageBitmap = createImageBitmap;
|
|
118
|
+
|
|
119
|
+
global.URL.revokeObjectURL = () => {};
|
|
120
|
+
global.URL.createObjectURL = (_) => { return null; };
|
|
121
|
+
|
|
122
|
+
// eslint-disable-next-line accessor-pairs
|
|
123
|
+
Object.defineProperty(global.Image.prototype, 'src', {
|
|
124
|
+
set(url: string) {
|
|
125
|
+
if (url === 'error') {
|
|
126
|
+
this.onerror();
|
|
127
|
+
} else if (this.onload) {
|
|
128
|
+
this.onload();
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
/**
|
|
135
|
+
* This should be used in test that use nise since the internal buffer returned from a file is not an instance of ArrayBuffer for some reason.
|
|
136
|
+
* @param data - the data read from a file, for example by `fs.readFileSync(...)`
|
|
137
|
+
* @returns a copy of the data in the file in `ArrayBuffer` format
|
|
138
|
+
*/
|
|
139
|
+
export function bufferToArrayBuffer(data: Buffer): ArrayBuffer {
|
|
140
|
+
const newBuffer = new ArrayBuffer(data.buffer.byteLength);
|
|
141
|
+
const view = new Uint8Array(newBuffer);
|
|
142
|
+
data.copy(view);
|
|
143
|
+
return view.buffer;
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
/**
|
|
147
|
+
* This allows test to wait for a certain amount of time before continuing.
|
|
148
|
+
* @param milliseconds - the amount of time to wait in milliseconds
|
|
149
|
+
* @returns - a promise that resolves after the specified amount of time
|
|
150
|
+
*/
|
|
151
|
+
export const sleep = (milliseconds: number = 0) => {
|
|
152
|
+
return new Promise<void>(resolve => setTimeout(resolve, milliseconds));
|
|
153
|
+
};
|
|
154
|
+
|
|
155
|
+
export function waitForMetadataEvent(source: Evented): Promise<void> {
|
|
156
|
+
return new Promise((resolve) => {
|
|
157
|
+
source.on('data', (e) => {
|
|
158
|
+
if (e.sourceDataType === 'metadata') {
|
|
159
|
+
resolve();
|
|
160
|
+
}
|
|
161
|
+
});
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
export function createStyleSource() {
|
|
166
|
+
return {
|
|
167
|
+
type: 'geojson',
|
|
168
|
+
data: {
|
|
169
|
+
type: 'FeatureCollection',
|
|
170
|
+
features: []
|
|
171
|
+
}
|
|
172
|
+
} as SourceSpecification;
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
export function createStyle(): StyleSpecification {
|
|
176
|
+
return {
|
|
177
|
+
version: 8,
|
|
178
|
+
center: [-73.9749, 40.7736],
|
|
179
|
+
zoom: 12.5,
|
|
180
|
+
bearing: 29,
|
|
181
|
+
pitch: 50,
|
|
182
|
+
sources: {},
|
|
183
|
+
layers: []
|
|
184
|
+
};
|
|
185
|
+
}
|