mapbox-gl 1.13.2

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 (460) hide show
  1. package/.flowconfig +61 -0
  2. package/CHANGELOG.md +2485 -0
  3. package/LICENSE.txt +84 -0
  4. package/README.md +34 -0
  5. package/build/banner.js +4 -0
  6. package/build/check-bundle-size.js +140 -0
  7. package/build/diff-tarball.js +18 -0
  8. package/build/generate-access-token-script.js +11 -0
  9. package/build/generate-flow-typed-style-spec.js +188 -0
  10. package/build/generate-release-list.js +21 -0
  11. package/build/generate-struct-arrays.js +243 -0
  12. package/build/generate-style-code.js +159 -0
  13. package/build/mapbox-gl.js.flow +3 -0
  14. package/build/print-release-url.js +6 -0
  15. package/build/rollup_plugin_minify_style_spec.js +24 -0
  16. package/build/rollup_plugins.js +80 -0
  17. package/build/run-node +3 -0
  18. package/build/run-tap +8 -0
  19. package/build/test/build-tape.js +19 -0
  20. package/dist/mapbox-gl-csp-worker.js +2 -0
  21. package/dist/mapbox-gl-csp-worker.js.map +1 -0
  22. package/dist/mapbox-gl-csp.js +2 -0
  23. package/dist/mapbox-gl-csp.js.map +1 -0
  24. package/dist/mapbox-gl-dev.js +65889 -0
  25. package/dist/mapbox-gl-dev.js.flow +3 -0
  26. package/dist/mapbox-gl-unminified.js +42889 -0
  27. package/dist/mapbox-gl-unminified.js.map +1 -0
  28. package/dist/mapbox-gl.css +1 -0
  29. package/dist/mapbox-gl.js +42 -0
  30. package/dist/mapbox-gl.js.flow +3 -0
  31. package/dist/mapbox-gl.js.map +1 -0
  32. package/dist/style-spec/index.es.js +15032 -0
  33. package/dist/style-spec/index.es.js.map +1 -0
  34. package/dist/style-spec/index.js +15058 -0
  35. package/dist/style-spec/index.js.map +1 -0
  36. package/flow-typed/gl.js +5 -0
  37. package/flow-typed/jsdom.js +18 -0
  38. package/flow-typed/mapbox-gl-supported.js +9 -0
  39. package/flow-typed/mapbox-unitbezier.js +14 -0
  40. package/flow-typed/offscreen-canvas.js +9 -0
  41. package/flow-typed/pbf.js +25 -0
  42. package/flow-typed/point-geometry.js +44 -0
  43. package/flow-typed/potpack.js +12 -0
  44. package/flow-typed/sinon.js +28 -0
  45. package/flow-typed/vector-tile.js +41 -0
  46. package/package.json +173 -0
  47. package/src/css/mapbox-gl.css +812 -0
  48. package/src/css/svg/mapboxgl-ctrl-attrib.svg +3 -0
  49. package/src/css/svg/mapboxgl-ctrl-compass.svg +4 -0
  50. package/src/css/svg/mapboxgl-ctrl-fullscreen.svg +3 -0
  51. package/src/css/svg/mapboxgl-ctrl-geolocate.svg +5 -0
  52. package/src/css/svg/mapboxgl-ctrl-logo.svg +20 -0
  53. package/src/css/svg/mapboxgl-ctrl-shrink.svg +3 -0
  54. package/src/css/svg/mapboxgl-ctrl-zoom-in.svg +3 -0
  55. package/src/css/svg/mapboxgl-ctrl-zoom-out.svg +3 -0
  56. package/src/data/array_types.js +1135 -0
  57. package/src/data/bucket/circle_attributes.js +9 -0
  58. package/src/data/bucket/circle_bucket.js +201 -0
  59. package/src/data/bucket/fill_attributes.js +9 -0
  60. package/src/data/bucket/fill_bucket.js +229 -0
  61. package/src/data/bucket/fill_extrusion_attributes.js +10 -0
  62. package/src/data/bucket/fill_extrusion_bucket.js +283 -0
  63. package/src/data/bucket/heatmap_bucket.js +17 -0
  64. package/src/data/bucket/line_attributes.js +10 -0
  65. package/src/data/bucket/line_attributes_ext.js +10 -0
  66. package/src/data/bucket/line_bucket.js +594 -0
  67. package/src/data/bucket/pattern_attributes.js +12 -0
  68. package/src/data/bucket/pattern_bucket_features.js +60 -0
  69. package/src/data/bucket/symbol_attributes.js +117 -0
  70. package/src/data/bucket/symbol_bucket.js +937 -0
  71. package/src/data/bucket.js +123 -0
  72. package/src/data/dem_data.js +125 -0
  73. package/src/data/evaluation_feature.js +25 -0
  74. package/src/data/extent.js +18 -0
  75. package/src/data/feature_index.js +322 -0
  76. package/src/data/feature_position_map.js +131 -0
  77. package/src/data/index_array_type.js +16 -0
  78. package/src/data/load_geometry.js +46 -0
  79. package/src/data/pos_attributes.js +6 -0
  80. package/src/data/program_configuration.js +708 -0
  81. package/src/data/raster_bounds_attributes.js +7 -0
  82. package/src/data/segment.js +76 -0
  83. package/src/geo/edge_insets.js +102 -0
  84. package/src/geo/lng_lat.js +168 -0
  85. package/src/geo/lng_lat_bounds.js +276 -0
  86. package/src/geo/mercator_coordinate.js +150 -0
  87. package/src/geo/transform.js +834 -0
  88. package/src/gl/color_mode.js +34 -0
  89. package/src/gl/context.js +302 -0
  90. package/src/gl/cull_face_mode.js +26 -0
  91. package/src/gl/depth_mode.js +29 -0
  92. package/src/gl/framebuffer.js +44 -0
  93. package/src/gl/index_buffer.js +55 -0
  94. package/src/gl/stencil_mode.js +30 -0
  95. package/src/gl/types.js +84 -0
  96. package/src/gl/value.js +520 -0
  97. package/src/gl/vertex_buffer.js +119 -0
  98. package/src/index.js +230 -0
  99. package/src/render/draw_background.js +57 -0
  100. package/src/render/draw_circle.js +113 -0
  101. package/src/render/draw_collision_debug.js +172 -0
  102. package/src/render/draw_custom.js +49 -0
  103. package/src/render/draw_debug.js +127 -0
  104. package/src/render/draw_fill.js +124 -0
  105. package/src/render/draw_fill_extrusion.js +95 -0
  106. package/src/render/draw_heatmap.js +133 -0
  107. package/src/render/draw_hillshade.js +107 -0
  108. package/src/render/draw_line.js +125 -0
  109. package/src/render/draw_raster.js +125 -0
  110. package/src/render/draw_symbol.js +392 -0
  111. package/src/render/glyph_atlas.js +71 -0
  112. package/src/render/glyph_manager.js +182 -0
  113. package/src/render/image_atlas.js +149 -0
  114. package/src/render/image_manager.js +306 -0
  115. package/src/render/line_atlas.js +210 -0
  116. package/src/render/painter.js +654 -0
  117. package/src/render/program/background_program.js +103 -0
  118. package/src/render/program/circle_program.js +69 -0
  119. package/src/render/program/clipping_mask_program.js +20 -0
  120. package/src/render/program/collision_program.js +76 -0
  121. package/src/render/program/debug_program.js +35 -0
  122. package/src/render/program/fill_extrusion_program.js +122 -0
  123. package/src/render/program/fill_program.js +126 -0
  124. package/src/render/program/heatmap_program.js +83 -0
  125. package/src/render/program/hillshade_program.js +119 -0
  126. package/src/render/program/line_program.js +211 -0
  127. package/src/render/program/pattern.js +102 -0
  128. package/src/render/program/program_uniforms.js +42 -0
  129. package/src/render/program/raster_program.js +92 -0
  130. package/src/render/program/symbol_program.js +224 -0
  131. package/src/render/program.js +188 -0
  132. package/src/render/texture.js +122 -0
  133. package/src/render/uniform_binding.js +147 -0
  134. package/src/render/vertex_array_object.js +163 -0
  135. package/src/shaders/README.md +42 -0
  136. package/src/shaders/_prelude.fragment.glsl +17 -0
  137. package/src/shaders/_prelude.vertex.glsl +73 -0
  138. package/src/shaders/background.fragment.glsl +10 -0
  139. package/src/shaders/background.vertex.glsl +7 -0
  140. package/src/shaders/background_pattern.fragment.glsl +28 -0
  141. package/src/shaders/background_pattern.vertex.glsl +20 -0
  142. package/src/shaders/circle.fragment.glsl +39 -0
  143. package/src/shaders/circle.vertex.glsl +64 -0
  144. package/src/shaders/clipping_mask.fragment.glsl +3 -0
  145. package/src/shaders/clipping_mask.vertex.glsl +7 -0
  146. package/src/shaders/collision_box.fragment.glsl +21 -0
  147. package/src/shaders/collision_box.vertex.glsl +27 -0
  148. package/src/shaders/collision_circle.fragment.glsl +17 -0
  149. package/src/shaders/collision_circle.vertex.glsl +59 -0
  150. package/src/shaders/debug.fragment.glsl +9 -0
  151. package/src/shaders/debug.vertex.glsl +12 -0
  152. package/src/shaders/encode_attribute.js +17 -0
  153. package/src/shaders/fill.fragment.glsl +13 -0
  154. package/src/shaders/fill.vertex.glsl +13 -0
  155. package/src/shaders/fill_extrusion.fragment.glsl +9 -0
  156. package/src/shaders/fill_extrusion.vertex.glsl +66 -0
  157. package/src/shaders/fill_extrusion_pattern.fragment.glsl +45 -0
  158. package/src/shaders/fill_extrusion_pattern.vertex.glsl +79 -0
  159. package/src/shaders/fill_outline.fragment.glsl +17 -0
  160. package/src/shaders/fill_outline.vertex.glsl +17 -0
  161. package/src/shaders/fill_outline_pattern.fragment.glsl +43 -0
  162. package/src/shaders/fill_outline_pattern.vertex.glsl +44 -0
  163. package/src/shaders/fill_pattern.fragment.glsl +36 -0
  164. package/src/shaders/fill_pattern.vertex.glsl +39 -0
  165. package/src/shaders/heatmap.fragment.glsl +22 -0
  166. package/src/shaders/heatmap.vertex.glsl +54 -0
  167. package/src/shaders/heatmap_texture.fragment.glsl +14 -0
  168. package/src/shaders/heatmap_texture.vertex.glsl +11 -0
  169. package/src/shaders/hillshade.fragment.glsl +52 -0
  170. package/src/shaders/hillshade.vertex.glsl +11 -0
  171. package/src/shaders/hillshade_prepare.fragment.glsl +75 -0
  172. package/src/shaders/hillshade_prepare.vertex.glsl +15 -0
  173. package/src/shaders/index.js +20 -0
  174. package/src/shaders/line.fragment.glsl +30 -0
  175. package/src/shaders/line.vertex.glsl +85 -0
  176. package/src/shaders/line_gradient.fragment.glsl +34 -0
  177. package/src/shaders/line_gradient.vertex.glsl +88 -0
  178. package/src/shaders/line_pattern.fragment.glsl +74 -0
  179. package/src/shaders/line_pattern.vertex.glsl +99 -0
  180. package/src/shaders/line_sdf.fragment.glsl +45 -0
  181. package/src/shaders/line_sdf.vertex.glsl +98 -0
  182. package/src/shaders/raster.fragment.glsl +52 -0
  183. package/src/shaders/raster.vertex.glsl +21 -0
  184. package/src/shaders/shaders.js +185 -0
  185. package/src/shaders/symbol_icon.fragment.glsl +17 -0
  186. package/src/shaders/symbol_icon.vertex.glsl +94 -0
  187. package/src/shaders/symbol_sdf.fragment.glsl +52 -0
  188. package/src/shaders/symbol_sdf.vertex.glsl +115 -0
  189. package/src/shaders/symbol_text_and_icon.fragment.glsl +68 -0
  190. package/src/shaders/symbol_text_and_icon.vertex.glsl +116 -0
  191. package/src/source/canvas_source.js +238 -0
  192. package/src/source/geojson_source.js +370 -0
  193. package/src/source/geojson_worker_source.js +366 -0
  194. package/src/source/geojson_wrapper.js +94 -0
  195. package/src/source/image_source.js +307 -0
  196. package/src/source/load_tilejson.js +39 -0
  197. package/src/source/pixels_to_tile_units.js +21 -0
  198. package/src/source/query_features.js +208 -0
  199. package/src/source/raster_dem_tile_source.js +138 -0
  200. package/src/source/raster_dem_tile_worker_source.js +62 -0
  201. package/src/source/raster_tile_source.js +169 -0
  202. package/src/source/rtl_text_plugin.js +143 -0
  203. package/src/source/source.js +137 -0
  204. package/src/source/source_cache.js +953 -0
  205. package/src/source/source_state.js +159 -0
  206. package/src/source/tile.js +458 -0
  207. package/src/source/tile_bounds.js +38 -0
  208. package/src/source/tile_cache.js +212 -0
  209. package/src/source/tile_id.js +199 -0
  210. package/src/source/vector_tile_source.js +259 -0
  211. package/src/source/vector_tile_worker_source.js +216 -0
  212. package/src/source/video_source.js +203 -0
  213. package/src/source/worker.js +240 -0
  214. package/src/source/worker_source.js +107 -0
  215. package/src/source/worker_tile.js +224 -0
  216. package/src/style/create_style_layer.js +36 -0
  217. package/src/style/evaluation_parameters.js +62 -0
  218. package/src/style/format_section_override.js +56 -0
  219. package/src/style/light.js +130 -0
  220. package/src/style/load_glyph_range.js +38 -0
  221. package/src/style/load_sprite.js +67 -0
  222. package/src/style/parse_glyph_pbf.js +44 -0
  223. package/src/style/pauseable_placement.js +132 -0
  224. package/src/style/properties.js +753 -0
  225. package/src/style/query_utils.js +43 -0
  226. package/src/style/style.js +1374 -0
  227. package/src/style/style_glyph.js +17 -0
  228. package/src/style/style_image.js +137 -0
  229. package/src/style/style_layer/background_style_layer.js +21 -0
  230. package/src/style/style_layer/background_style_layer_properties.js +40 -0
  231. package/src/style/style_layer/circle_style_layer.js +98 -0
  232. package/src/style/style_layer/circle_style_layer_properties.js +63 -0
  233. package/src/style/style_layer/custom_style_layer.js +223 -0
  234. package/src/style/style_layer/fill_extrusion_style_layer.js +224 -0
  235. package/src/style/style_layer/fill_extrusion_style_layer_properties.js +50 -0
  236. package/src/style/style_layer/fill_style_layer.js +67 -0
  237. package/src/style/style_layer/fill_style_layer_properties.js +55 -0
  238. package/src/style/style_layer/heatmap_style_layer.js +73 -0
  239. package/src/style/style_layer/heatmap_style_layer_properties.js +44 -0
  240. package/src/style/style_layer/hillshade_style_layer.js +25 -0
  241. package/src/style/style_layer/hillshade_style_layer_properties.js +46 -0
  242. package/src/style/style_layer/layer_properties.js.ejs +69 -0
  243. package/src/style/style_layer/line_style_layer.js +150 -0
  244. package/src/style/style_layer/line_style_layer_properties.js +71 -0
  245. package/src/style/style_layer/raster_style_layer.js +21 -0
  246. package/src/style/style_layer/raster_style_layer_properties.js +50 -0
  247. package/src/style/style_layer/symbol_style_layer.js +190 -0
  248. package/src/style/style_layer/symbol_style_layer_properties.js +153 -0
  249. package/src/style/style_layer/typed_style_layer.js +17 -0
  250. package/src/style/style_layer.js +283 -0
  251. package/src/style/style_layer_index.js +80 -0
  252. package/src/style/validate_style.js +42 -0
  253. package/src/style/zoom_history.js +44 -0
  254. package/src/style-spec/.eslintrc +5 -0
  255. package/src/style-spec/CHANGELOG.md +468 -0
  256. package/src/style-spec/README.md +59 -0
  257. package/src/style-spec/bin/gl-style-composite +9 -0
  258. package/src/style-spec/bin/gl-style-format +22 -0
  259. package/src/style-spec/bin/gl-style-migrate +9 -0
  260. package/src/style-spec/bin/gl-style-validate +50 -0
  261. package/src/style-spec/composite.js +50 -0
  262. package/src/style-spec/declass.js +42 -0
  263. package/src/style-spec/deref.js +52 -0
  264. package/src/style-spec/diff.js +393 -0
  265. package/src/style-spec/dist/.gitkeep +0 -0
  266. package/src/style-spec/dist/index.es.js +15032 -0
  267. package/src/style-spec/dist/index.es.js.map +1 -0
  268. package/src/style-spec/dist/index.js +15058 -0
  269. package/src/style-spec/dist/index.js.map +1 -0
  270. package/src/style-spec/empty.js +29 -0
  271. package/src/style-spec/error/parsing_error.js +16 -0
  272. package/src/style-spec/error/validation_error.js +18 -0
  273. package/src/style-spec/expression/compound_expression.js +162 -0
  274. package/src/style-spec/expression/definitions/assertion.js +130 -0
  275. package/src/style-spec/expression/definitions/at.js +70 -0
  276. package/src/style-spec/expression/definitions/case.js +85 -0
  277. package/src/style-spec/expression/definitions/coalesce.js +93 -0
  278. package/src/style-spec/expression/definitions/coercion.js +133 -0
  279. package/src/style-spec/expression/definitions/collator.js +78 -0
  280. package/src/style-spec/expression/definitions/comparison.js +184 -0
  281. package/src/style-spec/expression/definitions/format.js +144 -0
  282. package/src/style-spec/expression/definitions/image.js +52 -0
  283. package/src/style-spec/expression/definitions/in.js +72 -0
  284. package/src/style-spec/expression/definitions/index.js +565 -0
  285. package/src/style-spec/expression/definitions/index_of.js +89 -0
  286. package/src/style-spec/expression/definitions/interpolate.js +267 -0
  287. package/src/style-spec/expression/definitions/length.js +61 -0
  288. package/src/style-spec/expression/definitions/let.js +72 -0
  289. package/src/style-spec/expression/definitions/literal.js +77 -0
  290. package/src/style-spec/expression/definitions/match.js +158 -0
  291. package/src/style-spec/expression/definitions/number_format.js +142 -0
  292. package/src/style-spec/expression/definitions/slice.js +86 -0
  293. package/src/style-spec/expression/definitions/step.js +120 -0
  294. package/src/style-spec/expression/definitions/var.js +46 -0
  295. package/src/style-spec/expression/definitions/within.js +342 -0
  296. package/src/style-spec/expression/evaluation_context.js +59 -0
  297. package/src/style-spec/expression/expression.js +27 -0
  298. package/src/style-spec/expression/index.js +392 -0
  299. package/src/style-spec/expression/is_constant.js +59 -0
  300. package/src/style-spec/expression/parsing_context.js +233 -0
  301. package/src/style-spec/expression/parsing_error.js +13 -0
  302. package/src/style-spec/expression/runtime_error.js +17 -0
  303. package/src/style-spec/expression/scope.js +36 -0
  304. package/src/style-spec/expression/stops.js +39 -0
  305. package/src/style-spec/expression/types/collator.js +61 -0
  306. package/src/style-spec/expression/types/formatted.js +73 -0
  307. package/src/style-spec/expression/types/resolved_image.js +29 -0
  308. package/src/style-spec/expression/types.js +126 -0
  309. package/src/style-spec/expression/values.js +123 -0
  310. package/src/style-spec/feature_filter/README.md +55 -0
  311. package/src/style-spec/feature_filter/convert.js +208 -0
  312. package/src/style-spec/feature_filter/index.js +175 -0
  313. package/src/style-spec/format.js +51 -0
  314. package/src/style-spec/function/convert.js +270 -0
  315. package/src/style-spec/function/index.js +262 -0
  316. package/src/style-spec/group_by_layout.js +75 -0
  317. package/src/style-spec/migrate/expressions.js +39 -0
  318. package/src/style-spec/migrate/v8.js +203 -0
  319. package/src/style-spec/migrate/v9.js +26 -0
  320. package/src/style-spec/migrate.js +36 -0
  321. package/src/style-spec/package.json +41 -0
  322. package/src/style-spec/read_style.js +14 -0
  323. package/src/style-spec/reference/latest.js +3 -0
  324. package/src/style-spec/reference/v8.json +5914 -0
  325. package/src/style-spec/rollup.config.js +65 -0
  326. package/src/style-spec/style-spec.js +124 -0
  327. package/src/style-spec/types.js +432 -0
  328. package/src/style-spec/util/color.js +95 -0
  329. package/src/style-spec/util/color_spaces.js +139 -0
  330. package/src/style-spec/util/deep_equal.js +28 -0
  331. package/src/style-spec/util/extend.js +10 -0
  332. package/src/style-spec/util/get_type.js +17 -0
  333. package/src/style-spec/util/interpolate.js +22 -0
  334. package/src/style-spec/util/properties.js +15 -0
  335. package/src/style-spec/util/ref_properties.js +2 -0
  336. package/src/style-spec/util/result.js +19 -0
  337. package/src/style-spec/util/unbundle_jsonlint.js +24 -0
  338. package/src/style-spec/validate/latest.js +11 -0
  339. package/src/style-spec/validate/validate.js +75 -0
  340. package/src/style-spec/validate/validate_array.js +52 -0
  341. package/src/style-spec/validate/validate_boolean.js +15 -0
  342. package/src/style-spec/validate/validate_color.js +20 -0
  343. package/src/style-spec/validate/validate_constants.js +13 -0
  344. package/src/style-spec/validate/validate_enum.js +21 -0
  345. package/src/style-spec/validate/validate_expression.js +43 -0
  346. package/src/style-spec/validate/validate_filter.js +117 -0
  347. package/src/style-spec/validate/validate_formatted.js +11 -0
  348. package/src/style-spec/validate/validate_function.js +207 -0
  349. package/src/style-spec/validate/validate_glyphs_url.js +21 -0
  350. package/src/style-spec/validate/validate_image.js +11 -0
  351. package/src/style-spec/validate/validate_layer.js +134 -0
  352. package/src/style-spec/validate/validate_layout_property.js +6 -0
  353. package/src/style-spec/validate/validate_light.js +47 -0
  354. package/src/style-spec/validate/validate_number.js +29 -0
  355. package/src/style-spec/validate/validate_object.js +61 -0
  356. package/src/style-spec/validate/validate_paint_property.js +6 -0
  357. package/src/style-spec/validate/validate_property.js +64 -0
  358. package/src/style-spec/validate/validate_source.js +111 -0
  359. package/src/style-spec/validate/validate_string.js +15 -0
  360. package/src/style-spec/validate_mapbox_api_supported.js +171 -0
  361. package/src/style-spec/validate_style.js +39 -0
  362. package/src/style-spec/validate_style.min.js +78 -0
  363. package/src/style-spec/visit.js +77 -0
  364. package/src/symbol/anchor.js +26 -0
  365. package/src/symbol/check_max_angle.js +81 -0
  366. package/src/symbol/clip_line.js +71 -0
  367. package/src/symbol/collision_feature.js +109 -0
  368. package/src/symbol/collision_index.js +373 -0
  369. package/src/symbol/cross_tile_symbol_index.js +301 -0
  370. package/src/symbol/get_anchors.js +167 -0
  371. package/src/symbol/grid_index.js +335 -0
  372. package/src/symbol/mergelines.js +82 -0
  373. package/src/symbol/one_em.js +4 -0
  374. package/src/symbol/opacity_state.js +27 -0
  375. package/src/symbol/path_interpolator.js +61 -0
  376. package/src/symbol/placement.js +1124 -0
  377. package/src/symbol/projection.js +451 -0
  378. package/src/symbol/quads.js +334 -0
  379. package/src/symbol/shaping.js +816 -0
  380. package/src/symbol/symbol_layout.js +796 -0
  381. package/src/symbol/symbol_size.js +113 -0
  382. package/src/symbol/transform_text.js +29 -0
  383. package/src/types/callback.js +17 -0
  384. package/src/types/cancelable.js +3 -0
  385. package/src/types/tilejson.js +17 -0
  386. package/src/types/transferable.js +3 -0
  387. package/src/types/window.js +172 -0
  388. package/src/ui/anchor.js +32 -0
  389. package/src/ui/camera.js +1277 -0
  390. package/src/ui/control/attribution_control.js +212 -0
  391. package/src/ui/control/fullscreen_control.js +147 -0
  392. package/src/ui/control/geolocate_control.js +707 -0
  393. package/src/ui/control/logo_control.js +92 -0
  394. package/src/ui/control/navigation_control.js +257 -0
  395. package/src/ui/control/scale_control.js +142 -0
  396. package/src/ui/default_locale.js +22 -0
  397. package/src/ui/events.js +1301 -0
  398. package/src/ui/handler/box_zoom.js +170 -0
  399. package/src/ui/handler/click_zoom.js +52 -0
  400. package/src/ui/handler/handler_util.js +12 -0
  401. package/src/ui/handler/keyboard.js +208 -0
  402. package/src/ui/handler/map_event.js +156 -0
  403. package/src/ui/handler/mouse.js +171 -0
  404. package/src/ui/handler/scroll_zoom.js +350 -0
  405. package/src/ui/handler/shim/dblclick_zoom.js +62 -0
  406. package/src/ui/handler/shim/drag_pan.js +88 -0
  407. package/src/ui/handler/shim/drag_rotate.js +67 -0
  408. package/src/ui/handler/shim/touch_zoom_rotate.js +108 -0
  409. package/src/ui/handler/tap_drag_zoom.js +103 -0
  410. package/src/ui/handler/tap_recognizer.js +133 -0
  411. package/src/ui/handler/tap_zoom.js +93 -0
  412. package/src/ui/handler/touch_pan.js +101 -0
  413. package/src/ui/handler/touch_zoom_rotate.js +305 -0
  414. package/src/ui/handler_inertia.js +158 -0
  415. package/src/ui/handler_manager.js +531 -0
  416. package/src/ui/hash.js +148 -0
  417. package/src/ui/map.js +2874 -0
  418. package/src/ui/marker.js +672 -0
  419. package/src/ui/popup.js +640 -0
  420. package/src/util/actor.js +212 -0
  421. package/src/util/ajax.js +388 -0
  422. package/src/util/browser/web_worker.js +10 -0
  423. package/src/util/browser/window.js +6 -0
  424. package/src/util/browser.js +70 -0
  425. package/src/util/classify_rings.js +52 -0
  426. package/src/util/color_ramp.js +61 -0
  427. package/src/util/config.js +30 -0
  428. package/src/util/debug.js +28 -0
  429. package/src/util/dictionary_coder.js +30 -0
  430. package/src/util/dispatcher.js +70 -0
  431. package/src/util/dom.js +142 -0
  432. package/src/util/evented.js +174 -0
  433. package/src/util/find_pole_of_inaccessibility.js +129 -0
  434. package/src/util/global_worker_pool.js +35 -0
  435. package/src/util/image.js +142 -0
  436. package/src/util/intersection_tests.js +208 -0
  437. package/src/util/is_char_in_unicode_block.js +311 -0
  438. package/src/util/mapbox.js +491 -0
  439. package/src/util/offscreen_canvas_supported.js +14 -0
  440. package/src/util/performance.js +112 -0
  441. package/src/util/primitives.js +145 -0
  442. package/src/util/resolve_tokens.js +16 -0
  443. package/src/util/script_detection.js +328 -0
  444. package/src/util/sku_token.js +42 -0
  445. package/src/util/smart_wrap.js +55 -0
  446. package/src/util/struct_array.js +243 -0
  447. package/src/util/struct_array.js.ejs +112 -0
  448. package/src/util/struct_array_layout.js.ejs +98 -0
  449. package/src/util/task_queue.js +68 -0
  450. package/src/util/throttle.js +27 -0
  451. package/src/util/throttled_invoker.js +46 -0
  452. package/src/util/tile_request_cache.js +172 -0
  453. package/src/util/util.js +524 -0
  454. package/src/util/vectortile_to_geojson.js +50 -0
  455. package/src/util/verticalize_punctuation.js +114 -0
  456. package/src/util/web_worker.js +91 -0
  457. package/src/util/web_worker_transfer.js +266 -0
  458. package/src/util/webp_supported.js +69 -0
  459. package/src/util/window.js +102 -0
  460. package/src/util/worker_pool.js +57 -0
