diff --git a/rails/app/assets/stylesheets/components/_balloon.scss b/rails/app/assets/stylesheets/components/_balloon.scss index d0dcc5dec..fa6094a13 100644 --- a/rails/app/assets/stylesheets/components/_balloon.scss +++ b/rails/app/assets/stylesheets/components/_balloon.scss @@ -42,7 +42,7 @@ width: 100%; } - .mapboxgl-popup-content { + .mapboxgl-popup-content, .maplibregl-popup-content { h1, h2, h3, h4, h5, p, img { margin: 0; } diff --git a/rails/app/assets/stylesheets/components/home.scss b/rails/app/assets/stylesheets/components/home.scss index e1aa2c049..2aa3c99b5 100644 --- a/rails/app/assets/stylesheets/components/home.scss +++ b/rails/app/assets/stylesheets/components/home.scss @@ -1,4 +1,4 @@ -.mapboxgl-map.ts-MainMap { +.mapboxgl-map.ts-MainMap, .maplibregl-map.ts-MainMap { position: fixed; height: 100%; width: 100%; diff --git a/rails/app/assets/stylesheets/dashboard.sass.scss b/rails/app/assets/stylesheets/dashboard.sass.scss index b9ab13e62..cc34a10da 100644 --- a/rails/app/assets/stylesheets/dashboard.sass.scss +++ b/rails/app/assets/stylesheets/dashboard.sass.scss @@ -1,4 +1,5 @@ @import 'mapbox-gl/dist/mapbox-gl'; +@import 'maplibre-gl/dist/maplibre-gl'; @import 'core/reset'; @import 'core/colors'; diff --git a/rails/app/assets/stylesheets/react.sass.scss b/rails/app/assets/stylesheets/react.sass.scss index 4bfcf585f..8c2df3609 100644 --- a/rails/app/assets/stylesheets/react.sass.scss +++ b/rails/app/assets/stylesheets/react.sass.scss @@ -1,4 +1,5 @@ @import 'mapbox-gl/dist/mapbox-gl'; +@import 'maplibre-gl/dist/maplibre-gl'; @import 'core/core'; @import 'components/components'; diff --git a/rails/app/javascript/components/App.jsx b/rails/app/javascript/components/App.jsx index 30ed165bc..f0e0b5c29 100644 --- a/rails/app/javascript/components/App.jsx +++ b/rails/app/javascript/components/App.jsx @@ -347,7 +347,7 @@ class App extends Component { points={this.state.points} mapboxAccessToken={this.props.mapbox_access_token} useLocalMapServer={this.props.use_local_map_server} - mapboxStyle={this.props.mapbox_style} + mapStyle={this.props.mapbox_style} mapbox3d={this.props.mapbox_3d} mapProjection={this.props.map_projection} clearFilteredStories={this.resetStoriesAndMap} diff --git a/rails/app/javascript/components/Map.jsx b/rails/app/javascript/components/Map.jsx index 984a435b9..edbb39d26 100644 --- a/rails/app/javascript/components/Map.jsx +++ b/rails/app/javascript/components/Map.jsx @@ -1,11 +1,10 @@ import ReactDOM from "react-dom"; import React, { Component } from "react"; import PropTypes from "prop-types"; -import Minimap from "../vendor/mapboxgl-control-minimap.js"; import Popup from "./Popup"; -import mapboxgl from '!mapbox-gl'; import 'mapbox-gl/dist/mapbox-gl.css'; +import 'maplibre-gl/dist/maplibre-gl.css'; import center from '@turf/center' import bboxPolygon from '@turf/bbox-polygon' @@ -16,9 +15,12 @@ const STORY_POINTS_DATA_SOURCE = "ts-points-data"; export default class Map extends Component { constructor(props) { super(props); - mapboxgl.accessToken = this.props.mapboxAccessToken; this.state = { - activePopup: null + activePopup: null, + mapGL: null, + isMapLibre: false, + mapModule: null, + minimapModule: null }; } @@ -27,7 +29,7 @@ export default class Map extends Component { points: PropTypes.object, framedView: PropTypes.object, onMapPointClick: PropTypes.func, - mapboxStyle: PropTypes.string, + mapStyle: PropTypes.string, mapboxAccessToken: PropTypes.string, mapbox3d: PropTypes.bool, mapProjection: PropTypes.string, @@ -37,15 +39,82 @@ export default class Map extends Component { }; componentDidMount() { - this.map = new mapboxgl.Map({ - container: this.mapContainer, - style: this.props.mapboxStyle, - center: [this.props.centerLong, this.props.centerLat], - zoom: this.props.zoom, - maxBounds: this.checkBounds(), // check for bounding box presence - pitch: this.props.pitch, - bearing: this.props.bearing, - projection: this.props.mapProjection + if (this.props.useLocalMapServer) { + if (!this.state.mapModule) { + import('!maplibre-gl').then(module => { + this.setState({ mapModule: module.default }, () => { + this.initializeMap(this.state.mapModule, true); + }); + }); + } else { + this.initializeMap(this.state.mapModule, true); + } + } else { + if (!this.state.mapModule || !this.state.minimapModule) { + Promise.all([ + import('!mapbox-gl'), + import('../vendor/mapboxgl-control-minimap.js') + ]).then(([mapboxGLModule, minimapModule]) => { + this.setState({ + mapModule: mapboxGLModule.default, + minimapModule: minimapModule.default + }, () => { + this.Minimap = this.state.minimapModule; + this.initializeMap(this.state.mapModule, false); + }); + }); + } else { + this.Minimap = this.state.minimapModule; + this.initializeMap(this.state.mapModule, false); + } + } + } + + componentDidUpdate(prevProps, prevState) { + if (!this.map) { + return; + } + + if (prevProps.points !== this.props.points) { + this.updateMapPoints(); + } + + if (prevProps.activePoint && !this.props.activePoint) { + this.closeActivePopup(); + } + + // Open active popup + if (this.props.activePoint && prevProps.activePoint !== this.props.activePoint) { + this.openPopup(this.props.activePoint); + } + + // Set map framed view + if ( + this.props.framedView && + this.props.framedView !== prevProps.framedView + ) { + const { bounds, ...frameOptions } = this.props.framedView; + if (bounds) { + const bboxPoly = bboxPolygon(bounds); + const centerPoint = center(bboxPoly).geometry.coordinates; + this.map.fitBounds(bounds, { center: centerPoint, padding: 50, duration: 2000.0, maxZoom: 12, ...frameOptions }); + } else { + this.map.easeTo({ duration: 2000.0, ...frameOptions }); + } + } + } + + initializeMap(mapGL, isMapLibre) { + mapGL.accessToken = this.props.useLocalMapServer ? 'pk.ey' : this.props.mapboxAccessToken; + this.map = new mapGL.Map({ + container: this.mapContainer, + style: this.props.mapStyle, + center: [this.props.centerLong, this.props.centerLat], + zoom: this.props.zoom, + maxBounds: this.checkBounds(), // check for bounding box presence + pitch: this.props.pitch, + bearing: this.props.bearing, + projection: this.props.mapProjection }); this.map.on("load", () => { @@ -112,10 +181,10 @@ export default class Map extends Component { }); // Hide minimap and nav controls for offline Terrastories - if(!this.props.useLocalMapServer) { - this.map.addControl(new Minimap( + if(!isMapLibre && this.Minimap) { + this.map.addControl(new this.Minimap( { - style: "mapbox://styles/mapbox/light-v10", + style: this.props.mapStyle, zoomLevels: [ [18, 14, 16], [16, 12, 14], @@ -132,7 +201,12 @@ export default class Map extends Component { }), "top-right"); } - this.map.addControl(new mapboxgl.NavigationControl()); + this.map.addControl(new mapGL.NavigationControl()); + + // Add Maplibre logo for offline Terrastories + if(isMapLibre) { + this.map.addControl(new mapGL.LogoControl(), 'bottom-right'); + } // Change mouse pointer when hovering over ts-marker points this.map.on('mouseenter', STORY_POINTS_LAYER_ID, () => { @@ -149,36 +223,11 @@ export default class Map extends Component { this.map.on('mouseleave', 'clusters', () => { this.map.getCanvas().style.cursor = '' }) - } - - componentDidUpdate(prevProps, prevState) { - if (prevProps.points !== this.props.points) { - this.updateMapPoints(); - } - - if (prevProps.activePoint && !this.props.activePoint) { - this.closeActivePopup(); - } - // Open active popup - if (this.props.activePoint && prevProps.activePoint !== this.props.activePoint) { - this.openPopup(this.props.activePoint); - } - - // Set map framed view - if ( - this.props.framedView && - this.props.framedView !== prevProps.framedView - ) { - const { bounds, ...frameOptions } = this.props.framedView; - if (bounds) { - const bboxPoly = bboxPolygon(bounds); - const centerPoint = center(bboxPoly).geometry.coordinates; - this.map.fitBounds(bounds, { center: centerPoint, padding: 50, duration: 2000.0, maxZoom: 12, ...frameOptions }); - } else { - this.map.easeTo({ duration: 2000.0, ...frameOptions }); - } - } + this.setState({ + mapGL: mapGL, + isMapLibre: isMapLibre + }); } addMapPoints() { @@ -296,7 +345,7 @@ export default class Map extends Component { this.closeActivePopup(); }} />, popupNode); // set popup on map - const popup = new mapboxgl.Popup({ + const popup = new this.state.mapGL.Popup({ offset: 15, className: "ts-markerPopup", closeButton: false, // We add our own custom close button @@ -332,9 +381,7 @@ export default class Map extends Component { addHomeButton() { const homeButton = this.createHomeButton(); - const navControl = document.getElementsByClassName( - "mapboxgl-ctrl-zoom-in" - )[0]; + let navControl = document.querySelectorAll('button[class$="-ctrl-zoom-in"]')[0]; if (navControl) { navControl.parentNode.insertBefore(homeButton, navControl); } diff --git a/rails/package.json b/rails/package.json index b91f4e0f6..104336abd 100644 --- a/rails/package.json +++ b/rails/package.json @@ -32,6 +32,7 @@ "i18next-http-backend": "^2.1.1", "jest": "24.0.0", "mapbox-gl": "^2.12.0", + "maplibre-gl": "^3.3.1", "prop-types": "^15.8.1", "react": "^18.2.0", "react-dom": "^18.2.0", diff --git a/rails/yarn.lock b/rails/yarn.lock index 0a032a841..a2c80b96a 100644 --- a/rails/yarn.lock +++ b/rails/yarn.lock @@ -1341,7 +1341,7 @@ get-stream "^6.0.1" minimist "^1.2.6" -"@mapbox/jsonlint-lines-primitives@^2.0.2": +"@mapbox/jsonlint-lines-primitives@^2.0.2", "@mapbox/jsonlint-lines-primitives@~2.0.2": version "2.0.2" resolved "https://registry.yarnpkg.com/@mapbox/jsonlint-lines-primitives/-/jsonlint-lines-primitives-2.0.2.tgz#ce56e539f83552b58d10d672ea4d6fc9adc7b234" integrity sha512-rY0o9A5ECsTQRVhv7tL/OyDpGAoUB4tTvLiW1DSzQGq4bvTPhNw1VpSNjDJc5GFZ2XuyOtSWSVN05qOtcD71qQ== @@ -1378,6 +1378,18 @@ resolved "https://registry.yarnpkg.com/@mapbox/whoots-js/-/whoots-js-3.1.0.tgz#497c67a1cef50d1a2459ba60f315e448d2ad87fe" integrity sha512-Es6WcD0nO5l+2BOQS4uLfNPYQaNDfbot3X1XUoloz+x0mPDS3eeORZJl06HXjwBG1fOGwCRnzK88LMdxKRrd6Q== +"@maplibre/maplibre-gl-style-spec@^19.3.0": + version "19.3.1" + resolved "https://registry.yarnpkg.com/@maplibre/maplibre-gl-style-spec/-/maplibre-gl-style-spec-19.3.1.tgz#f0e74e8e6db2afcc4fed53f325f850c12dcdd5c5" + integrity sha512-ss5+b3/a8I1wD5PYmAYPYxg0Nag0cxvw4GGOnQroTP59sobTPI3KeHP9OjUr/es7uNtYEodr54fgoEnCBF6gaQ== + dependencies: + "@mapbox/jsonlint-lines-primitives" "~2.0.2" + "@mapbox/unitbezier" "^0.0.1" + json-stringify-pretty-compact "^3.0.0" + minimist "^1.2.8" + rw "^1.3.3" + sort-object "^3.0.3" + "@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1": version "5.1.1-v1" resolved "https://registry.yarnpkg.com/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz#dbf733a965ca47b1973177dc0bb6c889edcfb129" @@ -1520,6 +1532,11 @@ dependencies: "@types/node" "*" +"@types/geojson@*", "@types/geojson@^7946.0.10": + version "7946.0.11" + resolved "https://registry.yarnpkg.com/@types/geojson/-/geojson-7946.0.11.tgz#012c17cb2256ad8de78560da851ab914a7b9b40e" + integrity sha512-L7A0AINMXQpVwxHJ4jxD6/XjZ4NDufaRlUJHjNIFKYUFBH1SvOW+neaqb0VTRSLW5suSrSu19ObFEFnfNcr+qg== + "@types/glob@^7.1.1": version "7.2.0" resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.2.0.tgz#bc1b5bf3aa92f25bd5dd39f35c57361bdce5b2eb" @@ -1558,6 +1575,20 @@ resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== +"@types/mapbox__point-geometry@*", "@types/mapbox__point-geometry@^0.1.2": + version "0.1.2" + resolved "https://registry.yarnpkg.com/@types/mapbox__point-geometry/-/mapbox__point-geometry-0.1.2.tgz#488a9b76e8457d6792ea2504cdd4ecdd9860a27e" + integrity sha512-D0lgCq+3VWV85ey1MZVkE8ZveyuvW5VAfuahVTQRpXFQTxw03SuIf1/K4UQ87MMIXVKzpFjXFiFMZzLj2kU+iA== + +"@types/mapbox__vector-tile@^1.3.0": + version "1.3.0" + resolved "https://registry.yarnpkg.com/@types/mapbox__vector-tile/-/mapbox__vector-tile-1.3.0.tgz#8fa1379dbaead1e1b639b8d96cfd174404c379d6" + integrity sha512-kDwVreQO5V4c8yAxzZVQLE5tyWF+IPToAanloQaSnwfXmIcJ7cyOrv8z4Ft4y7PsLYmhWXmON8MBV8RX0Rgr8g== + dependencies: + "@types/geojson" "*" + "@types/mapbox__point-geometry" "*" + "@types/pbf" "*" + "@types/minimatch@*": version "5.1.2" resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-5.1.2.tgz#07508b45797cb81ec3f273011b054cd0755eddca" @@ -1578,6 +1609,11 @@ resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== +"@types/pbf@*", "@types/pbf@^3.0.2": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@types/pbf/-/pbf-3.0.2.tgz#8d291ad68b4b8c533e96c174a2e3e6399a59ed61" + integrity sha512-EDrLIPaPXOZqDjrkzxxbX7UlJSeQVgah3i0aA4pOSzmK9zq3BIh7/MZIQxED7slJByvKM4Gc6Hypyu2lJzh3SQ== + "@types/prop-types@*": version "15.7.5" resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.5.tgz#5f19d2b85a98e9558036f6a3cacc8819420f05cf" @@ -1614,6 +1650,13 @@ resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-1.0.1.tgz#0a851d3bd96498fa25c33ab7278ed3bd65f06c3e" integrity sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw== +"@types/supercluster@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@types/supercluster/-/supercluster-7.1.0.tgz#67b7466c93a7d25b6e79a3c7cad885a79420aeb4" + integrity sha512-6JapQ2GmEkH66r23BK49I+u6zczVDGTtiJEVvKDYZVSm/vepWaJuTq6BXzJ6I4agG5s8vA1KM7m/gXWDg03O4Q== + dependencies: + "@types/geojson" "*" + "@types/yargs-parser@*": version "21.0.0" resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.0.tgz#0c60e537fa790f5f9472ed2776c2b71ec117351b" @@ -2604,6 +2647,21 @@ bytes@3.1.2: resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== +bytewise-core@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/bytewise-core/-/bytewise-core-1.2.3.tgz#3fb410c7e91558eb1ab22a82834577aa6bd61d42" + integrity sha512-nZD//kc78OOxeYtRlVk8/zXqTB4gf/nlguL1ggWA8FuchMyOxcyHR4QPQZMUmA7czC+YnaBrPUCubqAWe50DaA== + dependencies: + typewise-core "^1.2" + +bytewise@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/bytewise/-/bytewise-1.1.0.tgz#1d13cbff717ae7158094aa881b35d081b387253e" + integrity sha512-rHuuseJ9iQ0na6UDhnrRVDh8YnWVlU6xM3VH6q/+yHDeUH2zIhUzP+2/h3LIrhLDBtTqzWpE3p3tP/boefskKQ== + dependencies: + bytewise-core "^1.2.2" + typewise "^1.0.3" + cacache@^12.0.2: version "12.0.4" resolved "https://registry.yarnpkg.com/cacache/-/cacache-12.0.4.tgz#668bcbd105aeb5f1d92fe25570ec9525c8faa40c" @@ -4770,7 +4828,7 @@ get-symbol-description@^1.0.0: call-bind "^1.0.2" get-intrinsic "^1.1.1" -get-value@^2.0.3, get-value@^2.0.6: +get-value@^2.0.2, get-value@^2.0.3, get-value@^2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" integrity sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA== @@ -6271,6 +6329,11 @@ json-stable-stringify-without-jsonify@^1.0.1: resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== +json-stringify-pretty-compact@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/json-stringify-pretty-compact/-/json-stringify-pretty-compact-3.0.0.tgz#f71ef9d82ef16483a407869556588e91b681d9ab" + integrity sha512-Rc2suX5meI0S3bfdZuA7JMFBGkJ875ApfVyq2WHELjBiiG22My/l7/8zPpH/CfFVQHuVLd8NLR0nv6vi0BYYKA== + json-stringify-safe@~5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" @@ -6311,6 +6374,11 @@ kdbush@^3.0.0: resolved "https://registry.yarnpkg.com/kdbush/-/kdbush-3.0.0.tgz#f8484794d47004cc2d85ed3a79353dbe0abc2bf0" integrity sha512-hRkd6/XW4HTsA9vjVpY9tuXJYLSlelnkTmVFu4M9/7MIYQtFcHpbugAU7UbOfjOiVSVYl2fqgBuJ32JUmRo5Ew== +kdbush@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/kdbush/-/kdbush-4.0.2.tgz#2f7b7246328b4657dd122b6c7f025fbc2c868e39" + integrity sha512-WbCVYJ27Sz8zi9Q7Q0xHC+05iwkm3Znipc2XTlrnJbsHMYktW4hPhXUE8Ys1engBrvffoSCqbil1JQAa7clRpA== + killable@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/killable/-/killable-1.0.1.tgz#4c8ce441187a061c7474fb87ca08e2a638194892" @@ -6596,6 +6664,37 @@ mapbox-gl@^2.12.0: tinyqueue "^2.0.3" vt-pbf "^3.1.3" +maplibre-gl@^3.3.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/maplibre-gl/-/maplibre-gl-3.3.1.tgz#150e48d80813b72b66b89156446298c72dca4ca0" + integrity sha512-SfRq9bT68GytDzCOG0IoTGg2rASbgdYunW/6xhnp55QuLmwG1M/YOlXxqHaphwia7kZbMvBOocvY0fp5yfTjZA== + dependencies: + "@mapbox/geojson-rewind" "^0.5.2" + "@mapbox/jsonlint-lines-primitives" "^2.0.2" + "@mapbox/point-geometry" "^0.1.0" + "@mapbox/tiny-sdf" "^2.0.6" + "@mapbox/unitbezier" "^0.0.1" + "@mapbox/vector-tile" "^1.3.1" + "@mapbox/whoots-js" "^3.1.0" + "@maplibre/maplibre-gl-style-spec" "^19.3.0" + "@types/geojson" "^7946.0.10" + "@types/mapbox__point-geometry" "^0.1.2" + "@types/mapbox__vector-tile" "^1.3.0" + "@types/pbf" "^3.0.2" + "@types/supercluster" "^7.1.0" + earcut "^2.2.4" + geojson-vt "^3.2.1" + gl-matrix "^3.4.3" + global-prefix "^3.0.0" + kdbush "^4.0.2" + murmurhash-js "^1.0.0" + pbf "^3.2.1" + potpack "^2.0.0" + quickselect "^2.0.0" + supercluster "^8.0.1" + tinyqueue "^2.0.3" + vt-pbf "^3.1.3" + md5.js@^1.3.4: version "1.3.5" resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" @@ -6732,7 +6831,7 @@ minimatch@^3.0.4, minimatch@^3.1.1, minimatch@^3.1.2: dependencies: brace-expansion "^1.1.7" -minimist@^1.1.1, minimist@^1.2.0, minimist@^1.2.6: +minimist@^1.1.1, minimist@^1.2.0, minimist@^1.2.6, minimist@^1.2.8: version "1.2.8" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== @@ -9255,6 +9354,16 @@ sockjs@^0.3.21: uuid "^8.3.2" websocket-driver "^0.7.4" +sort-asc@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/sort-asc/-/sort-asc-0.2.0.tgz#00a49e947bc25d510bfde2cbb8dffda9f50eb2fc" + integrity sha512-umMGhjPeHAI6YjABoSTrFp2zaBtXBej1a0yKkuMUyjjqu6FJsTF+JYwCswWDg+zJfk/5npWUUbd33HH/WLzpaA== + +sort-desc@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/sort-desc/-/sort-desc-0.2.0.tgz#280c1bdafc6577887cedbad1ed2e41c037976646" + integrity sha512-NqZqyvL4VPW+RAxxXnB8gvE1kyikh8+pR+T+CXLksVRN9eiQqkQlPwqWYU0mF9Jm7UnctShlxLyAt1CaBOTL1w== + sort-keys@^1.0.0: version "1.1.2" resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-1.1.2.tgz#441b6d4d346798f1b4e49e8920adfba0e543f9ad" @@ -9262,6 +9371,18 @@ sort-keys@^1.0.0: dependencies: is-plain-obj "^1.0.0" +sort-object@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/sort-object/-/sort-object-3.0.3.tgz#945727165f244af9dc596ad4c7605a8dee80c269" + integrity sha512-nK7WOY8jik6zaG9CRwZTaD5O7ETWDLZYMM12pqY8htll+7dYeqGfEUPcUBHOpSJg2vJOrvFIY2Dl5cX2ih1hAQ== + dependencies: + bytewise "^1.1.0" + get-value "^2.0.2" + is-extendable "^0.1.1" + sort-asc "^0.2.0" + sort-desc "^0.2.0" + union-value "^1.0.1" + source-list-map@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34" @@ -9628,6 +9749,13 @@ supercluster@^7.1.5: dependencies: kdbush "^3.0.0" +supercluster@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/supercluster/-/supercluster-8.0.1.tgz#9946ba123538e9e9ab15de472531f604e7372df5" + integrity sha512-IiOea5kJ9iqzD2t7QJq/cREyLHTtSmUT6gQsweojg9WH2sYJqZK9SswTu6jrscO6D1G5v5vYZ9ru/eq85lXeZQ== + dependencies: + kdbush "^4.0.2" + supports-color@^5.3.0: version "5.5.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" @@ -9955,6 +10083,18 @@ typedarray@^0.0.6: resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" integrity sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA== +typewise-core@^1.2, typewise-core@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/typewise-core/-/typewise-core-1.2.0.tgz#97eb91805c7f55d2f941748fa50d315d991ef195" + integrity sha512-2SCC/WLzj2SbUwzFOzqMCkz5amXLlxtJqDKTICqg30x+2DZxcfZN2MvQZmGfXWKNWaKK9pBPsvkcwv8bF/gxKg== + +typewise@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/typewise/-/typewise-1.0.3.tgz#1067936540af97937cc5dcf9922486e9fa284651" + integrity sha512-aXofE06xGhaQSPzt8hlTY+/YWQhm9P0jYUp1f2XtmW/3Bk0qzXcyFWAtPoo2uTGQj1ZwbDuSyuxicq+aDo8lCQ== + dependencies: + typewise-core "^1.2.0" + unbox-primitive@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" @@ -9988,7 +10128,7 @@ unicode-property-aliases-ecmascript@^2.0.0: resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz#43d41e3be698bd493ef911077c9b131f827e8ccd" integrity sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w== -union-value@^1.0.0: +union-value@^1.0.0, union-value@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==