@mapwhit/tilerenderer 0.47.1

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 (356) hide show
  1. package/LICENSE.txt +87 -0
  2. package/README.md +25 -0
  3. package/build/min/.dir +0 -0
  4. package/build/min/package.json +3 -0
  5. package/build/min/src/shaders/_prelude.fragment.glsl.txt +13 -0
  6. package/build/min/src/shaders/_prelude.vertex.glsl.txt +14 -0
  7. package/build/min/src/shaders/background.fragment.glsl.txt +5 -0
  8. package/build/min/src/shaders/background.vertex.glsl.txt +1 -0
  9. package/build/min/src/shaders/background_pattern.fragment.glsl.txt +5 -0
  10. package/build/min/src/shaders/background_pattern.vertex.glsl.txt +1 -0
  11. package/build/min/src/shaders/circle.fragment.glsl.txt +20 -0
  12. package/build/min/src/shaders/circle.vertex.glsl.txt +17 -0
  13. package/build/min/src/shaders/clipping_mask.fragment.glsl.txt +1 -0
  14. package/build/min/src/shaders/clipping_mask.vertex.glsl.txt +1 -0
  15. package/build/min/src/shaders/collision_box.fragment.glsl.txt +1 -0
  16. package/build/min/src/shaders/collision_box.vertex.glsl.txt +1 -0
  17. package/build/min/src/shaders/collision_circle.fragment.glsl.txt +1 -0
  18. package/build/min/src/shaders/collision_circle.vertex.glsl.txt +1 -0
  19. package/build/min/src/shaders/debug.fragment.glsl.txt +1 -0
  20. package/build/min/src/shaders/debug.vertex.glsl.txt +1 -0
  21. package/build/min/src/shaders/fill.fragment.glsl.txt +10 -0
  22. package/build/min/src/shaders/fill.vertex.glsl.txt +7 -0
  23. package/build/min/src/shaders/fill_extrusion.fragment.glsl.txt +13 -0
  24. package/build/min/src/shaders/fill_extrusion.vertex.glsl.txt +9 -0
  25. package/build/min/src/shaders/fill_extrusion_pattern.fragment.glsl.txt +15 -0
  26. package/build/min/src/shaders/fill_extrusion_pattern.vertex.glsl.txt +11 -0
  27. package/build/min/src/shaders/fill_outline.fragment.glsl.txt +10 -0
  28. package/build/min/src/shaders/fill_outline.vertex.glsl.txt +7 -0
  29. package/build/min/src/shaders/fill_outline_pattern.fragment.glsl.txt +13 -0
  30. package/build/min/src/shaders/fill_outline_pattern.vertex.glsl.txt +9 -0
  31. package/build/min/src/shaders/fill_pattern.fragment.glsl.txt +13 -0
  32. package/build/min/src/shaders/fill_pattern.vertex.glsl.txt +9 -0
  33. package/build/min/src/shaders/heatmap.fragment.glsl.txt +10 -0
  34. package/build/min/src/shaders/heatmap.vertex.glsl.txt +8 -0
  35. package/build/min/src/shaders/heatmap_texture.fragment.glsl.txt +5 -0
  36. package/build/min/src/shaders/heatmap_texture.vertex.glsl.txt +1 -0
  37. package/build/min/src/shaders/hillshade.fragment.glsl.txt +7 -0
  38. package/build/min/src/shaders/hillshade.vertex.glsl.txt +1 -0
  39. package/build/min/src/shaders/hillshade_prepare.fragment.glsl.txt +8 -0
  40. package/build/min/src/shaders/hillshade_prepare.vertex.glsl.txt +1 -0
  41. package/build/min/src/shaders/line.fragment.glsl.txt +12 -0
  42. package/build/min/src/shaders/line.vertex.glsl.txt +17 -0
  43. package/build/min/src/shaders/line_gradient.fragment.glsl.txt +10 -0
  44. package/build/min/src/shaders/line_gradient.vertex.glsl.txt +16 -0
  45. package/build/min/src/shaders/line_pattern.fragment.glsl.txt +15 -0
  46. package/build/min/src/shaders/line_pattern.vertex.glsl.txt +20 -0
  47. package/build/min/src/shaders/line_sdf.fragment.glsl.txt +17 -0
  48. package/build/min/src/shaders/line_sdf.vertex.glsl.txt +20 -0
  49. package/build/min/src/shaders/raster.fragment.glsl.txt +5 -0
  50. package/build/min/src/shaders/raster.vertex.glsl.txt +1 -0
  51. package/build/min/src/shaders/symbol_icon.fragment.glsl.txt +9 -0
  52. package/build/min/src/shaders/symbol_icon.vertex.glsl.txt +5 -0
  53. package/build/min/src/shaders/symbol_sdf.fragment.glsl.txt +19 -0
  54. package/build/min/src/shaders/symbol_sdf.vertex.glsl.txt +13 -0
  55. package/package.json +44 -0
  56. package/src/css/mapbox-gl.css +506 -0
  57. package/src/css/svg/mapboxgl-ctrl-attrib.svg +3 -0
  58. package/src/css/svg/mapboxgl-ctrl-compass.svg +4 -0
  59. package/src/css/svg/mapboxgl-ctrl-fullscreen.svg +3 -0
  60. package/src/css/svg/mapboxgl-ctrl-geolocate-background.svg +3 -0
  61. package/src/css/svg/mapboxgl-ctrl-geolocate.svg +3 -0
  62. package/src/css/svg/mapboxgl-ctrl-logo-compact.svg +2 -0
  63. package/src/css/svg/mapboxgl-ctrl-logo.svg +1 -0
  64. package/src/css/svg/mapboxgl-ctrl-shrink.svg +3 -0
  65. package/src/css/svg/mapboxgl-ctrl-zoom-in.svg +3 -0
  66. package/src/css/svg/mapboxgl-ctrl-zoom-out.svg +3 -0
  67. package/src/data/array_types.js +1138 -0
  68. package/src/data/bucket/circle_attributes.js +5 -0
  69. package/src/data/bucket/circle_bucket.js +118 -0
  70. package/src/data/bucket/fill_attributes.js +5 -0
  71. package/src/data/bucket/fill_bucket.js +166 -0
  72. package/src/data/bucket/fill_extrusion_attributes.js +11 -0
  73. package/src/data/bucket/fill_extrusion_bucket.js +247 -0
  74. package/src/data/bucket/heatmap_bucket.js +12 -0
  75. package/src/data/bucket/line_attributes.js +11 -0
  76. package/src/data/bucket/line_bucket.js +625 -0
  77. package/src/data/bucket/pattern_attributes.js +9 -0
  78. package/src/data/bucket/pattern_bucket_features.js +44 -0
  79. package/src/data/bucket/symbol_attributes.js +95 -0
  80. package/src/data/bucket/symbol_bucket.js +697 -0
  81. package/src/data/bucket.js +53 -0
  82. package/src/data/dem_data.js +126 -0
  83. package/src/data/extent.js +17 -0
  84. package/src/data/feature_index.js +254 -0
  85. package/src/data/index_array_type.js +14 -0
  86. package/src/data/load_geometry.js +42 -0
  87. package/src/data/pos_attributes.js +3 -0
  88. package/src/data/program_configuration.js +782 -0
  89. package/src/data/raster_bounds_attributes.js +6 -0
  90. package/src/data/segment.js +63 -0
  91. package/src/geo/coordinate.js +78 -0
  92. package/src/geo/lng_lat.js +129 -0
  93. package/src/geo/lng_lat_bounds.js +253 -0
  94. package/src/geo/transform.js +605 -0
  95. package/src/gl/color_mode.js +21 -0
  96. package/src/gl/context.js +193 -0
  97. package/src/gl/cull_face_mode.js +22 -0
  98. package/src/gl/depth_mode.js +18 -0
  99. package/src/gl/framebuffer.js +28 -0
  100. package/src/gl/index_buffer.js +52 -0
  101. package/src/gl/stencil_mode.js +17 -0
  102. package/src/gl/types.js +0 -0
  103. package/src/gl/value.js +676 -0
  104. package/src/gl/vertex_buffer.js +101 -0
  105. package/src/index.js +50 -0
  106. package/src/render/draw_background.js +60 -0
  107. package/src/render/draw_circle.js +55 -0
  108. package/src/render/draw_collision_debug.js +45 -0
  109. package/src/render/draw_debug.js +429 -0
  110. package/src/render/draw_fill.js +143 -0
  111. package/src/render/draw_fill_extrusion.js +101 -0
  112. package/src/render/draw_heatmap.js +159 -0
  113. package/src/render/draw_hillshade.js +144 -0
  114. package/src/render/draw_line.js +99 -0
  115. package/src/render/draw_raster.js +151 -0
  116. package/src/render/draw_symbol.js +231 -0
  117. package/src/render/glyph_atlas.js +55 -0
  118. package/src/render/glyph_manager.js +145 -0
  119. package/src/render/image_atlas.js +97 -0
  120. package/src/render/image_manager.js +183 -0
  121. package/src/render/line_atlas.js +139 -0
  122. package/src/render/painter.js +483 -0
  123. package/src/render/program/background_program.js +46 -0
  124. package/src/render/program/circle_program.js +40 -0
  125. package/src/render/program/clipping_mask_program.js +11 -0
  126. package/src/render/program/collision_program.js +28 -0
  127. package/src/render/program/debug_program.js +13 -0
  128. package/src/render/program/fill_extrusion_program.js +76 -0
  129. package/src/render/program/fill_program.js +60 -0
  130. package/src/render/program/heatmap_program.js +46 -0
  131. package/src/render/program/hillshade_program.js +77 -0
  132. package/src/render/program/line_program.js +119 -0
  133. package/src/render/program/pattern.js +57 -0
  134. package/src/render/program/program_uniforms.js +46 -0
  135. package/src/render/program/raster_program.js +50 -0
  136. package/src/render/program/symbol_program.js +112 -0
  137. package/src/render/program.js +133 -0
  138. package/src/render/texture.js +88 -0
  139. package/src/render/tile_mask.js +108 -0
  140. package/src/render/uniform_binding.js +129 -0
  141. package/src/render/vertex_array_object.js +155 -0
  142. package/src/shaders/README.md +42 -0
  143. package/src/shaders/_prelude.fragment.glsl +17 -0
  144. package/src/shaders/_prelude.vertex.glsl +73 -0
  145. package/src/shaders/background.fragment.glsl +10 -0
  146. package/src/shaders/background.vertex.glsl +7 -0
  147. package/src/shaders/background_pattern.fragment.glsl +28 -0
  148. package/src/shaders/background_pattern.vertex.glsl +20 -0
  149. package/src/shaders/circle.fragment.glsl +39 -0
  150. package/src/shaders/circle.vertex.glsl +63 -0
  151. package/src/shaders/clipping_mask.fragment.glsl +3 -0
  152. package/src/shaders/clipping_mask.vertex.glsl +7 -0
  153. package/src/shaders/collision_box.fragment.glsl +21 -0
  154. package/src/shaders/collision_box.vertex.glsl +26 -0
  155. package/src/shaders/collision_circle.fragment.glsl +34 -0
  156. package/src/shaders/collision_circle.vertex.glsl +36 -0
  157. package/src/shaders/debug.fragment.glsl +5 -0
  158. package/src/shaders/debug.vertex.glsl +7 -0
  159. package/src/shaders/encode_attribute.js +19 -0
  160. package/src/shaders/fill.fragment.glsl +13 -0
  161. package/src/shaders/fill.vertex.glsl +13 -0
  162. package/src/shaders/fill_extrusion.fragment.glsl +16 -0
  163. package/src/shaders/fill_extrusion.vertex.glsl +66 -0
  164. package/src/shaders/fill_extrusion_pattern.fragment.glsl +41 -0
  165. package/src/shaders/fill_extrusion_pattern.vertex.glsl +76 -0
  166. package/src/shaders/fill_outline.fragment.glsl +17 -0
  167. package/src/shaders/fill_outline.vertex.glsl +17 -0
  168. package/src/shaders/fill_outline_pattern.fragment.glsl +43 -0
  169. package/src/shaders/fill_outline_pattern.vertex.glsl +41 -0
  170. package/src/shaders/fill_pattern.fragment.glsl +36 -0
  171. package/src/shaders/fill_pattern.vertex.glsl +36 -0
  172. package/src/shaders/heatmap.fragment.glsl +21 -0
  173. package/src/shaders/heatmap.vertex.glsl +53 -0
  174. package/src/shaders/heatmap_texture.fragment.glsl +14 -0
  175. package/src/shaders/heatmap_texture.vertex.glsl +11 -0
  176. package/src/shaders/hillshade.fragment.glsl +52 -0
  177. package/src/shaders/hillshade.vertex.glsl +11 -0
  178. package/src/shaders/hillshade_prepare.fragment.glsl +72 -0
  179. package/src/shaders/hillshade_prepare.vertex.glsl +15 -0
  180. package/src/shaders/index.js +194 -0
  181. package/src/shaders/line.fragment.glsl +28 -0
  182. package/src/shaders/line.vertex.glsl +84 -0
  183. package/src/shaders/line_gradient.fragment.glsl +34 -0
  184. package/src/shaders/line_gradient.vertex.glsl +84 -0
  185. package/src/shaders/line_pattern.fragment.glsl +69 -0
  186. package/src/shaders/line_pattern.vertex.glsl +88 -0
  187. package/src/shaders/line_sdf.fragment.glsl +44 -0
  188. package/src/shaders/line_sdf.vertex.glsl +95 -0
  189. package/src/shaders/raster.fragment.glsl +52 -0
  190. package/src/shaders/raster.vertex.glsl +21 -0
  191. package/src/shaders/symbol_icon.fragment.glsl +17 -0
  192. package/src/shaders/symbol_icon.vertex.glsl +91 -0
  193. package/src/shaders/symbol_sdf.fragment.glsl +50 -0
  194. package/src/shaders/symbol_sdf.vertex.glsl +117 -0
  195. package/src/source/geojson_source.js +267 -0
  196. package/src/source/geojson_worker_source.js +210 -0
  197. package/src/source/geojson_wrapper.js +67 -0
  198. package/src/source/image_source.js +213 -0
  199. package/src/source/load_tilejson.js +40 -0
  200. package/src/source/pixels_to_tile_units.js +17 -0
  201. package/src/source/query_features.js +198 -0
  202. package/src/source/raster_dem_tile_source.js +140 -0
  203. package/src/source/raster_dem_tile_worker_source.js +26 -0
  204. package/src/source/raster_tile_source.js +126 -0
  205. package/src/source/rtl_text_plugin.js +63 -0
  206. package/src/source/source.js +75 -0
  207. package/src/source/source_cache.js +794 -0
  208. package/src/source/source_state.js +55 -0
  209. package/src/source/tile.js +332 -0
  210. package/src/source/tile_bounds.js +40 -0
  211. package/src/source/tile_cache.js +122 -0
  212. package/src/source/tile_id.js +150 -0
  213. package/src/source/vector_tile_source.js +144 -0
  214. package/src/source/vector_tile_worker_source.js +126 -0
  215. package/src/source/worker.js +175 -0
  216. package/src/source/worker_source.js +14 -0
  217. package/src/source/worker_tile.js +199 -0
  218. package/src/style/create_style_layer.js +25 -0
  219. package/src/style/evaluation_parameters.js +45 -0
  220. package/src/style/light.js +112 -0
  221. package/src/style/load_glyph_range.js +17 -0
  222. package/src/style/load_sprite.js +26 -0
  223. package/src/style/parse_glyph_pbf.js +45 -0
  224. package/src/style/pauseable_placement.js +88 -0
  225. package/src/style/properties.js +691 -0
  226. package/src/style/query_utils.js +39 -0
  227. package/src/style/style.js +955 -0
  228. package/src/style/style_layer/background_style_layer.js +11 -0
  229. package/src/style/style_layer/background_style_layer_properties.js +25 -0
  230. package/src/style/style_layer/circle_style_layer.js +93 -0
  231. package/src/style/style_layer/circle_style_layer_properties.js +76 -0
  232. package/src/style/style_layer/fill_extrusion_style_layer.js +194 -0
  233. package/src/style/style_layer/fill_extrusion_style_layer_properties.js +56 -0
  234. package/src/style/style_layer/fill_style_layer.js +46 -0
  235. package/src/style/style_layer/fill_style_layer_properties.js +45 -0
  236. package/src/style/style_layer/heatmap_style_layer.js +51 -0
  237. package/src/style/style_layer/heatmap_style_layer_properties.js +52 -0
  238. package/src/style/style_layer/hillshade_style_layer.js +15 -0
  239. package/src/style/style_layer/hillshade_style_layer_properties.js +43 -0
  240. package/src/style/style_layer/line_style_layer.js +129 -0
  241. package/src/style/style_layer/line_style_layer_properties.js +104 -0
  242. package/src/style/style_layer/raster_style_layer.js +11 -0
  243. package/src/style/style_layer/raster_style_layer_properties.js +55 -0
  244. package/src/style/style_layer/symbol_style_layer.js +66 -0
  245. package/src/style/style_layer/symbol_style_layer_properties.js +288 -0
  246. package/src/style/style_layer.js +183 -0
  247. package/src/style/style_layer_index.js +61 -0
  248. package/src/style/zoom_history.js +36 -0
  249. package/src/style-spec/deref.js +51 -0
  250. package/src/style-spec/error/parsing_error.js +8 -0
  251. package/src/style-spec/error/validation_error.js +10 -0
  252. package/src/style-spec/expression/compound_expression.js +118 -0
  253. package/src/style-spec/expression/definitions/array.js +82 -0
  254. package/src/style-spec/expression/definitions/assertion.js +69 -0
  255. package/src/style-spec/expression/definitions/at.js +57 -0
  256. package/src/style-spec/expression/definitions/case.js +73 -0
  257. package/src/style-spec/expression/definitions/coalesce.js +68 -0
  258. package/src/style-spec/expression/definitions/coercion.js +96 -0
  259. package/src/style-spec/expression/definitions/collator.js +102 -0
  260. package/src/style-spec/expression/definitions/equals.js +93 -0
  261. package/src/style-spec/expression/definitions/index.js +407 -0
  262. package/src/style-spec/expression/definitions/interpolate.js +235 -0
  263. package/src/style-spec/expression/definitions/length.js +54 -0
  264. package/src/style-spec/expression/definitions/let.js +60 -0
  265. package/src/style-spec/expression/definitions/literal.js +64 -0
  266. package/src/style-spec/expression/definitions/match.js +142 -0
  267. package/src/style-spec/expression/definitions/step.js +116 -0
  268. package/src/style-spec/expression/definitions/var.js +38 -0
  269. package/src/style-spec/expression/evaluation_context.js +35 -0
  270. package/src/style-spec/expression/index.js +329 -0
  271. package/src/style-spec/expression/is_constant.js +63 -0
  272. package/src/style-spec/expression/parsing_context.js +213 -0
  273. package/src/style-spec/expression/parsing_error.js +9 -0
  274. package/src/style-spec/expression/runtime_error.js +12 -0
  275. package/src/style-spec/expression/scope.js +34 -0
  276. package/src/style-spec/expression/stops.js +37 -0
  277. package/src/style-spec/expression/types.js +77 -0
  278. package/src/style-spec/expression/values.js +126 -0
  279. package/src/style-spec/feature_filter/README.md +55 -0
  280. package/src/style-spec/feature_filter/index.js +158 -0
  281. package/src/style-spec/function/convert.js +256 -0
  282. package/src/style-spec/function/index.js +299 -0
  283. package/src/style-spec/group_by_layout.js +68 -0
  284. package/src/style-spec/reference/v8.json +5356 -0
  285. package/src/style-spec/util/color.js +73 -0
  286. package/src/style-spec/util/color_spaces.js +128 -0
  287. package/src/style-spec/util/eval_support.js +8 -0
  288. package/src/style-spec/util/get_type.js +18 -0
  289. package/src/style-spec/util/interpolate.js +21 -0
  290. package/src/style-spec/util/properties.js +17 -0
  291. package/src/style-spec/util/ref_properties.js +1 -0
  292. package/src/style-spec/util/result.js +19 -0
  293. package/src/symbol/anchor.js +21 -0
  294. package/src/symbol/check_max_angle.js +75 -0
  295. package/src/symbol/clip_line.js +73 -0
  296. package/src/symbol/collision_feature.js +230 -0
  297. package/src/symbol/collision_index.js +379 -0
  298. package/src/symbol/cross_tile_symbol_index.js +270 -0
  299. package/src/symbol/get_anchors.js +177 -0
  300. package/src/symbol/grid_index.js +318 -0
  301. package/src/symbol/mergelines.js +75 -0
  302. package/src/symbol/opacity_state.js +21 -0
  303. package/src/symbol/placement.js +563 -0
  304. package/src/symbol/projection.js +601 -0
  305. package/src/symbol/quads.js +173 -0
  306. package/src/symbol/shaping.js +347 -0
  307. package/src/symbol/symbol_layout.js +519 -0
  308. package/src/symbol/symbol_size.js +110 -0
  309. package/src/symbol/transform_text.js +16 -0
  310. package/src/ui/anchor.js +24 -0
  311. package/src/ui/bind_handlers.js +199 -0
  312. package/src/ui/camera.js +954 -0
  313. package/src/ui/events.js +210 -0
  314. package/src/ui/handler/box_zoom.js +151 -0
  315. package/src/ui/handler/dblclick_zoom.js +91 -0
  316. package/src/ui/handler/drag_pan.js +285 -0
  317. package/src/ui/handler/drag_rotate.js +290 -0
  318. package/src/ui/handler/frame.js +28 -0
  319. package/src/ui/handler/inertia.js +45 -0
  320. package/src/ui/handler/keyboard.js +148 -0
  321. package/src/ui/handler/scroll_zoom.js +284 -0
  322. package/src/ui/handler/touch_zoom_rotate.js +263 -0
  323. package/src/ui/map.js +1645 -0
  324. package/src/util/actor.js +104 -0
  325. package/src/util/async.js +23 -0
  326. package/src/util/browser.js +61 -0
  327. package/src/util/callback.js +26 -0
  328. package/src/util/classify_rings.js +43 -0
  329. package/src/util/color_ramp.js +24 -0
  330. package/src/util/config.js +24 -0
  331. package/src/util/dictionary_coder.js +25 -0
  332. package/src/util/dispatcher.js +68 -0
  333. package/src/util/dom.js +102 -0
  334. package/src/util/evented.js +182 -0
  335. package/src/util/find_pole_of_inaccessibility.js +129 -0
  336. package/src/util/global_worker_pool.js +15 -0
  337. package/src/util/image.js +124 -0
  338. package/src/util/interpolate.js +5 -0
  339. package/src/util/intersection_tests.js +207 -0
  340. package/src/util/is_char_in_unicode_block.js +287 -0
  341. package/src/util/loader/image.js +32 -0
  342. package/src/util/object.js +178 -0
  343. package/src/util/script_detection.js +337 -0
  344. package/src/util/struct_array.js +197 -0
  345. package/src/util/task_queue.js +57 -0
  346. package/src/util/throttle.js +26 -0
  347. package/src/util/tile_cover.js +114 -0
  348. package/src/util/token.js +13 -0
  349. package/src/util/unique_id.js +12 -0
  350. package/src/util/util.js +192 -0
  351. package/src/util/vectortile_to_geojson.js +44 -0
  352. package/src/util/verticalize_punctuation.js +112 -0
  353. package/src/util/warn.js +21 -0
  354. package/src/util/web_worker.js +5 -0
  355. package/src/util/web_worker_transfer.js +228 -0
  356. package/src/util/worker_pool.js +41 -0