@@ -0,0 +1,392 @@
1
+ // @flow
2
+
3
+ import assert from 'assert';
4
+
5
+ import extend from '../util/extend';
6
+ import ParsingError from './parsing_error';
7
+ import ParsingContext from './parsing_context';
8
+ import EvaluationContext from './evaluation_context';
9
+ import CompoundExpression from './compound_expression';
10
+ import Step from './definitions/step';
11
+ import Interpolate from './definitions/interpolate';
12
+ import Coalesce from './definitions/coalesce';
13
+ import Let from './definitions/let';
14
+ import definitions from './definitions';
15
+ import * as isConstant from './is_constant';
16
+ import RuntimeError from './runtime_error';
17
+ import {success, error} from '../util/result';
18
+ import {supportsPropertyExpression, supportsZoomExpression, supportsInterpolation} from '../util/properties';
19
+
20
+ import type {Type, EvaluationKind} from './types';
21
+ import type {Value} from './values';
22
+ import type {Expression} from './expression';
23
+ import type {StylePropertySpecification} from '../style-spec';
24
+ import type {Result} from '../util/result';
25
+ import type {InterpolationType} from './definitions/interpolate';
26
+ import type {PropertyValueSpecification} from '../types';
27
+ import type {FormattedSection} from './types/formatted';
28
+ import type Point from '@mapbox/point-geometry';
29
+ import type {CanonicalTileID} from '../../source/tile_id';
30
+
31
+ export type Feature = {
32
+ +type: 1 | 2 | 3 | 'Unknown' | 'Point' | 'MultiPoint' | 'LineString' | 'MultiLineString' | 'Polygon' | 'MultiPolygon',
33
+ +id?: any,
34
+ +properties: {[_: string]: any},
35
+ +patterns?: {[_: string]: {"min": string, "mid": string, "max": string}},
36
+ +geometry?: Array<Array<Point>>
37
+ };
38
+
39
+ export type FeatureState = {[_: string]: any};
40
+
41
+ export type GlobalProperties = $ReadOnly<{
42
+ zoom: number,
43
+ heatmapDensity?: number,
44
+ lineProgress?: number,
45
+ isSupportedScript?: (_: string) => boolean,
46
+ accumulated?: Value
47
+ }>;
48
+
49
+ export class StyleExpression {
50
+ expression: Expression;
51
+
52
+ _evaluator: EvaluationContext;
53
+ _defaultValue: Value;
54
+ _warningHistory: {[key: string]: boolean};
55
+ _enumValues: ?{[_: string]: any};
56
+
57
+ constructor(expression: Expression, propertySpec: ?StylePropertySpecification) {
58
+ this.expression = expression;
59
+ this._warningHistory = {};
60
+ this._evaluator = new EvaluationContext();
61
+ this._defaultValue = propertySpec ? getDefaultValue(propertySpec) : null;
62
+ this._enumValues = propertySpec && propertySpec.type === 'enum' ? propertySpec.values : null;
63
+ }
64
+
65
+ evaluateWithoutErrorHandling(globals: GlobalProperties, feature?: Feature, featureState?: FeatureState, canonical?: CanonicalTileID, availableImages?: Array<string>, formattedSection?: FormattedSection): any {
66
+ this._evaluator.globals = globals;
67
+ this._evaluator.feature = feature;
68
+ this._evaluator.featureState = featureState;
69
+ this._evaluator.canonical = canonical;
70
+ this._evaluator.availableImages = availableImages || null;
71
+ this._evaluator.formattedSection = formattedSection;
72
+
73
+ return this.expression.evaluate(this._evaluator);
74
+ }
75
+
76
+ evaluate(globals: GlobalProperties, feature?: Feature, featureState?: FeatureState, canonical?: CanonicalTileID, availableImages?: Array<string>, formattedSection?: FormattedSection): any {
77
+ this._evaluator.globals = globals;
78
+ this._evaluator.feature = feature || null;
79
+ this._evaluator.featureState = featureState || null;
80
+ this._evaluator.canonical = canonical;
81
+ this._evaluator.availableImages = availableImages || null;
82
+ this._evaluator.formattedSection = formattedSection || null;
83
+
84
+ try {
85
+ const val = this.expression.evaluate(this._evaluator);
86
+ // eslint-disable-next-line no-self-compare
87
+ if (val === null || val === undefined || (typeof val === 'number' && val !== val)) {
88
+ return this._defaultValue;
89
+ }
90
+ if (this._enumValues && !(val in this._enumValues)) {
91
+ throw new RuntimeError(`Expected value to be one of ${Object.keys(this._enumValues).map(v => JSON.stringify(v)).join(', ')}, but found ${JSON.stringify(val)} instead.`);
92
+ }
93
+ return val;
94
+ } catch (e) {
95
+ if (!this._warningHistory[e.message]) {
96
+ this._warningHistory[e.message] = true;
97
+ if (typeof console !== 'undefined') {
98
+ console.warn(e.message);
99
+ }
100
+ }
101
+ return this._defaultValue;
102
+ }
103
+ }
104
+ }
105
+
106
+ export function isExpression(expression: mixed) {
107
+ return Array.isArray(expression) && expression.length > 0 &&
108
+ typeof expression[0] === 'string' && expression[0] in definitions;
109
+ }
110
+
111
+ /**
112
+ * Parse and typecheck the given style spec JSON expression. If
113
+ * options.defaultValue is provided, then the resulting StyleExpression's
114
+ * `evaluate()` method will handle errors by logging a warning (once per
115
+ * message) and returning the default value. Otherwise, it will throw
116
+ * evaluation errors.
117
+ *
118
+ * @private
119
+ */
120
+ export function createExpression(expression: mixed, propertySpec: ?StylePropertySpecification): Result<StyleExpression, Array<ParsingError>> {
121
+ const parser = new ParsingContext(definitions, [], propertySpec ? getExpectedType(propertySpec) : undefined);
122
+
123
+ // For string-valued properties, coerce to string at the top level rather than asserting.
124
+ const parsed = parser.parse(expression, undefined, undefined, undefined,
125
+ propertySpec && propertySpec.type === 'string' ? {typeAnnotation: 'coerce'} : undefined);
126
+
127
+ if (!parsed) {
128
+ assert(parser.errors.length > 0);
129
+ return error(parser.errors);
130
+ }
131
+
132
+ return success(new StyleExpression(parsed, propertySpec));
133
+ }
134
+
135
+ export class ZoomConstantExpression<Kind: EvaluationKind> {
136
+ kind: Kind;
137
+ isStateDependent: boolean;
138
+ _styleExpression: StyleExpression;
139
+
140
+ constructor(kind: Kind, expression: StyleExpression) {
141
+ this.kind = kind;
142
+ this._styleExpression = expression;
143
+ this.isStateDependent = kind !== ('constant': EvaluationKind) && !isConstant.isStateConstant(expression.expression);
144
+ }
145
+
146
+ evaluateWithoutErrorHandling(globals: GlobalProperties, feature?: Feature, featureState?: FeatureState, canonical?: CanonicalTileID, availableImages?: Array<string>, formattedSection?: FormattedSection): any {
147
+ return this._styleExpression.evaluateWithoutErrorHandling(globals, feature, featureState, canonical, availableImages, formattedSection);
148
+ }
149
+
150
+ evaluate(globals: GlobalProperties, feature?: Feature, featureState?: FeatureState, canonical?: CanonicalTileID, availableImages?: Array<string>, formattedSection?: FormattedSection): any {
151
+ return this._styleExpression.evaluate(globals, feature, featureState, canonical, availableImages, formattedSection);
152
+ }
153
+ }
154
+
155
+ export class ZoomDependentExpression<Kind: EvaluationKind> {
156
+ kind: Kind;
157
+ zoomStops: Array<number>;
158
+ isStateDependent: boolean;
159
+
160
+ _styleExpression: StyleExpression;
161
+ interpolationType: ?InterpolationType;
162
+
163
+ constructor(kind: Kind, expression: StyleExpression, zoomStops: Array<number>, interpolationType?: InterpolationType) {
164
+ this.kind = kind;
165
+ this.zoomStops = zoomStops;
166
+ this._styleExpression = expression;
167
+ this.isStateDependent = kind !== ('camera': EvaluationKind) && !isConstant.isStateConstant(expression.expression);
168
+ this.interpolationType = interpolationType;
169
+ }
170
+
171
+ evaluateWithoutErrorHandling(globals: GlobalProperties, feature?: Feature, featureState?: FeatureState, canonical?: CanonicalTileID, availableImages?: Array<string>, formattedSection?: FormattedSection): any {
172
+ return this._styleExpression.evaluateWithoutErrorHandling(globals, feature, featureState, canonical, availableImages, formattedSection);
173
+ }
174
+
175
+ evaluate(globals: GlobalProperties, feature?: Feature, featureState?: FeatureState, canonical?: CanonicalTileID, availableImages?: Array<string>, formattedSection?: FormattedSection): any {
176
+ return this._styleExpression.evaluate(globals, feature, featureState, canonical, availableImages, formattedSection);
177
+ }
178
+
179
+ interpolationFactor(input: number, lower: number, upper: number): number {
180
+ if (this.interpolationType) {
181
+ return Interpolate.interpolationFactor(this.interpolationType, input, lower, upper);
182
+ } else {
183
+ return 0;
184
+ }
185
+ }
186
+ }
187
+
188
+ export type ConstantExpression = {
189
+ kind: 'constant',
190
+ +evaluate: (globals: GlobalProperties, feature?: Feature, featureState?: FeatureState, canonical?: CanonicalTileID, availableImages?: Array<string>) => any,
191
+ }
192
+
193
+ export type SourceExpression = {
194
+ kind: 'source',
195
+ isStateDependent: boolean,
196
+ +evaluate: (globals: GlobalProperties, feature?: Feature, featureState?: FeatureState, canonical?: CanonicalTileID, availableImages?: Array<string>, formattedSection?: FormattedSection) => any,
197
+ };
198
+
199
+ export type CameraExpression = {
200
+ kind: 'camera',
201
+ +evaluate: (globals: GlobalProperties, feature?: Feature, featureState?: FeatureState, canonical?: CanonicalTileID, availableImages?: Array<string>) => any,
202
+ +interpolationFactor: (input: number, lower: number, upper: number) => number,
203
+ zoomStops: Array<number>,
204
+ interpolationType: ?InterpolationType
205
+ };
206
+
207
+ export type CompositeExpression = {
208
+ kind: 'composite',
209
+ isStateDependent: boolean,
210
+ +evaluate: (globals: GlobalProperties, feature?: Feature, featureState?: FeatureState, canonical?: CanonicalTileID, availableImages?: Array<string>, formattedSection?: FormattedSection) => any,
211
+ +interpolationFactor: (input: number, lower: number, upper: number) => number,
212
+ zoomStops: Array<number>,
213
+ interpolationType: ?InterpolationType
214
+ };
215
+
216
+ export type StylePropertyExpression =
217
+ | ConstantExpression
218
+ | SourceExpression
219
+ | CameraExpression
220
+ | CompositeExpression;
221
+
222
+ export function createPropertyExpression(expression: mixed, propertySpec: StylePropertySpecification): Result<StylePropertyExpression, Array<ParsingError>> {
223
+ expression = createExpression(expression, propertySpec);
224
+ if (expression.result === 'error') {
225
+ return expression;
226
+ }
227
+
228
+ const parsed = expression.value.expression;
229
+
230
+ const isFeatureConstant = isConstant.isFeatureConstant(parsed);
231
+ if (!isFeatureConstant && !supportsPropertyExpression(propertySpec)) {
232
+ return error([new ParsingError('', 'data expressions not supported')]);
233
+ }
234
+
235
+ const isZoomConstant = isConstant.isGlobalPropertyConstant(parsed, ['zoom']);
236
+ if (!isZoomConstant && !supportsZoomExpression(propertySpec)) {
237
+ return error([new ParsingError('', 'zoom expressions not supported')]);
238
+ }
239
+
240
+ const zoomCurve = findZoomCurve(parsed);
241
+ if (!zoomCurve && !isZoomConstant) {
242
+ return error([new ParsingError('', '"zoom" expression may only be used as input to a top-level "step" or "interpolate" expression.')]);
243
+ } else if (zoomCurve instanceof ParsingError) {
244
+ return error([zoomCurve]);
245
+ } else if (zoomCurve instanceof Interpolate && !supportsInterpolation(propertySpec)) {
246
+ return error([new ParsingError('', '"interpolate" expressions cannot be used with this property')]);
247
+ }
248
+
249
+ if (!zoomCurve) {
250
+ return success(isFeatureConstant ?
251
+ (new ZoomConstantExpression('constant', expression.value): ConstantExpression) :
252
+ (new ZoomConstantExpression('source', expression.value): SourceExpression));
253
+ }
254
+
255
+ const interpolationType = zoomCurve instanceof Interpolate ? zoomCurve.interpolation : undefined;
256
+
257
+ return success(isFeatureConstant ?
258
+ (new ZoomDependentExpression('camera', expression.value, zoomCurve.labels, interpolationType): CameraExpression) :
259
+ (new ZoomDependentExpression('composite', expression.value, zoomCurve.labels, interpolationType): CompositeExpression));
260
+ }
261
+
262
+ import {isFunction, createFunction} from '../function';
263
+ import {Color} from './values';
264
+
265
+ // serialization wrapper for old-style stop functions normalized to the
266
+ // expression interface
267
+ export class StylePropertyFunction<T> {
268
+ _parameters: PropertyValueSpecification<T>;
269
+ _specification: StylePropertySpecification;
270
+
271
+ kind: EvaluationKind;
272
+ evaluate: (globals: GlobalProperties, feature?: Feature) => any;
273
+ interpolationFactor: ?(input: number, lower: number, upper: number) => number;
274
+ zoomStops: ?Array<number>;
275
+
276
+ constructor(parameters: PropertyValueSpecification<T>, specification: StylePropertySpecification) {
277
+ this._parameters = parameters;
278
+ this._specification = specification;
279
+ extend(this, createFunction(this._parameters, this._specification));
280
+ }
281
+
282
+ static deserialize(serialized: {_parameters: PropertyValueSpecification<T>, _specification: StylePropertySpecification}) {
283
+ return ((new StylePropertyFunction(serialized._parameters, serialized._specification)): StylePropertyFunction<T>);
284
+ }
285
+
286
+ static serialize(input: StylePropertyFunction<T>) {
287
+ return {
288
+ _parameters: input._parameters,
289
+ _specification: input._specification
290
+ };
291
+ }
292
+ }
293
+
294
+ export function normalizePropertyExpression<T>(value: PropertyValueSpecification<T>, specification: StylePropertySpecification): StylePropertyExpression {
295
+ if (isFunction(value)) {
296
+ return (new StylePropertyFunction(value, specification): any);
297
+
298
+ } else if (isExpression(value)) {
299
+ const expression = createPropertyExpression(value, specification);
300
+ if (expression.result === 'error') {
301
+ // this should have been caught in validation
302
+ throw new Error(expression.value.map(err => `${err.key}: ${err.message}`).join(', '));
303
+ }
304
+ return expression.value;
305
+
306
+ } else {
307
+ let constant: any = value;
308
+ if (typeof value === 'string' && specification.type === 'color') {
309
+ constant = Color.parse(value);
310
+ }
311
+ return {
312
+ kind: 'constant',
313
+ evaluate: () => constant
314
+ };
315
+ }
316
+ }
317
+
318
+ // Zoom-dependent expressions may only use ["zoom"] as the input to a top-level "step" or "interpolate"
319
+ // expression (collectively referred to as a "curve"). The curve may be wrapped in one or more "let" or
320
+ // "coalesce" expressions.
321
+ function findZoomCurve(expression: Expression): Step | Interpolate | ParsingError | null {
322
+ let result = null;
323
+ if (expression instanceof Let) {
324
+ result = findZoomCurve(expression.result);
325
+
326
+ } else if (expression instanceof Coalesce) {
327
+ for (const arg of expression.args) {
328
+ result = findZoomCurve(arg);
329
+ if (result) {
330
+ break;
331
+ }
332
+ }
333
+
334
+ } else if ((expression instanceof Step || expression instanceof Interpolate) &&
335
+ expression.input instanceof CompoundExpression &&
336
+ expression.input.name === 'zoom') {
337
+
338
+ result = expression;
339
+ }
340
+
341
+ if (result instanceof ParsingError) {
342
+ return result;
343
+ }
344
+
345
+ expression.eachChild((child) => {
346
+ const childResult = findZoomCurve(child);
347
+ if (childResult instanceof ParsingError) {
348
+ result = childResult;
349
+ } else if (!result && childResult) {
350
+ result = new ParsingError('', '"zoom" expression may only be used as input to a top-level "step" or "interpolate" expression.');
351
+ } else if (result && childResult && result !== childResult) {
352
+ result = new ParsingError('', 'Only one zoom-based "step" or "interpolate" subexpression may be used in an expression.');
353
+ }
354
+ });
355
+
356
+ return result;
357
+ }
358
+
359
+ import {ColorType, StringType, NumberType, BooleanType, ValueType, FormattedType, ResolvedImageType, array} from './types';
360
+
361
+ function getExpectedType(spec: StylePropertySpecification): Type {
362
+ const types = {
363
+ color: ColorType,
364
+ string: StringType,
365
+ number: NumberType,
366
+ enum: StringType,
367
+ boolean: BooleanType,
368
+ formatted: FormattedType,
369
+ resolvedImage: ResolvedImageType
370
+ };
371
+
372
+ if (spec.type === 'array') {
373
+ return array(types[spec.value] || ValueType, spec.length);
374
+ }
375
+
376
+ return types[spec.type];
377
+ }
378
+
379
+ function getDefaultValue(spec: StylePropertySpecification): Value {
380
+ if (spec.type === 'color' && isFunction(spec.default)) {
381
+ // Special case for heatmap-color: it uses the 'default:' to define a
382
+ // default color ramp, but createExpression expects a simple value to fall
383
+ // back to in case of runtime errors
384
+ return new Color(0, 0, 0, 0);
385
+ } else if (spec.type === 'color') {
386
+ return Color.parse(spec.default) || null;
387
+ } else if (spec.default === undefined) {
388
+ return null;
389
+ } else {
390
+ return spec.default;
391
+ }
392
+ }
@@ -0,0 +1,59 @@
1
+ // @flow
2
+
3
+ import CompoundExpression from './compound_expression';
4
+ import Within from './definitions/within';
5
+ import type {Expression} from './expression.js';
6
+
7
+ function isFeatureConstant(e: Expression) {
8
+ if (e instanceof CompoundExpression) {
9
+ if (e.name === 'get' && e.args.length === 1) {
10
+ return false;
11
+ } else if (e.name === 'feature-state') {
12
+ return false;
13
+ } else if (e.name === 'has' && e.args.length === 1) {
14
+ return false;
15
+ } else if (
16
+ e.name === 'properties' ||
17
+ e.name === 'geometry-type' ||
18
+ e.name === 'id'
19
+ ) {
20
+ return false;
21
+ } else if (/^filter-/.test(e.name)) {
22
+ return false;
23
+ }
24
+ }
25
+
26
+ if (e instanceof Within) {
27
+ return false;
28
+ }
29
+
30
+ let result = true;
31
+ e.eachChild(arg => {
32
+ if (result && !isFeatureConstant(arg)) { result = false; }
33
+ });
34
+ return result;
35
+ }
36
+
37
+ function isStateConstant(e: Expression) {
38
+ if (e instanceof CompoundExpression) {
39
+ if (e.name === 'feature-state') {
40
+ return false;
41
+ }
42
+ }
43
+ let result = true;
44
+ e.eachChild(arg => {
45
+ if (result && !isStateConstant(arg)) { result = false; }
46
+ });
47
+ return result;
48
+ }
49
+
50
+ function isGlobalPropertyConstant(e: Expression, properties: Array<string>) {
51
+ if (e instanceof CompoundExpression && properties.indexOf(e.name) >= 0) { return false; }
52
+ let result = true;
53
+ e.eachChild((arg) => {
54
+ if (result && !isGlobalPropertyConstant(arg, properties)) { result = false; }
55
+ });
56
+ return result;
57
+ }
58
+
59
+ export {isFeatureConstant, isGlobalPropertyConstant, isStateConstant};
@@ -0,0 +1,233 @@
1
+ // @flow
2
+
3
+ import Scope from './scope';
4
+ import {checkSubtype} from './types';
5
+ import ParsingError from './parsing_error';
6
+ import Literal from './definitions/literal';
7
+ import Assertion from './definitions/assertion';
8
+ import Coercion from './definitions/coercion';
9
+ import EvaluationContext from './evaluation_context';
10
+ import CompoundExpression from './compound_expression';
11
+ import CollatorExpression from './definitions/collator';
12
+ import Within from './definitions/within';
13
+ import {isGlobalPropertyConstant, isFeatureConstant} from './is_constant';
14
+ import Var from './definitions/var';
15
+
16
+ import type {Expression, ExpressionRegistry} from './expression';
17
+ import type {Type} from './types';
18
+
19
+ /**
20
+ * State associated parsing at a given point in an expression tree.
21
+ * @private
22
+ */
23
+ class ParsingContext {
24
+ registry: ExpressionRegistry;
25
+ path: Array<number>;
26
+ key: string;
27
+ scope: Scope;
28
+ errors: Array<ParsingError>;
29
+
30
+ // The expected type of this expression. Provided only to allow Expression
31
+ // implementations to infer argument types: Expression#parse() need not
32
+ // check that the output type of the parsed expression matches
33
+ // `expectedType`.
34
+ expectedType: ?Type;
35
+
36
+ constructor(
37
+ registry: ExpressionRegistry,
38
+ path: Array<number> = [],
39
+ expectedType: ?Type,
40
+ scope: Scope = new Scope(),
41
+ errors: Array<ParsingError> = []
42
+ ) {
43
+ this.registry = registry;
44
+ this.path = path;
45
+ this.key = path.map(part => `[${part}]`).join('');
46
+ this.scope = scope;
47
+ this.errors = errors;
48
+ this.expectedType = expectedType;
49
+ }
50
+
51
+ /**
52
+ * @param expr the JSON expression to parse
53
+ * @param index the optional argument index if this expression is an argument of a parent expression that's being parsed
54
+ * @param options
55
+ * @param options.omitTypeAnnotations set true to omit inferred type annotations. Caller beware: with this option set, the parsed expression's type will NOT satisfy `expectedType` if it would normally be wrapped in an inferred annotation.
56
+ * @private
57
+ */
58
+ parse(
59
+ expr: mixed,
60
+ index?: number,
61
+ expectedType?: ?Type,
62
+ bindings?: Array<[string, Expression]>,
63
+ options: {typeAnnotation?: 'assert' | 'coerce' | 'omit'} = {}
64
+ ): ?Expression {
65
+ if (index) {
66
+ return this.concat(index, expectedType, bindings)._parse(expr, options);
67
+ }
68
+ return this._parse(expr, options);
69
+ }
70
+
71
+ _parse(expr: mixed, options: {typeAnnotation?: 'assert' | 'coerce' | 'omit'}): ?Expression {
72
+ if (expr === null || typeof expr === 'string' || typeof expr === 'boolean' || typeof expr === 'number') {
73
+ expr = ['literal', expr];
74
+ }
75
+
76
+ function annotate(parsed, type, typeAnnotation: 'assert' | 'coerce' | 'omit') {
77
+ if (typeAnnotation === 'assert') {
78
+ return new Assertion(type, [parsed]);
79
+ } else if (typeAnnotation === 'coerce') {
80
+ return new Coercion(type, [parsed]);
81
+ } else {
82
+ return parsed;
83
+ }
84
+ }
85
+
86
+ if (Array.isArray(expr)) {
87
+ if (expr.length === 0) {
88
+ return this.error(`Expected an array with at least one element. If you wanted a literal array, use ["literal", []].`);
89
+ }
90
+
91
+ const op = expr[0];
92
+ if (typeof op !== 'string') {
93
+ this.error(`Expression name must be a string, but found ${typeof op} instead. If you wanted a literal array, use ["literal", [...]].`, 0);
94
+ return null;
95
+ }
96
+
97
+ const Expr = this.registry[op];
98
+ if (Expr) {
99
+ let parsed = Expr.parse(expr, this);
100
+ if (!parsed) return null;
101
+
102
+ if (this.expectedType) {
103
+ const expected = this.expectedType;
104
+ const actual = parsed.type;
105
+
106
+ // When we expect a number, string, boolean, or array but have a value, wrap it in an assertion.
107
+ // When we expect a color or formatted string, but have a string or value, wrap it in a coercion.
108
+ // Otherwise, we do static type-checking.
109
+ //
110
+ // These behaviors are overridable for:
111
+ // * The "coalesce" operator, which needs to omit type annotations.
112
+ // * String-valued properties (e.g. `text-field`), where coercion is more convenient than assertion.
113
+ //
114
+ if ((expected.kind === 'string' || expected.kind === 'number' || expected.kind === 'boolean' || expected.kind === 'object' || expected.kind === 'array') && actual.kind === 'value') {
115
+ parsed = annotate(parsed, expected, options.typeAnnotation || 'assert');
116
+ } else if ((expected.kind === 'color' || expected.kind === 'formatted' || expected.kind === 'resolvedImage') && (actual.kind === 'value' || actual.kind === 'string')) {
117
+ parsed = annotate(parsed, expected, options.typeAnnotation || 'coerce');
118
+ } else if (this.checkSubtype(expected, actual)) {
119
+ return null;
120
+ }
121
+ }
122
+
123
+ // If an expression's arguments are all literals, we can evaluate
124
+ // it immediately and replace it with a literal value in the
125
+ // parsed/compiled result. Expressions that expect an image should
126
+ // not be resolved here so we can later get the available images.
127
+ if (!(parsed instanceof Literal) && (parsed.type.kind !== 'resolvedImage') && isConstant(parsed)) {
128
+ const ec = new EvaluationContext();
129
+ try {
130
+ parsed = new Literal(parsed.type, parsed.evaluate(ec));
131
+ } catch (e) {
132
+ this.error(e.message);
133
+ return null;
134
+ }
135
+ }
136
+
137
+ return parsed;
138
+ }
139
+
140
+ return this.error(`Unknown expression "${op}". If you wanted a literal array, use ["literal", [...]].`, 0);
141
+ } else if (typeof expr === 'undefined') {
142
+ return this.error(`'undefined' value invalid. Use null instead.`);
143
+ } else if (typeof expr === 'object') {
144
+ return this.error(`Bare objects invalid. Use ["literal", {...}] instead.`);
145
+ } else {
146
+ return this.error(`Expected an array, but found ${typeof expr} instead.`);
147
+ }
148
+ }
149
+
150
+ /**
151
+ * Returns a copy of this context suitable for parsing the subexpression at
152
+ * index `index`, optionally appending to 'let' binding map.
153
+ *
154
+ * Note that `errors` property, intended for collecting errors while
155
+ * parsing, is copied by reference rather than cloned.
156
+ * @private
157
+ */
158
+ concat(index: number, expectedType?: ?Type, bindings?: Array<[string, Expression]>) {
159
+ const path = typeof index === 'number' ? this.path.concat(index) : this.path;
160
+ const scope = bindings ? this.scope.concat(bindings) : this.scope;
161
+ return new ParsingContext(
162
+ this.registry,
163
+ path,
164
+ expectedType || null,
165
+ scope,
166
+ this.errors
167
+ );
168
+ }
169
+
170
+ /**
171
+ * Push a parsing (or type checking) error into the `this.errors`
172
+ * @param error The message
173
+ * @param keys Optionally specify the source of the error at a child
174
+ * of the current expression at `this.key`.
175
+ * @private
176
+ */
177
+ error(error: string, ...keys: Array<number>) {
178
+ const key = `${this.key}${keys.map(k => `[${k}]`).join('')}`;
179
+ this.errors.push(new ParsingError(key, error));
180
+ }
181
+
182
+ /**
183
+ * Returns null if `t` is a subtype of `expected`; otherwise returns an
184
+ * error message and also pushes it to `this.errors`.
185
+ */
186
+ checkSubtype(expected: Type, t: Type): ?string {
187
+ const error = checkSubtype(expected, t);
188
+ if (error) this.error(error);
189
+ return error;
190
+ }
191
+ }
192
+
193
+ export default ParsingContext;
194
+
195
+ function isConstant(expression: Expression) {
196
+ if (expression instanceof Var) {
197
+ return isConstant(expression.boundExpression);
198
+ } else if (expression instanceof CompoundExpression && expression.name === 'error') {
199
+ return false;
200
+ } else if (expression instanceof CollatorExpression) {
201
+ // Although the results of a Collator expression with fixed arguments
202
+ // generally shouldn't change between executions, we can't serialize them
203
+ // as constant expressions because results change based on environment.
204
+ return false;
205
+ } else if (expression instanceof Within) {
206
+ return false;
207
+ }
208
+
209
+ const isTypeAnnotation = expression instanceof Coercion ||
210
+ expression instanceof Assertion;
211
+
212
+ let childrenConstant = true;
213
+ expression.eachChild(child => {
214
+ // We can _almost_ assume that if `expressions` children are constant,
215
+ // they would already have been evaluated to Literal values when they
216
+ // were parsed. Type annotations are the exception, because they might
217
+ // have been inferred and added after a child was parsed.
218
+
219
+ // So we recurse into isConstant() for the children of type annotations,
220
+ // but otherwise simply check whether they are Literals.
221
+ if (isTypeAnnotation) {
222
+ childrenConstant = childrenConstant && isConstant(child);
223
+ } else {
224
+ childrenConstant = childrenConstant && child instanceof Literal;
225
+ }
226
+ });
227
+ if (!childrenConstant) {
228
+ return false;
229
+ }
230
+
231
+ return isFeatureConstant(expression) &&
232
+ isGlobalPropertyConstant(expression, ['zoom', 'heatmap-density', 'line-progress', 'accumulated', 'is-supported-script']);
233
+ }