@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,237 @@
|
|
|
1
|
+
import {
|
|
2
|
+
getArrayBuffer,
|
|
3
|
+
getJSON,
|
|
4
|
+
AJAXError,
|
|
5
|
+
sameOrigin
|
|
6
|
+
} from './ajax';
|
|
7
|
+
|
|
8
|
+
import {fakeServer, type FakeServer} from 'nise';
|
|
9
|
+
|
|
10
|
+
function readAsText(blob) {
|
|
11
|
+
return new Promise((resolve, reject) => {
|
|
12
|
+
const fileReader = new FileReader();
|
|
13
|
+
fileReader.onload = () => resolve(fileReader.result);
|
|
14
|
+
fileReader.onerror = () => reject(fileReader.error);
|
|
15
|
+
fileReader.readAsText(blob);
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
describe('ajax', () => {
|
|
20
|
+
let server: FakeServer;
|
|
21
|
+
beforeEach(() => {
|
|
22
|
+
global.fetch = null;
|
|
23
|
+
server = fakeServer.create();
|
|
24
|
+
});
|
|
25
|
+
afterEach(() => {
|
|
26
|
+
server.restore();
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
test('getArrayBuffer, 404', async () => {
|
|
30
|
+
server.respondWith(request => {
|
|
31
|
+
request.respond(404, undefined, '404 Not Found');
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
try {
|
|
35
|
+
const promise = getArrayBuffer({url: 'http://example.com/test.bin'}, new AbortController());
|
|
36
|
+
server.respond();
|
|
37
|
+
await promise;
|
|
38
|
+
} catch (error) {
|
|
39
|
+
const ajaxError = error as AJAXError;
|
|
40
|
+
const body = await readAsText(ajaxError.body);
|
|
41
|
+
expect(ajaxError.status).toBe(404);
|
|
42
|
+
expect(ajaxError.statusText).toBe('Not Found');
|
|
43
|
+
expect(ajaxError.url).toBe('http://example.com/test.bin');
|
|
44
|
+
expect(body).toBe('404 Not Found');
|
|
45
|
+
}
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
test('getJSON', async () => {
|
|
49
|
+
server.respondWith(request => {
|
|
50
|
+
request.respond(200, {'Content-Type': 'application/json'}, '{"foo": "bar"}');
|
|
51
|
+
});
|
|
52
|
+
const promise = getJSON({url: ''}, new AbortController());
|
|
53
|
+
server.respond();
|
|
54
|
+
|
|
55
|
+
const body = await promise;
|
|
56
|
+
expect(body.data).toEqual({foo: 'bar'});
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
test('getJSON, invalid syntax', async () => {
|
|
60
|
+
server.respondWith(request => {
|
|
61
|
+
request.respond(200, {'Content-Type': 'application/json'}, 'how do i even');
|
|
62
|
+
});
|
|
63
|
+
const promise = getJSON({url: ''}, new AbortController());
|
|
64
|
+
server.respond();
|
|
65
|
+
try {
|
|
66
|
+
await promise;
|
|
67
|
+
} catch (error) {
|
|
68
|
+
expect(error).toBeTruthy();
|
|
69
|
+
}
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
test('getJSON, 404', async () => {
|
|
73
|
+
server.respondWith(request => {
|
|
74
|
+
request.respond(404, undefined, '404 Not Found');
|
|
75
|
+
});
|
|
76
|
+
const promise = getJSON({url: 'http://example.com/test.json'}, new AbortController());
|
|
77
|
+
server.respond();
|
|
78
|
+
|
|
79
|
+
try {
|
|
80
|
+
await promise;
|
|
81
|
+
} catch (error) {
|
|
82
|
+
const ajaxError = error as AJAXError;
|
|
83
|
+
const body = await readAsText(ajaxError.body);
|
|
84
|
+
expect(ajaxError.status).toBe(404);
|
|
85
|
+
expect(ajaxError.statusText).toBe('Not Found');
|
|
86
|
+
expect(ajaxError.url).toBe('http://example.com/test.json');
|
|
87
|
+
expect(body).toBe('404 Not Found');
|
|
88
|
+
}
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
test('sameOrigin method', () => {
|
|
92
|
+
jest.spyOn(window, 'location', 'get').mockReturnValue({
|
|
93
|
+
protocol: 'https:',
|
|
94
|
+
host: 'somewhere.com'
|
|
95
|
+
} as any);
|
|
96
|
+
|
|
97
|
+
expect(sameOrigin('https://somewhere.com')).toBe(true);
|
|
98
|
+
expect(sameOrigin('https://somewhere.com/path')).toBe(true);
|
|
99
|
+
expect(sameOrigin('https://somewhere.com/path/?q=abc')).toBe(true);
|
|
100
|
+
|
|
101
|
+
expect(sameOrigin('https://somewhere.com:443/path')).toBe(true);
|
|
102
|
+
|
|
103
|
+
expect(sameOrigin('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAC0lEQVQYV2NgAAIAAAUAAarVyFEAAAAASUVORK5CYII=')).toBe(true);
|
|
104
|
+
expect(sameOrigin('blob:https://www.bing.com/09f36686-e57a-420f-9004-918548219b75')).toBe(true);
|
|
105
|
+
|
|
106
|
+
// relative URL is same origin for sure
|
|
107
|
+
expect(sameOrigin('/foo')).toBe(true);
|
|
108
|
+
expect(sameOrigin('foo')).toBe(true);
|
|
109
|
+
|
|
110
|
+
// empty string is considered as relative, and should be true
|
|
111
|
+
expect(sameOrigin('')).toBe(true);
|
|
112
|
+
expect(sameOrigin(null)).toBe(true);
|
|
113
|
+
expect(sameOrigin(undefined)).toBe(true);
|
|
114
|
+
|
|
115
|
+
expect(sameOrigin('HTTPS://somewhere.com')).toBe(true);
|
|
116
|
+
|
|
117
|
+
// different domain
|
|
118
|
+
expect(sameOrigin('httpS://www.somewhere.com')).toBe(false);
|
|
119
|
+
|
|
120
|
+
// different protocol
|
|
121
|
+
expect(sameOrigin('HTTP://somewhere.com')).toBe(false);
|
|
122
|
+
expect(sameOrigin('file:///c:/temp/foo.html')).toBe(false);
|
|
123
|
+
|
|
124
|
+
// file url
|
|
125
|
+
jest.spyOn(window, 'location', 'get').mockReturnValue({
|
|
126
|
+
protocol: 'file:',
|
|
127
|
+
host: ''
|
|
128
|
+
} as any);
|
|
129
|
+
expect(sameOrigin('file:///C:/Temp/abc.html')).toBe(true);
|
|
130
|
+
expect(sameOrigin('HTTP://somewhere.com')).toBe(false);
|
|
131
|
+
|
|
132
|
+
// relative URL (for file URL) is same origin as well
|
|
133
|
+
expect(sameOrigin('/foo')).toBe(true);
|
|
134
|
+
expect(sameOrigin('foo')).toBe(true);
|
|
135
|
+
|
|
136
|
+
// edge case
|
|
137
|
+
expect(sameOrigin('://foo')).toBe(true);
|
|
138
|
+
});
|
|
139
|
+
|
|
140
|
+
describe('requests parameters', () => {
|
|
141
|
+
|
|
142
|
+
test('should be provided to fetch API in getArrayBuffer function', async () => {
|
|
143
|
+
server.respondWith(new ArrayBuffer(1));
|
|
144
|
+
|
|
145
|
+
const promise = getArrayBuffer({url: 'http://example.com/test-params.json', cache: 'force-cache', headers: {'Authorization': 'Bearer 123'}}, new AbortController());
|
|
146
|
+
server.respond();
|
|
147
|
+
await promise;
|
|
148
|
+
|
|
149
|
+
expect(server.requests).toHaveLength(1);
|
|
150
|
+
expect(server.requests[0].url).toBe('http://example.com/test-params.json');
|
|
151
|
+
expect(server.requests[0].method).toBe('GET');
|
|
152
|
+
expect(server.requests[0].requestHeaders['Authorization']).toBe('Bearer 123');
|
|
153
|
+
});
|
|
154
|
+
|
|
155
|
+
test('should be provided to fetch API in getJSON function', async () => {
|
|
156
|
+
|
|
157
|
+
server.respondWith(request => {
|
|
158
|
+
request.respond(200, {'Content-Type': 'application/json'}, '{"foo": "bar"}');
|
|
159
|
+
});
|
|
160
|
+
|
|
161
|
+
const promise = getJSON({url: 'http://example.com/test-params.json', cache: 'force-cache', headers: {'Authorization': 'Bearer 123'}}, new AbortController());
|
|
162
|
+
server.respond();
|
|
163
|
+
await promise;
|
|
164
|
+
|
|
165
|
+
expect(server.requests).toHaveLength(1);
|
|
166
|
+
expect(server.requests[0].url).toBe('http://example.com/test-params.json');
|
|
167
|
+
expect(server.requests[0].method).toBe('GET');
|
|
168
|
+
expect(server.requests[0].requestHeaders['Authorization']).toBe('Bearer 123');
|
|
169
|
+
});
|
|
170
|
+
|
|
171
|
+
test('should preserve user-specified Accept header', async () => {
|
|
172
|
+
server.respondWith(request => {
|
|
173
|
+
// Note that PostgREST responds to this type of request with application/geo+json
|
|
174
|
+
request.respond(200, {'Content-Type': 'application/geo+json'}, '{"foo": "bar"}');
|
|
175
|
+
});
|
|
176
|
+
|
|
177
|
+
const promise = getJSON({url: 'http://example.com/test-params.json', cache: 'force-cache', headers: {'Authorization': 'Bearer 123', 'Accept': 'application/geo+json'}}, new AbortController());
|
|
178
|
+
server.respond();
|
|
179
|
+
await promise;
|
|
180
|
+
|
|
181
|
+
expect(server.requests).toHaveLength(1);
|
|
182
|
+
expect(server.requests[0].url).toBe('http://example.com/test-params.json');
|
|
183
|
+
expect(server.requests[0].method).toBe('GET');
|
|
184
|
+
expect(server.requests[0].requestHeaders['Authorization']).toBe('Bearer 123');
|
|
185
|
+
expect(server.requests[0].requestHeaders['Accept']).toBe('application/geo+json');
|
|
186
|
+
});
|
|
187
|
+
|
|
188
|
+
test('should add default Accept header when user has not specified one', async () => {
|
|
189
|
+
server.respondWith(request => {
|
|
190
|
+
request.respond(200, {'Content-Type': 'application/json'}, '{"foo": "bar"}');
|
|
191
|
+
});
|
|
192
|
+
|
|
193
|
+
const promise = getJSON({url: 'http://example.com/test-params.json', cache: 'force-cache', headers: {'Authorization': 'Bearer 123'}}, new AbortController());
|
|
194
|
+
server.respond();
|
|
195
|
+
await promise;
|
|
196
|
+
|
|
197
|
+
expect(server.requests).toHaveLength(1);
|
|
198
|
+
expect(server.requests[0].url).toBe('http://example.com/test-params.json');
|
|
199
|
+
expect(server.requests[0].method).toBe('GET');
|
|
200
|
+
expect(server.requests[0].requestHeaders['Authorization']).toBe('Bearer 123');
|
|
201
|
+
expect(server.requests[0].requestHeaders['Accept']).toBe('application/json');
|
|
202
|
+
});
|
|
203
|
+
|
|
204
|
+
test('should add default Accept header when user has not specified one, even for file:// requests', async () => {
|
|
205
|
+
server.respondWith(request => {
|
|
206
|
+
request.respond(200, {'Content-Type': 'application/json'}, '{"foo": "bar"}');
|
|
207
|
+
});
|
|
208
|
+
|
|
209
|
+
const promise = getJSON({url: 'file:///C:/Temp/abc.json', cache: 'force-cache', headers: {'Authorization': 'Bearer 123'}}, new AbortController());
|
|
210
|
+
server.respond();
|
|
211
|
+
await promise;
|
|
212
|
+
|
|
213
|
+
expect(server.requests).toHaveLength(1);
|
|
214
|
+
expect(server.requests[0].url).toBe('file:///C:/Temp/abc.json');
|
|
215
|
+
expect(server.requests[0].method).toBe('GET');
|
|
216
|
+
expect(server.requests[0].requestHeaders['Authorization']).toBe('Bearer 123');
|
|
217
|
+
expect(server.requests[0].requestHeaders['Accept']).toBe('application/json');
|
|
218
|
+
});
|
|
219
|
+
|
|
220
|
+
test('should not add default Accept header when user has already specified one, even for file:// requests', async () => {
|
|
221
|
+
server.respondWith(request => {
|
|
222
|
+
request.respond(200, {'Content-Type': 'application/json'}, '{"foo": "bar"}');
|
|
223
|
+
});
|
|
224
|
+
|
|
225
|
+
const promise = getJSON({url: 'file:///C:/Temp/abc.json', cache: 'force-cache', headers: {'Authorization': 'Bearer 123', 'Accept': 'application/geo+json'}}, new AbortController());
|
|
226
|
+
server.respond();
|
|
227
|
+
await promise;
|
|
228
|
+
|
|
229
|
+
expect(server.requests).toHaveLength(1);
|
|
230
|
+
expect(server.requests[0].url).toBe('file:///C:/Temp/abc.json');
|
|
231
|
+
expect(server.requests[0].method).toBe('GET');
|
|
232
|
+
expect(server.requests[0].requestHeaders['Authorization']).toBe('Bearer 123');
|
|
233
|
+
expect(server.requests[0].requestHeaders['Accept']).toBe('application/geo+json');
|
|
234
|
+
});
|
|
235
|
+
|
|
236
|
+
});
|
|
237
|
+
});
|
package/src/util/ajax.ts
ADDED
|
@@ -0,0 +1,297 @@
|
|
|
1
|
+
import {extend, isWorker} from './util';
|
|
2
|
+
import {createAbortError} from './abort_error';
|
|
3
|
+
import {getProtocol} from '../source/protocol_crud';
|
|
4
|
+
import {MessageType} from './actor_messages';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* This is used to identify the global dispatcher id when sending a message from the worker without a target map id.
|
|
8
|
+
*/
|
|
9
|
+
export const GLOBAL_DISPATCHER_ID = 'global-dispatcher';
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* A type used to store the tile's expiration date and cache control definition
|
|
13
|
+
*/
|
|
14
|
+
export type ExpiryData = {cacheControl?: string | null; expires?: Date | string | null};
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* A `RequestParameters` object to be returned from Map.options.transformRequest callbacks.
|
|
18
|
+
* @example
|
|
19
|
+
* ```ts
|
|
20
|
+
* // use transformRequest to modify requests that begin with `http://myHost`
|
|
21
|
+
* transformRequest: function(url, resourceType) {
|
|
22
|
+
* if (resourceType === 'Source' && url.indexOf('http://myHost') > -1) {
|
|
23
|
+
* return {
|
|
24
|
+
* url: url.replace('http', 'https'),
|
|
25
|
+
* headers: { 'my-custom-header': true },
|
|
26
|
+
* credentials: 'include' // Include cookies for cross-origin requests
|
|
27
|
+
* }
|
|
28
|
+
* }
|
|
29
|
+
* }
|
|
30
|
+
* ```
|
|
31
|
+
*/
|
|
32
|
+
export type RequestParameters = {
|
|
33
|
+
/**
|
|
34
|
+
* The URL to be requested.
|
|
35
|
+
*/
|
|
36
|
+
url: string;
|
|
37
|
+
/**
|
|
38
|
+
* The headers to be sent with the request.
|
|
39
|
+
*/
|
|
40
|
+
headers?: any;
|
|
41
|
+
/**
|
|
42
|
+
* Request method `'GET' | 'POST' | 'PUT'`.
|
|
43
|
+
*/
|
|
44
|
+
method?: 'GET' | 'POST' | 'PUT';
|
|
45
|
+
/**
|
|
46
|
+
* Request body.
|
|
47
|
+
*/
|
|
48
|
+
body?: string;
|
|
49
|
+
/**
|
|
50
|
+
* Response body type to be returned.
|
|
51
|
+
*/
|
|
52
|
+
type?: 'string' | 'json' | 'arrayBuffer' | 'image';
|
|
53
|
+
/**
|
|
54
|
+
* `'same-origin'|'include'` Use 'include' to send cookies with cross-origin requests.
|
|
55
|
+
*/
|
|
56
|
+
credentials?: 'same-origin' | 'include';
|
|
57
|
+
/**
|
|
58
|
+
* If `true`, Resource Timing API information will be collected for these transformed requests and returned in a resourceTiming property of relevant data events.
|
|
59
|
+
*/
|
|
60
|
+
collectResourceTiming?: boolean;
|
|
61
|
+
/**
|
|
62
|
+
* Parameters supported only by browser fetch API. Property of the Request interface contains the cache mode of the request. It controls how the request will interact with the browser's HTTP cache. (https://developer.mozilla.org/en-US/docs/Web/API/Request/cache)
|
|
63
|
+
*/
|
|
64
|
+
cache?: RequestCache;
|
|
65
|
+
};
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* The response object returned from a successful AJAx request
|
|
69
|
+
*/
|
|
70
|
+
export type GetResourceResponse<T> = ExpiryData & {
|
|
71
|
+
data: T;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* The response callback used in various places
|
|
76
|
+
*/
|
|
77
|
+
export type ResponseCallback<T> = (
|
|
78
|
+
error?: Error | null,
|
|
79
|
+
data?: T | null,
|
|
80
|
+
cacheControl?: string | null,
|
|
81
|
+
expires?: string | Date | null
|
|
82
|
+
) => void;
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* An error thrown when a HTTP request results in an error response.
|
|
86
|
+
*/
|
|
87
|
+
export class AJAXError extends Error {
|
|
88
|
+
/**
|
|
89
|
+
* The response's HTTP status code.
|
|
90
|
+
*/
|
|
91
|
+
status: number;
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* The response's HTTP status text.
|
|
95
|
+
*/
|
|
96
|
+
statusText: string;
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* The request's URL.
|
|
100
|
+
*/
|
|
101
|
+
url: string;
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* The response's body.
|
|
105
|
+
*/
|
|
106
|
+
body: Blob;
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* @param status - The response's HTTP status code.
|
|
110
|
+
* @param statusText - The response's HTTP status text.
|
|
111
|
+
* @param url - The request's URL.
|
|
112
|
+
* @param body - The response's body.
|
|
113
|
+
*/
|
|
114
|
+
constructor(status: number, statusText: string, url: string, body: Blob) {
|
|
115
|
+
super(`AJAXError: ${statusText} (${status}): ${url}`);
|
|
116
|
+
this.status = status;
|
|
117
|
+
this.statusText = statusText;
|
|
118
|
+
this.url = url;
|
|
119
|
+
this.body = body;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
/**
|
|
124
|
+
* Ensure that we're sending the correct referrer from blob URL worker bundles.
|
|
125
|
+
* For files loaded from the local file system, `location.origin` will be set
|
|
126
|
+
* to the string(!) "null" (Firefox), or "file://" (Chrome, Safari, Edge),
|
|
127
|
+
* and we will set an empty referrer. Otherwise, we're using the document's URL.
|
|
128
|
+
*/
|
|
129
|
+
export const getReferrer = () => isWorker(self) ?
|
|
130
|
+
self.worker && self.worker.referrer :
|
|
131
|
+
(window.location.protocol === 'blob:' ? window.parent : window).location.href;
|
|
132
|
+
|
|
133
|
+
/**
|
|
134
|
+
* Determines whether a URL is a file:// URL. This is obviously the case if it begins
|
|
135
|
+
* with file://. Relative URLs are also file:// URLs iff the original document was loaded
|
|
136
|
+
* via a file:// URL.
|
|
137
|
+
* @param url - The URL to check
|
|
138
|
+
* @returns `true` if the URL is a file:// URL, `false` otherwise
|
|
139
|
+
*/
|
|
140
|
+
const isFileURL = url => /^file:/.test(url) || (/^file:/.test(getReferrer()) && !/^\w+:/.test(url));
|
|
141
|
+
|
|
142
|
+
async function makeFetchRequest(requestParameters: RequestParameters, abortController: AbortController): Promise<GetResourceResponse<any>> {
|
|
143
|
+
const request = new Request(requestParameters.url, {
|
|
144
|
+
method: requestParameters.method || 'GET',
|
|
145
|
+
body: requestParameters.body,
|
|
146
|
+
credentials: requestParameters.credentials,
|
|
147
|
+
headers: requestParameters.headers,
|
|
148
|
+
cache: requestParameters.cache,
|
|
149
|
+
referrer: getReferrer(),
|
|
150
|
+
signal: abortController.signal
|
|
151
|
+
});
|
|
152
|
+
|
|
153
|
+
// If the user has already set an Accept header, do not overwrite it here
|
|
154
|
+
if (requestParameters.type === 'json' && !request.headers.has('Accept')) {
|
|
155
|
+
request.headers.set('Accept', 'application/json');
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
const response = await fetch(request);
|
|
159
|
+
if (!response.ok) {
|
|
160
|
+
const body = await response.blob();
|
|
161
|
+
throw new AJAXError(response.status, response.statusText, requestParameters.url, body);
|
|
162
|
+
}
|
|
163
|
+
let parsePromise: Promise<any>;
|
|
164
|
+
if ((requestParameters.type === 'arrayBuffer' || requestParameters.type === 'image')) {
|
|
165
|
+
parsePromise = response.arrayBuffer();
|
|
166
|
+
} else if (requestParameters.type === 'json') {
|
|
167
|
+
parsePromise = response.json();
|
|
168
|
+
} else {
|
|
169
|
+
parsePromise = response.text();
|
|
170
|
+
}
|
|
171
|
+
const result = await parsePromise;
|
|
172
|
+
if (abortController.signal.aborted) {
|
|
173
|
+
throw createAbortError();
|
|
174
|
+
}
|
|
175
|
+
return {data: result, cacheControl: response.headers.get('Cache-Control'), expires: response.headers.get('Expires')};
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
function makeXMLHttpRequest(requestParameters: RequestParameters, abortController: AbortController): Promise<GetResourceResponse<any>> {
|
|
179
|
+
return new Promise((resolve, reject) => {
|
|
180
|
+
const xhr: XMLHttpRequest = new XMLHttpRequest();
|
|
181
|
+
|
|
182
|
+
xhr.open(requestParameters.method || 'GET', requestParameters.url, true);
|
|
183
|
+
if (requestParameters.type === 'arrayBuffer' || requestParameters.type === 'image') {
|
|
184
|
+
xhr.responseType = 'arraybuffer';
|
|
185
|
+
}
|
|
186
|
+
for (const k in requestParameters.headers) {
|
|
187
|
+
xhr.setRequestHeader(k, requestParameters.headers[k]);
|
|
188
|
+
}
|
|
189
|
+
if (requestParameters.type === 'json') {
|
|
190
|
+
xhr.responseType = 'text';
|
|
191
|
+
// Do not overwrite the user-provided Accept header
|
|
192
|
+
if (!requestParameters.headers?.Accept) {
|
|
193
|
+
xhr.setRequestHeader('Accept', 'application/json');
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
xhr.withCredentials = requestParameters.credentials === 'include';
|
|
197
|
+
xhr.onerror = () => {
|
|
198
|
+
reject(new Error(xhr.statusText));
|
|
199
|
+
};
|
|
200
|
+
xhr.onload = () => {
|
|
201
|
+
if (abortController.signal.aborted) {
|
|
202
|
+
return;
|
|
203
|
+
}
|
|
204
|
+
if (((xhr.status >= 200 && xhr.status < 300) || xhr.status === 0) && xhr.response !== null) {
|
|
205
|
+
let data: unknown = xhr.response;
|
|
206
|
+
if (requestParameters.type === 'json') {
|
|
207
|
+
// We're manually parsing JSON here to get better error messages.
|
|
208
|
+
try {
|
|
209
|
+
data = JSON.parse(xhr.response);
|
|
210
|
+
} catch (err) {
|
|
211
|
+
reject(err);
|
|
212
|
+
return;
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
resolve({data, cacheControl: xhr.getResponseHeader('Cache-Control'), expires: xhr.getResponseHeader('Expires')});
|
|
216
|
+
} else {
|
|
217
|
+
const body = new Blob([xhr.response], {type: xhr.getResponseHeader('Content-Type')});
|
|
218
|
+
reject(new AJAXError(xhr.status, xhr.statusText, requestParameters.url, body));
|
|
219
|
+
}
|
|
220
|
+
};
|
|
221
|
+
abortController.signal.addEventListener('abort', () => {
|
|
222
|
+
xhr.abort();
|
|
223
|
+
reject(createAbortError());
|
|
224
|
+
});
|
|
225
|
+
xhr.send(requestParameters.body);
|
|
226
|
+
});
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
/**
|
|
230
|
+
* We're trying to use the Fetch API if possible. However, requests for resources with the file:// URI scheme don't work with the Fetch API.
|
|
231
|
+
* In this case we unconditionally use XHR on the current thread since referrers don't matter.
|
|
232
|
+
* This method can also use the registered method if `addProtocol` was called.
|
|
233
|
+
* @param requestParameters - The request parameters
|
|
234
|
+
* @param abortController - The abort controller allowing to cancel the request
|
|
235
|
+
* @returns a promise resolving to the response, including cache control and expiry data
|
|
236
|
+
*/
|
|
237
|
+
export const makeRequest = function(requestParameters: RequestParameters, abortController: AbortController): Promise<GetResourceResponse<any>> {
|
|
238
|
+
if (/:\/\//.test(requestParameters.url) && !(/^https?:|^file:/.test(requestParameters.url))) {
|
|
239
|
+
const protocolLoadFn = getProtocol(requestParameters.url);
|
|
240
|
+
if (protocolLoadFn) {
|
|
241
|
+
return protocolLoadFn(requestParameters, abortController);
|
|
242
|
+
}
|
|
243
|
+
if (isWorker(self) && self.worker && self.worker.actor) {
|
|
244
|
+
return self.worker.actor.sendAsync({type: MessageType.getResource, data: requestParameters, targetMapId: GLOBAL_DISPATCHER_ID}, abortController);
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
if (!isFileURL(requestParameters.url)) {
|
|
248
|
+
if (fetch && Request && AbortController && Object.prototype.hasOwnProperty.call(Request.prototype, 'signal')) {
|
|
249
|
+
return makeFetchRequest(requestParameters, abortController);
|
|
250
|
+
}
|
|
251
|
+
if (isWorker(self) && self.worker && self.worker.actor) {
|
|
252
|
+
return self.worker.actor.sendAsync({type: MessageType.getResource, data: requestParameters, mustQueue: true, targetMapId: GLOBAL_DISPATCHER_ID}, abortController);
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
return makeXMLHttpRequest(requestParameters, abortController);
|
|
256
|
+
};
|
|
257
|
+
|
|
258
|
+
export const getJSON = <T>(requestParameters: RequestParameters, abortController: AbortController): Promise<{data: T} & ExpiryData> => {
|
|
259
|
+
return makeRequest(extend(requestParameters, {type: 'json'}), abortController);
|
|
260
|
+
};
|
|
261
|
+
|
|
262
|
+
export const getArrayBuffer = (requestParameters: RequestParameters, abortController: AbortController): Promise<{data: ArrayBuffer} & ExpiryData> => {
|
|
263
|
+
return makeRequest(extend(requestParameters, {type: 'arrayBuffer'}), abortController);
|
|
264
|
+
};
|
|
265
|
+
|
|
266
|
+
export function sameOrigin(inComingUrl: string) {
|
|
267
|
+
// A relative URL "/foo" or "./foo" will throw exception in URL's ctor,
|
|
268
|
+
// try-catch is expansive so just use a heuristic check to avoid it
|
|
269
|
+
// also check data URL
|
|
270
|
+
if (!inComingUrl ||
|
|
271
|
+
inComingUrl.indexOf('://') <= 0 || // relative URL
|
|
272
|
+
inComingUrl.indexOf('data:image/') === 0 || // data image URL
|
|
273
|
+
inComingUrl.indexOf('blob:') === 0) { // blob
|
|
274
|
+
return true;
|
|
275
|
+
}
|
|
276
|
+
const urlObj = new URL(inComingUrl);
|
|
277
|
+
const locationObj = window.location;
|
|
278
|
+
return urlObj.protocol === locationObj.protocol && urlObj.host === locationObj.host;
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
export const getVideo = (urls: Array<string>): Promise<HTMLVideoElement> => {
|
|
282
|
+
const video: HTMLVideoElement = window.document.createElement('video');
|
|
283
|
+
video.muted = true;
|
|
284
|
+
return new Promise((resolve) => {
|
|
285
|
+
video.onloadstart = () => {
|
|
286
|
+
resolve(video);
|
|
287
|
+
};
|
|
288
|
+
for (const url of urls) {
|
|
289
|
+
const s: HTMLSourceElement = window.document.createElement('source');
|
|
290
|
+
if (!sameOrigin(url)) {
|
|
291
|
+
video.crossOrigin = 'Anonymous';
|
|
292
|
+
}
|
|
293
|
+
s.src = url;
|
|
294
|
+
video.appendChild(s);
|
|
295
|
+
}
|
|
296
|
+
});
|
|
297
|
+
};
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import {browser} from './browser';
|
|
2
|
+
|
|
3
|
+
describe('browser', () => {
|
|
4
|
+
test('frameAsync', async () => {
|
|
5
|
+
const id = await browser.frameAsync(new AbortController());
|
|
6
|
+
expect(id).toBeTruthy();
|
|
7
|
+
});
|
|
8
|
+
|
|
9
|
+
test('now', () => {
|
|
10
|
+
expect(typeof browser.now()).toBe('number');
|
|
11
|
+
});
|
|
12
|
+
|
|
13
|
+
test('frameAsync', async () => {
|
|
14
|
+
const abortController = new AbortController();
|
|
15
|
+
const promise = browser.frameAsync(abortController);
|
|
16
|
+
abortController.abort();
|
|
17
|
+
await expect(promise).rejects.toThrow();
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
test('hardwareConcurrency', () => {
|
|
21
|
+
expect(typeof browser.hardwareConcurrency).toBe('number');
|
|
22
|
+
});
|
|
23
|
+
});
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import {createAbortError} from './abort_error';
|
|
2
|
+
|
|
3
|
+
const now = typeof performance !== 'undefined' && performance && performance.now ?
|
|
4
|
+
performance.now.bind(performance) :
|
|
5
|
+
Date.now.bind(Date);
|
|
6
|
+
|
|
7
|
+
let linkEl;
|
|
8
|
+
|
|
9
|
+
let reducedMotionQuery: MediaQueryList;
|
|
10
|
+
|
|
11
|
+
/** */
|
|
12
|
+
export const browser = {
|
|
13
|
+
/**
|
|
14
|
+
* Provides a function that outputs milliseconds: either performance.now()
|
|
15
|
+
* or a fallback to Date.now()
|
|
16
|
+
*/
|
|
17
|
+
now,
|
|
18
|
+
|
|
19
|
+
frameAsync(abortController: AbortController): Promise<number> {
|
|
20
|
+
return new Promise((resolve, reject) => {
|
|
21
|
+
const frame = requestAnimationFrame(resolve);
|
|
22
|
+
abortController.signal.addEventListener('abort', () => {
|
|
23
|
+
cancelAnimationFrame(frame);
|
|
24
|
+
reject(createAbortError());
|
|
25
|
+
});
|
|
26
|
+
});
|
|
27
|
+
},
|
|
28
|
+
|
|
29
|
+
getImageData(img: HTMLImageElement | ImageBitmap, padding: number = 0): ImageData {
|
|
30
|
+
const context = this.getImageCanvasContext(img);
|
|
31
|
+
return context.getImageData(-padding, -padding, img.width as number + 2 * padding, img.height as number + 2 * padding);
|
|
32
|
+
},
|
|
33
|
+
|
|
34
|
+
getImageCanvasContext(img: HTMLImageElement | ImageBitmap): CanvasRenderingContext2D {
|
|
35
|
+
const canvas = window.document.createElement('canvas') as HTMLCanvasElement;
|
|
36
|
+
const context = canvas.getContext('2d', {willReadFrequently: true});
|
|
37
|
+
if (!context) {
|
|
38
|
+
throw new Error('failed to create canvas 2d context');
|
|
39
|
+
}
|
|
40
|
+
canvas.width = img.width as number;
|
|
41
|
+
canvas.height = img.height as number;
|
|
42
|
+
context.drawImage(img, 0, 0, img.width as number, img.height as number);
|
|
43
|
+
return context;
|
|
44
|
+
},
|
|
45
|
+
|
|
46
|
+
resolveURL(path: string) {
|
|
47
|
+
if (!linkEl) linkEl = document.createElement('a');
|
|
48
|
+
linkEl.href = path;
|
|
49
|
+
return linkEl.href;
|
|
50
|
+
},
|
|
51
|
+
|
|
52
|
+
hardwareConcurrency: typeof navigator !== 'undefined' && navigator.hardwareConcurrency || 4,
|
|
53
|
+
|
|
54
|
+
get prefersReducedMotion(): boolean {
|
|
55
|
+
// In case your test crashes when checking matchMedia, call setMatchMedia from 'src/util/test/util'
|
|
56
|
+
if (!matchMedia) return false;
|
|
57
|
+
//Lazily initialize media query
|
|
58
|
+
if (reducedMotionQuery == null) {
|
|
59
|
+
reducedMotionQuery = matchMedia('(prefers-reduced-motion: reduce)');
|
|
60
|
+
}
|
|
61
|
+
return reducedMotionQuery.matches;
|
|
62
|
+
},
|
|
63
|
+
};
|