@@ -0,0 +1,73 @@
1
+ const assert = require('assert');
2
+
3
+ const { BooleanType } = require('../types');
4
+
5
+ class Case {
6
+ constructor(type, branches, otherwise) {
7
+ this.type = type;
8
+ this.branches = branches;
9
+ this.otherwise = otherwise;
10
+ }
11
+
12
+ static parse(args, context) {
13
+ if (args.length < 4) return context.error(`Expected at least 3 arguments, but found only ${args.length - 1}.`);
14
+ if (args.length % 2 !== 0) return context.error('Expected an odd number of arguments.');
15
+
16
+ let outputType;
17
+ if (context.expectedType && context.expectedType.kind !== 'value') {
18
+ outputType = context.expectedType;
19
+ }
20
+
21
+ const branches = [];
22
+ for (let i = 1; i < args.length - 1; i += 2) {
23
+ const test = context.parse(args[i], i, BooleanType);
24
+ if (!test) return null;
25
+
26
+ const result = context.parse(args[i + 1], i + 1, outputType);
27
+ if (!result) return null;
28
+
29
+ branches.push([test, result]);
30
+
31
+ outputType = outputType || result.type;
32
+ }
33
+
34
+ const otherwise = context.parse(args[args.length - 1], args.length - 1, outputType);
35
+ if (!otherwise) return null;
36
+
37
+ assert(outputType);
38
+ return new Case(outputType, branches, otherwise);
39
+ }
40
+
41
+ evaluate(ctx) {
42
+ for (const [test, expression] of this.branches) {
43
+ if (test.evaluate(ctx)) {
44
+ return expression.evaluate(ctx);
45
+ }
46
+ }
47
+ return this.otherwise.evaluate(ctx);
48
+ }
49
+
50
+ eachChild(fn) {
51
+ for (const [test, expression] of this.branches) {
52
+ fn(test);
53
+ fn(expression);
54
+ }
55
+ fn(this.otherwise);
56
+ }
57
+
58
+ possibleOutputs() {
59
+ return []
60
+ .concat(...this.branches.map(branch => branch[1].possibleOutputs()))
61
+ .concat(this.otherwise.possibleOutputs());
62
+ }
63
+
64
+ serialize() {
65
+ const serialized = ['case'];
66
+ this.eachChild(child => {
67
+ serialized.push(child.serialize());
68
+ });
69
+ return serialized;
70
+ }
71
+ }
72
+
73
+ module.exports = Case;
@@ -0,0 +1,68 @@
1
+ const assert = require('assert');
2
+
3
+ const { checkSubtype, ValueType } = require('../types');
4
+
5
+ class Coalesce {
6
+ constructor(type, args) {
7
+ this.type = type;
8
+ this.args = args;
9
+ }
10
+
11
+ static parse(args, context) {
12
+ if (args.length < 2) {
13
+ return context.error('Expectected at least one argument.');
14
+ }
15
+ let outputType = null;
16
+ const expectedType = context.expectedType;
17
+ if (expectedType && expectedType.kind !== 'value') {
18
+ outputType = expectedType;
19
+ }
20
+ const parsedArgs = [];
21
+
22
+ for (const arg of args.slice(1)) {
23
+ const parsed = context.parse(arg, 1 + parsedArgs.length, outputType, undefined, {
24
+ omitTypeAnnotations: true
25
+ });
26
+ if (!parsed) return null;
27
+ outputType = outputType || parsed.type;
28
+ parsedArgs.push(parsed);
29
+ }
30
+ assert(outputType);
31
+
32
+ // Above, we parse arguments without inferred type annotation so that
33
+ // they don't produce a runtime error for `null` input, which would
34
+ // preempt the desired null-coalescing behavior.
35
+ // Thus, if any of our arguments would have needed an annotation, we
36
+ // need to wrap the enclosing coalesce expression with it instead.
37
+ const needsAnnotation = expectedType && parsedArgs.some(arg => checkSubtype(expectedType, arg.type));
38
+
39
+ return needsAnnotation ? new Coalesce(ValueType, parsedArgs) : new Coalesce(outputType, parsedArgs);
40
+ }
41
+
42
+ evaluate(ctx) {
43
+ let result = null;
44
+ for (const arg of this.args) {
45
+ result = arg.evaluate(ctx);
46
+ if (result !== null) break;
47
+ }
48
+ return result;
49
+ }
50
+
51
+ eachChild(fn) {
52
+ this.args.forEach(fn);
53
+ }
54
+
55
+ possibleOutputs() {
56
+ return [].concat(...this.args.map(arg => arg.possibleOutputs()));
57
+ }
58
+
59
+ serialize() {
60
+ const serialized = ['coalesce'];
61
+ this.eachChild(child => {
62
+ serialized.push(child.serialize());
63
+ });
64
+ return serialized;
65
+ }
66
+ }
67
+
68
+ module.exports = Coalesce;
@@ -0,0 +1,96 @@
1
+ const assert = require('assert');
2
+
3
+ const { ColorType, ValueType, NumberType } = require('../types');
4
+ const { Color, validateRGBA } = require('../values');
5
+ const RuntimeError = require('../runtime_error');
6
+
7
+ const types = {
8
+ 'to-number': NumberType,
9
+ 'to-color': ColorType
10
+ };
11
+
12
+ /**
13
+ * Special form for error-coalescing coercion expressions "to-number",
14
+ * "to-color". Since these coercions can fail at runtime, they accept multiple
15
+ * arguments, only evaluating one at a time until one succeeds.
16
+ *
17
+ * @private
18
+ */
19
+ class Coercion {
20
+ constructor(type, args) {
21
+ this.type = type;
22
+ this.args = args;
23
+ }
24
+
25
+ static parse(args, context) {
26
+ if (args.length < 2) return context.error('Expected at least one argument.');
27
+
28
+ const name = args[0];
29
+ assert(types[name], name);
30
+
31
+ const type = types[name];
32
+
33
+ const parsed = [];
34
+ for (let i = 1; i < args.length; i++) {
35
+ const input = context.parse(args[i], i, ValueType);
36
+ if (!input) return null;
37
+ parsed.push(input);
38
+ }
39
+
40
+ return new Coercion(type, parsed);
41
+ }
42
+
43
+ evaluate(ctx) {
44
+ if (this.type.kind === 'color') {
45
+ let input;
46
+ let error;
47
+ for (const arg of this.args) {
48
+ input = arg.evaluate(ctx);
49
+ error = null;
50
+ if (typeof input === 'string') {
51
+ const c = ctx.parseColor(input);
52
+ if (c) return c;
53
+ } else if (Array.isArray(input)) {
54
+ if (input.length < 3 || input.length > 4) {
55
+ error = `Invalid rbga value ${JSON.stringify(input)}: expected an array containing either three or four numeric values.`;
56
+ } else {
57
+ error = validateRGBA(input[0], input[1], input[2], input[3]);
58
+ }
59
+ if (!error) {
60
+ return new Color(input[0] / 255, input[1] / 255, input[2] / 255, input[3]);
61
+ }
62
+ }
63
+ }
64
+ throw new RuntimeError(
65
+ error || `Could not parse color from value '${typeof input === 'string' ? input : JSON.stringify(input)}'`
66
+ );
67
+ }
68
+ let value = null;
69
+ for (const arg of this.args) {
70
+ value = arg.evaluate(ctx);
71
+ if (value === null) continue;
72
+ const num = Number(value);
73
+ if (isNaN(num)) continue;
74
+ return num;
75
+ }
76
+ throw new RuntimeError(`Could not convert ${JSON.stringify(value)} to number.`);
77
+ }
78
+
79
+ eachChild(fn) {
80
+ this.args.forEach(fn);
81
+ }
82
+
83
+ possibleOutputs() {
84
+ return [].concat(...this.args.map(arg => arg.possibleOutputs()));
85
+ }
86
+
87
+ serialize() {
88
+ const serialized = [`to-${this.type.kind}`];
89
+ this.eachChild(child => {
90
+ serialized.push(child.serialize());
91
+ });
92
+ return serialized;
93
+ }
94
+ }
95
+
96
+ module.exports = Coercion;
@@ -0,0 +1,102 @@
1
+ const { StringType, BooleanType, CollatorType } = require('../types');
2
+
3
+ class Collator {
4
+ constructor(caseSensitive, diacriticSensitive, locale) {
5
+ if (caseSensitive) this.sensitivity = diacriticSensitive ? 'variant' : 'case';
6
+ else this.sensitivity = diacriticSensitive ? 'accent' : 'base';
7
+
8
+ this.locale = locale;
9
+ this.collator = new Intl.Collator(this.locale ? this.locale : [], {
10
+ sensitivity: this.sensitivity,
11
+ usage: 'search'
12
+ });
13
+ }
14
+
15
+ compare(lhs, rhs) {
16
+ return this.collator.compare(lhs, rhs);
17
+ }
18
+
19
+ resolvedLocale() {
20
+ // We create a Collator without "usage: search" because we don't want
21
+ // the search options encoded in our result (e.g. "en-u-co-search")
22
+ return new Intl.Collator(this.locale ? this.locale : []).resolvedOptions().locale;
23
+ }
24
+ }
25
+
26
+ class CollatorExpression {
27
+ constructor(caseSensitive, diacriticSensitive, locale) {
28
+ this.type = CollatorType;
29
+ this.locale = locale;
30
+ this.caseSensitive = caseSensitive;
31
+ this.diacriticSensitive = diacriticSensitive;
32
+ }
33
+
34
+ static parse(args, context) {
35
+ if (args.length !== 2) return context.error('Expected one argument.');
36
+
37
+ const options = args[1];
38
+ if (typeof options !== 'object' || Array.isArray(options))
39
+ return context.error('Collator options argument must be an object.');
40
+
41
+ const caseSensitive = context.parse(
42
+ options['case-sensitive'] === undefined ? false : options['case-sensitive'],
43
+ 1,
44
+ BooleanType
45
+ );
46
+ if (!caseSensitive) return null;
47
+
48
+ const diacriticSensitive = context.parse(
49
+ options['diacritic-sensitive'] === undefined ? false : options['diacritic-sensitive'],
50
+ 1,
51
+ BooleanType
52
+ );
53
+ if (!diacriticSensitive) return null;
54
+
55
+ let locale = null;
56
+ if (options['locale']) {
57
+ locale = context.parse(options['locale'], 1, StringType);
58
+ if (!locale) return null;
59
+ }
60
+
61
+ return new CollatorExpression(caseSensitive, diacriticSensitive, locale);
62
+ }
63
+
64
+ evaluate(ctx) {
65
+ return new Collator(
66
+ this.caseSensitive.evaluate(ctx),
67
+ this.diacriticSensitive.evaluate(ctx),
68
+ this.locale ? this.locale.evaluate(ctx) : null
69
+ );
70
+ }
71
+
72
+ eachChild(fn) {
73
+ fn(this.caseSensitive);
74
+ fn(this.diacriticSensitive);
75
+ if (this.locale) {
76
+ fn(this.locale);
77
+ }
78
+ }
79
+
80
+ possibleOutputs() {
81
+ // Technically the set of possible outputs is the combinatoric set of Collators produced
82
+ // by all possibleOutputs of locale/caseSensitive/diacriticSensitive
83
+ // But for the primary use of Collators in comparison operators, we ignore the Collator's
84
+ // possibleOutputs anyway, so we can get away with leaving this undefined for now.
85
+ return [undefined];
86
+ }
87
+
88
+ serialize() {
89
+ const options = {};
90
+ options['case-sensitive'] = this.caseSensitive.serialize();
91
+ options['diacritic-sensitive'] = this.diacriticSensitive.serialize();
92
+ if (this.locale) {
93
+ options['locale'] = this.locale.serialize();
94
+ }
95
+ return ['collator', options];
96
+ }
97
+ }
98
+
99
+ module.exports = {
100
+ Collator,
101
+ CollatorExpression
102
+ };
@@ -0,0 +1,93 @@
1
+ const { toString, ValueType, BooleanType, CollatorType } = require('../types');
2
+
3
+ function isComparableType(type) {
4
+ return type.kind === 'string' || type.kind === 'number' || type.kind === 'boolean' || type.kind === 'null';
5
+ }
6
+
7
+ /**
8
+ * Special form for ==, !=, implementing the following signatures:
9
+ * - (T1: Comparable, T2: Comparable) => boolean { T1 == T2 }
10
+ * - (Comparable, value) => boolean
11
+ * - (value, Comparable) => boolean
12
+ *
13
+ * Where Comparable = string | number | boolean | null.
14
+ *
15
+ * Evaluation semantics for the value cases are equivalent to Javascript's
16
+ * strict equality (===/!==) -- i.e., when the value argument's type doesn't
17
+ * match that of the Comparable argument, == evaluates to false, != to true.
18
+ *
19
+ * @private
20
+ */
21
+ function makeComparison(op, negate) {
22
+ return class Comparison {
23
+ constructor(lhs, rhs, collator) {
24
+ this.type = BooleanType;
25
+ this.lhs = lhs;
26
+ this.rhs = rhs;
27
+ this.collator = collator;
28
+ }
29
+
30
+ static parse(args, context) {
31
+ if (args.length !== 3 && args.length !== 4) return context.error('Expected two or three arguments.');
32
+
33
+ const lhs = context.parse(args[1], 1, ValueType);
34
+ if (!lhs) return null;
35
+ const rhs = context.parse(args[2], 2, ValueType);
36
+ if (!rhs) return null;
37
+
38
+ if (!isComparableType(lhs.type) && !isComparableType(rhs.type)) {
39
+ return context.error(
40
+ `Expected at least one argument to be a string, number, boolean, or null, but found (${toString(lhs.type)}, ${toString(rhs.type)}) instead.`
41
+ );
42
+ }
43
+
44
+ if (lhs.type.kind !== rhs.type.kind && lhs.type.kind !== 'value' && rhs.type.kind !== 'value') {
45
+ return context.error(`Cannot compare ${toString(lhs.type)} and ${toString(rhs.type)}.`);
46
+ }
47
+
48
+ let collator = null;
49
+ if (args.length === 4) {
50
+ if (lhs.type.kind !== 'string' && rhs.type.kind !== 'string') {
51
+ return context.error('Cannot use collator to compare non-string types.');
52
+ }
53
+ collator = context.parse(args[3], 3, CollatorType);
54
+ if (!collator) return null;
55
+ }
56
+
57
+ return new Comparison(lhs, rhs, collator);
58
+ }
59
+
60
+ evaluate(ctx) {
61
+ const equal = this.collator
62
+ ? this.collator.evaluate(ctx).compare(this.lhs.evaluate(ctx), this.rhs.evaluate(ctx)) === 0
63
+ : this.lhs.evaluate(ctx) === this.rhs.evaluate(ctx);
64
+
65
+ return negate ? !equal : equal;
66
+ }
67
+
68
+ eachChild(fn) {
69
+ fn(this.lhs);
70
+ fn(this.rhs);
71
+ if (this.collator) {
72
+ fn(this.collator);
73
+ }
74
+ }
75
+
76
+ possibleOutputs() {
77
+ return [true, false];
78
+ }
79
+
80
+ serialize() {
81
+ const serialized = [op];
82
+ this.eachChild(child => {
83
+ serialized.push(child.serialize());
84
+ });
85
+ return serialized;
86
+ }
87
+ };
88
+ }
89
+
90
+ module.exports = {
91
+ Equals: makeComparison('==', false),
92
+ NotEquals: makeComparison('!=', true)
93
+ };