@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,72 @@
|
|
|
1
|
+
import type {VectorTileFeature} from '@mapbox/vector-tile';
|
|
2
|
+
import type {LayerSpecification} from '@maplibre/maplibre-gl-style-spec';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* A helper for type to omit a property from a type
|
|
6
|
+
*/
|
|
7
|
+
type DistributiveKeys<T> = T extends T ? keyof T : never;
|
|
8
|
+
/**
|
|
9
|
+
* A helper for type to omit a property from a type
|
|
10
|
+
*/
|
|
11
|
+
type DistributiveOmit<T, K extends DistributiveKeys<T>> = T extends unknown
|
|
12
|
+
? Omit<T, K>
|
|
13
|
+
: never;
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* An extended geojson feature used by the events to return data to the listener
|
|
17
|
+
*/
|
|
18
|
+
export type MapGeoJSONFeature = GeoJSONFeature & {
|
|
19
|
+
layer: DistributiveOmit<LayerSpecification, 'source'> & {source: string};
|
|
20
|
+
source: string;
|
|
21
|
+
sourceLayer?: string;
|
|
22
|
+
state: { [key: string]: any };
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* A geojson feature
|
|
27
|
+
*/
|
|
28
|
+
export class GeoJSONFeature {
|
|
29
|
+
type: 'Feature';
|
|
30
|
+
_geometry: GeoJSON.Geometry;
|
|
31
|
+
properties: { [name: string]: any };
|
|
32
|
+
id: number | string | undefined;
|
|
33
|
+
|
|
34
|
+
_vectorTileFeature: VectorTileFeature;
|
|
35
|
+
|
|
36
|
+
constructor(vectorTileFeature: VectorTileFeature, z: number, x: number, y: number, id: string | number | undefined) {
|
|
37
|
+
this.type = 'Feature';
|
|
38
|
+
|
|
39
|
+
this._vectorTileFeature = vectorTileFeature;
|
|
40
|
+
(vectorTileFeature as any)._z = z;
|
|
41
|
+
(vectorTileFeature as any)._x = x;
|
|
42
|
+
(vectorTileFeature as any)._y = y;
|
|
43
|
+
|
|
44
|
+
this.properties = vectorTileFeature.properties;
|
|
45
|
+
this.id = id;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
get geometry(): GeoJSON.Geometry {
|
|
49
|
+
if (this._geometry === undefined) {
|
|
50
|
+
this._geometry = this._vectorTileFeature.toGeoJSON(
|
|
51
|
+
(this._vectorTileFeature as any)._x,
|
|
52
|
+
(this._vectorTileFeature as any)._y,
|
|
53
|
+
(this._vectorTileFeature as any)._z).geometry;
|
|
54
|
+
}
|
|
55
|
+
return this._geometry;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
set geometry(g: GeoJSON.Geometry) {
|
|
59
|
+
this._geometry = g;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
toJSON() {
|
|
63
|
+
const json: any = {
|
|
64
|
+
geometry: this.geometry
|
|
65
|
+
};
|
|
66
|
+
for (const i in this) {
|
|
67
|
+
if (i === '_geometry' || i === '_vectorTileFeature') continue;
|
|
68
|
+
json[i] = (this)[i];
|
|
69
|
+
}
|
|
70
|
+
return json;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import {charHasRotatedVerticalOrientation} from './script_detection';
|
|
2
|
+
|
|
3
|
+
export const verticalizedCharacterMap = {
|
|
4
|
+
'!': '︕',
|
|
5
|
+
'#': '#',
|
|
6
|
+
'$': '$',
|
|
7
|
+
'%': '%',
|
|
8
|
+
'&': '&',
|
|
9
|
+
'(': '︵',
|
|
10
|
+
')': '︶',
|
|
11
|
+
'*': '*',
|
|
12
|
+
'+': '+',
|
|
13
|
+
',': '︐',
|
|
14
|
+
'-': '︲',
|
|
15
|
+
'.': '・',
|
|
16
|
+
'/': '/',
|
|
17
|
+
':': '︓',
|
|
18
|
+
';': '︔',
|
|
19
|
+
'<': '︿',
|
|
20
|
+
'=': '=',
|
|
21
|
+
'>': '﹀',
|
|
22
|
+
'?': '︖',
|
|
23
|
+
'@': '@',
|
|
24
|
+
'[': '﹇',
|
|
25
|
+
'\\': '\',
|
|
26
|
+
']': '﹈',
|
|
27
|
+
'^': '^',
|
|
28
|
+
'_': '︳',
|
|
29
|
+
'`': '`',
|
|
30
|
+
'{': '︷',
|
|
31
|
+
'|': '―',
|
|
32
|
+
'}': '︸',
|
|
33
|
+
'~': '~',
|
|
34
|
+
'¢': '¢',
|
|
35
|
+
'£': '£',
|
|
36
|
+
'¥': '¥',
|
|
37
|
+
'¦': '¦',
|
|
38
|
+
'¬': '¬',
|
|
39
|
+
'¯': ' ̄',
|
|
40
|
+
'–': '︲',
|
|
41
|
+
'—': '︱',
|
|
42
|
+
'‘': '﹃',
|
|
43
|
+
'’': '﹄',
|
|
44
|
+
'“': '﹁',
|
|
45
|
+
'”': '﹂',
|
|
46
|
+
'…': '︙',
|
|
47
|
+
'‧': '・',
|
|
48
|
+
'₩': '₩',
|
|
49
|
+
'、': '︑',
|
|
50
|
+
'。': '︒',
|
|
51
|
+
'〈': '︿',
|
|
52
|
+
'〉': '﹀',
|
|
53
|
+
'《': '︽',
|
|
54
|
+
'》': '︾',
|
|
55
|
+
'「': '﹁',
|
|
56
|
+
'」': '﹂',
|
|
57
|
+
'『': '﹃',
|
|
58
|
+
'』': '﹄',
|
|
59
|
+
'【': '︻',
|
|
60
|
+
'】': '︼',
|
|
61
|
+
'〔': '︹',
|
|
62
|
+
'〕': '︺',
|
|
63
|
+
'〖': '︗',
|
|
64
|
+
'〗': '︘',
|
|
65
|
+
'!': '︕',
|
|
66
|
+
'(': '︵',
|
|
67
|
+
')': '︶',
|
|
68
|
+
',': '︐',
|
|
69
|
+
'-': '︲',
|
|
70
|
+
'.': '・',
|
|
71
|
+
':': '︓',
|
|
72
|
+
';': '︔',
|
|
73
|
+
'<': '︿',
|
|
74
|
+
'>': '﹀',
|
|
75
|
+
'?': '︖',
|
|
76
|
+
'[': '﹇',
|
|
77
|
+
']': '﹈',
|
|
78
|
+
'_': '︳',
|
|
79
|
+
'{': '︷',
|
|
80
|
+
'|': '―',
|
|
81
|
+
'}': '︸',
|
|
82
|
+
'⦅': '︵',
|
|
83
|
+
'⦆': '︶',
|
|
84
|
+
'。': '︒',
|
|
85
|
+
'「': '﹁',
|
|
86
|
+
'」': '﹂'
|
|
87
|
+
};
|
|
88
|
+
|
|
89
|
+
export function verticalizePunctuation(input: string) {
|
|
90
|
+
let output = '';
|
|
91
|
+
|
|
92
|
+
for (let i = 0; i < input.length; i++) {
|
|
93
|
+
const nextCharCode = input.charCodeAt(i + 1) || null;
|
|
94
|
+
const prevCharCode = input.charCodeAt(i - 1) || null;
|
|
95
|
+
|
|
96
|
+
const canReplacePunctuation = (
|
|
97
|
+
(!nextCharCode || !charHasRotatedVerticalOrientation(nextCharCode) || verticalizedCharacterMap[input[i + 1]]) &&
|
|
98
|
+
(!prevCharCode || !charHasRotatedVerticalOrientation(prevCharCode) || verticalizedCharacterMap[input[i - 1]])
|
|
99
|
+
);
|
|
100
|
+
|
|
101
|
+
if (canReplacePunctuation && verticalizedCharacterMap[input[i]]) {
|
|
102
|
+
output += verticalizedCharacterMap[input[i]];
|
|
103
|
+
} else {
|
|
104
|
+
output += input[i];
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
return output;
|
|
109
|
+
}
|
|
110
|
+
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import {AddProtocolAction, config} from './config';
|
|
2
|
+
import type {default as MaplibreWorker} from '../source/worker';
|
|
3
|
+
import type {WorkerSourceConstructor} from '../source/worker_source';
|
|
4
|
+
|
|
5
|
+
export interface WorkerGlobalScopeInterface {
|
|
6
|
+
importScripts(...urls: Array<string>): void;
|
|
7
|
+
registerWorkerSource: (sourceName: string, sourceConstructor: WorkerSourceConstructor) => void;
|
|
8
|
+
registerRTLTextPlugin: (_: any) => void;
|
|
9
|
+
addProtocol: (customProtocol: string, loadFn: AddProtocolAction) => void;
|
|
10
|
+
removeProtocol: (customProtocol: string) => void;
|
|
11
|
+
worker: MaplibreWorker;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export function workerFactory() {
|
|
15
|
+
return new Worker(config.WORKER_URL);
|
|
16
|
+
}
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
import {SerializedObject} from '../../dist/maplibre-gl';
|
|
2
|
+
import {AJAXError} from './ajax';
|
|
3
|
+
import {register, serialize, deserialize} from './web_worker_transfer';
|
|
4
|
+
|
|
5
|
+
describe('web worker transfer', () => {
|
|
6
|
+
test('round trip', () => {
|
|
7
|
+
class SerializableMock {
|
|
8
|
+
n;
|
|
9
|
+
buffer;
|
|
10
|
+
blob;
|
|
11
|
+
_cached;
|
|
12
|
+
dataView;
|
|
13
|
+
imageData;
|
|
14
|
+
array;
|
|
15
|
+
|
|
16
|
+
constructor(n) {
|
|
17
|
+
this.n = n;
|
|
18
|
+
this.buffer = new ArrayBuffer(100);
|
|
19
|
+
this.dataView = new DataView(this.buffer);
|
|
20
|
+
this.imageData = new ImageData(8, 5);
|
|
21
|
+
this.blob = new Blob();
|
|
22
|
+
this.array = [true, 1, 'one', new ArrayBuffer(100)];
|
|
23
|
+
this.squared();
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
squared() {
|
|
27
|
+
if (this._cached) {
|
|
28
|
+
return this._cached;
|
|
29
|
+
}
|
|
30
|
+
this._cached = this.n * this.n;
|
|
31
|
+
return this._cached;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
register('SerializableMock', SerializableMock, {omit: ['_cached']});
|
|
36
|
+
|
|
37
|
+
const serializableMock = new SerializableMock(10);
|
|
38
|
+
const transferables = [];
|
|
39
|
+
const deserialized = deserialize(serialize(serializableMock, transferables)) as SerializableMock;
|
|
40
|
+
expect(deserialize(serialize(serializableMock, transferables)) instanceof SerializableMock).toBeTruthy();
|
|
41
|
+
expect(serializableMock.dataView instanceof DataView).toBeTruthy();
|
|
42
|
+
|
|
43
|
+
expect(serializableMock !== deserialized).toBeTruthy();
|
|
44
|
+
expect(deserialized.constructor === SerializableMock).toBeTruthy();
|
|
45
|
+
expect(deserialized.n === 10).toBeTruthy();
|
|
46
|
+
expect(deserialized.buffer === serializableMock.buffer).toBeTruthy();
|
|
47
|
+
expect(deserialized.blob === serializableMock.blob).toBeTruthy();
|
|
48
|
+
expect(transferables[0] === serializableMock.buffer).toBeTruthy();
|
|
49
|
+
expect(transferables[1] === serializableMock.dataView.buffer).toBeTruthy();
|
|
50
|
+
expect(deserialized._cached === undefined).toBeTruthy();
|
|
51
|
+
expect(deserialized.squared() === 100).toBeTruthy();
|
|
52
|
+
expect(deserialized.dataView instanceof DataView).toBeTruthy();
|
|
53
|
+
expect(deserialized.array).toEqual(serializableMock.array);
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
test('anonymous class', () => {
|
|
57
|
+
const Klass = (() => (class {}))();
|
|
58
|
+
expect(!Klass.name).toBeTruthy();
|
|
59
|
+
register('Anon', Klass);
|
|
60
|
+
const x = new Klass();
|
|
61
|
+
const deserialized = deserialize(serialize(x));
|
|
62
|
+
expect(deserialized instanceof Klass).toBeTruthy();
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
test('custom serialization', () => {
|
|
66
|
+
class CustomSerialization {
|
|
67
|
+
id;
|
|
68
|
+
_deserialized;
|
|
69
|
+
constructor(id) {
|
|
70
|
+
this.id = id;
|
|
71
|
+
this._deserialized = false;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
static serialize(b) {
|
|
75
|
+
return {custom: `custom serialization,${b.id}`};
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
static deserialize(input) {
|
|
79
|
+
const b = new CustomSerialization(input.custom.split(',')[1]);
|
|
80
|
+
b._deserialized = true;
|
|
81
|
+
return b;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
register('CustomSerialization', CustomSerialization);
|
|
86
|
+
|
|
87
|
+
const customSerialization = new CustomSerialization('a');
|
|
88
|
+
expect(!customSerialization._deserialized).toBeTruthy();
|
|
89
|
+
|
|
90
|
+
const deserialized = deserialize(serialize(customSerialization)) as CustomSerialization;
|
|
91
|
+
expect(deserialize(serialize(customSerialization)) instanceof CustomSerialization).toBeTruthy();
|
|
92
|
+
expect(deserialized.id).toBe(customSerialization.id);
|
|
93
|
+
expect(deserialized._deserialized).toBeTruthy();
|
|
94
|
+
});
|
|
95
|
+
|
|
96
|
+
test('AjaxError serialization', () => {
|
|
97
|
+
const status = 404;
|
|
98
|
+
const statusText = 'not found';
|
|
99
|
+
const url = 'https://example.com';
|
|
100
|
+
|
|
101
|
+
const ajaxError = new AJAXError(status, statusText, url, new Blob());
|
|
102
|
+
const serialized = serialize(ajaxError) as SerializedObject;
|
|
103
|
+
expect(serialized.$name).toBe(ajaxError.constructor.name);
|
|
104
|
+
const deserialized = deserialize(serialized) as AJAXError;
|
|
105
|
+
expect(deserialized.status).toBe(404);
|
|
106
|
+
expect(deserialized.statusText).toBe(statusText);
|
|
107
|
+
expect(deserialized.url).toBe(url);
|
|
108
|
+
});
|
|
109
|
+
|
|
110
|
+
test('serialize Object has _classRegistryKey', () => {
|
|
111
|
+
class BadClass {
|
|
112
|
+
_classRegistryKey: 'foo';
|
|
113
|
+
}
|
|
114
|
+
const trySerialize = () => {
|
|
115
|
+
serialize(new BadClass());
|
|
116
|
+
};
|
|
117
|
+
expect(trySerialize).toThrow();
|
|
118
|
+
});
|
|
119
|
+
test('serialize can not used reserved property #name', () => {
|
|
120
|
+
class BadClass {
|
|
121
|
+
static serialize() {
|
|
122
|
+
return {
|
|
123
|
+
'$name': 'foo'
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
register('BadClass', BadClass);
|
|
128
|
+
const badObject = new BadClass();
|
|
129
|
+
expect(() => {
|
|
130
|
+
serialize(badObject);
|
|
131
|
+
}).toThrow();
|
|
132
|
+
});
|
|
133
|
+
test('deserialize Object has $name', () => {
|
|
134
|
+
const badObject = {
|
|
135
|
+
'$name': 'foo'
|
|
136
|
+
};
|
|
137
|
+
const tryDeserialize = () => {
|
|
138
|
+
deserialize(badObject);
|
|
139
|
+
};
|
|
140
|
+
expect(tryDeserialize).toThrow();
|
|
141
|
+
});
|
|
142
|
+
|
|
143
|
+
test('some objects can not be serialized', () => {
|
|
144
|
+
expect(() => {
|
|
145
|
+
serialize(BigInt(123));
|
|
146
|
+
}).toThrow();
|
|
147
|
+
});
|
|
148
|
+
test('some objects can not be deserialized', () => {
|
|
149
|
+
expect(() => {
|
|
150
|
+
deserialize(<SerializedObject><unknown>BigInt(123));
|
|
151
|
+
}).toThrow();
|
|
152
|
+
});
|
|
153
|
+
});
|
|
@@ -0,0 +1,254 @@
|
|
|
1
|
+
import {TransferableGridIndex} from './transferable_grid_index';
|
|
2
|
+
import {Color, CompoundExpression, expressions, ResolvedImage, StylePropertyFunction,
|
|
3
|
+
StyleExpression, ZoomDependentExpression, ZoomConstantExpression} from '@maplibre/maplibre-gl-style-spec';
|
|
4
|
+
import {AJAXError} from './ajax';
|
|
5
|
+
import {isImageBitmap} from './util';
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* A class that is serialized to and json, that can be constructed back to the original class in the worker or in the main thread
|
|
9
|
+
*/
|
|
10
|
+
type SerializedObject<S extends Serialized = any> = {
|
|
11
|
+
[_: string]: S;
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* All the possible values that can be serialized and sent to and from the worker
|
|
16
|
+
*/
|
|
17
|
+
export type Serialized = null | void | boolean | number | string | Boolean | Number | String | Date | RegExp | ArrayBuffer | ArrayBufferView | ImageData | ImageBitmap | Blob | Array<Serialized> | SerializedObject;
|
|
18
|
+
|
|
19
|
+
type Registry = {
|
|
20
|
+
[_: string]: {
|
|
21
|
+
klass: {
|
|
22
|
+
new (...args: any): any;
|
|
23
|
+
deserialize?: (input: Serialized) => unknown;
|
|
24
|
+
serialize?: (input: any, transferables: Transferable[]) => SerializedObject;
|
|
25
|
+
};
|
|
26
|
+
omit: ReadonlyArray<string>;
|
|
27
|
+
shallow: ReadonlyArray<string>;
|
|
28
|
+
};
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Register options
|
|
33
|
+
*/
|
|
34
|
+
type RegisterOptions<T> = {
|
|
35
|
+
/**
|
|
36
|
+
* List of properties to omit from serialization (e.g., cached/computed properties)
|
|
37
|
+
*/
|
|
38
|
+
omit?: ReadonlyArray<keyof T>;
|
|
39
|
+
/**
|
|
40
|
+
* List of properties that should be serialized by a simple shallow copy, rather than by a recursive call to serialize().
|
|
41
|
+
*/
|
|
42
|
+
shallow?: ReadonlyArray<keyof T>;
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
const registry: Registry = {};
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Register the given class as serializable.
|
|
49
|
+
*
|
|
50
|
+
* @param options - the registration options
|
|
51
|
+
*/
|
|
52
|
+
export function register<T extends any>(
|
|
53
|
+
name: string,
|
|
54
|
+
klass: {
|
|
55
|
+
new (...args: any): T;
|
|
56
|
+
},
|
|
57
|
+
options: RegisterOptions<T> = {}
|
|
58
|
+
) {
|
|
59
|
+
if (registry[name]) throw new Error(`${name} is already registered.`);
|
|
60
|
+
((Object.defineProperty as any))(klass, '_classRegistryKey', {
|
|
61
|
+
value: name,
|
|
62
|
+
writeable: false
|
|
63
|
+
});
|
|
64
|
+
registry[name] = {
|
|
65
|
+
klass,
|
|
66
|
+
omit: options.omit as ReadonlyArray<string> || [],
|
|
67
|
+
shallow: options.shallow as ReadonlyArray<string> || []
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
register('Object', Object);
|
|
72
|
+
register('TransferableGridIndex', TransferableGridIndex);
|
|
73
|
+
|
|
74
|
+
register('Color', Color);
|
|
75
|
+
register('Error', Error);
|
|
76
|
+
register('AJAXError', AJAXError);
|
|
77
|
+
register('ResolvedImage', ResolvedImage);
|
|
78
|
+
|
|
79
|
+
register('StylePropertyFunction', StylePropertyFunction);
|
|
80
|
+
register('StyleExpression', StyleExpression, {omit: ['_evaluator']});
|
|
81
|
+
|
|
82
|
+
register('ZoomDependentExpression', ZoomDependentExpression);
|
|
83
|
+
register('ZoomConstantExpression', ZoomConstantExpression);
|
|
84
|
+
register('CompoundExpression', CompoundExpression, {omit: ['_evaluate']});
|
|
85
|
+
for (const name in expressions) {
|
|
86
|
+
if ((expressions[name] as any)._classRegistryKey) continue;
|
|
87
|
+
register(`Expression_${name}`, expressions[name]);
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
function isArrayBuffer(value: any): value is ArrayBuffer {
|
|
91
|
+
return value && typeof ArrayBuffer !== 'undefined' &&
|
|
92
|
+
(value instanceof ArrayBuffer || (value.constructor && value.constructor.name === 'ArrayBuffer'));
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
function getClassRegistryKey(input: Object|SerializedObject): string {
|
|
96
|
+
const klass = (input.constructor as any);
|
|
97
|
+
return (input as SerializedObject).$name || klass._classRegistryKey;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
function isRegistered(input: unknown): boolean {
|
|
101
|
+
if (input === null || typeof input !== 'object') {
|
|
102
|
+
return false;
|
|
103
|
+
}
|
|
104
|
+
const classRegistryKey = getClassRegistryKey(input);
|
|
105
|
+
if (classRegistryKey && classRegistryKey !== 'Object') {
|
|
106
|
+
return true;
|
|
107
|
+
}
|
|
108
|
+
return false;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
function isSerializeHandledByBuiltin(input: unknown) {
|
|
112
|
+
return (!isRegistered(input) && (
|
|
113
|
+
input === null ||
|
|
114
|
+
input === undefined ||
|
|
115
|
+
typeof input === 'boolean' ||
|
|
116
|
+
typeof input === 'number' ||
|
|
117
|
+
typeof input === 'string' ||
|
|
118
|
+
input instanceof Boolean ||
|
|
119
|
+
input instanceof Number ||
|
|
120
|
+
input instanceof String ||
|
|
121
|
+
input instanceof Date ||
|
|
122
|
+
input instanceof RegExp ||
|
|
123
|
+
input instanceof Blob ||
|
|
124
|
+
input instanceof Error ||
|
|
125
|
+
isArrayBuffer(input) ||
|
|
126
|
+
isImageBitmap(input) ||
|
|
127
|
+
ArrayBuffer.isView(input) ||
|
|
128
|
+
input instanceof ImageData)
|
|
129
|
+
);
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
/**
|
|
133
|
+
* Serialize the given object for transfer to or from a web worker.
|
|
134
|
+
*
|
|
135
|
+
* For non-builtin types, recursively serialize each property (possibly
|
|
136
|
+
* omitting certain properties - see register()), and package the result along
|
|
137
|
+
* with the constructor's `name` so that the appropriate constructor can be
|
|
138
|
+
* looked up in `deserialize()`.
|
|
139
|
+
*
|
|
140
|
+
* If a `transferables` array is provided, add any transferable objects (i.e.,
|
|
141
|
+
* any ArrayBuffers or ArrayBuffer views) to the list. (If a copy is needed,
|
|
142
|
+
* this should happen in the client code, before using serialize().)
|
|
143
|
+
*/
|
|
144
|
+
export function serialize(input: unknown, transferables?: Array<Transferable> | null): Serialized {
|
|
145
|
+
if (isSerializeHandledByBuiltin(input)) {
|
|
146
|
+
if (isArrayBuffer(input) || isImageBitmap(input)) {
|
|
147
|
+
if (transferables) {
|
|
148
|
+
transferables.push(input);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
if (ArrayBuffer.isView(input)) {
|
|
152
|
+
const view = input;
|
|
153
|
+
if (transferables) {
|
|
154
|
+
transferables.push(view.buffer);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
if (input instanceof ImageData) {
|
|
158
|
+
if (transferables) {
|
|
159
|
+
transferables.push(input.data.buffer);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
return input;
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
if (Array.isArray(input)) {
|
|
166
|
+
const serialized: Array<Serialized> = [];
|
|
167
|
+
for (const item of input) {
|
|
168
|
+
serialized.push(serialize(item, transferables));
|
|
169
|
+
}
|
|
170
|
+
return serialized;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
if (typeof input !== 'object') {
|
|
174
|
+
throw new Error(`can't serialize object of type ${typeof input}`);
|
|
175
|
+
}
|
|
176
|
+
const classRegistryKey = getClassRegistryKey(input);
|
|
177
|
+
if (!classRegistryKey) {
|
|
178
|
+
throw new Error(`can't serialize object of unregistered class ${input.constructor.name}`);
|
|
179
|
+
}
|
|
180
|
+
if (!registry[classRegistryKey]) throw new Error(`${classRegistryKey} is not registered.`);
|
|
181
|
+
const {klass} = registry[classRegistryKey];
|
|
182
|
+
const properties: SerializedObject = klass.serialize ?
|
|
183
|
+
// (Temporary workaround) allow a class to provide static
|
|
184
|
+
// `serialize()` and `deserialize()` methods to bypass the generic
|
|
185
|
+
// approach.
|
|
186
|
+
// This temporary workaround lets us use the generic serialization
|
|
187
|
+
// approach for objects whose members include instances of dynamic
|
|
188
|
+
// StructArray types. Once we refactor StructArray to be static,
|
|
189
|
+
// we can remove this complexity.
|
|
190
|
+
(klass.serialize(input, transferables) as SerializedObject) : {};
|
|
191
|
+
|
|
192
|
+
if (!klass.serialize) {
|
|
193
|
+
for (const key in input) {
|
|
194
|
+
if (!input.hasOwnProperty(key)) continue; // eslint-disable-line no-prototype-builtins
|
|
195
|
+
if (registry[classRegistryKey].omit.indexOf(key) >= 0) continue;
|
|
196
|
+
const property = input[key];
|
|
197
|
+
properties[key] = registry[classRegistryKey].shallow.indexOf(key) >= 0 ?
|
|
198
|
+
property :
|
|
199
|
+
serialize(property, transferables);
|
|
200
|
+
}
|
|
201
|
+
if (input instanceof Error) {
|
|
202
|
+
properties.message = input.message;
|
|
203
|
+
}
|
|
204
|
+
} else {
|
|
205
|
+
if (transferables && properties === transferables[transferables.length - 1]) {
|
|
206
|
+
throw new Error('statically serialized object won\'t survive transfer of $name property');
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
if (properties.$name) {
|
|
211
|
+
throw new Error('$name property is reserved for worker serialization logic.');
|
|
212
|
+
}
|
|
213
|
+
if (classRegistryKey !== 'Object') {
|
|
214
|
+
properties.$name = classRegistryKey;
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
return properties;
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
export function deserialize(input: Serialized): unknown {
|
|
221
|
+
if (isSerializeHandledByBuiltin(input)) {
|
|
222
|
+
return input;
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
if (Array.isArray(input)) {
|
|
226
|
+
return input.map(deserialize);
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
if (typeof input !== 'object') {
|
|
230
|
+
throw new Error(`can't deserialize object of type ${typeof input}`);
|
|
231
|
+
}
|
|
232
|
+
const classRegistryKey = getClassRegistryKey(input) || 'Object';
|
|
233
|
+
if (!registry[classRegistryKey]) {
|
|
234
|
+
throw new Error(`can't deserialize unregistered class ${classRegistryKey}`);
|
|
235
|
+
}
|
|
236
|
+
const {klass} = registry[classRegistryKey];
|
|
237
|
+
if (!klass) {
|
|
238
|
+
throw new Error(`can't deserialize unregistered class ${classRegistryKey}`);
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
if (klass.deserialize) {
|
|
242
|
+
return klass.deserialize(input);
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
const result = Object.create(klass.prototype);
|
|
246
|
+
|
|
247
|
+
for (const key of Object.keys(input)) {
|
|
248
|
+
if (key === '$name') continue;
|
|
249
|
+
const value = (input as SerializedObject)[key];
|
|
250
|
+
result[key] = registry[classRegistryKey].shallow.indexOf(key) >= 0 ? value : deserialize(value);
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
return result;
|
|
254
|
+
}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
export const webpSupported = {
|
|
2
|
+
supported: false,
|
|
3
|
+
testSupport
|
|
4
|
+
};
|
|
5
|
+
|
|
6
|
+
let glForTesting: WebGLRenderingContext|WebGL2RenderingContext;
|
|
7
|
+
let webpCheckComplete = false;
|
|
8
|
+
let webpImgTest;
|
|
9
|
+
let webpImgTestOnloadComplete = false;
|
|
10
|
+
|
|
11
|
+
if (typeof document !== 'undefined') {
|
|
12
|
+
webpImgTest = document.createElement('img');
|
|
13
|
+
webpImgTest.onload = () => {
|
|
14
|
+
if (glForTesting) testWebpTextureUpload(glForTesting);
|
|
15
|
+
glForTesting = null;
|
|
16
|
+
webpImgTestOnloadComplete = true;
|
|
17
|
+
};
|
|
18
|
+
webpImgTest.onerror = () => {
|
|
19
|
+
webpCheckComplete = true;
|
|
20
|
+
glForTesting = null;
|
|
21
|
+
};
|
|
22
|
+
webpImgTest.src = 'data:image/webp;base64,UklGRh4AAABXRUJQVlA4TBEAAAAvAQAAAAfQ//73v/+BiOh/AAA=';
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
function testSupport(gl: WebGLRenderingContext | WebGL2RenderingContext) {
|
|
26
|
+
if (webpCheckComplete || !webpImgTest) return;
|
|
27
|
+
|
|
28
|
+
// HTMLImageElement.complete is set when an image is done loading it's source
|
|
29
|
+
// regardless of whether the load was successful or not.
|
|
30
|
+
// It's possible for an error to set HTMLImageElement.complete to true which would trigger
|
|
31
|
+
// testWebpTextureUpload and mistakenly set exported.supported to true in browsers which don't support webp
|
|
32
|
+
// To avoid this, we set a flag in the image's onload handler and only call testWebpTextureUpload
|
|
33
|
+
// after a successful image load event.
|
|
34
|
+
if (webpImgTestOnloadComplete) {
|
|
35
|
+
testWebpTextureUpload(gl);
|
|
36
|
+
} else {
|
|
37
|
+
glForTesting = gl;
|
|
38
|
+
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
function testWebpTextureUpload(gl: WebGLRenderingContext|WebGL2RenderingContext) {
|
|
43
|
+
// Edge 18 supports WebP but not uploading a WebP image to a gl texture
|
|
44
|
+
// Test support for this before allowing WebP images.
|
|
45
|
+
// https://github.com/mapbox/mapbox-gl-js/issues/7671
|
|
46
|
+
const texture = gl.createTexture();
|
|
47
|
+
gl.bindTexture(gl.TEXTURE_2D, texture);
|
|
48
|
+
|
|
49
|
+
try {
|
|
50
|
+
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, webpImgTest);
|
|
51
|
+
|
|
52
|
+
// The error does not get triggered in Edge if the context is lost
|
|
53
|
+
if (gl.isContextLost()) return;
|
|
54
|
+
|
|
55
|
+
webpSupported.supported = true;
|
|
56
|
+
} catch (e) {
|
|
57
|
+
// Catch "Unspecified Error." in Edge 18.
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
gl.deleteTexture(texture);
|
|
61
|
+
|
|
62
|
+
webpCheckComplete = true;
|
|
63
|
+
}
|