diff --git a/scripts/clean_node_modules.sh b/scripts/clean_node_modules.sh index 5d595ba..d8b1de5 100755 --- a/scripts/clean_node_modules.sh +++ b/scripts/clean_node_modules.sh @@ -14,7 +14,7 @@ rm -r ./{ansicolors,buffer-from,canvas-renderer,cardinal,concat-stream,core-util rm -r ./{earcut,esm,esprima,geojson-vt,gl-matrix,grid-index,ieee754,inherits,isarray,kdbush,@mapbox,minimist,murmurhash-js} rm -r ./{path-to-regexp,pbf,potpack,process-nextick-args,protocol-buffers-schema,quickselect} rm -r ./{readable-stream,redeyed,resolve-protobuf-schema,rw,safe-buffer,sharkdown,split,ssr-window,string_decoder} -rm -r ./{supercluster,template7,through,tinyqueue,typedarray,util-deprecate,vt-pbf,wgs84} +rm -r ./{supercluster,template7,through,tinyqueue,topojson-client,typedarray,util-deprecate,vector-tile,vt-pbf,whatwg-fetch,wgs84} rm -r @fortawesome/fontawesome-free/{js,less,scss,sprites,svgs} rm -r @fortawesome/fontawesome-free/css/{all.css,brands.css,brands.min.css,fontawesome.css,fontawesome.min.css,regular.css,\ @@ -34,6 +34,11 @@ rm -r mapbox-gl/{build,CHANGELOG.md,flow-typed,node_modules,src} rm -r mapbox-gl/dist/{mapbox-gl-csp.js,mapbox-gl-csp.js.map,mapbox-gl-csp-worker.js,mapbox-gl-csp-worker.js.map,mapbox-gl-dev.js,\ mapbox-gl-dev.js.flow,mapbox-gl.js.flow,mapbox-gl.js.map,mapbox-gl-unminified.js,mapbox-gl-unminified.js.map,style-spec} +rm -r leaflet/src +rm -r leaflet/dist/{leaflet.js.map,leaflet-src.esm.js,leaflet-src.esm.js.map,leaflet-src.js,leaflet-src.js.map} + +rm -r leaflet.vectorgrid/{docs,leafdoc-templates,node_modules,package.json,README.md,src} +rm -r leaflet.vectorgrid/dist/{Leaflet.VectorGrid.bundled.js.map,Leaflet.VectorGrid.bundled.min.js,Leaflet.VectorGrid.js,Leaflet.VectorGrid.js.map,Leaflet.VectorGrid.min.js,vectorgrid-api-docs.html} echo "Size after: $(du -sh | cut -d ' ' -f 1)" echo "Cleanup complete!" diff --git a/www/img/map/dirt.png b/www/img/map/dirt.png new file mode 100644 index 0000000..6e28f53 Binary files /dev/null and b/www/img/map/dirt.png differ diff --git a/www/img/map/grass.png b/www/img/map/grass.png new file mode 100644 index 0000000..d9626c4 Binary files /dev/null and b/www/img/map/grass.png differ diff --git a/www/img/map/ground.png b/www/img/map/ground.png new file mode 100644 index 0000000..ba6a47c Binary files /dev/null and b/www/img/map/ground.png differ diff --git a/www/img/map/water.png b/www/img/map/water.png new file mode 100644 index 0000000..ec4a14d Binary files /dev/null and b/www/img/map/water.png differ diff --git a/www/index.html b/www/index.html index 482f8aa..72654d5 100644 --- a/www/index.html +++ b/www/index.html @@ -13,6 +13,7 @@ + @@ -31,8 +32,13 @@ + + + + + diff --git a/www/js/map.js b/www/js/map.js index 27e3050..6f2fd46 100644 --- a/www/js/map.js +++ b/www/js/map.js @@ -4,62 +4,22 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -mapboxgl.accessToken = ''; -const map = new mapboxgl.Map({ - container: 'mapbox', - style: SETTINGS['map_style_json'], - attributionControl: false, - dragPan: false, - pitch: 0, - zoom: 0, - maxZoom: 20 -}); - -var dpPoint = null; -var dpPitch = null; - -map.on('touchstart', function (data) { - if (data.points.length == 2) { - var diff = Math.abs(data.points[0].y - data.points[1].y); - if (diff <= 50) { - dpPoint = data.point; - map.touchZoomRotate.disable(); - dpPitch = map.getPitch(); - } - } -}); -map.on('touchmove', function (data) { - if (dpPoint) { - data.preventDefault(); - var pitchdiff = (dpPoint.y - data.point.y) * 0.5; - map.setPitch(dpPitch + pitchdiff); - } -}); +var gotfirstfix = false; -map.on('touchend', function (data) { - if (dpPoint) { - map.touchZoomRotate.enable(); - } - dpPoint = null; - dpPitch = null; -}); +var geoerrorcount = 0; -map.on('touchcancel', function (data) { - if (dpPoint) { - map.touchZoomRotate.enable(); - } - dpPoint = null; - dpPitch = null; -}); +var gamemaptype = "mapbox"; -function mapEasing(t) { - return t * (2 - t); +if (localStorage.getItem("litemode") == "true") { + gamemaptype = "leaflet"; } -var gotfirstfix = false; - -var geoerrorcount = 0; +if (gamemaptype == "leaflet") { + var map = leafletMap(); +} else { + var map = mapboxMap(); +} watchLocation(function (position) { if (gotfirstfix) { @@ -85,21 +45,11 @@ watchLocation(function (position) { }); function setMapHeading(heading) { - if (typeof heading == 'number') { - map.easeTo({ - bearing: heading, - easing: mapEasing - }); - } + map.setHeading(heading); } function setMapLocation(latitude, longitude) { - map.easeTo({ - center: [ - longitude, - latitude - ] - }); + map.setMapLocation(latitude, longitude); } function updatePlaceLayer(latitude, longitude) { @@ -110,28 +60,7 @@ function updatePlaceLayer(latitude, longitude) { longitude: longitude, radius: 5 }, function (data) { - var oldmarkers = document.getElementsByClassName("place-marker"); - if (oldmarkers.length > 0) { - markerparent = oldmarkers[0].parentNode; - while (oldmarkers.length > 0) { - markerparent.removeChild(oldmarkers[0]); - } - } - data.features.forEach(function (place) { - var el = document.createElement("div"); - el.className = "place-marker"; - if (place.properties.teamid != null && place.properties.teamid > 0) { - el.className += " place-color-" + SETTINGS["teams"][place.properties.teamid]["color"]; - } - - el.addEventListener('click', function () { - openPlace(place.properties.id, place.properties.name); - }); - - new mapboxgl.Marker(el) - .setLngLat(place.geometry.coordinates) - .addTo(map); - }); + map.updatePlaceLayer(data); }); } @@ -142,19 +71,5 @@ function animateMapIn(latitude, longitude, zoom, heading) { if (typeof heading == 'undefined') { heading = 0; } - map.flyTo({ - center: [ - longitude, - latitude - ], - speed: 0.7, - zoom: zoom, - heading: heading, - pitch: 45 - }); - // Set min zoom after some time to fly in - setTimeout(function () { - map.setMinZoom(16); - map.setPitch(45); - }, 1000); + map.animateMapIn(latitude, longitude, zoom, heading); } \ No newline at end of file diff --git a/www/js/map_leaflet.js b/www/js/map_leaflet.js new file mode 100644 index 0000000..84b3f5c --- /dev/null +++ b/www/js/map_leaflet.js @@ -0,0 +1,160 @@ +/* + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +function leafletMap() { + var map = L.map('mapbox', { + zoomSnap: 0.25, + zoomControl: false, + attributionControl: false + }); + + map.placelayer = L.layerGroup(); + + map.placelayer.addTo(map); + + $("#mapbox").css("background-color", "#6cdc9b"); + $("#mapbox").css("background-image", "url(img/map/ground.png)"); + // Prevent roads and stuff from appearing above UI + $("#mapbox").css("z-index", "-9999"); + + var openmaptilesUrl = SETTINGS['map_pbf_url']; + + var vectorTileStyling = { + water: { + fill: true, + weight: 1, + fillColor: '#76FFFF', + color: '#76FFFF', + fillOpacity: 1, + opacity: 1 + }, + admin: [], + waterway: { + weight: 1, + fillColor: '#76FFFF', + color: '#76FFFF', + fillOpacity: 1, + opacity: 1 + }, + landcover: { + fill: true, + weight: 1, + fillColor: '#62CF80', + color: '#62CF80', + fillOpacity: 0.5, + opacity: 0.5, + }, + landuse: [], + park: { + fill: true, + weight: 1, + fillColor: '#62CF80', + color: '#62CF80', + fillOpacity: 0.5, + opacity: 0.5 + }, + boundary: [], + aeroway: [], + transportation: { + weight: 2, + fillColor: '#FEC481', + color: '#FEC481', + fillOpacity: 1, + opacity: 1, + }, + building: { + fill: true, + weight: 1, + fillColor: '#c0e3e9', + color: '#c0e3e9', + fillOpacity: 0.5, + opacity: 0.5 + }, + water_name: [], + transportation_name: [], + place: [], + housenumber: [], + poi: [], + country_name: [], + marine_name: [], + state_name: [], + place_name: [], + waterway_name: [], + poi_name: [], + road_name: [], + housenum_name: [] + }; + + var openmaptilesVectorTileOptions = { + rendererFactory: L.svg.tile, + attribution: '', + vectorTileLayerStyles: vectorTileStyling, + maxNativeZoom: 14, + maxZoom: 20 + }; + + var openmaptilesPbfLayer = L.vectorGrid.protobuf(openmaptilesUrl, openmaptilesVectorTileOptions).addTo(map); + + map.setView({lat: 0, lng: 0}, 1); + + map.setMapHeading = function (heading) { + + } + + map.setMapLocation = function (latitude, longitude) { + map.setView({ + lng: longitude, + lat: latitude + }); + } + + map.updatePlaceLayer = function (data) { + map.placelayer.clearLayers(); + + data.features.forEach(function (place) { + var color = "white"; + if (place.properties.teamid != null && place.properties.teamid > 0) { + color = SETTINGS["teams"][place.properties.teamid]["color"]; + } + + var icon = L.icon({ + iconUrl: "img/place/" + color + ".png", + iconSize: [50, 50], + iconAnchor: [25, 10] + }); + + L.marker( + [ + place.geometry.coordinates[1], + place.geometry.coordinates[0] + ], + { + icon: icon + }) + .on('click', function () { + openPlace(place.properties.id, place.properties.name); + }) + .addTo(map.placelayer); + }); + } + + map.animateMapIn = function (latitude, longitude, zoom, heading) { + if (typeof zoom == 'undefined') { + zoom = 17; + } + if (typeof heading == 'undefined') { + heading = 0; + } + map.flyTo([latitude, longitude], zoom); + // Set min zoom after some time to fly in + setTimeout(function () { + map.setMinZoom(14); + map.setZoom(zoom); + }, 1000); + } + + return map; +} \ No newline at end of file diff --git a/www/js/map_mapbox.js b/www/js/map_mapbox.js new file mode 100644 index 0000000..d5203bf --- /dev/null +++ b/www/js/map_mapbox.js @@ -0,0 +1,130 @@ +/* + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +function mapboxMap() { + mapboxgl.accessToken = ''; + var map = new mapboxgl.Map({ + container: 'mapbox', + style: SETTINGS['map_style_json'], + attributionControl: false, + dragPan: false, + pitch: 0, + zoom: 0, + maxZoom: 20 + }); + + map.mapEasing = function (t) { + return t * (2 - t); + } + + map.setMapHeading = function (heading) { + if (typeof heading == 'number') { + map.easeTo({ + bearing: heading, + easing: map.mapEasing + }); + } + } + + map.setMapLocation = function (latitude, longitude) { + map.easeTo({ + center: [ + longitude, + latitude + ] + }); + } + + map.updatePlaceLayer = function (data) { + var oldmarkers = document.getElementsByClassName("place-marker"); + if (oldmarkers.length > 0) { + markerparent = oldmarkers[0].parentNode; + while (oldmarkers.length > 0) { + markerparent.removeChild(oldmarkers[0]); + } + } + data.features.forEach(function (place) { + var el = document.createElement("div"); + el.className = "place-marker"; + if (place.properties.teamid != null && place.properties.teamid > 0) { + el.className += " place-color-" + SETTINGS["teams"][place.properties.teamid]["color"]; + } + + el.addEventListener('click', function () { + openPlace(place.properties.id, place.properties.name); + }); + + new mapboxgl.Marker(el) + .setLngLat(place.geometry.coordinates) + .addTo(map); + }); + } + + map.animateMapIn = function (latitude, longitude, zoom, heading) { + if (typeof zoom == 'undefined') { + zoom = 17; + } + if (typeof heading == 'undefined') { + heading = 0; + } + map.flyTo({ + center: [ + longitude, + latitude + ], + speed: 0.7, + zoom: zoom, + heading: heading, + pitch: 45 + }); + // Set min zoom after some time to fly in + setTimeout(function () { + map.setMinZoom(15); + map.setPitch(45); + map.setZoom(zoom); + }, 1000); + } + + var dpPoint = null; + var dpPitch = null; + + map.on('touchstart', function (data) { + if (data.points.length == 2) { + var diff = Math.abs(data.points[0].y - data.points[1].y); + if (diff <= 50) { + dpPoint = data.point; + map.touchZoomRotate.disable(); + dpPitch = map.getPitch(); + } + } + }); + + map.on('touchmove', function (data) { + if (dpPoint) { + data.preventDefault(); + var pitchdiff = (dpPoint.y - data.point.y) * 0.5; + map.setPitch(dpPitch + pitchdiff); + } + }); + + map.on('touchend', function (data) { + if (dpPoint) { + map.touchZoomRotate.enable(); + } + dpPoint = null; + dpPitch = null; + }); + + map.on('touchcancel', function (data) { + if (dpPoint) { + map.touchZoomRotate.enable(); + } + dpPoint = null; + dpPitch = null; + }); + + return map; +} \ No newline at end of file diff --git a/www/js/settings.js b/www/js/settings.js index 64aa538..ac300d2 100644 --- a/www/js/settings.js +++ b/www/js/settings.js @@ -7,12 +7,13 @@ var settings = [ { - setting: "account", - title: "Sign out", - text: "Disconnect this device and open the sign in screen.", - icon: "game-icon game-icon-exit-door", - color: "red", - onclick: "logout()" + setting: "litemode", + title: "Use alternate map", + text: "Replace the 3D map with a lightweight power-saving 2D version.", + icon: "game-icon game-icon-treasure-map", + color: "green", + type: "toggle", + restart: true }, { setting: "opensource", @@ -20,7 +21,8 @@ var settings = [ text: "See information on third-party code and artwork used in TerranQuest.", icon: "game-icon game-icon-spell-book", color: "lightblue", - onclick: "router.navigate('/credits')" + onclick: "router.navigate('/credits')", + type: "link" }, { setting: "privacy", @@ -28,7 +30,17 @@ var settings = [ text: "Know what data we collect and what your rights are.", icon: "game-icon game-icon-spy", color: "purple", - onclick: "openBrowser('" + SETTINGS["terms_of_service_url"] + "')" + onclick: "openBrowser('" + SETTINGS["terms_of_service_url"] + "')", + type: "link" + }, + { + setting: "account", + title: "Sign out", + text: "Disconnect this device and open the sign in screen.", + icon: "game-icon game-icon-exit-door", + color: "red", + onclick: "logout()", + type: "link" }, { setting: "versions", @@ -43,14 +55,50 @@ var settings = [ function loadSettings() { $("#settings-bin").html(""); settings.forEach(function (item) { - $("#settings-bin").append('
' - + '
' - + '
' - + '
' - + '

' + item.title + '

' - + item.text - + '
' - + '
' - + '
'); + $("#settings-bin").append('
  • ' + + (item.type == "link" ? '' : '') + + '
    ' + + '
    ' + + ' ' + + '
    ' + + '
    ' + + '
    ' + + ' ' + item.title + + ' ' + + '
    ' + + '
    ' + + (item.type == "toggle" ? '' : '') + + '
    ' + + '
    ' + + '
    ' + + (item.type == "link" ? '
    ' : '') + + '
  • ' + ); + if (item.type == "toggle") { + var toggle = app.toggle.create({ + el: "#settings-bin li[data-setting=" + item.setting + "] .toggle", + on: { + change: function () { + // Don't do anything if the setting isn't actually changed + if ((localStorage.getItem(item.setting) == "true") == this.checked) { + return; + } + localStorage.setItem(item.setting, this.checked); + if (item.restart == true) { + app.dialog.preloader('Applying changes...'); + setTimeout(restartApplication, 1000); + } + } + } + }); + if ((localStorage.getItem(item.setting) == "true") != toggle.checked) { + toggle.toggle(); + } + } }); } \ No newline at end of file diff --git a/www/package.json b/www/package.json index 9124f36..6142688 100644 --- a/www/package.json +++ b/www/package.json @@ -8,6 +8,8 @@ "framework7": "^4.3.0", "jdenticon": "^2.1.1", "jquery": "^3.4.0", + "leaflet": "^1.5.1", + "leaflet.vectorgrid": "^1.3.0", "mapbox-gl": "^0.54.0" } } diff --git a/www/pages/settings.html b/www/pages/settings.html index 7008ff2..018854e 100644 --- a/www/pages/settings.html +++ b/www/pages/settings.html @@ -11,8 +11,10 @@
    -
    -
    +
    +
    +
      +
    diff --git a/www/settings.template.js b/www/settings.template.js index 11767f5..40d3f9d 100644 --- a/www/settings.template.js +++ b/www/settings.template.js @@ -12,6 +12,7 @@ var SETTINGS = { signup_url: "http://localhost/accounthub/signup/", terms_of_service_url: "https://netsyms.com/legal?pk_campaign=TerranQuestApp", map_style_json: "https://maps.netsyms.net/styles/terranquest-3d/style.json", + map_pbf_url: "https://maps.netsyms.net/data/v3/{z}/{x}/{y}.pbf", stripe_pubkey: "", teams: { 1: {id: 1, name: "Water", icon: "fas fa-tint", color: "blue", textcolor: "black", hue: 230}, diff --git a/www/yarn.lock b/www/yarn.lock index bb17d6a..8d13f67 100644 --- a/www/yarn.lock +++ b/www/yarn.lock @@ -89,6 +89,11 @@ cardinal@~0.4.2: ansicolors "~0.2.1" redeyed "~0.4.0" +commander@2: + version "2.20.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.0.tgz#d58bb2b5c1ee8f87b0d340027e9e94e222c5a422" + integrity sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ== + concat-stream@~1.6.0: version "1.6.2" resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" @@ -188,6 +193,21 @@ kdbush@^3.0.0: resolved "https://registry.yarnpkg.com/kdbush/-/kdbush-3.0.0.tgz#f8484794d47004cc2d85ed3a79353dbe0abc2bf0" integrity sha512-hRkd6/XW4HTsA9vjVpY9tuXJYLSlelnkTmVFu4M9/7MIYQtFcHpbugAU7UbOfjOiVSVYl2fqgBuJ32JUmRo5Ew== +leaflet.vectorgrid@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/leaflet.vectorgrid/-/leaflet.vectorgrid-1.3.0.tgz#ff2deea17d06a9c6cc5e65d8c7287093950e219a" + integrity sha512-kWmj1pKM+MVdo/7Mg5zsB3YrGZvo/uIuiANV9MvWUFOG+Y2xAJzrteDhoIcCgTjHSSRJ36xdeGdIQVhuWjnCZw== + dependencies: + pbf "^3.0.2" + topojson-client "^2.1.0" + vector-tile "^1.3.0" + whatwg-fetch "^2.0.3" + +leaflet@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/leaflet/-/leaflet-1.5.1.tgz#9afb9d963d66c870066b1342e7a06f92840f46bf" + integrity sha512-ekM9KAeG99tYisNBg0IzEywAlp0hYI5XRipsqRXyRTeuU8jcuntilpp+eFf5gaE0xubc9RuSNIVtByEKwqFV0w== + mapbox-gl@^0.54.0: version "0.54.0" resolved "https://registry.yarnpkg.com/mapbox-gl/-/mapbox-gl-0.54.0.tgz#f6cb96ecb8e64276a8ed2fe4a4f213fabab4123e" @@ -243,7 +263,7 @@ path-to-regexp@^3.0.0: resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-3.0.0.tgz#c981a218f3df543fa28696be2f88e0c58d2e012a" integrity sha512-ZOtfhPttCrqp2M1PBBH4X13XlvnfhIwD7yCLx+GoGoXRPQyxGOTdQMpIzPSPKXAJT/JQrdfFrgdJOyAzvgpQ9A== -pbf@^3.0.5: +pbf@^3.0.2, pbf@^3.0.5: version "3.2.0" resolved "https://registry.yarnpkg.com/pbf/-/pbf-3.2.0.tgz#e76f9f5114e395c25077ad6fe463b3507d6877fc" integrity sha512-98Eh7rsJNJF/Im6XYMLaOW3cLnNyedlOd6hu3iWMD5I7FZGgpw8yN3vQBrmLbLodu7G784Irb9Qsv2yFrxSAGw== @@ -251,6 +271,11 @@ pbf@^3.0.5: ieee754 "^1.1.12" resolve-protobuf-schema "^2.1.0" +point-geometry@0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/point-geometry/-/point-geometry-0.0.0.tgz#6fcbcad7a803b6418247dd6e49c2853c584daff7" + integrity sha1-b8vK16gDtkGCR91uScKFPFhNr/c= + potpack@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/potpack/-/potpack-1.0.1.tgz#d1b1afd89e4c8f7762865ec30bd112ab767e2ebf" @@ -358,6 +383,13 @@ tinyqueue@^2.0.0: resolved "https://registry.yarnpkg.com/tinyqueue/-/tinyqueue-2.0.2.tgz#b4fe66d28a5b503edb99c149f87910059782a0cc" integrity sha512-1oUV+ZAQaeaf830ui/p5JZpzGBw46qs1pKHcfqIc6/QxYDQuEmcBLIhiT0xAxLnekz+qxQusubIYk4cAS8TB2A== +topojson-client@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/topojson-client/-/topojson-client-2.1.0.tgz#ff9f7bf38991185e0b4284c2b06ae834f0eac6c8" + integrity sha1-/59784mRGF4LQoTCsGroNPDqxsg= + dependencies: + commander "2" + typedarray@^0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" @@ -368,6 +400,13 @@ util-deprecate@~1.0.1: resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= +vector-tile@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/vector-tile/-/vector-tile-1.3.0.tgz#06d516a83b063f04c82ef539cf1bb1aebeb696b4" + integrity sha1-BtUWqDsGPwTILvU5zxuxrr62lrQ= + dependencies: + point-geometry "0.0.0" + vt-pbf@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/vt-pbf/-/vt-pbf-3.1.1.tgz#b0f627e39a10ce91d943b898ed2363d21899fb82" @@ -381,3 +420,8 @@ wgs84@0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/wgs84/-/wgs84-0.0.0.tgz#34fdc555917b6e57cf2a282ed043710c049cdc76" integrity sha1-NP3FVZF7blfPKigu0ENxDASc3HY= + +whatwg-fetch@^2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz#dde6a5df315f9d39991aa17621853d720b85566f" + integrity sha512-dcQ1GWpOD/eEQ97k66aiEVpNnapVj90/+R+SXTPYGHpYBBypfKJEQjLrvMZ7YXbKm21gXd4NcuxUTjiv1YtLng==