maplibre-gl
Version:
BSD licensed community fork of mapbox-gl, a WebGL interactive maps library
1 lines • 2.47 MB
Source Map (JSON)
{"version":3,"file":"maplibre-gl.mjs","names":["create","glMatrix.ARRAY_TYPE","v8","properties","getProperties","styleSpec","getProperties","properties","getProperties","styleSpec","getProperties","mat4.create","mat4.multiply","determinant","mat2.determinant","vec3.dot","deserializeBucket","vec2.sqrLen","createSource","mat4.create","mat2.create","vec2.create","vec2.length","symbolSize.evaluateSizeForZoom","symbolSize.evaluateSizeForFeature","intersectionTests.polygonIntersectsPolygon","mat4.identity","projection.getPitchedLabelPlaneMatrix","symbolSize.evaluateSizeForZoom","symbolSize.evaluateSizeForFeature","preludeFrag","preludeVert","projectionMercatorFrag","projectionMercatorVert","projectionGlobeFrag","projectionGlobeVert","backgroundFrag","backgroundVert","backgroundPatternFrag","backgroundPatternVert","circleFrag","circleVert","clippingMaskFrag","clippingMaskVert","heatmapFrag","heatmapVert","heatmapTextureFrag","heatmapTextureVert","collisionBoxFrag","collisionBoxVert","collisionCircleFrag","collisionCircleVert","colorReliefFrag","colorReliefVert","debugFrag","debugVert","depthVert","fillFrag","fillVert","fillOutlineFrag","fillOutlineVert","fillOutlinePatternFrag","fillOutlinePatternVert","fillPatternFrag","fillPatternVert","fillExtrusionFrag","fillExtrusionVert","fillExtrusionPatternFrag","fillExtrusionPatternVert","hillshadePrepareFrag","hillshadePrepareVert","hillshadeFrag","hillshadeVert","lineFrag","lineVert","lineGradientFrag","lineGradientVert","linePatternFrag","linePatternVert","lineSDFFrag","lineSDFVert","lineGradientSDFFrag","lineGradientSDFVert","layerOpacityFrag","layerOpacityVert","rasterFrag","rasterVert","symbolIconFrag","symbolIconVert","symbolSDFFrag","symbolSDFVert","symbolTextAndIconFrag","symbolTextAndIconVert","terrainFrag","terrainVert","terrainDepthFrag","terrainVertDepth","terrainCoordsFrag","terrainVertCoords","atmosphereFrag","atmosphereVert","skyFrag","skyVert","interpolates","mat2.create","mat4.identity","vec3.scale","vec3.add","vec3.clone","vec3.sub","vec3.normalize","vec3.cross","vec3.dot","vec4.transformMat4","vec4.mul","vec3.length","vec3.len","vec4.scale","vec3.scale","vec3.add","interpolates","mat4.clone","mat4.scale","mat4.multiply","mat4.invert","vec4.transformMat4","vec3.clone","scale","interpolates","interpolates","styleSpec","dot","vec3.dot","vec3.len","quat.fromEuler","vec3.transformQuat","vec3.scale","vec3.dot","vec3.scale","vec3.cross","dot","vec3.dot","vec3.length","mat4.clone","vec3.dot","vec3.dot","vec3.length","interpolates","clone","diffStyles","mat3.create","mat4.create","mat4.create","ALWAYS","mat4.identity","mat4.create","mat4.identity","mat4.identity","mat4.create","mat4.exactEquals","mat4.equals","LEFT_BUTTON","RIGHT_BUTTON","defaultZoomRate","defaultOptions","defaultZoomRate","interpolates","interpolates","mat4.fromScaling","mat4.identity","version","packageJSON.version","defaultOptions","Map","defaultOptions","defaultOptions","defaultOptions","packageJSON.version"],"sources":["../package.json","../node_modules/gl-matrix/esm/mat2.js","../src/util/browser.ts","../src/util/time_control.ts","../src/util/dom.ts","../src/util/image_request.ts","../src/util/request_manager.ts","../src/ui/events.ts","../src/util/style.ts","../src/style/load_sprite.ts","../src/render/image_manager.ts","../src/style/load_glyph_range.ts","../node_modules/@mapbox/tiny-sdf/index.js","../src/render/glyph_manager.ts","../src/style/light_properties.g.ts","../src/style/light.ts","../src/style/sky_properties.g.ts","../src/style/sky.ts","../src/render/line_atlas.ts","../src/util/web_worker.ts","../src/util/worker_pool.ts","../src/util/global_worker_pool.ts","../src/util/dispatcher.ts","../src/source/query_features.ts","../src/source/load_tilejson.ts","../src/geo/lng_lat_bounds.ts","../src/tile/tile_bounds.ts","../src/source/vector_tile_source.ts","../src/source/raster_tile_source.ts","../src/source/raster_dem_tile_source.ts","../src/source/geojson_source_diff.ts","../src/util/geojson_bounds.ts","../src/tile/tile_id_to_lng_lat_bounds.ts","../src/source/geojson_source.ts","../src/webgl/program/raster_program.ts","../src/source/image_source.ts","../src/source/video_source.ts","../src/source/canvas_source.ts","../src/source/source.ts","../src/data/bucket.ts","../src/source/rtl_text_plugin_status.ts","../src/source/rtl_text_plugin_main_thread.ts","../src/tile/tile.ts","../src/source/source_state.ts","../src/geo/projection/covering_tiles.ts","../src/data/extent_bounds.ts","../src/tile/tile_manager_raster.ts","../src/tile/tile_manager_raster_dem.ts","../src/tile/tile_manager_in_view_tiles.ts","../src/tile/tile_manager.ts","../src/symbol/path_interpolator.ts","../src/symbol/grid_index.ts","../src/util/fast_maths.ts","../src/symbol/projection.ts","../src/symbol/collision_index.ts","../src/symbol/placement.ts","../src/style/pauseable_placement.ts","../node_modules/kdbush/index.js","../src/symbol/cross_tile_symbol_index.ts","../src/shaders/glsl/_prelude.fragment.glsl.g.ts","../src/shaders/glsl/_prelude.vertex.glsl.g.ts","../src/shaders/glsl/background.fragment.glsl.g.ts","../src/shaders/glsl/background.vertex.glsl.g.ts","../src/shaders/glsl/background_pattern.fragment.glsl.g.ts","../src/shaders/glsl/background_pattern.vertex.glsl.g.ts","../src/shaders/glsl/circle.fragment.glsl.g.ts","../src/shaders/glsl/circle.vertex.glsl.g.ts","../src/shaders/glsl/clipping_mask.fragment.glsl.g.ts","../src/shaders/glsl/clipping_mask.vertex.glsl.g.ts","../src/shaders/glsl/heatmap.fragment.glsl.g.ts","../src/shaders/glsl/heatmap.vertex.glsl.g.ts","../src/shaders/glsl/heatmap_texture.fragment.glsl.g.ts","../src/shaders/glsl/heatmap_texture.vertex.glsl.g.ts","../src/shaders/glsl/collision_box.fragment.glsl.g.ts","../src/shaders/glsl/collision_box.vertex.glsl.g.ts","../src/shaders/glsl/collision_circle.fragment.glsl.g.ts","../src/shaders/glsl/collision_circle.vertex.glsl.g.ts","../src/shaders/glsl/color_relief.fragment.glsl.g.ts","../src/shaders/glsl/color_relief.vertex.glsl.g.ts","../src/shaders/glsl/debug.fragment.glsl.g.ts","../src/shaders/glsl/debug.vertex.glsl.g.ts","../src/shaders/glsl/depth.vertex.glsl.g.ts","../src/shaders/glsl/fill.fragment.glsl.g.ts","../src/shaders/glsl/fill.vertex.glsl.g.ts","../src/shaders/glsl/fill_outline.fragment.glsl.g.ts","../src/shaders/glsl/fill_outline.vertex.glsl.g.ts","../src/shaders/glsl/fill_outline_pattern.fragment.glsl.g.ts","../src/shaders/glsl/fill_outline_pattern.vertex.glsl.g.ts","../src/shaders/glsl/fill_pattern.fragment.glsl.g.ts","../src/shaders/glsl/fill_pattern.vertex.glsl.g.ts","../src/shaders/glsl/fill_extrusion.fragment.glsl.g.ts","../src/shaders/glsl/fill_extrusion.vertex.glsl.g.ts","../src/shaders/glsl/fill_extrusion_pattern.fragment.glsl.g.ts","../src/shaders/glsl/fill_extrusion_pattern.vertex.glsl.g.ts","../src/shaders/glsl/hillshade_prepare.fragment.glsl.g.ts","../src/shaders/glsl/hillshade_prepare.vertex.glsl.g.ts","../src/shaders/glsl/hillshade.fragment.glsl.g.ts","../src/shaders/glsl/hillshade.vertex.glsl.g.ts","../src/shaders/glsl/line.fragment.glsl.g.ts","../src/shaders/glsl/line.vertex.glsl.g.ts","../src/shaders/glsl/line_gradient.fragment.glsl.g.ts","../src/shaders/glsl/line_gradient.vertex.glsl.g.ts","../src/shaders/glsl/line_pattern.fragment.glsl.g.ts","../src/shaders/glsl/line_pattern.vertex.glsl.g.ts","../src/shaders/glsl/line_sdf.fragment.glsl.g.ts","../src/shaders/glsl/line_sdf.vertex.glsl.g.ts","../src/shaders/glsl/line_gradient_sdf.fragment.glsl.g.ts","../src/shaders/glsl/line_gradient_sdf.vertex.glsl.g.ts","../src/shaders/glsl/layer_opacity.fragment.glsl.g.ts","../src/shaders/glsl/layer_opacity.vertex.glsl.g.ts","../src/shaders/glsl/raster.fragment.glsl.g.ts","../src/shaders/glsl/raster.vertex.glsl.g.ts","../src/shaders/glsl/symbol_icon.fragment.glsl.g.ts","../src/shaders/glsl/symbol_icon.vertex.glsl.g.ts","../src/shaders/glsl/symbol_sdf.fragment.glsl.g.ts","../src/shaders/glsl/symbol_sdf.vertex.glsl.g.ts","../src/shaders/glsl/symbol_text_and_icon.fragment.glsl.g.ts","../src/shaders/glsl/symbol_text_and_icon.vertex.glsl.g.ts","../src/shaders/glsl/terrain_depth.fragment.glsl.g.ts","../src/shaders/glsl/terrain_coords.fragment.glsl.g.ts","../src/shaders/glsl/terrain.fragment.glsl.g.ts","../src/shaders/glsl/terrain.vertex.glsl.g.ts","../src/shaders/glsl/terrain_depth.vertex.glsl.g.ts","../src/shaders/glsl/terrain_coords.vertex.glsl.g.ts","../src/shaders/glsl/_projection_mercator.vertex.glsl.g.ts","../src/shaders/glsl/_projection_mercator.fragment.glsl.g.ts","../src/shaders/glsl/_projection_globe.vertex.glsl.g.ts","../src/shaders/glsl/_projection_globe.fragment.glsl.g.ts","../src/shaders/glsl/atmosphere.fragment.glsl.g.ts","../src/shaders/glsl/atmosphere.vertex.glsl.g.ts","../src/shaders/glsl/sky.fragment.glsl.g.ts","../src/shaders/glsl/sky.vertex.glsl.g.ts","../src/shaders/shaders.ts","../src/render/mesh.ts","../src/data/pos_attributes.ts","../src/geo/projection/mercator_projection.ts","../src/geo/edge_insets.ts","../src/geo/transform_helper.ts","../src/util/primitives/aabb.ts","../src/geo/projection/mercator_covering_tiles_details_provider.ts","../src/util/primitives/frustum.ts","../src/geo/projection/mercator_transform.ts","../src/geo/projection/camera_helper.ts","../src/geo/projection/mercator_camera_helper.ts","../src/style/projection_properties.g.ts","../src/util/create_tile_mesh.ts","../src/geo/projection/vertical_perspective_projection.ts","../src/geo/projection/globe_projection.ts","../src/geo/projection/globe_utils.ts","../src/util/primitives/bounding_volume_cache.ts","../src/util/primitives/convex_volume.ts","../src/geo/projection/globe_covering_tiles_details_provider.ts","../src/geo/projection/vertical_perspective_transform.ts","../src/geo/projection/globe_transform.ts","../src/geo/projection/vertical_perspective_camera_helper.ts","../src/geo/projection/globe_camera_helper.ts","../src/geo/projection/projection_factory.ts","../src/style/style.ts","../src/data/raster_bounds_attributes.ts","../src/webgl/vertex_array_object.ts","../src/webgl/program/terrain_program.ts","../src/webgl/program/projection_program.ts","../src/webgl/program.ts","../src/webgl/program/pattern.ts","../src/webgl/program/fill_extrusion_program.ts","../src/webgl/program/fill_program.ts","../src/webgl/program/circle_program.ts","../src/webgl/program/collision_program.ts","../src/webgl/program/debug_program.ts","../src/webgl/program/heatmap_program.ts","../src/webgl/program/hillshade_program.ts","../src/webgl/program/color_relief_program.ts","../src/webgl/program/line_program.ts","../src/webgl/program/layer_opacity_program.ts","../src/webgl/program/symbol_program.ts","../src/webgl/program/background_program.ts","../src/webgl/program/atmosphere_program.ts","../src/webgl/program/sky_program.ts","../src/webgl/program/program_uniforms.ts","../src/webgl/index_buffer.ts","../src/webgl/vertex_buffer.ts","../src/webgl/value.ts","../src/webgl/framebuffer.ts","../src/webgl/color_mode.ts","../src/webgl/context.ts","../src/webgl/depth_mode.ts","../src/webgl/stencil_mode.ts","../src/webgl/cull_face_mode.ts","../src/webgl/draw/draw_collision_debug.ts","../src/webgl/draw/draw_symbol.ts","../src/webgl/draw/draw_circle.ts","../src/webgl/draw/draw_heatmap.ts","../src/webgl/draw/draw_layer_opacity.ts","../src/webgl/draw/draw_line.ts","../src/render/update_pattern_positions_in_program.ts","../src/webgl/draw/draw_fill.ts","../src/webgl/draw/draw_fill_extrusion.ts","../src/webgl/draw/draw_hillshade.ts","../src/webgl/draw/draw_color_relief.ts","../src/webgl/draw/draw_raster.ts","../src/webgl/draw/draw_background.ts","../src/webgl/draw/draw_debug.ts","../src/webgl/draw/draw_custom.ts","../src/webgl/draw/draw_terrain.ts","../src/webgl/draw/draw_sky.ts","../src/webgl/draw/index.ts","../src/render/painter.ts","../src/util/gpu_initialization_error.ts","../src/util/throttle.ts","../src/ui/hash.ts","../src/ui/handler_inertia.ts","../src/ui/handler/map_event.ts","../src/ui/handler/box_zoom.ts","../src/ui/handler/handler_util.ts","../src/ui/handler/tap_recognizer.ts","../src/ui/handler/tap_zoom.ts","../src/ui/handler/drag_handler.ts","../src/ui/handler/drag_move_state_manager.ts","../src/ui/handler/mouse.ts","../src/ui/handler/touch_pan.ts","../src/ui/handler/two_fingers_touch.ts","../src/ui/handler/keyboard.ts","../src/ui/handler/scroll_zoom.ts","../src/ui/handler/shim/dblclick_zoom.ts","../src/ui/handler/click_zoom.ts","../src/ui/handler/tap_drag_zoom.ts","../src/ui/handler/shim/drag_pan.ts","../src/ui/handler/shim/drag_rotate.ts","../src/ui/handler/shim/two_fingers_touch.ts","../src/ui/handler/cooperative_gestures.ts","../src/ui/handler/transform-provider.ts","../src/ui/handler_manager.ts","../src/ui/camera.ts","../src/ui/control/attribution_control.ts","../src/ui/control/logo_control.ts","../src/util/task_queue.ts","../src/data/pos3d_attributes.ts","../src/tile/terrain_tile_manager.ts","../src/render/terrain.ts","../src/webgl/render_to_texture.ts","../src/ui/default_locale.ts","../src/ui/map.ts","../src/ui/control/navigation_control.ts","../src/util/geolocation_support.ts","../src/util/smart_wrap.ts","../src/ui/anchor.ts","../src/ui/marker.ts","../src/ui/control/geolocate_control.ts","../src/ui/control/scale_control.ts","../src/ui/control/fullscreen_control.ts","../src/ui/control/terrain_control.ts","../src/ui/control/globe_control.ts","../src/ui/popup.ts","../src/index.ts"],"sourcesContent":["","import * as glMatrix from \"./common.js\";\n\n/**\n * 2x2 Matrix\n * @module mat2\n */\n\n/**\n * Creates a new identity mat2\n *\n * @returns {mat2} a new 2x2 matrix\n */\nexport function create() {\n var out = new glMatrix.ARRAY_TYPE(4);\n if (glMatrix.ARRAY_TYPE != Float32Array) {\n out[1] = 0;\n out[2] = 0;\n }\n out[0] = 1;\n out[3] = 1;\n return out;\n}\n\n/**\n * Creates a new mat2 initialized with values from an existing matrix\n *\n * @param {ReadonlyMat2} a matrix to clone\n * @returns {mat2} a new 2x2 matrix\n */\nexport function clone(a) {\n var out = new glMatrix.ARRAY_TYPE(4);\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[3];\n return out;\n}\n\n/**\n * Copy the values from one mat2 to another\n *\n * @param {mat2} out the receiving matrix\n * @param {ReadonlyMat2} a the source matrix\n * @returns {mat2} out\n */\nexport function copy(out, a) {\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[3];\n return out;\n}\n\n/**\n * Set a mat2 to the identity matrix\n *\n * @param {mat2} out the receiving matrix\n * @returns {mat2} out\n */\nexport function identity(out) {\n out[0] = 1;\n out[1] = 0;\n out[2] = 0;\n out[3] = 1;\n return out;\n}\n\n/**\n * Create a new mat2 with the given values\n *\n * @param {Number} m00 Component in column 0, row 0 position (index 0)\n * @param {Number} m01 Component in column 0, row 1 position (index 1)\n * @param {Number} m10 Component in column 1, row 0 position (index 2)\n * @param {Number} m11 Component in column 1, row 1 position (index 3)\n * @returns {mat2} out A new 2x2 matrix\n */\nexport function fromValues(m00, m01, m10, m11) {\n var out = new glMatrix.ARRAY_TYPE(4);\n out[0] = m00;\n out[1] = m01;\n out[2] = m10;\n out[3] = m11;\n return out;\n}\n\n/**\n * Set the components of a mat2 to the given values\n *\n * @param {mat2} out the receiving matrix\n * @param {Number} m00 Component in column 0, row 0 position (index 0)\n * @param {Number} m01 Component in column 0, row 1 position (index 1)\n * @param {Number} m10 Component in column 1, row 0 position (index 2)\n * @param {Number} m11 Component in column 1, row 1 position (index 3)\n * @returns {mat2} out\n */\nexport function set(out, m00, m01, m10, m11) {\n out[0] = m00;\n out[1] = m01;\n out[2] = m10;\n out[3] = m11;\n return out;\n}\n\n/**\n * Transpose the values of a mat2\n *\n * @param {mat2} out the receiving matrix\n * @param {ReadonlyMat2} a the source matrix\n * @returns {mat2} out\n */\nexport function transpose(out, a) {\n // If we are transposing ourselves we can skip a few steps but have to cache\n // some values\n if (out === a) {\n var a1 = a[1];\n out[1] = a[2];\n out[2] = a1;\n } else {\n out[0] = a[0];\n out[1] = a[2];\n out[2] = a[1];\n out[3] = a[3];\n }\n return out;\n}\n\n/**\n * Inverts a mat2\n *\n * @param {mat2} out the receiving matrix\n * @param {ReadonlyMat2} a the source matrix\n * @returns {mat2 | null} out, or null if source matrix is not invertible\n */\nexport function invert(out, a) {\n var a0 = a[0],\n a1 = a[1],\n a2 = a[2],\n a3 = a[3];\n\n // Calculate the determinant\n var det = a0 * a3 - a2 * a1;\n if (!det) {\n return null;\n }\n det = 1.0 / det;\n out[0] = a3 * det;\n out[1] = -a1 * det;\n out[2] = -a2 * det;\n out[3] = a0 * det;\n return out;\n}\n\n/**\n * Calculates the adjugate of a mat2\n *\n * @param {mat2} out the receiving matrix\n * @param {ReadonlyMat2} a the source matrix\n * @returns {mat2} out\n */\nexport function adjoint(out, a) {\n // Caching this value is necessary if out == a\n var a0 = a[0];\n out[0] = a[3];\n out[1] = -a[1];\n out[2] = -a[2];\n out[3] = a0;\n return out;\n}\n\n/**\n * Calculates the determinant of a mat2\n *\n * @param {ReadonlyMat2} a the source matrix\n * @returns {Number} determinant of a\n */\nexport function determinant(a) {\n return a[0] * a[3] - a[2] * a[1];\n}\n\n/**\n * Multiplies two mat2's\n *\n * @param {mat2} out the receiving matrix\n * @param {ReadonlyMat2} a the first operand\n * @param {ReadonlyMat2} b the second operand\n * @returns {mat2} out\n */\nexport function multiply(out, a, b) {\n var a0 = a[0],\n a1 = a[1],\n a2 = a[2],\n a3 = a[3];\n var b0 = b[0],\n b1 = b[1],\n b2 = b[2],\n b3 = b[3];\n out[0] = a0 * b0 + a2 * b1;\n out[1] = a1 * b0 + a3 * b1;\n out[2] = a0 * b2 + a2 * b3;\n out[3] = a1 * b2 + a3 * b3;\n return out;\n}\n\n/**\n * Rotates a mat2 by the given angle\n *\n * @param {mat2} out the receiving matrix\n * @param {ReadonlyMat2} a the matrix to rotate\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat2} out\n */\nexport function rotate(out, a, rad) {\n var a0 = a[0],\n a1 = a[1],\n a2 = a[2],\n a3 = a[3];\n var s = Math.sin(rad);\n var c = Math.cos(rad);\n out[0] = a0 * c + a2 * s;\n out[1] = a1 * c + a3 * s;\n out[2] = a0 * -s + a2 * c;\n out[3] = a1 * -s + a3 * c;\n return out;\n}\n\n/**\n * Scales the mat2 by the dimensions in the given vec2\n *\n * @param {mat2} out the receiving matrix\n * @param {ReadonlyMat2} a the matrix to rotate\n * @param {ReadonlyVec2} v the vec2 to scale the matrix by\n * @returns {mat2} out\n **/\nexport function scale(out, a, v) {\n var a0 = a[0],\n a1 = a[1],\n a2 = a[2],\n a3 = a[3];\n var v0 = v[0],\n v1 = v[1];\n out[0] = a0 * v0;\n out[1] = a1 * v0;\n out[2] = a2 * v1;\n out[3] = a3 * v1;\n return out;\n}\n\n/**\n * Creates a matrix from a given angle\n * This is equivalent to (but much faster than):\n *\n * mat2.identity(dest);\n * mat2.rotate(dest, dest, rad);\n *\n * @param {mat2} out mat2 receiving operation result\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat2} out\n */\nexport function fromRotation(out, rad) {\n var s = Math.sin(rad);\n var c = Math.cos(rad);\n out[0] = c;\n out[1] = s;\n out[2] = -s;\n out[3] = c;\n return out;\n}\n\n/**\n * Creates a matrix from a vector scaling\n * This is equivalent to (but much faster than):\n *\n * mat2.identity(dest);\n * mat2.scale(dest, dest, vec);\n *\n * @param {mat2} out mat2 receiving operation result\n * @param {ReadonlyVec2} v Scaling vector\n * @returns {mat2} out\n */\nexport function fromScaling(out, v) {\n out[0] = v[0];\n out[1] = 0;\n out[2] = 0;\n out[3] = v[1];\n return out;\n}\n\n/**\n * Returns a string representation of a mat2\n *\n * @param {ReadonlyMat2} a matrix to represent as a string\n * @returns {String} string representation of the matrix\n */\nexport function str(a) {\n return \"mat2(\" + a[0] + \", \" + a[1] + \", \" + a[2] + \", \" + a[3] + \")\";\n}\n\n/**\n * Returns Frobenius norm of a mat2\n *\n * @param {ReadonlyMat2} a the matrix to calculate Frobenius norm of\n * @returns {Number} Frobenius norm\n */\nexport function frob(a) {\n return Math.sqrt(a[0] * a[0] + a[1] * a[1] + a[2] * a[2] + a[3] * a[3]);\n}\n\n/**\n * Returns L, D and U matrices (Lower triangular, Diagonal and Upper triangular) by factorizing the input matrix\n * @param {ReadonlyMat2} L the lower triangular matrix\n * @param {ReadonlyMat2} D the diagonal matrix\n * @param {ReadonlyMat2} U the upper triangular matrix\n * @param {ReadonlyMat2} a the input matrix to factorize\n */\n\nexport function LDU(L, D, U, a) {\n L[2] = a[2] / a[0];\n U[0] = a[0];\n U[1] = a[1];\n U[3] = a[3] - L[2] * U[1];\n return [L, D, U];\n}\n\n/**\n * Adds two mat2's\n *\n * @param {mat2} out the receiving matrix\n * @param {ReadonlyMat2} a the first operand\n * @param {ReadonlyMat2} b the second operand\n * @returns {mat2} out\n */\nexport function add(out, a, b) {\n out[0] = a[0] + b[0];\n out[1] = a[1] + b[1];\n out[2] = a[2] + b[2];\n out[3] = a[3] + b[3];\n return out;\n}\n\n/**\n * Subtracts matrix b from matrix a\n *\n * @param {mat2} out the receiving matrix\n * @param {ReadonlyMat2} a the first operand\n * @param {ReadonlyMat2} b the second operand\n * @returns {mat2} out\n */\nexport function subtract(out, a, b) {\n out[0] = a[0] - b[0];\n out[1] = a[1] - b[1];\n out[2] = a[2] - b[2];\n out[3] = a[3] - b[3];\n return out;\n}\n\n/**\n * Returns whether or not the matrices have exactly the same elements in the same position (when compared with ===)\n *\n * @param {ReadonlyMat2} a The first matrix.\n * @param {ReadonlyMat2} b The second matrix.\n * @returns {Boolean} True if the matrices are equal, false otherwise.\n */\nexport function exactEquals(a, b) {\n return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3];\n}\n\n/**\n * Returns whether or not the matrices have approximately the same elements in the same position.\n *\n * @param {ReadonlyMat2} a The first matrix.\n * @param {ReadonlyMat2} b The second matrix.\n * @returns {Boolean} True if the matrices are equal, false otherwise.\n */\nexport function equals(a, b) {\n var a0 = a[0],\n a1 = a[1],\n a2 = a[2],\n a3 = a[3];\n var b0 = b[0],\n b1 = b[1],\n b2 = b[2],\n b3 = b[3];\n return Math.abs(a0 - b0) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)) && Math.abs(a3 - b3) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a3), Math.abs(b3));\n}\n\n/**\n * Multiply each element of the matrix by a scalar.\n *\n * @param {mat2} out the receiving matrix\n * @param {ReadonlyMat2} a the matrix to scale\n * @param {Number} b amount to scale the matrix's elements by\n * @returns {mat2} out\n */\nexport function multiplyScalar(out, a, b) {\n out[0] = a[0] * b;\n out[1] = a[1] * b;\n out[2] = a[2] * b;\n out[3] = a[3] * b;\n return out;\n}\n\n/**\n * Adds two mat2's after multiplying each element of the second operand by a scalar value.\n *\n * @param {mat2} out the receiving vector\n * @param {ReadonlyMat2} a the first operand\n * @param {ReadonlyMat2} b the second operand\n * @param {Number} scale the amount to scale b's elements by before adding\n * @returns {mat2} out\n */\nexport function multiplyScalarAndAdd(out, a, b, scale) {\n out[0] = a[0] + b[0] * scale;\n out[1] = a[1] + b[1] * scale;\n out[2] = a[2] + b[2] * scale;\n out[3] = a[3] + b[3] * scale;\n return out;\n}\n\n/**\n * Alias for {@link mat2.multiply}\n * @function\n */\nexport var mul = multiply;\n\n/**\n * Alias for {@link mat2.subtract}\n * @function\n */\nexport var sub = subtract;","import {AbortError} from './abort_error.ts';\nimport {subscribe} from './util.ts';\n\nlet linkEl;\n\nlet reducedMotionQuery: MediaQueryList;\nlet reducedMotionOverride: boolean | undefined;\n\n/** */\nexport const browser = {\n /**\n * Schedules a callback to be invoked on the next animation frame.\n * @param abortController - Controller to abort the scheduled frame.\n * @param fn - Callback to invoke with the paint start timestamp.\n * @param reject - Callback to invoke if the frame is aborted.\n * @param targetWindow - Optional window to use for requestAnimationFrame.\n * When the map is rendered in a popup window or iframe, pass the owning\n * window to ensure animation frames continue even when the main window\n * is not focused.\n */\n frame(abortController: AbortController, fn: (paintStartTimestamp: number) => void, reject: (error: Error) => void, targetWindow?: Window): void {\n const win = targetWindow || window;\n const frameId = win.requestAnimationFrame((paintStartTimestamp)=>{\n unsubscribe();\n fn(paintStartTimestamp);\n });\n\n const {unsubscribe} = subscribe(abortController.signal, 'abort', () => {\n unsubscribe();\n win.cancelAnimationFrame(frameId);\n reject(new AbortError(abortController.signal.reason));\n }, false);\n },\n\n /**\n * Returns a promise that resolves on the next animation frame.\n * @param abortController - Controller to abort the scheduled frame.\n * @param targetWindow - Optional window to use for requestAnimationFrame.\n * @see {@link browser.frame}\n */\n frameAsync(abortController: AbortController, targetWindow?: Window): Promise<number> {\n return new Promise((resolve, reject) => {\n this.frame(abortController, resolve, reject, targetWindow);\n });\n },\n\n getImageData(img: HTMLImageElement | ImageBitmap, padding: number = 0): ImageData {\n const context = this.getImageCanvasContext(img);\n return context.getImageData(-padding, -padding, img.width + 2 * padding, img.height + 2 * padding);\n },\n\n getImageCanvasContext(img: HTMLImageElement | ImageBitmap): CanvasRenderingContext2D {\n const canvas = window.document.createElement('canvas');\n const context = canvas.getContext('2d', {willReadFrequently: true});\n if (!context) {\n throw new Error('failed to create canvas 2d context');\n }\n canvas.width = img.width;\n canvas.height = img.height;\n context.drawImage(img, 0, 0, img.width, img.height);\n return context;\n },\n\n resolveURL(path: string): string {\n linkEl ||= document.createElement('a');\n linkEl.href = path;\n return linkEl.href;\n },\n\n get hardwareConcurrency(): number {\n return (typeof navigator !== 'undefined' && navigator.hardwareConcurrency) || 4;\n },\n\n get prefersReducedMotion(): boolean {\n if (reducedMotionOverride !== undefined) return reducedMotionOverride;\n // In case your test crashes when checking matchMedia, call setMatchMedia from 'src/util/test/util'\n if (!matchMedia) return false;\n //Lazily initialize media query\n reducedMotionQuery ??= matchMedia('(prefers-reduced-motion: reduce)');\n return reducedMotionQuery.matches;\n },\n\n set prefersReducedMotion(value: boolean) {\n reducedMotionOverride = value;\n }\n};\n","/**\n * Manages time flow with optional freezing capability for deterministic rendering.\n */\nclass TimeManager {\n private _frozenAt: number | null = null;\n\n /**\n * Gets the current time, either real or frozen.\n * @returns Current time in milliseconds\n */\n getCurrentTime(): number {\n return this._frozenAt !== null ? this._frozenAt : performance.now();\n }\n\n /**\n * Sets time at a specific timestamp.\n * @param timestamp - Time in milliseconds to set\n */\n setNow(timestamp: number): void {\n this._frozenAt = timestamp;\n }\n\n /**\n * Restores normal time flow.\n */\n restoreNow(): void {\n this._frozenAt = null;\n }\n\n /**\n * Returns whether time is currently frozen.\n * @returns True if time is frozen, false otherwise\n */\n isFrozen(): boolean {\n return this._frozenAt !== null;\n }\n}\n\nconst timeManager = new TimeManager();\n\n/**\n * Returns the current time in milliseconds.\n * When time is frozen via setNow(), returns the frozen timestamp.\n * Otherwise returns real browser time via performance.now().\n *\n * @returns Current time in milliseconds\n * @example\n * ```ts\n * // Measure elapsed time\n * const start = maplibregl.now();\n * // ... later ...\n * const elapsed = maplibregl.now() - start;\n *\n * // During frozen time\n * maplibregl.setNow(16.67);\n * console.log(maplibregl.now()); // 16.67\n * maplibregl.restoreNow();\n * console.log(maplibregl.now()); // real time\n * ```\n */\nexport function now(): number {\n return timeManager.getCurrentTime();\n}\n\n/**\n * Freezes time at a specific timestamp for deterministic rendering.\n * Useful for frame-by-frame video capture where each frame needs\n * a consistent time value.\n *\n * @param timestamp - Time in milliseconds to freeze at\n * @example\n * ```ts\n * // Freeze time for video export at 60fps\n * setNow(0); // First frame\n * // ... render frame ...\n * setNow(16.67); // Second frame\n * // ... render frame ...\n * setNow(33.34); // Third frame\n * // ... done ...\n * restoreNow(); // Resume normal time\n * ```\n */\nexport function setNow(timestamp: number): void {\n timeManager.setNow(timestamp);\n}\n\n/**\n * Restores normal time flow after freezing with setNow().\n * Call this after finishing deterministic rendering operations.\n *\n * @example\n * ```ts\n * // After video export, resume normal time\n * setNow(0);\n * // ... export frames ...\n * restoreNow(); // Map animations resume normally\n * ```\n */\nexport function restoreNow(): void {\n timeManager.restoreNow();\n}\n\n/**\n * Returns whether time is currently frozen.\n * @returns True if time is frozen via setNow(), false otherwise\n * @example\n * ```ts\n * setNow(1000);\n * console.log(isTimeFrozen()); // true\n * restoreNow();\n * console.log(isTimeFrozen()); // false\n * ```\n */\nexport function isTimeFrozen(): boolean {\n return timeManager.isFrozen();\n}","import Point from '@mapbox/point-geometry';\n\ntype ScaleReturnValue = {\n x: number;\n y: number;\n boundingClientRect: DOMRect;\n};\n\nexport class DOM {\n private static readonly docStyle = typeof window !== 'undefined' && window.document?.documentElement.style;\n\n private static userSelect: string;\n\n private static selectProp = !DOM.docStyle || 'userSelect' in DOM.docStyle ? 'userSelect' : 'webkitUserSelect';\n\n public static create<K extends keyof HTMLElementTagNameMap>(tagName: K, className?: string, container?: HTMLElement): HTMLElementTagNameMap[K] {\n const el = window.document.createElement(tagName);\n if (className !== undefined) el.className = className;\n if (container) container.appendChild(el);\n return el;\n }\n\n public static createNS(namespaceURI: string, tagName: string): Element {\n return window.document.createElementNS(namespaceURI, tagName);\n }\n\n public static disableDrag(): void {\n if (DOM.docStyle && DOM.selectProp) {\n DOM.userSelect = DOM.docStyle[DOM.selectProp];\n DOM.docStyle[DOM.selectProp] = 'none';\n }\n }\n\n public static enableDrag(): void {\n if (DOM.docStyle && DOM.selectProp) {\n DOM.docStyle[DOM.selectProp] = DOM.userSelect;\n }\n }\n\n // Suppress the next click, but only if it's immediate.\n private static suppressClickInternal(e) {\n e.preventDefault();\n e.stopPropagation();\n window.removeEventListener('click', DOM.suppressClickInternal, true);\n }\n\n public static suppressClick(): void {\n window.addEventListener('click', DOM.suppressClickInternal, true);\n window.setTimeout(() => {\n window.removeEventListener('click', DOM.suppressClickInternal, true);\n }, 0);\n }\n\n private static getScale(element: HTMLElement): ScaleReturnValue {\n const rect = element.getBoundingClientRect();\n return {\n x: (rect.width / element.offsetWidth) || 1,\n y: (rect.height / element.offsetHeight) || 1,\n boundingClientRect: rect,\n };\n }\n\n private static getPoint(el: HTMLElement, scale: ScaleReturnValue, e: MouseEvent | Touch): Point {\n const rect = scale.boundingClientRect;\n return new Point(\n // rect.left/top values are in page scale (like clientX/Y),\n // whereas clientLeft/Top (border width) values are the original values (before CSS scale applies).\n ((e.clientX - rect.left) / scale.x) - el.clientLeft,\n ((e.clientY - rect.top) / scale.y) - el.clientTop\n );\n }\n\n public static mousePos(el: HTMLElement, e: MouseEvent | Touch): Point {\n const scale = DOM.getScale(el);\n return DOM.getPoint(el, scale, e);\n }\n\n public static touchPos(el: HTMLElement, touches: TouchList): Point[] {\n const points: Point[] = [];\n const scale = DOM.getScale(el);\n for (const touch of touches) {\n points.push(DOM.getPoint(el, scale, touch));\n }\n return points;\n }\n\n /**\n * Sanitize an HTML string - this might not be enough to prevent all XSS attacks\n * Base on https://javascriptsource.com/sanitize-an-html-string-to-reduce-the-risk-of-xss-attacks/\n * (c) 2021 Chris Ferdinandi, MIT License, https://gomakethings.com\n */\n public static sanitize(str: string): string {\n const parser = new DOMParser();\n const doc = parser.parseFromString(str, 'text/html');\n const html = doc.body || document.createElement('body');\n const scripts = html.querySelectorAll('script');\n for (const script of scripts) {\n script.remove();\n }\n\n DOM.clean(html);\n\n return html.innerHTML;\n }\n\n /**\n * Check if the attribute is potentially dangerous\n */\n private static isPossiblyDangerous(name: string, value: string): boolean {\n const val = value.replace(/\\s+/g, '').toLowerCase();\n if (['src', 'href', 'xlink:href'].includes(name)) {\n if (val.includes('javascript:') || val.includes('data:')) return true;\n }\n if (name.startsWith('on')) return true;\n }\n\n /**\n\t * Remove dangerous stuff from the HTML document's nodes\n\t * @param html - The HTML document\n\t */\n private static clean(html: Element) {\n const nodes = html.children;\n for (const node of nodes) {\n DOM.removeAttributes(node);\n DOM.clean(node);\n }\n }\n\n /**\n\t * Remove potentially dangerous attributes from an element\n\t * @param elem - The element\n\t */\n private static removeAttributes(elem: Element) {\n for (const {name, value} of elem.attributes) {\n if (!DOM.isPossiblyDangerous(name, value)) continue;\n elem.removeAttribute(name);\n }\n }\n}\n","import {type RequestParameters, makeRequest, sameOrigin, type GetResourceResponse} from './ajax.ts';\nimport {arrayBufferToImageBitmap, arrayBufferToImage, ensureError, extend, isWorker, isImageBitmap} from './util.ts';\nimport {config} from './config.ts';\nimport {AbortError} from './abort_error.ts';\nimport {getProtocol} from '../source/protocol_crud.ts';\n\ntype ImageQueueThrottleControlCallback = () => boolean;\n\nexport type ImageRequestQueueItem = {\n requestParameters: RequestParameters;\n supportImageRefresh: boolean;\n imageBitmapOptions?: ImageBitmapOptions;\n state: 'queued' | 'running' | 'completed';\n abortController: AbortController;\n onError: (error: Error) => void;\n onSuccess: (response: GetResourceResponse<HTMLImageElement | ImageBitmap | null>) => void;\n};\n\ntype ImageQueueThrottleCallbackDictionary = {\n [Key: number]: ImageQueueThrottleControlCallback;\n};\n\ntype HTMLImageElementWithPriority = HTMLImageElement &\n{\n // fetchPriority is experimental property supported on Chromium browsers from Version 102\n // By default images are downloaded with priority low, whereas fetch request downloads with priority high\n // https://developer.mozilla.org/en-US/docs/Web/API/HTMLImageElement/fetchPriority\n fetchPriority?: 'auto' | 'high' | 'low';\n};\n\n/**\n * By default, the image queue is self driven, meaning as soon as one requested item is processed,\n * it will move on to next one as quickly as it can while limiting\n * the number of concurrent requests to MAX_PARALLEL_IMAGE_REQUESTS. The default behavior\n * ensures that static views of the map can be rendered with minimal delay.\n *\n * However, the default behavior can prevent dynamic views of the map from rendering\n * smoothly in that many requests can finish in one render frame, putting too much pressure on GPU.\n *\n * When the view of the map is moving dynamically, smoother frame rates can be achieved\n * by throttling the number of items processed by the queue per frame. This can be\n * accomplished by using {@link addThrottleControl} to allow the caller to\n * use a lambda function to determine when the queue should be throttled (e.g. when isMoving())\n * and manually calling {@link processQueue} in the render loop.\n */\nexport namespace ImageRequest {\n let imageRequestQueue : ImageRequestQueueItem[];\n let currentParallelImageRequests:number;\n\n let throttleControlCallbackHandleCounter: number;\n let throttleControlCallbacks: ImageQueueThrottleCallbackDictionary;\n\n /**\n * Reset the image request queue, removing all pending requests.\n */\n export const resetRequestQueue = (): void => {\n imageRequestQueue = [];\n currentParallelImageRequests = 0;\n throttleControlCallbackHandleCounter = 0;\n throttleControlCallbacks = {};\n };\n\n /**\n * Install a callback to control when image queue throttling is desired.\n * (e.g. when the map view is moving)\n * @param callback - The callback function to install\n * @returns handle that identifies the installed callback.\n */\n export const addThrottleControl = (callback: ImageQueueThrottleControlCallback): number => {\n const handle = throttleControlCallbackHandleCounter++;\n throttleControlCallbacks[handle] = callback;\n return handle;\n };\n\n /**\n * Remove a previously installed callback by passing in the handle returned\n * by {@link addThrottleControl}.\n * @param callbackHandle - The handle for the callback to remove.\n */\n export const removeThrottleControl = (callbackHandle: number): void => {\n delete throttleControlCallbacks[callbackHandle];\n // Try updating the queue\n processQueue();\n };\n\n /**\n * Check to see if any of the installed callbacks are requesting the queue\n * to be throttled.\n * @returns `true` if any callback is causing the queue to be throttled.\n */\n const isThrottled = (): boolean => {\n for (const key of Object.keys(throttleControlCallbacks)) {\n if (throttleControlCallbacks[key]()) {\n return true;\n }\n }\n return false;\n };\n\n /**\n * Request to load an image.\n * @param requestParameters - Request parameters.\n * @param abortController - allows to abort the request.\n * @param supportImageRefresh - `true`, if the image request need to support refresh based on cache headers.\n * @returns - A promise resolved when the image is loaded.\n */\n export const getImage = (\n requestParameters: RequestParameters,\n abortController: AbortController,\n supportImageRefresh: boolean = true,\n imageBitmapOptions?: ImageBitmapOptions\n ): Promise<GetResourceResponse<HTMLImageElement | ImageBitmap | null>> => {\n return new Promise<GetResourceResponse<HTMLImageElement | ImageBitmap | null>>((resolve, reject) => {\n requestParameters.headers ||= {};\n requestParameters.headers.accept = 'image/webp,*/*';\n extend(requestParameters, {type: 'image'});\n const request: ImageRequestQueueItem = {\n abortController,\n requestParameters,\n supportImageRefresh,\n imageBitmapOptions,\n state: 'queued',\n onError: (error: Error) => {\n reject(error);\n },\n onSuccess: (response) => {\n resolve(response);\n }\n };\n\n imageRequestQueue.push(request);\n processQueue();\n });\n };\n\n const arrayBufferToCanvasImageSource = (data: ArrayBuffer, imageBitmapOptions?: ImageBitmapOptions): Promise<HTMLImageElement | ImageBitmap | null> => {\n const imageBitmapSupported = typeof createImageBitmap === 'function';\n if (imageBitmapSupported) {\n return arrayBufferToImageBitmap(data, imageBitmapOptions);\n } else {\n return arrayBufferToImage(data);\n }\n };\n\n const doImageRequest = async (itemInQueue: ImageRequestQueueItem) => {\n itemInQueue.state = 'running';\n const {requestParameters, supportImageRefresh, imageBitmapOptions, onError, onSuccess, abortController} = itemInQueue;\n // - If refreshExpiredTiles is false, then we can use HTMLImageElement to download raster images.\n // - Fetch/XHR (via MakeRequest API) will be used to download images for following scenarios:\n // 1. Style image sprite will had a issue with HTMLImageElement as described\n // here: https://github.com/mapbox/mapbox-gl-js/issues/1470\n // 2. If refreshExpiredTiles is true (default), then in order to read the image cache header,\n // fetch/XHR request will be required\n // - For any special case handling like use of AddProtocol, worker initiated request or additional headers\n // let makeRequest handle it.\n // - HtmlImageElement request automatically adds accept header for all the browser supported images\n const canUseHTMLImageElement = supportImageRefresh === false &&\n !imageBitmapOptions &&\n !isWorker(self) &&\n !getProtocol(requestParameters.url) &&\n (!requestParameters.headers ||\n Object.keys(requestParameters.headers).reduce((acc, item) => acc && item === 'accept', true));\n\n currentParallelImageRequests++;\n\n const getImagePromise = canUseHTMLImageElement ?\n getImageUsingHtmlImage(requestParameters, abortController) :\n makeRequest(requestParameters, abortController);\n\n try {\n const response = await getImagePromise;\n delete itemInQueue.abortController;\n itemInQueue.state = 'completed';\n if (response.data instanceof HTMLImageElement || isImageBitmap(response.data)) {\n // User using addProtocol can directly return HTMLImageElement/ImageBitmap type\n // If HtmlImageElement is used to get image then response type will be HTMLImageElement\n onSuccess(response);\n } else if (response.data) {\n const img = await arrayBufferToCanvasImageSource(response.data, imageBitmapOptions);\n onSuccess({data: img, cacheControl: response.cacheControl, expires: response.expires});\n }\n } catch (err) {\n delete itemInQueue.abortController;\n onError(ensureError(err));\n } finally {\n currentParallelImageRequests--;\n processQueue();\n }\n };\n\n /**\n * Process some number of items in the image request queue.\n */\n const processQueue = (): void => {\n\n const maxImageRequests = isThrottled() ?\n config.MAX_PARALLEL_IMAGE_REQUESTS_PER_FRAME :\n config.MAX_PARALLEL_IMAGE_REQUESTS;\n\n // limit concurrent image loads to help with raster sources performance on big screens\n for (let numImageRequests = currentParallelImageRequests;\n numImageRequests < maxImageRequests && imageRequestQueue.length > 0;\n numImageRequests++) {\n\n const topItemInQueue: ImageRequestQueueItem = imageRequestQueue.shift();\n if (topItemInQueue.abortController.signal.aborted) {\n numImageRequests--;\n continue;\n }\n doImageRequest(topItemInQueue);\n }\n };\n\n const getImageUsingHtmlImage = (requestParameters: RequestParameters, abortController: AbortController): Promise<GetResourceResponse<HTMLImageElement | ImageBitmap | null>> => {\n return new Promise<GetResourceResponse<HTMLImageElement | ImageBitmap | null>>((resolve, reject) => {\n\n const image = new Image() as HTMLImageElementWithPriority;\n const url = requestParameters.url;\n const credentials = requestParameters.credentials;\n if (credentials && credentials === 'include') {\n image.crossOrigin = 'use-credentials';\n } else if ((credentials && credentials === 'same-origin') || !sameOrigin(url)) {\n image.crossOrigin = 'anonymous';\n }\n\n abortController.signal.addEventListener('abort', () => {\n // Set src to '' to actually cancel the request\n image.src = '';\n reject(new AbortError(abortController.signal.reason));\n });\n\n image.fetchPriority = 'high';\n image.onload = () => {\n image.onerror = image.onload = null;\n resolve({data: image});\n };\n image.onerror = () => {\n image.onerror = image.onload = null;\n if (abortController.signal.aborted) {\n return;\n }\n reject(new Error('Could not load image. Please make sure to use a supported image type such as PNG or JPEG. Note that SVGs are not supported.'));\n };\n image.src = url;\n });\n };\n}\n\nImageRequest.resetRequestQueue();\n","import type {RequestParameters} from './ajax.ts';\n\n/**\n * A type of MapLibre resource.\n */\nexport const enum ResourceType {\n Glyphs = 'Glyphs',\n Image = 'Image',\n Source = 'Source',\n SpriteImage = 'SpriteImage',\n SpriteJSON = 'SpriteJSON',\n Style = 'Style',\n Tile = 'Tile',\n Unknown = 'Unknown',\n}\n\n/**\n * This function is used to transform a request.\n * It is used just before executing the relevant request.\n */\nexport type RequestTransformFunction = (url: string, resourceType?: ResourceType) => RequestParameters | Promise<RequestParameters> | undefined;\n\nexport class RequestManager {\n _transformRequestFn: RequestTransformFunction | null;\n\n constructor(transformRequestFn?: RequestTransformFunction | null) {\n this._transformRequestFn = transformRequestFn ?? null;\n }\n\n transformRequest(url: string, type: ResourceType): RequestParameters | Promise<RequestParameters> {\n if (this._transformRequestFn) {\n return this._transformRequestFn(url, type) || {url};\n }\n\n return {url};\n }\n\n setTransformRequest(transformRequest: RequestTransformFunction | null): void {\n this._transformRequestFn = transformRequest;\n }\n}\n\n","import {Event, type ErrorEvent} from '../util/evented.ts';\n\nimport {DOM} from '../util/dom.ts';\nimport Point from '@mapbox/point-geometry';\nimport {extend} from '../util/util.ts';\nimport type {MapGeoJSONFeature} from '../util/vectortile_to_geojson.ts';\n\nimport type {Map} from './map.ts';\nimport type {LngLat} from '../geo/lng_lat.ts';\nimport type {ProjectionSpecification, SourceSpecification} from '@maplibre/maplibre-gl-style-spec';\nimport type {GeoJSONSourceShouldReloadTileOptions} from '../source/geojson_source.ts';\nimport type {OverscaledTileID} from '../tile/tile_id.ts';\n\n/**\n * An event from the mouse relevant to a specific layer.\n *\n * @group Event Related\n */\nexport type MapLayerMouseEvent = MapMouseEvent & { features?: MapGeoJSONFeature[] };\n\n/**\n * An event from a touch device relevant to a specific layer.\n *\n * @group Event Related\n */\nexport type MapLayerTouchEvent = MapTouchEvent & { features?: MapGeoJSONFeature[] };\n\n/**\n * The source event data type\n */\nexport type MapSourceDataType = 'content' | 'metadata' | 'visibility' | 'idle';\n\n/**\n * `MapLayerEventType` - a mapping between the event name and the event.\n * !!! note\n * These events are compatible with the optional `layerId` parameter.\n * If `layerId` is included as the second argument in {@link Map.on}, the event listener will fire only when the\n * event action contains a visible portion of the specified layer.\n * The following example can be used for all the events.\n *\n * @group Event Related\n * @example\n * ```ts\n * // Initialize the map\n * let map = new Map({ // map options });\n * // Set an event listener for a specific layer\n * map.on('the-event-name', 'poi-label', (e) => {\n * console.log('An event has occurred on a visible portion of the poi-label layer');\n * });\n * ```\n */\nexport type MapLayerEventType = {\n /**\n * Fired when a pointing device (usually a mouse) is pressed and released contains a visible portion of the specified layer.\n *\n * @see