@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.
Files changed (565) hide show
  1. package/LICENSE.txt +116 -0
  2. package/README.md +174 -0
  3. package/build/banner.ts +12 -0
  4. package/build/bump-version-changelog.js +26 -0
  5. package/build/check-bundle-size.js +77 -0
  6. package/build/generate-dist-package.js +26 -0
  7. package/build/generate-doc-images.ts +78 -0
  8. package/build/generate-docs.ts +190 -0
  9. package/build/generate-shaders.ts +68 -0
  10. package/build/generate-struct-arrays.ts +438 -0
  11. package/build/generate-style-code.ts +283 -0
  12. package/build/readme.md +56 -0
  13. package/build/release-notes.js +45 -0
  14. package/build/rollup/bundle_prelude.js +29 -0
  15. package/build/rollup/maplibregl.js +22 -0
  16. package/build/rollup_plugins.ts +58 -0
  17. package/dist/LICENSE.txt +116 -0
  18. package/dist/maplibre-gl.css +1 -0
  19. package/dist/maplibre-gl.d.ts +13304 -0
  20. package/dist/maplibre-gl.js +59 -0
  21. package/dist/maplibre-gl.js.map +1 -0
  22. package/dist/package.json +1 -0
  23. package/package.json +192 -0
  24. package/src/css/maplibre-gl.css +854 -0
  25. package/src/css/svg/maplibregl-ctrl-attrib.svg +3 -0
  26. package/src/css/svg/maplibregl-ctrl-compass.svg +4 -0
  27. package/src/css/svg/maplibregl-ctrl-fullscreen.svg +3 -0
  28. package/src/css/svg/maplibregl-ctrl-geolocate.svg +5 -0
  29. package/src/css/svg/maplibregl-ctrl-logo.svg +11 -0
  30. package/src/css/svg/maplibregl-ctrl-shrink.svg +3 -0
  31. package/src/css/svg/maplibregl-ctrl-terrain.svg +3 -0
  32. package/src/css/svg/maplibregl-ctrl-zoom-in.svg +3 -0
  33. package/src/css/svg/maplibregl-ctrl-zoom-out.svg +3 -0
  34. package/src/data/array_types.g.ts +1130 -0
  35. package/src/data/bucket/circle_attributes.ts +8 -0
  36. package/src/data/bucket/circle_bucket.ts +197 -0
  37. package/src/data/bucket/fill_attributes.ts +8 -0
  38. package/src/data/bucket/fill_bucket.test.ts +95 -0
  39. package/src/data/bucket/fill_bucket.ts +228 -0
  40. package/src/data/bucket/fill_extrusion_attributes.ts +13 -0
  41. package/src/data/bucket/fill_extrusion_bucket.ts +305 -0
  42. package/src/data/bucket/heatmap_bucket.ts +12 -0
  43. package/src/data/bucket/line_attributes.ts +8 -0
  44. package/src/data/bucket/line_attributes_ext.ts +8 -0
  45. package/src/data/bucket/line_bucket.test.ts +142 -0
  46. package/src/data/bucket/line_bucket.ts +592 -0
  47. package/src/data/bucket/pattern_attributes.ts +9 -0
  48. package/src/data/bucket/pattern_bucket_features.ts +57 -0
  49. package/src/data/bucket/symbol_attributes.ts +122 -0
  50. package/src/data/bucket/symbol_bucket.test.ts +243 -0
  51. package/src/data/bucket/symbol_bucket.ts +975 -0
  52. package/src/data/bucket.ts +123 -0
  53. package/src/data/dem_data.test.ts +237 -0
  54. package/src/data/dem_data.ts +171 -0
  55. package/src/data/evaluation_feature.ts +18 -0
  56. package/src/data/extent.ts +13 -0
  57. package/src/data/feature_index.ts +337 -0
  58. package/src/data/feature_position_map.test.ts +33 -0
  59. package/src/data/feature_position_map.ts +126 -0
  60. package/src/data/index_array_type.ts +9 -0
  61. package/src/data/load_geometry.test.ts +49 -0
  62. package/src/data/load_geometry.ts +44 -0
  63. package/src/data/pos3d_attributes.ts +5 -0
  64. package/src/data/pos_attributes.ts +5 -0
  65. package/src/data/program_configuration.ts +735 -0
  66. package/src/data/raster_bounds_attributes.ts +6 -0
  67. package/src/data/segment.ts +89 -0
  68. package/src/geo/edge_insets.test.ts +83 -0
  69. package/src/geo/edge_insets.ts +146 -0
  70. package/src/geo/lng_lat.test.ts +65 -0
  71. package/src/geo/lng_lat.ts +169 -0
  72. package/src/geo/lng_lat_bounds.test.ts +357 -0
  73. package/src/geo/lng_lat_bounds.ts +356 -0
  74. package/src/geo/mercator_coordinate.test.ts +34 -0
  75. package/src/geo/mercator_coordinate.ts +157 -0
  76. package/src/geo/projection/projection.ts +72 -0
  77. package/src/geo/transform.test.ts +509 -0
  78. package/src/geo/transform.ts +1072 -0
  79. package/src/gl/color_mode.ts +31 -0
  80. package/src/gl/context.ts +321 -0
  81. package/src/gl/cull_face_mode.ts +22 -0
  82. package/src/gl/depth_mode.ts +26 -0
  83. package/src/gl/framebuffer.ts +48 -0
  84. package/src/gl/index_buffer.ts +55 -0
  85. package/src/gl/render_pool.test.ts +69 -0
  86. package/src/gl/render_pool.ts +93 -0
  87. package/src/gl/state.test.ts +125 -0
  88. package/src/gl/stencil_mode.ts +27 -0
  89. package/src/gl/types.ts +59 -0
  90. package/src/gl/value.ts +534 -0
  91. package/src/gl/vertex_buffer.test.ts +57 -0
  92. package/src/gl/vertex_buffer.ts +111 -0
  93. package/src/gl/webgl2.ts +12 -0
  94. package/src/index.test.ts +121 -0
  95. package/src/index.ts +250 -0
  96. package/src/render/draw_background.ts +53 -0
  97. package/src/render/draw_circle.ts +113 -0
  98. package/src/render/draw_collision_debug.ts +168 -0
  99. package/src/render/draw_custom.test.ts +73 -0
  100. package/src/render/draw_custom.ts +45 -0
  101. package/src/render/draw_debug.test.ts +122 -0
  102. package/src/render/draw_debug.ts +148 -0
  103. package/src/render/draw_fill.test.ts +137 -0
  104. package/src/render/draw_fill.ts +128 -0
  105. package/src/render/draw_fill_extrusion.ts +97 -0
  106. package/src/render/draw_heatmap.ts +228 -0
  107. package/src/render/draw_hillshade.ts +119 -0
  108. package/src/render/draw_line.ts +125 -0
  109. package/src/render/draw_raster.ts +133 -0
  110. package/src/render/draw_sky.ts +44 -0
  111. package/src/render/draw_symbol.test.ts +223 -0
  112. package/src/render/draw_symbol.ts +499 -0
  113. package/src/render/draw_terrain.ts +99 -0
  114. package/src/render/glyph_atlas.ts +83 -0
  115. package/src/render/glyph_manager.test.ts +147 -0
  116. package/src/render/glyph_manager.ts +198 -0
  117. package/src/render/image_atlas.ts +159 -0
  118. package/src/render/image_manager.ts +337 -0
  119. package/src/render/line_atlas.test.ts +38 -0
  120. package/src/render/line_atlas.ts +214 -0
  121. package/src/render/mesh.ts +25 -0
  122. package/src/render/painter.test.ts +51 -0
  123. package/src/render/painter.ts +666 -0
  124. package/src/render/program/background_program.ts +100 -0
  125. package/src/render/program/circle_program.ts +61 -0
  126. package/src/render/program/clipping_mask_program.ts +19 -0
  127. package/src/render/program/collision_program.ts +47 -0
  128. package/src/render/program/debug_program.ts +29 -0
  129. package/src/render/program/fill_extrusion_program.ts +120 -0
  130. package/src/render/program/fill_program.ts +121 -0
  131. package/src/render/program/heatmap_program.ts +76 -0
  132. package/src/render/program/hillshade_program.ts +116 -0
  133. package/src/render/program/line_program.ts +207 -0
  134. package/src/render/program/pattern.ts +102 -0
  135. package/src/render/program/program_uniforms.ts +46 -0
  136. package/src/render/program/raster_program.ts +88 -0
  137. package/src/render/program/sky_program.ts +28 -0
  138. package/src/render/program/symbol_program.ts +266 -0
  139. package/src/render/program/terrain_program.ts +116 -0
  140. package/src/render/program.ts +233 -0
  141. package/src/render/render_to_texture.test.ts +151 -0
  142. package/src/render/render_to_texture.ts +197 -0
  143. package/src/render/terrain.test.ts +322 -0
  144. package/src/render/terrain.ts +464 -0
  145. package/src/render/texture.ts +114 -0
  146. package/src/render/uniform_binding.test.ts +122 -0
  147. package/src/render/uniform_binding.ts +157 -0
  148. package/src/render/update_pattern_positions_in_program.test.ts +74 -0
  149. package/src/render/update_pattern_positions_in_program.ts +50 -0
  150. package/src/render/vertex_array_object.ts +163 -0
  151. package/src/shaders/README.md +42 -0
  152. package/src/shaders/_prelude.fragment.glsl +19 -0
  153. package/src/shaders/_prelude.fragment.glsl.g.ts +2 -0
  154. package/src/shaders/_prelude.vertex.glsl +148 -0
  155. package/src/shaders/_prelude.vertex.glsl.g.ts +2 -0
  156. package/src/shaders/background.fragment.glsl +10 -0
  157. package/src/shaders/background.fragment.glsl.g.ts +2 -0
  158. package/src/shaders/background.vertex.glsl +7 -0
  159. package/src/shaders/background.vertex.glsl.g.ts +2 -0
  160. package/src/shaders/background_pattern.fragment.glsl +28 -0
  161. package/src/shaders/background_pattern.fragment.glsl.g.ts +2 -0
  162. package/src/shaders/background_pattern.vertex.glsl +19 -0
  163. package/src/shaders/background_pattern.vertex.glsl.g.ts +2 -0
  164. package/src/shaders/circle.fragment.glsl +34 -0
  165. package/src/shaders/circle.fragment.glsl.g.ts +2 -0
  166. package/src/shaders/circle.vertex.glsl +68 -0
  167. package/src/shaders/circle.vertex.glsl.g.ts +2 -0
  168. package/src/shaders/clipping_mask.fragment.glsl +3 -0
  169. package/src/shaders/clipping_mask.fragment.glsl.g.ts +2 -0
  170. package/src/shaders/clipping_mask.vertex.glsl +7 -0
  171. package/src/shaders/clipping_mask.vertex.glsl.g.ts +2 -0
  172. package/src/shaders/collision_box.fragment.glsl +20 -0
  173. package/src/shaders/collision_box.fragment.glsl.g.ts +2 -0
  174. package/src/shaders/collision_box.vertex.glsl +27 -0
  175. package/src/shaders/collision_box.vertex.glsl.g.ts +2 -0
  176. package/src/shaders/collision_circle.fragment.glsl +17 -0
  177. package/src/shaders/collision_circle.fragment.glsl.g.ts +2 -0
  178. package/src/shaders/collision_circle.vertex.glsl +59 -0
  179. package/src/shaders/collision_circle.vertex.glsl.g.ts +2 -0
  180. package/src/shaders/debug.fragment.glsl +9 -0
  181. package/src/shaders/debug.fragment.glsl.g.ts +2 -0
  182. package/src/shaders/debug.vertex.glsl +12 -0
  183. package/src/shaders/debug.vertex.glsl.g.ts +2 -0
  184. package/src/shaders/encode_attribute.test.ts +11 -0
  185. package/src/shaders/encode_attribute.ts +13 -0
  186. package/src/shaders/fill.fragment.glsl +13 -0
  187. package/src/shaders/fill.fragment.glsl.g.ts +2 -0
  188. package/src/shaders/fill.vertex.glsl +13 -0
  189. package/src/shaders/fill.vertex.glsl.g.ts +2 -0
  190. package/src/shaders/fill_extrusion.fragment.glsl +9 -0
  191. package/src/shaders/fill_extrusion.fragment.glsl.g.ts +2 -0
  192. package/src/shaders/fill_extrusion.vertex.glsl +84 -0
  193. package/src/shaders/fill_extrusion.vertex.glsl.g.ts +2 -0
  194. package/src/shaders/fill_extrusion_pattern.fragment.glsl +47 -0
  195. package/src/shaders/fill_extrusion_pattern.fragment.glsl.g.ts +2 -0
  196. package/src/shaders/fill_extrusion_pattern.vertex.glsl +96 -0
  197. package/src/shaders/fill_extrusion_pattern.vertex.glsl.g.ts +2 -0
  198. package/src/shaders/fill_outline.fragment.glsl +17 -0
  199. package/src/shaders/fill_outline.fragment.glsl.g.ts +2 -0
  200. package/src/shaders/fill_outline.vertex.glsl +17 -0
  201. package/src/shaders/fill_outline.vertex.glsl.g.ts +2 -0
  202. package/src/shaders/fill_outline_pattern.fragment.glsl +43 -0
  203. package/src/shaders/fill_outline_pattern.fragment.glsl.g.ts +2 -0
  204. package/src/shaders/fill_outline_pattern.vertex.glsl +44 -0
  205. package/src/shaders/fill_outline_pattern.vertex.glsl.g.ts +2 -0
  206. package/src/shaders/fill_pattern.fragment.glsl +39 -0
  207. package/src/shaders/fill_pattern.fragment.glsl.g.ts +2 -0
  208. package/src/shaders/fill_pattern.vertex.glsl +39 -0
  209. package/src/shaders/fill_pattern.vertex.glsl.g.ts +2 -0
  210. package/src/shaders/heatmap.fragment.glsl +22 -0
  211. package/src/shaders/heatmap.fragment.glsl.g.ts +2 -0
  212. package/src/shaders/heatmap.vertex.glsl +54 -0
  213. package/src/shaders/heatmap.vertex.glsl.g.ts +2 -0
  214. package/src/shaders/heatmap_texture.fragment.glsl +15 -0
  215. package/src/shaders/heatmap_texture.fragment.glsl.g.ts +2 -0
  216. package/src/shaders/heatmap_texture.vertex.glsl +11 -0
  217. package/src/shaders/heatmap_texture.vertex.glsl.g.ts +2 -0
  218. package/src/shaders/hillshade.fragment.glsl +52 -0
  219. package/src/shaders/hillshade.fragment.glsl.g.ts +2 -0
  220. package/src/shaders/hillshade.vertex.glsl +11 -0
  221. package/src/shaders/hillshade.vertex.glsl.g.ts +2 -0
  222. package/src/shaders/hillshade_prepare.fragment.glsl +77 -0
  223. package/src/shaders/hillshade_prepare.fragment.glsl.g.ts +2 -0
  224. package/src/shaders/hillshade_prepare.vertex.glsl +15 -0
  225. package/src/shaders/hillshade_prepare.vertex.glsl.g.ts +2 -0
  226. package/src/shaders/line.fragment.glsl +30 -0
  227. package/src/shaders/line.fragment.glsl.g.ts +2 -0
  228. package/src/shaders/line.vertex.glsl +89 -0
  229. package/src/shaders/line.vertex.glsl.g.ts +2 -0
  230. package/src/shaders/line_gradient.fragment.glsl +34 -0
  231. package/src/shaders/line_gradient.fragment.glsl.g.ts +2 -0
  232. package/src/shaders/line_gradient.vertex.glsl +92 -0
  233. package/src/shaders/line_gradient.vertex.glsl.g.ts +2 -0
  234. package/src/shaders/line_pattern.fragment.glsl +77 -0
  235. package/src/shaders/line_pattern.fragment.glsl.g.ts +2 -0
  236. package/src/shaders/line_pattern.vertex.glsl +103 -0
  237. package/src/shaders/line_pattern.vertex.glsl.g.ts +2 -0
  238. package/src/shaders/line_sdf.fragment.glsl +45 -0
  239. package/src/shaders/line_sdf.fragment.glsl.g.ts +2 -0
  240. package/src/shaders/line_sdf.vertex.glsl +101 -0
  241. package/src/shaders/line_sdf.vertex.glsl.g.ts +2 -0
  242. package/src/shaders/raster.fragment.glsl +53 -0
  243. package/src/shaders/raster.fragment.glsl.g.ts +2 -0
  244. package/src/shaders/raster.vertex.glsl +21 -0
  245. package/src/shaders/raster.vertex.glsl.g.ts +2 -0
  246. package/src/shaders/shaders.ts +197 -0
  247. package/src/shaders/sky.fragment.glsl +17 -0
  248. package/src/shaders/sky.fragment.glsl.g.ts +2 -0
  249. package/src/shaders/sky.vertex.glsl +5 -0
  250. package/src/shaders/sky.vertex.glsl.g.ts +2 -0
  251. package/src/shaders/symbol_icon.fragment.glsl +17 -0
  252. package/src/shaders/symbol_icon.fragment.glsl.g.ts +2 -0
  253. package/src/shaders/symbol_icon.vertex.glsl +117 -0
  254. package/src/shaders/symbol_icon.vertex.glsl.g.ts +2 -0
  255. package/src/shaders/symbol_sdf.fragment.glsl +58 -0
  256. package/src/shaders/symbol_sdf.fragment.glsl.g.ts +2 -0
  257. package/src/shaders/symbol_sdf.vertex.glsl +142 -0
  258. package/src/shaders/symbol_sdf.vertex.glsl.g.ts +2 -0
  259. package/src/shaders/symbol_text_and_icon.fragment.glsl +68 -0
  260. package/src/shaders/symbol_text_and_icon.fragment.glsl.g.ts +2 -0
  261. package/src/shaders/symbol_text_and_icon.vertex.glsl +140 -0
  262. package/src/shaders/symbol_text_and_icon.vertex.glsl.g.ts +2 -0
  263. package/src/shaders/terrain.fragment.glsl +32 -0
  264. package/src/shaders/terrain.fragment.glsl.g.ts +2 -0
  265. package/src/shaders/terrain.vertex.glsl +17 -0
  266. package/src/shaders/terrain.vertex.glsl.g.ts +2 -0
  267. package/src/shaders/terrain_coords.fragment.glsl +11 -0
  268. package/src/shaders/terrain_coords.fragment.glsl.g.ts +2 -0
  269. package/src/shaders/terrain_coords.vertex.glsl +13 -0
  270. package/src/shaders/terrain_coords.vertex.glsl.g.ts +2 -0
  271. package/src/shaders/terrain_depth.fragment.glsl +15 -0
  272. package/src/shaders/terrain_depth.fragment.glsl.g.ts +2 -0
  273. package/src/shaders/terrain_depth.vertex.glsl +13 -0
  274. package/src/shaders/terrain_depth.vertex.glsl.g.ts +2 -0
  275. package/src/source/canvas_source.test.ts +210 -0
  276. package/src/source/canvas_source.ts +227 -0
  277. package/src/source/geojson_source.test.ts +492 -0
  278. package/src/source/geojson_source.ts +431 -0
  279. package/src/source/geojson_source_diff.test.ts +364 -0
  280. package/src/source/geojson_source_diff.ts +172 -0
  281. package/src/source/geojson_worker_source.test.ts +399 -0
  282. package/src/source/geojson_worker_source.ts +303 -0
  283. package/src/source/geojson_wrapper.test.ts +32 -0
  284. package/src/source/geojson_wrapper.ts +81 -0
  285. package/src/source/image_source.test.ts +235 -0
  286. package/src/source/image_source.ts +338 -0
  287. package/src/source/load_tilejson.ts +47 -0
  288. package/src/source/pixels_to_tile_units.ts +25 -0
  289. package/src/source/protocol_crud.ts +48 -0
  290. package/src/source/query_features.test.ts +31 -0
  291. package/src/source/query_features.ts +252 -0
  292. package/src/source/raster_dem_tile_source.test.ts +158 -0
  293. package/src/source/raster_dem_tile_source.ts +166 -0
  294. package/src/source/raster_dem_tile_worker_source.test.ts +36 -0
  295. package/src/source/raster_dem_tile_worker_source.ts +38 -0
  296. package/src/source/raster_tile_source.test.ts +206 -0
  297. package/src/source/raster_tile_source.ts +227 -0
  298. package/src/source/rtl_text_plugin_main_thread.test.ts +170 -0
  299. package/src/source/rtl_text_plugin_main_thread.ts +89 -0
  300. package/src/source/rtl_text_plugin_status.ts +33 -0
  301. package/src/source/rtl_text_plugin_worker.ts +49 -0
  302. package/src/source/source.test.ts +41 -0
  303. package/src/source/source.ts +186 -0
  304. package/src/source/source_cache.test.ts +2069 -0
  305. package/src/source/source_cache.ts +1102 -0
  306. package/src/source/source_state.ts +157 -0
  307. package/src/source/terrain_source_cache.test.ts +105 -0
  308. package/src/source/terrain_source_cache.ts +204 -0
  309. package/src/source/tile.test.ts +290 -0
  310. package/src/source/tile.ts +478 -0
  311. package/src/source/tile_bounds.ts +34 -0
  312. package/src/source/tile_cache.test.ts +130 -0
  313. package/src/source/tile_cache.ts +208 -0
  314. package/src/source/tile_id.test.ts +112 -0
  315. package/src/source/tile_id.ts +221 -0
  316. package/src/source/vector_tile_source.test.ts +401 -0
  317. package/src/source/vector_tile_source.ts +283 -0
  318. package/src/source/vector_tile_worker_source.test.ts +396 -0
  319. package/src/source/vector_tile_worker_source.ts +199 -0
  320. package/src/source/video_source.test.ts +124 -0
  321. package/src/source/video_source.ts +204 -0
  322. package/src/source/worker.test.ts +233 -0
  323. package/src/source/worker.ts +301 -0
  324. package/src/source/worker_source.ts +117 -0
  325. package/src/source/worker_tile.test.ts +226 -0
  326. package/src/source/worker_tile.ts +208 -0
  327. package/src/style/create_style_layer.ts +39 -0
  328. package/src/style/evaluation_parameters.ts +62 -0
  329. package/src/style/format_section_override.test.ts +62 -0
  330. package/src/style/format_section_override.ts +50 -0
  331. package/src/style/light.test.ts +86 -0
  332. package/src/style/light.ts +135 -0
  333. package/src/style/load_glyph_range.test.ts +40 -0
  334. package/src/style/load_glyph_range.ts +32 -0
  335. package/src/style/load_sprite.test.ts +227 -0
  336. package/src/style/load_sprite.ts +71 -0
  337. package/src/style/parse_glyph_pbf.ts +42 -0
  338. package/src/style/pauseable_placement.ts +138 -0
  339. package/src/style/properties.ts +726 -0
  340. package/src/style/query_utils.test.ts +107 -0
  341. package/src/style/query_utils.ts +70 -0
  342. package/src/style/sky.ts +127 -0
  343. package/src/style/style.test.ts +2654 -0
  344. package/src/style/style.ts +1814 -0
  345. package/src/style/style_glyph.ts +25 -0
  346. package/src/style/style_image.ts +188 -0
  347. package/src/style/style_layer/background_style_layer.ts +17 -0
  348. package/src/style/style_layer/background_style_layer_properties.g.ts +40 -0
  349. package/src/style/style_layer/circle_style_layer.ts +98 -0
  350. package/src/style/style_layer/circle_style_layer_properties.g.ts +76 -0
  351. package/src/style/style_layer/custom_style_layer.ts +233 -0
  352. package/src/style/style_layer/fill_extrusion_style_layer.ts +224 -0
  353. package/src/style/style_layer/fill_extrusion_style_layer_properties.g.ts +55 -0
  354. package/src/style/style_layer/fill_style_layer.test.ts +37 -0
  355. package/src/style/style_layer/fill_style_layer.ts +65 -0
  356. package/src/style/style_layer/fill_style_layer_properties.g.ts +64 -0
  357. package/src/style/style_layer/heatmap_style_layer.ts +74 -0
  358. package/src/style/style_layer/heatmap_style_layer_properties.g.ts +46 -0
  359. package/src/style/style_layer/hillshade_style_layer.ts +21 -0
  360. package/src/style/style_layer/hillshade_style_layer_properties.g.ts +49 -0
  361. package/src/style/style_layer/line_style_layer.test.ts +50 -0
  362. package/src/style/style_layer/line_style_layer.ts +131 -0
  363. package/src/style/style_layer/line_style_layer_properties.g.ts +88 -0
  364. package/src/style/style_layer/overlap_mode.test.ts +57 -0
  365. package/src/style/style_layer/overlap_mode.ts +25 -0
  366. package/src/style/style_layer/raster_style_layer.ts +17 -0
  367. package/src/style/style_layer/raster_style_layer_properties.g.ts +55 -0
  368. package/src/style/style_layer/symbol_style_layer.ts +195 -0
  369. package/src/style/style_layer/symbol_style_layer_properties.g.ts +218 -0
  370. package/src/style/style_layer/typed_style_layer.ts +9 -0
  371. package/src/style/style_layer/variable_text_anchor.test.ts +117 -0
  372. package/src/style/style_layer/variable_text_anchor.ts +163 -0
  373. package/src/style/style_layer.test.ts +372 -0
  374. package/src/style/style_layer.ts +287 -0
  375. package/src/style/style_layer_index.test.ts +99 -0
  376. package/src/style/style_layer_index.ts +78 -0
  377. package/src/style/validate_style.ts +53 -0
  378. package/src/style/zoom_history.ts +40 -0
  379. package/src/symbol/anchor.test.ts +14 -0
  380. package/src/symbol/anchor.ts +22 -0
  381. package/src/symbol/check_max_angle.test.ts +54 -0
  382. package/src/symbol/check_max_angle.ts +76 -0
  383. package/src/symbol/clip_line.test.ts +154 -0
  384. package/src/symbol/clip_line.ts +66 -0
  385. package/src/symbol/collision_feature.test.ts +98 -0
  386. package/src/symbol/collision_feature.ts +114 -0
  387. package/src/symbol/collision_index.test.ts +19 -0
  388. package/src/symbol/collision_index.ts +618 -0
  389. package/src/symbol/cross_tile_symbol_index.test.ts +260 -0
  390. package/src/symbol/cross_tile_symbol_index.ts +367 -0
  391. package/src/symbol/get_anchors.test.ts +113 -0
  392. package/src/symbol/get_anchors.ts +167 -0
  393. package/src/symbol/grid_index.test.ts +75 -0
  394. package/src/symbol/grid_index.ts +414 -0
  395. package/src/symbol/merge_lines.test.ts +30 -0
  396. package/src/symbol/merge_lines.ts +80 -0
  397. package/src/symbol/one_em.ts +3 -0
  398. package/src/symbol/opacity_state.ts +23 -0
  399. package/src/symbol/path_interpolator.test.ts +134 -0
  400. package/src/symbol/path_interpolator.ts +55 -0
  401. package/src/symbol/placement.ts +1371 -0
  402. package/src/symbol/projection.test.ts +171 -0
  403. package/src/symbol/projection.ts +833 -0
  404. package/src/symbol/quads.test.ts +157 -0
  405. package/src/symbol/quads.ts +349 -0
  406. package/src/symbol/shaping.test.ts +360 -0
  407. package/src/symbol/shaping.ts +911 -0
  408. package/src/symbol/symbol_layout.ts +739 -0
  409. package/src/symbol/symbol_size.ts +129 -0
  410. package/src/symbol/symbol_style_layer.test.ts +103 -0
  411. package/src/symbol/transform_text.ts +27 -0
  412. package/src/ui/anchor.ts +27 -0
  413. package/src/ui/camera.test.ts +2301 -0
  414. package/src/ui/camera.ts +1520 -0
  415. package/src/ui/control/attribution_control.test.ts +543 -0
  416. package/src/ui/control/attribution_control.ts +209 -0
  417. package/src/ui/control/control.ts +67 -0
  418. package/src/ui/control/fullscreen_control.test.ts +114 -0
  419. package/src/ui/control/fullscreen_control.ts +189 -0
  420. package/src/ui/control/geolocate_control.test.ts +619 -0
  421. package/src/ui/control/geolocate_control.ts +725 -0
  422. package/src/ui/control/logo_control.test.ts +88 -0
  423. package/src/ui/control/logo_control.ts +86 -0
  424. package/src/ui/control/navigation_control.test.ts +238 -0
  425. package/src/ui/control/navigation_control.ts +294 -0
  426. package/src/ui/control/scale_control.test.ts +52 -0
  427. package/src/ui/control/scale_control.ts +152 -0
  428. package/src/ui/control/terrain_control.test.ts +58 -0
  429. package/src/ui/control/terrain_control.ts +74 -0
  430. package/src/ui/default_locale.ts +25 -0
  431. package/src/ui/events.ts +758 -0
  432. package/src/ui/handler/box_zoom.test.ts +163 -0
  433. package/src/ui/handler/box_zoom.ts +171 -0
  434. package/src/ui/handler/click_zoom.ts +55 -0
  435. package/src/ui/handler/cooperative_gestures.test.ts +338 -0
  436. package/src/ui/handler/cooperative_gestures.ts +111 -0
  437. package/src/ui/handler/dblclick_zoom.test.ts +151 -0
  438. package/src/ui/handler/drag_handler.ts +174 -0
  439. package/src/ui/handler/drag_move_state_manager.ts +115 -0
  440. package/src/ui/handler/drag_pan.test.ts +487 -0
  441. package/src/ui/handler/drag_rotate.test.ts +859 -0
  442. package/src/ui/handler/handler_util.ts +10 -0
  443. package/src/ui/handler/keyboard.test.ts +235 -0
  444. package/src/ui/handler/keyboard.ts +212 -0
  445. package/src/ui/handler/map_event.test.ts +158 -0
  446. package/src/ui/handler/map_event.ts +161 -0
  447. package/src/ui/handler/mouse.ts +92 -0
  448. package/src/ui/handler/mouse_handler_interface.test.ts +111 -0
  449. package/src/ui/handler/mouse_rotate.test.ts +62 -0
  450. package/src/ui/handler/one_finger_touch_drag.ts +45 -0
  451. package/src/ui/handler/one_finger_touch_drag_handler_interface.test.ts +77 -0
  452. package/src/ui/handler/scroll_zoom.test.ts +382 -0
  453. package/src/ui/handler/scroll_zoom.ts +379 -0
  454. package/src/ui/handler/shim/dblclick_zoom.ts +64 -0
  455. package/src/ui/handler/shim/drag_pan.ts +104 -0
  456. package/src/ui/handler/shim/drag_rotate.ts +76 -0
  457. package/src/ui/handler/shim/two_fingers_touch.ts +112 -0
  458. package/src/ui/handler/tap_drag_zoom.test.ts +113 -0
  459. package/src/ui/handler/tap_drag_zoom.ts +112 -0
  460. package/src/ui/handler/tap_recognizer.ts +138 -0
  461. package/src/ui/handler/tap_zoom.ts +98 -0
  462. package/src/ui/handler/touch_pan.ts +115 -0
  463. package/src/ui/handler/transform-provider.ts +44 -0
  464. package/src/ui/handler/two_fingers_touch.test.ts +283 -0
  465. package/src/ui/handler/two_fingers_touch.ts +336 -0
  466. package/src/ui/handler_inertia.ts +157 -0
  467. package/src/ui/handler_manager.ts +637 -0
  468. package/src/ui/hash.test.ts +404 -0
  469. package/src/ui/hash.ts +153 -0
  470. package/src/ui/map.ts +3393 -0
  471. package/src/ui/map_tests/map_animation.test.ts +61 -0
  472. package/src/ui/map_tests/map_basic.test.ts +223 -0
  473. package/src/ui/map_tests/map_bounds.test.ts +123 -0
  474. package/src/ui/map_tests/map_calculate_camera_options.test.ts +113 -0
  475. package/src/ui/map_tests/map_canvas.test.ts +59 -0
  476. package/src/ui/map_tests/map_control.test.ts +61 -0
  477. package/src/ui/map_tests/map_disable_handlers.test.ts +38 -0
  478. package/src/ui/map_tests/map_events.test.ts +1001 -0
  479. package/src/ui/map_tests/map_feature_state.test.ts +421 -0
  480. package/src/ui/map_tests/map_images.test.ts +175 -0
  481. package/src/ui/map_tests/map_is_moving.test.ts +164 -0
  482. package/src/ui/map_tests/map_is_rotating.test.ts +62 -0
  483. package/src/ui/map_tests/map_is_zooming.test.ts +86 -0
  484. package/src/ui/map_tests/map_layer.test.ts +457 -0
  485. package/src/ui/map_tests/map_options.test.ts +64 -0
  486. package/src/ui/map_tests/map_pitch.test.ts +90 -0
  487. package/src/ui/map_tests/map_pixel_ratio.test.ts +75 -0
  488. package/src/ui/map_tests/map_query_rendered_features.test.ts +93 -0
  489. package/src/ui/map_tests/map_render.test.ts +90 -0
  490. package/src/ui/map_tests/map_request_render_frame.test.ts +51 -0
  491. package/src/ui/map_tests/map_resize.test.ts +120 -0
  492. package/src/ui/map_tests/map_style.test.ts +541 -0
  493. package/src/ui/map_tests/map_terrian.test.ts +104 -0
  494. package/src/ui/map_tests/map_webgl.test.ts +72 -0
  495. package/src/ui/map_tests/map_world_copies.test.ts +103 -0
  496. package/src/ui/map_tests/map_zoom.test.ts +95 -0
  497. package/src/ui/marker.test.ts +1149 -0
  498. package/src/ui/marker.ts +880 -0
  499. package/src/ui/popup.test.ts +827 -0
  500. package/src/ui/popup.ts +717 -0
  501. package/src/util/abort_error.ts +21 -0
  502. package/src/util/actor.test.ts +218 -0
  503. package/src/util/actor.ts +241 -0
  504. package/src/util/actor_messages.ts +149 -0
  505. package/src/util/ajax.test.ts +237 -0
  506. package/src/util/ajax.ts +297 -0
  507. package/src/util/browser.test.ts +23 -0
  508. package/src/util/browser.ts +63 -0
  509. package/src/util/color_ramp.test.ts +105 -0
  510. package/src/util/color_ramp.ts +56 -0
  511. package/src/util/config.ts +29 -0
  512. package/src/util/dictionary_coder.ts +23 -0
  513. package/src/util/dispatcher.test.ts +76 -0
  514. package/src/util/dispatcher.ts +78 -0
  515. package/src/util/dom.ts +135 -0
  516. package/src/util/evented.test.ts +231 -0
  517. package/src/util/evented.ts +178 -0
  518. package/src/util/find_pole_of_inaccessibility.test.ts +21 -0
  519. package/src/util/find_pole_of_inaccessibility.ts +130 -0
  520. package/src/util/geolocation_support.test.ts +43 -0
  521. package/src/util/geolocation_support.ts +23 -0
  522. package/src/util/global_worker_pool.ts +65 -0
  523. package/src/util/image.ts +150 -0
  524. package/src/util/image_request.test.ts +408 -0
  525. package/src/util/image_request.ts +246 -0
  526. package/src/util/intersection_tests.ts +206 -0
  527. package/src/util/is_char_in_unicode_block.test.ts +15 -0
  528. package/src/util/is_char_in_unicode_block.ts +345 -0
  529. package/src/util/offscreen_canvas_distorted.test.ts +13 -0
  530. package/src/util/offscreen_canvas_distorted.ts +39 -0
  531. package/src/util/offscreen_canvas_supported.ts +11 -0
  532. package/src/util/performance.ts +117 -0
  533. package/src/util/primitives.test.ts +140 -0
  534. package/src/util/primitives.ts +143 -0
  535. package/src/util/request_manager.ts +42 -0
  536. package/src/util/resolve_tokens.test.ts +45 -0
  537. package/src/util/resolve_tokens.ts +17 -0
  538. package/src/util/script_detection.test.ts +138 -0
  539. package/src/util/script_detection.ts +376 -0
  540. package/src/util/smart_wrap.test.ts +97 -0
  541. package/src/util/smart_wrap.ts +58 -0
  542. package/src/util/struct_array.test.ts +101 -0
  543. package/src/util/struct_array.ts +246 -0
  544. package/src/util/style.test.ts +34 -0
  545. package/src/util/style.ts +28 -0
  546. package/src/util/task_queue.test.ts +114 -0
  547. package/src/util/task_queue.ts +64 -0
  548. package/src/util/test/util.ts +185 -0
  549. package/src/util/throttle.test.ts +42 -0
  550. package/src/util/throttle.ts +28 -0
  551. package/src/util/throttled_invoker.ts +41 -0
  552. package/src/util/transferable_grid_index.test.ts +56 -0
  553. package/src/util/transferable_grid_index.ts +214 -0
  554. package/src/util/util.test.ts +414 -0
  555. package/src/util/util.ts +724 -0
  556. package/src/util/vectortile_to_geojson.ts +72 -0
  557. package/src/util/verticalize_punctuation.ts +110 -0
  558. package/src/util/web_worker.ts +16 -0
  559. package/src/util/web_worker_transfer.test.ts +153 -0
  560. package/src/util/web_worker_transfer.ts +254 -0
  561. package/src/util/webp_supported.ts +63 -0
  562. package/src/util/worker_pool.test.ts +43 -0
  563. package/src/util/worker_pool.ts +58 -0
  564. package/src/util/world_bounds.test.ts +59 -0
  565. 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
+ }