From 9d8609dd08c0992a321c5793c5b4b307e7e439a8 Mon Sep 17 00:00:00 2001 From: mike-000 <49240900+mike-000@users.noreply.github.com> Date: Tue, 26 Nov 2019 10:25:50 +0000 Subject: [PATCH 001/381] Modify and snap to circle in user coordinates Correct modify interaction at center and at drawn circle circumference Correct snap interaction at drawn circle circumference Test circle geometry in a user projection --- src/ol/interaction/Modify.js | 47 +++++++-- src/ol/interaction/Snap.js | 22 +++- test/spec/ol/interaction/modify.test.js | 128 +++++++++++++++++++++++- test/spec/ol/interaction/snap.test.js | 27 ++++- 4 files changed, 210 insertions(+), 14 deletions(-) diff --git a/src/ol/interaction/Modify.js b/src/ol/interaction/Modify.js index fe81a771ee..dffdf8e707 100644 --- a/src/ol/interaction/Modify.js +++ b/src/ol/interaction/Modify.js @@ -14,13 +14,14 @@ import {always, primaryAction, altKeyOnly, singleClick} from '../events/conditio import {boundingExtent, buffer as bufferExtent, createOrUpdateFromCoordinate as createExtent} from '../extent.js'; import GeometryType from '../geom/GeometryType.js'; import Point from '../geom/Point.js'; +import {fromCircle} from '../geom/Polygon.js'; import PointerInteraction from './Pointer.js'; import VectorLayer from '../layer/Vector.js'; import VectorSource from '../source/Vector.js'; import VectorEventType from '../source/VectorEventType.js'; import RBush from '../structs/RBush.js'; import {createEditingStyle} from '../style/Style.js'; -import {fromUserExtent, toUserExtent, fromUserCoordinate, toUserCoordinate} from '../proj.js'; +import {getUserProjection, fromUserExtent, toUserExtent, fromUserCoordinate, toUserCoordinate} from '../proj.js'; /** @@ -657,7 +658,14 @@ class Modify extends PointerInteraction { centerSegmentData.featureSegments = featureSegments; circumferenceSegmentData.featureSegments = featureSegments; this.rBush_.insert(createExtent(coordinates), centerSegmentData); - this.rBush_.insert(geometry.getExtent(), circumferenceSegmentData); + let circleGeometry = /** @type {import("../geom/Geometry.js").default} */ (geometry); + const userProjection = getUserProjection(); + if (userProjection && this.getMap()) { + const projection = this.getMap().getView().getProjection(); + circleGeometry = circleGeometry.clone().transform(userProjection, projection); + circleGeometry = fromCircle(/** @type {import("../geom/Circle.js").default} */ (circleGeometry)).transform(projection, userProjection); + } + this.rBush_.insert(circleGeometry.getExtent(), circumferenceSegmentData); } /** @@ -785,7 +793,16 @@ class Modify extends PointerInteraction { this.changingFeature_ = false; } else { // We're dragging the circle's circumference: this.changingFeature_ = true; - geometry.setRadius(coordinateDistance(geometry.getCenter(), vertex)); + const projection = evt.map.getView().getProjection(); + let radius = coordinateDistance(fromUserCoordinate(geometry.getCenter(), projection), + fromUserCoordinate(vertex, projection)); + const userProjection = getUserProjection(); + if (userProjection) { + const circleGeometry = geometry.clone().transform(userProjection, projection); + circleGeometry.setRadius(radius); + radius = circleGeometry.transform(projection, userProjection).getRadius(); + } + geometry.setRadius(radius); this.changingFeature_ = false; } break; @@ -898,7 +915,14 @@ class Modify extends PointerInteraction { circumferenceSegmentData.segment[0] = coordinates; circumferenceSegmentData.segment[1] = coordinates; this.rBush_.update(createExtent(coordinates), centerSegmentData); - this.rBush_.update(geometry.getExtent(), circumferenceSegmentData); + let circleGeometry = geometry; + const userProjection = getUserProjection(); + if (userProjection) { + const projection = evt.map.getView().getProjection(); + circleGeometry = circleGeometry.clone().transform(userProjection, projection); + circleGeometry = fromCircle(circleGeometry).transform(projection, userProjection); + } + this.rBush_.update(circleGeometry.getExtent(), circumferenceSegmentData); } else { this.rBush_.update(boundingExtent(segmentData.segment), segmentData); } @@ -1249,11 +1273,15 @@ function projectedDistanceToSegmentDataSquared(pointCoordinates, segmentData, pr const geometry = segmentData.geometry; if (geometry.getType() === GeometryType.CIRCLE) { - const circleGeometry = /** @type {import("../geom/Circle.js").default} */ (geometry); + let circleGeometry = /** @type {import("../geom/Circle.js").default} */ (geometry); if (segmentData.index === CIRCLE_CIRCUMFERENCE_INDEX) { + const userProjection = getUserProjection(); + if (userProjection) { + circleGeometry = /** @type {import("../geom/Circle.js").default} */ (circleGeometry.clone().transform(userProjection, projection)); + } const distanceToCenterSquared = - squaredCoordinateDistance(circleGeometry.getCenter(), pointCoordinates); + squaredCoordinateDistance(circleGeometry.getCenter(), fromUserCoordinate(pointCoordinates, projection)); const distanceToCircumference = Math.sqrt(distanceToCenterSquared) - circleGeometry.getRadius(); return distanceToCircumference * distanceToCircumference; @@ -1280,7 +1308,12 @@ function closestOnSegmentData(pointCoordinates, segmentData, projection) { const geometry = segmentData.geometry; if (geometry.getType() === GeometryType.CIRCLE && segmentData.index === CIRCLE_CIRCUMFERENCE_INDEX) { - return geometry.getClosestPoint(pointCoordinates); + let circleGeometry = /** @type {import("../geom/Circle.js").default} */ (geometry); + const userProjection = getUserProjection(); + if (userProjection) { + circleGeometry = /** @type {import("../geom/Circle.js").default} */ (circleGeometry.clone().transform(userProjection, projection)); + } + return toUserCoordinate(circleGeometry.getClosestPoint(fromUserCoordinate(pointCoordinates, projection)), projection); } const coordinate = fromUserCoordinate(pointCoordinates, projection); tempSegment[0] = fromUserCoordinate(segmentData.segment[0], projection); diff --git a/src/ol/interaction/Snap.js b/src/ol/interaction/Snap.js index 8cf720768a..61a5a1c6de 100644 --- a/src/ol/interaction/Snap.js +++ b/src/ol/interaction/Snap.js @@ -14,7 +14,7 @@ import PointerInteraction from './Pointer.js'; import {getValues} from '../obj.js'; import VectorEventType from '../source/VectorEventType.js'; import RBush from '../structs/RBush.js'; -import {fromUserCoordinate, toUserCoordinate} from '../proj.js'; +import {getUserProjection, fromUserCoordinate, toUserCoordinate} from '../proj.js'; /** @@ -431,8 +431,13 @@ class Snap extends PointerInteraction { } else if (this.edge_) { const isCircle = closestSegmentData.feature.getGeometry().getType() === GeometryType.CIRCLE; if (isCircle) { - vertex = closestOnCircle(pixelCoordinate, - /** @type {import("../geom/Circle.js").default} */ (closestSegmentData.feature.getGeometry())); + let circleGeometry = closestSegmentData.feature.getGeometry(); + const userProjection = getUserProjection(); + if (userProjection) { + circleGeometry = circleGeometry.clone().transform(userProjection, projection); + } + vertex = toUserCoordinate(closestOnCircle(projectedCoordinate, + /** @type {import("../geom/Circle.js").default} */ (circleGeometry)), projection); } else { tempSegment[0] = fromUserCoordinate(closestSegment[0], projection); tempSegment[1] = fromUserCoordinate(closestSegment[1], projection); @@ -482,7 +487,16 @@ class Snap extends PointerInteraction { * @private */ writeCircleGeometry_(feature, geometry) { - const polygon = fromCircle(geometry); + const projection = this.getMap().getView().getProjection(); + let circleGeometry = geometry; + const userProjection = getUserProjection(); + if (userProjection) { + circleGeometry = /** @type {import("../geom/Circle.js").default} */ (circleGeometry.clone().transform(userProjection, projection)); + } + const polygon = fromCircle(circleGeometry); + if (userProjection) { + polygon.transform(projection, userProjection); + } const coordinates = polygon.getCoordinates()[0]; for (let i = 0, ii = coordinates.length - 1; i < ii; ++i) { const segment = coordinates.slice(i, i + 2); diff --git a/test/spec/ol/interaction/modify.test.js b/test/spec/ol/interaction/modify.test.js index 7deae8d5d7..d8b8cccfb0 100644 --- a/test/spec/ol/interaction/modify.test.js +++ b/test/spec/ol/interaction/modify.test.js @@ -14,6 +14,7 @@ import VectorLayer from '../../../../src/ol/layer/Vector.js'; import VectorSource from '../../../../src/ol/source/Vector.js'; import Event from '../../../../src/ol/events/Event.js'; import {getValues} from '../../../../src/ol/obj.js'; +import {clearUserProjection, setUserProjection} from '../../../../src/ol/proj.js'; describe('ol.interaction.Modify', function() { @@ -66,6 +67,7 @@ describe('ol.interaction.Modify', function() { afterEach(function() { map.dispose(); document.body.removeChild(target); + clearUserProjection(); }); /** @@ -401,7 +403,7 @@ describe('ol.interaction.Modify', function() { expect(circleFeature.getGeometry().getRadius()).to.equal(20); expect(circleFeature.getGeometry().getCenter()).to.eql([5, 5]); - // Increase radius + // Increase radius along x axis simulateEvent('pointermove', 25, -4, null, 0); simulateEvent('pointerdown', 25, -4, null, 0); simulateEvent('pointermove', 30, -5, null, 0); @@ -410,6 +412,64 @@ describe('ol.interaction.Modify', function() { expect(circleFeature.getGeometry().getRadius()).to.equal(25); expect(circleFeature.getGeometry().getCenter()).to.eql([5, 5]); + + // Increase radius along y axis + simulateEvent('pointermove', 4, -30, null, 0); + simulateEvent('pointerdown', 4, -30, null, 0); + simulateEvent('pointermove', 5, -35, null, 0); + simulateEvent('pointerdrag', 5, -35, null, 0); + simulateEvent('pointerup', 5, -35, null, 0); + + expect(circleFeature.getGeometry().getRadius()).to.equal(30); + expect(circleFeature.getGeometry().getCenter()).to.eql([5, 5]); + }); + + it('changes the circle radius and center in a user projection', function() { + const userProjection = 'EPSG:3857'; + setUserProjection(userProjection); + const viewProjection = map.getView().getProjection(); + + const circleFeature = new Feature(new Circle([10, 10], 20).transform(viewProjection, userProjection)); + features.length = 0; + features.push(circleFeature); + + const modify = new Modify({ + features: new Collection(features) + }); + map.addInteraction(modify); + + // Change center + simulateEvent('pointermove', 10, -10, null, 0); + simulateEvent('pointerdown', 10, -10, null, 0); + simulateEvent('pointermove', 5, -5, null, 0); + simulateEvent('pointerdrag', 5, -5, null, 0); + simulateEvent('pointerup', 5, -5, null, 0); + + const geometry1 = circleFeature.getGeometry().clone().transform(userProjection, viewProjection); + expect(geometry1.getRadius()).to.roughlyEqual(20, 1e-9); + expect(geometry1.getCenter()).to.eql([5, 5]); + + // Increase radius along x axis + simulateEvent('pointermove', 25, -4, null, 0); + simulateEvent('pointerdown', 25, -4, null, 0); + simulateEvent('pointermove', 30, -5, null, 0); + simulateEvent('pointerdrag', 30, -5, null, 0); + simulateEvent('pointerup', 30, -5, null, 0); + + const geometry2 = circleFeature.getGeometry().clone().transform(userProjection, viewProjection); + expect(geometry2.getRadius()).to.roughlyEqual(25, 1e-9); + expect(geometry2.getCenter()).to.eql([5, 5]); + + // Increase radius along y axis + simulateEvent('pointermove', 4, -30, null, 0); + simulateEvent('pointerdown', 4, -30, null, 0); + simulateEvent('pointermove', 5, -35, null, 0); + simulateEvent('pointerdrag', 5, -35, null, 0); + simulateEvent('pointerup', 5, -35, null, 0); + + const geometry3 = circleFeature.getGeometry().clone().transform(userProjection, viewProjection); + expect(geometry3.getRadius()).to.roughlyEqual(30, 1e-9); + expect(geometry3.getCenter()).to.eql([5, 5]); }); }); @@ -765,7 +825,7 @@ describe('ol.interaction.Modify', function() { expect(circleFeature.getGeometry().getRadius()).to.equal(20); expect(circleFeature.getGeometry().getCenter()).to.eql([5, 5]); - // Increase radius + // Increase radius along x axis simulateEvent('pointermove', 25, -4, null, 0); simulateEvent('pointerdown', 25, -4, null, 0); simulateEvent('pointermove', 30, -5, null, 0); @@ -774,6 +834,70 @@ describe('ol.interaction.Modify', function() { expect(circleFeature.getGeometry().getRadius()).to.equal(25); expect(circleFeature.getGeometry().getCenter()).to.eql([5, 5]); + + // Increase radius along y axis + simulateEvent('pointermove', 4, -30, null, 0); + simulateEvent('pointerdown', 4, -30, null, 0); + simulateEvent('pointermove', 5, -35, null, 0); + simulateEvent('pointerdrag', 5, -35, null, 0); + simulateEvent('pointerup', 5, -35, null, 0); + + expect(circleFeature.getGeometry().getRadius()).to.equal(30); + expect(circleFeature.getGeometry().getCenter()).to.eql([5, 5]); + }); + + it('changes the circle radius and center in a user projection', function() { + const userProjection = 'EPSG:3857'; + setUserProjection(userProjection); + const viewProjection = map.getView().getProjection(); + + const circleFeature = new Feature(new Circle([10, 10], 20).transform(viewProjection, userProjection)); + features.length = 0; + features.push(circleFeature); + + const modify = new Modify({ + features: new Collection(features) + }); + map.addInteraction(modify); + + const snap = new Snap({ + features: new Collection(features), + pixelTolerance: 1 + }); + map.addInteraction(snap); + + // Change center + simulateEvent('pointermove', 10, -10, null, 0); + simulateEvent('pointerdown', 10, -10, null, 0); + simulateEvent('pointermove', 5, -5, null, 0); + simulateEvent('pointerdrag', 5, -5, null, 0); + simulateEvent('pointerup', 5, -5, null, 0); + + const geometry1 = circleFeature.getGeometry().clone().transform(userProjection, viewProjection); + expect(geometry1.getRadius()).to.roughlyEqual(20, 1e-9); + expect(geometry1.getCenter()).to.eql([5, 5]); + + // Increase radius along x axis + simulateEvent('pointermove', 25, -4, null, 0); + simulateEvent('pointerdown', 25, -4, null, 0); + simulateEvent('pointermove', 30, -5, null, 0); + simulateEvent('pointerdrag', 30, -5, null, 0); + simulateEvent('pointerup', 30, -5, null, 0); + + const geometry2 = circleFeature.getGeometry().clone().transform(userProjection, viewProjection); + expect(geometry2.getRadius()).to.roughlyEqual(25, 1e-9); + expect(geometry2.getCenter()).to.eql([5, 5]); + + // Increase radius along y axis + simulateEvent('pointermove', 4, -30, null, 0); + simulateEvent('pointerdown', 4, -30, null, 0); + simulateEvent('pointermove', 5, -35, null, 0); + simulateEvent('pointerdrag', 5, -35, null, 0); + simulateEvent('pointerup', 5, -35, null, 0); + + const geometry3 = circleFeature.getGeometry().clone().transform(userProjection, viewProjection); + expect(geometry3.getRadius()).to.roughlyEqual(30, 1e-9); + expect(geometry3.getCenter()).to.eql([5, 5]); }); }); diff --git a/test/spec/ol/interaction/snap.test.js b/test/spec/ol/interaction/snap.test.js index 329cd08172..7db59f177b 100644 --- a/test/spec/ol/interaction/snap.test.js +++ b/test/spec/ol/interaction/snap.test.js @@ -6,7 +6,7 @@ import Circle from '../../../../src/ol/geom/Circle.js'; import Point from '../../../../src/ol/geom/Point.js'; import LineString from '../../../../src/ol/geom/LineString.js'; import Snap from '../../../../src/ol/interaction/Snap.js'; -import {useGeographic, clearUserProjection} from '../../../../src/ol/proj.js'; +import {useGeographic, clearUserProjection, setUserProjection, transform} from '../../../../src/ol/proj.js'; import {overrideRAF} from '../../util.js'; @@ -55,6 +55,7 @@ describe('ol.interaction.Snap', function() { afterEach(function() { map.dispose(); document.body.removeChild(target); + clearUserProjection(); }); it('can handle XYZ coordinates', function() { @@ -129,6 +130,30 @@ describe('ol.interaction.Snap', function() { expect(event.coordinate[1]).to.roughlyEqual(Math.sin(Math.PI / 4) * 10, 1e-10); }); + it('snaps to circle in a user projection', function() { + const userProjection = 'EPSG:3857'; + setUserProjection(userProjection); + const viewProjection = map.getView().getProjection(); + + const circle = new Feature(new Circle([0, 0], 10).transform(viewProjection, userProjection)); + const snapInteraction = new Snap({ + features: new Collection([circle]), + pixelTolerance: 5 + }); + snapInteraction.setMap(map); + + const event = { + pixel: [5 + width / 2, height / 2 - 5], + coordinate: transform([5, 5], viewProjection, userProjection), + map: map + }; + snapInteraction.handleEvent(event); + + const coordinate = transform([Math.sin(Math.PI / 4) * 10, Math.sin(Math.PI / 4) * 10], viewProjection, userProjection); + expect(event.coordinate[0]).to.roughlyEqual(coordinate[0], 1e-10); + expect(event.coordinate[1]).to.roughlyEqual(coordinate[1], 1e-10); + }); + it('handle feature without geometry', function() { const feature = new Feature(); const snapInteraction = new Snap({ From 5b1df4438d89c18d162d775f0fdca91f6c782043 Mon Sep 17 00:00:00 2001 From: mike-000 <49240900+mike-000@users.noreply.github.com> Date: Wed, 1 Jan 2020 22:04:10 +0000 Subject: [PATCH 002/381] Fix for undefined source in Image layer Prevent error if layer does not have a source. Also clear any existing image if source is set to null or undefined by setSource. --- src/ol/renderer/canvas/ImageLayer.js | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/src/ol/renderer/canvas/ImageLayer.js b/src/ol/renderer/canvas/ImageLayer.js index 5dc9895cd0..7403890219 100644 --- a/src/ol/renderer/canvas/ImageLayer.js +++ b/src/ol/renderer/canvas/ImageLayer.js @@ -55,16 +55,20 @@ class CanvasImageLayerRenderer extends CanvasLayerRenderer { } if (!hints[ViewHint.ANIMATING] && !hints[ViewHint.INTERACTING] && !isEmpty(renderedExtent)) { - let projection = viewState.projection; - if (!ENABLE_RASTER_REPROJECTION) { - const sourceProjection = imageSource.getProjection(); - if (sourceProjection) { - projection = sourceProjection; + if (imageSource) { + let projection = viewState.projection; + if (!ENABLE_RASTER_REPROJECTION) { + const sourceProjection = imageSource.getProjection(); + if (sourceProjection) { + projection = sourceProjection; + } } - } - const image = imageSource.getImage(renderedExtent, viewResolution, pixelRatio, projection); - if (image && this.loadImage(image)) { - this.image_ = image; + const image = imageSource.getImage(renderedExtent, viewResolution, pixelRatio, projection); + if (image && this.loadImage(image)) { + this.image_ = image; + } + } else { + this.image_ = null; } } From 34dc53812274638ceaa731c932ab5fd2f5139e76 Mon Sep 17 00:00:00 2001 From: Matt Walker Date: Fri, 10 Jan 2020 10:48:15 +0000 Subject: [PATCH 003/381] Stop events that originate with a removed target As discussed in https://github.com/openlayers/openlayers/issues/6948#issuecomment-565375694 The check to see if the target is within the "page" uses the viewport as the MapBrowserEventHandler instance adds it's listeners to the viewport. Using Node.contains appears to have a slight performance benefit over manually walking the DOM. --- src/ol/PluggableMap.js | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/ol/PluggableMap.js b/src/ol/PluggableMap.js index fac2b185e2..f5252ed81b 100644 --- a/src/ol/PluggableMap.js +++ b/src/ol/PluggableMap.js @@ -934,11 +934,13 @@ class PluggableMap extends BaseObject { } let target = /** @type {Node} */ (mapBrowserEvent.originalEvent.target); if (!mapBrowserEvent.dragging) { - while (target && target !== this.viewport_) { - if (target.parentElement === this.overlayContainerStopEvent_) { - return; - } - target = target.parentElement; + if (this.overlayContainerStopEvent_.contains(target) || !this.viewport_.contains(target)) { + // Abort if the event target is a child of the container that doesn't allow + // event propagation or is no longer in the page. It's possible for the target to no longer + // be in the page if it has been removed in an event listener, this might happen in a Control + // that recreates it's content based on user interaction either manually or via a render + // in something like https://reactjs.org/ + return; } } mapBrowserEvent.frameState = this.frameState_; From f3d94b31324266f98f1e42602d2aba49abcb9547 Mon Sep 17 00:00:00 2001 From: Matt Walker Date: Fri, 10 Jan 2020 11:16:54 +0000 Subject: [PATCH 004/381] Fix lint error --- src/ol/PluggableMap.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ol/PluggableMap.js b/src/ol/PluggableMap.js index f5252ed81b..1966a43035 100644 --- a/src/ol/PluggableMap.js +++ b/src/ol/PluggableMap.js @@ -932,7 +932,7 @@ class PluggableMap extends BaseObject { // coordinates so interactions cannot be used. return; } - let target = /** @type {Node} */ (mapBrowserEvent.originalEvent.target); + const target = /** @type {Node} */ (mapBrowserEvent.originalEvent.target); if (!mapBrowserEvent.dragging) { if (this.overlayContainerStopEvent_.contains(target) || !this.viewport_.contains(target)) { // Abort if the event target is a child of the container that doesn't allow From 0512c690f864979c09712ca258c0846b8d0fc909 Mon Sep 17 00:00:00 2001 From: mike-000 <49240900+mike-000@users.noreply.github.com> Date: Fri, 10 Jan 2020 13:39:29 +0000 Subject: [PATCH 005/381] Fix for reset north when rotation is 360 degrees Animated reset north doesn't work and isn't needed if rotation is 360 degrees (or a multiple of 360) --- src/ol/control/Rotate.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/ol/control/Rotate.js b/src/ol/control/Rotate.js index 5ba8a0db34..f4dd50c54d 100644 --- a/src/ol/control/Rotate.js +++ b/src/ol/control/Rotate.js @@ -131,8 +131,9 @@ class Rotate extends Control { // upon it return; } - if (view.getRotation() !== undefined) { - if (this.duration_ > 0) { + const rotation = view.getRotation(); + if (rotation !== undefined) { + if (this.duration_ > 0 && rotation % (2 * Math.PI) !== 0) { view.animate({ rotation: 0, duration: this.duration_, From 3bac2e49d1dabdc06bf09f3dd75ca7eae6d72eba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maximilian=20Kr=C3=B6g?= Date: Sat, 11 Jan 2020 17:40:56 +0100 Subject: [PATCH 006/381] Remove build/apidoc before running jsdoc again --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 64b055a44c..013bdb9d32 100644 --- a/package.json +++ b/package.json @@ -24,7 +24,7 @@ "copy-css": "shx cp src/ol/ol.css build/ol/ol.css", "transpile": "shx rm -rf build/ol && shx mkdir -p build/ol && shx cp -rf src/ol build/ol/src && node tasks/serialize-workers && tsc --project config/tsconfig-build.json", "typecheck": "tsc --pretty", - "apidoc": "jsdoc -R config/jsdoc/api/index.md -c config/jsdoc/api/conf.json -P package.json -d build/apidoc" + "apidoc": "shx rm -rf build/apidoc && jsdoc -R config/jsdoc/api/index.md -c config/jsdoc/api/conf.json -P package.json -d build/apidoc" }, "main": "index.js", "repository": { From 986e6d940c6cca57a6e017691fd5d7f88dbb044c Mon Sep 17 00:00:00 2001 From: "Gubler, Florian" Date: Mon, 13 Jan 2020 08:45:29 +0100 Subject: [PATCH 007/381] fixed flag-name in upgrade notes: "constrainOnlyCenter" instead of "constrainCenterOnly" --- changelog/upgrade-notes.md | 2 +- changelog/v6.0.0.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/changelog/upgrade-notes.md b/changelog/upgrade-notes.md index 865f3858ae..6e40f9164a 100644 --- a/changelog/upgrade-notes.md +++ b/changelog/upgrade-notes.md @@ -77,7 +77,7 @@ Generally, the responsibility of applying center/rotation/resolutions constraint ##### The view `extent` option now applies to the whole viewport -Previously, this options only constrained the view *center*. This behaviour can still be obtained by specifying `constrainCenterOnly` in the view options. +Previously, this options only constrained the view *center*. This behaviour can still be obtained by specifying `constrainOnlyCenter` in the view options. As a side effect, the view `rotate` method is gone and has been replaced with `adjustRotation` which takes a delta as input. diff --git a/changelog/v6.0.0.md b/changelog/v6.0.0.md index b109e2d2d1..02d7aafb5f 100644 --- a/changelog/v6.0.0.md +++ b/changelog/v6.0.0.md @@ -83,7 +83,7 @@ Generally, the responsibility of applying center/rotation/resolutions constraint ##### The view `extent` option now applies to the whole viewport -Previously, this options only constrained the view *center*. This behaviour can still be obtained by specifying `constrainCenterOnly` in the view options. +Previously, this options only constrained the view *center*. This behaviour can still be obtained by specifying `constrainOnlyCenter` in the view options. As a side effect, the view `rotate` method is gone and has been replaced with `adjustRotation` which takes a delta as input. From 95a319a6704936ee46585914528a1954f02f1e91 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 13 Jan 2020 08:02:43 +0000 Subject: [PATCH 008/381] Bump terser-webpack-plugin from 2.3.1 to 2.3.2 Bumps [terser-webpack-plugin](https://github.com/webpack-contrib/terser-webpack-plugin) from 2.3.1 to 2.3.2. - [Release notes](https://github.com/webpack-contrib/terser-webpack-plugin/releases) - [Changelog](https://github.com/webpack-contrib/terser-webpack-plugin/blob/master/CHANGELOG.md) - [Commits](https://github.com/webpack-contrib/terser-webpack-plugin/compare/v2.3.1...v2.3.2) Signed-off-by: dependabot-preview[bot] --- package-lock.json | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-) diff --git a/package-lock.json b/package-lock.json index 5df371f260..4c942f23e8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11955,9 +11955,9 @@ } }, "terser-webpack-plugin": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-2.3.1.tgz", - "integrity": "sha512-dNxivOXmDgZqrGxOttBH6B4xaxT4zNC+Xd+2K8jwGDMK5q2CZI+KZMA1AAnSRT+BTRvuzKsDx+fpxzPAmAMVcA==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-2.3.2.tgz", + "integrity": "sha512-SmvB/6gtEPv+CJ88MH5zDOsZdKXPS/Uzv2//e90+wM1IHFUhsguPKEILgzqrM1nQ4acRXN/SV4Obr55SXC+0oA==", "dev": true, "requires": { "cacache": "^13.0.1", @@ -12123,12 +12123,6 @@ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true }, - "serialize-javascript": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-2.1.2.tgz", - "integrity": "sha512-rs9OggEUF0V4jUSecXazOYsLfu7OGK2qIn3c7IPBiffz32XniEp/TX9Xmc9LQfK2nQ2QKHvZ2oygKUGU0lG4jQ==", - "dev": true - }, "ssri": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/ssri/-/ssri-7.1.0.tgz", @@ -12140,9 +12134,9 @@ } }, "terser": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/terser/-/terser-4.4.3.tgz", - "integrity": "sha512-0ikKraVtRDKGzHrzkCv5rUNDzqlhmhowOBqC0XqUHFpW+vJ45+20/IFBcebwKfiS2Z9fJin6Eo+F1zLZsxi8RA==", + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.6.2.tgz", + "integrity": "sha512-6FUjJdY2i3WZAtYBtnV06OOcOfzl+4hSKYE9wgac8rkLRBToPDDrBB2AcHwQD/OKDxbnvhVy2YgOPWO2SsKWqg==", "dev": true, "requires": { "commander": "^2.20.0", From 02931d54b5dc7aa96074ed288548428c42a770fb Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 13 Jan 2020 08:03:35 +0000 Subject: [PATCH 009/381] Bump @babel/preset-env from 7.7.7 to 7.8.2 Bumps [@babel/preset-env](https://github.com/babel/babel) from 7.7.7 to 7.8.2. - [Release notes](https://github.com/babel/babel/releases) - [Changelog](https://github.com/babel/babel/blob/master/CHANGELOG.md) - [Commits](https://github.com/babel/babel/compare/v7.7.7...v7.8.2) Signed-off-by: dependabot-preview[bot] --- package-lock.json | 1693 +++++++++++++++++++++++++-------------------- 1 file changed, 961 insertions(+), 732 deletions(-) diff --git a/package-lock.json b/package-lock.json index 5df371f260..7abffd177c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,6 +13,17 @@ "@babel/highlight": "^7.0.0" } }, + "@babel/compat-data": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.8.1.tgz", + "integrity": "sha512-Z+6ZOXvyOWYxJ50BwxzdhRnRsGST8Y3jaZgxYig575lTjVSs3KtJnmESwZegg6e2Dn0td1eDhoWlp1wI4BTCPw==", + "dev": true, + "requires": { + "browserslist": "^4.8.2", + "invariant": "^2.2.4", + "semver": "^5.5.0" + } + }, "@babel/core": { "version": "7.7.7", "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.7.7.tgz", @@ -190,18 +201,18 @@ } }, "@babel/helper-annotate-as-pure": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.7.4.tgz", - "integrity": "sha512-2BQmQgECKzYKFPpiycoF9tlb5HA4lrVyAmLLVK177EcQAqjVLciUb2/R+n1boQ9y5ENV3uz2ZqiNw7QMBBw1Og==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.8.0.tgz", + "integrity": "sha512-WWj+1amBdowU2g18p3/KUc1Y5kWnaNm1paohq2tT4/RreeMNssYkv6ul9wkE2iIqjwLBwNMZGH4pTGlMSUqMMg==", "dev": true, "requires": { - "@babel/types": "^7.7.4" + "@babel/types": "^7.8.0" }, "dependencies": { "@babel/types": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.7.4.tgz", - "integrity": "sha512-cz5Ji23KCi4T+YIE/BolWosrJuSmoZeN1EFnRtBwF+KKLi8GG/Z2c2hOJJeCXPk4mwk4QFvTmwIodJowXgttRA==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.0.tgz", + "integrity": "sha512-1RF84ehyx9HH09dMMwGWl3UTWlVoCPtqqJPjGuC4JzMe1ZIVDJ2DT8mv3cPv/A7veLD6sgR7vi95lJqm+ZayIg==", "dev": true, "requires": { "esutils": "^2.0.2", @@ -212,19 +223,19 @@ } }, "@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.7.4.tgz", - "integrity": "sha512-Biq/d/WtvfftWZ9Uf39hbPBYDUo986m5Bb4zhkeYDGUllF43D+nUe5M6Vuo6/8JDK/0YX/uBdeoQpyaNhNugZQ==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.8.0.tgz", + "integrity": "sha512-KbBloNiBHM3ZyHg1ViDRs4QcnAunwMJ+rLpAEA8l3cWb3Z1xof7ag1iHvX16EwhUfaTG3+YSvTRPv4xHIrseUQ==", "dev": true, "requires": { - "@babel/helper-explode-assignable-expression": "^7.7.4", - "@babel/types": "^7.7.4" + "@babel/helper-explode-assignable-expression": "^7.8.0", + "@babel/types": "^7.8.0" }, "dependencies": { "@babel/types": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.7.4.tgz", - "integrity": "sha512-cz5Ji23KCi4T+YIE/BolWosrJuSmoZeN1EFnRtBwF+KKLi8GG/Z2c2hOJJeCXPk4mwk4QFvTmwIodJowXgttRA==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.0.tgz", + "integrity": "sha512-1RF84ehyx9HH09dMMwGWl3UTWlVoCPtqqJPjGuC4JzMe1ZIVDJ2DT8mv3cPv/A7veLD6sgR7vi95lJqm+ZayIg==", "dev": true, "requires": { "esutils": "^2.0.2", @@ -235,104 +246,115 @@ } }, "@babel/helper-call-delegate": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/helper-call-delegate/-/helper-call-delegate-7.7.4.tgz", - "integrity": "sha512-8JH9/B7J7tCYJ2PpWVpw9JhPuEVHztagNVuQAFBVFYluRMlpG7F1CgKEgGeL6KFqcsIa92ZYVj6DSc0XwmN1ZA==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/helper-call-delegate/-/helper-call-delegate-7.8.0.tgz", + "integrity": "sha512-Vi8K1LScr8ZgLicfuCNSE7JWUPG/H/9Bw9zn+3vQyy4vA54FEGTCuUTOXCFwmBM93OD6jHfjrQ6ZnivM5U+bHg==", "dev": true, "requires": { - "@babel/helper-hoist-variables": "^7.7.4", - "@babel/traverse": "^7.7.4", - "@babel/types": "^7.7.4" + "@babel/helper-hoist-variables": "^7.8.0", + "@babel/traverse": "^7.8.0", + "@babel/types": "^7.8.0" }, "dependencies": { "@babel/code-frame": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", - "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.0.tgz", + "integrity": "sha512-AN2IR/wCUYsM+PdErq6Bp3RFTXl8W0p9Nmymm7zkpsCmh+r/YYcckaCGpU8Q/mEKmST19kkGRaG42A/jxOWwBA==", "dev": true, "requires": { - "@babel/highlight": "^7.0.0" + "@babel/highlight": "^7.8.0" } }, "@babel/generator": { - "version": "7.7.7", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.7.7.tgz", - "integrity": "sha512-/AOIBpHh/JU1l0ZFS4kiRCBnLi6OTHzh0RPk3h9isBxkkqELtQNFi1Vr/tiG9p1yfoUdKVwISuXWQR+hwwM4VQ==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.0.tgz", + "integrity": "sha512-2Lp2e02CV2C7j/H4n4D9YvsvdhPVVg9GDIamr6Tu4tU35mL3mzOrzl1lZ8ZJtysfZXh+y+AGORc2rPS7yHxBUg==", "dev": true, "requires": { - "@babel/types": "^7.7.4", + "@babel/types": "^7.8.0", "jsesc": "^2.5.1", "lodash": "^4.17.13", "source-map": "^0.5.0" } }, "@babel/helper-function-name": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.7.4.tgz", - "integrity": "sha512-AnkGIdiBhEuiwdoMnKm7jfPfqItZhgRaZfMg1XX3bS25INOnLPjPG1Ppnajh8eqgt5kPJnfqrRHqFqmjKDZLzQ==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.0.tgz", + "integrity": "sha512-x9psucuU0Xalw+0Vpr2FYJMLB7/KnPSLZhlkUyOGbYAWRDfmtZBrguYpJYiaNCRV7vGkYjO/gF6/J6yMvdWTDw==", "dev": true, "requires": { - "@babel/helper-get-function-arity": "^7.7.4", - "@babel/template": "^7.7.4", - "@babel/types": "^7.7.4" + "@babel/helper-get-function-arity": "^7.8.0", + "@babel/template": "^7.8.0", + "@babel/types": "^7.8.0" } }, "@babel/helper-get-function-arity": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.7.4.tgz", - "integrity": "sha512-QTGKEdCkjgzgfJ3bAyRwF4yyT3pg+vDgan8DSivq1eS0gwi+KGKE5x8kRcbeFTb/673mkO5SN1IZfmCfA5o+EA==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.0.tgz", + "integrity": "sha512-eUP5grliToMapQiTaYS2AAO/WwaCG7cuJztR1v/a1aPzUzUeGt+AaI9OvLATc/AfFkF8SLJ10d5ugGt/AQ9d6w==", "dev": true, "requires": { - "@babel/types": "^7.7.4" + "@babel/types": "^7.8.0" } }, "@babel/helper-split-export-declaration": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.7.4.tgz", - "integrity": "sha512-guAg1SXFcVr04Guk9eq0S4/rWS++sbmyqosJzVs8+1fH5NI+ZcmkaSkc7dmtAFbHFva6yRJnjW3yAcGxjueDug==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.0.tgz", + "integrity": "sha512-YhYFhH4T6DlbT6CPtVgLfC1Jp2gbCawU/ml7WJvUpBg01bCrXSzTYMZZXbbIGjq/kHmK8YUATxTppcRGzj31pA==", "dev": true, "requires": { - "@babel/types": "^7.7.4" + "@babel/types": "^7.8.0" + } + }, + "@babel/highlight": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.0.tgz", + "integrity": "sha512-OsdTJbHlPtIk2mmtwXItYrdmalJ8T0zpVzNAbKSkHshuywj7zb29Y09McV/jQsQunc/nEyHiPV2oy9llYMLqxw==", + "dev": true, + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" } }, "@babel/parser": { - "version": "7.7.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.7.7.tgz", - "integrity": "sha512-WtTZMZAZLbeymhkd/sEaPD8IQyGAhmuTuvTzLiCFM7iXiVdY0gc0IaI+cW0fh1BnSMbJSzXX6/fHllgHKwHhXw==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.0.tgz", + "integrity": "sha512-VVtsnUYbd1+2A2vOVhm4P2qNXQE8L/W859GpUHfUcdhX8d3pEKThZuIr6fztocWx9HbK+00/CR0tXnhAggJ4CA==", "dev": true }, "@babel/template": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.7.4.tgz", - "integrity": "sha512-qUzihgVPguAzXCK7WXw8pqs6cEwi54s3E+HrejlkuWO6ivMKx9hZl3Y2fSXp9i5HgyWmj7RKP+ulaYnKM4yYxw==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.0.tgz", + "integrity": "sha512-0NNMDsY2t3ltAVVK1WHNiaePo3tXPUeJpCX4I3xSKFoEl852wJHG8mrgHVADf8Lz1y+8al9cF7cSSfzSnFSYiw==", "dev": true, "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/parser": "^7.7.4", - "@babel/types": "^7.7.4" + "@babel/code-frame": "^7.8.0", + "@babel/parser": "^7.8.0", + "@babel/types": "^7.8.0" } }, "@babel/traverse": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.7.4.tgz", - "integrity": "sha512-P1L58hQyupn8+ezVA2z5KBm4/Zr4lCC8dwKCMYzsa5jFMDMQAzaBNy9W5VjB+KAmBjb40U7a/H6ao+Xo+9saIw==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.0.tgz", + "integrity": "sha512-d/6sPXFLGlJHZO/zWDtgFaKyalCOHLedzxpVJn6el1cw+f2TZa7xZEszeXdOw6EUemqRFBAn106BWBvtSck9Qw==", "dev": true, "requires": { - "@babel/code-frame": "^7.5.5", - "@babel/generator": "^7.7.4", - "@babel/helper-function-name": "^7.7.4", - "@babel/helper-split-export-declaration": "^7.7.4", - "@babel/parser": "^7.7.4", - "@babel/types": "^7.7.4", + "@babel/code-frame": "^7.8.0", + "@babel/generator": "^7.8.0", + "@babel/helper-function-name": "^7.8.0", + "@babel/helper-split-export-declaration": "^7.8.0", + "@babel/parser": "^7.8.0", + "@babel/types": "^7.8.0", "debug": "^4.1.0", "globals": "^11.1.0", "lodash": "^4.17.13" } }, "@babel/types": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.7.4.tgz", - "integrity": "sha512-cz5Ji23KCi4T+YIE/BolWosrJuSmoZeN1EFnRtBwF+KKLi8GG/Z2c2hOJJeCXPk4mwk4QFvTmwIodJowXgttRA==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.0.tgz", + "integrity": "sha512-1RF84ehyx9HH09dMMwGWl3UTWlVoCPtqqJPjGuC4JzMe1ZIVDJ2DT8mv3cPv/A7veLD6sgR7vi95lJqm+ZayIg==", "dev": true, "requires": { "esutils": "^2.0.2", @@ -354,13 +376,26 @@ } } }, - "@babel/helper-create-regexp-features-plugin": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.7.4.tgz", - "integrity": "sha512-Mt+jBKaxL0zfOIWrfQpnfYCN7/rS6GKx6CCCfuoqVVd+17R8zNDlzVYmIi9qyb2wOk002NsmSTDymkIygDUH7A==", + "@babel/helper-compilation-targets": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.8.1.tgz", + "integrity": "sha512-Fsrljg8DHSdnKSzC0YFopX7lseRpVfWMYuC1Dnvf7tw972E2KDjZ4XEaqjO9aJL0sLcG4KNRXxowDxHYIcZ+Cw==", "dev": true, "requires": { - "@babel/helper-regex": "^7.4.4", + "@babel/compat-data": "^7.8.1", + "browserslist": "^4.8.2", + "invariant": "^2.2.4", + "levenary": "^1.1.0", + "semver": "^5.5.0" + } + }, + "@babel/helper-create-regexp-features-plugin": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.8.0.tgz", + "integrity": "sha512-vJj2hPbxxLUWJEV86iZiac5curAnC3ZVc+rFmFeWZigUOcuCPpbF+KxoEmxrkmuCGylHFF9t4lkpcDUcxnhQ5g==", + "dev": true, + "requires": { + "@babel/helper-regex": "^7.8.0", "regexpu-core": "^4.6.0" }, "dependencies": { @@ -390,57 +425,77 @@ } }, "@babel/helper-define-map": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.7.4.tgz", - "integrity": "sha512-v5LorqOa0nVQUvAUTUF3KPastvUt/HzByXNamKQ6RdJRTV7j8rLL+WB5C/MzzWAwOomxDhYFb1wLLxHqox86lg==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.8.0.tgz", + "integrity": "sha512-Go06lUlZ4YImNEmdyAH5iO38yh5mbpOPSwA2PtV1vyczFhTZfX0OtzkiIL2pACo6AOYf89pLh42nhhDrqgzC3A==", "dev": true, "requires": { - "@babel/helper-function-name": "^7.7.4", - "@babel/types": "^7.7.4", + "@babel/helper-function-name": "^7.8.0", + "@babel/types": "^7.8.0", "lodash": "^4.17.13" }, "dependencies": { - "@babel/helper-function-name": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.7.4.tgz", - "integrity": "sha512-AnkGIdiBhEuiwdoMnKm7jfPfqItZhgRaZfMg1XX3bS25INOnLPjPG1Ppnajh8eqgt5kPJnfqrRHqFqmjKDZLzQ==", + "@babel/code-frame": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.0.tgz", + "integrity": "sha512-AN2IR/wCUYsM+PdErq6Bp3RFTXl8W0p9Nmymm7zkpsCmh+r/YYcckaCGpU8Q/mEKmST19kkGRaG42A/jxOWwBA==", "dev": true, "requires": { - "@babel/helper-get-function-arity": "^7.7.4", - "@babel/template": "^7.7.4", - "@babel/types": "^7.7.4" + "@babel/highlight": "^7.8.0" + } + }, + "@babel/helper-function-name": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.0.tgz", + "integrity": "sha512-x9psucuU0Xalw+0Vpr2FYJMLB7/KnPSLZhlkUyOGbYAWRDfmtZBrguYpJYiaNCRV7vGkYjO/gF6/J6yMvdWTDw==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.8.0", + "@babel/template": "^7.8.0", + "@babel/types": "^7.8.0" } }, "@babel/helper-get-function-arity": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.7.4.tgz", - "integrity": "sha512-QTGKEdCkjgzgfJ3bAyRwF4yyT3pg+vDgan8DSivq1eS0gwi+KGKE5x8kRcbeFTb/673mkO5SN1IZfmCfA5o+EA==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.0.tgz", + "integrity": "sha512-eUP5grliToMapQiTaYS2AAO/WwaCG7cuJztR1v/a1aPzUzUeGt+AaI9OvLATc/AfFkF8SLJ10d5ugGt/AQ9d6w==", "dev": true, "requires": { - "@babel/types": "^7.7.4" + "@babel/types": "^7.8.0" + } + }, + "@babel/highlight": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.0.tgz", + "integrity": "sha512-OsdTJbHlPtIk2mmtwXItYrdmalJ8T0zpVzNAbKSkHshuywj7zb29Y09McV/jQsQunc/nEyHiPV2oy9llYMLqxw==", + "dev": true, + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" } }, "@babel/parser": { - "version": "7.7.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.7.7.tgz", - "integrity": "sha512-WtTZMZAZLbeymhkd/sEaPD8IQyGAhmuTuvTzLiCFM7iXiVdY0gc0IaI+cW0fh1BnSMbJSzXX6/fHllgHKwHhXw==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.0.tgz", + "integrity": "sha512-VVtsnUYbd1+2A2vOVhm4P2qNXQE8L/W859GpUHfUcdhX8d3pEKThZuIr6fztocWx9HbK+00/CR0tXnhAggJ4CA==", "dev": true }, "@babel/template": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.7.4.tgz", - "integrity": "sha512-qUzihgVPguAzXCK7WXw8pqs6cEwi54s3E+HrejlkuWO6ivMKx9hZl3Y2fSXp9i5HgyWmj7RKP+ulaYnKM4yYxw==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.0.tgz", + "integrity": "sha512-0NNMDsY2t3ltAVVK1WHNiaePo3tXPUeJpCX4I3xSKFoEl852wJHG8mrgHVADf8Lz1y+8al9cF7cSSfzSnFSYiw==", "dev": true, "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/parser": "^7.7.4", - "@babel/types": "^7.7.4" + "@babel/code-frame": "^7.8.0", + "@babel/parser": "^7.8.0", + "@babel/types": "^7.8.0" } }, "@babel/types": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.7.4.tgz", - "integrity": "sha512-cz5Ji23KCi4T+YIE/BolWosrJuSmoZeN1EFnRtBwF+KKLi8GG/Z2c2hOJJeCXPk4mwk4QFvTmwIodJowXgttRA==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.0.tgz", + "integrity": "sha512-1RF84ehyx9HH09dMMwGWl3UTWlVoCPtqqJPjGuC4JzMe1ZIVDJ2DT8mv3cPv/A7veLD6sgR7vi95lJqm+ZayIg==", "dev": true, "requires": { "esutils": "^2.0.2", @@ -451,103 +506,114 @@ } }, "@babel/helper-explode-assignable-expression": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.7.4.tgz", - "integrity": "sha512-2/SicuFrNSXsZNBxe5UGdLr+HZg+raWBLE9vC98bdYOKX/U6PY0mdGlYUJdtTDPSU0Lw0PNbKKDpwYHJLn2jLg==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.8.0.tgz", + "integrity": "sha512-w4mRQqKAh4M7BSLwvDMm8jYFroEzpqMCtXDhFHP+kNjMIQWpbC6b0Q/RUQsJNSf54rIx6XMdci1Stf60DWw+og==", "dev": true, "requires": { - "@babel/traverse": "^7.7.4", - "@babel/types": "^7.7.4" + "@babel/traverse": "^7.8.0", + "@babel/types": "^7.8.0" }, "dependencies": { "@babel/code-frame": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", - "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.0.tgz", + "integrity": "sha512-AN2IR/wCUYsM+PdErq6Bp3RFTXl8W0p9Nmymm7zkpsCmh+r/YYcckaCGpU8Q/mEKmST19kkGRaG42A/jxOWwBA==", "dev": true, "requires": { - "@babel/highlight": "^7.0.0" + "@babel/highlight": "^7.8.0" } }, "@babel/generator": { - "version": "7.7.7", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.7.7.tgz", - "integrity": "sha512-/AOIBpHh/JU1l0ZFS4kiRCBnLi6OTHzh0RPk3h9isBxkkqELtQNFi1Vr/tiG9p1yfoUdKVwISuXWQR+hwwM4VQ==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.0.tgz", + "integrity": "sha512-2Lp2e02CV2C7j/H4n4D9YvsvdhPVVg9GDIamr6Tu4tU35mL3mzOrzl1lZ8ZJtysfZXh+y+AGORc2rPS7yHxBUg==", "dev": true, "requires": { - "@babel/types": "^7.7.4", + "@babel/types": "^7.8.0", "jsesc": "^2.5.1", "lodash": "^4.17.13", "source-map": "^0.5.0" } }, "@babel/helper-function-name": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.7.4.tgz", - "integrity": "sha512-AnkGIdiBhEuiwdoMnKm7jfPfqItZhgRaZfMg1XX3bS25INOnLPjPG1Ppnajh8eqgt5kPJnfqrRHqFqmjKDZLzQ==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.0.tgz", + "integrity": "sha512-x9psucuU0Xalw+0Vpr2FYJMLB7/KnPSLZhlkUyOGbYAWRDfmtZBrguYpJYiaNCRV7vGkYjO/gF6/J6yMvdWTDw==", "dev": true, "requires": { - "@babel/helper-get-function-arity": "^7.7.4", - "@babel/template": "^7.7.4", - "@babel/types": "^7.7.4" + "@babel/helper-get-function-arity": "^7.8.0", + "@babel/template": "^7.8.0", + "@babel/types": "^7.8.0" } }, "@babel/helper-get-function-arity": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.7.4.tgz", - "integrity": "sha512-QTGKEdCkjgzgfJ3bAyRwF4yyT3pg+vDgan8DSivq1eS0gwi+KGKE5x8kRcbeFTb/673mkO5SN1IZfmCfA5o+EA==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.0.tgz", + "integrity": "sha512-eUP5grliToMapQiTaYS2AAO/WwaCG7cuJztR1v/a1aPzUzUeGt+AaI9OvLATc/AfFkF8SLJ10d5ugGt/AQ9d6w==", "dev": true, "requires": { - "@babel/types": "^7.7.4" + "@babel/types": "^7.8.0" } }, "@babel/helper-split-export-declaration": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.7.4.tgz", - "integrity": "sha512-guAg1SXFcVr04Guk9eq0S4/rWS++sbmyqosJzVs8+1fH5NI+ZcmkaSkc7dmtAFbHFva6yRJnjW3yAcGxjueDug==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.0.tgz", + "integrity": "sha512-YhYFhH4T6DlbT6CPtVgLfC1Jp2gbCawU/ml7WJvUpBg01bCrXSzTYMZZXbbIGjq/kHmK8YUATxTppcRGzj31pA==", "dev": true, "requires": { - "@babel/types": "^7.7.4" + "@babel/types": "^7.8.0" + } + }, + "@babel/highlight": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.0.tgz", + "integrity": "sha512-OsdTJbHlPtIk2mmtwXItYrdmalJ8T0zpVzNAbKSkHshuywj7zb29Y09McV/jQsQunc/nEyHiPV2oy9llYMLqxw==", + "dev": true, + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" } }, "@babel/parser": { - "version": "7.7.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.7.7.tgz", - "integrity": "sha512-WtTZMZAZLbeymhkd/sEaPD8IQyGAhmuTuvTzLiCFM7iXiVdY0gc0IaI+cW0fh1BnSMbJSzXX6/fHllgHKwHhXw==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.0.tgz", + "integrity": "sha512-VVtsnUYbd1+2A2vOVhm4P2qNXQE8L/W859GpUHfUcdhX8d3pEKThZuIr6fztocWx9HbK+00/CR0tXnhAggJ4CA==", "dev": true }, "@babel/template": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.7.4.tgz", - "integrity": "sha512-qUzihgVPguAzXCK7WXw8pqs6cEwi54s3E+HrejlkuWO6ivMKx9hZl3Y2fSXp9i5HgyWmj7RKP+ulaYnKM4yYxw==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.0.tgz", + "integrity": "sha512-0NNMDsY2t3ltAVVK1WHNiaePo3tXPUeJpCX4I3xSKFoEl852wJHG8mrgHVADf8Lz1y+8al9cF7cSSfzSnFSYiw==", "dev": true, "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/parser": "^7.7.4", - "@babel/types": "^7.7.4" + "@babel/code-frame": "^7.8.0", + "@babel/parser": "^7.8.0", + "@babel/types": "^7.8.0" } }, "@babel/traverse": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.7.4.tgz", - "integrity": "sha512-P1L58hQyupn8+ezVA2z5KBm4/Zr4lCC8dwKCMYzsa5jFMDMQAzaBNy9W5VjB+KAmBjb40U7a/H6ao+Xo+9saIw==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.0.tgz", + "integrity": "sha512-d/6sPXFLGlJHZO/zWDtgFaKyalCOHLedzxpVJn6el1cw+f2TZa7xZEszeXdOw6EUemqRFBAn106BWBvtSck9Qw==", "dev": true, "requires": { - "@babel/code-frame": "^7.5.5", - "@babel/generator": "^7.7.4", - "@babel/helper-function-name": "^7.7.4", - "@babel/helper-split-export-declaration": "^7.7.4", - "@babel/parser": "^7.7.4", - "@babel/types": "^7.7.4", + "@babel/code-frame": "^7.8.0", + "@babel/generator": "^7.8.0", + "@babel/helper-function-name": "^7.8.0", + "@babel/helper-split-export-declaration": "^7.8.0", + "@babel/parser": "^7.8.0", + "@babel/types": "^7.8.0", "debug": "^4.1.0", "globals": "^11.1.0", "lodash": "^4.17.13" } }, "@babel/types": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.7.4.tgz", - "integrity": "sha512-cz5Ji23KCi4T+YIE/BolWosrJuSmoZeN1EFnRtBwF+KKLi8GG/Z2c2hOJJeCXPk4mwk4QFvTmwIodJowXgttRA==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.0.tgz", + "integrity": "sha512-1RF84ehyx9HH09dMMwGWl3UTWlVoCPtqqJPjGuC4JzMe1ZIVDJ2DT8mv3cPv/A7veLD6sgR7vi95lJqm+ZayIg==", "dev": true, "requires": { "esutils": "^2.0.2", @@ -590,18 +656,18 @@ } }, "@babel/helper-hoist-variables": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.7.4.tgz", - "integrity": "sha512-wQC4xyvc1Jo/FnLirL6CEgPgPCa8M74tOdjWpRhQYapz5JC7u3NYU1zCVoVAGCE3EaIP9T1A3iW0WLJ+reZlpQ==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.8.0.tgz", + "integrity": "sha512-jDl66KvuklTXUADcoXDMur1jDtAZUZZkzLIaQ54+z38ih8C0V0hC56hMaoVoyoxN60MwQmmrHctBwcLqP0c/Lw==", "dev": true, "requires": { - "@babel/types": "^7.7.4" + "@babel/types": "^7.8.0" }, "dependencies": { "@babel/types": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.7.4.tgz", - "integrity": "sha512-cz5Ji23KCi4T+YIE/BolWosrJuSmoZeN1EFnRtBwF+KKLi8GG/Z2c2hOJJeCXPk4mwk4QFvTmwIodJowXgttRA==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.0.tgz", + "integrity": "sha512-1RF84ehyx9HH09dMMwGWl3UTWlVoCPtqqJPjGuC4JzMe1ZIVDJ2DT8mv3cPv/A7veLD6sgR7vi95lJqm+ZayIg==", "dev": true, "requires": { "esutils": "^2.0.2", @@ -612,18 +678,18 @@ } }, "@babel/helper-member-expression-to-functions": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.7.4.tgz", - "integrity": "sha512-9KcA1X2E3OjXl/ykfMMInBK+uVdfIVakVe7W7Lg3wfXUNyS3Q1HWLFRwZIjhqiCGbslummPDnmb7vIekS0C1vw==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.8.0.tgz", + "integrity": "sha512-0m1QabGrdXuoxX/g+KOAGndoHwskC70WweqHRQyCsaO67KOEELYh4ECcGw6ZGKjDKa5Y7SW4Qbhw6ly4Fah/jQ==", "dev": true, "requires": { - "@babel/types": "^7.7.4" + "@babel/types": "^7.8.0" }, "dependencies": { "@babel/types": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.7.4.tgz", - "integrity": "sha512-cz5Ji23KCi4T+YIE/BolWosrJuSmoZeN1EFnRtBwF+KKLi8GG/Z2c2hOJJeCXPk4mwk4QFvTmwIodJowXgttRA==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.0.tgz", + "integrity": "sha512-1RF84ehyx9HH09dMMwGWl3UTWlVoCPtqqJPjGuC4JzMe1ZIVDJ2DT8mv3cPv/A7veLD6sgR7vi95lJqm+ZayIg==", "dev": true, "requires": { "esutils": "^2.0.2", @@ -643,58 +709,78 @@ } }, "@babel/helper-module-transforms": { - "version": "7.7.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.7.5.tgz", - "integrity": "sha512-A7pSxyJf1gN5qXVcidwLWydjftUN878VkalhXX5iQDuGyiGK3sOrrKKHF4/A4fwHtnsotv/NipwAeLzY4KQPvw==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.8.0.tgz", + "integrity": "sha512-fvGhX4FY7YwRdWW/zfddNaKpYl8TaA8hvwONIYhv1/a1ZbgxbTrjsmH6IGWUgUNki7QzbpZ27OEh88sZdft3YA==", "dev": true, "requires": { - "@babel/helper-module-imports": "^7.7.4", - "@babel/helper-simple-access": "^7.7.4", - "@babel/helper-split-export-declaration": "^7.7.4", - "@babel/template": "^7.7.4", - "@babel/types": "^7.7.4", + "@babel/helper-module-imports": "^7.8.0", + "@babel/helper-simple-access": "^7.8.0", + "@babel/helper-split-export-declaration": "^7.8.0", + "@babel/template": "^7.8.0", + "@babel/types": "^7.8.0", "lodash": "^4.17.13" }, "dependencies": { - "@babel/helper-module-imports": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.7.4.tgz", - "integrity": "sha512-dGcrX6K9l8258WFjyDLJwuVKxR4XZfU0/vTUgOQYWEnRD8mgr+p4d6fCUMq/ys0h4CCt/S5JhbvtyErjWouAUQ==", + "@babel/code-frame": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.0.tgz", + "integrity": "sha512-AN2IR/wCUYsM+PdErq6Bp3RFTXl8W0p9Nmymm7zkpsCmh+r/YYcckaCGpU8Q/mEKmST19kkGRaG42A/jxOWwBA==", "dev": true, "requires": { - "@babel/types": "^7.7.4" + "@babel/highlight": "^7.8.0" + } + }, + "@babel/helper-module-imports": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.8.0.tgz", + "integrity": "sha512-ylY9J6ZxEcjmJaJ4P6aVs/fZdrZVctCGnxxfYXwCnSMapqd544zT8lWK2qI/vBPjE5gS0o2jILnH+AkpsPauEQ==", + "dev": true, + "requires": { + "@babel/types": "^7.8.0" } }, "@babel/helper-split-export-declaration": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.7.4.tgz", - "integrity": "sha512-guAg1SXFcVr04Guk9eq0S4/rWS++sbmyqosJzVs8+1fH5NI+ZcmkaSkc7dmtAFbHFva6yRJnjW3yAcGxjueDug==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.0.tgz", + "integrity": "sha512-YhYFhH4T6DlbT6CPtVgLfC1Jp2gbCawU/ml7WJvUpBg01bCrXSzTYMZZXbbIGjq/kHmK8YUATxTppcRGzj31pA==", "dev": true, "requires": { - "@babel/types": "^7.7.4" + "@babel/types": "^7.8.0" + } + }, + "@babel/highlight": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.0.tgz", + "integrity": "sha512-OsdTJbHlPtIk2mmtwXItYrdmalJ8T0zpVzNAbKSkHshuywj7zb29Y09McV/jQsQunc/nEyHiPV2oy9llYMLqxw==", + "dev": true, + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" } }, "@babel/parser": { - "version": "7.7.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.7.7.tgz", - "integrity": "sha512-WtTZMZAZLbeymhkd/sEaPD8IQyGAhmuTuvTzLiCFM7iXiVdY0gc0IaI+cW0fh1BnSMbJSzXX6/fHllgHKwHhXw==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.0.tgz", + "integrity": "sha512-VVtsnUYbd1+2A2vOVhm4P2qNXQE8L/W859GpUHfUcdhX8d3pEKThZuIr6fztocWx9HbK+00/CR0tXnhAggJ4CA==", "dev": true }, "@babel/template": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.7.4.tgz", - "integrity": "sha512-qUzihgVPguAzXCK7WXw8pqs6cEwi54s3E+HrejlkuWO6ivMKx9hZl3Y2fSXp9i5HgyWmj7RKP+ulaYnKM4yYxw==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.0.tgz", + "integrity": "sha512-0NNMDsY2t3ltAVVK1WHNiaePo3tXPUeJpCX4I3xSKFoEl852wJHG8mrgHVADf8Lz1y+8al9cF7cSSfzSnFSYiw==", "dev": true, "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/parser": "^7.7.4", - "@babel/types": "^7.7.4" + "@babel/code-frame": "^7.8.0", + "@babel/parser": "^7.8.0", + "@babel/types": "^7.8.0" } }, "@babel/types": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.7.4.tgz", - "integrity": "sha512-cz5Ji23KCi4T+YIE/BolWosrJuSmoZeN1EFnRtBwF+KKLi8GG/Z2c2hOJJeCXPk4mwk4QFvTmwIodJowXgttRA==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.0.tgz", + "integrity": "sha512-1RF84ehyx9HH09dMMwGWl3UTWlVoCPtqqJPjGuC4JzMe1ZIVDJ2DT8mv3cPv/A7veLD6sgR7vi95lJqm+ZayIg==", "dev": true, "requires": { "esutils": "^2.0.2", @@ -705,18 +791,18 @@ } }, "@babel/helper-optimise-call-expression": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.7.4.tgz", - "integrity": "sha512-VB7gWZ2fDkSuqW6b1AKXkJWO5NyNI3bFL/kK79/30moK57blr6NbH8xcl2XcKCwOmJosftWunZqfO84IGq3ZZg==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.8.0.tgz", + "integrity": "sha512-aiJt1m+K57y0n10fTw+QXcCXzmpkG+o+NoQmAZqlZPstkTE0PZT+Z27QSd/6Gf00nuXJQO4NiJ0/YagSW5kC2A==", "dev": true, "requires": { - "@babel/types": "^7.7.4" + "@babel/types": "^7.8.0" }, "dependencies": { "@babel/types": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.7.4.tgz", - "integrity": "sha512-cz5Ji23KCi4T+YIE/BolWosrJuSmoZeN1EFnRtBwF+KKLi8GG/Z2c2hOJJeCXPk4mwk4QFvTmwIodJowXgttRA==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.0.tgz", + "integrity": "sha512-1RF84ehyx9HH09dMMwGWl3UTWlVoCPtqqJPjGuC4JzMe1ZIVDJ2DT8mv3cPv/A7veLD6sgR7vi95lJqm+ZayIg==", "dev": true, "requires": { "esutils": "^2.0.2", @@ -727,123 +813,132 @@ } }, "@babel/helper-plugin-utils": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0.tgz", - "integrity": "sha512-CYAOUCARwExnEixLdB6sDm2dIJ/YgEAKDM1MOeMeZu9Ld/bDgVo8aiWrXwcY7OBh+1Ea2uUcVRcxKk0GJvW7QA==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.0.tgz", + "integrity": "sha512-+hAlRGdf8fHQAyNnDBqTHQhwdLURLdrCROoWaEQYiQhk2sV9Rhs+GoFZZfMJExTq9HG8o2NX3uN2G90bFtmFdA==", "dev": true }, "@babel/helper-regex": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.5.5.tgz", - "integrity": "sha512-CkCYQLkfkiugbRDO8eZn6lRuR8kzZoGXCg3149iTk5se7g6qykSpy3+hELSwquhu+TgHn8nkLiBwHvNX8Hofcw==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.8.0.tgz", + "integrity": "sha512-haD8fRsPtyFZkbtxBIaGBBHRtbn0YsyecdYrxNgO0Bl6SlGokJPQX9M2tDuVbeQBYHZVLUPMSwGQn4obHevsMQ==", "dev": true, "requires": { "lodash": "^4.17.13" } }, "@babel/helper-remap-async-to-generator": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.7.4.tgz", - "integrity": "sha512-Sk4xmtVdM9sA/jCI80f+KS+Md+ZHIpjuqmYPk1M7F/upHou5e4ReYmExAiu6PVe65BhJPZA2CY9x9k4BqE5klw==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.8.0.tgz", + "integrity": "sha512-+aKyBd4oHAaIZgOLq/uLjkUz7ExZ0ppdNBc8Qr72BmtKNAy3A6EJa/ifjj0//CIzQtUDPs3E6HjKM2cV6bnXsQ==", "dev": true, "requires": { - "@babel/helper-annotate-as-pure": "^7.7.4", - "@babel/helper-wrap-function": "^7.7.4", - "@babel/template": "^7.7.4", - "@babel/traverse": "^7.7.4", - "@babel/types": "^7.7.4" + "@babel/helper-annotate-as-pure": "^7.8.0", + "@babel/helper-wrap-function": "^7.8.0", + "@babel/template": "^7.8.0", + "@babel/traverse": "^7.8.0", + "@babel/types": "^7.8.0" }, "dependencies": { - "@babel/generator": { - "version": "7.7.7", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.7.7.tgz", - "integrity": "sha512-/AOIBpHh/JU1l0ZFS4kiRCBnLi6OTHzh0RPk3h9isBxkkqELtQNFi1Vr/tiG9p1yfoUdKVwISuXWQR+hwwM4VQ==", + "@babel/code-frame": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.0.tgz", + "integrity": "sha512-AN2IR/wCUYsM+PdErq6Bp3RFTXl8W0p9Nmymm7zkpsCmh+r/YYcckaCGpU8Q/mEKmST19kkGRaG42A/jxOWwBA==", "dev": true, "requires": { - "@babel/types": "^7.7.4", + "@babel/highlight": "^7.8.0" + } + }, + "@babel/generator": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.0.tgz", + "integrity": "sha512-2Lp2e02CV2C7j/H4n4D9YvsvdhPVVg9GDIamr6Tu4tU35mL3mzOrzl1lZ8ZJtysfZXh+y+AGORc2rPS7yHxBUg==", + "dev": true, + "requires": { + "@babel/types": "^7.8.0", "jsesc": "^2.5.1", "lodash": "^4.17.13", "source-map": "^0.5.0" } }, "@babel/helper-function-name": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.7.4.tgz", - "integrity": "sha512-AnkGIdiBhEuiwdoMnKm7jfPfqItZhgRaZfMg1XX3bS25INOnLPjPG1Ppnajh8eqgt5kPJnfqrRHqFqmjKDZLzQ==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.0.tgz", + "integrity": "sha512-x9psucuU0Xalw+0Vpr2FYJMLB7/KnPSLZhlkUyOGbYAWRDfmtZBrguYpJYiaNCRV7vGkYjO/gF6/J6yMvdWTDw==", "dev": true, "requires": { - "@babel/helper-get-function-arity": "^7.7.4", - "@babel/template": "^7.7.4", - "@babel/types": "^7.7.4" + "@babel/helper-get-function-arity": "^7.8.0", + "@babel/template": "^7.8.0", + "@babel/types": "^7.8.0" } }, "@babel/helper-get-function-arity": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.7.4.tgz", - "integrity": "sha512-QTGKEdCkjgzgfJ3bAyRwF4yyT3pg+vDgan8DSivq1eS0gwi+KGKE5x8kRcbeFTb/673mkO5SN1IZfmCfA5o+EA==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.0.tgz", + "integrity": "sha512-eUP5grliToMapQiTaYS2AAO/WwaCG7cuJztR1v/a1aPzUzUeGt+AaI9OvLATc/AfFkF8SLJ10d5ugGt/AQ9d6w==", "dev": true, "requires": { - "@babel/types": "^7.7.4" + "@babel/types": "^7.8.0" } }, "@babel/helper-split-export-declaration": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.7.4.tgz", - "integrity": "sha512-guAg1SXFcVr04Guk9eq0S4/rWS++sbmyqosJzVs8+1fH5NI+ZcmkaSkc7dmtAFbHFva6yRJnjW3yAcGxjueDug==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.0.tgz", + "integrity": "sha512-YhYFhH4T6DlbT6CPtVgLfC1Jp2gbCawU/ml7WJvUpBg01bCrXSzTYMZZXbbIGjq/kHmK8YUATxTppcRGzj31pA==", "dev": true, "requires": { - "@babel/types": "^7.7.4" + "@babel/types": "^7.8.0" + } + }, + "@babel/highlight": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.0.tgz", + "integrity": "sha512-OsdTJbHlPtIk2mmtwXItYrdmalJ8T0zpVzNAbKSkHshuywj7zb29Y09McV/jQsQunc/nEyHiPV2oy9llYMLqxw==", + "dev": true, + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" } }, "@babel/parser": { - "version": "7.7.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.7.7.tgz", - "integrity": "sha512-WtTZMZAZLbeymhkd/sEaPD8IQyGAhmuTuvTzLiCFM7iXiVdY0gc0IaI+cW0fh1BnSMbJSzXX6/fHllgHKwHhXw==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.0.tgz", + "integrity": "sha512-VVtsnUYbd1+2A2vOVhm4P2qNXQE8L/W859GpUHfUcdhX8d3pEKThZuIr6fztocWx9HbK+00/CR0tXnhAggJ4CA==", "dev": true }, "@babel/template": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.7.4.tgz", - "integrity": "sha512-qUzihgVPguAzXCK7WXw8pqs6cEwi54s3E+HrejlkuWO6ivMKx9hZl3Y2fSXp9i5HgyWmj7RKP+ulaYnKM4yYxw==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.0.tgz", + "integrity": "sha512-0NNMDsY2t3ltAVVK1WHNiaePo3tXPUeJpCX4I3xSKFoEl852wJHG8mrgHVADf8Lz1y+8al9cF7cSSfzSnFSYiw==", "dev": true, "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/parser": "^7.7.4", - "@babel/types": "^7.7.4" + "@babel/code-frame": "^7.8.0", + "@babel/parser": "^7.8.0", + "@babel/types": "^7.8.0" } }, "@babel/traverse": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.7.4.tgz", - "integrity": "sha512-P1L58hQyupn8+ezVA2z5KBm4/Zr4lCC8dwKCMYzsa5jFMDMQAzaBNy9W5VjB+KAmBjb40U7a/H6ao+Xo+9saIw==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.0.tgz", + "integrity": "sha512-d/6sPXFLGlJHZO/zWDtgFaKyalCOHLedzxpVJn6el1cw+f2TZa7xZEszeXdOw6EUemqRFBAn106BWBvtSck9Qw==", "dev": true, "requires": { - "@babel/code-frame": "^7.5.5", - "@babel/generator": "^7.7.4", - "@babel/helper-function-name": "^7.7.4", - "@babel/helper-split-export-declaration": "^7.7.4", - "@babel/parser": "^7.7.4", - "@babel/types": "^7.7.4", + "@babel/code-frame": "^7.8.0", + "@babel/generator": "^7.8.0", + "@babel/helper-function-name": "^7.8.0", + "@babel/helper-split-export-declaration": "^7.8.0", + "@babel/parser": "^7.8.0", + "@babel/types": "^7.8.0", "debug": "^4.1.0", "globals": "^11.1.0", "lodash": "^4.17.13" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", - "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", - "dev": true, - "requires": { - "@babel/highlight": "^7.0.0" - } - } } }, "@babel/types": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.7.4.tgz", - "integrity": "sha512-cz5Ji23KCi4T+YIE/BolWosrJuSmoZeN1EFnRtBwF+KKLi8GG/Z2c2hOJJeCXPk4mwk4QFvTmwIodJowXgttRA==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.0.tgz", + "integrity": "sha512-1RF84ehyx9HH09dMMwGWl3UTWlVoCPtqqJPjGuC4JzMe1ZIVDJ2DT8mv3cPv/A7veLD6sgR7vi95lJqm+ZayIg==", "dev": true, "requires": { "esutils": "^2.0.2", @@ -866,105 +961,116 @@ } }, "@babel/helper-replace-supers": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.7.4.tgz", - "integrity": "sha512-pP0tfgg9hsZWo5ZboYGuBn/bbYT/hdLPVSS4NMmiRJdwWhP0IznPwN9AE1JwyGsjSPLC364I0Qh5p+EPkGPNpg==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.8.0.tgz", + "integrity": "sha512-R2CyorW4tcO3YzdkClLpt6MS84G+tPkOi0MmiCn1bvYVnmDpdl9R15XOi3NQW2mhOAEeBnuQ4g1Bh7pT2sX8fg==", "dev": true, "requires": { - "@babel/helper-member-expression-to-functions": "^7.7.4", - "@babel/helper-optimise-call-expression": "^7.7.4", - "@babel/traverse": "^7.7.4", - "@babel/types": "^7.7.4" + "@babel/helper-member-expression-to-functions": "^7.8.0", + "@babel/helper-optimise-call-expression": "^7.8.0", + "@babel/traverse": "^7.8.0", + "@babel/types": "^7.8.0" }, "dependencies": { "@babel/code-frame": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", - "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.0.tgz", + "integrity": "sha512-AN2IR/wCUYsM+PdErq6Bp3RFTXl8W0p9Nmymm7zkpsCmh+r/YYcckaCGpU8Q/mEKmST19kkGRaG42A/jxOWwBA==", "dev": true, "requires": { - "@babel/highlight": "^7.0.0" + "@babel/highlight": "^7.8.0" } }, "@babel/generator": { - "version": "7.7.7", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.7.7.tgz", - "integrity": "sha512-/AOIBpHh/JU1l0ZFS4kiRCBnLi6OTHzh0RPk3h9isBxkkqELtQNFi1Vr/tiG9p1yfoUdKVwISuXWQR+hwwM4VQ==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.0.tgz", + "integrity": "sha512-2Lp2e02CV2C7j/H4n4D9YvsvdhPVVg9GDIamr6Tu4tU35mL3mzOrzl1lZ8ZJtysfZXh+y+AGORc2rPS7yHxBUg==", "dev": true, "requires": { - "@babel/types": "^7.7.4", + "@babel/types": "^7.8.0", "jsesc": "^2.5.1", "lodash": "^4.17.13", "source-map": "^0.5.0" } }, "@babel/helper-function-name": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.7.4.tgz", - "integrity": "sha512-AnkGIdiBhEuiwdoMnKm7jfPfqItZhgRaZfMg1XX3bS25INOnLPjPG1Ppnajh8eqgt5kPJnfqrRHqFqmjKDZLzQ==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.0.tgz", + "integrity": "sha512-x9psucuU0Xalw+0Vpr2FYJMLB7/KnPSLZhlkUyOGbYAWRDfmtZBrguYpJYiaNCRV7vGkYjO/gF6/J6yMvdWTDw==", "dev": true, "requires": { - "@babel/helper-get-function-arity": "^7.7.4", - "@babel/template": "^7.7.4", - "@babel/types": "^7.7.4" + "@babel/helper-get-function-arity": "^7.8.0", + "@babel/template": "^7.8.0", + "@babel/types": "^7.8.0" } }, "@babel/helper-get-function-arity": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.7.4.tgz", - "integrity": "sha512-QTGKEdCkjgzgfJ3bAyRwF4yyT3pg+vDgan8DSivq1eS0gwi+KGKE5x8kRcbeFTb/673mkO5SN1IZfmCfA5o+EA==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.0.tgz", + "integrity": "sha512-eUP5grliToMapQiTaYS2AAO/WwaCG7cuJztR1v/a1aPzUzUeGt+AaI9OvLATc/AfFkF8SLJ10d5ugGt/AQ9d6w==", "dev": true, "requires": { - "@babel/types": "^7.7.4" + "@babel/types": "^7.8.0" } }, "@babel/helper-split-export-declaration": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.7.4.tgz", - "integrity": "sha512-guAg1SXFcVr04Guk9eq0S4/rWS++sbmyqosJzVs8+1fH5NI+ZcmkaSkc7dmtAFbHFva6yRJnjW3yAcGxjueDug==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.0.tgz", + "integrity": "sha512-YhYFhH4T6DlbT6CPtVgLfC1Jp2gbCawU/ml7WJvUpBg01bCrXSzTYMZZXbbIGjq/kHmK8YUATxTppcRGzj31pA==", "dev": true, "requires": { - "@babel/types": "^7.7.4" + "@babel/types": "^7.8.0" + } + }, + "@babel/highlight": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.0.tgz", + "integrity": "sha512-OsdTJbHlPtIk2mmtwXItYrdmalJ8T0zpVzNAbKSkHshuywj7zb29Y09McV/jQsQunc/nEyHiPV2oy9llYMLqxw==", + "dev": true, + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" } }, "@babel/parser": { - "version": "7.7.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.7.7.tgz", - "integrity": "sha512-WtTZMZAZLbeymhkd/sEaPD8IQyGAhmuTuvTzLiCFM7iXiVdY0gc0IaI+cW0fh1BnSMbJSzXX6/fHllgHKwHhXw==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.0.tgz", + "integrity": "sha512-VVtsnUYbd1+2A2vOVhm4P2qNXQE8L/W859GpUHfUcdhX8d3pEKThZuIr6fztocWx9HbK+00/CR0tXnhAggJ4CA==", "dev": true }, "@babel/template": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.7.4.tgz", - "integrity": "sha512-qUzihgVPguAzXCK7WXw8pqs6cEwi54s3E+HrejlkuWO6ivMKx9hZl3Y2fSXp9i5HgyWmj7RKP+ulaYnKM4yYxw==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.0.tgz", + "integrity": "sha512-0NNMDsY2t3ltAVVK1WHNiaePo3tXPUeJpCX4I3xSKFoEl852wJHG8mrgHVADf8Lz1y+8al9cF7cSSfzSnFSYiw==", "dev": true, "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/parser": "^7.7.4", - "@babel/types": "^7.7.4" + "@babel/code-frame": "^7.8.0", + "@babel/parser": "^7.8.0", + "@babel/types": "^7.8.0" } }, "@babel/traverse": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.7.4.tgz", - "integrity": "sha512-P1L58hQyupn8+ezVA2z5KBm4/Zr4lCC8dwKCMYzsa5jFMDMQAzaBNy9W5VjB+KAmBjb40U7a/H6ao+Xo+9saIw==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.0.tgz", + "integrity": "sha512-d/6sPXFLGlJHZO/zWDtgFaKyalCOHLedzxpVJn6el1cw+f2TZa7xZEszeXdOw6EUemqRFBAn106BWBvtSck9Qw==", "dev": true, "requires": { - "@babel/code-frame": "^7.5.5", - "@babel/generator": "^7.7.4", - "@babel/helper-function-name": "^7.7.4", - "@babel/helper-split-export-declaration": "^7.7.4", - "@babel/parser": "^7.7.4", - "@babel/types": "^7.7.4", + "@babel/code-frame": "^7.8.0", + "@babel/generator": "^7.8.0", + "@babel/helper-function-name": "^7.8.0", + "@babel/helper-split-export-declaration": "^7.8.0", + "@babel/parser": "^7.8.0", + "@babel/types": "^7.8.0", "debug": "^4.1.0", "globals": "^11.1.0", "lodash": "^4.17.13" } }, "@babel/types": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.7.4.tgz", - "integrity": "sha512-cz5Ji23KCi4T+YIE/BolWosrJuSmoZeN1EFnRtBwF+KKLi8GG/Z2c2hOJJeCXPk4mwk4QFvTmwIodJowXgttRA==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.0.tgz", + "integrity": "sha512-1RF84ehyx9HH09dMMwGWl3UTWlVoCPtqqJPjGuC4JzMe1ZIVDJ2DT8mv3cPv/A7veLD6sgR7vi95lJqm+ZayIg==", "dev": true, "requires": { "esutils": "^2.0.2", @@ -987,36 +1093,56 @@ } }, "@babel/helper-simple-access": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.7.4.tgz", - "integrity": "sha512-zK7THeEXfan7UlWsG2A6CI/L9jVnI5+xxKZOdej39Y0YtDYKx9raHk5F2EtK9K8DHRTihYwg20ADt9S36GR78A==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.8.0.tgz", + "integrity": "sha512-I+7yKZJnxp7VIC2UFzXfVjLiJuU16rYFF59x27c+boINkO/pLETgZcoesCryg9jmU4jxEa0foFueW+2wjc9Gsw==", "dev": true, "requires": { - "@babel/template": "^7.7.4", - "@babel/types": "^7.7.4" + "@babel/template": "^7.8.0", + "@babel/types": "^7.8.0" }, "dependencies": { + "@babel/code-frame": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.0.tgz", + "integrity": "sha512-AN2IR/wCUYsM+PdErq6Bp3RFTXl8W0p9Nmymm7zkpsCmh+r/YYcckaCGpU8Q/mEKmST19kkGRaG42A/jxOWwBA==", + "dev": true, + "requires": { + "@babel/highlight": "^7.8.0" + } + }, + "@babel/highlight": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.0.tgz", + "integrity": "sha512-OsdTJbHlPtIk2mmtwXItYrdmalJ8T0zpVzNAbKSkHshuywj7zb29Y09McV/jQsQunc/nEyHiPV2oy9llYMLqxw==", + "dev": true, + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" + } + }, "@babel/parser": { - "version": "7.7.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.7.7.tgz", - "integrity": "sha512-WtTZMZAZLbeymhkd/sEaPD8IQyGAhmuTuvTzLiCFM7iXiVdY0gc0IaI+cW0fh1BnSMbJSzXX6/fHllgHKwHhXw==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.0.tgz", + "integrity": "sha512-VVtsnUYbd1+2A2vOVhm4P2qNXQE8L/W859GpUHfUcdhX8d3pEKThZuIr6fztocWx9HbK+00/CR0tXnhAggJ4CA==", "dev": true }, "@babel/template": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.7.4.tgz", - "integrity": "sha512-qUzihgVPguAzXCK7WXw8pqs6cEwi54s3E+HrejlkuWO6ivMKx9hZl3Y2fSXp9i5HgyWmj7RKP+ulaYnKM4yYxw==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.0.tgz", + "integrity": "sha512-0NNMDsY2t3ltAVVK1WHNiaePo3tXPUeJpCX4I3xSKFoEl852wJHG8mrgHVADf8Lz1y+8al9cF7cSSfzSnFSYiw==", "dev": true, "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/parser": "^7.7.4", - "@babel/types": "^7.7.4" + "@babel/code-frame": "^7.8.0", + "@babel/parser": "^7.8.0", + "@babel/types": "^7.8.0" } }, "@babel/types": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.7.4.tgz", - "integrity": "sha512-cz5Ji23KCi4T+YIE/BolWosrJuSmoZeN1EFnRtBwF+KKLi8GG/Z2c2hOJJeCXPk4mwk4QFvTmwIodJowXgttRA==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.0.tgz", + "integrity": "sha512-1RF84ehyx9HH09dMMwGWl3UTWlVoCPtqqJPjGuC4JzMe1ZIVDJ2DT8mv3cPv/A7veLD6sgR7vi95lJqm+ZayIg==", "dev": true, "requires": { "esutils": "^2.0.2", @@ -1036,107 +1162,116 @@ } }, "@babel/helper-wrap-function": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.7.4.tgz", - "integrity": "sha512-VsfzZt6wmsocOaVU0OokwrIytHND55yvyT4BPB9AIIgwr8+x7617hetdJTsuGwygN5RC6mxA9EJztTjuwm2ofg==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.8.0.tgz", + "integrity": "sha512-2j6idN2jt8Y+8nJ4UPN/6AZa53DAkcETMVmroJQh50qZc59PuQKVjgOIIqmrLoQf6Ia9bs90MHRcID1OW5tfag==", "dev": true, "requires": { - "@babel/helper-function-name": "^7.7.4", - "@babel/template": "^7.7.4", - "@babel/traverse": "^7.7.4", - "@babel/types": "^7.7.4" + "@babel/helper-function-name": "^7.8.0", + "@babel/template": "^7.8.0", + "@babel/traverse": "^7.8.0", + "@babel/types": "^7.8.0" }, "dependencies": { - "@babel/generator": { - "version": "7.7.7", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.7.7.tgz", - "integrity": "sha512-/AOIBpHh/JU1l0ZFS4kiRCBnLi6OTHzh0RPk3h9isBxkkqELtQNFi1Vr/tiG9p1yfoUdKVwISuXWQR+hwwM4VQ==", + "@babel/code-frame": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.0.tgz", + "integrity": "sha512-AN2IR/wCUYsM+PdErq6Bp3RFTXl8W0p9Nmymm7zkpsCmh+r/YYcckaCGpU8Q/mEKmST19kkGRaG42A/jxOWwBA==", "dev": true, "requires": { - "@babel/types": "^7.7.4", + "@babel/highlight": "^7.8.0" + } + }, + "@babel/generator": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.0.tgz", + "integrity": "sha512-2Lp2e02CV2C7j/H4n4D9YvsvdhPVVg9GDIamr6Tu4tU35mL3mzOrzl1lZ8ZJtysfZXh+y+AGORc2rPS7yHxBUg==", + "dev": true, + "requires": { + "@babel/types": "^7.8.0", "jsesc": "^2.5.1", "lodash": "^4.17.13", "source-map": "^0.5.0" } }, "@babel/helper-function-name": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.7.4.tgz", - "integrity": "sha512-AnkGIdiBhEuiwdoMnKm7jfPfqItZhgRaZfMg1XX3bS25INOnLPjPG1Ppnajh8eqgt5kPJnfqrRHqFqmjKDZLzQ==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.0.tgz", + "integrity": "sha512-x9psucuU0Xalw+0Vpr2FYJMLB7/KnPSLZhlkUyOGbYAWRDfmtZBrguYpJYiaNCRV7vGkYjO/gF6/J6yMvdWTDw==", "dev": true, "requires": { - "@babel/helper-get-function-arity": "^7.7.4", - "@babel/template": "^7.7.4", - "@babel/types": "^7.7.4" + "@babel/helper-get-function-arity": "^7.8.0", + "@babel/template": "^7.8.0", + "@babel/types": "^7.8.0" } }, "@babel/helper-get-function-arity": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.7.4.tgz", - "integrity": "sha512-QTGKEdCkjgzgfJ3bAyRwF4yyT3pg+vDgan8DSivq1eS0gwi+KGKE5x8kRcbeFTb/673mkO5SN1IZfmCfA5o+EA==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.0.tgz", + "integrity": "sha512-eUP5grliToMapQiTaYS2AAO/WwaCG7cuJztR1v/a1aPzUzUeGt+AaI9OvLATc/AfFkF8SLJ10d5ugGt/AQ9d6w==", "dev": true, "requires": { - "@babel/types": "^7.7.4" + "@babel/types": "^7.8.0" } }, "@babel/helper-split-export-declaration": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.7.4.tgz", - "integrity": "sha512-guAg1SXFcVr04Guk9eq0S4/rWS++sbmyqosJzVs8+1fH5NI+ZcmkaSkc7dmtAFbHFva6yRJnjW3yAcGxjueDug==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.0.tgz", + "integrity": "sha512-YhYFhH4T6DlbT6CPtVgLfC1Jp2gbCawU/ml7WJvUpBg01bCrXSzTYMZZXbbIGjq/kHmK8YUATxTppcRGzj31pA==", "dev": true, "requires": { - "@babel/types": "^7.7.4" + "@babel/types": "^7.8.0" + } + }, + "@babel/highlight": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.0.tgz", + "integrity": "sha512-OsdTJbHlPtIk2mmtwXItYrdmalJ8T0zpVzNAbKSkHshuywj7zb29Y09McV/jQsQunc/nEyHiPV2oy9llYMLqxw==", + "dev": true, + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" } }, "@babel/parser": { - "version": "7.7.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.7.7.tgz", - "integrity": "sha512-WtTZMZAZLbeymhkd/sEaPD8IQyGAhmuTuvTzLiCFM7iXiVdY0gc0IaI+cW0fh1BnSMbJSzXX6/fHllgHKwHhXw==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.0.tgz", + "integrity": "sha512-VVtsnUYbd1+2A2vOVhm4P2qNXQE8L/W859GpUHfUcdhX8d3pEKThZuIr6fztocWx9HbK+00/CR0tXnhAggJ4CA==", "dev": true }, "@babel/template": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.7.4.tgz", - "integrity": "sha512-qUzihgVPguAzXCK7WXw8pqs6cEwi54s3E+HrejlkuWO6ivMKx9hZl3Y2fSXp9i5HgyWmj7RKP+ulaYnKM4yYxw==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.0.tgz", + "integrity": "sha512-0NNMDsY2t3ltAVVK1WHNiaePo3tXPUeJpCX4I3xSKFoEl852wJHG8mrgHVADf8Lz1y+8al9cF7cSSfzSnFSYiw==", "dev": true, "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/parser": "^7.7.4", - "@babel/types": "^7.7.4" + "@babel/code-frame": "^7.8.0", + "@babel/parser": "^7.8.0", + "@babel/types": "^7.8.0" } }, "@babel/traverse": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.7.4.tgz", - "integrity": "sha512-P1L58hQyupn8+ezVA2z5KBm4/Zr4lCC8dwKCMYzsa5jFMDMQAzaBNy9W5VjB+KAmBjb40U7a/H6ao+Xo+9saIw==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.0.tgz", + "integrity": "sha512-d/6sPXFLGlJHZO/zWDtgFaKyalCOHLedzxpVJn6el1cw+f2TZa7xZEszeXdOw6EUemqRFBAn106BWBvtSck9Qw==", "dev": true, "requires": { - "@babel/code-frame": "^7.5.5", - "@babel/generator": "^7.7.4", - "@babel/helper-function-name": "^7.7.4", - "@babel/helper-split-export-declaration": "^7.7.4", - "@babel/parser": "^7.7.4", - "@babel/types": "^7.7.4", + "@babel/code-frame": "^7.8.0", + "@babel/generator": "^7.8.0", + "@babel/helper-function-name": "^7.8.0", + "@babel/helper-split-export-declaration": "^7.8.0", + "@babel/parser": "^7.8.0", + "@babel/types": "^7.8.0", "debug": "^4.1.0", "globals": "^11.1.0", "lodash": "^4.17.13" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", - "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", - "dev": true, - "requires": { - "@babel/highlight": "^7.0.0" - } - } } }, "@babel/types": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.7.4.tgz", - "integrity": "sha512-cz5Ji23KCi4T+YIE/BolWosrJuSmoZeN1EFnRtBwF+KKLi8GG/Z2c2hOJJeCXPk4mwk4QFvTmwIodJowXgttRA==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.0.tgz", + "integrity": "sha512-1RF84ehyx9HH09dMMwGWl3UTWlVoCPtqqJPjGuC4JzMe1ZIVDJ2DT8mv3cPv/A7veLD6sgR7vi95lJqm+ZayIg==", "dev": true, "requires": { "esutils": "^2.0.2", @@ -1298,153 +1433,191 @@ "dev": true }, "@babel/plugin-proposal-async-generator-functions": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.7.4.tgz", - "integrity": "sha512-1ypyZvGRXriY/QP668+s8sFr2mqinhkRDMPSQLNghCQE+GAkFtp+wkHVvg2+Hdki8gwP+NFzJBJ/N1BfzCCDEw==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.8.0.tgz", + "integrity": "sha512-8vIQf8JYced7gCeKDsGETNGKE+zdD/JmP1LBlRn+w3UXc1aSpZv2Y330bB/fnOEbUgPbuFv+IEi+gopg+Fu0kQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-remap-async-to-generator": "^7.7.4", - "@babel/plugin-syntax-async-generators": "^7.7.4" + "@babel/helper-plugin-utils": "^7.8.0", + "@babel/helper-remap-async-to-generator": "^7.8.0", + "@babel/plugin-syntax-async-generators": "^7.8.0" } }, "@babel/plugin-proposal-dynamic-import": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.7.4.tgz", - "integrity": "sha512-StH+nGAdO6qDB1l8sZ5UBV8AC3F2VW2I8Vfld73TMKyptMU9DY5YsJAS8U81+vEtxcH3Y/La0wG0btDrhpnhjQ==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.8.0.tgz", + "integrity": "sha512-YzMq0AqeTR4Mh2pz3GrCWqhcEV38HgUMMR/56/YR5GPc4Y2p1KJ4Le6j92vMnW8TJqVj+qJz/KDNglpMeww9Yg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-syntax-dynamic-import": "^7.7.4" + "@babel/helper-plugin-utils": "^7.8.0", + "@babel/plugin-syntax-dynamic-import": "^7.8.0" } }, "@babel/plugin-proposal-json-strings": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.7.4.tgz", - "integrity": "sha512-wQvt3akcBTfLU/wYoqm/ws7YOAQKu8EVJEvHip/mzkNtjaclQoCCIqKXFP5/eyfnfbQCDV3OLRIK3mIVyXuZlw==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.8.0.tgz", + "integrity": "sha512-pSpuhwn926vtNeUH2FHx1OzIXaUMgklG0MzlFZJVEg37fB904gOxN572NgBae+KDwFyZDpkLMyEkVA011lBJrQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-syntax-json-strings": "^7.7.4" + "@babel/helper-plugin-utils": "^7.8.0", + "@babel/plugin-syntax-json-strings": "^7.8.0" + } + }, + "@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.8.0.tgz", + "integrity": "sha512-cQMI+RQdcK2IyMm13NKKFCYfOSBUtFxEeRBOdFCi2Pubv/CpkrCubc/ikdeKMT6Lu+uQ+lNSDEJvDCOQZkUy0g==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0" } }, "@babel/plugin-proposal-object-rest-spread": { - "version": "7.7.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.7.7.tgz", - "integrity": "sha512-3qp9I8lelgzNedI3hrhkvhaEYree6+WHnyA/q4Dza9z7iEIs1eyhWyJnetk3jJ69RT0AT4G0UhEGwyGFJ7GUuQ==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.8.0.tgz", + "integrity": "sha512-SjJ2ZXCylpWC+5DTES0/pbpNmw/FnjU/3dF068xF0DU9aN+oOKah+3MCSFcb4pnZ9IwmxfOy4KnbGJSQR+hAZA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-syntax-object-rest-spread": "^7.7.4" + "@babel/helper-plugin-utils": "^7.8.0", + "@babel/plugin-syntax-object-rest-spread": "^7.8.0" } }, "@babel/plugin-proposal-optional-catch-binding": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.7.4.tgz", - "integrity": "sha512-DyM7U2bnsQerCQ+sejcTNZh8KQEUuC3ufzdnVnSiUv/qoGJp2Z3hanKL18KDhsBT5Wj6a7CMT5mdyCNJsEaA9w==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.8.0.tgz", + "integrity": "sha512-tHP3eez6TrpPJYttBZ/6uItRbIuXUIDpQ9xwvzKwR+RboWGMJ7WzFC5dDJ3vjLuCx0/DG1tM0MVkmgcBybth9w==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-syntax-optional-catch-binding": "^7.7.4" + "@babel/helper-plugin-utils": "^7.8.0", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.0" + } + }, + "@babel/plugin-proposal-optional-chaining": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.8.0.tgz", + "integrity": "sha512-PNBHxPHE91m+LLOdGwlvyGicWfrMgiVwng5WdB3CMjd61+vn3vPw0GbgECIAUCZnyi7Jqs5htUIZRztGuV8/5g==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0", + "@babel/plugin-syntax-optional-chaining": "^7.8.0" } }, "@babel/plugin-proposal-unicode-property-regex": { - "version": "7.7.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.7.7.tgz", - "integrity": "sha512-80PbkKyORBUVm1fbTLrHpYdJxMThzM1UqFGh0ALEhO9TYbG86Ah9zQYAB/84axz2vcxefDLdZwWwZNlYARlu9w==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.8.0.tgz", + "integrity": "sha512-3oK0Qt5w4arb+es3rWBribDbtc0TYJP7dFZ1dXcYul3cXderqfIOoSx9YUC1oD208nJwJO/++fvrgLmkYSbe8A==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.7.4", - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-create-regexp-features-plugin": "^7.8.0", + "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-syntax-async-generators": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.7.4.tgz", - "integrity": "sha512-Li4+EjSpBgxcsmeEF8IFcfV/+yJGxHXDirDkEoyFjumuwbmfCVHUt0HuowD/iGM7OhIRyXJH9YXxqiH6N815+g==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.0.tgz", + "integrity": "sha512-a8w8k7pK8nYhem07rXdAq03T+DlTX8LFojUptrh9JEx80AgLqGiuoFIyQOGTWif39kFnDOQqbzl1s6KQqrfV+A==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-syntax-dynamic-import": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.7.4.tgz", - "integrity": "sha512-jHQW0vbRGvwQNgyVxwDh4yuXu4bH1f5/EICJLAhl1SblLs2CDhrsmCk+v5XLdE9wxtAFRyxx+P//Iw+a5L/tTg==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.0.tgz", + "integrity": "sha512-Mx2RzpCHJaBfmFdA2abXDKRHVJdzJ6R0Wqwb6TxCgM7NRR5wcC4cyiAsRL7Ga+lwG8GG1cKvb+4ENjic8y15jA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-syntax-json-strings": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.7.4.tgz", - "integrity": "sha512-QpGupahTQW1mHRXddMG5srgpHWqRLwJnJZKXTigB9RPFCCGbDGCgBeM/iC82ICXp414WeYx/tD54w7M2qRqTMg==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.0.tgz", + "integrity": "sha512-LPykaAbH86L5NnDfCRSpNxtEHZk+6GaFzXfWEFU/6R4v69EXQr6GOp7hwH+Uw0QlYVN++s6TukTJ3flFcspahA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.0.tgz", + "integrity": "sha512-Rv2hnBToN6rbA9hO2a4vtwXZLzNa+TWkoSIMMvUezFz5+D9NPeX7SFrArwtFzzbwndmWiqboTr5rNpzAz0MPpA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-syntax-object-rest-spread": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.7.4.tgz", - "integrity": "sha512-mObR+r+KZq0XhRVS2BrBKBpr5jqrqzlPvS9C9vuOf5ilSwzloAl7RPWLrgKdWS6IreaVrjHxTjtyqFiOisaCwg==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.0.tgz", + "integrity": "sha512-dt89fDlkfkTrQcy5KavMQPyF2A6tR0kYp8HAnIoQv5hO34iAUffHghP/hMGd7Gf/+uYTmLQO0ar7peX1SUWyIA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-syntax-optional-catch-binding": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.7.4.tgz", - "integrity": "sha512-4ZSuzWgFxqHRE31Glu+fEr/MirNZOMYmD/0BhBWyLyOOQz/gTAl7QmWm2hX1QxEIXsr2vkdlwxIzTyiYRC4xcQ==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.0.tgz", + "integrity": "sha512-EIgJVy+u1RvR2gJfX4ReLwAupO/twllUue1wPrRxhu18+eC3bGTEcOSXLQdaE9ya9NG1rE0eQs0GSiloUGFEwg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-chaining": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.0.tgz", + "integrity": "sha512-LV1c+TTAO8Vawe3t+WXBHYWbS7endP8MSlqKPKEZOyWPEJX2akl3jfvFG828/OE7RpyoC3JXfLJDFj/jN7A8hg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-syntax-top-level-await": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.7.4.tgz", - "integrity": "sha512-wdsOw0MvkL1UIgiQ/IFr3ETcfv1xb8RMM0H9wbiDyLaJFyiDg5oZvDLCXosIXmFeIlweML5iOBXAkqddkYNizg==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.8.0.tgz", + "integrity": "sha512-iXR/Cw32fMfWlD1sK2zD/nXtuLStkalRv+xee6VrX84CFrn2LKwb/EOs/4UaDNUpUsws8YZYKeQjPagacFquug==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-transform-arrow-functions": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.7.4.tgz", - "integrity": "sha512-zUXy3e8jBNPiffmqkHRNDdZM2r8DWhCB7HhcoyZjiK1TxYEluLHAvQuYnTT+ARqRpabWqy/NHkO6e3MsYB5YfA==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.8.0.tgz", + "integrity": "sha512-9KfteDp9d8cF388dxFMOh3Dum41qpOVUPVjQhXGd1kPyQBE05FJgYndiAriML2yhMIbZ2bjgweh2nnvBXDH2MQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-transform-async-to-generator": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.7.4.tgz", - "integrity": "sha512-zpUTZphp5nHokuy8yLlyafxCJ0rSlFoSHypTUWgpdwoDXWQcseaect7cJ8Ppk6nunOM6+5rPMkod4OYKPR5MUg==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.8.0.tgz", + "integrity": "sha512-9dvBvJnEdsDWYMrykoMyLNVRPGoub6SFlARtsYgSQ1riTjnyBjhctihSME4XsSku86F59PDeFpC9PCU+9I154w==", "dev": true, "requires": { - "@babel/helper-module-imports": "^7.7.4", - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-remap-async-to-generator": "^7.7.4" + "@babel/helper-module-imports": "^7.8.0", + "@babel/helper-plugin-utils": "^7.8.0", + "@babel/helper-remap-async-to-generator": "^7.8.0" }, "dependencies": { "@babel/helper-module-imports": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.7.4.tgz", - "integrity": "sha512-dGcrX6K9l8258WFjyDLJwuVKxR4XZfU0/vTUgOQYWEnRD8mgr+p4d6fCUMq/ys0h4CCt/S5JhbvtyErjWouAUQ==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.8.0.tgz", + "integrity": "sha512-ylY9J6ZxEcjmJaJ4P6aVs/fZdrZVctCGnxxfYXwCnSMapqd544zT8lWK2qI/vBPjE5gS0o2jILnH+AkpsPauEQ==", "dev": true, "requires": { - "@babel/types": "^7.7.4" + "@babel/types": "^7.8.0" } }, "@babel/types": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.7.4.tgz", - "integrity": "sha512-cz5Ji23KCi4T+YIE/BolWosrJuSmoZeN1EFnRtBwF+KKLi8GG/Z2c2hOJJeCXPk4mwk4QFvTmwIodJowXgttRA==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.0.tgz", + "integrity": "sha512-1RF84ehyx9HH09dMMwGWl3UTWlVoCPtqqJPjGuC4JzMe1ZIVDJ2DT8mv3cPv/A7veLD6sgR7vi95lJqm+ZayIg==", "dev": true, "requires": { "esutils": "^2.0.2", @@ -1455,90 +1628,110 @@ } }, "@babel/plugin-transform-block-scoped-functions": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.7.4.tgz", - "integrity": "sha512-kqtQzwtKcpPclHYjLK//3lH8OFsCDuDJBaFhVwf8kqdnF6MN4l618UDlcA7TfRs3FayrHj+svYnSX8MC9zmUyQ==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.8.0.tgz", + "integrity": "sha512-bim6gUfHq2kPN+aQst33ZEMeglpaUXAo6PWTZvOA8BOnWpNKgZcUzBvpZhh2ofL6YhZgzGoRwVVfzwynDEf47g==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-transform-block-scoping": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.7.4.tgz", - "integrity": "sha512-2VBe9u0G+fDt9B5OV5DQH4KBf5DoiNkwFKOz0TCvBWvdAN2rOykCTkrL+jTLxfCAm76l9Qo5OqL7HBOx2dWggg==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.8.0.tgz", + "integrity": "sha512-FKTK4hzg7W950Yu9iqMl12WBixCmusMc5HBt3/ErvpFLnvr3/6mu/EBTZoCEJ0mw/lQUDfU01vTcZY9oEahlMg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-plugin-utils": "^7.8.0", "lodash": "^4.17.13" } }, "@babel/plugin-transform-classes": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.7.4.tgz", - "integrity": "sha512-sK1mjWat7K+buWRuImEzjNf68qrKcrddtpQo3swi9j7dUcG6y6R6+Di039QN2bD1dykeswlagupEmpOatFHHUg==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.8.0.tgz", + "integrity": "sha512-18RLDwKtGXCLLbf5V03GojebPH7dKYCmIBqQGhgfZDoYsyEzR9kMZ6IxlJP72K5ROC9ADa4KPI6ywuh7NfQOgQ==", "dev": true, "requires": { - "@babel/helper-annotate-as-pure": "^7.7.4", - "@babel/helper-define-map": "^7.7.4", - "@babel/helper-function-name": "^7.7.4", - "@babel/helper-optimise-call-expression": "^7.7.4", - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-replace-supers": "^7.7.4", - "@babel/helper-split-export-declaration": "^7.7.4", + "@babel/helper-annotate-as-pure": "^7.8.0", + "@babel/helper-define-map": "^7.8.0", + "@babel/helper-function-name": "^7.8.0", + "@babel/helper-optimise-call-expression": "^7.8.0", + "@babel/helper-plugin-utils": "^7.8.0", + "@babel/helper-replace-supers": "^7.8.0", + "@babel/helper-split-export-declaration": "^7.8.0", "globals": "^11.1.0" }, "dependencies": { - "@babel/helper-function-name": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.7.4.tgz", - "integrity": "sha512-AnkGIdiBhEuiwdoMnKm7jfPfqItZhgRaZfMg1XX3bS25INOnLPjPG1Ppnajh8eqgt5kPJnfqrRHqFqmjKDZLzQ==", + "@babel/code-frame": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.0.tgz", + "integrity": "sha512-AN2IR/wCUYsM+PdErq6Bp3RFTXl8W0p9Nmymm7zkpsCmh+r/YYcckaCGpU8Q/mEKmST19kkGRaG42A/jxOWwBA==", "dev": true, "requires": { - "@babel/helper-get-function-arity": "^7.7.4", - "@babel/template": "^7.7.4", - "@babel/types": "^7.7.4" + "@babel/highlight": "^7.8.0" + } + }, + "@babel/helper-function-name": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.0.tgz", + "integrity": "sha512-x9psucuU0Xalw+0Vpr2FYJMLB7/KnPSLZhlkUyOGbYAWRDfmtZBrguYpJYiaNCRV7vGkYjO/gF6/J6yMvdWTDw==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.8.0", + "@babel/template": "^7.8.0", + "@babel/types": "^7.8.0" } }, "@babel/helper-get-function-arity": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.7.4.tgz", - "integrity": "sha512-QTGKEdCkjgzgfJ3bAyRwF4yyT3pg+vDgan8DSivq1eS0gwi+KGKE5x8kRcbeFTb/673mkO5SN1IZfmCfA5o+EA==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.0.tgz", + "integrity": "sha512-eUP5grliToMapQiTaYS2AAO/WwaCG7cuJztR1v/a1aPzUzUeGt+AaI9OvLATc/AfFkF8SLJ10d5ugGt/AQ9d6w==", "dev": true, "requires": { - "@babel/types": "^7.7.4" + "@babel/types": "^7.8.0" } }, "@babel/helper-split-export-declaration": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.7.4.tgz", - "integrity": "sha512-guAg1SXFcVr04Guk9eq0S4/rWS++sbmyqosJzVs8+1fH5NI+ZcmkaSkc7dmtAFbHFva6yRJnjW3yAcGxjueDug==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.0.tgz", + "integrity": "sha512-YhYFhH4T6DlbT6CPtVgLfC1Jp2gbCawU/ml7WJvUpBg01bCrXSzTYMZZXbbIGjq/kHmK8YUATxTppcRGzj31pA==", "dev": true, "requires": { - "@babel/types": "^7.7.4" + "@babel/types": "^7.8.0" + } + }, + "@babel/highlight": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.0.tgz", + "integrity": "sha512-OsdTJbHlPtIk2mmtwXItYrdmalJ8T0zpVzNAbKSkHshuywj7zb29Y09McV/jQsQunc/nEyHiPV2oy9llYMLqxw==", + "dev": true, + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" } }, "@babel/parser": { - "version": "7.7.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.7.7.tgz", - "integrity": "sha512-WtTZMZAZLbeymhkd/sEaPD8IQyGAhmuTuvTzLiCFM7iXiVdY0gc0IaI+cW0fh1BnSMbJSzXX6/fHllgHKwHhXw==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.0.tgz", + "integrity": "sha512-VVtsnUYbd1+2A2vOVhm4P2qNXQE8L/W859GpUHfUcdhX8d3pEKThZuIr6fztocWx9HbK+00/CR0tXnhAggJ4CA==", "dev": true }, "@babel/template": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.7.4.tgz", - "integrity": "sha512-qUzihgVPguAzXCK7WXw8pqs6cEwi54s3E+HrejlkuWO6ivMKx9hZl3Y2fSXp9i5HgyWmj7RKP+ulaYnKM4yYxw==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.0.tgz", + "integrity": "sha512-0NNMDsY2t3ltAVVK1WHNiaePo3tXPUeJpCX4I3xSKFoEl852wJHG8mrgHVADf8Lz1y+8al9cF7cSSfzSnFSYiw==", "dev": true, "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/parser": "^7.7.4", - "@babel/types": "^7.7.4" + "@babel/code-frame": "^7.8.0", + "@babel/parser": "^7.8.0", + "@babel/types": "^7.8.0" } }, "@babel/types": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.7.4.tgz", - "integrity": "sha512-cz5Ji23KCi4T+YIE/BolWosrJuSmoZeN1EFnRtBwF+KKLi8GG/Z2c2hOJJeCXPk4mwk4QFvTmwIodJowXgttRA==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.0.tgz", + "integrity": "sha512-1RF84ehyx9HH09dMMwGWl3UTWlVoCPtqqJPjGuC4JzMe1ZIVDJ2DT8mv3cPv/A7veLD6sgR7vi95lJqm+ZayIg==", "dev": true, "requires": { "esutils": "^2.0.2", @@ -1549,112 +1742,132 @@ } }, "@babel/plugin-transform-computed-properties": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.7.4.tgz", - "integrity": "sha512-bSNsOsZnlpLLyQew35rl4Fma3yKWqK3ImWMSC/Nc+6nGjC9s5NFWAer1YQ899/6s9HxO2zQC1WoFNfkOqRkqRQ==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.8.0.tgz", + "integrity": "sha512-FaODHuQRdnWFVwxLPlTN85Lk/aitfvQBHTXahf58FnatCynfhkeNUO8ID+AqAxY4IJsZjeH6OnKDzcGfgKJcVw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-transform-destructuring": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.7.4.tgz", - "integrity": "sha512-4jFMXI1Cu2aXbcXXl8Lr6YubCn6Oc7k9lLsu8v61TZh+1jny2BWmdtvY9zSUlLdGUvcy9DMAWyZEOqjsbeg/wA==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.8.0.tgz", + "integrity": "sha512-D+69HT//cE86aBTLULzSBFLC5A7HcPQzJPiny6P4SLHkDF750MylRKO3iWvdgvb+OSp5dOrOxwXajvaxk1ZfYA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-transform-dotall-regex": { - "version": "7.7.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.7.7.tgz", - "integrity": "sha512-b4in+YlTeE/QmTgrllnb3bHA0HntYvjz8O3Mcbx75UBPJA2xhb5A8nle498VhxSXJHQefjtQxpnLPehDJ4TRlg==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.8.0.tgz", + "integrity": "sha512-pq/XLkDB4MPvTe9ktHJInfWksalXogrIGRZJUG7RiDXhEfdNrlducoMPbACZQuCFtelVgVpD0VyreiY0l38G7g==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.7.4", - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-create-regexp-features-plugin": "^7.8.0", + "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-transform-duplicate-keys": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.7.4.tgz", - "integrity": "sha512-g1y4/G6xGWMD85Tlft5XedGaZBCIVN+/P0bs6eabmcPP9egFleMAo65OOjlhcz1njpwagyY3t0nsQC9oTFegJA==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.8.0.tgz", + "integrity": "sha512-REtYWvpP4TDw4oVeP01vQJcAeewjgk8/i7tPFP11vUjvarUGGyxJLeq79WEnIdnKPQJirZaoDRT4kEWEdSWkDw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-transform-exponentiation-operator": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.7.4.tgz", - "integrity": "sha512-MCqiLfCKm6KEA1dglf6Uqq1ElDIZwFuzz1WH5mTf8k2uQSxEJMbOIEh7IZv7uichr7PMfi5YVSrr1vz+ipp7AQ==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.8.0.tgz", + "integrity": "sha512-vaDgF3gPLzVcoe3UZqnra6FA7O797sZc+UCHPd9eQTI34cPtpCA270LzopIXS3Fhc3UmFrijLmre9mHTmUKVgg==", "dev": true, "requires": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.7.4", - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.8.0", + "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-transform-for-of": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.7.4.tgz", - "integrity": "sha512-zZ1fD1B8keYtEcKF+M1TROfeHTKnijcVQm0yO/Yu1f7qoDoxEIc/+GX6Go430Bg84eM/xwPFp0+h4EbZg7epAA==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.8.0.tgz", + "integrity": "sha512-9j9g0qViCAo8E5qCBSaQdghymn7A9bRXSfS9jU7oLpYccYFZg9A+1KO8X+HV7fhJYH6mZ+e7MRg4p3sLo+RG6Q==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-transform-function-name": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.7.4.tgz", - "integrity": "sha512-E/x09TvjHNhsULs2IusN+aJNRV5zKwxu1cpirZyRPw+FyyIKEHPXTsadj48bVpc1R5Qq1B5ZkzumuFLytnbT6g==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.8.0.tgz", + "integrity": "sha512-YL8Ol54UKeIyY1uUGfry+B9ppXAB3aVBB1gG9gxqhg/OBCPpV2QUNswmjvfmyXEdaWv8qODssBgX7on792h44w==", "dev": true, "requires": { - "@babel/helper-function-name": "^7.7.4", - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-function-name": "^7.8.0", + "@babel/helper-plugin-utils": "^7.8.0" }, "dependencies": { - "@babel/helper-function-name": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.7.4.tgz", - "integrity": "sha512-AnkGIdiBhEuiwdoMnKm7jfPfqItZhgRaZfMg1XX3bS25INOnLPjPG1Ppnajh8eqgt5kPJnfqrRHqFqmjKDZLzQ==", + "@babel/code-frame": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.0.tgz", + "integrity": "sha512-AN2IR/wCUYsM+PdErq6Bp3RFTXl8W0p9Nmymm7zkpsCmh+r/YYcckaCGpU8Q/mEKmST19kkGRaG42A/jxOWwBA==", "dev": true, "requires": { - "@babel/helper-get-function-arity": "^7.7.4", - "@babel/template": "^7.7.4", - "@babel/types": "^7.7.4" + "@babel/highlight": "^7.8.0" + } + }, + "@babel/helper-function-name": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.0.tgz", + "integrity": "sha512-x9psucuU0Xalw+0Vpr2FYJMLB7/KnPSLZhlkUyOGbYAWRDfmtZBrguYpJYiaNCRV7vGkYjO/gF6/J6yMvdWTDw==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.8.0", + "@babel/template": "^7.8.0", + "@babel/types": "^7.8.0" } }, "@babel/helper-get-function-arity": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.7.4.tgz", - "integrity": "sha512-QTGKEdCkjgzgfJ3bAyRwF4yyT3pg+vDgan8DSivq1eS0gwi+KGKE5x8kRcbeFTb/673mkO5SN1IZfmCfA5o+EA==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.0.tgz", + "integrity": "sha512-eUP5grliToMapQiTaYS2AAO/WwaCG7cuJztR1v/a1aPzUzUeGt+AaI9OvLATc/AfFkF8SLJ10d5ugGt/AQ9d6w==", "dev": true, "requires": { - "@babel/types": "^7.7.4" + "@babel/types": "^7.8.0" + } + }, + "@babel/highlight": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.0.tgz", + "integrity": "sha512-OsdTJbHlPtIk2mmtwXItYrdmalJ8T0zpVzNAbKSkHshuywj7zb29Y09McV/jQsQunc/nEyHiPV2oy9llYMLqxw==", + "dev": true, + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" } }, "@babel/parser": { - "version": "7.7.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.7.7.tgz", - "integrity": "sha512-WtTZMZAZLbeymhkd/sEaPD8IQyGAhmuTuvTzLiCFM7iXiVdY0gc0IaI+cW0fh1BnSMbJSzXX6/fHllgHKwHhXw==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.0.tgz", + "integrity": "sha512-VVtsnUYbd1+2A2vOVhm4P2qNXQE8L/W859GpUHfUcdhX8d3pEKThZuIr6fztocWx9HbK+00/CR0tXnhAggJ4CA==", "dev": true }, "@babel/template": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.7.4.tgz", - "integrity": "sha512-qUzihgVPguAzXCK7WXw8pqs6cEwi54s3E+HrejlkuWO6ivMKx9hZl3Y2fSXp9i5HgyWmj7RKP+ulaYnKM4yYxw==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.0.tgz", + "integrity": "sha512-0NNMDsY2t3ltAVVK1WHNiaePo3tXPUeJpCX4I3xSKFoEl852wJHG8mrgHVADf8Lz1y+8al9cF7cSSfzSnFSYiw==", "dev": true, "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/parser": "^7.7.4", - "@babel/types": "^7.7.4" + "@babel/code-frame": "^7.8.0", + "@babel/parser": "^7.8.0", + "@babel/types": "^7.8.0" } }, "@babel/types": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.7.4.tgz", - "integrity": "sha512-cz5Ji23KCi4T+YIE/BolWosrJuSmoZeN1EFnRtBwF+KKLi8GG/Z2c2hOJJeCXPk4mwk4QFvTmwIodJowXgttRA==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.0.tgz", + "integrity": "sha512-1RF84ehyx9HH09dMMwGWl3UTWlVoCPtqqJPjGuC4JzMe1ZIVDJ2DT8mv3cPv/A7veLD6sgR7vi95lJqm+ZayIg==", "dev": true, "requires": { "esutils": "^2.0.2", @@ -1665,119 +1878,120 @@ } }, "@babel/plugin-transform-literals": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.7.4.tgz", - "integrity": "sha512-X2MSV7LfJFm4aZfxd0yLVFrEXAgPqYoDG53Br/tCKiKYfX0MjVjQeWPIhPHHsCqzwQANq+FLN786fF5rgLS+gw==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.8.0.tgz", + "integrity": "sha512-7UDPKG+uVltsZt98Hw+rMbLg772r8fQC6YJ2fNDckcpAXgIWqQbMCmCpfYo0hBNhdhqocM73auk4P/zziQshQw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-transform-member-expression-literals": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.7.4.tgz", - "integrity": "sha512-9VMwMO7i69LHTesL0RdGy93JU6a+qOPuvB4F4d0kR0zyVjJRVJRaoaGjhtki6SzQUu8yen/vxPKN6CWnCUw6bA==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.8.0.tgz", + "integrity": "sha512-lJSdaWR56wmrosCiyqKFRVnLrFYoVAk2mtZAyegt7akeJky/gguv0Rukx9GV3XwHGuM1ZPE06cZMjNlcLp8LrQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-transform-modules-amd": { - "version": "7.7.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.7.5.tgz", - "integrity": "sha512-CT57FG4A2ZUNU1v+HdvDSDrjNWBrtCmSH6YbbgN3Lrf0Di/q/lWRxZrE72p3+HCCz9UjfZOEBdphgC0nzOS6DQ==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.8.0.tgz", + "integrity": "sha512-mFr1O3TaDL4XozM3AzNPz9AsxzzjTxwn4aOShYP5TlO+4rufvjagV2KKDTPMZTQm1ZA/C/PxJDsDekEnnUGz5A==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.7.5", - "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-module-transforms": "^7.8.0", + "@babel/helper-plugin-utils": "^7.8.0", "babel-plugin-dynamic-import-node": "^2.3.0" } }, "@babel/plugin-transform-modules-commonjs": { - "version": "7.7.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.7.5.tgz", - "integrity": "sha512-9Cq4zTFExwFhQI6MT1aFxgqhIsMWQWDVwOgLzl7PTWJHsNaqFvklAU+Oz6AQLAS0dJKTwZSOCo20INwktxpi3Q==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.8.0.tgz", + "integrity": "sha512-w2g8tmL7NgBYt6alc8YawMcmPiYqnVvvI0kLB++VOUOssqdJMAkfQOMGV+2M8H5uhJYDaAghAVMUYps3s+jMrw==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.7.5", - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-simple-access": "^7.7.4", + "@babel/helper-module-transforms": "^7.8.0", + "@babel/helper-plugin-utils": "^7.8.0", + "@babel/helper-simple-access": "^7.8.0", "babel-plugin-dynamic-import-node": "^2.3.0" } }, "@babel/plugin-transform-modules-systemjs": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.7.4.tgz", - "integrity": "sha512-y2c96hmcsUi6LrMqvmNDPBBiGCiQu0aYqpHatVVu6kD4mFEXKjyNxd/drc18XXAf9dv7UXjrZwBVmTTGaGP8iw==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.8.0.tgz", + "integrity": "sha512-tKF9KLiIsiKyWTVU0yo+NcNAylGn7euggYwXw63/tMxGtDTPsB9Y7Ecqv4EoXEwtoJOJ0Lewf17oaWQtindxIA==", "dev": true, "requires": { - "@babel/helper-hoist-variables": "^7.7.4", - "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-hoist-variables": "^7.8.0", + "@babel/helper-module-transforms": "^7.8.0", + "@babel/helper-plugin-utils": "^7.8.0", "babel-plugin-dynamic-import-node": "^2.3.0" } }, "@babel/plugin-transform-modules-umd": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.7.4.tgz", - "integrity": "sha512-u2B8TIi0qZI4j8q4C51ktfO7E3cQ0qnaXFI1/OXITordD40tt17g/sXqgNNCcMTcBFKrUPcGDx+TBJuZxLx7tw==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.8.0.tgz", + "integrity": "sha512-lAwNfXwmfTy7fl2XOyoVpMXnLkJANgH0vdSYNFcS4RuJPBtHfunGA+Y0L7wsHmfPzyVYt8sUglLjaWtdZMNJNg==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.7.4", - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-module-transforms": "^7.8.0", + "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.7.4.tgz", - "integrity": "sha512-jBUkiqLKvUWpv9GLSuHUFYdmHg0ujC1JEYoZUfeOOfNydZXp1sXObgyPatpcwjWgsdBGsagWW0cdJpX/DO2jMw==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.8.0.tgz", + "integrity": "sha512-kq1rxQ1HviCP13SMGZ4WjBBpdogTGK7yn/g/+p+g1AQledgHOWKVeMY1DwKYGlGJ/grDGTOqpJLF1v3Sb7ghKA==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.7.4" + "@babel/helper-create-regexp-features-plugin": "^7.8.0" } }, "@babel/plugin-transform-new-target": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.7.4.tgz", - "integrity": "sha512-CnPRiNtOG1vRodnsyGX37bHQleHE14B9dnnlgSeEs3ek3fHN1A1SScglTCg1sfbe7sRQ2BUcpgpTpWSfMKz3gg==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.8.0.tgz", + "integrity": "sha512-hH1Afz9Xy/wkcxhoI0vYw48kTBJqYUhMmhp3SLI1p817iByM6ItH4LS8tZatDAIKmAQAXj8d3Ups1BgVJECDrA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-transform-object-super": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.7.4.tgz", - "integrity": "sha512-ho+dAEhC2aRnff2JCA0SAK7V2R62zJd/7dmtoe7MHcso4C2mS+vZjn1Pb1pCVZvJs1mgsvv5+7sT+m3Bysb6eg==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.8.0.tgz", + "integrity": "sha512-2DYqQ811nRlFVlni6iqfxBVVGqkBgfvEv/lcvmdNu2CaG+EA7zSP1hqYUsqamR+uCdDbsrV7uY6/0rkXbJo5YQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-replace-supers": "^7.7.4" + "@babel/helper-plugin-utils": "^7.8.0", + "@babel/helper-replace-supers": "^7.8.0" } }, "@babel/plugin-transform-parameters": { - "version": "7.7.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.7.7.tgz", - "integrity": "sha512-OhGSrf9ZBrr1fw84oFXj5hgi8Nmg+E2w5L7NhnG0lPvpDtqd7dbyilM2/vR8CKbJ907RyxPh2kj6sBCSSfI9Ew==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.8.0.tgz", + "integrity": "sha512-9R2yykk7H92rntETO0fq52vJ4OFaTcDA49K9s8bQPyoD4o3/SkWEklukArCsQC6fowEuraPkH/umopr9uO539g==", "dev": true, "requires": { - "@babel/helper-call-delegate": "^7.7.4", - "@babel/helper-get-function-arity": "^7.7.4", - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-call-delegate": "^7.8.0", + "@babel/helper-get-function-arity": "^7.8.0", + "@babel/helper-plugin-utils": "^7.8.0" }, "dependencies": { "@babel/helper-get-function-arity": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.7.4.tgz", - "integrity": "sha512-QTGKEdCkjgzgfJ3bAyRwF4yyT3pg+vDgan8DSivq1eS0gwi+KGKE5x8kRcbeFTb/673mkO5SN1IZfmCfA5o+EA==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.0.tgz", + "integrity": "sha512-eUP5grliToMapQiTaYS2AAO/WwaCG7cuJztR1v/a1aPzUzUeGt+AaI9OvLATc/AfFkF8SLJ10d5ugGt/AQ9d6w==", "dev": true, "requires": { - "@babel/types": "^7.7.4" + "@babel/types": "^7.8.0" } }, "@babel/types": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.7.4.tgz", - "integrity": "sha512-cz5Ji23KCi4T+YIE/BolWosrJuSmoZeN1EFnRtBwF+KKLi8GG/Z2c2hOJJeCXPk4mwk4QFvTmwIodJowXgttRA==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.0.tgz", + "integrity": "sha512-1RF84ehyx9HH09dMMwGWl3UTWlVoCPtqqJPjGuC4JzMe1ZIVDJ2DT8mv3cPv/A7veLD6sgR7vi95lJqm+ZayIg==", "dev": true, "requires": { "esutils": "^2.0.2", @@ -1788,161 +2002,167 @@ } }, "@babel/plugin-transform-property-literals": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.7.4.tgz", - "integrity": "sha512-MatJhlC4iHsIskWYyawl53KuHrt+kALSADLQQ/HkhTjX954fkxIEh4q5slL4oRAnsm/eDoZ4q0CIZpcqBuxhJQ==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.8.0.tgz", + "integrity": "sha512-vjZaQlojnZIahu5ofEW+hPJfDI5A6r2Sbi5C0RuCaAOFj7viDIR5kOR7ul3Fz5US8V1sVk5Zd2yuPaz7iBeysg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-transform-regenerator": { - "version": "7.7.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.7.5.tgz", - "integrity": "sha512-/8I8tPvX2FkuEyWbjRCt4qTAgZK0DVy8QRguhA524UH48RfGJy94On2ri+dCuwOpcerPRl9O4ebQkRcVzIaGBw==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.8.0.tgz", + "integrity": "sha512-n88GT8PZuOHWxqxCJORW3g1QaYzQhHu5sEslxYeQkHVoewfnfuWN37t7YGaRLaNUdaZUlRPXhDcLGT7zBa/u0g==", "dev": true, "requires": { "regenerator-transform": "^0.14.0" } }, "@babel/plugin-transform-reserved-words": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.7.4.tgz", - "integrity": "sha512-OrPiUB5s5XvkCO1lS7D8ZtHcswIC57j62acAnJZKqGGnHP+TIc/ljQSrgdX/QyOTdEK5COAhuc820Hi1q2UgLQ==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.8.0.tgz", + "integrity": "sha512-DnshRyDTXZhmAgO2c1QKZI4CfZjoP2t3fSwRsnbCP9P/FSBpf9I7ovnAELswklw5OeY+/D/JIiaGLoUt2II3LA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-transform-shorthand-properties": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.7.4.tgz", - "integrity": "sha512-q+suddWRfIcnyG5YiDP58sT65AJDZSUhXQDZE3r04AuqD6d/XLaQPPXSBzP2zGerkgBivqtQm9XKGLuHqBID6Q==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.8.0.tgz", + "integrity": "sha512-sExhzq63Gl2PMbl7ETpN7Z1A38rLD6GeCT6EEEIIKjTVt9u6dRqJ6nHhaquL7QgR3egj/8fcvq23UvzfPqGAYA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-transform-spread": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.7.4.tgz", - "integrity": "sha512-8OSs0FLe5/80cndziPlg4R0K6HcWSM0zyNhHhLsmw/Nc5MaA49cAsnoJ/t/YZf8qkG7fD+UjTRaApVDB526d7Q==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.8.0.tgz", + "integrity": "sha512-6Zjl0pv6x10YmFVRI0VhwJ/rE++geVHNJ9xwd+UIt3ON2VMRO7qI2lPsyLnzidR5HYNd/JXj47kdU9Rrn4YcnQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-transform-sticky-regex": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.7.4.tgz", - "integrity": "sha512-Ls2NASyL6qtVe1H1hXts9yuEeONV2TJZmplLONkMPUG158CtmnrzW5Q5teibM5UVOFjG0D3IC5mzXR6pPpUY7A==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.8.0.tgz", + "integrity": "sha512-uksok0Bqox8YeIRFhr6RRtlBXeGpN1ogiEVjEd7A7rVLPZBXKGbL7kODpE7MQ+avjDLv5EEKtDCeYuWZK7FF7g==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-regex": "^7.0.0" + "@babel/helper-plugin-utils": "^7.8.0", + "@babel/helper-regex": "^7.8.0" } }, "@babel/plugin-transform-template-literals": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.7.4.tgz", - "integrity": "sha512-sA+KxLwF3QwGj5abMHkHgshp9+rRz+oY9uoRil4CyLtgEuE/88dpkeWgNk5qKVsJE9iSfly3nvHapdRiIS2wnQ==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.8.0.tgz", + "integrity": "sha512-EF7Q7LEgeMpogHcvmHMNXBWdLWG1tpA1ErXH3i8zTu3+UEKo6aBn+FldPAJ16UbbbOwSCUCiDP6oZxvVRPhwnQ==", "dev": true, "requires": { - "@babel/helper-annotate-as-pure": "^7.7.4", - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-annotate-as-pure": "^7.8.0", + "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-transform-typeof-symbol": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.7.4.tgz", - "integrity": "sha512-KQPUQ/7mqe2m0B8VecdyaW5XcQYaePyl9R7IsKd+irzj6jvbhoGnRE+M0aNkyAzI07VfUQ9266L5xMARitV3wg==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.8.0.tgz", + "integrity": "sha512-rEUBEFzsA9mCS2r7EtXFlM/6GqtzgLdC4WVYM9fIgJX+HcSJ8oMmj8LinfKhbo0ipRauvUM2teE2iNDNqDwO1g==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-transform-unicode-regex": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.7.4.tgz", - "integrity": "sha512-N77UUIV+WCvE+5yHw+oks3m18/umd7y392Zv7mYTpFqHtkpcc+QUz+gLJNTWVlWROIWeLqY0f3OjZxV5TcXnRw==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.8.0.tgz", + "integrity": "sha512-qDg8wsnE47B/Sj8ZtOndPHrGBxJMssZJ71SzXrItum9n++iVFN7kYuJO+OHhjom7+/or0zzYqvJNzCkUjyNKqg==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.7.4", - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-create-regexp-features-plugin": "^7.8.0", + "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/preset-env": { - "version": "7.7.7", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.7.7.tgz", - "integrity": "sha512-pCu0hrSSDVI7kCVUOdcMNQEbOPJ52E+LrQ14sN8uL2ALfSqePZQlKrOy+tM4uhEdYlCHi4imr8Zz2cZe9oSdIg==", + "version": "7.8.2", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.8.2.tgz", + "integrity": "sha512-AF2YUl2bGsLWTtFL68upTTB7nDo05aEcKjHmXJE+aXRvsx5K+9yRsHQP3MjnTrLOWe/eFyUr93dfILROsKC4eg==", "dev": true, "requires": { - "@babel/helper-module-imports": "^7.7.4", - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-proposal-async-generator-functions": "^7.7.4", - "@babel/plugin-proposal-dynamic-import": "^7.7.4", - "@babel/plugin-proposal-json-strings": "^7.7.4", - "@babel/plugin-proposal-object-rest-spread": "^7.7.7", - "@babel/plugin-proposal-optional-catch-binding": "^7.7.4", - "@babel/plugin-proposal-unicode-property-regex": "^7.7.7", - "@babel/plugin-syntax-async-generators": "^7.7.4", - "@babel/plugin-syntax-dynamic-import": "^7.7.4", - "@babel/plugin-syntax-json-strings": "^7.7.4", - "@babel/plugin-syntax-object-rest-spread": "^7.7.4", - "@babel/plugin-syntax-optional-catch-binding": "^7.7.4", - "@babel/plugin-syntax-top-level-await": "^7.7.4", - "@babel/plugin-transform-arrow-functions": "^7.7.4", - "@babel/plugin-transform-async-to-generator": "^7.7.4", - "@babel/plugin-transform-block-scoped-functions": "^7.7.4", - "@babel/plugin-transform-block-scoping": "^7.7.4", - "@babel/plugin-transform-classes": "^7.7.4", - "@babel/plugin-transform-computed-properties": "^7.7.4", - "@babel/plugin-transform-destructuring": "^7.7.4", - "@babel/plugin-transform-dotall-regex": "^7.7.7", - "@babel/plugin-transform-duplicate-keys": "^7.7.4", - "@babel/plugin-transform-exponentiation-operator": "^7.7.4", - "@babel/plugin-transform-for-of": "^7.7.4", - "@babel/plugin-transform-function-name": "^7.7.4", - "@babel/plugin-transform-literals": "^7.7.4", - "@babel/plugin-transform-member-expression-literals": "^7.7.4", - "@babel/plugin-transform-modules-amd": "^7.7.5", - "@babel/plugin-transform-modules-commonjs": "^7.7.5", - "@babel/plugin-transform-modules-systemjs": "^7.7.4", - "@babel/plugin-transform-modules-umd": "^7.7.4", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.7.4", - "@babel/plugin-transform-new-target": "^7.7.4", - "@babel/plugin-transform-object-super": "^7.7.4", - "@babel/plugin-transform-parameters": "^7.7.7", - "@babel/plugin-transform-property-literals": "^7.7.4", - "@babel/plugin-transform-regenerator": "^7.7.5", - "@babel/plugin-transform-reserved-words": "^7.7.4", - "@babel/plugin-transform-shorthand-properties": "^7.7.4", - "@babel/plugin-transform-spread": "^7.7.4", - "@babel/plugin-transform-sticky-regex": "^7.7.4", - "@babel/plugin-transform-template-literals": "^7.7.4", - "@babel/plugin-transform-typeof-symbol": "^7.7.4", - "@babel/plugin-transform-unicode-regex": "^7.7.4", - "@babel/types": "^7.7.4", - "browserslist": "^4.6.0", - "core-js-compat": "^3.6.0", + "@babel/compat-data": "^7.8.0", + "@babel/helper-compilation-targets": "^7.8.0", + "@babel/helper-module-imports": "^7.8.0", + "@babel/helper-plugin-utils": "^7.8.0", + "@babel/plugin-proposal-async-generator-functions": "^7.8.0", + "@babel/plugin-proposal-dynamic-import": "^7.8.0", + "@babel/plugin-proposal-json-strings": "^7.8.0", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.8.0", + "@babel/plugin-proposal-object-rest-spread": "^7.8.0", + "@babel/plugin-proposal-optional-catch-binding": "^7.8.0", + "@babel/plugin-proposal-optional-chaining": "^7.8.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.8.0", + "@babel/plugin-syntax-async-generators": "^7.8.0", + "@babel/plugin-syntax-dynamic-import": "^7.8.0", + "@babel/plugin-syntax-json-strings": "^7.8.0", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0", + "@babel/plugin-syntax-object-rest-spread": "^7.8.0", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.0", + "@babel/plugin-syntax-optional-chaining": "^7.8.0", + "@babel/plugin-syntax-top-level-await": "^7.8.0", + "@babel/plugin-transform-arrow-functions": "^7.8.0", + "@babel/plugin-transform-async-to-generator": "^7.8.0", + "@babel/plugin-transform-block-scoped-functions": "^7.8.0", + "@babel/plugin-transform-block-scoping": "^7.8.0", + "@babel/plugin-transform-classes": "^7.8.0", + "@babel/plugin-transform-computed-properties": "^7.8.0", + "@babel/plugin-transform-destructuring": "^7.8.0", + "@babel/plugin-transform-dotall-regex": "^7.8.0", + "@babel/plugin-transform-duplicate-keys": "^7.8.0", + "@babel/plugin-transform-exponentiation-operator": "^7.8.0", + "@babel/plugin-transform-for-of": "^7.8.0", + "@babel/plugin-transform-function-name": "^7.8.0", + "@babel/plugin-transform-literals": "^7.8.0", + "@babel/plugin-transform-member-expression-literals": "^7.8.0", + "@babel/plugin-transform-modules-amd": "^7.8.0", + "@babel/plugin-transform-modules-commonjs": "^7.8.0", + "@babel/plugin-transform-modules-systemjs": "^7.8.0", + "@babel/plugin-transform-modules-umd": "^7.8.0", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.8.0", + "@babel/plugin-transform-new-target": "^7.8.0", + "@babel/plugin-transform-object-super": "^7.8.0", + "@babel/plugin-transform-parameters": "^7.8.0", + "@babel/plugin-transform-property-literals": "^7.8.0", + "@babel/plugin-transform-regenerator": "^7.8.0", + "@babel/plugin-transform-reserved-words": "^7.8.0", + "@babel/plugin-transform-shorthand-properties": "^7.8.0", + "@babel/plugin-transform-spread": "^7.8.0", + "@babel/plugin-transform-sticky-regex": "^7.8.0", + "@babel/plugin-transform-template-literals": "^7.8.0", + "@babel/plugin-transform-typeof-symbol": "^7.8.0", + "@babel/plugin-transform-unicode-regex": "^7.8.0", + "@babel/types": "^7.8.0", + "browserslist": "^4.8.2", + "core-js-compat": "^3.6.2", "invariant": "^2.2.2", - "js-levenshtein": "^1.1.3", + "levenary": "^1.1.0", "semver": "^5.5.0" }, "dependencies": { "@babel/helper-module-imports": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.7.4.tgz", - "integrity": "sha512-dGcrX6K9l8258WFjyDLJwuVKxR4XZfU0/vTUgOQYWEnRD8mgr+p4d6fCUMq/ys0h4CCt/S5JhbvtyErjWouAUQ==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.8.0.tgz", + "integrity": "sha512-ylY9J6ZxEcjmJaJ4P6aVs/fZdrZVctCGnxxfYXwCnSMapqd544zT8lWK2qI/vBPjE5gS0o2jILnH+AkpsPauEQ==", "dev": true, "requires": { - "@babel/types": "^7.7.4" + "@babel/types": "^7.8.0" } }, "@babel/types": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.7.4.tgz", - "integrity": "sha512-cz5Ji23KCi4T+YIE/BolWosrJuSmoZeN1EFnRtBwF+KKLi8GG/Z2c2hOJJeCXPk4mwk4QFvTmwIodJowXgttRA==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.0.tgz", + "integrity": "sha512-1RF84ehyx9HH09dMMwGWl3UTWlVoCPtqqJPjGuC4JzMe1ZIVDJ2DT8mv3cPv/A7veLD6sgR7vi95lJqm+ZayIg==", "dev": true, "requires": { "esutils": "^2.0.2", @@ -3250,14 +3470,14 @@ } }, "browserslist": { - "version": "4.8.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.8.2.tgz", - "integrity": "sha512-+M4oeaTplPm/f1pXDw84YohEv7B1i/2Aisei8s4s6k3QsoSHa7i5sz8u/cGQkkatCPxMASKxPualR4wwYgVboA==", + "version": "4.8.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.8.3.tgz", + "integrity": "sha512-iU43cMMknxG1ClEZ2MDKeonKE1CCrFVkQK2AqO2YWFmvIrx4JWrvQ4w4hQez6EpVI8rHTtqh/ruHHDHSOKxvUg==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001015", + "caniuse-lite": "^1.0.30001017", "electron-to-chromium": "^1.3.322", - "node-releases": "^1.1.42" + "node-releases": "^1.1.44" } }, "buble": { @@ -3442,9 +3662,9 @@ } }, "caniuse-lite": { - "version": "1.0.30001016", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001016.tgz", - "integrity": "sha512-yYQ2QfotceRiH4U+h1Us86WJXtVHDmy3nEKIdYPsZCYnOV5/tMgGbmoIlrMzmh2VXlproqYtVaKeGDBkMZifFA==", + "version": "1.0.30001020", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001020.tgz", + "integrity": "sha512-yWIvwA68wRHKanAVS1GjN8vajAv7MBFshullKCeq/eKpK7pJBVDgFFEqvgWTkcP2+wIDeQGYFRXECjKZnLkUjA==", "dev": true }, "caseless": { @@ -3953,12 +4173,12 @@ "dev": true }, "core-js-compat": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.6.0.tgz", - "integrity": "sha512-Z3eCNjGgoYluH89Jt4wVkfYsc/VdLrA2/woX5lm0isO/pCT+P+Y+o65bOuEnjDJLthdwTBxbCVzptTXtc18fJg==", + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.6.3.tgz", + "integrity": "sha512-Y3YNGU3bU1yrnzVodop23ghArbKv4IqkZg9MMOWv/h7KT6NRk1/SzHhWDDlubg2+tlcUzAqgj1/GyeJ9fUKMeg==", "dev": true, "requires": { - "browserslist": "^4.8.2", + "browserslist": "^4.8.3", "semver": "7.0.0" }, "dependencies": { @@ -4420,9 +4640,9 @@ "dev": true }, "electron-to-chromium": { - "version": "1.3.322", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.322.tgz", - "integrity": "sha512-Tc8JQEfGQ1MzfSzI/bTlSr7btJv/FFO7Yh6tanqVmIWOuNCu6/D1MilIEgLtmWqIrsv+o4IjpLAhgMBr/ncNAA==", + "version": "1.3.332", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.332.tgz", + "integrity": "sha512-AP2HkLhfSOIxP7gDjlyZ4ywGWIcxRMZoU9+JriuVkQe2pSLDdWBsE6+eI6BQOqun1dohLrUTOPHsQLLhhFA7Eg==", "dev": true }, "elliptic": { @@ -7725,12 +7945,6 @@ "integrity": "sha512-36+AdBzCL+y6qjw5Tx7HgzeGCzC81MDDgaUP8ld2zhx58HdqXGoBd+tHdrBMiyjGQs0Hxs/MLZTu/eHNJJuWPw==", "dev": true }, - "js-levenshtein": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/js-levenshtein/-/js-levenshtein-1.1.6.tgz", - "integrity": "sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g==", - "dev": true - }, "js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -8228,6 +8442,21 @@ "integrity": "sha1-6w1GtUER68VhrLTECO+TY73I9+A=", "dev": true }, + "leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true + }, + "levenary": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/levenary/-/levenary-1.1.0.tgz", + "integrity": "sha512-VHcwhO0UTpUW7rLPN2/OiWJdgA1e9BqEDALhrgCe/F+uUJnep6CoUsTzMeP8Rh0NGr9uKquXxqe7lwLZo509nQ==", + "dev": true, + "requires": { + "leven": "^3.1.0" + } + }, "levn": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", @@ -9234,9 +9463,9 @@ } }, "node-releases": { - "version": "1.1.43", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.43.tgz", - "integrity": "sha512-Rmfnj52WNhvr83MvuAWHEqXVoZXCcDQssSOffU4n4XOL9sPrP61mSZ88g25NqmABDvH7PiAlFCzoSCSdzA293w==", + "version": "1.1.45", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.45.tgz", + "integrity": "sha512-cXvGSfhITKI8qsV116u2FTzH5EWZJfgG7d4cpqwF8I8+1tWpD6AsvvGRKq2onR0DNj1jfqsjkXZsm14JMS7Cyg==", "dev": true, "requires": { "semver": "^6.3.0" From 8935cb509a7d9db1d081698eb2f344a2e67aaad4 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 13 Jan 2020 08:05:32 +0000 Subject: [PATCH 010/381] Bump karma-firefox-launcher from 1.2.0 to 1.3.0 Bumps [karma-firefox-launcher](https://github.com/karma-runner/karma-firefox-launcher) from 1.2.0 to 1.3.0. - [Release notes](https://github.com/karma-runner/karma-firefox-launcher/releases) - [Changelog](https://github.com/karma-runner/karma-firefox-launcher/blob/master/CHANGELOG.md) - [Commits](https://github.com/karma-runner/karma-firefox-launcher/compare/v1.2.0...v1.3.0) Signed-off-by: dependabot-preview[bot] --- package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 5df371f260..99527bb1ef 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8105,9 +8105,9 @@ } }, "karma-firefox-launcher": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/karma-firefox-launcher/-/karma-firefox-launcher-1.2.0.tgz", - "integrity": "sha512-j9Zp8M8+VLq1nI/5xZGfzeaEPtGQ/vk3G+Y8vpmFWLvKLNZ2TDjD6cu2dUu7lDbu1HXNgatsAX4jgCZTkR9qhQ==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/karma-firefox-launcher/-/karma-firefox-launcher-1.3.0.tgz", + "integrity": "sha512-Fi7xPhwrRgr+94BnHX0F5dCl1miIW4RHnzjIGxF8GaIEp7rNqX7LSi7ok63VXs3PS/5MQaQMhGxw+bvD+pibBQ==", "dev": true, "requires": { "is-wsl": "^2.1.0" From bacc159fc6a372902889c906275ca2e27acd83a8 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 13 Jan 2020 08:07:01 +0000 Subject: [PATCH 011/381] Bump @babel/core from 7.7.7 to 7.8.0 Bumps [@babel/core](https://github.com/babel/babel) from 7.7.7 to 7.8.0. - [Release notes](https://github.com/babel/babel/releases) - [Changelog](https://github.com/babel/babel/blob/master/CHANGELOG.md) - [Commits](https://github.com/babel/babel/compare/v7.7.7...v7.8.0) Signed-off-by: dependabot-preview[bot] --- package-lock.json | 247 +++++++++++++++++++++++++--------------------- 1 file changed, 137 insertions(+), 110 deletions(-) diff --git a/package-lock.json b/package-lock.json index 5df371f260..7c1fc47cea 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,20 +14,21 @@ } }, "@babel/core": { - "version": "7.7.7", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.7.7.tgz", - "integrity": "sha512-jlSjuj/7z138NLZALxVgrx13AOtqip42ATZP7+kYl53GvDV6+4dCek1mVUo8z8c8Xnw/mx2q3d9HWh3griuesQ==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.8.0.tgz", + "integrity": "sha512-3rqPi/bv/Xfu2YzHvBz4XqMI1fKVwnhntPA1/fjoECrSjrhbOCxlTrbVu5gUtr8zkxW+RpkDOa/HCW93gzS2Dw==", "dev": true, "requires": { - "@babel/code-frame": "^7.5.5", - "@babel/generator": "^7.7.7", - "@babel/helpers": "^7.7.4", - "@babel/parser": "^7.7.7", - "@babel/template": "^7.7.4", - "@babel/traverse": "^7.7.4", - "@babel/types": "^7.7.4", + "@babel/code-frame": "^7.8.0", + "@babel/generator": "^7.8.0", + "@babel/helpers": "^7.8.0", + "@babel/parser": "^7.8.0", + "@babel/template": "^7.8.0", + "@babel/traverse": "^7.8.0", + "@babel/types": "^7.8.0", "convert-source-map": "^1.7.0", "debug": "^4.1.0", + "gensync": "^1.0.0-beta.1", "json5": "^2.1.0", "lodash": "^4.17.13", "resolve": "^1.3.2", @@ -36,93 +37,104 @@ }, "dependencies": { "@babel/code-frame": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", - "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.0.tgz", + "integrity": "sha512-AN2IR/wCUYsM+PdErq6Bp3RFTXl8W0p9Nmymm7zkpsCmh+r/YYcckaCGpU8Q/mEKmST19kkGRaG42A/jxOWwBA==", "dev": true, "requires": { - "@babel/highlight": "^7.0.0" + "@babel/highlight": "^7.8.0" } }, "@babel/generator": { - "version": "7.7.7", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.7.7.tgz", - "integrity": "sha512-/AOIBpHh/JU1l0ZFS4kiRCBnLi6OTHzh0RPk3h9isBxkkqELtQNFi1Vr/tiG9p1yfoUdKVwISuXWQR+hwwM4VQ==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.0.tgz", + "integrity": "sha512-2Lp2e02CV2C7j/H4n4D9YvsvdhPVVg9GDIamr6Tu4tU35mL3mzOrzl1lZ8ZJtysfZXh+y+AGORc2rPS7yHxBUg==", "dev": true, "requires": { - "@babel/types": "^7.7.4", + "@babel/types": "^7.8.0", "jsesc": "^2.5.1", "lodash": "^4.17.13", "source-map": "^0.5.0" } }, "@babel/helper-function-name": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.7.4.tgz", - "integrity": "sha512-AnkGIdiBhEuiwdoMnKm7jfPfqItZhgRaZfMg1XX3bS25INOnLPjPG1Ppnajh8eqgt5kPJnfqrRHqFqmjKDZLzQ==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.0.tgz", + "integrity": "sha512-x9psucuU0Xalw+0Vpr2FYJMLB7/KnPSLZhlkUyOGbYAWRDfmtZBrguYpJYiaNCRV7vGkYjO/gF6/J6yMvdWTDw==", "dev": true, "requires": { - "@babel/helper-get-function-arity": "^7.7.4", - "@babel/template": "^7.7.4", - "@babel/types": "^7.7.4" + "@babel/helper-get-function-arity": "^7.8.0", + "@babel/template": "^7.8.0", + "@babel/types": "^7.8.0" } }, "@babel/helper-get-function-arity": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.7.4.tgz", - "integrity": "sha512-QTGKEdCkjgzgfJ3bAyRwF4yyT3pg+vDgan8DSivq1eS0gwi+KGKE5x8kRcbeFTb/673mkO5SN1IZfmCfA5o+EA==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.0.tgz", + "integrity": "sha512-eUP5grliToMapQiTaYS2AAO/WwaCG7cuJztR1v/a1aPzUzUeGt+AaI9OvLATc/AfFkF8SLJ10d5ugGt/AQ9d6w==", "dev": true, "requires": { - "@babel/types": "^7.7.4" + "@babel/types": "^7.8.0" } }, "@babel/helper-split-export-declaration": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.7.4.tgz", - "integrity": "sha512-guAg1SXFcVr04Guk9eq0S4/rWS++sbmyqosJzVs8+1fH5NI+ZcmkaSkc7dmtAFbHFva6yRJnjW3yAcGxjueDug==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.0.tgz", + "integrity": "sha512-YhYFhH4T6DlbT6CPtVgLfC1Jp2gbCawU/ml7WJvUpBg01bCrXSzTYMZZXbbIGjq/kHmK8YUATxTppcRGzj31pA==", "dev": true, "requires": { - "@babel/types": "^7.7.4" + "@babel/types": "^7.8.0" + } + }, + "@babel/highlight": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.0.tgz", + "integrity": "sha512-OsdTJbHlPtIk2mmtwXItYrdmalJ8T0zpVzNAbKSkHshuywj7zb29Y09McV/jQsQunc/nEyHiPV2oy9llYMLqxw==", + "dev": true, + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" } }, "@babel/parser": { - "version": "7.7.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.7.7.tgz", - "integrity": "sha512-WtTZMZAZLbeymhkd/sEaPD8IQyGAhmuTuvTzLiCFM7iXiVdY0gc0IaI+cW0fh1BnSMbJSzXX6/fHllgHKwHhXw==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.0.tgz", + "integrity": "sha512-VVtsnUYbd1+2A2vOVhm4P2qNXQE8L/W859GpUHfUcdhX8d3pEKThZuIr6fztocWx9HbK+00/CR0tXnhAggJ4CA==", "dev": true }, "@babel/template": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.7.4.tgz", - "integrity": "sha512-qUzihgVPguAzXCK7WXw8pqs6cEwi54s3E+HrejlkuWO6ivMKx9hZl3Y2fSXp9i5HgyWmj7RKP+ulaYnKM4yYxw==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.0.tgz", + "integrity": "sha512-0NNMDsY2t3ltAVVK1WHNiaePo3tXPUeJpCX4I3xSKFoEl852wJHG8mrgHVADf8Lz1y+8al9cF7cSSfzSnFSYiw==", "dev": true, "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/parser": "^7.7.4", - "@babel/types": "^7.7.4" + "@babel/code-frame": "^7.8.0", + "@babel/parser": "^7.8.0", + "@babel/types": "^7.8.0" } }, "@babel/traverse": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.7.4.tgz", - "integrity": "sha512-P1L58hQyupn8+ezVA2z5KBm4/Zr4lCC8dwKCMYzsa5jFMDMQAzaBNy9W5VjB+KAmBjb40U7a/H6ao+Xo+9saIw==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.0.tgz", + "integrity": "sha512-d/6sPXFLGlJHZO/zWDtgFaKyalCOHLedzxpVJn6el1cw+f2TZa7xZEszeXdOw6EUemqRFBAn106BWBvtSck9Qw==", "dev": true, "requires": { - "@babel/code-frame": "^7.5.5", - "@babel/generator": "^7.7.4", - "@babel/helper-function-name": "^7.7.4", - "@babel/helper-split-export-declaration": "^7.7.4", - "@babel/parser": "^7.7.4", - "@babel/types": "^7.7.4", + "@babel/code-frame": "^7.8.0", + "@babel/generator": "^7.8.0", + "@babel/helper-function-name": "^7.8.0", + "@babel/helper-split-export-declaration": "^7.8.0", + "@babel/parser": "^7.8.0", + "@babel/types": "^7.8.0", "debug": "^4.1.0", "globals": "^11.1.0", "lodash": "^4.17.13" } }, "@babel/types": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.7.4.tgz", - "integrity": "sha512-cz5Ji23KCi4T+YIE/BolWosrJuSmoZeN1EFnRtBwF+KKLi8GG/Z2c2hOJJeCXPk4mwk4QFvTmwIodJowXgttRA==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.0.tgz", + "integrity": "sha512-1RF84ehyx9HH09dMMwGWl3UTWlVoCPtqqJPjGuC4JzMe1ZIVDJ2DT8mv3cPv/A7veLD6sgR7vi95lJqm+ZayIg==", "dev": true, "requires": { "esutils": "^2.0.2", @@ -1159,106 +1171,115 @@ } }, "@babel/helpers": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.7.4.tgz", - "integrity": "sha512-ak5NGZGJ6LV85Q1Zc9gn2n+ayXOizryhjSUBTdu5ih1tlVCJeuQENzc4ItyCVhINVXvIT/ZQ4mheGIsfBkpskg==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.8.0.tgz", + "integrity": "sha512-srWKpjAFbiut5JoCReZJ098hLqoZ9HufOnKZPggc7j74XaPuQ+9b3RYPV1M/HfjL63lCNd8uI1O487qIWxAFNA==", "dev": true, "requires": { - "@babel/template": "^7.7.4", - "@babel/traverse": "^7.7.4", - "@babel/types": "^7.7.4" + "@babel/template": "^7.8.0", + "@babel/traverse": "^7.8.0", + "@babel/types": "^7.8.0" }, "dependencies": { - "@babel/generator": { - "version": "7.7.7", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.7.7.tgz", - "integrity": "sha512-/AOIBpHh/JU1l0ZFS4kiRCBnLi6OTHzh0RPk3h9isBxkkqELtQNFi1Vr/tiG9p1yfoUdKVwISuXWQR+hwwM4VQ==", + "@babel/code-frame": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.0.tgz", + "integrity": "sha512-AN2IR/wCUYsM+PdErq6Bp3RFTXl8W0p9Nmymm7zkpsCmh+r/YYcckaCGpU8Q/mEKmST19kkGRaG42A/jxOWwBA==", "dev": true, "requires": { - "@babel/types": "^7.7.4", + "@babel/highlight": "^7.8.0" + } + }, + "@babel/generator": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.0.tgz", + "integrity": "sha512-2Lp2e02CV2C7j/H4n4D9YvsvdhPVVg9GDIamr6Tu4tU35mL3mzOrzl1lZ8ZJtysfZXh+y+AGORc2rPS7yHxBUg==", + "dev": true, + "requires": { + "@babel/types": "^7.8.0", "jsesc": "^2.5.1", "lodash": "^4.17.13", "source-map": "^0.5.0" } }, "@babel/helper-function-name": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.7.4.tgz", - "integrity": "sha512-AnkGIdiBhEuiwdoMnKm7jfPfqItZhgRaZfMg1XX3bS25INOnLPjPG1Ppnajh8eqgt5kPJnfqrRHqFqmjKDZLzQ==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.0.tgz", + "integrity": "sha512-x9psucuU0Xalw+0Vpr2FYJMLB7/KnPSLZhlkUyOGbYAWRDfmtZBrguYpJYiaNCRV7vGkYjO/gF6/J6yMvdWTDw==", "dev": true, "requires": { - "@babel/helper-get-function-arity": "^7.7.4", - "@babel/template": "^7.7.4", - "@babel/types": "^7.7.4" + "@babel/helper-get-function-arity": "^7.8.0", + "@babel/template": "^7.8.0", + "@babel/types": "^7.8.0" } }, "@babel/helper-get-function-arity": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.7.4.tgz", - "integrity": "sha512-QTGKEdCkjgzgfJ3bAyRwF4yyT3pg+vDgan8DSivq1eS0gwi+KGKE5x8kRcbeFTb/673mkO5SN1IZfmCfA5o+EA==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.0.tgz", + "integrity": "sha512-eUP5grliToMapQiTaYS2AAO/WwaCG7cuJztR1v/a1aPzUzUeGt+AaI9OvLATc/AfFkF8SLJ10d5ugGt/AQ9d6w==", "dev": true, "requires": { - "@babel/types": "^7.7.4" + "@babel/types": "^7.8.0" } }, "@babel/helper-split-export-declaration": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.7.4.tgz", - "integrity": "sha512-guAg1SXFcVr04Guk9eq0S4/rWS++sbmyqosJzVs8+1fH5NI+ZcmkaSkc7dmtAFbHFva6yRJnjW3yAcGxjueDug==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.0.tgz", + "integrity": "sha512-YhYFhH4T6DlbT6CPtVgLfC1Jp2gbCawU/ml7WJvUpBg01bCrXSzTYMZZXbbIGjq/kHmK8YUATxTppcRGzj31pA==", "dev": true, "requires": { - "@babel/types": "^7.7.4" + "@babel/types": "^7.8.0" + } + }, + "@babel/highlight": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.0.tgz", + "integrity": "sha512-OsdTJbHlPtIk2mmtwXItYrdmalJ8T0zpVzNAbKSkHshuywj7zb29Y09McV/jQsQunc/nEyHiPV2oy9llYMLqxw==", + "dev": true, + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" } }, "@babel/parser": { - "version": "7.7.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.7.7.tgz", - "integrity": "sha512-WtTZMZAZLbeymhkd/sEaPD8IQyGAhmuTuvTzLiCFM7iXiVdY0gc0IaI+cW0fh1BnSMbJSzXX6/fHllgHKwHhXw==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.0.tgz", + "integrity": "sha512-VVtsnUYbd1+2A2vOVhm4P2qNXQE8L/W859GpUHfUcdhX8d3pEKThZuIr6fztocWx9HbK+00/CR0tXnhAggJ4CA==", "dev": true }, "@babel/template": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.7.4.tgz", - "integrity": "sha512-qUzihgVPguAzXCK7WXw8pqs6cEwi54s3E+HrejlkuWO6ivMKx9hZl3Y2fSXp9i5HgyWmj7RKP+ulaYnKM4yYxw==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.0.tgz", + "integrity": "sha512-0NNMDsY2t3ltAVVK1WHNiaePo3tXPUeJpCX4I3xSKFoEl852wJHG8mrgHVADf8Lz1y+8al9cF7cSSfzSnFSYiw==", "dev": true, "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/parser": "^7.7.4", - "@babel/types": "^7.7.4" + "@babel/code-frame": "^7.8.0", + "@babel/parser": "^7.8.0", + "@babel/types": "^7.8.0" } }, "@babel/traverse": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.7.4.tgz", - "integrity": "sha512-P1L58hQyupn8+ezVA2z5KBm4/Zr4lCC8dwKCMYzsa5jFMDMQAzaBNy9W5VjB+KAmBjb40U7a/H6ao+Xo+9saIw==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.0.tgz", + "integrity": "sha512-d/6sPXFLGlJHZO/zWDtgFaKyalCOHLedzxpVJn6el1cw+f2TZa7xZEszeXdOw6EUemqRFBAn106BWBvtSck9Qw==", "dev": true, "requires": { - "@babel/code-frame": "^7.5.5", - "@babel/generator": "^7.7.4", - "@babel/helper-function-name": "^7.7.4", - "@babel/helper-split-export-declaration": "^7.7.4", - "@babel/parser": "^7.7.4", - "@babel/types": "^7.7.4", + "@babel/code-frame": "^7.8.0", + "@babel/generator": "^7.8.0", + "@babel/helper-function-name": "^7.8.0", + "@babel/helper-split-export-declaration": "^7.8.0", + "@babel/parser": "^7.8.0", + "@babel/types": "^7.8.0", "debug": "^4.1.0", "globals": "^11.1.0", "lodash": "^4.17.13" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", - "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", - "dev": true, - "requires": { - "@babel/highlight": "^7.0.0" - } - } } }, "@babel/types": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.7.4.tgz", - "integrity": "sha512-cz5Ji23KCi4T+YIE/BolWosrJuSmoZeN1EFnRtBwF+KKLi8GG/Z2c2hOJJeCXPk4mwk4QFvTmwIodJowXgttRA==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.0.tgz", + "integrity": "sha512-1RF84ehyx9HH09dMMwGWl3UTWlVoCPtqqJPjGuC4JzMe1ZIVDJ2DT8mv3cPv/A7veLD6sgR7vi95lJqm+ZayIg==", "dev": true, "requires": { "esutils": "^2.0.2", @@ -6457,6 +6478,12 @@ "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", "dev": true }, + "gensync": { + "version": "1.0.0-beta.1", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.1.tgz", + "integrity": "sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg==", + "dev": true + }, "get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", From e05641b6b8de71554aa4a17ebae313c901734f44 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 13 Jan 2020 08:08:00 +0000 Subject: [PATCH 012/381] Bump globby from 10.0.1 to 11.0.0 Bumps [globby](https://github.com/sindresorhus/globby) from 10.0.1 to 11.0.0. - [Release notes](https://github.com/sindresorhus/globby/releases) - [Commits](https://github.com/sindresorhus/globby/compare/v10.0.1...v11.0.0) Signed-off-by: dependabot-preview[bot] --- package-lock.json | 69 +++++++++++++++++++++++------------------------ package.json | 2 +- 2 files changed, 34 insertions(+), 37 deletions(-) diff --git a/package-lock.json b/package-lock.json index 5df371f260..edcf4aef2f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2027,28 +2027,28 @@ "dev": true }, "@nodelib/fs.scandir": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.1.tgz", - "integrity": "sha512-NT/skIZjgotDSiXs0WqYhgcuBKhUMgfekCmCGtkUAiLqZdOnrdjmZr9wRl3ll64J9NF79uZ4fk16Dx0yMc/Xbg==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz", + "integrity": "sha512-eGmwYQn3gxo4r7jdQnkrrN6bY478C3P+a/y72IJukF8LjB6ZHeB3c+Ehacj3sYeSmUXGlnA67/PmbM9CVwL7Dw==", "dev": true, "requires": { - "@nodelib/fs.stat": "2.0.1", + "@nodelib/fs.stat": "2.0.3", "run-parallel": "^1.1.9" } }, "@nodelib/fs.stat": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.1.tgz", - "integrity": "sha512-+RqhBlLn6YRBGOIoVYthsG0J9dfpO79eJyN7BYBkZJtfqrBwf2KK+rD/M/yjZR6WBmIhAgOV7S60eCgaSWtbFw==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz", + "integrity": "sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA==", "dev": true }, "@nodelib/fs.walk": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.2.tgz", - "integrity": "sha512-J/DR3+W12uCzAJkw7niXDcqcKBg6+5G5Q/ZpThpGNzAUz70eOR6RV4XnnSN01qHZiVl0eavoxJsBypQoKsV2QQ==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz", + "integrity": "sha512-1V9XOY4rDW0rehzbrcqAmHnz8e7SKvX27gh8Gt2WgB0+pdzdiLV83p72kZPU+jvMbS1qU5mauP2iOvO8rhmurQ==", "dev": true, "requires": { - "@nodelib/fs.scandir": "2.1.1", + "@nodelib/fs.scandir": "2.1.3", "fastq": "^1.6.0" } }, @@ -5425,16 +5425,15 @@ "dev": true }, "fast-glob": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.0.4.tgz", - "integrity": "sha512-wkIbV6qg37xTJwqSsdnIphL1e+LaGz4AIQqr00mIubMaEhv1/HEmJ0uuCGZRNRUkZZmOB5mJKO0ZUTVq+SxMQg==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.1.1.tgz", + "integrity": "sha512-nTCREpBY8w8r+boyFYAx21iL6faSsQynliPHM4Uf56SbkyohCNxpVPEH9xrF5TXKy+IsjkPUHDKiUkzBVRXn9g==", "dev": true, "requires": { - "@nodelib/fs.stat": "^2.0.1", - "@nodelib/fs.walk": "^1.2.1", - "glob-parent": "^5.0.0", - "is-glob": "^4.0.1", - "merge2": "^1.2.3", + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.0", + "merge2": "^1.3.0", "micromatch": "^4.0.2" }, "dependencies": { @@ -5457,9 +5456,9 @@ } }, "glob-parent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.0.0.tgz", - "integrity": "sha512-Z2RwiujPRGluePM6j699ktJYxmPpJKCfpGA13jz2hmFZC7gKetzrWvg5KN3+OsIFmydGyZ1AVwERCq1w/ZZwRg==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.0.tgz", + "integrity": "sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw==", "dev": true, "requires": { "is-glob": "^4.0.1" @@ -6570,18 +6569,16 @@ "dev": true }, "globby": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/globby/-/globby-10.0.1.tgz", - "integrity": "sha512-sSs4inE1FB2YQiymcmTv6NWENryABjUNPeWhOvmn4SjtKybglsyPZxFB3U1/+L1bYi0rNZDqCLlHyLYDl1Pq5A==", + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.0.tgz", + "integrity": "sha512-iuehFnR3xu5wBBtm4xi0dMe92Ob87ufyu/dHwpDYfbcpYpIbrO5OnS8M1vWvrBhSGEJ3/Ecj7gnX76P8YxpPEg==", "dev": true, "requires": { - "@types/glob": "^7.1.1", "array-union": "^2.1.0", "dir-glob": "^3.0.1", - "fast-glob": "^3.0.3", - "glob": "^7.1.3", - "ignore": "^5.1.1", - "merge2": "^1.2.3", + "fast-glob": "^3.1.1", + "ignore": "^5.1.4", + "merge2": "^1.3.0", "slash": "^3.0.0" }, "dependencies": { @@ -6601,9 +6598,9 @@ } }, "ignore": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.2.tgz", - "integrity": "sha512-vdqWBp7MyzdmHkkRWV5nY+PfGRbYbahfuvsBCh277tq+w9zyNi7h5CYJCK0kmzti9kU+O/cB7sE8HvKv6aXAKQ==", + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.4.tgz", + "integrity": "sha512-MzbUSahkTW1u7JpKKjY7LCARd1fU5W2rLdxlM4kdkayuCwZImjkpluF9CM1aLewYJguPDqewLam18Y6AU69A8A==", "dev": true }, "path-type": { @@ -8633,9 +8630,9 @@ "dev": true }, "merge2": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.2.4.tgz", - "integrity": "sha512-FYE8xI+6pjFOhokZu0We3S5NKCirLbCzSh2Usf3qEyr4X8U+0jNg9P8RZ4qz+V2UoECLVwSyzU3LxXBaLGtD3A==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.3.0.tgz", + "integrity": "sha512-2j4DAdlBOkiSZIsaXk4mTE3sRS02yBHAtfy127xRV3bQUFqXkjHCHLW6Scv7DwNRbIWNHH8zpnz9zMaKXIdvYw==", "dev": true }, "methods": { diff --git a/package.json b/package.json index 013bdb9d32..e867014556 100644 --- a/package.json +++ b/package.json @@ -62,7 +62,7 @@ "front-matter": "^3.0.2", "fs-extra": "^8.0.0", "glob": "^7.1.5", - "globby": "^10.0.0", + "globby": "^11.0.0", "handlebars": "4.5.3", "html-to-image": "^0.1.0", "istanbul": "0.4.5", From 87a953c4ecbb87b27111e3de9900388c36b84aec Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 13 Jan 2020 08:09:06 +0000 Subject: [PATCH 013/381] Bump rollup-plugin-terser from 5.1.3 to 5.2.0 Bumps [rollup-plugin-terser](https://github.com/TrySound/rollup-plugin-terser) from 5.1.3 to 5.2.0. - [Release notes](https://github.com/TrySound/rollup-plugin-terser/releases) - [Commits](https://github.com/TrySound/rollup-plugin-terser/compare/v5.1.3...v5.2.0) Signed-off-by: dependabot-preview[bot] --- package-lock.json | 58 +++++++++++++++++++++++++++++++++++++---------- 1 file changed, 46 insertions(+), 12 deletions(-) diff --git a/package-lock.json b/package-lock.json index 5df371f260..ac5b5cad2a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10717,23 +10717,57 @@ } }, "rollup-plugin-terser": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-5.1.3.tgz", - "integrity": "sha512-FuFuXE5QUJ7snyxHLPp/0LFXJhdomKlIx/aK7Tg88Yubsx/UU/lmInoJafXJ4jwVVNcORJ1wRUC5T9cy5yk0wA==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-5.2.0.tgz", + "integrity": "sha512-jQI+nYhtDBc9HFRBz8iGttQg7li9klmzR62RG2W2nN6hJ/FI2K2ItYQ7kJ7/zn+vs+BP1AEccmVRjRN989I+Nw==", "dev": true, "requires": { - "@babel/code-frame": "^7.0.0", - "jest-worker": "^24.6.0", - "rollup-pluginutils": "^2.8.1", + "@babel/code-frame": "^7.5.5", + "jest-worker": "^24.9.0", + "rollup-pluginutils": "^2.8.2", "serialize-javascript": "^2.1.2", - "terser": "^4.1.0" + "terser": "^4.6.2" }, "dependencies": { - "serialize-javascript": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-2.1.2.tgz", - "integrity": "sha512-rs9OggEUF0V4jUSecXazOYsLfu7OGK2qIn3c7IPBiffz32XniEp/TX9Xmc9LQfK2nQ2QKHvZ2oygKUGU0lG4jQ==", - "dev": true + "@babel/code-frame": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.0.tgz", + "integrity": "sha512-AN2IR/wCUYsM+PdErq6Bp3RFTXl8W0p9Nmymm7zkpsCmh+r/YYcckaCGpU8Q/mEKmST19kkGRaG42A/jxOWwBA==", + "dev": true, + "requires": { + "@babel/highlight": "^7.8.0" + } + }, + "@babel/highlight": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.0.tgz", + "integrity": "sha512-OsdTJbHlPtIk2mmtwXItYrdmalJ8T0zpVzNAbKSkHshuywj7zb29Y09McV/jQsQunc/nEyHiPV2oy9llYMLqxw==", + "dev": true, + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" + } + }, + "rollup-pluginutils": { + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz", + "integrity": "sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==", + "dev": true, + "requires": { + "estree-walker": "^0.6.1" + } + }, + "terser": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.6.2.tgz", + "integrity": "sha512-6FUjJdY2i3WZAtYBtnV06OOcOfzl+4hSKYE9wgac8rkLRBToPDDrBB2AcHwQD/OKDxbnvhVy2YgOPWO2SsKWqg==", + "dev": true, + "requires": { + "commander": "^2.20.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.12" + } } } }, From e9ab684ef3d1493d78f2df36f4a635c7e7bea3aa Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 13 Jan 2020 08:09:49 +0000 Subject: [PATCH 014/381] Bump rollup from 1.28.0 to 1.29.0 Bumps [rollup](https://github.com/rollup/rollup) from 1.28.0 to 1.29.0. - [Release notes](https://github.com/rollup/rollup/releases) - [Changelog](https://github.com/rollup/rollup/blob/master/CHANGELOG.md) - [Commits](https://github.com/rollup/rollup/compare/v1.28.0...v1.29.0) Signed-off-by: dependabot-preview[bot] --- package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 5df371f260..e06104b55a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10640,9 +10640,9 @@ } }, "rollup": { - "version": "1.28.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-1.28.0.tgz", - "integrity": "sha512-v2J/DmQi9+Nf6frGqzwZRvbiuTTrqH0yzoUF4Eybf8sONT4UpLZzJYnYzW96Zm9X1+4SJmijfnFBWCzHDAXYnQ==", + "version": "1.29.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-1.29.0.tgz", + "integrity": "sha512-V63Iz0dSdI5qPPN5HmCN6OBRzBFhMqNWcvwgq863JtSCTU6Vdvqq6S2fYle/dSCyoPrBkIP3EIr1RVs3HTRqqg==", "dev": true, "requires": { "@types/estree": "*", From ea1070193ee1acab740c7905b30c654abf90187e Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 13 Jan 2020 08:10:42 +0000 Subject: [PATCH 015/381] Bump sinon from 8.0.2 to 8.0.4 Bumps [sinon](https://github.com/sinonjs/sinon) from 8.0.2 to 8.0.4. - [Release notes](https://github.com/sinonjs/sinon/releases) - [Changelog](https://github.com/sinonjs/sinon/blob/master/CHANGELOG.md) - [Commits](https://github.com/sinonjs/sinon/compare/v8.0.2...v8.0.4) Signed-off-by: dependabot-preview[bot] --- package-lock.json | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/package-lock.json b/package-lock.json index 5df371f260..724494863d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2091,9 +2091,9 @@ } }, "@sinonjs/samsam": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-4.2.1.tgz", - "integrity": "sha512-7+5S4C4wpug5pzHS+z/63+XUwsH7dtyYELDafoT1QnfruFh7eFjlDWwZXltUB0GLk6y5eMeAt34Bjx8wJ4KfSA==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-4.2.2.tgz", + "integrity": "sha512-z9o4LZUzSD9Hl22zV38aXNykgFeVj8acqfFabCY6FY83n/6s/XwNJyYYldz6/9lBJanpno9h+oL6HTISkviweA==", "dev": true, "requires": { "@sinonjs/commons": "^1.6.0", @@ -11122,9 +11122,9 @@ "dev": true }, "sinon": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/sinon/-/sinon-8.0.2.tgz", - "integrity": "sha512-8W1S7BnCyvk7SK+Xi15B1QAVLuS81G/NGmWefPb31+ly6xI3fXaug/g5oUdfc8+7ruC4Ay51AxuLlYm8diq6kA==", + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-8.0.4.tgz", + "integrity": "sha512-cFsmgmvsgFb87e7SV7IcekogITlHX2KmlplyI9Pda0FH1Z8Ms/kWbpLs25Idp0m6ZJ3HEEjhaYYXbcTtWWUn4w==", "dev": true, "requires": { "@sinonjs/commons": "^1.7.0", @@ -11137,9 +11137,9 @@ }, "dependencies": { "diff": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.1.tgz", - "integrity": "sha512-s2+XdvhPCOF01LRQBC8hf4vhbVmI2CGS5aZnxLJlT5FtdhPCDFq80q++zK2KlrVorVDdL5BOGZ/VfLrVtYNF+Q==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", "dev": true }, "has-flag": { From f79cc24ff3b2df6f746dbf4836d9ce07dd2fe397 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 13 Jan 2020 08:33:06 +0000 Subject: [PATCH 016/381] Bump handlebars from 4.5.3 to 4.7.1 Bumps [handlebars](https://github.com/wycats/handlebars.js) from 4.5.3 to 4.7.1. - [Release notes](https://github.com/wycats/handlebars.js/releases) - [Changelog](https://github.com/wycats/handlebars.js/blob/v4.7.1/release-notes.md) - [Commits](https://github.com/wycats/handlebars.js/compare/v4.5.3...v4.7.1) Signed-off-by: dependabot-preview[bot] --- package-lock.json | 12 ++++++------ package.json | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/package-lock.json b/package-lock.json index 41c5c0f658..e36ec160a8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6636,9 +6636,9 @@ "dev": true }, "handlebars": { - "version": "4.5.3", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.5.3.tgz", - "integrity": "sha512-3yPecJoJHK/4c6aZhSvxOyG4vJKDshV36VHp0iVCDVh7o9w2vwi3NSnL2MMPj3YdduqaBcu7cGbggJQM0br9xA==", + "version": "4.7.1", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.1.tgz", + "integrity": "sha512-2dd6soo60cwKNJ90VewNLIzdZPR/E2YhszOTgHpN9V0YuwZk7x33/iZoIBnASwDFVHMY7iJ6NPL8d9f/DWYCTA==", "dev": true, "requires": { "neo-async": "^2.6.0", @@ -12402,9 +12402,9 @@ "dev": true }, "uglify-js": { - "version": "3.6.9", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.6.9.tgz", - "integrity": "sha512-pcnnhaoG6RtrvHJ1dFncAe8Od6Nuy30oaJ82ts6//sGSXOP5UjBMEthiProjXmMNHOfd93sqlkztifFMcb+4yw==", + "version": "3.7.5", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.7.5.tgz", + "integrity": "sha512-GFZ3EXRptKGvb/C1Sq6nO1iI7AGcjyqmIyOw0DrD0675e+NNbGO72xmMM2iEBdFbxaTLo70NbjM/Wy54uZIlsg==", "dev": true, "optional": true, "requires": { diff --git a/package.json b/package.json index e867014556..20f5b239ce 100644 --- a/package.json +++ b/package.json @@ -63,7 +63,7 @@ "fs-extra": "^8.0.0", "glob": "^7.1.5", "globby": "^11.0.0", - "handlebars": "4.5.3", + "handlebars": "4.7.1", "html-to-image": "^0.1.0", "istanbul": "0.4.5", "istanbul-instrumenter-loader": "^3.0.1", From 6d5602b569de86ef3cf891f7e5413ba9a5114084 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 13 Jan 2020 08:33:08 +0000 Subject: [PATCH 017/381] Bump front-matter from 3.0.2 to 3.1.0 Bumps [front-matter](https://github.com/jxson/front-matter) from 3.0.2 to 3.1.0. - [Release notes](https://github.com/jxson/front-matter/releases) - [Commits](https://github.com/jxson/front-matter/compare/v3.0.2...v3.1.0) Signed-off-by: dependabot-preview[bot] --- package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 41c5c0f658..2547be21f0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5776,9 +5776,9 @@ } }, "front-matter": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/front-matter/-/front-matter-3.0.2.tgz", - "integrity": "sha512-iBGZaWyzqgsrPGsqrXZP6N4hp5FzSKDi18nfAoYpgz3qK5sAwFv/ojmn3VS60SOgLvq6CtojNqy0y6ZNz05IzQ==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/front-matter/-/front-matter-3.1.0.tgz", + "integrity": "sha512-RFEK8N6waWTdwBZOPNEtvwMjZ/hUfpwXkYUYkmmOhQGdhSulXhWrFwiUhdhkduLDiIwbROl/faF1X/PC/GGRMw==", "dev": true, "requires": { "js-yaml": "^3.13.1" From 5ce532e3e44cd329505c42c92f7905ed24d95b39 Mon Sep 17 00:00:00 2001 From: Matt Walker Date: Mon, 13 Jan 2020 10:46:40 +0000 Subject: [PATCH 018/381] Mock PointerEvent in tests to include target The `target` Event property is readonly as it is set internally when an event is dispatched. This change uses a plain object with the essential properties that a PointerEvent has which is sufficent for map event handling --- test/spec/ol/interaction/draw.test.js | 3 ++- test/spec/ol/interaction/extent.test.js | 3 ++- test/spec/ol/interaction/modify.test.js | 1 + test/spec/ol/interaction/select.test.js | 6 ++++-- test/spec/ol/interaction/translate.test.js | 16 +++++++++------- 5 files changed, 18 insertions(+), 11 deletions(-) diff --git a/test/spec/ol/interaction/draw.test.js b/test/spec/ol/interaction/draw.test.js index 7a12b66887..835d765b55 100644 --- a/test/spec/ol/interaction/draw.test.js +++ b/test/spec/ol/interaction/draw.test.js @@ -73,8 +73,9 @@ describe('ol.interaction.Draw', function() { // calculated in case body has top < 0 (test runner with small window) const position = viewport.getBoundingClientRect(); const shiftKey = opt_shiftKey !== undefined ? opt_shiftKey : false; - const event = new Event(); + const event = {}; event.type = type; + event.target = viewport.firstChild; event.clientX = position.left + x + width / 2; event.clientY = position.top + y + height / 2; event.shiftKey = shiftKey; diff --git a/test/spec/ol/interaction/extent.test.js b/test/spec/ol/interaction/extent.test.js index 56fd15765e..7bd5f9e86c 100644 --- a/test/spec/ol/interaction/extent.test.js +++ b/test/spec/ol/interaction/extent.test.js @@ -50,8 +50,9 @@ describe('ol.interaction.Extent', function() { // calculated in case body has top < 0 (test runner with small window) const position = viewport.getBoundingClientRect(); const shiftKey = opt_shiftKey !== undefined ? opt_shiftKey : false; - const pointerEvent = new Event(); + const pointerEvent = {}; pointerEvent.type = type; + pointerEvent.target = viewport.firstChild; pointerEvent.button = button; pointerEvent.clientX = position.left + x + width / 2; pointerEvent.clientY = position.top - y + height / 2; diff --git a/test/spec/ol/interaction/modify.test.js b/test/spec/ol/interaction/modify.test.js index 7deae8d5d7..18b2c28063 100644 --- a/test/spec/ol/interaction/modify.test.js +++ b/test/spec/ol/interaction/modify.test.js @@ -84,6 +84,7 @@ describe('ol.interaction.Modify', function() { const position = viewport.getBoundingClientRect(); const pointerEvent = new Event(); pointerEvent.type = type; + pointerEvent.target = viewport.firstChild; pointerEvent.clientX = position.left + x + width / 2; pointerEvent.clientY = position.top + y + height / 2; pointerEvent.shiftKey = modifiers.shift || false; diff --git a/test/spec/ol/interaction/select.test.js b/test/spec/ol/interaction/select.test.js index 50f7bb2c70..e64eb2dc28 100644 --- a/test/spec/ol/interaction/select.test.js +++ b/test/spec/ol/interaction/select.test.js @@ -91,11 +91,13 @@ describe('ol.interaction.Select', function() { // calculated in case body has top < 0 (test runner with small window) const position = viewport.getBoundingClientRect(); const shiftKey = opt_shiftKey !== undefined ? opt_shiftKey : false; - const event = new PointerEvent(type, { + const event = { + type: type, + target: viewport.firstChild, clientX: position.left + x + width / 2, clientY: position.top + y + height / 2, shiftKey: shiftKey - }); + }; map.handleMapBrowserEvent(new MapBrowserPointerEvent(type, map, event)); } diff --git a/test/spec/ol/interaction/translate.test.js b/test/spec/ol/interaction/translate.test.js index a3df2ccebe..79efde34bb 100644 --- a/test/spec/ol/interaction/translate.test.js +++ b/test/spec/ol/interaction/translate.test.js @@ -65,13 +65,15 @@ describe('ol.interaction.Translate', function() { // calculated in case body has top < 0 (test runner with small window) const position = viewport.getBoundingClientRect(); const shiftKey = opt_shiftKey !== undefined ? opt_shiftKey : false; - const event = new MapBrowserPointerEvent(type, map, - new PointerEvent(type, { - clientX: position.left + x + width / 2, - clientY: position.top + y + height / 2, - shiftKey: shiftKey, - preventDefault: function() {} - })); + const event = new MapBrowserPointerEvent(type, map, { + type: type, + target: viewport.firstChild, + pointerId: 0, + clientX: position.left + x + width / 2, + clientY: position.top + y + height / 2, + shiftKey: shiftKey, + preventDefault: function() {} + }); map.handleMapBrowserEvent(event); } From 4e599a370ba95f31d8b27c12bed551ce5b68afaa Mon Sep 17 00:00:00 2001 From: Matt Walker Date: Mon, 13 Jan 2020 10:56:41 +0000 Subject: [PATCH 019/381] Use document.body to check if an event target is within the page Some events will originate outside the map viewport such as keyboard events which originate with the element specified by keyboardEventTarget which could be document.body --- src/ol/PluggableMap.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ol/PluggableMap.js b/src/ol/PluggableMap.js index 1966a43035..75c1f4a7be 100644 --- a/src/ol/PluggableMap.js +++ b/src/ol/PluggableMap.js @@ -934,7 +934,7 @@ class PluggableMap extends BaseObject { } const target = /** @type {Node} */ (mapBrowserEvent.originalEvent.target); if (!mapBrowserEvent.dragging) { - if (this.overlayContainerStopEvent_.contains(target) || !this.viewport_.contains(target)) { + if (this.overlayContainerStopEvent_.contains(target) || !document.body.contains(target)) { // Abort if the event target is a child of the container that doesn't allow // event propagation or is no longer in the page. It's possible for the target to no longer // be in the page if it has been removed in an event listener, this might happen in a Control From eeec2b9e7db4a586234607877f340116906df105 Mon Sep 17 00:00:00 2001 From: Matt Walker Date: Mon, 13 Jan 2020 11:32:40 +0000 Subject: [PATCH 020/381] Lint: remove unused imports --- test/spec/ol/interaction/draw.test.js | 1 - test/spec/ol/interaction/extent.test.js | 1 - 2 files changed, 2 deletions(-) diff --git a/test/spec/ol/interaction/draw.test.js b/test/spec/ol/interaction/draw.test.js index 835d765b55..fc571891d8 100644 --- a/test/spec/ol/interaction/draw.test.js +++ b/test/spec/ol/interaction/draw.test.js @@ -15,7 +15,6 @@ import Polygon from '../../../../src/ol/geom/Polygon.js'; import Draw, {createRegularPolygon, createBox} from '../../../../src/ol/interaction/Draw.js'; import Interaction from '../../../../src/ol/interaction/Interaction.js'; import VectorLayer from '../../../../src/ol/layer/Vector.js'; -import Event from '../../../../src/ol/events/Event.js'; import VectorSource from '../../../../src/ol/source/Vector.js'; import {clearUserProjection, setUserProjection, transform} from '../../../../src/ol/proj.js'; import {register} from '../../../../src/ol/proj/proj4.js'; diff --git a/test/spec/ol/interaction/extent.test.js b/test/spec/ol/interaction/extent.test.js index 7bd5f9e86c..63fc0e59c9 100644 --- a/test/spec/ol/interaction/extent.test.js +++ b/test/spec/ol/interaction/extent.test.js @@ -2,7 +2,6 @@ import Map from '../../../../src/ol/Map.js'; import MapBrowserPointerEvent from '../../../../src/ol/MapBrowserPointerEvent.js'; import View from '../../../../src/ol/View.js'; import ExtentInteraction from '../../../../src/ol/interaction/Extent.js'; -import Event from '../../../../src/ol/events/Event.js'; describe('ol.interaction.Extent', function() { let map, interaction; From fd935bae53151658f3c718263b64d17a47968906 Mon Sep 17 00:00:00 2001 From: Andreas Hocevar Date: Mon, 13 Jan 2020 21:52:55 +0100 Subject: [PATCH 021/381] Remove label cache, render text directly to target canvas --- src/ol/render/canvas.js | 65 ++++--- src/ol/render/canvas/Executor.js | 178 ++++++++++-------- src/ol/render/canvas/LabelCache.js | 20 -- src/ol/render/canvas/TextBuilder.js | 5 +- src/ol/renderer/Composite.js | 8 +- src/ol/structs/LRUCache.js | 7 +- test/spec/ol/render/canvas/index.test.js | 44 ++--- test/spec/ol/render/canvas/labelcache.test.js | 13 -- .../spec/ol/render/canvas/textbuilder.test.js | 8 +- .../ol/renderer/canvas/vectorlayer.test.js | 7 +- .../renderer/canvas/vectortilelayer.test.js | 7 +- 11 files changed, 175 insertions(+), 187 deletions(-) delete mode 100644 src/ol/render/canvas/LabelCache.js delete mode 100644 test/spec/ol/render/canvas/labelcache.test.js diff --git a/src/ol/render/canvas.js b/src/ol/render/canvas.js index d345568a64..d4c7498451 100644 --- a/src/ol/render/canvas.js +++ b/src/ol/render/canvas.js @@ -5,7 +5,9 @@ import {getFontParameters} from '../css.js'; import {createCanvasContext2D} from '../dom.js'; import {clear} from '../obj.js'; import {create as createTransform} from '../transform.js'; -import LabelCache from './canvas/LabelCache.js'; +import {executeLabelInstructions} from './canvas/Executor.js'; +import BaseObject from '../Object.js'; +import EventTarget from '../events/Target.js'; /** @@ -164,21 +166,23 @@ export const defaultPadding = [0, 0, 0, 0]; */ export const defaultLineWidth = 1; +/** + * @type {BaseObject} + */ +export const checkedFonts = new BaseObject(); /** * The label cache for text rendering. To change the default cache size of 2048 * entries, use {@link module:ol/structs/LRUCache#setSize}. - * @type {LabelCache} + * Deprecated - there is no label cache any more. + * @type {?} * @api + * @deprecated */ -export const labelCache = new LabelCache(); - - -/** - * @type {!Object} - */ -export const checkedFonts = {}; - +export const labelCache = new EventTarget(); +labelCache.setSize = function() { + console.warn('labelCache is deprecated.'); //eslint-disable-line +}; /** * @type {CanvasRenderingContext2D} @@ -200,9 +204,8 @@ export const textHeights = {}; * Clears the label cache when a font becomes available. * @param {string} fontSpec CSS font spec. */ -export const checkFont = (function() { +export const registerFont = (function() { const retries = 100; - const checked = checkedFonts; const size = '32px '; const referenceFonts = ['monospace', 'serif']; const len = referenceFonts.length; @@ -235,19 +238,18 @@ export const checkFont = (function() { function check() { let done = true; - for (const font in checked) { - if (checked[font] < retries) { + const fonts = checkedFonts.getKeys(); + for (let i = 0, ii = fonts.length; i < ii; ++i) { + const font = fonts[i]; + if (checkedFonts.get(font) < retries) { if (isAvailable.apply(this, font.split('\n'))) { - checked[font] = retries; clear(textHeights); // Make sure that loaded fonts are picked up by Safari measureContext = null; measureFont = undefined; - if (labelCache.getCount()) { - labelCache.clear(); - } + checkedFonts.set(font, retries); } else { - ++checked[font]; + checkedFonts.set(font, checkedFonts.get(font) + 1, true); done = false; } } @@ -267,10 +269,10 @@ export const checkFont = (function() { for (let i = 0, ii = families.length; i < ii; ++i) { const family = families[i]; const key = font.style + '\n' + font.weight + '\n' + family; - if (!(key in checked)) { - checked[key] = retries; + if (checkedFonts.get(key) === undefined) { + checkedFonts.set(key, retries, true); if (!isAvailable(font.style, font.weight, family)) { - checked[key] = 0; + checkedFonts.set(key, 0, true); if (interval === undefined) { interval = setInterval(check, 32); } @@ -388,7 +390,7 @@ export const resetTransform = createTransform(); * @param {CanvasRenderingContext2D} context Context. * @param {import("../transform.js").Transform|null} transform Transform. * @param {number} opacity Opacity. - * @param {HTMLImageElement|HTMLCanvasElement|HTMLVideoElement} image Image. + * @param {import("./canvas/Executor.js").Label|HTMLCanvasElement|HTMLImageElement|HTMLVideoElement} labelOrImage Label. * @param {number} originX Origin X. * @param {number} originY Origin Y. * @param {number} w Width. @@ -397,8 +399,8 @@ export const resetTransform = createTransform(); * @param {number} y Y. * @param {number} scale Scale. */ -export function drawImage(context, - transform, opacity, image, originX, originY, w, h, x, y, scale) { +export function drawImageOrLabel(context, + transform, opacity, labelOrImage, originX, originY, w, h, x, y, scale) { let alpha; if (opacity != 1) { alpha = context.globalAlpha; @@ -408,12 +410,21 @@ export function drawImage(context, context.setTransform.apply(context, transform); } - context.drawImage(image, originX, originY, w, h, x, y, w * scale, h * scale); + const isLabel = !!(/** @type {*} */ (labelOrImage).contextInstructions); + + if (isLabel) { + context.translate(x, y); + context.scale(scale, scale); + executeLabelInstructions(/** @type {import("./canvas/Executor.js").Label} */ (labelOrImage), context); + } else { + context.drawImage(/** @type {HTMLCanvasElement|HTMLImageElement|HTMLVideoElement} */ (labelOrImage), originX, originY, w, h, x, y, w * scale, h * scale); + } if (opacity != 1) { context.globalAlpha = alpha; } - if (transform) { + + if (transform || isLabel) { context.setTransform.apply(context, resetTransform); } } diff --git a/src/ol/render/canvas/Executor.js b/src/ol/render/canvas/Executor.js index 5ec354c5b0..e94f666554 100644 --- a/src/ol/render/canvas/Executor.js +++ b/src/ol/render/canvas/Executor.js @@ -7,7 +7,7 @@ import {createEmpty, createOrUpdate, import {lineStringLength} from '../../geom/flat/length.js'; import {drawTextOnPath} from '../../geom/flat/textpath.js'; import {transform2D} from '../../geom/flat/transform.js'; -import {drawImage, defaultPadding, defaultTextBaseline} from '../canvas.js'; +import {drawImageOrLabel, defaultPadding, defaultTextBaseline} from '../canvas.js'; import CanvasInstruction from './Instruction.js'; import {TEXT_ALIGN} from './TextBuilder.js'; import { @@ -16,8 +16,7 @@ import { apply as applyTransform, setFromArray as transformSetFromArray } from '../../transform.js'; -import {createCanvasContext2D} from '../../dom.js'; -import {labelCache, defaultTextAlign, measureTextHeight, measureAndCacheTextWidth, measureTextWidths} from '../canvas.js'; +import {defaultTextAlign, measureTextHeight, measureAndCacheTextWidth, measureTextWidths} from '../canvas.js'; import RBush from 'rbush/rbush.js'; @@ -31,6 +30,28 @@ import RBush from 'rbush/rbush.js'; * @property {!Object} strokeStates The stroke states (decluttering). */ +/** + * @typedef Label + * @property {number} width + * @property {number} height + * @property {Array} contextInstructions + */ + +/** + * @param {Label} label Label. + * @param {CanvasRenderingContext2D} context Context. + */ +export function executeLabelInstructions(label, context) { + const contextInstructions = label.contextInstructions; + for (let i = 0, ii = contextInstructions.length; i < ii; i += 2) { + if (Array.isArray(contextInstructions[i + 1])) { + CanvasRenderingContext2D.prototype[contextInstructions[i]].apply(context, contextInstructions[i + 1]); + } else { + context[contextInstructions[i]] = contextInstructions[i + 1]; + } + } +} + /** * @type {import("../../extent.js").Extent} */ @@ -159,69 +180,66 @@ class Executor { * @param {string} textKey Text style key. * @param {string} fillKey Fill style key. * @param {string} strokeKey Stroke style key. - * @return {HTMLCanvasElement} Image. + * @return {Label} Label. */ - getTextImage(text, textKey, fillKey, strokeKey) { - let label; - const key = strokeKey + textKey + text + fillKey + this.pixelRatio; + createLabel(text, textKey, fillKey, strokeKey) { + const strokeState = strokeKey ? this.strokeStates[strokeKey] : null; + const fillState = fillKey ? this.fillStates[fillKey] : null; + const textState = this.textStates[textKey]; + const pixelRatio = this.pixelRatio; + const scale = textState.scale * pixelRatio; + const align = TEXT_ALIGN[textState.textAlign || defaultTextAlign]; + const strokeWidth = strokeKey && strokeState.lineWidth ? strokeState.lineWidth : 0; - if (!labelCache.containsKey(key)) { - const strokeState = strokeKey ? this.strokeStates[strokeKey] : null; - const fillState = fillKey ? this.fillStates[fillKey] : null; - const textState = this.textStates[textKey]; - const pixelRatio = this.pixelRatio; - const scale = textState.scale * pixelRatio; - const align = TEXT_ALIGN[textState.textAlign || defaultTextAlign]; - const strokeWidth = strokeKey && strokeState.lineWidth ? strokeState.lineWidth : 0; - - const lines = text.split('\n'); - const numLines = lines.length; - const widths = []; - const width = measureTextWidths(textState.font, lines, widths); - const lineHeight = measureTextHeight(textState.font); - const height = lineHeight * numLines; - const renderWidth = width + strokeWidth; - const context = createCanvasContext2D( - // make canvas 2 pixels wider to account for italic text width measurement errors - Math.ceil((renderWidth + 2) * scale), - Math.ceil((height + strokeWidth) * scale)); - label = context.canvas; - labelCache.set(key, label); - if (scale != 1) { - context.scale(scale, scale); - } - context.font = textState.font; - if (strokeKey) { - context.strokeStyle = strokeState.strokeStyle; - context.lineWidth = strokeWidth; - context.lineCap = strokeState.lineCap; - context.lineJoin = strokeState.lineJoin; - context.miterLimit = strokeState.miterLimit; - if (context.setLineDash && strokeState.lineDash.length) { - context.setLineDash(strokeState.lineDash); - context.lineDashOffset = strokeState.lineDashOffset; - } - } - if (fillKey) { - context.fillStyle = fillState.fillStyle; - } - context.textBaseline = 'middle'; - context.textAlign = 'center'; - const leftRight = (0.5 - align); - const x = align * renderWidth + leftRight * strokeWidth; - let i; - if (strokeKey) { - for (i = 0; i < numLines; ++i) { - context.strokeText(lines[i], x + leftRight * widths[i], 0.5 * (strokeWidth + lineHeight) + i * lineHeight); - } - } - if (fillKey) { - for (i = 0; i < numLines; ++i) { - context.fillText(lines[i], x + leftRight * widths[i], 0.5 * (strokeWidth + lineHeight) + i * lineHeight); - } + const lines = text.split('\n'); + const numLines = lines.length; + const widths = []; + const width = measureTextWidths(textState.font, lines, widths); + const lineHeight = measureTextHeight(textState.font); + const height = lineHeight * numLines; + const renderWidth = width + strokeWidth; + const contextInstructions = []; + /** @type {Label} */ + const label = { + // make canvas 2 pixels wider to account for italic text width measurement errors + width: Math.ceil((renderWidth + 2) * scale), + height: Math.ceil((height + strokeWidth) * scale), + contextInstructions: contextInstructions + }; + if (scale != 1) { + contextInstructions.push('scale', [scale, scale]); + } + contextInstructions.push('font', textState.font); + if (strokeKey) { + contextInstructions.push('strokeStyle', strokeState.strokeStyle); + contextInstructions.push('lineWidth', strokeWidth); + contextInstructions.push('lineCap', strokeState.lineCap); + contextInstructions.push('lineJoin', strokeState.lineJoin); + contextInstructions.push('miterLimit', strokeState.miterLimit); + if (CanvasRenderingContext2D.prototype.setLineDash && strokeState.lineDash.length) { + contextInstructions.push('setLineDash', [strokeState.lineDash]); + contextInstructions.push('lineDashOffset', strokeState.lineDashOffset); } } - return labelCache.get(key, this); + if (fillKey) { + contextInstructions.push('fillStyle', fillState.fillStyle); + } + contextInstructions.push('textBaseline', 'middle'); + contextInstructions.push('textAlign', 'center'); + const leftRight = (0.5 - align); + const x = align * renderWidth + leftRight * strokeWidth; + let i; + if (strokeKey) { + for (i = 0; i < numLines; ++i) { + contextInstructions.push('strokeText', [lines[i], x + leftRight * widths[i], 0.5 * (strokeWidth + lineHeight) + i * lineHeight]); + } + } + if (fillKey) { + for (i = 0; i < numLines; ++i) { + contextInstructions.push('fillText', [lines[i], x + leftRight * widths[i], 0.5 * (strokeWidth + lineHeight) + i * lineHeight]); + } + } + return label; } /** @@ -254,7 +272,7 @@ class Executor { * @param {CanvasRenderingContext2D} context Context. * @param {number} x X. * @param {number} y Y. - * @param {HTMLImageElement|HTMLCanvasElement|HTMLVideoElement} image Image. + * @param {Label|HTMLImageElement|HTMLCanvasElement|HTMLVideoElement} imageOrLabel Image. * @param {number} anchorX Anchor X. * @param {number} anchorY Anchor Y. * @param {import("../canvas.js").DeclutterGroup} declutterGroup Declutter group. @@ -270,11 +288,11 @@ class Executor { * @param {Array<*>} fillInstruction Fill instruction. * @param {Array<*>} strokeInstruction Stroke instruction. */ - replayImage_( + replayImageOrLabel_( context, x, y, - image, + imageOrLabel, anchorX, anchorY, declutterGroup, @@ -296,8 +314,8 @@ class Executor { x -= anchorX; y -= anchorY; - const w = (width + originX > image.width) ? image.width - originX : width; - const h = (height + originY > image.height) ? image.height - originY : height; + const w = (width + originX > imageOrLabel.width) ? imageOrLabel.width - originX : width; + const h = (height + originY > imageOrLabel.height) ? imageOrLabel.height - originY : height; const boxW = padding[3] + w * scale + padding[1]; const boxH = padding[0] + h * scale + padding[2]; const boxX = x - padding[3]; @@ -351,7 +369,7 @@ class Executor { } extend(declutterGroup, tmpExtent); const declutterArgs = intersects ? - [context, transform ? transform.slice(0) : null, opacity, image, originX, originY, w, h, x, y, scale] : + [context, transform ? transform.slice(0) : null, opacity, imageOrLabel, originX, originY, w, h, x, y, scale] : null; if (declutterArgs) { if (fillStroke) { @@ -365,7 +383,7 @@ class Executor { /** @type {Array<*>} */ (fillInstruction), /** @type {Array<*>} */ (strokeInstruction)); } - drawImage(context, transform, opacity, image, originX, originY, w, h, x, y, scale); + drawImageOrLabel(context, transform, opacity, imageOrLabel, originX, originY, w, h, x, y, scale); } } @@ -440,7 +458,7 @@ class Executor { declutterData[13], declutterData[14], declutterData[15], declutterData[16], declutterData[11], declutterData[12]); } - drawImage.apply(undefined, declutterData); + drawImageOrLabel.apply(undefined, declutterData); if (currentAlpha !== opacity) { context.globalAlpha = currentAlpha; } @@ -459,12 +477,12 @@ class Executor { * @param {string} textKey The key of the text state. * @param {string} strokeKey The key for the stroke state. * @param {string} fillKey The key for the fill state. - * @return {{label: HTMLCanvasElement, anchorX: number, anchorY: number}} The text image and its anchor. + * @return {{label: Label, anchorX: number, anchorY: number}} The text image and its anchor. */ - drawTextImageWithPointPlacement_(text, textKey, strokeKey, fillKey) { + drawLabelWithPointPlacement_(text, textKey, strokeKey, fillKey) { const textState = this.textStates[textKey]; - const label = this.getTextImage(text, textKey, fillKey, strokeKey); + const label = this.createLabel(text, textKey, fillKey, strokeKey); const strokeState = this.strokeStates[strokeKey]; const pixelRatio = this.pixelRatio; @@ -472,7 +490,7 @@ class Executor { const baseline = TEXT_ALIGN[textState.textBaseline || defaultTextBaseline]; const strokeWidth = strokeState && strokeState.lineWidth ? strokeState.lineWidth : 0; - // Remove the 2 pixels we added in getTextImage() for the anchor + // Remove the 2 pixels we added in createLabel() for the anchor const width = label.width / pixelRatio - 2 * textState.scale; const anchorX = align * width + 2 * (0.5 - align) * strokeWidth; const anchorY = baseline * label.height / pixelRatio + 2 * (0.5 - baseline) * strokeWidth; @@ -637,7 +655,7 @@ class Executor { textKey = /** @type {string} */ (instruction[19]); strokeKey = /** @type {string} */ (instruction[20]); fillKey = /** @type {string} */ (instruction[21]); - const labelWithAnchor = this.drawTextImageWithPointPlacement_(text, textKey, strokeKey, fillKey); + const labelWithAnchor = this.drawLabelWithPointPlacement_(text, textKey, strokeKey, fillKey); image = labelWithAnchor.label; instruction[3] = image; const textOffsetX = /** @type {number} */ (instruction[22]); @@ -690,7 +708,7 @@ class Executor { } declutterGroup = declutterGroups[index]; } - this.replayImage_(context, + this.replayImageOrLabel_(context, pixelCoordinates[d], pixelCoordinates[d + 1], image, anchorX, anchorY, declutterGroup, height, opacity, originX, originY, rotation, scale, snapToPixel, width, padding, @@ -747,10 +765,10 @@ class Executor { for (c = 0, cc = parts.length; c < cc; ++c) { part = parts[c]; // x, y, anchorX, rotation, chunk chars = /** @type {string} */ (part[4]); - label = this.getTextImage(chars, textKey, '', strokeKey); + label = this.createLabel(chars, textKey, '', strokeKey); anchorX = /** @type {number} */ (part[2]) + strokeWidth; anchorY = baseline * label.height + (0.5 - baseline) * 2 * strokeWidth - offsetY; - this.replayImage_(context, + this.replayImageOrLabel_(context, /** @type {number} */ (part[0]), /** @type {number} */ (part[1]), label, anchorX, anchorY, declutterGroup, label.height, 1, 0, 0, /** @type {number} */ (part[3]), pixelRatioScale, false, label.width, @@ -761,10 +779,10 @@ class Executor { for (c = 0, cc = parts.length; c < cc; ++c) { part = parts[c]; // x, y, anchorX, rotation, chunk chars = /** @type {string} */ (part[4]); - label = this.getTextImage(chars, textKey, fillKey, ''); + label = this.createLabel(chars, textKey, fillKey, ''); anchorX = /** @type {number} */ (part[2]); anchorY = baseline * label.height - offsetY; - this.replayImage_(context, + this.replayImageOrLabel_(context, /** @type {number} */ (part[0]), /** @type {number} */ (part[1]), label, anchorX, anchorY, declutterGroup, label.height, 1, 0, 0, /** @type {number} */ (part[3]), pixelRatioScale, false, label.width, diff --git a/src/ol/render/canvas/LabelCache.js b/src/ol/render/canvas/LabelCache.js deleted file mode 100644 index 37de689738..0000000000 --- a/src/ol/render/canvas/LabelCache.js +++ /dev/null @@ -1,20 +0,0 @@ -import LRUCache from '../../structs/LRUCache.js'; - -/** - * @module ol/render/canvas/LabelCache - */ - -/** - * @classdesc - * Cache of pre-rendered labels. - */ -class LabelCache extends LRUCache { - - expireCache() { - while (this.canExpireCache()) { - this.pop(); - } - } -} - -export default LabelCache; diff --git a/src/ol/render/canvas/TextBuilder.js b/src/ol/render/canvas/TextBuilder.js index c14b3ce367..aec72113ad 100644 --- a/src/ol/render/canvas/TextBuilder.js +++ b/src/ol/render/canvas/TextBuilder.js @@ -6,7 +6,7 @@ import {asColorLike} from '../../colorlike.js'; import {intersects} from '../../extent.js'; import {matchingChunk} from '../../geom/flat/straightchunk.js'; import GeometryType from '../../geom/GeometryType.js'; -import {labelCache, defaultTextAlign, defaultPadding, defaultLineCap, defaultLineDashOffset, defaultLineDash, defaultLineJoin, defaultFillStyle, checkFont, defaultFont, defaultLineWidth, defaultMiterLimit, defaultStrokeStyle, defaultTextBaseline} from '../canvas.js'; +import {defaultTextAlign, defaultPadding, defaultLineCap, defaultLineDashOffset, defaultLineDash, defaultLineJoin, defaultFillStyle, registerFont, defaultFont, defaultLineWidth, defaultMiterLimit, defaultStrokeStyle, defaultTextBaseline} from '../canvas.js'; import CanvasInstruction from './Instruction.js'; import CanvasBuilder from './Builder.js'; import TextPlacement from '../../style/TextPlacement.js'; @@ -138,7 +138,6 @@ class CanvasTextBuilder extends CanvasBuilder { */ finish() { const instructions = super.finish(); - labelCache.expireCache(); instructions.textStates = this.textStates; instructions.fillStates = this.fillStates; instructions.strokeStates = this.strokeStates; @@ -432,7 +431,7 @@ class CanvasTextBuilder extends CanvasBuilder { textState = this.textState_; const font = textStyle.getFont() || defaultFont; - checkFont(font); + registerFont(font); const textScale = textStyle.getScale(); textState.overflow = textStyle.getOverflow(); textState.font = font; diff --git a/src/ol/renderer/Composite.js b/src/ol/renderer/Composite.js index 12cce9ba7c..24ee0ef801 100644 --- a/src/ol/renderer/Composite.js +++ b/src/ol/renderer/Composite.js @@ -8,9 +8,9 @@ import RenderEventType from '../render/EventType.js'; import MapRenderer from './Map.js'; import SourceState from '../source/State.js'; import {replaceChildren} from '../dom.js'; -import {labelCache} from '../render/canvas.js'; -import EventType from '../events/EventType.js'; import {listen, unlistenByKey} from '../events.js'; +import {checkedFonts} from '../render/canvas.js'; +import ObjectEventType from '../ObjectEventType.js'; /** @@ -29,7 +29,7 @@ class CompositeMapRenderer extends MapRenderer { /** * @type {import("../events.js").EventsKey} */ - this.labelCacheKey_ = listen(labelCache, EventType.CLEAR, map.redrawText.bind(map)); + this.fontChangeListenerKey_ = listen(checkedFonts, ObjectEventType.PROPERTYCHANGE, map.redrawText.bind(map)); /** * @private @@ -73,7 +73,7 @@ class CompositeMapRenderer extends MapRenderer { } disposeInternal() { - unlistenByKey(this.labelCacheKey_); + unlistenByKey(this.fontChangeListenerKey_); this.element_.parentNode.removeChild(this.element_); super.disposeInternal(); } diff --git a/src/ol/structs/LRUCache.js b/src/ol/structs/LRUCache.js index 0e57889820..be36c25717 100644 --- a/src/ol/structs/LRUCache.js +++ b/src/ol/structs/LRUCache.js @@ -3,8 +3,6 @@ */ import {assert} from '../asserts.js'; -import EventTarget from '../events/Target.js'; -import EventType from '../events/EventType.js'; /** @@ -25,15 +23,13 @@ import EventType from '../events/EventType.js'; * @fires import("../events/Event.js").default * @template T */ -class LRUCache extends EventTarget { +class LRUCache { /** * @param {number=} opt_highWaterMark High water mark. */ constructor(opt_highWaterMark) { - super(); - /** * @type {number} */ @@ -82,7 +78,6 @@ class LRUCache extends EventTarget { this.entries_ = {}; this.oldest_ = null; this.newest_ = null; - this.dispatchEvent(EventType.CLEAR); } diff --git a/test/spec/ol/render/canvas/index.test.js b/test/spec/ol/render/canvas/index.test.js index f2d4d23ca1..58a4a5551d 100644 --- a/test/spec/ol/render/canvas/index.test.js +++ b/test/spec/ol/render/canvas/index.test.js @@ -1,4 +1,3 @@ -import {clear} from '../../../../../src/ol/obj.js'; import * as render from '../../../../../src/ol/render/canvas.js'; @@ -9,69 +8,70 @@ describe('ol.render.canvas', function() { font.rel = 'stylesheet'; const head = document.getElementsByTagName('head')[0]; - describe('ol.render.canvas.checkFont()', function() { + describe('ol.render.canvas.registerFont()', function() { beforeEach(function() { - clear(render.checkedFonts); + render.checkedFonts.values_ = {}; render.measureTextHeight('12px sans-serif'); }); const retries = 100; - it('does not clear label cache and measurements for unavailable fonts', function(done) { + it('does not trigger redraw and clear measurements for unavailable fonts', function(done) { this.timeout(4000); const spy = sinon.spy(); - render.labelCache.addEventListener('clear', spy); + render.checkedFonts.addEventListener('propertychange', spy); const interval = setInterval(function() { - if (render.checkedFonts['normal\nnormal\nfoo'] == retries && render.checkedFonts['normal\nnormal\nsans-serif'] == retries) { + if (render.checkedFonts.get('normal\nnormal\nfoo') == retries && render.checkedFonts.get('normal\nnormal\nsans-serif') == retries) { clearInterval(interval); - render.labelCache.removeEventListener('clear', spy); + render.checkedFonts.removeEventListener('propertychange', spy); expect(spy.callCount).to.be(0); expect(render.textHeights).to.not.eql({}); done(); } }, 32); - render.checkFont('12px foo,sans-serif'); + render.registerFont('12px foo,sans-serif'); }); - it('does not clear label cache and measurements for available fonts', function(done) { + it('does not trigger redraw and clear measurements for available fonts', function(done) { const spy = sinon.spy(); - render.labelCache.addEventListener('clear', spy); + render.checkedFonts.addEventListener('propertychange', spy); const interval = setInterval(function() { - if (render.checkedFonts['normal\nnormal\nsans-serif'] == retries) { + if (render.checkedFonts.get('normal\nnormal\nsans-serif') == retries) { clearInterval(interval); - render.labelCache.removeEventListener('clear', spy); + render.checkedFonts.removeEventListener('propertychange', spy); expect(spy.callCount).to.be(0); expect(render.textHeights).to.not.eql({}); done(); } }, 32); - render.checkFont('12px sans-serif'); + render.registerFont('12px sans-serif'); }); - it('does not clear label cache and measurements for the \'monospace\' font', function(done) { + it('does not trigger redraw and clear measurements for the \'monospace\' font', function(done) { const spy = sinon.spy(); - render.labelCache.addEventListener('clear', spy); + render.checkedFonts.addEventListener('propertychange', spy); const interval = setInterval(function() { - if (render.checkedFonts['normal\nnormal\nmonospace'] == retries) { + if (render.checkedFonts.get('normal\nnormal\nmonospace') == retries) { clearInterval(interval); - render.labelCache.removeEventListener('clear', spy); + render.checkedFonts.removeEventListener('propertychange', spy); expect(spy.callCount).to.be(0); expect(render.textHeights).to.not.eql({}); done(); } }, 32); - render.checkFont('12px monospace'); + render.registerFont('12px monospace'); }); - it('clears label cache and measurements for fonts that become available', function(done) { + it('triggers redraw and clear measurements for fonts that become available', function(done) { head.appendChild(font); - render.labelCache.set('dummy', {}); - render.labelCache.addEventListener('clear', function() { + render.checkedFonts.addEventListener('propertychange', function onPropertyChange(e) { + render.checkedFonts.removeEventListener('propertychange', onPropertyChange); + expect(e.key).to.be('normal\nnormal\nAbel'); expect(render.textHeights).to.eql({}); done(); }); - render.checkFont('12px Abel'); + render.registerFont('12px Abel'); }); }); diff --git a/test/spec/ol/render/canvas/labelcache.test.js b/test/spec/ol/render/canvas/labelcache.test.js deleted file mode 100644 index d6c5fb8531..0000000000 --- a/test/spec/ol/render/canvas/labelcache.test.js +++ /dev/null @@ -1,13 +0,0 @@ -import LabelCache from '../../../../../src/ol/render/canvas/LabelCache.js'; - -describe('ol.render.canvas.LabelCache', function() { - - it('#expireCache()', function() { - const labelCache = new LabelCache(1); - labelCache.set('key1', document.createElement('canvas')); - labelCache.set('key2', document.createElement('canvas')); - labelCache.expireCache(); - expect(labelCache.getCount()).to.be(1); - }); - -}); diff --git a/test/spec/ol/render/canvas/textbuilder.test.js b/test/spec/ol/render/canvas/textbuilder.test.js index 850134b675..c4f90fe651 100644 --- a/test/spec/ol/render/canvas/textbuilder.test.js +++ b/test/spec/ol/render/canvas/textbuilder.test.js @@ -29,11 +29,11 @@ function executeInstructions(builder, expectedDrawTextImageCalls, expectedBuilde const transform = createTransform(); const context = createContext(); const executor = new Executor(0.02, 1, false, builder.finish()); - sinon.spy(executor, 'drawTextImageWithPointPlacement_'); - const replayImageStub = sinon.stub(executor, 'replayImage_'); + sinon.spy(executor, 'drawLabelWithPointPlacement_'); + const replayImageOrLabelStub = sinon.stub(executor, 'replayImageOrLabel_'); executor.execute(context, transform); - expect(executor.drawTextImageWithPointPlacement_.callCount).to.be(expectedDrawTextImageCalls); - expect(replayImageStub.callCount).to.be(expectedBuilderImageCalls); + expect(executor.drawLabelWithPointPlacement_.callCount).to.be(expectedDrawTextImageCalls); + expect(replayImageOrLabelStub.callCount).to.be(expectedBuilderImageCalls); } describe('ol.render.canvas.TextBuilder', function() { diff --git a/test/spec/ol/renderer/canvas/vectorlayer.test.js b/test/spec/ol/renderer/canvas/vectorlayer.test.js index 280fc4d8c6..a766fdb767 100644 --- a/test/spec/ol/renderer/canvas/vectorlayer.test.js +++ b/test/spec/ol/renderer/canvas/vectorlayer.test.js @@ -6,7 +6,6 @@ import Circle from '../../../../../src/ol/geom/Circle.js'; import Point from '../../../../../src/ol/geom/Point.js'; import {fromExtent} from '../../../../../src/ol/geom/Polygon.js'; import VectorLayer from '../../../../../src/ol/layer/Vector.js'; -import {clear} from '../../../../../src/ol/obj.js'; import {get as getProjection} from '../../../../../src/ol/proj.js'; import {checkedFonts} from '../../../../../src/ol/render/canvas.js'; import CanvasVectorLayerRenderer from '../../../../../src/ol/renderer/canvas/VectorLayer.js'; @@ -88,7 +87,7 @@ describe('ol.renderer.canvas.VectorLayer', function() { }); it('does not re-render for unavailable fonts', function(done) { - clear(checkedFonts); + checkedFonts.values_ = {}; const map = new Map({ view: new View({ center: [0, 0], @@ -119,7 +118,7 @@ describe('ol.renderer.canvas.VectorLayer', function() { }); it('does not re-render for available fonts', function(done) { - clear(checkedFonts); + checkedFonts.values_ = {}; const map = new Map({ view: new View({ center: [0, 0], @@ -150,7 +149,7 @@ describe('ol.renderer.canvas.VectorLayer', function() { }); it('re-renders for fonts that become available', function(done) { - clear(checkedFonts); + checkedFonts.values_ = {}; head.appendChild(font); const map = new Map({ view: new View({ diff --git a/test/spec/ol/renderer/canvas/vectortilelayer.test.js b/test/spec/ol/renderer/canvas/vectortilelayer.test.js index 27abdf7871..718187bac3 100644 --- a/test/spec/ol/renderer/canvas/vectortilelayer.test.js +++ b/test/spec/ol/renderer/canvas/vectortilelayer.test.js @@ -1,4 +1,3 @@ -import {clear} from '../../../../../src/ol/obj.js'; import Feature from '../../../../../src/ol/Feature.js'; import Map from '../../../../../src/ol/Map.js'; import TileState from '../../../../../src/ol/TileState.js'; @@ -171,7 +170,7 @@ describe('ol.renderer.canvas.VectorTileLayer', function() { it('does not re-render for unavailable fonts', function(done) { map.renderSync(); - clear(checkedFonts); + checkedFonts.values_ = {}; layerStyle[0].getText().setFont('12px "Unavailable font",sans-serif'); layer.changed(); const revision = layer.getRevision(); @@ -183,7 +182,7 @@ describe('ol.renderer.canvas.VectorTileLayer', function() { it('does not re-render for available fonts', function(done) { map.renderSync(); - clear(checkedFonts); + checkedFonts.values_ = {}; layerStyle[0].getText().setFont('12px sans-serif'); layer.changed(); const revision = layer.getRevision(); @@ -195,7 +194,7 @@ describe('ol.renderer.canvas.VectorTileLayer', function() { it('re-renders for fonts that become available', function(done) { map.renderSync(); - clear(checkedFonts); + checkedFonts.values_ = {}; head.appendChild(font); layerStyle[0].getText().setFont('12px "Dancing Script",sans-serif'); layer.changed(); From d2b05991772342cf1c9afbc8c6584f6b853a5223 Mon Sep 17 00:00:00 2001 From: philip Date: Tue, 14 Jan 2020 13:39:52 +0000 Subject: [PATCH 022/381] Dynamically chose the number of subdivisions based on the size of the Image. --- src/ol/reproj/Image.js | 2 +- src/ol/reproj/Tile.js | 2 +- src/ol/reproj/Triangulation.js | 11 ++++++++--- 3 files changed, 10 insertions(+), 5 deletions(-) diff --git a/src/ol/reproj/Image.js b/src/ol/reproj/Image.js index e08778002c..7a5cfd7240 100644 --- a/src/ol/reproj/Image.js +++ b/src/ol/reproj/Image.js @@ -47,7 +47,7 @@ class ReprojImage extends ImageBase { const triangulation = new Triangulation( sourceProj, targetProj, limitedTargetExtent, maxSourceExtent, - sourceResolution * errorThresholdInPixels); + sourceResolution * errorThresholdInPixels, targetResolution); const sourceExtent = triangulation.calculateSourceExtent(); const sourceImage = getImageFunction(sourceExtent, sourceResolution, pixelRatio); diff --git a/src/ol/reproj/Tile.js b/src/ol/reproj/Tile.js index 73d508d203..7defc9e48b 100644 --- a/src/ol/reproj/Tile.js +++ b/src/ol/reproj/Tile.js @@ -160,7 +160,7 @@ class ReprojTile extends Tile { */ this.triangulation_ = new Triangulation( sourceProj, targetProj, limitedTargetExtent, maxSourceExtent, - sourceResolution * errorThresholdInPixels); + sourceResolution * errorThresholdInPixels, targetResolution); if (this.triangulation_.getTriangles().length === 0) { // no valid triangles -> EMPTY diff --git a/src/ol/reproj/Triangulation.js b/src/ol/reproj/Triangulation.js index ebdab668da..fc75ce7a9c 100644 --- a/src/ol/reproj/Triangulation.js +++ b/src/ol/reproj/Triangulation.js @@ -1,7 +1,7 @@ /** * @module ol/reproj/Triangulation */ -import {boundingExtent, createEmpty, extendCoordinate, getBottomLeft, getBottomRight, +import {boundingExtent, createEmpty, extendCoordinate, getArea, getBottomLeft, getBottomRight, getTopLeft, getTopRight, getWidth, intersects} from '../extent.js'; import {modulo} from '../math.js'; import {getTransform} from '../proj.js'; @@ -49,8 +49,9 @@ class Triangulation { * @param {import("../extent.js").Extent} targetExtent Target extent to triangulate. * @param {import("../extent.js").Extent} maxSourceExtent Maximal source extent that can be used. * @param {number} errorThreshold Acceptable error (in source units). + * @param {number} destinationResolution The (optional) resolution of the destination. */ - constructor(sourceProj, targetProj, targetExtent, maxSourceExtent, errorThreshold) { + constructor(sourceProj, targetProj, targetExtent, maxSourceExtent, errorThreshold, destinationResolution) { /** * @type {import("../proj/Projection.js").default} @@ -138,11 +139,15 @@ class Triangulation { const sourceBottomRight = this.transformInv_(destinationBottomRight); const sourceBottomLeft = this.transformInv_(destinationBottomLeft); + const maxSubdivision = MAX_SUBDIVISION + (destinationResolution ? + Math.max(0, Math.ceil(Math.log2(getArea(targetExtent) / (destinationResolution * destinationResolution * 256 * 256)))) + : 0); + this.addQuad_( destinationTopLeft, destinationTopRight, destinationBottomRight, destinationBottomLeft, sourceTopLeft, sourceTopRight, sourceBottomRight, sourceBottomLeft, - MAX_SUBDIVISION); + maxSubdivision); if (this.wrapsXInSource_) { let leftBound = Infinity; From ccf3532eb2d4a42e818930dc44e63091dfd369e4 Mon Sep 17 00:00:00 2001 From: philip Date: Tue, 14 Jan 2020 13:48:23 +0000 Subject: [PATCH 023/381] Fix the parameter name to have the opt_ prefix. --- src/ol/reproj/Triangulation.js | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/ol/reproj/Triangulation.js b/src/ol/reproj/Triangulation.js index fc75ce7a9c..b6091d149f 100644 --- a/src/ol/reproj/Triangulation.js +++ b/src/ol/reproj/Triangulation.js @@ -49,9 +49,9 @@ class Triangulation { * @param {import("../extent.js").Extent} targetExtent Target extent to triangulate. * @param {import("../extent.js").Extent} maxSourceExtent Maximal source extent that can be used. * @param {number} errorThreshold Acceptable error (in source units). - * @param {number} destinationResolution The (optional) resolution of the destination. + * @param {?number} opt_destinationResolution The (optional) resolution of the destination. */ - constructor(sourceProj, targetProj, targetExtent, maxSourceExtent, errorThreshold, destinationResolution) { + constructor(sourceProj, targetProj, targetExtent, maxSourceExtent, errorThreshold, opt_destinationResolution) { /** * @type {import("../proj/Projection.js").default} @@ -139,8 +139,9 @@ class Triangulation { const sourceBottomRight = this.transformInv_(destinationBottomRight); const sourceBottomLeft = this.transformInv_(destinationBottomLeft); - const maxSubdivision = MAX_SUBDIVISION + (destinationResolution ? - Math.max(0, Math.ceil(Math.log2(getArea(targetExtent) / (destinationResolution * destinationResolution * 256 * 256)))) + const maxSubdivision = MAX_SUBDIVISION + (opt_destinationResolution ? + Math.max(0, Math.ceil(Math.log2(getArea(targetExtent) / + (opt_destinationResolution * opt_destinationResolution * 256 * 256)))) : 0); this.addQuad_( From bc6f34d691016cbc7bcd37bd3804a01d2af28f16 Mon Sep 17 00:00:00 2001 From: wussup Date: Wed, 15 Jan 2020 10:13:18 +0100 Subject: [PATCH 024/381] Read projection from CRS type EPSG CRS also may have type 'EPSG' and then the code is reading from property 'code' in object 'properties' --- src/ol/format/GeoJSON.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/ol/format/GeoJSON.js b/src/ol/format/GeoJSON.js index 8448457c1e..a45907f95e 100644 --- a/src/ol/format/GeoJSON.js +++ b/src/ol/format/GeoJSON.js @@ -162,6 +162,8 @@ class GeoJSON extends JSONFeature { if (crs) { if (crs['type'] == 'name') { projection = getProjection(crs['properties']['name']); + } else if (crs['type'] === 'EPSG') { + projection = getProjection("EPSG:" + crs['properties']['code']); } else { assert(false, 36); // Unknown SRS type } From cbdd63a38ba45c6b64de5c8f11306a2e677ed519 Mon Sep 17 00:00:00 2001 From: wussup Date: Wed, 15 Jan 2020 10:29:14 +0100 Subject: [PATCH 025/381] Strings must have singlequotes Strings must have singlequotes --- src/ol/format/GeoJSON.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ol/format/GeoJSON.js b/src/ol/format/GeoJSON.js index a45907f95e..2e3f30dee2 100644 --- a/src/ol/format/GeoJSON.js +++ b/src/ol/format/GeoJSON.js @@ -163,7 +163,7 @@ class GeoJSON extends JSONFeature { if (crs['type'] == 'name') { projection = getProjection(crs['properties']['name']); } else if (crs['type'] === 'EPSG') { - projection = getProjection("EPSG:" + crs['properties']['code']); + projection = getProjection('EPSG:' + crs['properties']['code']); } else { assert(false, 36); // Unknown SRS type } From 601bd7bae6d7619a434f36e1a959823e2cd2b7bd Mon Sep 17 00:00:00 2001 From: jkonieczny Date: Mon, 16 Dec 2019 21:22:34 +0100 Subject: [PATCH 026/381] add offset option to RegularShape --- src/ol/style/RegularShape.js | 21 +++++++++++++++++++-- test/spec/ol/style/regularshape.test.js | 23 ++++++++++++++++++++++- 2 files changed, 41 insertions(+), 3 deletions(-) diff --git a/src/ol/style/RegularShape.js b/src/ol/style/RegularShape.js index b313c07ab7..2b464d5c9b 100644 --- a/src/ol/style/RegularShape.js +++ b/src/ol/style/RegularShape.js @@ -20,6 +20,7 @@ import ImageStyle from './Image.js'; * @property {number} [radius1] Outer radius of a star. * @property {number} [radius2] Inner radius of a star. * @property {number} [angle=0] Shape's angle in radians. A value of 0 will have one of the shape's point facing up. + * @property {Array} [offset] Offset of the shape * @property {import("./Stroke.js").default} [stroke] Stroke style. * @property {number} [rotation=0] Rotation in radians (positive rotation clockwise). * @property {boolean} [rotateWithView=false] Whether to rotate the shape with the view. @@ -88,6 +89,12 @@ class RegularShape extends ImageStyle { */ this.origin_ = [0, 0]; + /** + * @private + * @type {Array} + */ + this.offset_ = options.offset ? options.offset : [0, 0]; + /** * @private * @type {number} @@ -160,7 +167,8 @@ class RegularShape extends ImageStyle { angle: this.getAngle(), stroke: this.getStroke() ? this.getStroke().clone() : undefined, rotation: this.getRotation(), - rotateWithView: this.getRotateWithView() + rotateWithView: this.getRotateWithView(), + offset: this.getOffset() }); style.setOpacity(this.getOpacity()); style.setScale(this.getScale()); @@ -184,6 +192,15 @@ class RegularShape extends ImageStyle { return this.angle_; } + /** + * Get the offset of the shape + * @return {Array} Shape's center offset + * @api + */ + getOffset() { + return this.offset_; + } + /** * Get the fill style for the shape. * @return {import("./Fill.js").default} Fill style. @@ -354,7 +371,7 @@ class RegularShape extends ImageStyle { size = this.canvas_.width; const imageSize = size; - this.draw_(renderOptions, context, 0, 0); + this.draw_(renderOptions, context, this.offset_[0], this.offset_[1]); this.createHitDetectionCanvas_(renderOptions); diff --git a/test/spec/ol/style/regularshape.test.js b/test/spec/ol/style/regularshape.test.js index aaff4b2d7d..76b4a39aff 100644 --- a/test/spec/ol/style/regularshape.test.js +++ b/test/spec/ol/style/regularshape.test.js @@ -82,6 +82,24 @@ describe('ol.style.RegularShape', function() { expect(style.getHitDetectionImageSize()).to.eql([21, 21]); }); + it('sets default offset [0, 0]', function() { + const style = new RegularShape({ + radius: 5 + }); + expect(style.getOffset()).to.an('array'); + expect(style.getOffset()[0]).to.eql(0); + expect(style.getOffset()[1]).to.eql(0); + }); + + it('can use offset', function() { + const style = new RegularShape({ + radius: 5, + offset: [10, 20] + }); + expect(style.getOffset()).to.an('array'); + expect(style.getOffset()[0]).to.eql(10); + expect(style.getOffset()[1]).to.eql(20); + }); }); describe('#clone', function() { @@ -108,7 +126,8 @@ describe('ol.style.RegularShape', function() { color: '#319FD3' }), rotation: 2, - rotateWithView: true + rotateWithView: true, + offest: [10, 20] }); original.setOpacity(0.5); original.setScale(1.5); @@ -123,6 +142,8 @@ describe('ol.style.RegularShape', function() { expect(original.getRotateWithView()).to.eql(clone.getRotateWithView()); expect(original.getScale()).to.eql(clone.getScale()); expect(original.getStroke().getColor()).to.eql(clone.getStroke().getColor()); + expect(original.getOffset()[0]).to.eql(clone.getOffset()[0]); + expect(original.getOffset()[1]).to.eql(clone.getOffset()[1]); }); it('the clone does not reference the same objects as the original', function() { From 1506e13b601605804f9a6bd8964fc94c905aaee5 Mon Sep 17 00:00:00 2001 From: jkonieczny Date: Mon, 16 Dec 2019 23:24:31 +0100 Subject: [PATCH 027/381] use anchor for offsetting --- rendering/cases/regularshape-style/main.js | 7 ++++--- src/ol/style/RegularShape.js | 4 ++-- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/rendering/cases/regularshape-style/main.js b/rendering/cases/regularshape-style/main.js index 9d98bcd573..625fe9265c 100644 --- a/rendering/cases/regularshape-style/main.js +++ b/rendering/cases/regularshape-style/main.js @@ -13,16 +13,17 @@ const vectorSource = new VectorSource(); function createFeatures(stroke, fill, offSet = [0, 0]) { let feature; feature = new Feature({ - geometry: new Point([-15 + offSet[0], 15 + offSet[1]]) + geometry: new Point([offSet[0], offSet[1]]) }); - // square + // square with offset feature.setStyle(new Style({ image: new RegularShape({ fill: fill, stroke: stroke, points: 4, radius: 10, - angle: Math.PI / 4 + angle: Math.PI / 4, + offset: [-15, 15] }) })); vectorSource.addFeature(feature); diff --git a/src/ol/style/RegularShape.js b/src/ol/style/RegularShape.js index 2b464d5c9b..42b4063fe7 100644 --- a/src/ol/style/RegularShape.js +++ b/src/ol/style/RegularShape.js @@ -371,11 +371,11 @@ class RegularShape extends ImageStyle { size = this.canvas_.width; const imageSize = size; - this.draw_(renderOptions, context, this.offset_[0], this.offset_[1]); + this.draw_(renderOptions, context, 0, 0); this.createHitDetectionCanvas_(renderOptions); - this.anchor_ = [size / 2, size / 2]; + this.anchor_ = [size / 2 - this.offset_[0], size / 2 + this.offset_[1]]; this.size_ = [size, size]; this.imageSize_ = [imageSize, imageSize]; } From ee1b038714e701053dab6276c4a114e679c73e81 Mon Sep 17 00:00:00 2001 From: jkonieczny Date: Tue, 17 Dec 2019 09:06:19 +0100 Subject: [PATCH 028/381] add example to regularshape --- examples/regularshape.html | 4 +++- examples/regularshape.js | 27 ++++++++++++++++++++++++--- 2 files changed, 27 insertions(+), 4 deletions(-) diff --git a/examples/regularshape.html b/examples/regularshape.html index 1e3430a20a..990a9ec148 100644 --- a/examples/regularshape.html +++ b/examples/regularshape.html @@ -5,7 +5,9 @@ shortdesc: Example of some Regular Shape styles. docs: > This example shows how several regular shapes or symbols (representing `x`, `cross`, `star`, - `triangle` and `square`) can be created. + `triangle`, `square` and `stacked`) can be created. + + Style `stacked` represents possility to stack multiple shapes with offset tags: "vector, symbol, regularshape, style, square, cross, star, triangle, x" ---
diff --git a/examples/regularshape.js b/examples/regularshape.js index 6d26f9d3e3..4431efcd25 100644 --- a/examples/regularshape.js +++ b/examples/regularshape.js @@ -59,18 +59,39 @@ const styles = { radius2: 0, angle: Math.PI / 4 }) - }) + }), + 'stacked': [ + new Style({ + image: new RegularShape({ + fill: fill, + stroke: stroke, + points: 4, + radius: 5, + angle: Math.PI / 4, + offset: [0, 10] + }) + }), + new Style({ + image: new RegularShape({ + fill: fill, + stroke: stroke, + points: 4, + radius: 10, + angle: Math.PI / 4 + }) + }) + ] }; -const styleKeys = ['x', 'cross', 'star', 'triangle', 'square']; +const styleKeys = ['x', 'cross', 'star', 'triangle', 'square', 'stacked']; const count = 250; const features = new Array(count); const e = 4500000; for (let i = 0; i < count; ++i) { const coordinates = [2 * e * Math.random() - e, 2 * e * Math.random() - e]; features[i] = new Feature(new Point(coordinates)); - features[i].setStyle(styles[styleKeys[Math.floor(Math.random() * 5)]]); + features[i].setStyle(styles[styleKeys[Math.floor(Math.random() * 6)]]); } const source = new VectorSource({ From 4c7f52c8a426c548e024a3ecdaca66f63b47e0e4 Mon Sep 17 00:00:00 2001 From: jkonieczny Date: Wed, 18 Dec 2019 08:22:40 +0100 Subject: [PATCH 029/381] Offset for ImageStyle --- src/ol/style/Circle.js | 7 +++++-- src/ol/style/Icon.js | 7 +------ src/ol/style/Image.js | 19 ++++++++++++++++++- src/ol/style/RegularShape.js | 22 ++++------------------ 4 files changed, 28 insertions(+), 27 deletions(-) diff --git a/src/ol/style/Circle.js b/src/ol/style/Circle.js index 59161e0456..9ac4a5939e 100644 --- a/src/ol/style/Circle.js +++ b/src/ol/style/Circle.js @@ -10,6 +10,7 @@ import RegularShape from './RegularShape.js'; * @property {import("./Fill.js").default} [fill] Fill style. * @property {number} radius Circle radius. * @property {import("./Stroke.js").default} [stroke] Stroke style. + * @property {Array} [offset=[0,0]] offset */ @@ -30,7 +31,8 @@ class CircleStyle extends RegularShape { points: Infinity, fill: options.fill, radius: options.radius, - stroke: options.stroke + stroke: options.stroke, + offset: options.offset !== undefined ? options.offset : [0, 0] }); } @@ -45,7 +47,8 @@ class CircleStyle extends RegularShape { const style = new CircleStyle({ fill: this.getFill() ? this.getFill().clone() : undefined, stroke: this.getStroke() ? this.getStroke().clone() : undefined, - radius: this.getRadius() + radius: this.getRadius(), + offset: this.getOffset().slice() }); style.setOpacity(this.getOpacity()); style.setScale(this.getScale()); diff --git a/src/ol/style/Icon.js b/src/ol/style/Icon.js index b918487247..100f8892e8 100644 --- a/src/ol/style/Icon.js +++ b/src/ol/style/Icon.js @@ -84,6 +84,7 @@ class Icon extends ImageStyle { opacity: opacity, rotation: rotation, scale: scale, + offset: options.offset !== undefined ? options.offset : [0, 0], rotateWithView: rotateWithView }); @@ -172,12 +173,6 @@ class Icon extends ImageStyle { this.iconImage_ = getIconImage( image, /** @type {string} */ (src), imgSize, this.crossOrigin_, imageState, this.color_); - /** - * @private - * @type {Array} - */ - this.offset_ = options.offset !== undefined ? options.offset : [0, 0]; - /** * @private * @type {import("./IconOrigin.js").default} diff --git a/src/ol/style/Image.js b/src/ol/style/Image.js index 6d8fd421b0..a5d552b197 100644 --- a/src/ol/style/Image.js +++ b/src/ol/style/Image.js @@ -10,6 +10,7 @@ import {abstract} from '../util.js'; * @property {boolean} rotateWithView * @property {number} rotation * @property {number} scale + * @property {Array} offset */ @@ -51,6 +52,12 @@ class ImageStyle { */ this.scale_ = options.scale; + /** + * @private + * @type {Array} + */ + this.offset_ = options.offset; + } /** @@ -63,7 +70,8 @@ class ImageStyle { opacity: this.getOpacity(), scale: this.getScale(), rotation: this.getRotation(), - rotateWithView: this.getRotateWithView() + rotateWithView: this.getRotateWithView(), + offset: this.getOffset().slice() }); } @@ -103,6 +111,15 @@ class ImageStyle { return this.scale_; } + /** + * Get the offset of the shape + * @return {Array} Shape's center offset + * @api + */ + getOffset() { + return this.offset_; + } + /** * Get the anchor point in pixels. The anchor determines the center point for the * symbolizer. diff --git a/src/ol/style/RegularShape.js b/src/ol/style/RegularShape.js index 42b4063fe7..1ab5ab500d 100644 --- a/src/ol/style/RegularShape.js +++ b/src/ol/style/RegularShape.js @@ -20,7 +20,7 @@ import ImageStyle from './Image.js'; * @property {number} [radius1] Outer radius of a star. * @property {number} [radius2] Inner radius of a star. * @property {number} [angle=0] Shape's angle in radians. A value of 0 will have one of the shape's point facing up. - * @property {Array} [offset] Offset of the shape + * @property {Array} [offset=[0,0]] Offset of the shape * @property {import("./Stroke.js").default} [stroke] Stroke style. * @property {number} [rotation=0] Rotation in radians (positive rotation clockwise). * @property {boolean} [rotateWithView=false] Whether to rotate the shape with the view. @@ -62,7 +62,8 @@ class RegularShape extends ImageStyle { opacity: 1, rotateWithView: rotateWithView, rotation: options.rotation !== undefined ? options.rotation : 0, - scale: 1 + scale: 1, + offset: options.offset !== undefined ? options.offset : [0, 0] }); /** @@ -89,12 +90,6 @@ class RegularShape extends ImageStyle { */ this.origin_ = [0, 0]; - /** - * @private - * @type {Array} - */ - this.offset_ = options.offset ? options.offset : [0, 0]; - /** * @private * @type {number} @@ -168,7 +163,7 @@ class RegularShape extends ImageStyle { stroke: this.getStroke() ? this.getStroke().clone() : undefined, rotation: this.getRotation(), rotateWithView: this.getRotateWithView(), - offset: this.getOffset() + offset: this.getOffset().slice() }); style.setOpacity(this.getOpacity()); style.setScale(this.getScale()); @@ -192,15 +187,6 @@ class RegularShape extends ImageStyle { return this.angle_; } - /** - * Get the offset of the shape - * @return {Array} Shape's center offset - * @api - */ - getOffset() { - return this.offset_; - } - /** * Get the fill style for the shape. * @return {import("./Fill.js").default} Fill style. From 78378f02537477131a58329fd94b04058fe23d84 Mon Sep 17 00:00:00 2001 From: jkonieczny Date: Thu, 26 Dec 2019 21:41:43 +0100 Subject: [PATCH 030/381] refactor `offset` to `displacement` --- rendering/cases/regularshape-style/main.js | 2 +- src/ol/style/Circle.js | 6 ++--- src/ol/style/Icon.js | 11 ++++++++- src/ol/style/Image.js | 14 ++++++------ src/ol/style/RegularShape.js | 9 ++++---- test/spec/ol/style/regularshape.test.js | 26 ++++++++++++---------- 6 files changed, 40 insertions(+), 28 deletions(-) diff --git a/rendering/cases/regularshape-style/main.js b/rendering/cases/regularshape-style/main.js index 625fe9265c..eec94e8c25 100644 --- a/rendering/cases/regularshape-style/main.js +++ b/rendering/cases/regularshape-style/main.js @@ -23,7 +23,7 @@ function createFeatures(stroke, fill, offSet = [0, 0]) { points: 4, radius: 10, angle: Math.PI / 4, - offset: [-15, 15] + displacement: [-15, 15] }) })); vectorSource.addFeature(feature); diff --git a/src/ol/style/Circle.js b/src/ol/style/Circle.js index 9ac4a5939e..64dc96cd3a 100644 --- a/src/ol/style/Circle.js +++ b/src/ol/style/Circle.js @@ -10,7 +10,7 @@ import RegularShape from './RegularShape.js'; * @property {import("./Fill.js").default} [fill] Fill style. * @property {number} radius Circle radius. * @property {import("./Stroke.js").default} [stroke] Stroke style. - * @property {Array} [offset=[0,0]] offset + * @property {Array} [displacement=[0,0]] displacement */ @@ -32,7 +32,7 @@ class CircleStyle extends RegularShape { fill: options.fill, radius: options.radius, stroke: options.stroke, - offset: options.offset !== undefined ? options.offset : [0, 0] + displacement: options.displacement !== undefined ? options.displacement : [0, 0] }); } @@ -48,7 +48,7 @@ class CircleStyle extends RegularShape { fill: this.getFill() ? this.getFill().clone() : undefined, stroke: this.getStroke() ? this.getStroke().clone() : undefined, radius: this.getRadius(), - offset: this.getOffset().slice() + displacement: this.getDisplacement().slice() }); style.setOpacity(this.getOpacity()); style.setScale(this.getScale()); diff --git a/src/ol/style/Icon.js b/src/ol/style/Icon.js index 100f8892e8..9206227430 100644 --- a/src/ol/style/Icon.js +++ b/src/ol/style/Icon.js @@ -33,6 +33,7 @@ import ImageStyle from './Image.js'; * to provide the size of the image, with the `imgSize` option. * @property {Array} [offset=[0, 0]] Offset, which, together with the size and the offset origin, define the * sub-rectangle to use from the original icon image. + * @property {Array} [displacement=[0,0]] Displacement the icon from the center * @property {import("./IconOrigin.js").default} [offsetOrigin='top-left'] Origin of the offset: `bottom-left`, `bottom-right`, * `top-left` or `top-right`. * @property {number} [opacity=1] Opacity of the icon. @@ -84,7 +85,7 @@ class Icon extends ImageStyle { opacity: opacity, rotation: rotation, scale: scale, - offset: options.offset !== undefined ? options.offset : [0, 0], + displacement: options.displacement !== undefined ? options.displacement : [0, 0], rotateWithView: rotateWithView }); @@ -173,6 +174,11 @@ class Icon extends ImageStyle { this.iconImage_ = getIconImage( image, /** @type {string} */ (src), imgSize, this.crossOrigin_, imageState, this.color_); + /** + * @private + * @type {Array} + */ + this.offset_ = options.offset !== undefined ? options.offset : [0, 0]; /** * @private * @type {import("./IconOrigin.js").default} @@ -331,6 +337,7 @@ class Icon extends ImageStyle { return this.origin_; } let offset = this.offset_; + const displacement = this.getDisplacement(); if (this.offsetOrigin_ != IconOrigin.TOP_LEFT) { const size = this.getSize(); @@ -348,6 +355,8 @@ class Icon extends ImageStyle { offset[1] = iconImageSize[1] - size[1] - offset[1]; } } + offset[0] += displacement[0]; + offset[1] += displacement[1]; this.origin_ = offset; return this.origin_; } diff --git a/src/ol/style/Image.js b/src/ol/style/Image.js index a5d552b197..3e01ddc84f 100644 --- a/src/ol/style/Image.js +++ b/src/ol/style/Image.js @@ -10,7 +10,7 @@ import {abstract} from '../util.js'; * @property {boolean} rotateWithView * @property {number} rotation * @property {number} scale - * @property {Array} offset + * @property {Array} displacement */ @@ -56,7 +56,7 @@ class ImageStyle { * @private * @type {Array} */ - this.offset_ = options.offset; + this.displacement_ = options.displacement; } @@ -71,7 +71,7 @@ class ImageStyle { scale: this.getScale(), rotation: this.getRotation(), rotateWithView: this.getRotateWithView(), - offset: this.getOffset().slice() + displacement: this.getDisplacement().slice() }); } @@ -112,12 +112,12 @@ class ImageStyle { } /** - * Get the offset of the shape - * @return {Array} Shape's center offset + * Get the displacement of the shape + * @return {Array} Shape's center displacement * @api */ - getOffset() { - return this.offset_; + getDisplacement() { + return this.displacement_; } /** diff --git a/src/ol/style/RegularShape.js b/src/ol/style/RegularShape.js index 1ab5ab500d..579008e11c 100644 --- a/src/ol/style/RegularShape.js +++ b/src/ol/style/RegularShape.js @@ -20,7 +20,7 @@ import ImageStyle from './Image.js'; * @property {number} [radius1] Outer radius of a star. * @property {number} [radius2] Inner radius of a star. * @property {number} [angle=0] Shape's angle in radians. A value of 0 will have one of the shape's point facing up. - * @property {Array} [offset=[0,0]] Offset of the shape + * @property {Array} [displacement=[0,0]] Offset of the shape * @property {import("./Stroke.js").default} [stroke] Stroke style. * @property {number} [rotation=0] Rotation in radians (positive rotation clockwise). * @property {boolean} [rotateWithView=false] Whether to rotate the shape with the view. @@ -63,7 +63,7 @@ class RegularShape extends ImageStyle { rotateWithView: rotateWithView, rotation: options.rotation !== undefined ? options.rotation : 0, scale: 1, - offset: options.offset !== undefined ? options.offset : [0, 0] + displacement: options.displacement !== undefined ? options.displacement : [0, 0] }); /** @@ -163,7 +163,7 @@ class RegularShape extends ImageStyle { stroke: this.getStroke() ? this.getStroke().clone() : undefined, rotation: this.getRotation(), rotateWithView: this.getRotateWithView(), - offset: this.getOffset().slice() + displacement: this.getDisplacement().slice() }); style.setOpacity(this.getOpacity()); style.setScale(this.getScale()); @@ -356,12 +356,13 @@ class RegularShape extends ImageStyle { // canvas.width and height are rounded to the closest integer size = this.canvas_.width; const imageSize = size; + const displacement = this.getDisplacement(); this.draw_(renderOptions, context, 0, 0); this.createHitDetectionCanvas_(renderOptions); - this.anchor_ = [size / 2 - this.offset_[0], size / 2 + this.offset_[1]]; + this.anchor_ = [size / 2 - displacement[0], size / 2 + displacement[1]]; this.size_ = [size, size]; this.imageSize_ = [imageSize, imageSize]; } diff --git a/test/spec/ol/style/regularshape.test.js b/test/spec/ol/style/regularshape.test.js index 76b4a39aff..3b2c81cb1f 100644 --- a/test/spec/ol/style/regularshape.test.js +++ b/test/spec/ol/style/regularshape.test.js @@ -82,23 +82,23 @@ describe('ol.style.RegularShape', function() { expect(style.getHitDetectionImageSize()).to.eql([21, 21]); }); - it('sets default offset [0, 0]', function() { + it('sets default displacement [0, 0]', function() { const style = new RegularShape({ radius: 5 }); - expect(style.getOffset()).to.an('array'); - expect(style.getOffset()[0]).to.eql(0); - expect(style.getOffset()[1]).to.eql(0); + expect(style.getDisplacement()).to.an('array'); + expect(style.getDisplacement()[0]).to.eql(0); + expect(style.getDisplacement()[1]).to.eql(0); }); it('can use offset', function() { const style = new RegularShape({ radius: 5, - offset: [10, 20] + displacement: [10, 20] }); - expect(style.getOffset()).to.an('array'); - expect(style.getOffset()[0]).to.eql(10); - expect(style.getOffset()[1]).to.eql(20); + expect(style.getDisplacement()).to.an('array'); + expect(style.getDisplacement()[0]).to.eql(10); + expect(style.getDisplacement()[1]).to.eql(20); }); }); @@ -127,7 +127,7 @@ describe('ol.style.RegularShape', function() { }), rotation: 2, rotateWithView: true, - offest: [10, 20] + displacement: [10, 20] }); original.setOpacity(0.5); original.setScale(1.5); @@ -142,8 +142,8 @@ describe('ol.style.RegularShape', function() { expect(original.getRotateWithView()).to.eql(clone.getRotateWithView()); expect(original.getScale()).to.eql(clone.getScale()); expect(original.getStroke().getColor()).to.eql(clone.getStroke().getColor()); - expect(original.getOffset()[0]).to.eql(clone.getOffset()[0]); - expect(original.getOffset()[1]).to.eql(clone.getOffset()[1]); + expect(original.getDisplacement()[0]).to.eql(clone.getDisplacement()[0]); + expect(original.getDisplacement()[1]).to.eql(clone.getDisplacement()[1]); }); it('the clone does not reference the same objects as the original', function() { @@ -153,11 +153,13 @@ describe('ol.style.RegularShape', function() { }), stroke: new Stroke({ color: '#319FD3' - }) + }), + displacement: [0, 5] }); const clone = original.clone(); expect(original.getFill()).to.not.be(clone.getFill()); expect(original.getStroke()).to.not.be(clone.getStroke()); + expect(original.getDisplacement()).to.not.be(clone.getDisplacement()); clone.getFill().setColor('#012345'); clone.getStroke().setColor('#012345'); From 2112478b6b75efabab487e16eaef90ed2b337340 Mon Sep 17 00:00:00 2001 From: jkonieczny Date: Thu, 26 Dec 2019 22:07:05 +0100 Subject: [PATCH 031/381] Added test + jsdoc --- src/ol/style/Icon.js | 2 +- src/ol/style/RegularShape.js | 2 +- test/spec/ol/style/icon.test.js | 18 +++++++++++++++++- 3 files changed, 19 insertions(+), 3 deletions(-) diff --git a/src/ol/style/Icon.js b/src/ol/style/Icon.js index 9206227430..9882e4e274 100644 --- a/src/ol/style/Icon.js +++ b/src/ol/style/Icon.js @@ -33,7 +33,7 @@ import ImageStyle from './Image.js'; * to provide the size of the image, with the `imgSize` option. * @property {Array} [offset=[0, 0]] Offset, which, together with the size and the offset origin, define the * sub-rectangle to use from the original icon image. - * @property {Array} [displacement=[0,0]] Displacement the icon from the center + * @property {Array} [displacement=[0,0]] Displacement the icon * @property {import("./IconOrigin.js").default} [offsetOrigin='top-left'] Origin of the offset: `bottom-left`, `bottom-right`, * `top-left` or `top-right`. * @property {number} [opacity=1] Opacity of the icon. diff --git a/src/ol/style/RegularShape.js b/src/ol/style/RegularShape.js index 579008e11c..30f017ef91 100644 --- a/src/ol/style/RegularShape.js +++ b/src/ol/style/RegularShape.js @@ -20,7 +20,7 @@ import ImageStyle from './Image.js'; * @property {number} [radius1] Outer radius of a star. * @property {number} [radius2] Inner radius of a star. * @property {number} [angle=0] Shape's angle in radians. A value of 0 will have one of the shape's point facing up. - * @property {Array} [displacement=[0,0]] Offset of the shape + * @property {Array} [displacement=[0,0]] Displacement of the shape * @property {import("./Stroke.js").default} [stroke] Stroke style. * @property {number} [rotation=0] Rotation in radians (positive rotation clockwise). * @property {boolean} [rotateWithView=false] Whether to rotate the shape with the view. diff --git a/test/spec/ol/style/icon.test.js b/test/spec/ol/style/icon.test.js index 6c790e32a1..b8e9cc35d2 100644 --- a/test/spec/ol/style/icon.test.js +++ b/test/spec/ol/style/icon.test.js @@ -97,22 +97,26 @@ describe('ol.style.Icon', function() { color: [1, 2, 3, 0.4], src: src, offset: [1, 2], - size: [10, 12] + size: [10, 12], + displacement: [5, 6] }); const clone = original.clone(); expect(original.getAnchor()).not.to.be(clone.getAnchor()); expect(original.offset_).not.to.be(clone.offset_); expect(original.getColor()).not.to.be(clone.getColor()); expect(original.getSize()).not.to.be(clone.getSize()); + expect(original.getDisplacement()).not.to.be(clone.getDisplacement()); clone.anchor_[0] = 0; clone.offset_[0] = 0; clone.color_[0] = 0; clone.size_[0] = 5; + clone.displacement_[0] = 10; expect(original.anchor_).not.to.eql(clone.anchor_); expect(original.offset_).not.to.eql(clone.offset_); expect(original.color_).not.to.eql(clone.color_); expect(original.size_).not.to.eql(clone.size_); + expect(original.displacement_).not.to.eql(clone.displacement_); }); }); @@ -229,6 +233,18 @@ describe('ol.style.Icon', function() { iconStyle.iconImage_.size_ = imageSize; expect(iconStyle.getOrigin()).to.eql([92, 20]); }); + + it('uses a top right offset origin + displacement', function() { + const iconStyle = new Icon({ + src: 'test.png', + size: size, + offset: offset, + offsetOrigin: 'top-right', + displacement: [20, 10] + }); + iconStyle.iconImage_.size_ = imageSize; + expect(iconStyle.getOrigin()).to.eql([92 + 20, 20 + 10]); + }); }); describe('#getImageSize', function() { From df710e4d6f2b9bdd4907e25a0a1188dcb779d8c8 Mon Sep 17 00:00:00 2001 From: jkonieczny Date: Mon, 13 Jan 2020 17:24:12 +0100 Subject: [PATCH 032/381] fix example with displacement --- examples/regularshape.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/regularshape.js b/examples/regularshape.js index 4431efcd25..0c194892d3 100644 --- a/examples/regularshape.js +++ b/examples/regularshape.js @@ -68,7 +68,7 @@ const styles = { points: 4, radius: 5, angle: Math.PI / 4, - offset: [0, 10] + displacement: [0, 10] }) }), new Style({ From 62cd0cbcc9494c9729f8a47e6e99eb6b904054d0 Mon Sep 17 00:00:00 2001 From: mike-000 <49240900+mike-000@users.noreply.github.com> Date: Fri, 17 Jan 2020 21:47:32 +0000 Subject: [PATCH 033/381] Replace Bing layer with MapTiler --- examples/kml.html | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/examples/kml.html b/examples/kml.html index 74cb28ecb3..c6f392d5c0 100644 --- a/examples/kml.html +++ b/examples/kml.html @@ -4,10 +4,10 @@ title: KML shortdesc: Rendering KML with a vector source. docs: > This example uses the ol/format/KML to parse KML for rendering with a vector source. -tags: "KML" +tags: "KML, maptiler" cloak: - - key: As1HiMj1PvLPlqc_gtM7AqZfBL8ZL3VrjaS3zIb22Uvb9WKhuJObROC-qUpa81U5 - value: Your Bing Maps Key from http://www.bingmapsportal.com/ here + - key: get_your_own_D6rA4zTHduk6KOKTXzGB + value: Get your own API key at https://www.maptiler.com/cloud/ ---
 
From 3ac33ee723a78d0a329c42eea049d1e3d806d2ae Mon Sep 17 00:00:00 2001 From: mike-000 <49240900+mike-000@users.noreply.github.com> Date: Fri, 17 Jan 2020 21:53:52 +0000 Subject: [PATCH 034/381] Replace Bing layer with MapTiler --- examples/kml.js | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/examples/kml.js b/examples/kml.js index e7b6ef5c7f..611cd5beaa 100644 --- a/examples/kml.js +++ b/examples/kml.js @@ -2,13 +2,18 @@ import Map from '../src/ol/Map.js'; import View from '../src/ol/View.js'; import KML from '../src/ol/format/KML.js'; import {Tile as TileLayer, Vector as VectorLayer} from '../src/ol/layer.js'; -import BingMaps from '../src/ol/source/BingMaps.js'; +import XYZ from '../src/ol/source/XYZ.js'; import VectorSource from '../src/ol/source/Vector.js'; +const key = 'get_your_own_D6rA4zTHduk6KOKTXzGB'; +const attributions = '© MapTiler ' + + '© OpenStreetMap contributors'; + const raster = new TileLayer({ - source: new BingMaps({ - imagerySet: 'Aerial', - key: 'As1HiMj1PvLPlqc_gtM7AqZfBL8ZL3VrjaS3zIb22Uvb9WKhuJObROC-qUpa81U5' + source: new XYZ({ + attributions: attributions, + url: 'https://api.maptiler.com/tiles/satellite/{z}/{x}/{y}.jpg?key=' + key, + maxZoom: 20 }) }); From 9cc7ef4b96db8a3a7bb92a0246e0a038dd8a6c5a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maximilian=20Kr=C3=B6g?= Date: Sat, 18 Jan 2020 17:43:30 +0100 Subject: [PATCH 035/381] Use correct config for tags which must not have a value. --- config/jsdoc/api/plugins/api.js | 2 +- config/jsdoc/api/plugins/inheritdoc.js | 2 +- config/jsdoc/info/virtual-plugin.js | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/config/jsdoc/api/plugins/api.js b/config/jsdoc/api/plugins/api.js index 866b04064a..c036ef1da9 100644 --- a/config/jsdoc/api/plugins/api.js +++ b/config/jsdoc/api/plugins/api.js @@ -4,7 +4,7 @@ */ exports.defineTags = function(dictionary) { dictionary.defineTag('api', { - mustHaveValue: false, + mustNotHaveValue: true, canHaveType: false, canHaveName: false, onTagged: function(doclet, tag) { diff --git a/config/jsdoc/api/plugins/inheritdoc.js b/config/jsdoc/api/plugins/inheritdoc.js index a399ae1007..7bc5636a23 100755 --- a/config/jsdoc/api/plugins/inheritdoc.js +++ b/config/jsdoc/api/plugins/inheritdoc.js @@ -5,7 +5,7 @@ exports.defineTags = function(dictionary) { dictionary.defineTag('inheritDoc', { - mustHaveValue: false, + mustNotHaveValue: true, canHaveType: false, canHaveName: false, onTagged: function(doclet, tag) { diff --git a/config/jsdoc/info/virtual-plugin.js b/config/jsdoc/info/virtual-plugin.js index 9209724c27..a1cb8ee8ec 100644 --- a/config/jsdoc/info/virtual-plugin.js +++ b/config/jsdoc/info/virtual-plugin.js @@ -6,7 +6,7 @@ exports.defineTags = function(dictionary) { const classTag = dictionary.lookUp('class'); dictionary.defineTag('interface', { - mustHaveValue: false, + mustNotHaveValue: true, onTagged: function(doclet, tag) { classTag.onTagged.apply(this, arguments); doclet.virtual = true; From 258bfeaecc688e2deef827fa9059ed96a94ab75b Mon Sep 17 00:00:00 2001 From: mike-000 <49240900+mike-000@users.noreply.github.com> Date: Sat, 18 Jan 2020 19:37:18 +0000 Subject: [PATCH 036/381] Make feature styles compatible with declutter Return a single style object for image and text for point features as concatenating two styles in an array is not compatible with decluttering --- src/ol/format/KML.js | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) diff --git a/src/ol/format/KML.js b/src/ol/format/KML.js index 11c1ec076c..b3273fcf42 100644 --- a/src/ol/format/KML.js +++ b/src/ol/format/KML.js @@ -911,9 +911,8 @@ function createNameStyleFunction(foundStyle, name) { textStyle.setOffsetY(textOffset[1]); textStyle.setTextAlign(textAlign); - const nameStyle = new Style({ - text: textStyle - }); + const nameStyle = foundStyle.clone(); + nameStyle.setText(textStyle); return nameStyle; } @@ -932,12 +931,11 @@ function createFeatureStyleFunction(style, styleUrl, defaultStyle, sharedStyles, /** * @param {Feature} feature feature. * @param {number} resolution Resolution. - * @return {Array' + - ' ' + - ' ' + - ' normal' + - ' #sn_ylw-pushpin' + - ' ' + - ' ' + - ' highlight' + - ' #sh_ylw-pushpin' + - ' ' + - ' ' + - ' ' + - ' Test' + - ' #msn_ylw-pushpin0' + - ' ' + - ' 1,2' + - ' ' + - ' ' + - ''; - const fs = format.readFeatures(text); - expect(fs).to.have.length(1); - const f = fs[0]; - expect(f).to.be.an(Feature); - const styleFunction = f.getStyleFunction(); - expect(styleFunction).not.to.be(undefined); - const styleArray = styleFunction(f, 0); - expect(styleArray).to.be.an(Array); - expect(styleArray).to.have.length(2); - const style = styleArray[1]; + const style = styleFunction(f, 0); expect(style).to.be.an(Style); expect(style.getText().getText()).to.eql(f.getProperties()['name']); }); From 9493d682170cbed1013d15b71f5332a690db14d6 Mon Sep 17 00:00:00 2001 From: mike-000 <49240900+mike-000@users.noreply.github.com> Date: Sat, 18 Jan 2020 20:19:56 +0000 Subject: [PATCH 038/381] Make feature styles compatible with declutter Remove type def relating to deleted line --- src/ol/format/KML.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/ol/format/KML.js b/src/ol/format/KML.js index b3273fcf42..0c2a2b2186 100644 --- a/src/ol/format/KML.js +++ b/src/ol/format/KML.js @@ -935,7 +935,6 @@ function createFeatureStyleFunction(style, styleUrl, defaultStyle, sharedStyles, */ function(feature, resolution) { let drawName = showPointNames; - /** @type {Style|undefined} */ let name = ''; if (drawName) { const geometry = feature.getGeometry(); From 23858dc09d381c8121ca08751712748d8b710334 Mon Sep 17 00:00:00 2001 From: mike-000 <49240900+mike-000@users.noreply.github.com> Date: Sun, 19 Jan 2020 11:28:05 +0000 Subject: [PATCH 039/381] Convert any html character codes in labels --- src/ol/format/KML.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/ol/format/KML.js b/src/ol/format/KML.js index 0c2a2b2186..2773f53392 100644 --- a/src/ol/format/KML.js +++ b/src/ol/format/KML.js @@ -946,6 +946,12 @@ function createFeatureStyleFunction(style, styleUrl, defaultStyle, sharedStyles, if (drawName) { name = /** @type {string} */ (feature.get('name')); drawName = drawName && !!name; + // convert any html character codes + if (drawName && name.search(/&[^&]+;/) > -1) { + const text = document.createElement('textarea'); + text.innerHTML = name; + name = text.value; + } } if (style) { From bf23dca068f82d8af9968720d3a07e3bdb77da71 Mon Sep 17 00:00:00 2001 From: mike-000 <49240900+mike-000@users.noreply.github.com> Date: Sun, 19 Jan 2020 11:42:59 +0000 Subject: [PATCH 040/381] Include html character code in text style test --- test/spec/ol/format/kml.test.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/test/spec/ol/format/kml.test.js b/test/spec/ol/format/kml.test.js index 926327abdd..ded663c858 100644 --- a/test/spec/ol/format/kml.test.js +++ b/test/spec/ol/format/kml.test.js @@ -2238,7 +2238,7 @@ describe('ol.format.KML', function() { expect(style.getZIndex()).to.be(undefined); }); - it('can create text style for named point placemarks', function() { + it('can create text style for named point placemarks (including html character codes)', function() { const text = '' + ' ' + ' ' + - ' Test' + + ' Joe's Test' + ' #msn_ylw-pushpin0' + ' ' + ' 1,2' + @@ -2281,7 +2281,7 @@ describe('ol.format.KML', function() { expect(styleFunction).not.to.be(undefined); const style = styleFunction(f, 0); expect(style).to.be.an(Style); - expect(style.getText().getText()).to.eql(f.getProperties()['name']); + expect(style.getText().getText()).to.eql('Joe's Test'); }); it('can write an feature\'s icon style', function() { From e2b42c100fc682f3d5fb8c59e134bdc2d90e8b01 Mon Sep 17 00:00:00 2001 From: mike-000 <49240900+mike-000@users.noreply.github.com> Date: Sun, 19 Jan 2020 12:02:16 +0000 Subject: [PATCH 041/381] Include html character code in text style test --- test/spec/ol/format/kml.test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/spec/ol/format/kml.test.js b/test/spec/ol/format/kml.test.js index ded663c858..6f4e2fe2d6 100644 --- a/test/spec/ol/format/kml.test.js +++ b/test/spec/ol/format/kml.test.js @@ -2281,7 +2281,7 @@ describe('ol.format.KML', function() { expect(styleFunction).not.to.be(undefined); const style = styleFunction(f, 0); expect(style).to.be.an(Style); - expect(style.getText().getText()).to.eql('Joe's Test'); + expect(style.getText().getText()).to.eql('Joe\'s Test'); }); it('can write an feature\'s icon style', function() { From e2dc67546eaa6d73c7cd62afad6feceea0f956e0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maximilian=20Kr=C3=B6g?= Date: Sun, 19 Jan 2020 15:51:48 +0100 Subject: [PATCH 042/381] Only generate module apidoc pages when it contains api tags --- config/jsdoc/api/plugins/api.js | 1 - 1 file changed, 1 deletion(-) diff --git a/config/jsdoc/api/plugins/api.js b/config/jsdoc/api/plugins/api.js index 866b04064a..3aeddbc23d 100644 --- a/config/jsdoc/api/plugins/api.js +++ b/config/jsdoc/api/plugins/api.js @@ -119,7 +119,6 @@ exports.handlers = { api.push(doclet); } if (doclet.kind == 'class') { - modules[doclet.longname.split(/[~\.]/).shift()] = true; if (!(doclet.longname in classes)) { classes[doclet.longname] = doclet; } else if ('augments' in doclet) { From fa9d4586a39e9cb2b285e4bcfd46e44ba747c33e Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 20 Jan 2020 07:52:12 +0000 Subject: [PATCH 043/381] Bump @babel/core from 7.8.0 to 7.8.3 Bumps [@babel/core](https://github.com/babel/babel) from 7.8.0 to 7.8.3. - [Release notes](https://github.com/babel/babel/releases) - [Changelog](https://github.com/babel/babel/blob/master/CHANGELOG.md) - [Commits](https://github.com/babel/babel/compare/v7.8.0...v7.8.3) Signed-off-by: dependabot-preview[bot] --- package-lock.json | 216 +++++++++++++++++++++++----------------------- 1 file changed, 108 insertions(+), 108 deletions(-) diff --git a/package-lock.json b/package-lock.json index 15a0ac9028..7b8957044f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -25,18 +25,18 @@ } }, "@babel/core": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.8.0.tgz", - "integrity": "sha512-3rqPi/bv/Xfu2YzHvBz4XqMI1fKVwnhntPA1/fjoECrSjrhbOCxlTrbVu5gUtr8zkxW+RpkDOa/HCW93gzS2Dw==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.8.3.tgz", + "integrity": "sha512-4XFkf8AwyrEG7Ziu3L2L0Cv+WyY47Tcsp70JFmpftbAA1K7YL/sgE9jh9HyNj08Y/U50ItUchpN0w6HxAoX1rA==", "dev": true, "requires": { - "@babel/code-frame": "^7.8.0", - "@babel/generator": "^7.8.0", - "@babel/helpers": "^7.8.0", - "@babel/parser": "^7.8.0", - "@babel/template": "^7.8.0", - "@babel/traverse": "^7.8.0", - "@babel/types": "^7.8.0", + "@babel/code-frame": "^7.8.3", + "@babel/generator": "^7.8.3", + "@babel/helpers": "^7.8.3", + "@babel/parser": "^7.8.3", + "@babel/template": "^7.8.3", + "@babel/traverse": "^7.8.3", + "@babel/types": "^7.8.3", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.1", @@ -48,59 +48,59 @@ }, "dependencies": { "@babel/code-frame": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.0.tgz", - "integrity": "sha512-AN2IR/wCUYsM+PdErq6Bp3RFTXl8W0p9Nmymm7zkpsCmh+r/YYcckaCGpU8Q/mEKmST19kkGRaG42A/jxOWwBA==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", + "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", "dev": true, "requires": { - "@babel/highlight": "^7.8.0" + "@babel/highlight": "^7.8.3" } }, "@babel/generator": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.0.tgz", - "integrity": "sha512-2Lp2e02CV2C7j/H4n4D9YvsvdhPVVg9GDIamr6Tu4tU35mL3mzOrzl1lZ8ZJtysfZXh+y+AGORc2rPS7yHxBUg==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.3.tgz", + "integrity": "sha512-WjoPk8hRpDRqqzRpvaR8/gDUPkrnOOeuT2m8cNICJtZH6mwaCo3v0OKMI7Y6SM1pBtyijnLtAL0HDi41pf41ug==", "dev": true, "requires": { - "@babel/types": "^7.8.0", + "@babel/types": "^7.8.3", "jsesc": "^2.5.1", "lodash": "^4.17.13", "source-map": "^0.5.0" } }, "@babel/helper-function-name": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.0.tgz", - "integrity": "sha512-x9psucuU0Xalw+0Vpr2FYJMLB7/KnPSLZhlkUyOGbYAWRDfmtZBrguYpJYiaNCRV7vGkYjO/gF6/J6yMvdWTDw==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz", + "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==", "dev": true, "requires": { - "@babel/helper-get-function-arity": "^7.8.0", - "@babel/template": "^7.8.0", - "@babel/types": "^7.8.0" + "@babel/helper-get-function-arity": "^7.8.3", + "@babel/template": "^7.8.3", + "@babel/types": "^7.8.3" } }, "@babel/helper-get-function-arity": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.0.tgz", - "integrity": "sha512-eUP5grliToMapQiTaYS2AAO/WwaCG7cuJztR1v/a1aPzUzUeGt+AaI9OvLATc/AfFkF8SLJ10d5ugGt/AQ9d6w==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", + "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", "dev": true, "requires": { - "@babel/types": "^7.8.0" + "@babel/types": "^7.8.3" } }, "@babel/helper-split-export-declaration": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.0.tgz", - "integrity": "sha512-YhYFhH4T6DlbT6CPtVgLfC1Jp2gbCawU/ml7WJvUpBg01bCrXSzTYMZZXbbIGjq/kHmK8YUATxTppcRGzj31pA==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", + "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", "dev": true, "requires": { - "@babel/types": "^7.8.0" + "@babel/types": "^7.8.3" } }, "@babel/highlight": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.0.tgz", - "integrity": "sha512-OsdTJbHlPtIk2mmtwXItYrdmalJ8T0zpVzNAbKSkHshuywj7zb29Y09McV/jQsQunc/nEyHiPV2oy9llYMLqxw==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", + "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", "dev": true, "requires": { "chalk": "^2.0.0", @@ -109,43 +109,43 @@ } }, "@babel/parser": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.0.tgz", - "integrity": "sha512-VVtsnUYbd1+2A2vOVhm4P2qNXQE8L/W859GpUHfUcdhX8d3pEKThZuIr6fztocWx9HbK+00/CR0tXnhAggJ4CA==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.3.tgz", + "integrity": "sha512-/V72F4Yp/qmHaTALizEm9Gf2eQHV3QyTL3K0cNfijwnMnb1L+LDlAubb/ZnSdGAVzVSWakujHYs1I26x66sMeQ==", "dev": true }, "@babel/template": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.0.tgz", - "integrity": "sha512-0NNMDsY2t3ltAVVK1WHNiaePo3tXPUeJpCX4I3xSKFoEl852wJHG8mrgHVADf8Lz1y+8al9cF7cSSfzSnFSYiw==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", + "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", "dev": true, "requires": { - "@babel/code-frame": "^7.8.0", - "@babel/parser": "^7.8.0", - "@babel/types": "^7.8.0" + "@babel/code-frame": "^7.8.3", + "@babel/parser": "^7.8.3", + "@babel/types": "^7.8.3" } }, "@babel/traverse": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.0.tgz", - "integrity": "sha512-d/6sPXFLGlJHZO/zWDtgFaKyalCOHLedzxpVJn6el1cw+f2TZa7xZEszeXdOw6EUemqRFBAn106BWBvtSck9Qw==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.3.tgz", + "integrity": "sha512-we+a2lti+eEImHmEXp7bM9cTxGzxPmBiVJlLVD+FuuQMeeO7RaDbutbgeheDkw+Xe3mCfJHnGOWLswT74m2IPg==", "dev": true, "requires": { - "@babel/code-frame": "^7.8.0", - "@babel/generator": "^7.8.0", - "@babel/helper-function-name": "^7.8.0", - "@babel/helper-split-export-declaration": "^7.8.0", - "@babel/parser": "^7.8.0", - "@babel/types": "^7.8.0", + "@babel/code-frame": "^7.8.3", + "@babel/generator": "^7.8.3", + "@babel/helper-function-name": "^7.8.3", + "@babel/helper-split-export-declaration": "^7.8.3", + "@babel/parser": "^7.8.3", + "@babel/types": "^7.8.3", "debug": "^4.1.0", "globals": "^11.1.0", "lodash": "^4.17.13" } }, "@babel/types": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.0.tgz", - "integrity": "sha512-1RF84ehyx9HH09dMMwGWl3UTWlVoCPtqqJPjGuC4JzMe1ZIVDJ2DT8mv3cPv/A7veLD6sgR7vi95lJqm+ZayIg==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", + "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", "dev": true, "requires": { "esutils": "^2.0.2", @@ -1306,70 +1306,70 @@ } }, "@babel/helpers": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.8.0.tgz", - "integrity": "sha512-srWKpjAFbiut5JoCReZJ098hLqoZ9HufOnKZPggc7j74XaPuQ+9b3RYPV1M/HfjL63lCNd8uI1O487qIWxAFNA==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.8.3.tgz", + "integrity": "sha512-LmU3q9Pah/XyZU89QvBgGt+BCsTPoQa+73RxAQh8fb8qkDyIfeQnmgs+hvzhTCKTzqOyk7JTkS3MS1S8Mq5yrQ==", "dev": true, "requires": { - "@babel/template": "^7.8.0", - "@babel/traverse": "^7.8.0", - "@babel/types": "^7.8.0" + "@babel/template": "^7.8.3", + "@babel/traverse": "^7.8.3", + "@babel/types": "^7.8.3" }, "dependencies": { "@babel/code-frame": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.0.tgz", - "integrity": "sha512-AN2IR/wCUYsM+PdErq6Bp3RFTXl8W0p9Nmymm7zkpsCmh+r/YYcckaCGpU8Q/mEKmST19kkGRaG42A/jxOWwBA==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", + "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", "dev": true, "requires": { - "@babel/highlight": "^7.8.0" + "@babel/highlight": "^7.8.3" } }, "@babel/generator": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.0.tgz", - "integrity": "sha512-2Lp2e02CV2C7j/H4n4D9YvsvdhPVVg9GDIamr6Tu4tU35mL3mzOrzl1lZ8ZJtysfZXh+y+AGORc2rPS7yHxBUg==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.3.tgz", + "integrity": "sha512-WjoPk8hRpDRqqzRpvaR8/gDUPkrnOOeuT2m8cNICJtZH6mwaCo3v0OKMI7Y6SM1pBtyijnLtAL0HDi41pf41ug==", "dev": true, "requires": { - "@babel/types": "^7.8.0", + "@babel/types": "^7.8.3", "jsesc": "^2.5.1", "lodash": "^4.17.13", "source-map": "^0.5.0" } }, "@babel/helper-function-name": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.0.tgz", - "integrity": "sha512-x9psucuU0Xalw+0Vpr2FYJMLB7/KnPSLZhlkUyOGbYAWRDfmtZBrguYpJYiaNCRV7vGkYjO/gF6/J6yMvdWTDw==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz", + "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==", "dev": true, "requires": { - "@babel/helper-get-function-arity": "^7.8.0", - "@babel/template": "^7.8.0", - "@babel/types": "^7.8.0" + "@babel/helper-get-function-arity": "^7.8.3", + "@babel/template": "^7.8.3", + "@babel/types": "^7.8.3" } }, "@babel/helper-get-function-arity": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.0.tgz", - "integrity": "sha512-eUP5grliToMapQiTaYS2AAO/WwaCG7cuJztR1v/a1aPzUzUeGt+AaI9OvLATc/AfFkF8SLJ10d5ugGt/AQ9d6w==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", + "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", "dev": true, "requires": { - "@babel/types": "^7.8.0" + "@babel/types": "^7.8.3" } }, "@babel/helper-split-export-declaration": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.0.tgz", - "integrity": "sha512-YhYFhH4T6DlbT6CPtVgLfC1Jp2gbCawU/ml7WJvUpBg01bCrXSzTYMZZXbbIGjq/kHmK8YUATxTppcRGzj31pA==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", + "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", "dev": true, "requires": { - "@babel/types": "^7.8.0" + "@babel/types": "^7.8.3" } }, "@babel/highlight": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.0.tgz", - "integrity": "sha512-OsdTJbHlPtIk2mmtwXItYrdmalJ8T0zpVzNAbKSkHshuywj7zb29Y09McV/jQsQunc/nEyHiPV2oy9llYMLqxw==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", + "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", "dev": true, "requires": { "chalk": "^2.0.0", @@ -1378,43 +1378,43 @@ } }, "@babel/parser": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.0.tgz", - "integrity": "sha512-VVtsnUYbd1+2A2vOVhm4P2qNXQE8L/W859GpUHfUcdhX8d3pEKThZuIr6fztocWx9HbK+00/CR0tXnhAggJ4CA==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.3.tgz", + "integrity": "sha512-/V72F4Yp/qmHaTALizEm9Gf2eQHV3QyTL3K0cNfijwnMnb1L+LDlAubb/ZnSdGAVzVSWakujHYs1I26x66sMeQ==", "dev": true }, "@babel/template": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.0.tgz", - "integrity": "sha512-0NNMDsY2t3ltAVVK1WHNiaePo3tXPUeJpCX4I3xSKFoEl852wJHG8mrgHVADf8Lz1y+8al9cF7cSSfzSnFSYiw==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", + "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", "dev": true, "requires": { - "@babel/code-frame": "^7.8.0", - "@babel/parser": "^7.8.0", - "@babel/types": "^7.8.0" + "@babel/code-frame": "^7.8.3", + "@babel/parser": "^7.8.3", + "@babel/types": "^7.8.3" } }, "@babel/traverse": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.0.tgz", - "integrity": "sha512-d/6sPXFLGlJHZO/zWDtgFaKyalCOHLedzxpVJn6el1cw+f2TZa7xZEszeXdOw6EUemqRFBAn106BWBvtSck9Qw==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.3.tgz", + "integrity": "sha512-we+a2lti+eEImHmEXp7bM9cTxGzxPmBiVJlLVD+FuuQMeeO7RaDbutbgeheDkw+Xe3mCfJHnGOWLswT74m2IPg==", "dev": true, "requires": { - "@babel/code-frame": "^7.8.0", - "@babel/generator": "^7.8.0", - "@babel/helper-function-name": "^7.8.0", - "@babel/helper-split-export-declaration": "^7.8.0", - "@babel/parser": "^7.8.0", - "@babel/types": "^7.8.0", + "@babel/code-frame": "^7.8.3", + "@babel/generator": "^7.8.3", + "@babel/helper-function-name": "^7.8.3", + "@babel/helper-split-export-declaration": "^7.8.3", + "@babel/parser": "^7.8.3", + "@babel/types": "^7.8.3", "debug": "^4.1.0", "globals": "^11.1.0", "lodash": "^4.17.13" } }, "@babel/types": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.0.tgz", - "integrity": "sha512-1RF84ehyx9HH09dMMwGWl3UTWlVoCPtqqJPjGuC4JzMe1ZIVDJ2DT8mv3cPv/A7veLD6sgR7vi95lJqm+ZayIg==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", + "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", "dev": true, "requires": { "esutils": "^2.0.2", From e00cfeec069009719ee2e31a3d4d7324b4bd4cd6 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 20 Jan 2020 07:53:02 +0000 Subject: [PATCH 044/381] Bump sinon from 8.0.4 to 8.1.0 Bumps [sinon](https://github.com/sinonjs/sinon) from 8.0.4 to 8.1.0. - [Release notes](https://github.com/sinonjs/sinon/releases) - [Changelog](https://github.com/sinonjs/sinon/blob/master/CHANGELOG.md) - [Commits](https://github.com/sinonjs/sinon/compare/v8.0.4...v8.1.0) Signed-off-by: dependabot-preview[bot] --- package-lock.json | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 15a0ac9028..6f0c87b653 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11409,15 +11409,15 @@ "dev": true }, "sinon": { - "version": "8.0.4", - "resolved": "https://registry.npmjs.org/sinon/-/sinon-8.0.4.tgz", - "integrity": "sha512-cFsmgmvsgFb87e7SV7IcekogITlHX2KmlplyI9Pda0FH1Z8Ms/kWbpLs25Idp0m6ZJ3HEEjhaYYXbcTtWWUn4w==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-8.1.0.tgz", + "integrity": "sha512-6/05TR+8QhEgTbyMWaConm8iPL609Eno7SqToPq63wC/jS/6NMEI4NxqtzlLkk3r/KcZT9xPXQodH0oJ917Hbg==", "dev": true, "requires": { "@sinonjs/commons": "^1.7.0", "@sinonjs/formatio": "^4.0.1", - "@sinonjs/samsam": "^4.2.1", - "diff": "^4.0.1", + "@sinonjs/samsam": "^4.2.2", + "diff": "^4.0.2", "lolex": "^5.1.2", "nise": "^3.0.1", "supports-color": "^7.1.0" From f2ae509d07f6642f705465e1d9494ac1e0f6ec78 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 20 Jan 2020 07:54:16 +0000 Subject: [PATCH 045/381] Bump @babel/preset-env from 7.8.2 to 7.8.3 Bumps [@babel/preset-env](https://github.com/babel/babel) from 7.8.2 to 7.8.3. - [Release notes](https://github.com/babel/babel/releases) - [Changelog](https://github.com/babel/babel/blob/master/CHANGELOG.md) - [Commits](https://github.com/babel/babel/compare/v7.8.2...v7.8.3) Signed-off-by: dependabot-preview[bot] --- package-lock.json | 1504 ++++++++++++++++++++++----------------------- 1 file changed, 752 insertions(+), 752 deletions(-) diff --git a/package-lock.json b/package-lock.json index 15a0ac9028..4036af0957 100644 --- a/package-lock.json +++ b/package-lock.json @@ -213,18 +213,18 @@ } }, "@babel/helper-annotate-as-pure": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.8.0.tgz", - "integrity": "sha512-WWj+1amBdowU2g18p3/KUc1Y5kWnaNm1paohq2tT4/RreeMNssYkv6ul9wkE2iIqjwLBwNMZGH4pTGlMSUqMMg==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.8.3.tgz", + "integrity": "sha512-6o+mJrZBxOoEX77Ezv9zwW7WV8DdluouRKNY/IR5u/YTMuKHgugHOzYWlYvYLpLA9nPsQCAAASpCIbjI9Mv+Uw==", "dev": true, "requires": { - "@babel/types": "^7.8.0" + "@babel/types": "^7.8.3" }, "dependencies": { "@babel/types": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.0.tgz", - "integrity": "sha512-1RF84ehyx9HH09dMMwGWl3UTWlVoCPtqqJPjGuC4JzMe1ZIVDJ2DT8mv3cPv/A7veLD6sgR7vi95lJqm+ZayIg==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", + "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", "dev": true, "requires": { "esutils": "^2.0.2", @@ -235,19 +235,19 @@ } }, "@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.8.0.tgz", - "integrity": "sha512-KbBloNiBHM3ZyHg1ViDRs4QcnAunwMJ+rLpAEA8l3cWb3Z1xof7ag1iHvX16EwhUfaTG3+YSvTRPv4xHIrseUQ==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.8.3.tgz", + "integrity": "sha512-5eFOm2SyFPK4Rh3XMMRDjN7lBH0orh3ss0g3rTYZnBQ+r6YPj7lgDyCvPphynHvUrobJmeMignBr6Acw9mAPlw==", "dev": true, "requires": { - "@babel/helper-explode-assignable-expression": "^7.8.0", - "@babel/types": "^7.8.0" + "@babel/helper-explode-assignable-expression": "^7.8.3", + "@babel/types": "^7.8.3" }, "dependencies": { "@babel/types": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.0.tgz", - "integrity": "sha512-1RF84ehyx9HH09dMMwGWl3UTWlVoCPtqqJPjGuC4JzMe1ZIVDJ2DT8mv3cPv/A7veLD6sgR7vi95lJqm+ZayIg==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", + "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", "dev": true, "requires": { "esutils": "^2.0.2", @@ -258,70 +258,70 @@ } }, "@babel/helper-call-delegate": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/helper-call-delegate/-/helper-call-delegate-7.8.0.tgz", - "integrity": "sha512-Vi8K1LScr8ZgLicfuCNSE7JWUPG/H/9Bw9zn+3vQyy4vA54FEGTCuUTOXCFwmBM93OD6jHfjrQ6ZnivM5U+bHg==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-call-delegate/-/helper-call-delegate-7.8.3.tgz", + "integrity": "sha512-6Q05px0Eb+N4/GTyKPPvnkig7Lylw+QzihMpws9iiZQv7ZImf84ZsZpQH7QoWN4n4tm81SnSzPgHw2qtO0Zf3A==", "dev": true, "requires": { - "@babel/helper-hoist-variables": "^7.8.0", - "@babel/traverse": "^7.8.0", - "@babel/types": "^7.8.0" + "@babel/helper-hoist-variables": "^7.8.3", + "@babel/traverse": "^7.8.3", + "@babel/types": "^7.8.3" }, "dependencies": { "@babel/code-frame": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.0.tgz", - "integrity": "sha512-AN2IR/wCUYsM+PdErq6Bp3RFTXl8W0p9Nmymm7zkpsCmh+r/YYcckaCGpU8Q/mEKmST19kkGRaG42A/jxOWwBA==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", + "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", "dev": true, "requires": { - "@babel/highlight": "^7.8.0" + "@babel/highlight": "^7.8.3" } }, "@babel/generator": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.0.tgz", - "integrity": "sha512-2Lp2e02CV2C7j/H4n4D9YvsvdhPVVg9GDIamr6Tu4tU35mL3mzOrzl1lZ8ZJtysfZXh+y+AGORc2rPS7yHxBUg==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.3.tgz", + "integrity": "sha512-WjoPk8hRpDRqqzRpvaR8/gDUPkrnOOeuT2m8cNICJtZH6mwaCo3v0OKMI7Y6SM1pBtyijnLtAL0HDi41pf41ug==", "dev": true, "requires": { - "@babel/types": "^7.8.0", + "@babel/types": "^7.8.3", "jsesc": "^2.5.1", "lodash": "^4.17.13", "source-map": "^0.5.0" } }, "@babel/helper-function-name": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.0.tgz", - "integrity": "sha512-x9psucuU0Xalw+0Vpr2FYJMLB7/KnPSLZhlkUyOGbYAWRDfmtZBrguYpJYiaNCRV7vGkYjO/gF6/J6yMvdWTDw==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz", + "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==", "dev": true, "requires": { - "@babel/helper-get-function-arity": "^7.8.0", - "@babel/template": "^7.8.0", - "@babel/types": "^7.8.0" + "@babel/helper-get-function-arity": "^7.8.3", + "@babel/template": "^7.8.3", + "@babel/types": "^7.8.3" } }, "@babel/helper-get-function-arity": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.0.tgz", - "integrity": "sha512-eUP5grliToMapQiTaYS2AAO/WwaCG7cuJztR1v/a1aPzUzUeGt+AaI9OvLATc/AfFkF8SLJ10d5ugGt/AQ9d6w==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", + "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", "dev": true, "requires": { - "@babel/types": "^7.8.0" + "@babel/types": "^7.8.3" } }, "@babel/helper-split-export-declaration": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.0.tgz", - "integrity": "sha512-YhYFhH4T6DlbT6CPtVgLfC1Jp2gbCawU/ml7WJvUpBg01bCrXSzTYMZZXbbIGjq/kHmK8YUATxTppcRGzj31pA==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", + "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", "dev": true, "requires": { - "@babel/types": "^7.8.0" + "@babel/types": "^7.8.3" } }, "@babel/highlight": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.0.tgz", - "integrity": "sha512-OsdTJbHlPtIk2mmtwXItYrdmalJ8T0zpVzNAbKSkHshuywj7zb29Y09McV/jQsQunc/nEyHiPV2oy9llYMLqxw==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", + "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", "dev": true, "requires": { "chalk": "^2.0.0", @@ -330,43 +330,43 @@ } }, "@babel/parser": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.0.tgz", - "integrity": "sha512-VVtsnUYbd1+2A2vOVhm4P2qNXQE8L/W859GpUHfUcdhX8d3pEKThZuIr6fztocWx9HbK+00/CR0tXnhAggJ4CA==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.3.tgz", + "integrity": "sha512-/V72F4Yp/qmHaTALizEm9Gf2eQHV3QyTL3K0cNfijwnMnb1L+LDlAubb/ZnSdGAVzVSWakujHYs1I26x66sMeQ==", "dev": true }, "@babel/template": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.0.tgz", - "integrity": "sha512-0NNMDsY2t3ltAVVK1WHNiaePo3tXPUeJpCX4I3xSKFoEl852wJHG8mrgHVADf8Lz1y+8al9cF7cSSfzSnFSYiw==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", + "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", "dev": true, "requires": { - "@babel/code-frame": "^7.8.0", - "@babel/parser": "^7.8.0", - "@babel/types": "^7.8.0" + "@babel/code-frame": "^7.8.3", + "@babel/parser": "^7.8.3", + "@babel/types": "^7.8.3" } }, "@babel/traverse": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.0.tgz", - "integrity": "sha512-d/6sPXFLGlJHZO/zWDtgFaKyalCOHLedzxpVJn6el1cw+f2TZa7xZEszeXdOw6EUemqRFBAn106BWBvtSck9Qw==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.3.tgz", + "integrity": "sha512-we+a2lti+eEImHmEXp7bM9cTxGzxPmBiVJlLVD+FuuQMeeO7RaDbutbgeheDkw+Xe3mCfJHnGOWLswT74m2IPg==", "dev": true, "requires": { - "@babel/code-frame": "^7.8.0", - "@babel/generator": "^7.8.0", - "@babel/helper-function-name": "^7.8.0", - "@babel/helper-split-export-declaration": "^7.8.0", - "@babel/parser": "^7.8.0", - "@babel/types": "^7.8.0", + "@babel/code-frame": "^7.8.3", + "@babel/generator": "^7.8.3", + "@babel/helper-function-name": "^7.8.3", + "@babel/helper-split-export-declaration": "^7.8.3", + "@babel/parser": "^7.8.3", + "@babel/types": "^7.8.3", "debug": "^4.1.0", "globals": "^11.1.0", "lodash": "^4.17.13" } }, "@babel/types": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.0.tgz", - "integrity": "sha512-1RF84ehyx9HH09dMMwGWl3UTWlVoCPtqqJPjGuC4JzMe1ZIVDJ2DT8mv3cPv/A7veLD6sgR7vi95lJqm+ZayIg==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", + "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", "dev": true, "requires": { "esutils": "^2.0.2", @@ -389,9 +389,9 @@ } }, "@babel/helper-compilation-targets": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.8.1.tgz", - "integrity": "sha512-Fsrljg8DHSdnKSzC0YFopX7lseRpVfWMYuC1Dnvf7tw972E2KDjZ4XEaqjO9aJL0sLcG4KNRXxowDxHYIcZ+Cw==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.8.3.tgz", + "integrity": "sha512-JLylPCsFjhLN+6uBSSh3iYdxKdeO9MNmoY96PE/99d8kyBFaXLORtAVhqN6iHa+wtPeqxKLghDOZry0+Aiw9Tw==", "dev": true, "requires": { "@babel/compat-data": "^7.8.1", @@ -402,12 +402,12 @@ } }, "@babel/helper-create-regexp-features-plugin": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.8.0.tgz", - "integrity": "sha512-vJj2hPbxxLUWJEV86iZiac5curAnC3ZVc+rFmFeWZigUOcuCPpbF+KxoEmxrkmuCGylHFF9t4lkpcDUcxnhQ5g==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.8.3.tgz", + "integrity": "sha512-Gcsm1OHCUr9o9TcJln57xhWHtdXbA2pgQ58S0Lxlks0WMGNXuki4+GLfX0p+L2ZkINUGZvfkz8rzoqJQSthI+Q==", "dev": true, "requires": { - "@babel/helper-regex": "^7.8.0", + "@babel/helper-regex": "^7.8.3", "regexpu-core": "^4.6.0" }, "dependencies": { @@ -437,49 +437,49 @@ } }, "@babel/helper-define-map": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.8.0.tgz", - "integrity": "sha512-Go06lUlZ4YImNEmdyAH5iO38yh5mbpOPSwA2PtV1vyczFhTZfX0OtzkiIL2pACo6AOYf89pLh42nhhDrqgzC3A==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.8.3.tgz", + "integrity": "sha512-PoeBYtxoZGtct3md6xZOCWPcKuMuk3IHhgxsRRNtnNShebf4C8YonTSblsK4tvDbm+eJAw2HAPOfCr+Q/YRG/g==", "dev": true, "requires": { - "@babel/helper-function-name": "^7.8.0", - "@babel/types": "^7.8.0", + "@babel/helper-function-name": "^7.8.3", + "@babel/types": "^7.8.3", "lodash": "^4.17.13" }, "dependencies": { "@babel/code-frame": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.0.tgz", - "integrity": "sha512-AN2IR/wCUYsM+PdErq6Bp3RFTXl8W0p9Nmymm7zkpsCmh+r/YYcckaCGpU8Q/mEKmST19kkGRaG42A/jxOWwBA==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", + "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", "dev": true, "requires": { - "@babel/highlight": "^7.8.0" + "@babel/highlight": "^7.8.3" } }, "@babel/helper-function-name": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.0.tgz", - "integrity": "sha512-x9psucuU0Xalw+0Vpr2FYJMLB7/KnPSLZhlkUyOGbYAWRDfmtZBrguYpJYiaNCRV7vGkYjO/gF6/J6yMvdWTDw==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz", + "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==", "dev": true, "requires": { - "@babel/helper-get-function-arity": "^7.8.0", - "@babel/template": "^7.8.0", - "@babel/types": "^7.8.0" + "@babel/helper-get-function-arity": "^7.8.3", + "@babel/template": "^7.8.3", + "@babel/types": "^7.8.3" } }, "@babel/helper-get-function-arity": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.0.tgz", - "integrity": "sha512-eUP5grliToMapQiTaYS2AAO/WwaCG7cuJztR1v/a1aPzUzUeGt+AaI9OvLATc/AfFkF8SLJ10d5ugGt/AQ9d6w==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", + "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", "dev": true, "requires": { - "@babel/types": "^7.8.0" + "@babel/types": "^7.8.3" } }, "@babel/highlight": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.0.tgz", - "integrity": "sha512-OsdTJbHlPtIk2mmtwXItYrdmalJ8T0zpVzNAbKSkHshuywj7zb29Y09McV/jQsQunc/nEyHiPV2oy9llYMLqxw==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", + "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", "dev": true, "requires": { "chalk": "^2.0.0", @@ -488,26 +488,26 @@ } }, "@babel/parser": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.0.tgz", - "integrity": "sha512-VVtsnUYbd1+2A2vOVhm4P2qNXQE8L/W859GpUHfUcdhX8d3pEKThZuIr6fztocWx9HbK+00/CR0tXnhAggJ4CA==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.3.tgz", + "integrity": "sha512-/V72F4Yp/qmHaTALizEm9Gf2eQHV3QyTL3K0cNfijwnMnb1L+LDlAubb/ZnSdGAVzVSWakujHYs1I26x66sMeQ==", "dev": true }, "@babel/template": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.0.tgz", - "integrity": "sha512-0NNMDsY2t3ltAVVK1WHNiaePo3tXPUeJpCX4I3xSKFoEl852wJHG8mrgHVADf8Lz1y+8al9cF7cSSfzSnFSYiw==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", + "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", "dev": true, "requires": { - "@babel/code-frame": "^7.8.0", - "@babel/parser": "^7.8.0", - "@babel/types": "^7.8.0" + "@babel/code-frame": "^7.8.3", + "@babel/parser": "^7.8.3", + "@babel/types": "^7.8.3" } }, "@babel/types": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.0.tgz", - "integrity": "sha512-1RF84ehyx9HH09dMMwGWl3UTWlVoCPtqqJPjGuC4JzMe1ZIVDJ2DT8mv3cPv/A7veLD6sgR7vi95lJqm+ZayIg==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", + "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", "dev": true, "requires": { "esutils": "^2.0.2", @@ -518,69 +518,69 @@ } }, "@babel/helper-explode-assignable-expression": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.8.0.tgz", - "integrity": "sha512-w4mRQqKAh4M7BSLwvDMm8jYFroEzpqMCtXDhFHP+kNjMIQWpbC6b0Q/RUQsJNSf54rIx6XMdci1Stf60DWw+og==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.8.3.tgz", + "integrity": "sha512-N+8eW86/Kj147bO9G2uclsg5pwfs/fqqY5rwgIL7eTBklgXjcOJ3btzS5iM6AitJcftnY7pm2lGsrJVYLGjzIw==", "dev": true, "requires": { - "@babel/traverse": "^7.8.0", - "@babel/types": "^7.8.0" + "@babel/traverse": "^7.8.3", + "@babel/types": "^7.8.3" }, "dependencies": { "@babel/code-frame": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.0.tgz", - "integrity": "sha512-AN2IR/wCUYsM+PdErq6Bp3RFTXl8W0p9Nmymm7zkpsCmh+r/YYcckaCGpU8Q/mEKmST19kkGRaG42A/jxOWwBA==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", + "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", "dev": true, "requires": { - "@babel/highlight": "^7.8.0" + "@babel/highlight": "^7.8.3" } }, "@babel/generator": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.0.tgz", - "integrity": "sha512-2Lp2e02CV2C7j/H4n4D9YvsvdhPVVg9GDIamr6Tu4tU35mL3mzOrzl1lZ8ZJtysfZXh+y+AGORc2rPS7yHxBUg==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.3.tgz", + "integrity": "sha512-WjoPk8hRpDRqqzRpvaR8/gDUPkrnOOeuT2m8cNICJtZH6mwaCo3v0OKMI7Y6SM1pBtyijnLtAL0HDi41pf41ug==", "dev": true, "requires": { - "@babel/types": "^7.8.0", + "@babel/types": "^7.8.3", "jsesc": "^2.5.1", "lodash": "^4.17.13", "source-map": "^0.5.0" } }, "@babel/helper-function-name": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.0.tgz", - "integrity": "sha512-x9psucuU0Xalw+0Vpr2FYJMLB7/KnPSLZhlkUyOGbYAWRDfmtZBrguYpJYiaNCRV7vGkYjO/gF6/J6yMvdWTDw==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz", + "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==", "dev": true, "requires": { - "@babel/helper-get-function-arity": "^7.8.0", - "@babel/template": "^7.8.0", - "@babel/types": "^7.8.0" + "@babel/helper-get-function-arity": "^7.8.3", + "@babel/template": "^7.8.3", + "@babel/types": "^7.8.3" } }, "@babel/helper-get-function-arity": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.0.tgz", - "integrity": "sha512-eUP5grliToMapQiTaYS2AAO/WwaCG7cuJztR1v/a1aPzUzUeGt+AaI9OvLATc/AfFkF8SLJ10d5ugGt/AQ9d6w==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", + "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", "dev": true, "requires": { - "@babel/types": "^7.8.0" + "@babel/types": "^7.8.3" } }, "@babel/helper-split-export-declaration": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.0.tgz", - "integrity": "sha512-YhYFhH4T6DlbT6CPtVgLfC1Jp2gbCawU/ml7WJvUpBg01bCrXSzTYMZZXbbIGjq/kHmK8YUATxTppcRGzj31pA==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", + "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", "dev": true, "requires": { - "@babel/types": "^7.8.0" + "@babel/types": "^7.8.3" } }, "@babel/highlight": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.0.tgz", - "integrity": "sha512-OsdTJbHlPtIk2mmtwXItYrdmalJ8T0zpVzNAbKSkHshuywj7zb29Y09McV/jQsQunc/nEyHiPV2oy9llYMLqxw==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", + "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", "dev": true, "requires": { "chalk": "^2.0.0", @@ -589,43 +589,43 @@ } }, "@babel/parser": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.0.tgz", - "integrity": "sha512-VVtsnUYbd1+2A2vOVhm4P2qNXQE8L/W859GpUHfUcdhX8d3pEKThZuIr6fztocWx9HbK+00/CR0tXnhAggJ4CA==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.3.tgz", + "integrity": "sha512-/V72F4Yp/qmHaTALizEm9Gf2eQHV3QyTL3K0cNfijwnMnb1L+LDlAubb/ZnSdGAVzVSWakujHYs1I26x66sMeQ==", "dev": true }, "@babel/template": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.0.tgz", - "integrity": "sha512-0NNMDsY2t3ltAVVK1WHNiaePo3tXPUeJpCX4I3xSKFoEl852wJHG8mrgHVADf8Lz1y+8al9cF7cSSfzSnFSYiw==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", + "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", "dev": true, "requires": { - "@babel/code-frame": "^7.8.0", - "@babel/parser": "^7.8.0", - "@babel/types": "^7.8.0" + "@babel/code-frame": "^7.8.3", + "@babel/parser": "^7.8.3", + "@babel/types": "^7.8.3" } }, "@babel/traverse": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.0.tgz", - "integrity": "sha512-d/6sPXFLGlJHZO/zWDtgFaKyalCOHLedzxpVJn6el1cw+f2TZa7xZEszeXdOw6EUemqRFBAn106BWBvtSck9Qw==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.3.tgz", + "integrity": "sha512-we+a2lti+eEImHmEXp7bM9cTxGzxPmBiVJlLVD+FuuQMeeO7RaDbutbgeheDkw+Xe3mCfJHnGOWLswT74m2IPg==", "dev": true, "requires": { - "@babel/code-frame": "^7.8.0", - "@babel/generator": "^7.8.0", - "@babel/helper-function-name": "^7.8.0", - "@babel/helper-split-export-declaration": "^7.8.0", - "@babel/parser": "^7.8.0", - "@babel/types": "^7.8.0", + "@babel/code-frame": "^7.8.3", + "@babel/generator": "^7.8.3", + "@babel/helper-function-name": "^7.8.3", + "@babel/helper-split-export-declaration": "^7.8.3", + "@babel/parser": "^7.8.3", + "@babel/types": "^7.8.3", "debug": "^4.1.0", "globals": "^11.1.0", "lodash": "^4.17.13" } }, "@babel/types": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.0.tgz", - "integrity": "sha512-1RF84ehyx9HH09dMMwGWl3UTWlVoCPtqqJPjGuC4JzMe1ZIVDJ2DT8mv3cPv/A7veLD6sgR7vi95lJqm+ZayIg==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", + "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", "dev": true, "requires": { "esutils": "^2.0.2", @@ -668,18 +668,18 @@ } }, "@babel/helper-hoist-variables": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.8.0.tgz", - "integrity": "sha512-jDl66KvuklTXUADcoXDMur1jDtAZUZZkzLIaQ54+z38ih8C0V0hC56hMaoVoyoxN60MwQmmrHctBwcLqP0c/Lw==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.8.3.tgz", + "integrity": "sha512-ky1JLOjcDUtSc+xkt0xhYff7Z6ILTAHKmZLHPxAhOP0Nd77O+3nCsd6uSVYur6nJnCI029CrNbYlc0LoPfAPQg==", "dev": true, "requires": { - "@babel/types": "^7.8.0" + "@babel/types": "^7.8.3" }, "dependencies": { "@babel/types": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.0.tgz", - "integrity": "sha512-1RF84ehyx9HH09dMMwGWl3UTWlVoCPtqqJPjGuC4JzMe1ZIVDJ2DT8mv3cPv/A7veLD6sgR7vi95lJqm+ZayIg==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", + "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", "dev": true, "requires": { "esutils": "^2.0.2", @@ -690,18 +690,18 @@ } }, "@babel/helper-member-expression-to-functions": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.8.0.tgz", - "integrity": "sha512-0m1QabGrdXuoxX/g+KOAGndoHwskC70WweqHRQyCsaO67KOEELYh4ECcGw6ZGKjDKa5Y7SW4Qbhw6ly4Fah/jQ==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.8.3.tgz", + "integrity": "sha512-fO4Egq88utkQFjbPrSHGmGLFqmrshs11d46WI+WZDESt7Wu7wN2G2Iu+NMMZJFDOVRHAMIkB5SNh30NtwCA7RA==", "dev": true, "requires": { - "@babel/types": "^7.8.0" + "@babel/types": "^7.8.3" }, "dependencies": { "@babel/types": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.0.tgz", - "integrity": "sha512-1RF84ehyx9HH09dMMwGWl3UTWlVoCPtqqJPjGuC4JzMe1ZIVDJ2DT8mv3cPv/A7veLD6sgR7vi95lJqm+ZayIg==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", + "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", "dev": true, "requires": { "esutils": "^2.0.2", @@ -721,50 +721,50 @@ } }, "@babel/helper-module-transforms": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.8.0.tgz", - "integrity": "sha512-fvGhX4FY7YwRdWW/zfddNaKpYl8TaA8hvwONIYhv1/a1ZbgxbTrjsmH6IGWUgUNki7QzbpZ27OEh88sZdft3YA==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.8.3.tgz", + "integrity": "sha512-C7NG6B7vfBa/pwCOshpMbOYUmrYQDfCpVL/JCRu0ek8B5p8kue1+BCXpg2vOYs7w5ACB9GTOBYQ5U6NwrMg+3Q==", "dev": true, "requires": { - "@babel/helper-module-imports": "^7.8.0", - "@babel/helper-simple-access": "^7.8.0", - "@babel/helper-split-export-declaration": "^7.8.0", - "@babel/template": "^7.8.0", - "@babel/types": "^7.8.0", + "@babel/helper-module-imports": "^7.8.3", + "@babel/helper-simple-access": "^7.8.3", + "@babel/helper-split-export-declaration": "^7.8.3", + "@babel/template": "^7.8.3", + "@babel/types": "^7.8.3", "lodash": "^4.17.13" }, "dependencies": { "@babel/code-frame": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.0.tgz", - "integrity": "sha512-AN2IR/wCUYsM+PdErq6Bp3RFTXl8W0p9Nmymm7zkpsCmh+r/YYcckaCGpU8Q/mEKmST19kkGRaG42A/jxOWwBA==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", + "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", "dev": true, "requires": { - "@babel/highlight": "^7.8.0" + "@babel/highlight": "^7.8.3" } }, "@babel/helper-module-imports": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.8.0.tgz", - "integrity": "sha512-ylY9J6ZxEcjmJaJ4P6aVs/fZdrZVctCGnxxfYXwCnSMapqd544zT8lWK2qI/vBPjE5gS0o2jILnH+AkpsPauEQ==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.8.3.tgz", + "integrity": "sha512-R0Bx3jippsbAEtzkpZ/6FIiuzOURPcMjHp+Z6xPe6DtApDJx+w7UYyOLanZqO8+wKR9G10s/FmHXvxaMd9s6Kg==", "dev": true, "requires": { - "@babel/types": "^7.8.0" + "@babel/types": "^7.8.3" } }, "@babel/helper-split-export-declaration": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.0.tgz", - "integrity": "sha512-YhYFhH4T6DlbT6CPtVgLfC1Jp2gbCawU/ml7WJvUpBg01bCrXSzTYMZZXbbIGjq/kHmK8YUATxTppcRGzj31pA==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", + "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", "dev": true, "requires": { - "@babel/types": "^7.8.0" + "@babel/types": "^7.8.3" } }, "@babel/highlight": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.0.tgz", - "integrity": "sha512-OsdTJbHlPtIk2mmtwXItYrdmalJ8T0zpVzNAbKSkHshuywj7zb29Y09McV/jQsQunc/nEyHiPV2oy9llYMLqxw==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", + "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", "dev": true, "requires": { "chalk": "^2.0.0", @@ -773,26 +773,26 @@ } }, "@babel/parser": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.0.tgz", - "integrity": "sha512-VVtsnUYbd1+2A2vOVhm4P2qNXQE8L/W859GpUHfUcdhX8d3pEKThZuIr6fztocWx9HbK+00/CR0tXnhAggJ4CA==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.3.tgz", + "integrity": "sha512-/V72F4Yp/qmHaTALizEm9Gf2eQHV3QyTL3K0cNfijwnMnb1L+LDlAubb/ZnSdGAVzVSWakujHYs1I26x66sMeQ==", "dev": true }, "@babel/template": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.0.tgz", - "integrity": "sha512-0NNMDsY2t3ltAVVK1WHNiaePo3tXPUeJpCX4I3xSKFoEl852wJHG8mrgHVADf8Lz1y+8al9cF7cSSfzSnFSYiw==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", + "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", "dev": true, "requires": { - "@babel/code-frame": "^7.8.0", - "@babel/parser": "^7.8.0", - "@babel/types": "^7.8.0" + "@babel/code-frame": "^7.8.3", + "@babel/parser": "^7.8.3", + "@babel/types": "^7.8.3" } }, "@babel/types": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.0.tgz", - "integrity": "sha512-1RF84ehyx9HH09dMMwGWl3UTWlVoCPtqqJPjGuC4JzMe1ZIVDJ2DT8mv3cPv/A7veLD6sgR7vi95lJqm+ZayIg==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", + "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", "dev": true, "requires": { "esutils": "^2.0.2", @@ -803,18 +803,18 @@ } }, "@babel/helper-optimise-call-expression": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.8.0.tgz", - "integrity": "sha512-aiJt1m+K57y0n10fTw+QXcCXzmpkG+o+NoQmAZqlZPstkTE0PZT+Z27QSd/6Gf00nuXJQO4NiJ0/YagSW5kC2A==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.8.3.tgz", + "integrity": "sha512-Kag20n86cbO2AvHca6EJsvqAd82gc6VMGule4HwebwMlwkpXuVqrNRj6CkCV2sKxgi9MyAUnZVnZ6lJ1/vKhHQ==", "dev": true, "requires": { - "@babel/types": "^7.8.0" + "@babel/types": "^7.8.3" }, "dependencies": { "@babel/types": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.0.tgz", - "integrity": "sha512-1RF84ehyx9HH09dMMwGWl3UTWlVoCPtqqJPjGuC4JzMe1ZIVDJ2DT8mv3cPv/A7veLD6sgR7vi95lJqm+ZayIg==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", + "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", "dev": true, "requires": { "esutils": "^2.0.2", @@ -825,87 +825,87 @@ } }, "@babel/helper-plugin-utils": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.0.tgz", - "integrity": "sha512-+hAlRGdf8fHQAyNnDBqTHQhwdLURLdrCROoWaEQYiQhk2sV9Rhs+GoFZZfMJExTq9HG8o2NX3uN2G90bFtmFdA==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", + "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", "dev": true }, "@babel/helper-regex": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.8.0.tgz", - "integrity": "sha512-haD8fRsPtyFZkbtxBIaGBBHRtbn0YsyecdYrxNgO0Bl6SlGokJPQX9M2tDuVbeQBYHZVLUPMSwGQn4obHevsMQ==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.8.3.tgz", + "integrity": "sha512-BWt0QtYv/cg/NecOAZMdcn/waj/5P26DR4mVLXfFtDokSR6fyuG0Pj+e2FqtSME+MqED1khnSMulkmGl8qWiUQ==", "dev": true, "requires": { "lodash": "^4.17.13" } }, "@babel/helper-remap-async-to-generator": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.8.0.tgz", - "integrity": "sha512-+aKyBd4oHAaIZgOLq/uLjkUz7ExZ0ppdNBc8Qr72BmtKNAy3A6EJa/ifjj0//CIzQtUDPs3E6HjKM2cV6bnXsQ==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.8.3.tgz", + "integrity": "sha512-kgwDmw4fCg7AVgS4DukQR/roGp+jP+XluJE5hsRZwxCYGg+Rv9wSGErDWhlI90FODdYfd4xG4AQRiMDjjN0GzA==", "dev": true, "requires": { - "@babel/helper-annotate-as-pure": "^7.8.0", - "@babel/helper-wrap-function": "^7.8.0", - "@babel/template": "^7.8.0", - "@babel/traverse": "^7.8.0", - "@babel/types": "^7.8.0" + "@babel/helper-annotate-as-pure": "^7.8.3", + "@babel/helper-wrap-function": "^7.8.3", + "@babel/template": "^7.8.3", + "@babel/traverse": "^7.8.3", + "@babel/types": "^7.8.3" }, "dependencies": { "@babel/code-frame": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.0.tgz", - "integrity": "sha512-AN2IR/wCUYsM+PdErq6Bp3RFTXl8W0p9Nmymm7zkpsCmh+r/YYcckaCGpU8Q/mEKmST19kkGRaG42A/jxOWwBA==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", + "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", "dev": true, "requires": { - "@babel/highlight": "^7.8.0" + "@babel/highlight": "^7.8.3" } }, "@babel/generator": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.0.tgz", - "integrity": "sha512-2Lp2e02CV2C7j/H4n4D9YvsvdhPVVg9GDIamr6Tu4tU35mL3mzOrzl1lZ8ZJtysfZXh+y+AGORc2rPS7yHxBUg==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.3.tgz", + "integrity": "sha512-WjoPk8hRpDRqqzRpvaR8/gDUPkrnOOeuT2m8cNICJtZH6mwaCo3v0OKMI7Y6SM1pBtyijnLtAL0HDi41pf41ug==", "dev": true, "requires": { - "@babel/types": "^7.8.0", + "@babel/types": "^7.8.3", "jsesc": "^2.5.1", "lodash": "^4.17.13", "source-map": "^0.5.0" } }, "@babel/helper-function-name": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.0.tgz", - "integrity": "sha512-x9psucuU0Xalw+0Vpr2FYJMLB7/KnPSLZhlkUyOGbYAWRDfmtZBrguYpJYiaNCRV7vGkYjO/gF6/J6yMvdWTDw==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz", + "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==", "dev": true, "requires": { - "@babel/helper-get-function-arity": "^7.8.0", - "@babel/template": "^7.8.0", - "@babel/types": "^7.8.0" + "@babel/helper-get-function-arity": "^7.8.3", + "@babel/template": "^7.8.3", + "@babel/types": "^7.8.3" } }, "@babel/helper-get-function-arity": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.0.tgz", - "integrity": "sha512-eUP5grliToMapQiTaYS2AAO/WwaCG7cuJztR1v/a1aPzUzUeGt+AaI9OvLATc/AfFkF8SLJ10d5ugGt/AQ9d6w==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", + "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", "dev": true, "requires": { - "@babel/types": "^7.8.0" + "@babel/types": "^7.8.3" } }, "@babel/helper-split-export-declaration": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.0.tgz", - "integrity": "sha512-YhYFhH4T6DlbT6CPtVgLfC1Jp2gbCawU/ml7WJvUpBg01bCrXSzTYMZZXbbIGjq/kHmK8YUATxTppcRGzj31pA==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", + "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", "dev": true, "requires": { - "@babel/types": "^7.8.0" + "@babel/types": "^7.8.3" } }, "@babel/highlight": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.0.tgz", - "integrity": "sha512-OsdTJbHlPtIk2mmtwXItYrdmalJ8T0zpVzNAbKSkHshuywj7zb29Y09McV/jQsQunc/nEyHiPV2oy9llYMLqxw==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", + "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", "dev": true, "requires": { "chalk": "^2.0.0", @@ -914,43 +914,43 @@ } }, "@babel/parser": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.0.tgz", - "integrity": "sha512-VVtsnUYbd1+2A2vOVhm4P2qNXQE8L/W859GpUHfUcdhX8d3pEKThZuIr6fztocWx9HbK+00/CR0tXnhAggJ4CA==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.3.tgz", + "integrity": "sha512-/V72F4Yp/qmHaTALizEm9Gf2eQHV3QyTL3K0cNfijwnMnb1L+LDlAubb/ZnSdGAVzVSWakujHYs1I26x66sMeQ==", "dev": true }, "@babel/template": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.0.tgz", - "integrity": "sha512-0NNMDsY2t3ltAVVK1WHNiaePo3tXPUeJpCX4I3xSKFoEl852wJHG8mrgHVADf8Lz1y+8al9cF7cSSfzSnFSYiw==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", + "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", "dev": true, "requires": { - "@babel/code-frame": "^7.8.0", - "@babel/parser": "^7.8.0", - "@babel/types": "^7.8.0" + "@babel/code-frame": "^7.8.3", + "@babel/parser": "^7.8.3", + "@babel/types": "^7.8.3" } }, "@babel/traverse": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.0.tgz", - "integrity": "sha512-d/6sPXFLGlJHZO/zWDtgFaKyalCOHLedzxpVJn6el1cw+f2TZa7xZEszeXdOw6EUemqRFBAn106BWBvtSck9Qw==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.3.tgz", + "integrity": "sha512-we+a2lti+eEImHmEXp7bM9cTxGzxPmBiVJlLVD+FuuQMeeO7RaDbutbgeheDkw+Xe3mCfJHnGOWLswT74m2IPg==", "dev": true, "requires": { - "@babel/code-frame": "^7.8.0", - "@babel/generator": "^7.8.0", - "@babel/helper-function-name": "^7.8.0", - "@babel/helper-split-export-declaration": "^7.8.0", - "@babel/parser": "^7.8.0", - "@babel/types": "^7.8.0", + "@babel/code-frame": "^7.8.3", + "@babel/generator": "^7.8.3", + "@babel/helper-function-name": "^7.8.3", + "@babel/helper-split-export-declaration": "^7.8.3", + "@babel/parser": "^7.8.3", + "@babel/types": "^7.8.3", "debug": "^4.1.0", "globals": "^11.1.0", "lodash": "^4.17.13" } }, "@babel/types": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.0.tgz", - "integrity": "sha512-1RF84ehyx9HH09dMMwGWl3UTWlVoCPtqqJPjGuC4JzMe1ZIVDJ2DT8mv3cPv/A7veLD6sgR7vi95lJqm+ZayIg==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", + "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", "dev": true, "requires": { "esutils": "^2.0.2", @@ -973,71 +973,71 @@ } }, "@babel/helper-replace-supers": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.8.0.tgz", - "integrity": "sha512-R2CyorW4tcO3YzdkClLpt6MS84G+tPkOi0MmiCn1bvYVnmDpdl9R15XOi3NQW2mhOAEeBnuQ4g1Bh7pT2sX8fg==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.8.3.tgz", + "integrity": "sha512-xOUssL6ho41U81etpLoT2RTdvdus4VfHamCuAm4AHxGr+0it5fnwoVdwUJ7GFEqCsQYzJUhcbsN9wB9apcYKFA==", "dev": true, "requires": { - "@babel/helper-member-expression-to-functions": "^7.8.0", - "@babel/helper-optimise-call-expression": "^7.8.0", - "@babel/traverse": "^7.8.0", - "@babel/types": "^7.8.0" + "@babel/helper-member-expression-to-functions": "^7.8.3", + "@babel/helper-optimise-call-expression": "^7.8.3", + "@babel/traverse": "^7.8.3", + "@babel/types": "^7.8.3" }, "dependencies": { "@babel/code-frame": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.0.tgz", - "integrity": "sha512-AN2IR/wCUYsM+PdErq6Bp3RFTXl8W0p9Nmymm7zkpsCmh+r/YYcckaCGpU8Q/mEKmST19kkGRaG42A/jxOWwBA==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", + "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", "dev": true, "requires": { - "@babel/highlight": "^7.8.0" + "@babel/highlight": "^7.8.3" } }, "@babel/generator": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.0.tgz", - "integrity": "sha512-2Lp2e02CV2C7j/H4n4D9YvsvdhPVVg9GDIamr6Tu4tU35mL3mzOrzl1lZ8ZJtysfZXh+y+AGORc2rPS7yHxBUg==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.3.tgz", + "integrity": "sha512-WjoPk8hRpDRqqzRpvaR8/gDUPkrnOOeuT2m8cNICJtZH6mwaCo3v0OKMI7Y6SM1pBtyijnLtAL0HDi41pf41ug==", "dev": true, "requires": { - "@babel/types": "^7.8.0", + "@babel/types": "^7.8.3", "jsesc": "^2.5.1", "lodash": "^4.17.13", "source-map": "^0.5.0" } }, "@babel/helper-function-name": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.0.tgz", - "integrity": "sha512-x9psucuU0Xalw+0Vpr2FYJMLB7/KnPSLZhlkUyOGbYAWRDfmtZBrguYpJYiaNCRV7vGkYjO/gF6/J6yMvdWTDw==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz", + "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==", "dev": true, "requires": { - "@babel/helper-get-function-arity": "^7.8.0", - "@babel/template": "^7.8.0", - "@babel/types": "^7.8.0" + "@babel/helper-get-function-arity": "^7.8.3", + "@babel/template": "^7.8.3", + "@babel/types": "^7.8.3" } }, "@babel/helper-get-function-arity": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.0.tgz", - "integrity": "sha512-eUP5grliToMapQiTaYS2AAO/WwaCG7cuJztR1v/a1aPzUzUeGt+AaI9OvLATc/AfFkF8SLJ10d5ugGt/AQ9d6w==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", + "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", "dev": true, "requires": { - "@babel/types": "^7.8.0" + "@babel/types": "^7.8.3" } }, "@babel/helper-split-export-declaration": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.0.tgz", - "integrity": "sha512-YhYFhH4T6DlbT6CPtVgLfC1Jp2gbCawU/ml7WJvUpBg01bCrXSzTYMZZXbbIGjq/kHmK8YUATxTppcRGzj31pA==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", + "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", "dev": true, "requires": { - "@babel/types": "^7.8.0" + "@babel/types": "^7.8.3" } }, "@babel/highlight": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.0.tgz", - "integrity": "sha512-OsdTJbHlPtIk2mmtwXItYrdmalJ8T0zpVzNAbKSkHshuywj7zb29Y09McV/jQsQunc/nEyHiPV2oy9llYMLqxw==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", + "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", "dev": true, "requires": { "chalk": "^2.0.0", @@ -1046,43 +1046,43 @@ } }, "@babel/parser": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.0.tgz", - "integrity": "sha512-VVtsnUYbd1+2A2vOVhm4P2qNXQE8L/W859GpUHfUcdhX8d3pEKThZuIr6fztocWx9HbK+00/CR0tXnhAggJ4CA==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.3.tgz", + "integrity": "sha512-/V72F4Yp/qmHaTALizEm9Gf2eQHV3QyTL3K0cNfijwnMnb1L+LDlAubb/ZnSdGAVzVSWakujHYs1I26x66sMeQ==", "dev": true }, "@babel/template": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.0.tgz", - "integrity": "sha512-0NNMDsY2t3ltAVVK1WHNiaePo3tXPUeJpCX4I3xSKFoEl852wJHG8mrgHVADf8Lz1y+8al9cF7cSSfzSnFSYiw==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", + "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", "dev": true, "requires": { - "@babel/code-frame": "^7.8.0", - "@babel/parser": "^7.8.0", - "@babel/types": "^7.8.0" + "@babel/code-frame": "^7.8.3", + "@babel/parser": "^7.8.3", + "@babel/types": "^7.8.3" } }, "@babel/traverse": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.0.tgz", - "integrity": "sha512-d/6sPXFLGlJHZO/zWDtgFaKyalCOHLedzxpVJn6el1cw+f2TZa7xZEszeXdOw6EUemqRFBAn106BWBvtSck9Qw==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.3.tgz", + "integrity": "sha512-we+a2lti+eEImHmEXp7bM9cTxGzxPmBiVJlLVD+FuuQMeeO7RaDbutbgeheDkw+Xe3mCfJHnGOWLswT74m2IPg==", "dev": true, "requires": { - "@babel/code-frame": "^7.8.0", - "@babel/generator": "^7.8.0", - "@babel/helper-function-name": "^7.8.0", - "@babel/helper-split-export-declaration": "^7.8.0", - "@babel/parser": "^7.8.0", - "@babel/types": "^7.8.0", + "@babel/code-frame": "^7.8.3", + "@babel/generator": "^7.8.3", + "@babel/helper-function-name": "^7.8.3", + "@babel/helper-split-export-declaration": "^7.8.3", + "@babel/parser": "^7.8.3", + "@babel/types": "^7.8.3", "debug": "^4.1.0", "globals": "^11.1.0", "lodash": "^4.17.13" } }, "@babel/types": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.0.tgz", - "integrity": "sha512-1RF84ehyx9HH09dMMwGWl3UTWlVoCPtqqJPjGuC4JzMe1ZIVDJ2DT8mv3cPv/A7veLD6sgR7vi95lJqm+ZayIg==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", + "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", "dev": true, "requires": { "esutils": "^2.0.2", @@ -1105,28 +1105,28 @@ } }, "@babel/helper-simple-access": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.8.0.tgz", - "integrity": "sha512-I+7yKZJnxp7VIC2UFzXfVjLiJuU16rYFF59x27c+boINkO/pLETgZcoesCryg9jmU4jxEa0foFueW+2wjc9Gsw==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.8.3.tgz", + "integrity": "sha512-VNGUDjx5cCWg4vvCTR8qQ7YJYZ+HBjxOgXEl7ounz+4Sn7+LMD3CFrCTEU6/qXKbA2nKg21CwhhBzO0RpRbdCw==", "dev": true, "requires": { - "@babel/template": "^7.8.0", - "@babel/types": "^7.8.0" + "@babel/template": "^7.8.3", + "@babel/types": "^7.8.3" }, "dependencies": { "@babel/code-frame": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.0.tgz", - "integrity": "sha512-AN2IR/wCUYsM+PdErq6Bp3RFTXl8W0p9Nmymm7zkpsCmh+r/YYcckaCGpU8Q/mEKmST19kkGRaG42A/jxOWwBA==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", + "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", "dev": true, "requires": { - "@babel/highlight": "^7.8.0" + "@babel/highlight": "^7.8.3" } }, "@babel/highlight": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.0.tgz", - "integrity": "sha512-OsdTJbHlPtIk2mmtwXItYrdmalJ8T0zpVzNAbKSkHshuywj7zb29Y09McV/jQsQunc/nEyHiPV2oy9llYMLqxw==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", + "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", "dev": true, "requires": { "chalk": "^2.0.0", @@ -1135,26 +1135,26 @@ } }, "@babel/parser": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.0.tgz", - "integrity": "sha512-VVtsnUYbd1+2A2vOVhm4P2qNXQE8L/W859GpUHfUcdhX8d3pEKThZuIr6fztocWx9HbK+00/CR0tXnhAggJ4CA==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.3.tgz", + "integrity": "sha512-/V72F4Yp/qmHaTALizEm9Gf2eQHV3QyTL3K0cNfijwnMnb1L+LDlAubb/ZnSdGAVzVSWakujHYs1I26x66sMeQ==", "dev": true }, "@babel/template": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.0.tgz", - "integrity": "sha512-0NNMDsY2t3ltAVVK1WHNiaePo3tXPUeJpCX4I3xSKFoEl852wJHG8mrgHVADf8Lz1y+8al9cF7cSSfzSnFSYiw==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", + "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", "dev": true, "requires": { - "@babel/code-frame": "^7.8.0", - "@babel/parser": "^7.8.0", - "@babel/types": "^7.8.0" + "@babel/code-frame": "^7.8.3", + "@babel/parser": "^7.8.3", + "@babel/types": "^7.8.3" } }, "@babel/types": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.0.tgz", - "integrity": "sha512-1RF84ehyx9HH09dMMwGWl3UTWlVoCPtqqJPjGuC4JzMe1ZIVDJ2DT8mv3cPv/A7veLD6sgR7vi95lJqm+ZayIg==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", + "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", "dev": true, "requires": { "esutils": "^2.0.2", @@ -1174,71 +1174,71 @@ } }, "@babel/helper-wrap-function": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.8.0.tgz", - "integrity": "sha512-2j6idN2jt8Y+8nJ4UPN/6AZa53DAkcETMVmroJQh50qZc59PuQKVjgOIIqmrLoQf6Ia9bs90MHRcID1OW5tfag==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.8.3.tgz", + "integrity": "sha512-LACJrbUET9cQDzb6kG7EeD7+7doC3JNvUgTEQOx2qaO1fKlzE/Bf05qs9w1oXQMmXlPO65lC3Tq9S6gZpTErEQ==", "dev": true, "requires": { - "@babel/helper-function-name": "^7.8.0", - "@babel/template": "^7.8.0", - "@babel/traverse": "^7.8.0", - "@babel/types": "^7.8.0" + "@babel/helper-function-name": "^7.8.3", + "@babel/template": "^7.8.3", + "@babel/traverse": "^7.8.3", + "@babel/types": "^7.8.3" }, "dependencies": { "@babel/code-frame": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.0.tgz", - "integrity": "sha512-AN2IR/wCUYsM+PdErq6Bp3RFTXl8W0p9Nmymm7zkpsCmh+r/YYcckaCGpU8Q/mEKmST19kkGRaG42A/jxOWwBA==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", + "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", "dev": true, "requires": { - "@babel/highlight": "^7.8.0" + "@babel/highlight": "^7.8.3" } }, "@babel/generator": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.0.tgz", - "integrity": "sha512-2Lp2e02CV2C7j/H4n4D9YvsvdhPVVg9GDIamr6Tu4tU35mL3mzOrzl1lZ8ZJtysfZXh+y+AGORc2rPS7yHxBUg==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.3.tgz", + "integrity": "sha512-WjoPk8hRpDRqqzRpvaR8/gDUPkrnOOeuT2m8cNICJtZH6mwaCo3v0OKMI7Y6SM1pBtyijnLtAL0HDi41pf41ug==", "dev": true, "requires": { - "@babel/types": "^7.8.0", + "@babel/types": "^7.8.3", "jsesc": "^2.5.1", "lodash": "^4.17.13", "source-map": "^0.5.0" } }, "@babel/helper-function-name": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.0.tgz", - "integrity": "sha512-x9psucuU0Xalw+0Vpr2FYJMLB7/KnPSLZhlkUyOGbYAWRDfmtZBrguYpJYiaNCRV7vGkYjO/gF6/J6yMvdWTDw==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz", + "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==", "dev": true, "requires": { - "@babel/helper-get-function-arity": "^7.8.0", - "@babel/template": "^7.8.0", - "@babel/types": "^7.8.0" + "@babel/helper-get-function-arity": "^7.8.3", + "@babel/template": "^7.8.3", + "@babel/types": "^7.8.3" } }, "@babel/helper-get-function-arity": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.0.tgz", - "integrity": "sha512-eUP5grliToMapQiTaYS2AAO/WwaCG7cuJztR1v/a1aPzUzUeGt+AaI9OvLATc/AfFkF8SLJ10d5ugGt/AQ9d6w==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", + "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", "dev": true, "requires": { - "@babel/types": "^7.8.0" + "@babel/types": "^7.8.3" } }, "@babel/helper-split-export-declaration": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.0.tgz", - "integrity": "sha512-YhYFhH4T6DlbT6CPtVgLfC1Jp2gbCawU/ml7WJvUpBg01bCrXSzTYMZZXbbIGjq/kHmK8YUATxTppcRGzj31pA==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", + "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", "dev": true, "requires": { - "@babel/types": "^7.8.0" + "@babel/types": "^7.8.3" } }, "@babel/highlight": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.0.tgz", - "integrity": "sha512-OsdTJbHlPtIk2mmtwXItYrdmalJ8T0zpVzNAbKSkHshuywj7zb29Y09McV/jQsQunc/nEyHiPV2oy9llYMLqxw==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", + "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", "dev": true, "requires": { "chalk": "^2.0.0", @@ -1247,43 +1247,43 @@ } }, "@babel/parser": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.0.tgz", - "integrity": "sha512-VVtsnUYbd1+2A2vOVhm4P2qNXQE8L/W859GpUHfUcdhX8d3pEKThZuIr6fztocWx9HbK+00/CR0tXnhAggJ4CA==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.3.tgz", + "integrity": "sha512-/V72F4Yp/qmHaTALizEm9Gf2eQHV3QyTL3K0cNfijwnMnb1L+LDlAubb/ZnSdGAVzVSWakujHYs1I26x66sMeQ==", "dev": true }, "@babel/template": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.0.tgz", - "integrity": "sha512-0NNMDsY2t3ltAVVK1WHNiaePo3tXPUeJpCX4I3xSKFoEl852wJHG8mrgHVADf8Lz1y+8al9cF7cSSfzSnFSYiw==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", + "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", "dev": true, "requires": { - "@babel/code-frame": "^7.8.0", - "@babel/parser": "^7.8.0", - "@babel/types": "^7.8.0" + "@babel/code-frame": "^7.8.3", + "@babel/parser": "^7.8.3", + "@babel/types": "^7.8.3" } }, "@babel/traverse": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.0.tgz", - "integrity": "sha512-d/6sPXFLGlJHZO/zWDtgFaKyalCOHLedzxpVJn6el1cw+f2TZa7xZEszeXdOw6EUemqRFBAn106BWBvtSck9Qw==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.3.tgz", + "integrity": "sha512-we+a2lti+eEImHmEXp7bM9cTxGzxPmBiVJlLVD+FuuQMeeO7RaDbutbgeheDkw+Xe3mCfJHnGOWLswT74m2IPg==", "dev": true, "requires": { - "@babel/code-frame": "^7.8.0", - "@babel/generator": "^7.8.0", - "@babel/helper-function-name": "^7.8.0", - "@babel/helper-split-export-declaration": "^7.8.0", - "@babel/parser": "^7.8.0", - "@babel/types": "^7.8.0", + "@babel/code-frame": "^7.8.3", + "@babel/generator": "^7.8.3", + "@babel/helper-function-name": "^7.8.3", + "@babel/helper-split-export-declaration": "^7.8.3", + "@babel/parser": "^7.8.3", + "@babel/types": "^7.8.3", "debug": "^4.1.0", "globals": "^11.1.0", "lodash": "^4.17.13" } }, "@babel/types": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.0.tgz", - "integrity": "sha512-1RF84ehyx9HH09dMMwGWl3UTWlVoCPtqqJPjGuC4JzMe1ZIVDJ2DT8mv3cPv/A7veLD6sgR7vi95lJqm+ZayIg==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", + "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", "dev": true, "requires": { "esutils": "^2.0.2", @@ -1454,191 +1454,191 @@ "dev": true }, "@babel/plugin-proposal-async-generator-functions": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.8.0.tgz", - "integrity": "sha512-8vIQf8JYced7gCeKDsGETNGKE+zdD/JmP1LBlRn+w3UXc1aSpZv2Y330bB/fnOEbUgPbuFv+IEi+gopg+Fu0kQ==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.8.3.tgz", + "integrity": "sha512-NZ9zLv848JsV3hs8ryEh7Uaz/0KsmPLqv0+PdkDJL1cJy0K4kOCFa8zc1E3mp+RHPQcpdfb/6GovEsW4VDrOMw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.8.0", - "@babel/helper-remap-async-to-generator": "^7.8.0", + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/helper-remap-async-to-generator": "^7.8.3", "@babel/plugin-syntax-async-generators": "^7.8.0" } }, "@babel/plugin-proposal-dynamic-import": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.8.0.tgz", - "integrity": "sha512-YzMq0AqeTR4Mh2pz3GrCWqhcEV38HgUMMR/56/YR5GPc4Y2p1KJ4Le6j92vMnW8TJqVj+qJz/KDNglpMeww9Yg==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.8.3.tgz", + "integrity": "sha512-NyaBbyLFXFLT9FP+zk0kYlUlA8XtCUbehs67F0nnEg7KICgMc2mNkIeu9TYhKzyXMkrapZFwAhXLdnt4IYHy1w==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.8.0", + "@babel/helper-plugin-utils": "^7.8.3", "@babel/plugin-syntax-dynamic-import": "^7.8.0" } }, "@babel/plugin-proposal-json-strings": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.8.0.tgz", - "integrity": "sha512-pSpuhwn926vtNeUH2FHx1OzIXaUMgklG0MzlFZJVEg37fB904gOxN572NgBae+KDwFyZDpkLMyEkVA011lBJrQ==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.8.3.tgz", + "integrity": "sha512-KGhQNZ3TVCQG/MjRbAUwuH+14y9q0tpxs1nWWs3pbSleRdDro9SAMMDyye8HhY1gqZ7/NqIc8SKhya0wRDgP1Q==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.8.0", + "@babel/helper-plugin-utils": "^7.8.3", "@babel/plugin-syntax-json-strings": "^7.8.0" } }, "@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.8.0.tgz", - "integrity": "sha512-cQMI+RQdcK2IyMm13NKKFCYfOSBUtFxEeRBOdFCi2Pubv/CpkrCubc/ikdeKMT6Lu+uQ+lNSDEJvDCOQZkUy0g==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-TS9MlfzXpXKt6YYomudb/KU7nQI6/xnapG6in1uZxoxDghuSMZsPb6D2fyUwNYSAp4l1iR7QtFOjkqcRYcUsfw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.8.0", + "@babel/helper-plugin-utils": "^7.8.3", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0" } }, "@babel/plugin-proposal-object-rest-spread": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.8.0.tgz", - "integrity": "sha512-SjJ2ZXCylpWC+5DTES0/pbpNmw/FnjU/3dF068xF0DU9aN+oOKah+3MCSFcb4pnZ9IwmxfOy4KnbGJSQR+hAZA==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-8qvuPwU/xxUCt78HocNlv0mXXo0wdh9VT1R04WU8HGOfaOob26pF+9P5/lYjN/q7DHOX1bvX60hnhOvuQUJdbA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.8.0", + "@babel/helper-plugin-utils": "^7.8.3", "@babel/plugin-syntax-object-rest-spread": "^7.8.0" } }, "@babel/plugin-proposal-optional-catch-binding": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.8.0.tgz", - "integrity": "sha512-tHP3eez6TrpPJYttBZ/6uItRbIuXUIDpQ9xwvzKwR+RboWGMJ7WzFC5dDJ3vjLuCx0/DG1tM0MVkmgcBybth9w==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-0gkX7J7E+AtAw9fcwlVQj8peP61qhdg/89D5swOkjYbkboA2CVckn3kiyum1DE0wskGb7KJJxBdyEBApDLLVdw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.8.0", + "@babel/helper-plugin-utils": "^7.8.3", "@babel/plugin-syntax-optional-catch-binding": "^7.8.0" } }, "@babel/plugin-proposal-optional-chaining": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.8.0.tgz", - "integrity": "sha512-PNBHxPHE91m+LLOdGwlvyGicWfrMgiVwng5WdB3CMjd61+vn3vPw0GbgECIAUCZnyi7Jqs5htUIZRztGuV8/5g==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.8.3.tgz", + "integrity": "sha512-QIoIR9abkVn+seDE3OjA08jWcs3eZ9+wJCKSRgo3WdEU2csFYgdScb+8qHB3+WXsGJD55u+5hWCISI7ejXS+kg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.8.0", + "@babel/helper-plugin-utils": "^7.8.3", "@babel/plugin-syntax-optional-chaining": "^7.8.0" } }, "@babel/plugin-proposal-unicode-property-regex": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.8.0.tgz", - "integrity": "sha512-3oK0Qt5w4arb+es3rWBribDbtc0TYJP7dFZ1dXcYul3cXderqfIOoSx9YUC1oD208nJwJO/++fvrgLmkYSbe8A==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.8.3.tgz", + "integrity": "sha512-1/1/rEZv2XGweRwwSkLpY+s60za9OZ1hJs4YDqFHCw0kYWYwL5IFljVY1MYBL+weT1l9pokDO2uhSTLVxzoHkQ==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.8.0", - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/helper-create-regexp-features-plugin": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3" } }, "@babel/plugin-syntax-async-generators": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.0.tgz", - "integrity": "sha512-a8w8k7pK8nYhem07rXdAq03T+DlTX8LFojUptrh9JEx80AgLqGiuoFIyQOGTWif39kFnDOQqbzl1s6KQqrfV+A==", + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-syntax-dynamic-import": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.0.tgz", - "integrity": "sha512-Mx2RzpCHJaBfmFdA2abXDKRHVJdzJ6R0Wqwb6TxCgM7NRR5wcC4cyiAsRL7Ga+lwG8GG1cKvb+4ENjic8y15jA==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-syntax-json-strings": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.0.tgz", - "integrity": "sha512-LPykaAbH86L5NnDfCRSpNxtEHZk+6GaFzXfWEFU/6R4v69EXQr6GOp7hwH+Uw0QlYVN++s6TukTJ3flFcspahA==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.0.tgz", - "integrity": "sha512-Rv2hnBToN6rbA9hO2a4vtwXZLzNa+TWkoSIMMvUezFz5+D9NPeX7SFrArwtFzzbwndmWiqboTr5rNpzAz0MPpA==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.0.tgz", - "integrity": "sha512-dt89fDlkfkTrQcy5KavMQPyF2A6tR0kYp8HAnIoQv5hO34iAUffHghP/hMGd7Gf/+uYTmLQO0ar7peX1SUWyIA==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.0.tgz", - "integrity": "sha512-EIgJVy+u1RvR2gJfX4ReLwAupO/twllUue1wPrRxhu18+eC3bGTEcOSXLQdaE9ya9NG1rE0eQs0GSiloUGFEwg==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-syntax-optional-chaining": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.0.tgz", - "integrity": "sha512-LV1c+TTAO8Vawe3t+WXBHYWbS7endP8MSlqKPKEZOyWPEJX2akl3jfvFG828/OE7RpyoC3JXfLJDFj/jN7A8hg==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-syntax-top-level-await": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.8.0.tgz", - "integrity": "sha512-iXR/Cw32fMfWlD1sK2zD/nXtuLStkalRv+xee6VrX84CFrn2LKwb/EOs/4UaDNUpUsws8YZYKeQjPagacFquug==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.8.3.tgz", + "integrity": "sha512-kwj1j9lL/6Wd0hROD3b/OZZ7MSrZLqqn9RAZ5+cYYsflQ9HZBIKCUkr3+uL1MEJ1NePiUbf98jjiMQSv0NMR9g==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/helper-plugin-utils": "^7.8.3" } }, "@babel/plugin-transform-arrow-functions": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.8.0.tgz", - "integrity": "sha512-9KfteDp9d8cF388dxFMOh3Dum41qpOVUPVjQhXGd1kPyQBE05FJgYndiAriML2yhMIbZ2bjgweh2nnvBXDH2MQ==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.8.3.tgz", + "integrity": "sha512-0MRF+KC8EqH4dbuITCWwPSzsyO3HIWWlm30v8BbbpOrS1B++isGxPnnuq/IZvOX5J2D/p7DQalQm+/2PnlKGxg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/helper-plugin-utils": "^7.8.3" } }, "@babel/plugin-transform-async-to-generator": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.8.0.tgz", - "integrity": "sha512-9dvBvJnEdsDWYMrykoMyLNVRPGoub6SFlARtsYgSQ1riTjnyBjhctihSME4XsSku86F59PDeFpC9PCU+9I154w==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.8.3.tgz", + "integrity": "sha512-imt9tFLD9ogt56Dd5CI/6XgpukMwd/fLGSrix2httihVe7LOGVPhyhMh1BU5kDM7iHD08i8uUtmV2sWaBFlHVQ==", "dev": true, "requires": { - "@babel/helper-module-imports": "^7.8.0", - "@babel/helper-plugin-utils": "^7.8.0", - "@babel/helper-remap-async-to-generator": "^7.8.0" + "@babel/helper-module-imports": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/helper-remap-async-to-generator": "^7.8.3" }, "dependencies": { "@babel/helper-module-imports": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.8.0.tgz", - "integrity": "sha512-ylY9J6ZxEcjmJaJ4P6aVs/fZdrZVctCGnxxfYXwCnSMapqd544zT8lWK2qI/vBPjE5gS0o2jILnH+AkpsPauEQ==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.8.3.tgz", + "integrity": "sha512-R0Bx3jippsbAEtzkpZ/6FIiuzOURPcMjHp+Z6xPe6DtApDJx+w7UYyOLanZqO8+wKR9G10s/FmHXvxaMd9s6Kg==", "dev": true, "requires": { - "@babel/types": "^7.8.0" + "@babel/types": "^7.8.3" } }, "@babel/types": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.0.tgz", - "integrity": "sha512-1RF84ehyx9HH09dMMwGWl3UTWlVoCPtqqJPjGuC4JzMe1ZIVDJ2DT8mv3cPv/A7veLD6sgR7vi95lJqm+ZayIg==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", + "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", "dev": true, "requires": { "esutils": "^2.0.2", @@ -1649,82 +1649,82 @@ } }, "@babel/plugin-transform-block-scoped-functions": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.8.0.tgz", - "integrity": "sha512-bim6gUfHq2kPN+aQst33ZEMeglpaUXAo6PWTZvOA8BOnWpNKgZcUzBvpZhh2ofL6YhZgzGoRwVVfzwynDEf47g==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.8.3.tgz", + "integrity": "sha512-vo4F2OewqjbB1+yaJ7k2EJFHlTP3jR634Z9Cj9itpqNjuLXvhlVxgnjsHsdRgASR8xYDrx6onw4vW5H6We0Jmg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/helper-plugin-utils": "^7.8.3" } }, "@babel/plugin-transform-block-scoping": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.8.0.tgz", - "integrity": "sha512-FKTK4hzg7W950Yu9iqMl12WBixCmusMc5HBt3/ErvpFLnvr3/6mu/EBTZoCEJ0mw/lQUDfU01vTcZY9oEahlMg==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.8.3.tgz", + "integrity": "sha512-pGnYfm7RNRgYRi7bids5bHluENHqJhrV4bCZRwc5GamaWIIs07N4rZECcmJL6ZClwjDz1GbdMZFtPs27hTB06w==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.8.0", + "@babel/helper-plugin-utils": "^7.8.3", "lodash": "^4.17.13" } }, "@babel/plugin-transform-classes": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.8.0.tgz", - "integrity": "sha512-18RLDwKtGXCLLbf5V03GojebPH7dKYCmIBqQGhgfZDoYsyEzR9kMZ6IxlJP72K5ROC9ADa4KPI6ywuh7NfQOgQ==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.8.3.tgz", + "integrity": "sha512-SjT0cwFJ+7Rbr1vQsvphAHwUHvSUPmMjMU/0P59G8U2HLFqSa082JO7zkbDNWs9kH/IUqpHI6xWNesGf8haF1w==", "dev": true, "requires": { - "@babel/helper-annotate-as-pure": "^7.8.0", - "@babel/helper-define-map": "^7.8.0", - "@babel/helper-function-name": "^7.8.0", - "@babel/helper-optimise-call-expression": "^7.8.0", - "@babel/helper-plugin-utils": "^7.8.0", - "@babel/helper-replace-supers": "^7.8.0", - "@babel/helper-split-export-declaration": "^7.8.0", + "@babel/helper-annotate-as-pure": "^7.8.3", + "@babel/helper-define-map": "^7.8.3", + "@babel/helper-function-name": "^7.8.3", + "@babel/helper-optimise-call-expression": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/helper-replace-supers": "^7.8.3", + "@babel/helper-split-export-declaration": "^7.8.3", "globals": "^11.1.0" }, "dependencies": { "@babel/code-frame": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.0.tgz", - "integrity": "sha512-AN2IR/wCUYsM+PdErq6Bp3RFTXl8W0p9Nmymm7zkpsCmh+r/YYcckaCGpU8Q/mEKmST19kkGRaG42A/jxOWwBA==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", + "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", "dev": true, "requires": { - "@babel/highlight": "^7.8.0" + "@babel/highlight": "^7.8.3" } }, "@babel/helper-function-name": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.0.tgz", - "integrity": "sha512-x9psucuU0Xalw+0Vpr2FYJMLB7/KnPSLZhlkUyOGbYAWRDfmtZBrguYpJYiaNCRV7vGkYjO/gF6/J6yMvdWTDw==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz", + "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==", "dev": true, "requires": { - "@babel/helper-get-function-arity": "^7.8.0", - "@babel/template": "^7.8.0", - "@babel/types": "^7.8.0" + "@babel/helper-get-function-arity": "^7.8.3", + "@babel/template": "^7.8.3", + "@babel/types": "^7.8.3" } }, "@babel/helper-get-function-arity": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.0.tgz", - "integrity": "sha512-eUP5grliToMapQiTaYS2AAO/WwaCG7cuJztR1v/a1aPzUzUeGt+AaI9OvLATc/AfFkF8SLJ10d5ugGt/AQ9d6w==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", + "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", "dev": true, "requires": { - "@babel/types": "^7.8.0" + "@babel/types": "^7.8.3" } }, "@babel/helper-split-export-declaration": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.0.tgz", - "integrity": "sha512-YhYFhH4T6DlbT6CPtVgLfC1Jp2gbCawU/ml7WJvUpBg01bCrXSzTYMZZXbbIGjq/kHmK8YUATxTppcRGzj31pA==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", + "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", "dev": true, "requires": { - "@babel/types": "^7.8.0" + "@babel/types": "^7.8.3" } }, "@babel/highlight": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.0.tgz", - "integrity": "sha512-OsdTJbHlPtIk2mmtwXItYrdmalJ8T0zpVzNAbKSkHshuywj7zb29Y09McV/jQsQunc/nEyHiPV2oy9llYMLqxw==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", + "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", "dev": true, "requires": { "chalk": "^2.0.0", @@ -1733,26 +1733,26 @@ } }, "@babel/parser": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.0.tgz", - "integrity": "sha512-VVtsnUYbd1+2A2vOVhm4P2qNXQE8L/W859GpUHfUcdhX8d3pEKThZuIr6fztocWx9HbK+00/CR0tXnhAggJ4CA==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.3.tgz", + "integrity": "sha512-/V72F4Yp/qmHaTALizEm9Gf2eQHV3QyTL3K0cNfijwnMnb1L+LDlAubb/ZnSdGAVzVSWakujHYs1I26x66sMeQ==", "dev": true }, "@babel/template": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.0.tgz", - "integrity": "sha512-0NNMDsY2t3ltAVVK1WHNiaePo3tXPUeJpCX4I3xSKFoEl852wJHG8mrgHVADf8Lz1y+8al9cF7cSSfzSnFSYiw==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", + "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", "dev": true, "requires": { - "@babel/code-frame": "^7.8.0", - "@babel/parser": "^7.8.0", - "@babel/types": "^7.8.0" + "@babel/code-frame": "^7.8.3", + "@babel/parser": "^7.8.3", + "@babel/types": "^7.8.3" } }, "@babel/types": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.0.tgz", - "integrity": "sha512-1RF84ehyx9HH09dMMwGWl3UTWlVoCPtqqJPjGuC4JzMe1ZIVDJ2DT8mv3cPv/A7veLD6sgR7vi95lJqm+ZayIg==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", + "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", "dev": true, "requires": { "esutils": "^2.0.2", @@ -1763,104 +1763,104 @@ } }, "@babel/plugin-transform-computed-properties": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.8.0.tgz", - "integrity": "sha512-FaODHuQRdnWFVwxLPlTN85Lk/aitfvQBHTXahf58FnatCynfhkeNUO8ID+AqAxY4IJsZjeH6OnKDzcGfgKJcVw==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.8.3.tgz", + "integrity": "sha512-O5hiIpSyOGdrQZRQ2ccwtTVkgUDBBiCuK//4RJ6UfePllUTCENOzKxfh6ulckXKc0DixTFLCfb2HVkNA7aDpzA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/helper-plugin-utils": "^7.8.3" } }, "@babel/plugin-transform-destructuring": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.8.0.tgz", - "integrity": "sha512-D+69HT//cE86aBTLULzSBFLC5A7HcPQzJPiny6P4SLHkDF750MylRKO3iWvdgvb+OSp5dOrOxwXajvaxk1ZfYA==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.8.3.tgz", + "integrity": "sha512-H4X646nCkiEcHZUZaRkhE2XVsoz0J/1x3VVujnn96pSoGCtKPA99ZZA+va+gK+92Zycd6OBKCD8tDb/731bhgQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/helper-plugin-utils": "^7.8.3" } }, "@babel/plugin-transform-dotall-regex": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.8.0.tgz", - "integrity": "sha512-pq/XLkDB4MPvTe9ktHJInfWksalXogrIGRZJUG7RiDXhEfdNrlducoMPbACZQuCFtelVgVpD0VyreiY0l38G7g==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.8.3.tgz", + "integrity": "sha512-kLs1j9Nn4MQoBYdRXH6AeaXMbEJFaFu/v1nQkvib6QzTj8MZI5OQzqmD83/2jEM1z0DLilra5aWO5YpyC0ALIw==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.8.0", - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/helper-create-regexp-features-plugin": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3" } }, "@babel/plugin-transform-duplicate-keys": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.8.0.tgz", - "integrity": "sha512-REtYWvpP4TDw4oVeP01vQJcAeewjgk8/i7tPFP11vUjvarUGGyxJLeq79WEnIdnKPQJirZaoDRT4kEWEdSWkDw==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.8.3.tgz", + "integrity": "sha512-s8dHiBUbcbSgipS4SMFuWGqCvyge5V2ZeAWzR6INTVC3Ltjig/Vw1G2Gztv0vU/hRG9X8IvKvYdoksnUfgXOEQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/helper-plugin-utils": "^7.8.3" } }, "@babel/plugin-transform-exponentiation-operator": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.8.0.tgz", - "integrity": "sha512-vaDgF3gPLzVcoe3UZqnra6FA7O797sZc+UCHPd9eQTI34cPtpCA270LzopIXS3Fhc3UmFrijLmre9mHTmUKVgg==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.8.3.tgz", + "integrity": "sha512-zwIpuIymb3ACcInbksHaNcR12S++0MDLKkiqXHl3AzpgdKlFNhog+z/K0+TGW+b0w5pgTq4H6IwV/WhxbGYSjQ==", "dev": true, "requires": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.8.0", - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3" } }, "@babel/plugin-transform-for-of": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.8.0.tgz", - "integrity": "sha512-9j9g0qViCAo8E5qCBSaQdghymn7A9bRXSfS9jU7oLpYccYFZg9A+1KO8X+HV7fhJYH6mZ+e7MRg4p3sLo+RG6Q==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.8.3.tgz", + "integrity": "sha512-ZjXznLNTxhpf4Q5q3x1NsngzGA38t9naWH8Gt+0qYZEJAcvPI9waSStSh56u19Ofjr7QmD0wUsQ8hw8s/p1VnA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/helper-plugin-utils": "^7.8.3" } }, "@babel/plugin-transform-function-name": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.8.0.tgz", - "integrity": "sha512-YL8Ol54UKeIyY1uUGfry+B9ppXAB3aVBB1gG9gxqhg/OBCPpV2QUNswmjvfmyXEdaWv8qODssBgX7on792h44w==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.8.3.tgz", + "integrity": "sha512-rO/OnDS78Eifbjn5Py9v8y0aR+aSYhDhqAwVfsTl0ERuMZyr05L1aFSCJnbv2mmsLkit/4ReeQ9N2BgLnOcPCQ==", "dev": true, "requires": { - "@babel/helper-function-name": "^7.8.0", - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/helper-function-name": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3" }, "dependencies": { "@babel/code-frame": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.0.tgz", - "integrity": "sha512-AN2IR/wCUYsM+PdErq6Bp3RFTXl8W0p9Nmymm7zkpsCmh+r/YYcckaCGpU8Q/mEKmST19kkGRaG42A/jxOWwBA==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", + "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", "dev": true, "requires": { - "@babel/highlight": "^7.8.0" + "@babel/highlight": "^7.8.3" } }, "@babel/helper-function-name": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.0.tgz", - "integrity": "sha512-x9psucuU0Xalw+0Vpr2FYJMLB7/KnPSLZhlkUyOGbYAWRDfmtZBrguYpJYiaNCRV7vGkYjO/gF6/J6yMvdWTDw==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz", + "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==", "dev": true, "requires": { - "@babel/helper-get-function-arity": "^7.8.0", - "@babel/template": "^7.8.0", - "@babel/types": "^7.8.0" + "@babel/helper-get-function-arity": "^7.8.3", + "@babel/template": "^7.8.3", + "@babel/types": "^7.8.3" } }, "@babel/helper-get-function-arity": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.0.tgz", - "integrity": "sha512-eUP5grliToMapQiTaYS2AAO/WwaCG7cuJztR1v/a1aPzUzUeGt+AaI9OvLATc/AfFkF8SLJ10d5ugGt/AQ9d6w==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", + "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", "dev": true, "requires": { - "@babel/types": "^7.8.0" + "@babel/types": "^7.8.3" } }, "@babel/highlight": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.0.tgz", - "integrity": "sha512-OsdTJbHlPtIk2mmtwXItYrdmalJ8T0zpVzNAbKSkHshuywj7zb29Y09McV/jQsQunc/nEyHiPV2oy9llYMLqxw==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", + "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", "dev": true, "requires": { "chalk": "^2.0.0", @@ -1869,26 +1869,26 @@ } }, "@babel/parser": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.0.tgz", - "integrity": "sha512-VVtsnUYbd1+2A2vOVhm4P2qNXQE8L/W859GpUHfUcdhX8d3pEKThZuIr6fztocWx9HbK+00/CR0tXnhAggJ4CA==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.3.tgz", + "integrity": "sha512-/V72F4Yp/qmHaTALizEm9Gf2eQHV3QyTL3K0cNfijwnMnb1L+LDlAubb/ZnSdGAVzVSWakujHYs1I26x66sMeQ==", "dev": true }, "@babel/template": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.0.tgz", - "integrity": "sha512-0NNMDsY2t3ltAVVK1WHNiaePo3tXPUeJpCX4I3xSKFoEl852wJHG8mrgHVADf8Lz1y+8al9cF7cSSfzSnFSYiw==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", + "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", "dev": true, "requires": { - "@babel/code-frame": "^7.8.0", - "@babel/parser": "^7.8.0", - "@babel/types": "^7.8.0" + "@babel/code-frame": "^7.8.3", + "@babel/parser": "^7.8.3", + "@babel/types": "^7.8.3" } }, "@babel/types": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.0.tgz", - "integrity": "sha512-1RF84ehyx9HH09dMMwGWl3UTWlVoCPtqqJPjGuC4JzMe1ZIVDJ2DT8mv3cPv/A7veLD6sgR7vi95lJqm+ZayIg==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", + "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", "dev": true, "requires": { "esutils": "^2.0.2", @@ -1899,120 +1899,120 @@ } }, "@babel/plugin-transform-literals": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.8.0.tgz", - "integrity": "sha512-7UDPKG+uVltsZt98Hw+rMbLg772r8fQC6YJ2fNDckcpAXgIWqQbMCmCpfYo0hBNhdhqocM73auk4P/zziQshQw==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.8.3.tgz", + "integrity": "sha512-3Tqf8JJ/qB7TeldGl+TT55+uQei9JfYaregDcEAyBZ7akutriFrt6C/wLYIer6OYhleVQvH/ntEhjE/xMmy10A==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/helper-plugin-utils": "^7.8.3" } }, "@babel/plugin-transform-member-expression-literals": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.8.0.tgz", - "integrity": "sha512-lJSdaWR56wmrosCiyqKFRVnLrFYoVAk2mtZAyegt7akeJky/gguv0Rukx9GV3XwHGuM1ZPE06cZMjNlcLp8LrQ==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.8.3.tgz", + "integrity": "sha512-3Wk2EXhnw+rP+IDkK6BdtPKsUE5IeZ6QOGrPYvw52NwBStw9V1ZVzxgK6fSKSxqUvH9eQPR3tm3cOq79HlsKYA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/helper-plugin-utils": "^7.8.3" } }, "@babel/plugin-transform-modules-amd": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.8.0.tgz", - "integrity": "sha512-mFr1O3TaDL4XozM3AzNPz9AsxzzjTxwn4aOShYP5TlO+4rufvjagV2KKDTPMZTQm1ZA/C/PxJDsDekEnnUGz5A==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.8.3.tgz", + "integrity": "sha512-MadJiU3rLKclzT5kBH4yxdry96odTUwuqrZM+GllFI/VhxfPz+k9MshJM+MwhfkCdxxclSbSBbUGciBngR+kEQ==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.8.0", - "@babel/helper-plugin-utils": "^7.8.0", + "@babel/helper-module-transforms": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3", "babel-plugin-dynamic-import-node": "^2.3.0" } }, "@babel/plugin-transform-modules-commonjs": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.8.0.tgz", - "integrity": "sha512-w2g8tmL7NgBYt6alc8YawMcmPiYqnVvvI0kLB++VOUOssqdJMAkfQOMGV+2M8H5uhJYDaAghAVMUYps3s+jMrw==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.8.3.tgz", + "integrity": "sha512-JpdMEfA15HZ/1gNuB9XEDlZM1h/gF/YOH7zaZzQu2xCFRfwc01NXBMHHSTT6hRjlXJJs5x/bfODM3LiCk94Sxg==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.8.0", - "@babel/helper-plugin-utils": "^7.8.0", - "@babel/helper-simple-access": "^7.8.0", + "@babel/helper-module-transforms": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/helper-simple-access": "^7.8.3", "babel-plugin-dynamic-import-node": "^2.3.0" } }, "@babel/plugin-transform-modules-systemjs": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.8.0.tgz", - "integrity": "sha512-tKF9KLiIsiKyWTVU0yo+NcNAylGn7euggYwXw63/tMxGtDTPsB9Y7Ecqv4EoXEwtoJOJ0Lewf17oaWQtindxIA==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.8.3.tgz", + "integrity": "sha512-8cESMCJjmArMYqa9AO5YuMEkE4ds28tMpZcGZB/jl3n0ZzlsxOAi3mC+SKypTfT8gjMupCnd3YiXCkMjj2jfOg==", "dev": true, "requires": { - "@babel/helper-hoist-variables": "^7.8.0", - "@babel/helper-module-transforms": "^7.8.0", - "@babel/helper-plugin-utils": "^7.8.0", + "@babel/helper-hoist-variables": "^7.8.3", + "@babel/helper-module-transforms": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3", "babel-plugin-dynamic-import-node": "^2.3.0" } }, "@babel/plugin-transform-modules-umd": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.8.0.tgz", - "integrity": "sha512-lAwNfXwmfTy7fl2XOyoVpMXnLkJANgH0vdSYNFcS4RuJPBtHfunGA+Y0L7wsHmfPzyVYt8sUglLjaWtdZMNJNg==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.8.3.tgz", + "integrity": "sha512-evhTyWhbwbI3/U6dZAnx/ePoV7H6OUG+OjiJFHmhr9FPn0VShjwC2kdxqIuQ/+1P50TMrneGzMeyMTFOjKSnAw==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.8.0", - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/helper-module-transforms": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3" } }, "@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.8.0.tgz", - "integrity": "sha512-kq1rxQ1HviCP13SMGZ4WjBBpdogTGK7yn/g/+p+g1AQledgHOWKVeMY1DwKYGlGJ/grDGTOqpJLF1v3Sb7ghKA==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.8.3.tgz", + "integrity": "sha512-f+tF/8UVPU86TrCb06JoPWIdDpTNSGGcAtaD9mLP0aYGA0OS0j7j7DHJR0GTFrUZPUU6loZhbsVZgTh0N+Qdnw==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.8.0" + "@babel/helper-create-regexp-features-plugin": "^7.8.3" } }, "@babel/plugin-transform-new-target": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.8.0.tgz", - "integrity": "sha512-hH1Afz9Xy/wkcxhoI0vYw48kTBJqYUhMmhp3SLI1p817iByM6ItH4LS8tZatDAIKmAQAXj8d3Ups1BgVJECDrA==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.8.3.tgz", + "integrity": "sha512-QuSGysibQpyxexRyui2vca+Cmbljo8bcRckgzYV4kRIsHpVeyeC3JDO63pY+xFZ6bWOBn7pfKZTqV4o/ix9sFw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/helper-plugin-utils": "^7.8.3" } }, "@babel/plugin-transform-object-super": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.8.0.tgz", - "integrity": "sha512-2DYqQ811nRlFVlni6iqfxBVVGqkBgfvEv/lcvmdNu2CaG+EA7zSP1hqYUsqamR+uCdDbsrV7uY6/0rkXbJo5YQ==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.8.3.tgz", + "integrity": "sha512-57FXk+gItG/GejofIyLIgBKTas4+pEU47IXKDBWFTxdPd7F80H8zybyAY7UoblVfBhBGs2EKM+bJUu2+iUYPDQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.8.0", - "@babel/helper-replace-supers": "^7.8.0" + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/helper-replace-supers": "^7.8.3" } }, "@babel/plugin-transform-parameters": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.8.0.tgz", - "integrity": "sha512-9R2yykk7H92rntETO0fq52vJ4OFaTcDA49K9s8bQPyoD4o3/SkWEklukArCsQC6fowEuraPkH/umopr9uO539g==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.8.3.tgz", + "integrity": "sha512-/pqngtGb54JwMBZ6S/D3XYylQDFtGjWrnoCF4gXZOUpFV/ujbxnoNGNvDGu6doFWRPBveE72qTx/RRU44j5I/Q==", "dev": true, "requires": { - "@babel/helper-call-delegate": "^7.8.0", - "@babel/helper-get-function-arity": "^7.8.0", - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/helper-call-delegate": "^7.8.3", + "@babel/helper-get-function-arity": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3" }, "dependencies": { "@babel/helper-get-function-arity": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.0.tgz", - "integrity": "sha512-eUP5grliToMapQiTaYS2AAO/WwaCG7cuJztR1v/a1aPzUzUeGt+AaI9OvLATc/AfFkF8SLJ10d5ugGt/AQ9d6w==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", + "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", "dev": true, "requires": { - "@babel/types": "^7.8.0" + "@babel/types": "^7.8.3" } }, "@babel/types": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.0.tgz", - "integrity": "sha512-1RF84ehyx9HH09dMMwGWl3UTWlVoCPtqqJPjGuC4JzMe1ZIVDJ2DT8mv3cPv/A7veLD6sgR7vi95lJqm+ZayIg==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", + "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", "dev": true, "requires": { "esutils": "^2.0.2", @@ -2023,107 +2023,107 @@ } }, "@babel/plugin-transform-property-literals": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.8.0.tgz", - "integrity": "sha512-vjZaQlojnZIahu5ofEW+hPJfDI5A6r2Sbi5C0RuCaAOFj7viDIR5kOR7ul3Fz5US8V1sVk5Zd2yuPaz7iBeysg==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.8.3.tgz", + "integrity": "sha512-uGiiXAZMqEoQhRWMK17VospMZh5sXWg+dlh2soffpkAl96KAm+WZuJfa6lcELotSRmooLqg0MWdH6UUq85nmmg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/helper-plugin-utils": "^7.8.3" } }, "@babel/plugin-transform-regenerator": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.8.0.tgz", - "integrity": "sha512-n88GT8PZuOHWxqxCJORW3g1QaYzQhHu5sEslxYeQkHVoewfnfuWN37t7YGaRLaNUdaZUlRPXhDcLGT7zBa/u0g==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.8.3.tgz", + "integrity": "sha512-qt/kcur/FxrQrzFR432FGZznkVAjiyFtCOANjkAKwCbt465L6ZCiUQh2oMYGU3Wo8LRFJxNDFwWn106S5wVUNA==", "dev": true, "requires": { "regenerator-transform": "^0.14.0" } }, "@babel/plugin-transform-reserved-words": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.8.0.tgz", - "integrity": "sha512-DnshRyDTXZhmAgO2c1QKZI4CfZjoP2t3fSwRsnbCP9P/FSBpf9I7ovnAELswklw5OeY+/D/JIiaGLoUt2II3LA==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.8.3.tgz", + "integrity": "sha512-mwMxcycN3omKFDjDQUl+8zyMsBfjRFr0Zn/64I41pmjv4NJuqcYlEtezwYtw9TFd9WR1vN5kiM+O0gMZzO6L0A==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/helper-plugin-utils": "^7.8.3" } }, "@babel/plugin-transform-shorthand-properties": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.8.0.tgz", - "integrity": "sha512-sExhzq63Gl2PMbl7ETpN7Z1A38rLD6GeCT6EEEIIKjTVt9u6dRqJ6nHhaquL7QgR3egj/8fcvq23UvzfPqGAYA==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.8.3.tgz", + "integrity": "sha512-I9DI6Odg0JJwxCHzbzW08ggMdCezoWcuQRz3ptdudgwaHxTjxw5HgdFJmZIkIMlRymL6YiZcped4TTCB0JcC8w==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/helper-plugin-utils": "^7.8.3" } }, "@babel/plugin-transform-spread": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.8.0.tgz", - "integrity": "sha512-6Zjl0pv6x10YmFVRI0VhwJ/rE++geVHNJ9xwd+UIt3ON2VMRO7qI2lPsyLnzidR5HYNd/JXj47kdU9Rrn4YcnQ==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.8.3.tgz", + "integrity": "sha512-CkuTU9mbmAoFOI1tklFWYYbzX5qCIZVXPVy0jpXgGwkplCndQAa58s2jr66fTeQnA64bDox0HL4U56CFYoyC7g==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/helper-plugin-utils": "^7.8.3" } }, "@babel/plugin-transform-sticky-regex": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.8.0.tgz", - "integrity": "sha512-uksok0Bqox8YeIRFhr6RRtlBXeGpN1ogiEVjEd7A7rVLPZBXKGbL7kODpE7MQ+avjDLv5EEKtDCeYuWZK7FF7g==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.8.3.tgz", + "integrity": "sha512-9Spq0vGCD5Bb4Z/ZXXSK5wbbLFMG085qd2vhL1JYu1WcQ5bXqZBAYRzU1d+p79GcHs2szYv5pVQCX13QgldaWw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.8.0", - "@babel/helper-regex": "^7.8.0" + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/helper-regex": "^7.8.3" } }, "@babel/plugin-transform-template-literals": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.8.0.tgz", - "integrity": "sha512-EF7Q7LEgeMpogHcvmHMNXBWdLWG1tpA1ErXH3i8zTu3+UEKo6aBn+FldPAJ16UbbbOwSCUCiDP6oZxvVRPhwnQ==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.8.3.tgz", + "integrity": "sha512-820QBtykIQOLFT8NZOcTRJ1UNuztIELe4p9DCgvj4NK+PwluSJ49we7s9FB1HIGNIYT7wFUJ0ar2QpCDj0escQ==", "dev": true, "requires": { - "@babel/helper-annotate-as-pure": "^7.8.0", - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/helper-annotate-as-pure": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3" } }, "@babel/plugin-transform-typeof-symbol": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.8.0.tgz", - "integrity": "sha512-rEUBEFzsA9mCS2r7EtXFlM/6GqtzgLdC4WVYM9fIgJX+HcSJ8oMmj8LinfKhbo0ipRauvUM2teE2iNDNqDwO1g==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.8.3.tgz", + "integrity": "sha512-3TrkKd4LPqm4jHs6nPtSDI/SV9Cm5PRJkHLUgTcqRQQTMAZ44ZaAdDZJtvWFSaRcvT0a1rTmJ5ZA5tDKjleF3g==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/helper-plugin-utils": "^7.8.3" } }, "@babel/plugin-transform-unicode-regex": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.8.0.tgz", - "integrity": "sha512-qDg8wsnE47B/Sj8ZtOndPHrGBxJMssZJ71SzXrItum9n++iVFN7kYuJO+OHhjom7+/or0zzYqvJNzCkUjyNKqg==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.8.3.tgz", + "integrity": "sha512-+ufgJjYdmWfSQ+6NS9VGUR2ns8cjJjYbrbi11mZBTaWm+Fui/ncTLFF28Ei1okavY+xkojGr1eJxNsWYeA5aZw==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.8.0", - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/helper-create-regexp-features-plugin": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3" } }, "@babel/preset-env": { - "version": "7.8.2", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.8.2.tgz", - "integrity": "sha512-AF2YUl2bGsLWTtFL68upTTB7nDo05aEcKjHmXJE+aXRvsx5K+9yRsHQP3MjnTrLOWe/eFyUr93dfILROsKC4eg==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.8.3.tgz", + "integrity": "sha512-Rs4RPL2KjSLSE2mWAx5/iCH+GC1ikKdxPrhnRS6PfFVaiZeom22VFKN4X8ZthyN61kAaR05tfXTbCvatl9WIQg==", "dev": true, "requires": { "@babel/compat-data": "^7.8.0", - "@babel/helper-compilation-targets": "^7.8.0", - "@babel/helper-module-imports": "^7.8.0", - "@babel/helper-plugin-utils": "^7.8.0", - "@babel/plugin-proposal-async-generator-functions": "^7.8.0", - "@babel/plugin-proposal-dynamic-import": "^7.8.0", - "@babel/plugin-proposal-json-strings": "^7.8.0", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.8.0", - "@babel/plugin-proposal-object-rest-spread": "^7.8.0", - "@babel/plugin-proposal-optional-catch-binding": "^7.8.0", - "@babel/plugin-proposal-optional-chaining": "^7.8.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.8.0", + "@babel/helper-compilation-targets": "^7.8.3", + "@babel/helper-module-imports": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-proposal-async-generator-functions": "^7.8.3", + "@babel/plugin-proposal-dynamic-import": "^7.8.3", + "@babel/plugin-proposal-json-strings": "^7.8.3", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-proposal-object-rest-spread": "^7.8.3", + "@babel/plugin-proposal-optional-catch-binding": "^7.8.3", + "@babel/plugin-proposal-optional-chaining": "^7.8.3", + "@babel/plugin-proposal-unicode-property-regex": "^7.8.3", "@babel/plugin-syntax-async-generators": "^7.8.0", "@babel/plugin-syntax-dynamic-import": "^7.8.0", "@babel/plugin-syntax-json-strings": "^7.8.0", @@ -2131,39 +2131,39 @@ "@babel/plugin-syntax-object-rest-spread": "^7.8.0", "@babel/plugin-syntax-optional-catch-binding": "^7.8.0", "@babel/plugin-syntax-optional-chaining": "^7.8.0", - "@babel/plugin-syntax-top-level-await": "^7.8.0", - "@babel/plugin-transform-arrow-functions": "^7.8.0", - "@babel/plugin-transform-async-to-generator": "^7.8.0", - "@babel/plugin-transform-block-scoped-functions": "^7.8.0", - "@babel/plugin-transform-block-scoping": "^7.8.0", - "@babel/plugin-transform-classes": "^7.8.0", - "@babel/plugin-transform-computed-properties": "^7.8.0", - "@babel/plugin-transform-destructuring": "^7.8.0", - "@babel/plugin-transform-dotall-regex": "^7.8.0", - "@babel/plugin-transform-duplicate-keys": "^7.8.0", - "@babel/plugin-transform-exponentiation-operator": "^7.8.0", - "@babel/plugin-transform-for-of": "^7.8.0", - "@babel/plugin-transform-function-name": "^7.8.0", - "@babel/plugin-transform-literals": "^7.8.0", - "@babel/plugin-transform-member-expression-literals": "^7.8.0", - "@babel/plugin-transform-modules-amd": "^7.8.0", - "@babel/plugin-transform-modules-commonjs": "^7.8.0", - "@babel/plugin-transform-modules-systemjs": "^7.8.0", - "@babel/plugin-transform-modules-umd": "^7.8.0", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.8.0", - "@babel/plugin-transform-new-target": "^7.8.0", - "@babel/plugin-transform-object-super": "^7.8.0", - "@babel/plugin-transform-parameters": "^7.8.0", - "@babel/plugin-transform-property-literals": "^7.8.0", - "@babel/plugin-transform-regenerator": "^7.8.0", - "@babel/plugin-transform-reserved-words": "^7.8.0", - "@babel/plugin-transform-shorthand-properties": "^7.8.0", - "@babel/plugin-transform-spread": "^7.8.0", - "@babel/plugin-transform-sticky-regex": "^7.8.0", - "@babel/plugin-transform-template-literals": "^7.8.0", - "@babel/plugin-transform-typeof-symbol": "^7.8.0", - "@babel/plugin-transform-unicode-regex": "^7.8.0", - "@babel/types": "^7.8.0", + "@babel/plugin-syntax-top-level-await": "^7.8.3", + "@babel/plugin-transform-arrow-functions": "^7.8.3", + "@babel/plugin-transform-async-to-generator": "^7.8.3", + "@babel/plugin-transform-block-scoped-functions": "^7.8.3", + "@babel/plugin-transform-block-scoping": "^7.8.3", + "@babel/plugin-transform-classes": "^7.8.3", + "@babel/plugin-transform-computed-properties": "^7.8.3", + "@babel/plugin-transform-destructuring": "^7.8.3", + "@babel/plugin-transform-dotall-regex": "^7.8.3", + "@babel/plugin-transform-duplicate-keys": "^7.8.3", + "@babel/plugin-transform-exponentiation-operator": "^7.8.3", + "@babel/plugin-transform-for-of": "^7.8.3", + "@babel/plugin-transform-function-name": "^7.8.3", + "@babel/plugin-transform-literals": "^7.8.3", + "@babel/plugin-transform-member-expression-literals": "^7.8.3", + "@babel/plugin-transform-modules-amd": "^7.8.3", + "@babel/plugin-transform-modules-commonjs": "^7.8.3", + "@babel/plugin-transform-modules-systemjs": "^7.8.3", + "@babel/plugin-transform-modules-umd": "^7.8.3", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.8.3", + "@babel/plugin-transform-new-target": "^7.8.3", + "@babel/plugin-transform-object-super": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.8.3", + "@babel/plugin-transform-property-literals": "^7.8.3", + "@babel/plugin-transform-regenerator": "^7.8.3", + "@babel/plugin-transform-reserved-words": "^7.8.3", + "@babel/plugin-transform-shorthand-properties": "^7.8.3", + "@babel/plugin-transform-spread": "^7.8.3", + "@babel/plugin-transform-sticky-regex": "^7.8.3", + "@babel/plugin-transform-template-literals": "^7.8.3", + "@babel/plugin-transform-typeof-symbol": "^7.8.3", + "@babel/plugin-transform-unicode-regex": "^7.8.3", + "@babel/types": "^7.8.3", "browserslist": "^4.8.2", "core-js-compat": "^3.6.2", "invariant": "^2.2.2", @@ -2172,18 +2172,18 @@ }, "dependencies": { "@babel/helper-module-imports": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.8.0.tgz", - "integrity": "sha512-ylY9J6ZxEcjmJaJ4P6aVs/fZdrZVctCGnxxfYXwCnSMapqd544zT8lWK2qI/vBPjE5gS0o2jILnH+AkpsPauEQ==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.8.3.tgz", + "integrity": "sha512-R0Bx3jippsbAEtzkpZ/6FIiuzOURPcMjHp+Z6xPe6DtApDJx+w7UYyOLanZqO8+wKR9G10s/FmHXvxaMd9s6Kg==", "dev": true, "requires": { - "@babel/types": "^7.8.0" + "@babel/types": "^7.8.3" } }, "@babel/types": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.0.tgz", - "integrity": "sha512-1RF84ehyx9HH09dMMwGWl3UTWlVoCPtqqJPjGuC4JzMe1ZIVDJ2DT8mv3cPv/A7veLD6sgR7vi95lJqm+ZayIg==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", + "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", "dev": true, "requires": { "esutils": "^2.0.2", @@ -3683,9 +3683,9 @@ } }, "caniuse-lite": { - "version": "1.0.30001020", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001020.tgz", - "integrity": "sha512-yWIvwA68wRHKanAVS1GjN8vajAv7MBFshullKCeq/eKpK7pJBVDgFFEqvgWTkcP2+wIDeQGYFRXECjKZnLkUjA==", + "version": "1.0.30001021", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001021.tgz", + "integrity": "sha512-wuMhT7/hwkgd8gldgp2jcrUjOU9RXJ4XxGumQeOsUr91l3WwmM68Cpa/ymCnWEDqakwFXhuDQbaKNHXBPgeE9g==", "dev": true }, "caseless": { @@ -4194,9 +4194,9 @@ "dev": true }, "core-js-compat": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.6.3.tgz", - "integrity": "sha512-Y3YNGU3bU1yrnzVodop23ghArbKv4IqkZg9MMOWv/h7KT6NRk1/SzHhWDDlubg2+tlcUzAqgj1/GyeJ9fUKMeg==", + "version": "3.6.4", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.6.4.tgz", + "integrity": "sha512-zAa3IZPvsJ0slViBQ2z+vgyyTuhd3MFn1rBQjZSKVEgB0UMYhUkCj9jJUVPgGTGqWvsBVmfnruXgTcNyTlEiSA==", "dev": true, "requires": { "browserslist": "^4.8.3", @@ -4661,9 +4661,9 @@ "dev": true }, "electron-to-chromium": { - "version": "1.3.332", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.332.tgz", - "integrity": "sha512-AP2HkLhfSOIxP7gDjlyZ4ywGWIcxRMZoU9+JriuVkQe2pSLDdWBsE6+eI6BQOqun1dohLrUTOPHsQLLhhFA7Eg==", + "version": "1.3.338", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.338.tgz", + "integrity": "sha512-wlmfixuHEc9CkfOKgcqdtzBmRW4NStM9ptl5oPILY2UDyHuSXb3Yit+yLVyLObTgGuMMU36hhnfs2GDJId7ctA==", "dev": true }, "elliptic": { @@ -9487,9 +9487,9 @@ } }, "node-releases": { - "version": "1.1.45", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.45.tgz", - "integrity": "sha512-cXvGSfhITKI8qsV116u2FTzH5EWZJfgG7d4cpqwF8I8+1tWpD6AsvvGRKq2onR0DNj1jfqsjkXZsm14JMS7Cyg==", + "version": "1.1.46", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.46.tgz", + "integrity": "sha512-YOjdx+Uoh9FbRO7yVYbnbt1puRWPQMemR3SutLeyv2XfxKs1ihpe0OLAUwBPEP2ImNH/PZC7SEiC6j32dwRZ7g==", "dev": true, "requires": { "semver": "^6.3.0" From 9ce0d6159ce32c7bc23072c846fad9452cd8d636 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 20 Jan 2020 07:55:15 +0000 Subject: [PATCH 046/381] Bump handlebars from 4.7.1 to 4.7.2 Bumps [handlebars](https://github.com/wycats/handlebars.js) from 4.7.1 to 4.7.2. - [Release notes](https://github.com/wycats/handlebars.js/releases) - [Changelog](https://github.com/wycats/handlebars.js/blob/master/release-notes.md) - [Commits](https://github.com/wycats/handlebars.js/compare/v4.7.1...v4.7.2) Signed-off-by: dependabot-preview[bot] --- package-lock.json | 6 +++--- package.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 15a0ac9028..1de758382f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6883,9 +6883,9 @@ "dev": true }, "handlebars": { - "version": "4.7.1", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.1.tgz", - "integrity": "sha512-2dd6soo60cwKNJ90VewNLIzdZPR/E2YhszOTgHpN9V0YuwZk7x33/iZoIBnASwDFVHMY7iJ6NPL8d9f/DWYCTA==", + "version": "4.7.2", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.2.tgz", + "integrity": "sha512-4PwqDL2laXtTWZghzzCtunQUTLbo31pcCJrd/B/9JP8XbhVzpS5ZXuKqlOzsd1rtcaLo4KqAn8nl8mkknS4MHw==", "dev": true, "requires": { "neo-async": "^2.6.0", diff --git a/package.json b/package.json index 20f5b239ce..5af8107a2a 100644 --- a/package.json +++ b/package.json @@ -63,7 +63,7 @@ "fs-extra": "^8.0.0", "glob": "^7.1.5", "globby": "^11.0.0", - "handlebars": "4.7.1", + "handlebars": "4.7.2", "html-to-image": "^0.1.0", "istanbul": "0.4.5", "istanbul-instrumenter-loader": "^3.0.1", From c221cc7a46124144c26d5325337bf790001563f7 Mon Sep 17 00:00:00 2001 From: mike-000 <49240900+mike-000@users.noreply.github.com> Date: Mon, 20 Jan 2020 10:24:57 +0000 Subject: [PATCH 047/381] Convert any html character codes in labels reuse single textarea element --- src/ol/format/KML.js | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/ol/format/KML.js b/src/ol/format/KML.js index 2773f53392..e77f33afc1 100644 --- a/src/ol/format/KML.js +++ b/src/ol/format/KML.js @@ -378,6 +378,11 @@ function createStyleDefaults() { } +/** + * @type {HTMLElement} + */ +let TEXTAREA; + /** * @typedef {Object} Options @@ -948,9 +953,11 @@ function createFeatureStyleFunction(style, styleUrl, defaultStyle, sharedStyles, drawName = drawName && !!name; // convert any html character codes if (drawName && name.search(/&[^&]+;/) > -1) { - const text = document.createElement('textarea'); - text.innerHTML = name; - name = text.value; + if (!TEXTAREA) { + TEXTAREA = document.createElement('textarea'); + } + TEXTAREA.innerHTML = name; + name = TEXTAREA.value; } } From 83d65b61e16bac0880e09b016da24743cebf4bbd Mon Sep 17 00:00:00 2001 From: mike-000 <49240900+mike-000@users.noreply.github.com> Date: Mon, 20 Jan 2020 10:30:44 +0000 Subject: [PATCH 048/381] Convert any html character codes in labels fix typedef --- src/ol/format/KML.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ol/format/KML.js b/src/ol/format/KML.js index e77f33afc1..d29ef7b4f4 100644 --- a/src/ol/format/KML.js +++ b/src/ol/format/KML.js @@ -379,7 +379,7 @@ function createStyleDefaults() { } /** - * @type {HTMLElement} + * @type {Textarea} */ let TEXTAREA; From 5830a361316b06b2deb5978d639238836e55e397 Mon Sep 17 00:00:00 2001 From: mike-000 <49240900+mike-000@users.noreply.github.com> Date: Mon, 20 Jan 2020 10:37:04 +0000 Subject: [PATCH 049/381] Convert any html character codes in labels fix typedef --- src/ol/format/KML.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ol/format/KML.js b/src/ol/format/KML.js index d29ef7b4f4..77dc5a7aff 100644 --- a/src/ol/format/KML.js +++ b/src/ol/format/KML.js @@ -379,7 +379,7 @@ function createStyleDefaults() { } /** - * @type {Textarea} + * @type {HTMLTextAreaElement} */ let TEXTAREA; From 4db204698eb97bd3cd401244aae62767931a3d14 Mon Sep 17 00:00:00 2001 From: Andreas Hocevar Date: Tue, 21 Jan 2020 22:27:28 +0100 Subject: [PATCH 050/381] More compatible way of exporting a map as pdf --- examples/export-pdf.js | 42 +++++++++++++++++++++--------------------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/examples/export-pdf.js b/examples/export-pdf.js index b37d23cc5e..125c95d05d 100644 --- a/examples/export-pdf.js +++ b/examples/export-pdf.js @@ -4,8 +4,6 @@ import WKT from '../src/ol/format/WKT.js'; import {Tile as TileLayer, Vector as VectorLayer} from '../src/ol/layer.js'; import {OSM, Vector as VectorSource} from '../src/ol/source.js'; -import {toJpeg} from 'html-to-image'; - const raster = new TileLayer({ source: new OSM() }); @@ -44,14 +42,6 @@ const dims = { }; -// export options for html-to-image. -// See: https://github.com/bubkoo/html-to-image#options -const exportOptions = { - filter: function(element) { - return element.className.indexOf('ol-control') === -1; - } -}; - const exportButton = document.getElementById('export-pdf'); exportButton.addEventListener('click', function() { @@ -68,18 +58,28 @@ exportButton.addEventListener('click', function() { const viewResolution = map.getView().getResolution(); map.once('rendercomplete', function() { - exportOptions.width = width; - exportOptions.height = height; - toJpeg(map.getViewport(), exportOptions).then(function(dataUrl) { - const pdf = new jsPDF('landscape', undefined, format); - pdf.addImage(dataUrl, 'JPEG', 0, 0, dim[0], dim[1]); - pdf.save('map.pdf'); - // Reset original map size - map.setSize(size); - map.getView().setResolution(viewResolution); - exportButton.disabled = false; - document.body.style.cursor = 'auto'; + const mapCanvas = document.createElement('canvas'); + mapCanvas.width = width; + mapCanvas.height = height; + const mapContext = mapCanvas.getContext('2d'); + document.querySelectorAll('.ol-layer canvas').forEach(function(canvas) { + if (canvas.width > 0) { + const transform = canvas.style.transform; + // Get the transform parameters from the style's transform matrix + const matrix = transform.match(/^matrix\(([^\(]*)\)$/)[1].split(',').map(Number); + // Apply the transform to the export map context + CanvasRenderingContext2D.prototype.setTransform.apply(mapContext, matrix); + mapContext.drawImage(canvas, 0, 0); + } }); + const pdf = new jsPDF('landscape', undefined, format); + pdf.addImage(mapCanvas.toDataURL('image/jpeg'), 'JPEG', 0, 0, dim[0], dim[1]); + pdf.save('map.pdf'); + // Reset original map size + map.setSize(size); + map.getView().setResolution(viewResolution); + exportButton.disabled = false; + document.body.style.cursor = 'auto'; }); // Set print size From 3a5c8d637cc3069987b061f67c91108bd8feaf78 Mon Sep 17 00:00:00 2001 From: Vincent Lecrubier Date: Tue, 21 Jan 2020 20:50:33 +0000 Subject: [PATCH 051/381] Zoomify: Separate the service pixel ratio and the device pixel ratio --- examples/zoomify.html | 1 - examples/zoomify.js | 103 +++++++++------------------------------ src/ol/source/Zoomify.js | 6 ++- 3 files changed, 27 insertions(+), 83 deletions(-) diff --git a/examples/zoomify.html b/examples/zoomify.html index d5b18997ca..fb7503d075 100644 --- a/examples/zoomify.html +++ b/examples/zoomify.html @@ -10,7 +10,6 @@ tags: "zoomify, deep zoom, IIP, pixel, projection"
diff --git a/examples/zoomify.js b/examples/zoomify.js index 19c469dfdf..0da330b013 100644 --- a/examples/zoomify.js +++ b/examples/zoomify.js @@ -3,17 +3,13 @@ import View from '../src/ol/View.js'; import TileLayer from '../src/ol/layer/Tile.js'; import Zoomify from '../src/ol/source/Zoomify.js'; -const imgWidth = 9911; -const imgHeight = 6100; +const imgWidth = 4000; +const imgHeight = 3000; -const zoomifyUrl = 'http://vips.vtech.fr/cgi-bin/iipsrv.fcgi?zoomify=' + - '/mnt/MD1/AD00/plan_CHU-4HD-01/FOND.TIF/'; -const iipUrl = 'http://vips.vtech.fr/cgi-bin/iipsrv.fcgi?FIF=' + '/mnt/MD1/AD00/plan_CHU-4HD-01/FOND.TIF' + '&JTL={z},{tileIndex}'; +const zoomifyUrl = 'https://ol-zoomify.surge.sh/zoomify/'; const layer = new TileLayer({ source: new Zoomify({ - tileSize: 256, - tilePixelRatio: 1, url: zoomifyUrl, size: [imgWidth, imgHeight], crossOrigin: 'anonymous' @@ -22,17 +18,15 @@ const layer = new TileLayer({ const extent = [0, -imgHeight, imgWidth, 0]; -const resolutions = layer.getSource().getTileGrid().getResolutions(); - const map = new Map({ layers: [layer], target: 'map', view: new View({ // adjust zoom levels to those provided by the source - minResolution: resolutions[resolutions.length - 1], - maxResolution: resolutions[0], + resolutions: layer.getSource().getTileGrid().getResolutions(), // constrain the center: center cannot be set outside this extent - extent: extent + extent: extent, + constrainOnlyCenter: true }) }); map.getView().fit(extent); @@ -40,74 +34,23 @@ map.getView().fit(extent); const control = document.getElementById('zoomifyProtocol'); control.addEventListener('change', function(event) { const value = event.currentTarget.value; - if (value === 'iip') { - const extent = [0, -imgHeight, imgWidth, 0]; - layer.setSource( - new Zoomify({ - tileSize: 256, - tilePixelRatio: 1, - url: iipUrl, - size: [imgWidth, imgHeight], - crossOrigin: 'anonymous' - }) - ); - const resolutions = layer.getSource().getTileGrid().getResolutions(); - map.setView( - new View({ - // adjust zoom levels to those provided by the source - minResolution: resolutions[resolutions.length - 1], - maxResolution: resolutions[0], - // constrain the center: center cannot be set outside this extent - extent: extent - }) - ); - map.getView().fit(extent); - } else if (value === 'zoomify') { - const extent = [0, -imgHeight, imgWidth, 0]; - layer.setSource( - new Zoomify({ - tileSize: 256, - tilePixelRatio: 1, - url: zoomifyUrl, - size: [imgWidth, imgHeight], - crossOrigin: 'anonymous' - }) - ); - const resolutions = layer.getSource().getTileGrid().getResolutions(); - map.setView( - new View({ - // adjust zoom levels to those provided by the source - minResolution: resolutions[resolutions.length - 1], - maxResolution: resolutions[0], - // constrain the center: center cannot be set outside this extent - extent: extent - }) - ); - map.getView().fit(extent); + if (value === 'zoomify') { + layer.setSource(new Zoomify({ + url: zoomifyUrl, + size: [imgWidth, imgHeight], + crossOrigin: 'anonymous' + })); } else if (value === 'zoomifyretina') { - const pixelRatio = 4; - // Be careful! Image extent will be modified by pixel ratio - const extent = [0, -imgHeight / pixelRatio, imgWidth / pixelRatio, 0]; - layer.setSource( - new Zoomify({ - tileSize: 256 / pixelRatio, - tilePixelRatio: pixelRatio, - url: zoomifyUrl, - size: [imgWidth / pixelRatio, imgHeight / pixelRatio], - crossOrigin: 'anonymous' - }) - ); - const resolutions = layer.getSource().getTileGrid().getResolutions(); - map.setView( - new View({ - // adjust zoom levels to those provided by the source - minResolution: resolutions[resolutions.length - 1] / pixelRatio, - maxResolution: resolutions[0], - // constrain the center: center cannot be set outside this extent - extent: extent - }) - ); - map.getView().fit(extent); + layer.setSource(new Zoomify({ + tileSize: 256, // The tile size is 256px on the server, this is the default value + tilePixelRatio: 2, // We want to display this on a retina screen + tilePixelRatioOriginal: 1, // But the server serves 256px tiles, not 512px tiles that would be needed nominally. + zDirection: -1, //Ensure we get the most precise tile in any case + url: zoomifyUrl, + size: [imgWidth, imgHeight], + crossOrigin: 'anonymous' + })); } - }); + + diff --git a/src/ol/source/Zoomify.js b/src/ol/source/Zoomify.js index 5a5bd2efa1..cc2ec00c34 100644 --- a/src/ol/source/Zoomify.js +++ b/src/ol/source/Zoomify.js @@ -90,7 +90,8 @@ export class CustomTile extends ImageTile { * you must provide a `crossOrigin` value you want to access pixel data with the Canvas renderer. * See https://developer.mozilla.org/en-US/docs/Web/HTML/CORS_enabled_image for more detail. * @property {import("../proj.js").ProjectionLike} [projection] Projection. - * @property {number} [tilePixelRatio] The pixel ratio used by the tile service. For example, if the tile service advertizes 256px by 256px tiles but actually sends 512px by 512px images (for retina/hidpi devices) then `tilePixelRatio` should be set to `2` + * @property {number} [tilePixelRatio] The pixel ratio to display on screen. If on a retina screen then `tilePixelRatio` should be 2, else it should be 1. + * @property {number} [tilePixelRatioOriginal] The pixel ratio used by the tile service. For example, if the tile service advertizes 256px by 256px tiles but actually sends 512px by 512px images (for retina/hidpi devices) then `tilePixelRatioOriginal` should be set to `2` * @property {number} [reprojectionErrorThreshold=0.5] Maximum allowed reprojection error (in pixels). * Higher values can increase reprojection performance, but decrease precision. * @property {string} [url] URL template or base URL of the Zoomify service. @@ -147,6 +148,7 @@ class Zoomify extends TileImage { const tierSizeInTiles = []; const tileSize = options.tileSize || DEFAULT_TILE_SIZE; const tilePixelRatio = options.tilePixelRatio || 1; + const tilePixelRatioOriginal = options.tilePixelRatioOriginal || tilePixelRatio; let tileSizeForTierSizeCalculation = tileSize; switch (tierSizeCalculation) { @@ -246,7 +248,7 @@ class Zoomify extends TileImage { const tileUrlFunction = createFromTileUrlFunctions(urls.map(createFromTemplate)); - const ZoomifyTileClass = CustomTile.bind(null, tilePixelRatio, tileGrid); + const ZoomifyTileClass = CustomTile.bind(null, tilePixelRatioOriginal, tileGrid); super({ attributions: options.attributions, From 89c5364b2f869c5210dd56952045fb678e67c63d Mon Sep 17 00:00:00 2001 From: Andreas Hocevar Date: Fri, 24 Jan 2020 13:50:02 +0100 Subject: [PATCH 052/381] Use correct extent for the vector image --- src/ol/renderer/canvas/VectorImageLayer.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/ol/renderer/canvas/VectorImageLayer.js b/src/ol/renderer/canvas/VectorImageLayer.js index fdda1d0129..6f85052a20 100644 --- a/src/ol/renderer/canvas/VectorImageLayer.js +++ b/src/ol/renderer/canvas/VectorImageLayer.js @@ -105,6 +105,7 @@ class CanvasVectorImageLayerRenderer extends CanvasImageLayerRenderer { const context = vectorRenderer.context; const imageFrameState = /** @type {import("../../PluggableMap.js").FrameState} */ (assign({}, frameState, { declutterItems: [], + extent: renderedExtent, size: [width, height], viewState: /** @type {import("../../View.js").State} */ (assign({}, frameState.viewState, { rotation: 0 From 8c89ddceca3712780fee996aa2dbd3589d859118 Mon Sep 17 00:00:00 2001 From: Vincent Lecrubier Date: Fri, 24 Jan 2020 15:33:42 +0000 Subject: [PATCH 053/381] Revert #9489 and solves retina tiles on zoomify apparently. --- examples/zoomify.js | 11 +++++------ src/ol/source/Zoomify.js | 26 ++++++++++---------------- 2 files changed, 15 insertions(+), 22 deletions(-) diff --git a/examples/zoomify.js b/examples/zoomify.js index 0da330b013..047dbd1146 100644 --- a/examples/zoomify.js +++ b/examples/zoomify.js @@ -38,17 +38,16 @@ control.addEventListener('change', function(event) { layer.setSource(new Zoomify({ url: zoomifyUrl, size: [imgWidth, imgHeight], - crossOrigin: 'anonymous' + crossOrigin: 'anonymous', + zDirection: -1 // Ensure we get the most precise tile in any case })); } else if (value === 'zoomifyretina') { layer.setSource(new Zoomify({ - tileSize: 256, // The tile size is 256px on the server, this is the default value - tilePixelRatio: 2, // We want to display this on a retina screen - tilePixelRatioOriginal: 1, // But the server serves 256px tiles, not 512px tiles that would be needed nominally. - zDirection: -1, //Ensure we get the most precise tile in any case url: zoomifyUrl, size: [imgWidth, imgHeight], - crossOrigin: 'anonymous' + crossOrigin: 'anonymous', + zDirection: -1, // Ensure we get the most precise tile in any case + tilePixelRatio: 2 // Display retina tiles })); } }); diff --git a/src/ol/source/Zoomify.js b/src/ol/source/Zoomify.js index cc2ec00c34..e42ebaddeb 100644 --- a/src/ol/source/Zoomify.js +++ b/src/ol/source/Zoomify.js @@ -26,7 +26,6 @@ const TierSizeCalculation = { export class CustomTile extends ImageTile { /** - * @param {number} tilePixelRatio Tile pixel ratio to display the tile * @param {import("../tilegrid/TileGrid.js").default} tileGrid TileGrid that the tile belongs to. * @param {import("../tilecoord.js").TileCoord} tileCoord Tile coordinate. * @param {TileState} state State. @@ -35,7 +34,8 @@ export class CustomTile extends ImageTile { * @param {import("../Tile.js").LoadFunction} tileLoadFunction Tile load function. * @param {import("../Tile.js").Options=} opt_options Tile options. */ - constructor(tilePixelRatio, tileGrid, tileCoord, state, src, crossOrigin, tileLoadFunction, opt_options) { + constructor(tileGrid, tileCoord, state, src, crossOrigin, tileLoadFunction, opt_options) { + super(tileCoord, state, src, crossOrigin, tileLoadFunction, opt_options); /** @@ -48,11 +48,8 @@ export class CustomTile extends ImageTile { * @private * @type {import("../size.js").Size} */ - this.tileSize_ = toSize(tileGrid.getTileSize(tileCoord[0])).map( - function(x) { - return x * tilePixelRatio; - } - ); + this.tileSize_ = toSize(tileGrid.getTileSize(tileCoord[0])); + } /** @@ -90,8 +87,7 @@ export class CustomTile extends ImageTile { * you must provide a `crossOrigin` value you want to access pixel data with the Canvas renderer. * See https://developer.mozilla.org/en-US/docs/Web/HTML/CORS_enabled_image for more detail. * @property {import("../proj.js").ProjectionLike} [projection] Projection. - * @property {number} [tilePixelRatio] The pixel ratio to display on screen. If on a retina screen then `tilePixelRatio` should be 2, else it should be 1. - * @property {number} [tilePixelRatioOriginal] The pixel ratio used by the tile service. For example, if the tile service advertizes 256px by 256px tiles but actually sends 512px by 512px images (for retina/hidpi devices) then `tilePixelRatioOriginal` should be set to `2` + * @property {number} [tilePixelRatio] The pixel ratio used by the tile service. For example, if the tile service advertizes 256px by 256px tiles but actually sends 512px by 512px images (for retina/hidpi devices) then `tilePixelRatio` should be set to `2` * @property {number} [reprojectionErrorThreshold=0.5] Maximum allowed reprojection error (in pixels). * Higher values can increase reprojection performance, but decrease precision. * @property {string} [url] URL template or base URL of the Zoomify service. @@ -115,8 +111,8 @@ export class CustomTile extends ImageTile { * @property {number} [transition] Duration of the opacity transition for rendering. * To disable the opacity transition, pass `transition: 0`. * @property {number} [tileSize=256] Tile size. Same tile size is used for all zoom levels. - * @property {number} [zDirection=0] Indicate which resolution should be used - * by a renderer if the view resolution does not match any resolution of the tile source. + * @property {number} [zDirection] Indicate which resolution should be used + * by a renderer if the views resolution does not match any resolution of the tile source. * If 0, the nearest resolution will be used. If 1, the nearest lower resolution * will be used. If -1, the nearest higher resolution will be used. */ @@ -147,8 +143,6 @@ class Zoomify extends TileImage { const extent = options.extent || [0, -size[1], size[0], 0]; const tierSizeInTiles = []; const tileSize = options.tileSize || DEFAULT_TILE_SIZE; - const tilePixelRatio = options.tilePixelRatio || 1; - const tilePixelRatioOriginal = options.tilePixelRatioOriginal || tilePixelRatio; let tileSizeForTierSizeCalculation = tileSize; switch (tierSizeCalculation) { @@ -248,14 +242,14 @@ class Zoomify extends TileImage { const tileUrlFunction = createFromTileUrlFunctions(urls.map(createFromTemplate)); - const ZoomifyTileClass = CustomTile.bind(null, tilePixelRatioOriginal, tileGrid); + const ZoomifyTileClass = CustomTile.bind(null, tileGrid); super({ attributions: options.attributions, cacheSize: options.cacheSize, crossOrigin: options.crossOrigin, projection: options.projection, - tilePixelRatio: tilePixelRatio, + tilePixelRatio: options.tilePixelRatio, reprojectionErrorThreshold: options.reprojectionErrorThreshold, tileClass: ZoomifyTileClass, tileGrid: tileGrid, @@ -272,4 +266,4 @@ class Zoomify extends TileImage { } -export default Zoomify; +export default Zoomify; \ No newline at end of file From e11db6de440308fe5038be3c07a7f7f62566a87c Mon Sep 17 00:00:00 2001 From: mike-000 <49240900+mike-000@users.noreply.github.com> Date: Fri, 24 Jan 2020 15:49:08 +0000 Subject: [PATCH 054/381] Replace Bing layer with MapTiler --- examples/drag-and-drop-image-vector.js | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/examples/drag-and-drop-image-vector.js b/examples/drag-and-drop-image-vector.js index 6b0fb4a3c2..56491c33dd 100644 --- a/examples/drag-and-drop-image-vector.js +++ b/examples/drag-and-drop-image-vector.js @@ -3,7 +3,7 @@ import View from '../src/ol/View.js'; import {GPX, GeoJSON, IGC, KML, TopoJSON} from '../src/ol/format.js'; import {defaults as defaultInteractions, DragAndDrop} from '../src/ol/interaction.js'; import {VectorImage as VectorImageLayer, Tile as TileLayer} from '../src/ol/layer.js'; -import {BingMaps, Vector as VectorSource} from '../src/ol/source.js'; +import {XYZ, Vector as VectorSource} from '../src/ol/source.js'; const dragAndDropInteraction = new DragAndDrop({ formatConstructors: [ @@ -15,13 +15,18 @@ const dragAndDropInteraction = new DragAndDrop({ ] }); +const key = 'get_your_own_D6rA4zTHduk6KOKTXzGB'; +const attributions = '© MapTiler ' + + '© OpenStreetMap contributors'; + const map = new Map({ interactions: defaultInteractions().extend([dragAndDropInteraction]), layers: [ new TileLayer({ - source: new BingMaps({ - imagerySet: 'Aerial', - key: 'As1HiMj1PvLPlqc_gtM7AqZfBL8ZL3VrjaS3zIb22Uvb9WKhuJObROC-qUpa81U5' + source: new XYZ({ + attributions: attributions, + url: 'https://api.maptiler.com/tiles/satellite/{z}/{x}/{y}.jpg?key=' + key, + maxZoom: 20 }) }) ], From 1eac18f94a6dc91aa0dfc4cf6953e82fa790c1be Mon Sep 17 00:00:00 2001 From: mike-000 <49240900+mike-000@users.noreply.github.com> Date: Fri, 24 Jan 2020 15:51:41 +0000 Subject: [PATCH 055/381] Replace Bing layer with MapTiler --- examples/drag-and-drop.html | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/examples/drag-and-drop.html b/examples/drag-and-drop.html index 41c82fd81e..c8f0772329 100644 --- a/examples/drag-and-drop.html +++ b/examples/drag-and-drop.html @@ -4,10 +4,10 @@ title: Drag-and-Drop shortdesc: Example of using the drag-and-drop interaction. docs: > Example of using the drag-and-drop interaction. Drag and drop GPX, GeoJSON, IGC, KML, or TopoJSON files on to the map. There is no projection transform support, so this will only work with data in EPSG:4326 and EPSG:3857. -tags: "drag-and-drop, gpx, geojson, igc, kml, topojson" +tags: "drag-and-drop, gpx, geojson, igc, kml, topojson, maptiler" cloak: - - key: As1HiMj1PvLPlqc_gtM7AqZfBL8ZL3VrjaS3zIb22Uvb9WKhuJObROC-qUpa81U5 - value: Your Bing Maps Key from http://www.bingmapsportal.com/ here + - key: get_your_own_D6rA4zTHduk6KOKTXzGB + value: Get your own API key at https://www.maptiler.com/cloud/ ---
 
From c9c616bd6fdde92c2ab725a9a3737827b8dc3fe0 Mon Sep 17 00:00:00 2001 From: mike-000 <49240900+mike-000@users.noreply.github.com> Date: Fri, 24 Jan 2020 16:31:08 +0000 Subject: [PATCH 056/381] Replace Bing layer with MapTiler --- examples/drag-and-drop.js | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/examples/drag-and-drop.js b/examples/drag-and-drop.js index 3ed202752c..d8b04b100b 100644 --- a/examples/drag-and-drop.js +++ b/examples/drag-and-drop.js @@ -15,13 +15,18 @@ const dragAndDropInteraction = new DragAndDrop({ ] }); +const key = 'get_your_own_D6rA4zTHduk6KOKTXzGB'; +const attributions = '© MapTiler ' + + '© OpenStreetMap contributors'; + const map = new Map({ interactions: defaultInteractions().extend([dragAndDropInteraction]), layers: [ new TileLayer({ - source: new BingMaps({ - imagerySet: 'Aerial', - key: 'As1HiMj1PvLPlqc_gtM7AqZfBL8ZL3VrjaS3zIb22Uvb9WKhuJObROC-qUpa81U5' + source: new XYZ({ + attributions: attributions, + url: 'https://api.maptiler.com/tiles/satellite/{z}/{x}/{y}.jpg?key=' + key, + maxZoom: 20 }) }) ], From a9e738c919f8e757b324ab9109bf8b24d3fd16a5 Mon Sep 17 00:00:00 2001 From: mike-000 <49240900+mike-000@users.noreply.github.com> Date: Fri, 24 Jan 2020 16:33:34 +0000 Subject: [PATCH 057/381] Replace Bing layer with MapTiler --- examples/drag-and-drop-image-vector.html | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/examples/drag-and-drop-image-vector.html b/examples/drag-and-drop-image-vector.html index f6f791278f..2c0e0eab50 100644 --- a/examples/drag-and-drop-image-vector.html +++ b/examples/drag-and-drop-image-vector.html @@ -4,10 +4,10 @@ title: Drag-and-Drop Image Vector shortdesc: Example of using the drag-and-drop interaction with image vector rendering. docs: > Example of using the drag-and-drop interaction with an `ol/layer/VectorImage` layer. Drag and drop GPX, GeoJSON, IGC, KML, or TopoJSON files on to the map. Each file is rendered to an image on the client. -tags: "drag-and-drop-image-vector, gpx, geojson, igc, kml, topojson, vector, image" +tags: "drag-and-drop-image-vector, gpx, geojson, igc, kml, topojson, maptiler, vector, image" cloak: - - key: As1HiMj1PvLPlqc_gtM7AqZfBL8ZL3VrjaS3zIb22Uvb9WKhuJObROC-qUpa81U5 - value: Your Bing Maps Key from http://www.bingmapsportal.com/ here + - key: get_your_own_D6rA4zTHduk6KOKTXzGB + value: Get your own API key at https://www.maptiler.com/cloud/ ---
 
From 96ebacca1fb726c12dc5af2158aef2b436fe4526 Mon Sep 17 00:00:00 2001 From: mike-000 <49240900+mike-000@users.noreply.github.com> Date: Fri, 24 Jan 2020 16:34:43 +0000 Subject: [PATCH 058/381] Replace Bing layer with MapTiler --- examples/drag-and-drop.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/drag-and-drop.js b/examples/drag-and-drop.js index d8b04b100b..0f407fec82 100644 --- a/examples/drag-and-drop.js +++ b/examples/drag-and-drop.js @@ -3,7 +3,7 @@ import View from '../src/ol/View.js'; import {GPX, GeoJSON, IGC, KML, TopoJSON} from '../src/ol/format.js'; import {defaults as defaultInteractions, DragAndDrop} from '../src/ol/interaction.js'; import {Tile as TileLayer, Vector as VectorLayer} from '../src/ol/layer.js'; -import {BingMaps, Vector as VectorSource} from '../src/ol/source.js'; +import {XYZ, Vector as VectorSource} from '../src/ol/source.js'; const dragAndDropInteraction = new DragAndDrop({ formatConstructors: [ From 1ee03decdd66409094e3ea47ee05ac3a46c755da Mon Sep 17 00:00:00 2001 From: Andreas Hocevar Date: Fri, 24 Jan 2020 16:05:58 +0100 Subject: [PATCH 059/381] Assert each layer is only added to the map once --- doc/errors/index.md | 4 ++++ src/ol/layer/Layer.js | 9 ++++++++- test/spec/ol/layer/layer.test.js | 4 ++-- 3 files changed, 14 insertions(+), 3 deletions(-) diff --git a/doc/errors/index.md b/doc/errors/index.md index a762cfa599..e45f47bd3b 100644 --- a/doc/errors/index.md +++ b/doc/errors/index.md @@ -245,3 +245,7 @@ Layer opacity must be a number. `forEachFeatureAtCoordinate` cannot be used on a WebGL layer if the hit detection logic has not been enabled. This is done by providing adequate shaders using the `hitVertexShader` and `hitFragmentShader` properties of `WebGLPointsLayerRenderer`. + +### 67 + +A layer can only be added to the map once. Use either `layer.setMap()` or `map.addLayer()`, not both. \ No newline at end of file diff --git a/src/ol/layer/Layer.js b/src/ol/layer/Layer.js index bef87a803e..4d3d846845 100644 --- a/src/ol/layer/Layer.js +++ b/src/ol/layer/Layer.js @@ -9,6 +9,7 @@ import LayerProperty from './Property.js'; import {assign} from '../obj.js'; import RenderEventType from '../render/EventType.js'; import SourceState from '../source/State.js'; +import {assert} from '../asserts.js'; /** * @typedef {function(import("../PluggableMap.js").FrameState):HTMLElement} RenderFunction @@ -243,7 +244,13 @@ class Layer extends BaseLayer { if (map) { this.mapPrecomposeKey_ = listen(map, RenderEventType.PRECOMPOSE, function(evt) { const renderEvent = /** @type {import("../render/Event.js").default} */ (evt); - renderEvent.frameState.layerStatesArray.push(this.getLayerState(false)); + const layerStatesArray = renderEvent.frameState.layerStatesArray; + const layerState = this.getLayerState(false); + // A layer can only be added to the map once. Use either `layer.setMap()` or `map.addLayer()`, not both. + assert(!layerStatesArray.some(function(arrayLayerState) { + return arrayLayerState.layer === layerState.layer; + }), 67); + layerStatesArray.push(layerState); }, this); this.mapRenderKey_ = listen(this, EventType.CHANGE, map.render, map); this.changed(); diff --git a/test/spec/ol/layer/layer.test.js b/test/spec/ol/layer/layer.test.js index eb090511ac..f7c3aeb13e 100644 --- a/test/spec/ol/layer/layer.test.js +++ b/test/spec/ol/layer/layer.test.js @@ -631,8 +631,7 @@ describe('ol.layer.Layer', function() { map: map }); frameState = { - layerStatesArray: [], - layerStates: {} + layerStatesArray: [] }; }); @@ -651,6 +650,7 @@ describe('ol.layer.Layer', function() { layer.setZIndex(index); map.dispatchEvent(new RenderEvent('precompose', null, frameState, null)); const layerState = frameState.layerStatesArray[0]; + frameState.layerStatesArray.length = 0; expect(layerState.zIndex).to.be(index); }); }); From 23d441f9f27469b1bac9ec1aaf8e62ea2e885c3f Mon Sep 17 00:00:00 2001 From: Andreas Hocevar Date: Sat, 25 Jan 2020 14:24:12 +0100 Subject: [PATCH 060/381] Handle tileSize and tilePixelRatio properly --- examples/zoomify.js | 41 ++++++++++++++++++++-------------------- src/ol/source/IIIF.js | 7 +++++-- src/ol/source/Zoomify.js | 29 +++++++++++++--------------- 3 files changed, 39 insertions(+), 38 deletions(-) diff --git a/examples/zoomify.js b/examples/zoomify.js index 047dbd1146..47a32ae0db 100644 --- a/examples/zoomify.js +++ b/examples/zoomify.js @@ -8,15 +8,27 @@ const imgHeight = 3000; const zoomifyUrl = 'https://ol-zoomify.surge.sh/zoomify/'; -const layer = new TileLayer({ - source: new Zoomify({ - url: zoomifyUrl, - size: [imgWidth, imgHeight], - crossOrigin: 'anonymous' - }) +const source = new Zoomify({ + url: zoomifyUrl, + size: [imgWidth, imgHeight], + crossOrigin: 'anonymous', + zDirection: -1 // Ensure we get a tile with the screen resolution or higher +}); +const extent = source.getTileGrid().getExtent(); + +const retinaPixelRatio = 2; +const retinaSource = new Zoomify({ + url: zoomifyUrl, + size: [imgWidth, imgHeight], + crossOrigin: 'anonymous', + zDirection: -1, // Ensure we get a tile with the screen resolution or higher + tilePixelRatio: retinaPixelRatio, // Display retina tiles + tileSize: 256 / retinaPixelRatio // from a higher zoom level }); -const extent = [0, -imgHeight, imgWidth, 0]; +const layer = new TileLayer({ + source: source +}); const map = new Map({ layers: [layer], @@ -35,20 +47,9 @@ const control = document.getElementById('zoomifyProtocol'); control.addEventListener('change', function(event) { const value = event.currentTarget.value; if (value === 'zoomify') { - layer.setSource(new Zoomify({ - url: zoomifyUrl, - size: [imgWidth, imgHeight], - crossOrigin: 'anonymous', - zDirection: -1 // Ensure we get the most precise tile in any case - })); + layer.setSource(source); } else if (value === 'zoomifyretina') { - layer.setSource(new Zoomify({ - url: zoomifyUrl, - size: [imgWidth, imgHeight], - crossOrigin: 'anonymous', - zDirection: -1, // Ensure we get the most precise tile in any case - tilePixelRatio: 2 // Display retina tiles - })); + layer.setSource(retinaSource); } }); diff --git a/src/ol/source/IIIF.js b/src/ol/source/IIIF.js index 2fb4014673..8370a936f3 100644 --- a/src/ol/source/IIIF.js +++ b/src/ol/source/IIIF.js @@ -9,6 +9,7 @@ import {Versions} from '../format/IIIFInfo.js'; import {assert} from '../asserts.js'; import TileGrid from '../tilegrid/TileGrid.js'; import TileImage from './TileImage.js'; +import {toSize} from '../size.js'; /** * @typedef {Object} Options @@ -87,7 +88,7 @@ class IIIF extends TileImage { const extent = options.extent || [0, -height, width, 0]; const supportsListedSizes = sizes != undefined && Array.isArray(sizes) && sizes.length > 0; - const supportsListedTiles = tileSize != undefined && (typeof tileSize === 'number' && Number.isInteger(tileSize) && tileSize > 0 || Array.isArray(tileSize) && tileSize.length > 0); + const supportsListedTiles = tileSize !== undefined && (typeof tileSize === 'number' && Number.isInteger(tileSize) && tileSize > 0 || Array.isArray(tileSize) && tileSize.length > 0); const supportsArbitraryTiling = supports != undefined && Array.isArray(supports) && (supports.includes('regionByPx') || supports.includes('regionByPct')) && (supports.includes('sizeByWh') || supports.includes('sizeByH') || @@ -265,7 +266,9 @@ class IIIF extends TileImage { return baseUrl + regionParam + '/' + sizeParam + '/0/' + quality + '.' + format; }; - const IiifTileClass = CustomTile.bind(null, tilePixelRatio, tileGrid); + const IiifTileClass = CustomTile.bind(null, toSize(tileSize || 256).map(function(size) { + return size * tilePixelRatio; + })); super({ attributions: options.attributions, diff --git a/src/ol/source/Zoomify.js b/src/ol/source/Zoomify.js index e42ebaddeb..509a7e0ae2 100644 --- a/src/ol/source/Zoomify.js +++ b/src/ol/source/Zoomify.js @@ -8,7 +8,6 @@ import TileState from '../TileState.js'; import {expandUrl, createFromTileUrlFunctions} from '../tileurlfunction.js'; import {assert} from '../asserts.js'; import {createCanvasContext2D} from '../dom.js'; -import {getTopLeft} from '../extent.js'; import {toSize} from '../size.js'; import TileImage from './TileImage.js'; import TileGrid from '../tilegrid/TileGrid.js'; @@ -26,7 +25,7 @@ const TierSizeCalculation = { export class CustomTile extends ImageTile { /** - * @param {import("../tilegrid/TileGrid.js").default} tileGrid TileGrid that the tile belongs to. + * @param {import("../size.js").Size} tileSize Full tile size. * @param {import("../tilecoord.js").TileCoord} tileCoord Tile coordinate. * @param {TileState} state State. * @param {string} src Image source URI. @@ -34,7 +33,7 @@ export class CustomTile extends ImageTile { * @param {import("../Tile.js").LoadFunction} tileLoadFunction Tile load function. * @param {import("../Tile.js").Options=} opt_options Tile options. */ - constructor(tileGrid, tileCoord, state, src, crossOrigin, tileLoadFunction, opt_options) { + constructor(tileSize, tileCoord, state, src, crossOrigin, tileLoadFunction, opt_options) { super(tileCoord, state, src, crossOrigin, tileLoadFunction, opt_options); @@ -45,10 +44,9 @@ export class CustomTile extends ImageTile { this.zoomifyImage_ = null; /** - * @private * @type {import("../size.js").Size} */ - this.tileSize_ = toSize(tileGrid.getTileSize(tileCoord[0])); + this.tileSize_ = tileSize; } @@ -138,12 +136,12 @@ class Zoomify extends TileImage { options.tierSizeCalculation : TierSizeCalculation.DEFAULT; + const tilePixelRatio = options.tilePixelRatio || 1; const imageWidth = size[0]; const imageHeight = size[1]; - const extent = options.extent || [0, -size[1], size[0], 0]; const tierSizeInTiles = []; const tileSize = options.tileSize || DEFAULT_TILE_SIZE; - let tileSizeForTierSizeCalculation = tileSize; + let tileSizeForTierSizeCalculation = tileSize * tilePixelRatio; switch (tierSizeCalculation) { case TierSizeCalculation.DEFAULT: @@ -175,10 +173,10 @@ class Zoomify extends TileImage { tierSizeInTiles.push([1, 1]); tierSizeInTiles.reverse(); - const resolutions = [1]; + const resolutions = [tilePixelRatio]; const tileCountUpToTier = [0]; for (let i = 1, ii = tierSizeInTiles.length; i < ii; i++) { - resolutions.push(1 << i); + resolutions.push(tilePixelRatio << i); tileCountUpToTier.push( tierSizeInTiles[i - 1][0] * tierSizeInTiles[i - 1][1] + tileCountUpToTier[i - 1] @@ -188,8 +186,7 @@ class Zoomify extends TileImage { const tileGrid = new TileGrid({ tileSize: tileSize, - extent: extent, - origin: getTopLeft(extent), + extent: options.extent || [0, -imageHeight, imageWidth, 0], resolutions: resolutions }); @@ -199,6 +196,8 @@ class Zoomify extends TileImage { } const urls = expandUrl(url); + const tileWidth = tileSize * tilePixelRatio; + /** * @param {string} template Template. * @return {import("../Tile.js").UrlFunction} Tile URL function. @@ -222,8 +221,6 @@ class Zoomify extends TileImage { const tileIndex = tileCoordX + tileCoordY * tierSizeInTiles[tileCoordZ][0]; - const tileSize = tileGrid.getTileSize(tileCoordZ); - const tileWidth = Array.isArray(tileSize) ? tileSize[0] : tileSize; const tileGroup = ((tileIndex + tileCountUpToTier[tileCoordZ]) / tileWidth) | 0; const localContext = { 'z': tileCoordZ, @@ -242,14 +239,14 @@ class Zoomify extends TileImage { const tileUrlFunction = createFromTileUrlFunctions(urls.map(createFromTemplate)); - const ZoomifyTileClass = CustomTile.bind(null, tileGrid); + const ZoomifyTileClass = CustomTile.bind(null, toSize(tileSize * tilePixelRatio)); super({ attributions: options.attributions, cacheSize: options.cacheSize, crossOrigin: options.crossOrigin, projection: options.projection, - tilePixelRatio: options.tilePixelRatio, + tilePixelRatio: tilePixelRatio, reprojectionErrorThreshold: options.reprojectionErrorThreshold, tileClass: ZoomifyTileClass, tileGrid: tileGrid, @@ -266,4 +263,4 @@ class Zoomify extends TileImage { } -export default Zoomify; \ No newline at end of file +export default Zoomify; From a7bdee43b310eb6f428204981bbbf760e01b76c7 Mon Sep 17 00:00:00 2001 From: mike-000 <49240900+mike-000@users.noreply.github.com> Date: Sun, 26 Jan 2020 13:51:11 +0000 Subject: [PATCH 061/381] Fix ol/layer/Graticule rendercomplete problem Use custom loading strategy to avoid problems caused by calling removeLoadedExtent in the loader function --- src/ol/layer/Graticule.js | 32 +++++++++++++++++++++++--------- 1 file changed, 23 insertions(+), 9 deletions(-) diff --git a/src/ol/layer/Graticule.js b/src/ol/layer/Graticule.js index 9287cbb7fc..9170814aa2 100644 --- a/src/ol/layer/Graticule.js +++ b/src/ol/layer/Graticule.js @@ -19,7 +19,6 @@ import {getCenter, intersects, equals, getIntersection, isEmpty} from '../extent import {clamp} from '../math.js'; import Style from '../style/Style.js'; import Feature from '../Feature.js'; -import {bbox} from '../loadingstrategy.js'; import {meridian, parallel} from '../geom/flat/geodesic.js'; import GeometryLayout from '../geom/GeometryLayout.js'; import Point from '../geom/Point.js'; @@ -391,7 +390,7 @@ class Graticule extends VectorLayer { this.setSource( new VectorSource({ loader: this.loaderFunction.bind(this), - strategy: bbox, + strategy: this.strategyFunction.bind(this), features: new Collection(), overlaps: false, useSpatialIndex: false, @@ -414,6 +413,11 @@ class Graticule extends VectorLayer { stroke: this.strokeStyle_ }); + /** + * @type {?import("../extent.js").Extent} + */ + this.loadedExtent_ = null; + /** * @type {?import("../extent.js").Extent} */ @@ -421,7 +425,21 @@ class Graticule extends VectorLayer { this.setRenderOrder(null); - this.tmpExtent_ = null; + } + + /** + * Strategy function for loading features based on the view's extent and + * resolution. + * @param {import("./extent.js").Extent} extent Extent. + * @param {number} resolution Resolution. + * @return {Array} Extents. + */ + strategyFunction(extent, resolution) { + if (this.loadedExtent_ && !equals(this.loadedExtent_, extent)) { + // we should not keep track of loaded extents + this.getSource().removeLoadedExtent(this.loadedExtent_); + } + return [extent]; } /** @@ -431,16 +449,12 @@ class Graticule extends VectorLayer { * @param {import("../proj/Projection.js").default} projection Projection */ loaderFunction(extent, resolution, projection) { + this.loadedExtent_ = extent; const source = this.getSource(); // only consider the intersection between our own extent & the requested one const layerExtent = this.getExtent() || [-Infinity, -Infinity, Infinity, Infinity]; - const renderExtent = getIntersection(layerExtent, extent, this.tmpExtent_); - - // we should not keep track of loaded extents - setTimeout(function() { - source.removeLoadedExtent(extent); - }, 0); + const renderExtent = getIntersection(layerExtent, extent); if (this.renderedExtent_ && equals(this.renderedExtent_, renderExtent)) { return; From e820042748e4b45712f241b1ad9169a68a5bcb05 Mon Sep 17 00:00:00 2001 From: mike-000 <49240900+mike-000@users.noreply.github.com> Date: Sun, 26 Jan 2020 14:04:05 +0000 Subject: [PATCH 062/381] Fix ol/layer/Graticule rendercomplete problem fix typedef imports --- src/ol/layer/Graticule.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ol/layer/Graticule.js b/src/ol/layer/Graticule.js index 9170814aa2..0c5e34f6e7 100644 --- a/src/ol/layer/Graticule.js +++ b/src/ol/layer/Graticule.js @@ -430,9 +430,9 @@ class Graticule extends VectorLayer { /** * Strategy function for loading features based on the view's extent and * resolution. - * @param {import("./extent.js").Extent} extent Extent. + * @param {import("../extent.js").Extent} extent Extent. * @param {number} resolution Resolution. - * @return {Array} Extents. + * @return {Array} Extents. */ strategyFunction(extent, resolution) { if (this.loadedExtent_ && !equals(this.loadedExtent_, extent)) { From bf57a23940d35e4e15a96a220073bb92970f27a2 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 27 Jan 2020 07:45:55 +0000 Subject: [PATCH 063/381] Bump rollup from 1.29.0 to 1.29.1 Bumps [rollup](https://github.com/rollup/rollup) from 1.29.0 to 1.29.1. - [Release notes](https://github.com/rollup/rollup/releases) - [Changelog](https://github.com/rollup/rollup/blob/master/CHANGELOG.md) - [Commits](https://github.com/rollup/rollup/compare/v1.29.0...v1.29.1) Signed-off-by: dependabot-preview[bot] --- package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index f50fc3157b..0c6f24bc11 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10893,9 +10893,9 @@ } }, "rollup": { - "version": "1.29.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-1.29.0.tgz", - "integrity": "sha512-V63Iz0dSdI5qPPN5HmCN6OBRzBFhMqNWcvwgq863JtSCTU6Vdvqq6S2fYle/dSCyoPrBkIP3EIr1RVs3HTRqqg==", + "version": "1.29.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-1.29.1.tgz", + "integrity": "sha512-dGQ+b9d1FOX/gluiggTAVnTvzQZUEkCi/TwZcax7ujugVRHs0nkYJlV9U4hsifGEMojnO+jvEML2CJQ6qXgbHA==", "dev": true, "requires": { "@types/estree": "*", From 2205937b2d06b231c8f690e0f50a41a7a35eb36b Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 27 Jan 2020 07:46:34 +0000 Subject: [PATCH 064/381] Bump mocha from 7.0.0 to 7.0.1 Bumps [mocha](https://github.com/mochajs/mocha) from 7.0.0 to 7.0.1. - [Release notes](https://github.com/mochajs/mocha/releases) - [Changelog](https://github.com/mochajs/mocha/blob/master/CHANGELOG.md) - [Commits](https://github.com/mochajs/mocha/compare/v7.0.0...v7.0.1) Signed-off-by: dependabot-preview[bot] --- package-lock.json | 12 ++++++------ package.json | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/package-lock.json b/package-lock.json index f50fc3157b..61b15f7951 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9089,9 +9089,9 @@ } }, "mocha": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-7.0.0.tgz", - "integrity": "sha512-CirsOPbO3jU86YKjjMzFLcXIb5YiGLUrjrXFHoJ3e2z9vWiaZVCZQ2+gtRGMPWF+nFhN6AWwLM/juzAQ6KRkbA==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-7.0.1.tgz", + "integrity": "sha512-9eWmWTdHLXh72rGrdZjNbG3aa1/3NRPpul1z0D979QpEnFdCG0Q5tv834N+94QEN2cysfV72YocQ3fn87s70fg==", "dev": true, "requires": { "ansi-colors": "3.2.3", @@ -9644,9 +9644,9 @@ }, "dependencies": { "es-abstract": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.0.tgz", - "integrity": "sha512-yYkE07YF+6SIBmg1MsJ9dlub5L48Ek7X0qz+c/CPCHS9EBXfESorzng4cJQjJW5/pB6vDF41u7F8vUhLVDqIug==", + "version": "1.17.4", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.4.tgz", + "integrity": "sha512-Ae3um/gb8F0mui/jPL+QiqmglkUsaQf7FwBEHYIFkztkneosu9imhqHpBzQ3h1vit8t5iQ74t6PEVvphBZiuiQ==", "dev": true, "requires": { "es-to-primitive": "^1.2.1", diff --git a/package.json b/package.json index 5af8107a2a..5c8456927e 100644 --- a/package.json +++ b/package.json @@ -80,7 +80,7 @@ "karma-webpack": "^4.0.0-rc.2", "loglevelnext": "^3.0.1", "marked": "0.8.0", - "mocha": "7.0.0", + "mocha": "7.0.1", "ol-mapbox-style": "^5.0.2", "pixelmatch": "^5.1.0", "pngjs": "^3.4.0", From 7f6d77d811456535549b6bc07e05b9805132fc7c Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 27 Jan 2020 07:47:19 +0000 Subject: [PATCH 065/381] Bump sinon from 8.1.0 to 8.1.1 Bumps [sinon](https://github.com/sinonjs/sinon) from 8.1.0 to 8.1.1. - [Release notes](https://github.com/sinonjs/sinon/releases) - [Changelog](https://github.com/sinonjs/sinon/blob/master/CHANGELOG.md) - [Commits](https://github.com/sinonjs/sinon/compare/v8.1.0...v8.1.1) Signed-off-by: dependabot-preview[bot] --- package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index f50fc3157b..b8ef766bad 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11409,9 +11409,9 @@ "dev": true }, "sinon": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/sinon/-/sinon-8.1.0.tgz", - "integrity": "sha512-6/05TR+8QhEgTbyMWaConm8iPL609Eno7SqToPq63wC/jS/6NMEI4NxqtzlLkk3r/KcZT9xPXQodH0oJ917Hbg==", + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-8.1.1.tgz", + "integrity": "sha512-E+tWr3acRdoe1nXbHMu86SSqA1WGM7Yw3jZRLvlCMnXwTHP8lgFFVn5BnKnF26uc5SfZ3D7pA9sN7S3Y2jG4Ew==", "dev": true, "requires": { "@sinonjs/commons": "^1.7.0", From 02b1ab71f1b4edcd106943aca6810a31c1be2eae Mon Sep 17 00:00:00 2001 From: Daniel Ruf Date: Tue, 28 Jan 2020 11:13:50 +0100 Subject: [PATCH 066/381] Use package-lock.json for the checksum calculation - closes #10069 --- .circleci/config.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index e2c130225d..a1ada88c0b 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -11,7 +11,7 @@ jobs: - restore_cache: keys: - - v1-dependencies-{{ checksum "package.json" }} + - v1-dependencies-{{ checksum "package-lock.json" }} - v1-dependencies- - run: @@ -21,7 +21,7 @@ jobs: - save_cache: paths: - node_modules - key: v1-dependencies-{{ checksum "package.json" }} + key: v1-dependencies-{{ checksum "package-lock.json" }} - run: name: Run Tests From 902bdbabdc530629efd59144c87a19d619cfa41e Mon Sep 17 00:00:00 2001 From: Jakob Gerstmayer Date: Tue, 28 Jan 2020 17:39:21 +0100 Subject: [PATCH 067/381] fixed issue with version throwing an error if it is null --- src/ol/format/WMTSCapabilities.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/ol/format/WMTSCapabilities.js b/src/ol/format/WMTSCapabilities.js index f125e357a8..64dd2dac8d 100644 --- a/src/ol/format/WMTSCapabilities.js +++ b/src/ol/format/WMTSCapabilities.js @@ -74,7 +74,10 @@ class WMTSCapabilities extends XML { * @inheritDoc */ readFromNode(node) { - const version = node.getAttribute('version').trim(); + let version = node.getAttribute('version'); + if(version) { + version = version.trim(); + } let WMTSCapabilityObject = this.owsParser_.readFromNode(node); if (!WMTSCapabilityObject) { return null; From 153bd7f5d1cd0d0c2686e2a766aa9e694b87dcf5 Mon Sep 17 00:00:00 2001 From: Jakob Gerstmayer Date: Tue, 28 Jan 2020 17:48:45 +0100 Subject: [PATCH 068/381] fixed spacing after if --- src/ol/format/WMTSCapabilities.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ol/format/WMTSCapabilities.js b/src/ol/format/WMTSCapabilities.js index 64dd2dac8d..bd1629f1d7 100644 --- a/src/ol/format/WMTSCapabilities.js +++ b/src/ol/format/WMTSCapabilities.js @@ -75,7 +75,7 @@ class WMTSCapabilities extends XML { */ readFromNode(node) { let version = node.getAttribute('version'); - if(version) { + if (version) { version = version.trim(); } let WMTSCapabilityObject = this.owsParser_.readFromNode(node); From 4151e86c0a5e35d469c2a270f45c1fc449edaf2b Mon Sep 17 00:00:00 2001 From: Jeremy Smith Date: Wed, 29 Jan 2020 14:36:56 +1000 Subject: [PATCH 069/381] Adds option to View for using larger resolution value when clamping --- src/ol/View.js | 13 +++++++++---- src/ol/resolutionconstraint.js | 24 ++++++++++++++++-------- test/spec/ol/view.test.js | 26 ++++++++++++++++++++++++++ 3 files changed, 51 insertions(+), 12 deletions(-) diff --git a/src/ol/View.js b/src/ol/View.js index 3bcc05219b..b4e5605672 100644 --- a/src/ol/View.js +++ b/src/ol/View.js @@ -129,6 +129,8 @@ import {createMinMaxResolution} from './resolutionconstraint.js'; * @property {boolean} [smoothResolutionConstraint=true] If true, the resolution * min/max values will be applied smoothly, i. e. allow the view to exceed slightly * the given resolution or zoom bounds. + * @property {boolean} [largerResolutionConstraint=false] If true, the constrained + * resolution values will use the larger value to do so. * @property {import("./proj.js").ProjectionLike} [projection='EPSG:3857'] The * projection. The default is Spherical Mercator. * @property {number} [resolution] The initial resolution for the view. The @@ -1611,6 +1613,9 @@ export function createResolutionConstraint(options) { const smooth = options.smoothResolutionConstraint !== undefined ? options.smoothResolutionConstraint : true; + const larger = + options.largerResolutionConstraint !== undefined ? options.largerResolutionConstraint : false; + const projection = createProjection(options.projection, 'EPSG:3857'); const projExtent = projection.getExtent(); let constrainOnlyCenter = options.constrainOnlyCenter; @@ -1628,10 +1633,10 @@ export function createResolutionConstraint(options) { if (options.constrainResolution) { resolutionConstraint = createSnapToResolutions(resolutions, smooth, - !constrainOnlyCenter && extent); + !constrainOnlyCenter && extent, larger); } else { resolutionConstraint = createMinMaxResolution(maxResolution, minResolution, smooth, - !constrainOnlyCenter && extent); + !constrainOnlyCenter && extent, larger); } } else { // calculate the default min and max resolution @@ -1677,10 +1682,10 @@ export function createResolutionConstraint(options) { if (options.constrainResolution) { resolutionConstraint = createSnapToPower( zoomFactor, maxResolution, minResolution, smooth, - !constrainOnlyCenter && extent); + !constrainOnlyCenter && extent, larger); } else { resolutionConstraint = createMinMaxResolution(maxResolution, minResolution, smooth, - !constrainOnlyCenter && extent); + !constrainOnlyCenter && extent, larger); } } return {constraint: resolutionConstraint, maxResolution: maxResolution, diff --git a/src/ol/resolutionconstraint.js b/src/ol/resolutionconstraint.js index 0134bde876..3d14209ec9 100644 --- a/src/ol/resolutionconstraint.js +++ b/src/ol/resolutionconstraint.js @@ -11,16 +11,21 @@ import {clamp} from './math.js'; */ /** - * Returns a modified resolution taking into acocunt the viewport size and maximum + * Returns a modified resolution taking into account the viewport size and maximum * allowed extent. * @param {number} resolution Resolution * @param {import("./extent.js").Extent=} maxExtent Maximum allowed extent. * @param {import("./size.js").Size} viewportSize Viewport size. + * @param {boolean} larger Whether to use the larger resolution size. * @return {number} Capped resolution. */ -function getViewportClampedResolution(resolution, maxExtent, viewportSize) { +function getViewportClampedResolution(resolution, maxExtent, viewportSize, larger) { const xResolution = getWidth(maxExtent) / viewportSize[0]; const yResolution = getHeight(maxExtent) / viewportSize[1]; + + if (larger) { + return Math.min(resolution, Math.max(xResolution, yResolution)); + } return Math.min(resolution, Math.min(xResolution, yResolution)); } @@ -52,9 +57,10 @@ function getSmoothClampedResolution(resolution, maxResolution, minResolution) { * @param {Array} resolutions Resolutions. * @param {boolean=} opt_smooth If true, the view will be able to slightly exceed resolution limits. Default: true. * @param {import("./extent.js").Extent=} opt_maxExtent Maximum allowed extent. + * @param {boolean=} opt_larger If true, the view will constrain the larger resolution value. Default: false. * @return {Type} Zoom function. */ -export function createSnapToResolutions(resolutions, opt_smooth, opt_maxExtent) { +export function createSnapToResolutions(resolutions, opt_smooth, opt_maxExtent, opt_larger) { return ( /** * @param {number|undefined} resolution Resolution. @@ -68,7 +74,7 @@ export function createSnapToResolutions(resolutions, opt_smooth, opt_maxExtent) const maxResolution = resolutions[0]; const minResolution = resolutions[resolutions.length - 1]; const cappedMaxRes = opt_maxExtent ? - getViewportClampedResolution(maxResolution, opt_maxExtent, size) : + getViewportClampedResolution(maxResolution, opt_maxExtent, size, opt_larger) : maxResolution; // during interacting or animating, allow intermediary values @@ -100,9 +106,10 @@ export function createSnapToResolutions(resolutions, opt_smooth, opt_maxExtent) * @param {number=} opt_minResolution Minimum resolution. * @param {boolean=} opt_smooth If true, the view will be able to slightly exceed resolution limits. Default: true. * @param {import("./extent.js").Extent=} opt_maxExtent Maximum allowed extent. + * @param {boolean=} opt_larger If true, the view will constrain the larger resolution value. Default: false. * @return {Type} Zoom function. */ -export function createSnapToPower(power, maxResolution, opt_minResolution, opt_smooth, opt_maxExtent) { +export function createSnapToPower(power, maxResolution, opt_minResolution, opt_smooth, opt_maxExtent, opt_larger) { return ( /** * @param {number|undefined} resolution Resolution. @@ -114,7 +121,7 @@ export function createSnapToPower(power, maxResolution, opt_minResolution, opt_s function(resolution, direction, size, opt_isMoving) { if (resolution !== undefined) { const cappedMaxRes = opt_maxExtent ? - getViewportClampedResolution(maxResolution, opt_maxExtent, size) : + getViewportClampedResolution(maxResolution, opt_maxExtent, size, opt_larger) : maxResolution; const minResolution = opt_minResolution !== undefined ? opt_minResolution : 0; @@ -148,9 +155,10 @@ export function createSnapToPower(power, maxResolution, opt_minResolution, opt_s * @param {number} minResolution Min resolution. * @param {boolean=} opt_smooth If true, the view will be able to slightly exceed resolution limits. Default: true. * @param {import("./extent.js").Extent=} opt_maxExtent Maximum allowed extent. + * @param {boolean=} opt_larger If true, the view will constrain the larger resolution value. Default: false. * @return {Type} Zoom function. */ -export function createMinMaxResolution(maxResolution, minResolution, opt_smooth, opt_maxExtent) { +export function createMinMaxResolution(maxResolution, minResolution, opt_smooth, opt_maxExtent, opt_larger) { return ( /** * @param {number|undefined} resolution Resolution. @@ -162,7 +170,7 @@ export function createMinMaxResolution(maxResolution, minResolution, opt_smooth, function(resolution, direction, size, opt_isMoving) { if (resolution !== undefined) { const cappedMaxRes = opt_maxExtent ? - getViewportClampedResolution(maxResolution, opt_maxExtent, size) : + getViewportClampedResolution(maxResolution, opt_maxExtent, size, opt_larger) : maxResolution; const smooth = opt_smooth !== undefined ? opt_smooth : true; diff --git a/test/spec/ol/view.test.js b/test/spec/ol/view.test.js index 17c2f2733e..4d44e2fa43 100644 --- a/test/spec/ol/view.test.js +++ b/test/spec/ol/view.test.js @@ -380,6 +380,32 @@ describe('ol.View', function() { expect(constraint(1, 0, size)).to.be(5); }); + it('accepts extent and uses the smallest value', function() { + const constraint = getConstraint({ + extent: [0, 0, 4000, 6000] + }); + + expect(constraint(1000, 0, size)).to.be(20); + expect(constraint(500, 0, size)).to.be(20); + expect(constraint(100, 0, size)).to.be(20); + expect(constraint(50, 0, size)).to.be(20); + expect(constraint(10, 0, size)).to.be(10); + expect(constraint(1, 0, size)).to.be(1); + }); + + it('accepts extent and largerResolutionConstraint and uses the larger value', function() { + const constraint = getConstraint({ + extent: [0, 0, 4000, 6000], + largerResolutionConstraint: true + }); + + expect(constraint(1000, 0, size)).to.be(30); + expect(constraint(500, 0, size)).to.be(30); + expect(constraint(100, 0, size)).to.be(30); + expect(constraint(50, 0, size)).to.be(30); + expect(constraint(10, 0, size)).to.be(10); + expect(constraint(1, 0, size)).to.be(1); + }); }); describe('overspecified options (prefers resolution)', function() { From e3f9e250ab83f6d2af2f09f63f6bdbdbb18301df Mon Sep 17 00:00:00 2001 From: Andreas Hocevar Date: Wed, 29 Jan 2020 14:04:52 +0100 Subject: [PATCH 070/381] Sort doc navigation properly and add missing modules --- config/jsdoc/api/template/publish.js | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/config/jsdoc/api/template/publish.js b/config/jsdoc/api/template/publish.js index 4bc6c21445..8e9304cbd7 100644 --- a/config/jsdoc/api/template/publish.js +++ b/config/jsdoc/api/template/publish.js @@ -188,6 +188,12 @@ function attachModuleSymbols(doclets, modules) { }); } +function getPrettyName(longname) { + return longname + .split('~')[0] + .replace('module:', ''); +} + /** * Create the navigation sidebar. * @param {object} members The members that will be used to create the sidebar. @@ -206,10 +212,12 @@ function buildNav(members) { // merge namespaces and classes, then sort const merged = members.modules.concat(members.classes); merged.sort(function(a, b) { - if (a.longname > b.longname) { + const prettyNameA = getPrettyName(a.longname).toLowerCase(); + const prettyNameB = getPrettyName(b.longname).toLowerCase(); + if (prettyNameA > prettyNameB) { return 1; } - if (a.longname < b.longname) { + if (prettyNameA < prettyNameB) { return -1; } return 0; @@ -221,9 +229,7 @@ function buildNav(members) { nav.push({ type: 'class', longname: v.longname, - prettyname: v.longname - .split('~')[0] - .replace('module:', ''), + prettyname: getPrettyName(v.longname), name: v.name, module: find({ kind: 'module', @@ -269,13 +275,11 @@ function buildNav(members) { memberof: v.longname }); // only add modules that have more to show than just a single class - if (classes.length !== 1 && (classes.length + members.length + methods.length + typedefs.length + events.length > 0)) { + if (!classes.length || classes.length - 1 + members.length + methods.length + typedefs.length + events.length > 0) { nav.push({ type: 'module', longname: v.longname, - prettyname: v.longname - .split('~')[0] - .replace('module:', ''), + prettyname: getPrettyName(v.longname), name: v.name, members: members, methods: methods, From f8f7f83be7a92944b8cfbd394c4b0e76362cfec0 Mon Sep 17 00:00:00 2001 From: Andreas Hocevar Date: Wed, 29 Jan 2020 17:33:04 +0100 Subject: [PATCH 071/381] Do not expose static render function of controls --- config/jsdoc/api/template/publish.js | 5 +++-- src/ol/control/Attribution.js | 1 - src/ol/control/Control.js | 13 ++++++++++++- src/ol/control/MousePosition.js | 1 - src/ol/control/OverviewMap.js | 1 - src/ol/control/Rotate.js | 1 - src/ol/control/ScaleLine.js | 1 - src/ol/control/ZoomSlider.js | 1 - test/spec/ol/control/scaleline.test.js | 4 ++-- 9 files changed, 17 insertions(+), 11 deletions(-) diff --git a/config/jsdoc/api/template/publish.js b/config/jsdoc/api/template/publish.js index 8e9304cbd7..5c40bb23ff 100644 --- a/config/jsdoc/api/template/publish.js +++ b/config/jsdoc/api/template/publish.js @@ -274,8 +274,9 @@ function buildNav(members) { kind: 'event', memberof: v.longname }); - // only add modules that have more to show than just a single class - if (!classes.length || classes.length - 1 + members.length + methods.length + typedefs.length + events.length > 0) { + // only add modules that have more to show than just classes + const numItems = classes.length - 1 + members.length + methods.length + typedefs.length + events.length; + if (!classes.length || (numItems > 0 && numItems !== classes.length)) { nav.push({ type: 'module', longname: v.longname, diff --git a/src/ol/control/Attribution.js b/src/ol/control/Attribution.js index 15a61f5318..f3409c829e 100644 --- a/src/ol/control/Attribution.js +++ b/src/ol/control/Attribution.js @@ -325,7 +325,6 @@ class Attribution extends Control { * Update the attribution element. * @param {import("../MapEvent.js").default} mapEvent Map event. * @this {Attribution} - * @api */ export function render(mapEvent) { this.updateElement_(mapEvent.frameState); diff --git a/src/ol/control/Control.js b/src/ol/control/Control.js index bcfd7f6ebd..2f03317507 100644 --- a/src/ol/control/Control.js +++ b/src/ol/control/Control.js @@ -79,9 +79,10 @@ class Control extends BaseObject { this.listenerKeys = []; /** + * @private * @type {function(import("../MapEvent.js").default): void} */ - this.render = options.render ? options.render : VOID; + this.render_ = options.render ? options.render : VOID; if (options.target) { this.setTarget(options.target); @@ -134,6 +135,16 @@ class Control extends BaseObject { } } + /** + * Update the projection. Rendering of the coordinates is done in + * `handleMouseMove` and `handleMouseUp`. + * @param {import("../MapEvent.js").default} mapEvent Map event. + * @api + */ + render(mapEvent) { + this.render_.call(this, mapEvent); + } + /** * This function is used to set a target element for the control. It has no * effect if it is called after the control has been added to the map (i.e. diff --git a/src/ol/control/MousePosition.js b/src/ol/control/MousePosition.js index e4f9aae624..3a2c017999 100644 --- a/src/ol/control/MousePosition.js +++ b/src/ol/control/MousePosition.js @@ -248,7 +248,6 @@ class MousePosition extends Control { * `handleMouseMove` and `handleMouseUp`. * @param {import("../MapEvent.js").default} mapEvent Map event. * @this {MousePosition} - * @api */ export function render(mapEvent) { const frameState = mapEvent.frameState; diff --git a/src/ol/control/OverviewMap.js b/src/ol/control/OverviewMap.js index 525bccdd22..5a83915198 100644 --- a/src/ol/control/OverviewMap.js +++ b/src/ol/control/OverviewMap.js @@ -603,7 +603,6 @@ class OverviewMap extends Control { * Update the overview map element. * @param {import("../MapEvent.js").default} mapEvent Map event. * @this {OverviewMap} - * @api */ export function render(mapEvent) { this.validateExtent_(); diff --git a/src/ol/control/Rotate.js b/src/ol/control/Rotate.js index f4dd50c54d..c4bdc237d3 100644 --- a/src/ol/control/Rotate.js +++ b/src/ol/control/Rotate.js @@ -151,7 +151,6 @@ class Rotate extends Control { * Update the rotate control element. * @param {import("../MapEvent.js").default} mapEvent Map event. * @this {Rotate} - * @api */ export function render(mapEvent) { const frameState = mapEvent.frameState; diff --git a/src/ol/control/ScaleLine.js b/src/ol/control/ScaleLine.js index 45c8ad3ff7..e0d7733ea3 100644 --- a/src/ol/control/ScaleLine.js +++ b/src/ol/control/ScaleLine.js @@ -418,7 +418,6 @@ class ScaleLine extends Control { * Update the scale line element. * @param {import("../MapEvent.js").default} mapEvent Map event. * @this {ScaleLine} - * @api */ export function render(mapEvent) { const frameState = mapEvent.frameState; diff --git a/src/ol/control/ZoomSlider.js b/src/ol/control/ZoomSlider.js index dcb8b4c223..58f2229d40 100644 --- a/src/ol/control/ZoomSlider.js +++ b/src/ol/control/ZoomSlider.js @@ -339,7 +339,6 @@ class ZoomSlider extends Control { * Update the zoomslider element. * @param {import("../MapEvent.js").default} mapEvent Map event. * @this {ZoomSlider} - * @api */ export function render(mapEvent) { if (!mapEvent.frameState) { diff --git a/test/spec/ol/control/scaleline.test.js b/test/spec/ol/control/scaleline.test.js index 954cc314b8..b88f4922e0 100644 --- a/test/spec/ol/control/scaleline.test.js +++ b/test/spec/ol/control/scaleline.test.js @@ -70,14 +70,14 @@ describe('ol.control.ScaleLine', function() { describe('render', function() { it('defaults to `ol.control.ScaleLine.render`', function() { const ctrl = new ScaleLine(); - expect(ctrl.render).to.be(render); + expect(ctrl.render_).to.be(render); }); it('can be configured', function() { const myRender = function() {}; const ctrl = new ScaleLine({ render: myRender }); - expect(ctrl.render).to.be(myRender); + expect(ctrl.render_).to.be(myRender); }); }); From 7805768942375cf6d0ceb7a07faeca12dc8ba575 Mon Sep 17 00:00:00 2001 From: Jeremy Smith Date: Thu, 30 Jan 2020 07:40:28 +1000 Subject: [PATCH 072/381] Renamed option to constrainOneAxis --- src/ol/View.js | 17 +++++++++-------- src/ol/resolutionconstraint.js | 24 ++++++++++++------------ 2 files changed, 21 insertions(+), 20 deletions(-) diff --git a/src/ol/View.js b/src/ol/View.js index b4e5605672..d2ab683f81 100644 --- a/src/ol/View.js +++ b/src/ol/View.js @@ -129,8 +129,9 @@ import {createMinMaxResolution} from './resolutionconstraint.js'; * @property {boolean} [smoothResolutionConstraint=true] If true, the resolution * min/max values will be applied smoothly, i. e. allow the view to exceed slightly * the given resolution or zoom bounds. - * @property {boolean} [largerResolutionConstraint=false] If true, the constrained - * resolution values will use the larger value to do so. + * @property {boolean} [constrainOneAxis=false] If true, the extent constraint can + * be exceeded along one but not both axes, allowing the whole extent to be visible + * on the map. * @property {import("./proj.js").ProjectionLike} [projection='EPSG:3857'] The * projection. The default is Spherical Mercator. * @property {number} [resolution] The initial resolution for the view. The @@ -1613,8 +1614,8 @@ export function createResolutionConstraint(options) { const smooth = options.smoothResolutionConstraint !== undefined ? options.smoothResolutionConstraint : true; - const larger = - options.largerResolutionConstraint !== undefined ? options.largerResolutionConstraint : false; + const oneAxis = + options.constrainOneAxis !== undefined ? options.constrainOneAxis : false; const projection = createProjection(options.projection, 'EPSG:3857'); const projExtent = projection.getExtent(); @@ -1633,10 +1634,10 @@ export function createResolutionConstraint(options) { if (options.constrainResolution) { resolutionConstraint = createSnapToResolutions(resolutions, smooth, - !constrainOnlyCenter && extent, larger); + !constrainOnlyCenter && extent, oneAxis); } else { resolutionConstraint = createMinMaxResolution(maxResolution, minResolution, smooth, - !constrainOnlyCenter && extent, larger); + !constrainOnlyCenter && extent, oneAxis); } } else { // calculate the default min and max resolution @@ -1682,10 +1683,10 @@ export function createResolutionConstraint(options) { if (options.constrainResolution) { resolutionConstraint = createSnapToPower( zoomFactor, maxResolution, minResolution, smooth, - !constrainOnlyCenter && extent, larger); + !constrainOnlyCenter && extent, oneAxis); } else { resolutionConstraint = createMinMaxResolution(maxResolution, minResolution, smooth, - !constrainOnlyCenter && extent, larger); + !constrainOnlyCenter && extent, oneAxis); } } return {constraint: resolutionConstraint, maxResolution: maxResolution, diff --git a/src/ol/resolutionconstraint.js b/src/ol/resolutionconstraint.js index 3d14209ec9..73dec32ace 100644 --- a/src/ol/resolutionconstraint.js +++ b/src/ol/resolutionconstraint.js @@ -16,14 +16,14 @@ import {clamp} from './math.js'; * @param {number} resolution Resolution * @param {import("./extent.js").Extent=} maxExtent Maximum allowed extent. * @param {import("./size.js").Size} viewportSize Viewport size. - * @param {boolean} larger Whether to use the larger resolution size. + * @param {boolean} oneAxis Whether we can exceed extent constraint along one axis but not both. * @return {number} Capped resolution. */ -function getViewportClampedResolution(resolution, maxExtent, viewportSize, larger) { +function getViewportClampedResolution(resolution, maxExtent, viewportSize, oneAxis) { const xResolution = getWidth(maxExtent) / viewportSize[0]; const yResolution = getHeight(maxExtent) / viewportSize[1]; - if (larger) { + if (oneAxis) { return Math.min(resolution, Math.max(xResolution, yResolution)); } return Math.min(resolution, Math.min(xResolution, yResolution)); @@ -57,10 +57,10 @@ function getSmoothClampedResolution(resolution, maxResolution, minResolution) { * @param {Array} resolutions Resolutions. * @param {boolean=} opt_smooth If true, the view will be able to slightly exceed resolution limits. Default: true. * @param {import("./extent.js").Extent=} opt_maxExtent Maximum allowed extent. - * @param {boolean=} opt_larger If true, the view will constrain the larger resolution value. Default: false. + * @param {boolean=} opt_oneAxis If true, can exceed extent constraint along one axis but not both. Default: false. * @return {Type} Zoom function. */ -export function createSnapToResolutions(resolutions, opt_smooth, opt_maxExtent, opt_larger) { +export function createSnapToResolutions(resolutions, opt_smooth, opt_maxExtent, opt_oneAxis) { return ( /** * @param {number|undefined} resolution Resolution. @@ -74,7 +74,7 @@ export function createSnapToResolutions(resolutions, opt_smooth, opt_maxExtent, const maxResolution = resolutions[0]; const minResolution = resolutions[resolutions.length - 1]; const cappedMaxRes = opt_maxExtent ? - getViewportClampedResolution(maxResolution, opt_maxExtent, size, opt_larger) : + getViewportClampedResolution(maxResolution, opt_maxExtent, size, opt_oneAxis) : maxResolution; // during interacting or animating, allow intermediary values @@ -106,10 +106,10 @@ export function createSnapToResolutions(resolutions, opt_smooth, opt_maxExtent, * @param {number=} opt_minResolution Minimum resolution. * @param {boolean=} opt_smooth If true, the view will be able to slightly exceed resolution limits. Default: true. * @param {import("./extent.js").Extent=} opt_maxExtent Maximum allowed extent. - * @param {boolean=} opt_larger If true, the view will constrain the larger resolution value. Default: false. + * @param {boolean=} opt_oneAxis If true, can exceed extent constraint along one axis but not both. Default: false. * @return {Type} Zoom function. */ -export function createSnapToPower(power, maxResolution, opt_minResolution, opt_smooth, opt_maxExtent, opt_larger) { +export function createSnapToPower(power, maxResolution, opt_minResolution, opt_smooth, opt_maxExtent, opt_oneAxis) { return ( /** * @param {number|undefined} resolution Resolution. @@ -121,7 +121,7 @@ export function createSnapToPower(power, maxResolution, opt_minResolution, opt_s function(resolution, direction, size, opt_isMoving) { if (resolution !== undefined) { const cappedMaxRes = opt_maxExtent ? - getViewportClampedResolution(maxResolution, opt_maxExtent, size, opt_larger) : + getViewportClampedResolution(maxResolution, opt_maxExtent, size, opt_oneAxis) : maxResolution; const minResolution = opt_minResolution !== undefined ? opt_minResolution : 0; @@ -155,10 +155,10 @@ export function createSnapToPower(power, maxResolution, opt_minResolution, opt_s * @param {number} minResolution Min resolution. * @param {boolean=} opt_smooth If true, the view will be able to slightly exceed resolution limits. Default: true. * @param {import("./extent.js").Extent=} opt_maxExtent Maximum allowed extent. - * @param {boolean=} opt_larger If true, the view will constrain the larger resolution value. Default: false. + * @param {boolean=} opt_oneAxis If true, can exceed extent constraint along one axis but not both. Default: false. * @return {Type} Zoom function. */ -export function createMinMaxResolution(maxResolution, minResolution, opt_smooth, opt_maxExtent, opt_larger) { +export function createMinMaxResolution(maxResolution, minResolution, opt_smooth, opt_maxExtent, opt_oneAxis) { return ( /** * @param {number|undefined} resolution Resolution. @@ -170,7 +170,7 @@ export function createMinMaxResolution(maxResolution, minResolution, opt_smooth, function(resolution, direction, size, opt_isMoving) { if (resolution !== undefined) { const cappedMaxRes = opt_maxExtent ? - getViewportClampedResolution(maxResolution, opt_maxExtent, size, opt_larger) : + getViewportClampedResolution(maxResolution, opt_maxExtent, size, opt_oneAxis) : maxResolution; const smooth = opt_smooth !== undefined ? opt_smooth : true; From 001cb989902f6c0d55422bcca355ed8fa8e61262 Mon Sep 17 00:00:00 2001 From: Jeremy Smith Date: Thu, 30 Jan 2020 08:03:02 +1000 Subject: [PATCH 073/381] Updated test to use renamed option --- test/spec/ol/view.test.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/spec/ol/view.test.js b/test/spec/ol/view.test.js index 4d44e2fa43..3d0bd026b0 100644 --- a/test/spec/ol/view.test.js +++ b/test/spec/ol/view.test.js @@ -393,10 +393,10 @@ describe('ol.View', function() { expect(constraint(1, 0, size)).to.be(1); }); - it('accepts extent and largerResolutionConstraint and uses the larger value', function() { + it('accepts extent and constrainOneAxis and uses the larger value', function() { const constraint = getConstraint({ extent: [0, 0, 4000, 6000], - largerResolutionConstraint: true + constrainOneAxis: true }); expect(constraint(1000, 0, size)).to.be(30); From a24c94487c614f0f8f6f7a881bfa5e3b6ddc1c3b Mon Sep 17 00:00:00 2001 From: Andreas Hocevar Date: Sat, 25 Jan 2020 20:53:28 +0100 Subject: [PATCH 074/381] Cache label instructions for better performance --- src/ol/render/canvas/Executor.js | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/ol/render/canvas/Executor.js b/src/ol/render/canvas/Executor.js index e94f666554..c109c6d04b 100644 --- a/src/ol/render/canvas/Executor.js +++ b/src/ol/render/canvas/Executor.js @@ -173,6 +173,12 @@ class Executor { * @type {Object>} */ this.widths_ = {}; + + /** + * @private + * @type {Object} + */ + this.labels_ = {}; } /** @@ -183,6 +189,10 @@ class Executor { * @return {Label} Label. */ createLabel(text, textKey, fillKey, strokeKey) { + const key = text + textKey + fillKey + strokeKey; + if (this.labels_[key]) { + return this.labels_[key]; + } const strokeState = strokeKey ? this.strokeStates[strokeKey] : null; const fillState = fillKey ? this.fillStates[fillKey] : null; const textState = this.textStates[textKey]; @@ -239,6 +249,7 @@ class Executor { contextInstructions.push('fillText', [lines[i], x + leftRight * widths[i], 0.5 * (strokeWidth + lineHeight) + i * lineHeight]); } } + this.labels_[key] = label; return label; } From 542b77eef89d389c36aa566cce02a33ec4bfc6d5 Mon Sep 17 00:00:00 2001 From: Andreas Hocevar Date: Sat, 25 Jan 2020 20:53:50 +0100 Subject: [PATCH 075/381] Save and restore before rendering labels --- src/ol/render/canvas.js | 21 ++++++--------------- 1 file changed, 6 insertions(+), 15 deletions(-) diff --git a/src/ol/render/canvas.js b/src/ol/render/canvas.js index d4c7498451..726870e053 100644 --- a/src/ol/render/canvas.js +++ b/src/ol/render/canvas.js @@ -401,30 +401,21 @@ export const resetTransform = createTransform(); */ export function drawImageOrLabel(context, transform, opacity, labelOrImage, originX, originY, w, h, x, y, scale) { - let alpha; - if (opacity != 1) { - alpha = context.globalAlpha; - context.globalAlpha = alpha * opacity; - } + context.save(); + if (transform) { context.setTransform.apply(context, transform); } - const isLabel = !!(/** @type {*} */ (labelOrImage).contextInstructions); - - if (isLabel) { + if ((/** @type {*} */ (labelOrImage).contextInstructions)) { + // label context.translate(x, y); context.scale(scale, scale); executeLabelInstructions(/** @type {import("./canvas/Executor.js").Label} */ (labelOrImage), context); } else { + // image context.drawImage(/** @type {HTMLCanvasElement|HTMLImageElement|HTMLVideoElement} */ (labelOrImage), originX, originY, w, h, x, y, w * scale, h * scale); } - if (opacity != 1) { - context.globalAlpha = alpha; - } - - if (transform || isLabel) { - context.setTransform.apply(context, resetTransform); - } + context.restore(); } From 81d14fb6367c3f48be4b901dda9ec9e9e0e7aaab Mon Sep 17 00:00:00 2001 From: Andreas Hocevar Date: Thu, 30 Jan 2020 10:47:53 +0100 Subject: [PATCH 076/381] Remove obsolete license notice --- src/ol/sphere.js | 7 ------- 1 file changed, 7 deletions(-) diff --git a/src/ol/sphere.js b/src/ol/sphere.js index 931373be4a..b9e2d0bb72 100644 --- a/src/ol/sphere.js +++ b/src/ol/sphere.js @@ -1,10 +1,3 @@ -/** - * @license - * Latitude/longitude spherical geodesy formulae taken from - * http://www.movable-type.co.uk/scripts/latlong.html - * Licensed under CC-BY-3.0. - */ - /** * @module ol/sphere */ From 7266f37f85c1f7a77757dd1a37f7a9d12fade8a3 Mon Sep 17 00:00:00 2001 From: Andreas Hocevar Date: Thu, 30 Jan 2020 14:52:04 +0100 Subject: [PATCH 077/381] Remove unused export and variable --- src/ol/render/canvas.js | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/ol/render/canvas.js b/src/ol/render/canvas.js index 726870e053..65b7453920 100644 --- a/src/ol/render/canvas.js +++ b/src/ol/render/canvas.js @@ -4,7 +4,6 @@ import {getFontParameters} from '../css.js'; import {createCanvasContext2D} from '../dom.js'; import {clear} from '../obj.js'; -import {create as createTransform} from '../transform.js'; import {executeLabelInstructions} from './canvas/Executor.js'; import BaseObject from '../Object.js'; import EventTarget from '../events/Target.js'; @@ -383,9 +382,6 @@ export function rotateAtOffset(context, rotation, offsetX, offsetY) { } -export const resetTransform = createTransform(); - - /** * @param {CanvasRenderingContext2D} context Context. * @param {import("../transform.js").Transform|null} transform Transform. From 38abbcbdd6c8f3e46897b9ba17ca3789a2ac1ba6 Mon Sep 17 00:00:00 2001 From: Andreas Hocevar Date: Sat, 1 Feb 2020 19:06:37 +0100 Subject: [PATCH 078/381] Remove inheritDoc to work around JSDoc issue --- src/ol/source/Tile.js | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/ol/source/Tile.js b/src/ol/source/Tile.js index 6e99ed0c79..baf0386a39 100644 --- a/src/ol/source/Tile.js +++ b/src/ol/source/Tile.js @@ -317,9 +317,6 @@ class TileSource extends Source { this.tileCache.clear(); } - /** - * @inheritDoc - */ refresh() { this.clear(); super.refresh(); From f91ce5692f36b1d9b8977a74d6bbc5cf1a80cf30 Mon Sep 17 00:00:00 2001 From: Andreas Hocevar Date: Sat, 1 Feb 2020 21:44:10 +0100 Subject: [PATCH 079/381] Remove apidoc annotation to show refresh for ol/source/Cluster --- src/ol/source/Vector.js | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/ol/source/Vector.js b/src/ol/source/Vector.js index 0d0905e5c2..49ac34296b 100644 --- a/src/ol/source/Vector.js +++ b/src/ol/source/Vector.js @@ -914,9 +914,6 @@ class VectorSource extends Source { } } - /** - * @inheritDoc - */ refresh() { this.clear(true); this.loadedExtentsRtree_.clear(); From 3c2dfb511afbaa52445c9456b376fe07fe37983a Mon Sep 17 00:00:00 2001 From: mike-000 <49240900+mike-000@users.noreply.github.com> Date: Mon, 27 Jan 2020 14:42:03 +0000 Subject: [PATCH 080/381] Fix Polystyle outline 0 conflict with Linestyle Return separate style objects for polygon geometries (including multipolygon and polygons in geometry collections) and other geometries if Polystyle outline is defined as 0 Rearrange code to reduce cloning of styles in createNameStyleFunction Update Polystyle outline 0 tests Check for separate style objects applying to LineString and Polygon geometries Test LineString and Polygon geometries in a collection --- src/ol/format/KML.js | 80 ++++++++++++++++++++++++++------- test/spec/ol/format/kml.test.js | 74 ++++++++++++++++++++++++++++-- 2 files changed, 133 insertions(+), 21 deletions(-) diff --git a/src/ol/format/KML.js b/src/ol/format/KML.js index 77dc5a7aff..5b4551035f 100644 --- a/src/ol/format/KML.js +++ b/src/ol/format/KML.js @@ -882,32 +882,32 @@ class KML extends XMLFeature { * @return {Style} style Style. */ function createNameStyleFunction(foundStyle, name) { - let textStyle = null; const textOffset = [0, 0]; let textAlign = 'start'; - if (foundStyle.getImage()) { - let imageSize = foundStyle.getImage().getImageSize(); + const imageStyle = foundStyle.getImage(); + if (imageStyle) { + let imageSize = imageStyle.getImageSize(); if (imageSize === null) { imageSize = DEFAULT_IMAGE_STYLE_SIZE; } if (imageSize.length == 2) { - const imageScale = foundStyle.getImage().getScale(); - // Offset the label to be centered to the right of the icon, if there is - // one. + const imageScale = imageStyle.getScale(); + // Offset the label to be centered to the right of the icon, + // if there is one. textOffset[0] = imageScale * imageSize[0] / 2; textOffset[1] = -imageScale * imageSize[1] / 2; textAlign = 'left'; } } - if (foundStyle.getText() !== null) { + let textStyle = foundStyle.getText(); + if (textStyle) { // clone the text style, customizing it with name, alignments and offset. // Note that kml does not support many text options that OpenLayers does (rotation, textBaseline). - const foundText = foundStyle.getText(); - textStyle = foundText.clone(); - textStyle.setFont(foundText.getFont() || DEFAULT_TEXT_STYLE.getFont()); - textStyle.setScale(foundText.getScale() || DEFAULT_TEXT_STYLE.getScale()); - textStyle.setFill(foundText.getFill() || DEFAULT_TEXT_STYLE.getFill()); - textStyle.setStroke(foundText.getStroke() || DEFAULT_TEXT_STROKE_STYLE); + textStyle = textStyle.clone(); + textStyle.setFont(textStyle.getFont() || DEFAULT_TEXT_STYLE.getFont()); + textStyle.setScale(textStyle.getScale() || DEFAULT_TEXT_STYLE.getScale()); + textStyle.setFill(textStyle.getFill() || DEFAULT_TEXT_STYLE.getFill()); + textStyle.setStroke(textStyle.getStroke() || DEFAULT_TEXT_STROKE_STYLE); } else { textStyle = DEFAULT_TEXT_STYLE.clone(); } @@ -916,8 +916,10 @@ function createNameStyleFunction(foundStyle, name) { textStyle.setOffsetY(textOffset[1]); textStyle.setTextAlign(textAlign); - const nameStyle = foundStyle.clone(); - nameStyle.setText(textStyle); + const nameStyle = new Style({ + image: imageStyle, + text: textStyle + }); return nameStyle; } @@ -1766,13 +1768,57 @@ function readStyle(node, objectStack) { const textStyle = /** @type {Text} */ ('textStyle' in styleObject ? styleObject['textStyle'] : DEFAULT_TEXT_STYLE); - let strokeStyle = /** @type {Stroke} */ + const strokeStyle = /** @type {Stroke} */ ('strokeStyle' in styleObject ? styleObject['strokeStyle'] : DEFAULT_STROKE_STYLE); const outline = /** @type {boolean|undefined} */ (styleObject['outline']); if (outline !== undefined && !outline) { - strokeStyle = null; + // if the polystyle specifies no outline two styles are needed, + // one for non-polygon geometries where linestrings require a stroke + // and one for polygons where there should be no stroke + return [ + new Style({ + geometry: function(feature) { + const geometry = feature.getGeometry(); + const type = geometry.getType(); + if (type === GeometryType.GEOMETRY_COLLECTION) { + return new GeometryCollection( + geometry.getGeometriesArray().filter(function(geometry) { + const type = geometry.getType(); + return type !== GeometryType.POLYGON && type !== GeometryType.MULTI_POLYGON; + }) + ); + } else if (type !== GeometryType.POLYGON && type !== GeometryType.MULTI_POLYGON) { + return geometry; + } + }, + fill: fillStyle, + image: imageStyle, + stroke: strokeStyle, + text: textStyle, + zIndex: undefined // FIXME + }), + new Style({ + geometry: function(feature) { + const geometry = feature.getGeometry(); + const type = geometry.getType(); + if (type === GeometryType.GEOMETRY_COLLECTION) { + return new GeometryCollection( + geometry.getGeometriesArray().filter(function(geometry) { + const type = geometry.getType(); + return type === GeometryType.POLYGON || type === GeometryType.MULTI_POLYGON; + }) + ); + } else if (type === GeometryType.POLYGON || type === GeometryType.MULTI_POLYGON) { + return geometry; + } + }, + fill: fillStyle, + stroke: null, + zIndex: undefined // FIXME + }) + ]; } return [new Style({ fill: fillStyle, diff --git a/test/spec/ol/format/kml.test.js b/test/spec/ol/format/kml.test.js index 6f4e2fe2d6..700d8273c8 100644 --- a/test/spec/ol/format/kml.test.js +++ b/test/spec/ol/format/kml.test.js @@ -2167,6 +2167,11 @@ describe('ol.format.KML', function() { }); it('disables the stroke when outline is \'0\'', function() { + const lineString = new LineString([[1, 2], [3, 4]]); + const polygon = new Polygon([[[0, 0], [0, 2], [2, 2], [2, 0], [0, 0]]]); + const lineStringFeature = new Feature(lineString); + const polygonFeature = new Feature(polygon); + const collectionFeature = new Feature(new GeometryCollection([lineString, polygon])); const text = '' + ' ' + @@ -2190,20 +2195,53 @@ describe('ol.format.KML', function() { expect(styleFunction).not.to.be(undefined); const styleArray = styleFunction(f, 0); expect(styleArray).to.be.an(Array); - expect(styleArray).to.have.length(1); + expect(styleArray).to.have.length(2); + const style = styleArray[0]; expect(style).to.be.an(Style); + expect(style.getGeometryFunction()(lineStringFeature)).to.be(lineString); + expect(style.getGeometryFunction()(polygonFeature)).to.be(undefined); + const gc = style.getGeometryFunction()(collectionFeature); + expect(gc).to.be.an(GeometryCollection); + const gs = gc.getGeometries(); + expect(gs).to.be.an(Array); + expect(gs).to.have.length(1); + expect(gs[0]).to.be.an(LineString); + expect(gs[0].getCoordinates()).to.eql(lineString.getCoordinates()); const fillStyle = style.getFill(); expect(fillStyle).to.be.an(Fill); expect(fillStyle.getColor()).to.eql([0x78, 0x56, 0x34, 0x12 / 255]); expect(style.getImage()).to.be(getDefaultImageStyle()); - expect(style.getStroke()).to.be(null); + const strokeStyle = style.getStroke(); + expect(strokeStyle).to.be.an(Stroke); + expect(strokeStyle.getColor()).to.eql([0x78, 0x56, 0x34, 0x12 / 255]); + expect(strokeStyle.getWidth()).to.be(9); expect(style.getText()).to.be(getDefaultTextStyle()); expect(style.getZIndex()).to.be(undefined); + + const style1 = styleArray[1]; + expect(style1).to.be.an(Style); + expect(style1.getGeometryFunction()(lineStringFeature)).to.be(undefined); + expect(style1.getGeometryFunction()(polygonFeature)).to.be(polygon); + const gc1 = style1.getGeometryFunction()(collectionFeature); + expect(gc1).to.be.an(GeometryCollection); + const gs1 = gc1.getGeometries(); + expect(gs1).to.be.an(Array); + expect(gs1).to.have.length(1); + expect(gs1[0]).to.be.an(Polygon); + expect(gs1[0].getCoordinates()).to.eql(polygon.getCoordinates()); + expect(style1.getFill()).to.be(fillStyle); + expect(style1.getStroke()).to.be(null); + expect(style1.getZIndex()).to.be(undefined); }); it('disables both fill and stroke when fill and outline are \'0\'', function() { + const lineString = new LineString([[1, 2], [3, 4]]); + const polygon = new Polygon([[[0, 0], [0, 2], [2, 2], [2, 0], [0, 0]]]); + const lineStringFeature = new Feature(lineString); + const polygonFeature = new Feature(polygon); + const collectionFeature = new Feature(new GeometryCollection([lineString, polygon])); const text = '' + ' ' + @@ -2228,14 +2266,42 @@ describe('ol.format.KML', function() { expect(styleFunction).not.to.be(undefined); const styleArray = styleFunction(f, 0); expect(styleArray).to.be.an(Array); - expect(styleArray).to.have.length(1); + expect(styleArray).to.have.length(2); + const style = styleArray[0]; expect(style).to.be.an(Style); + expect(style.getGeometryFunction()(lineStringFeature)).to.be(lineString); + expect(style.getGeometryFunction()(polygonFeature)).to.be(undefined); + const gc = style.getGeometryFunction()(collectionFeature); + expect(gc).to.be.an(GeometryCollection); + const gs = gc.getGeometries(); + expect(gs).to.be.an(Array); + expect(gs).to.have.length(1); + expect(gs[0]).to.be.an(LineString); + expect(gs[0].getCoordinates()).to.eql(lineString.getCoordinates()); expect(style.getFill()).to.be(null); expect(style.getImage()).to.be(getDefaultImageStyle()); - expect(style.getStroke()).to.be(null); + const strokeStyle = style.getStroke(); + expect(strokeStyle).to.be.an(Stroke); + expect(strokeStyle.getColor()).to.eql([0x78, 0x56, 0x34, 0x12 / 255]); + expect(strokeStyle.getWidth()).to.be(9); expect(style.getText()).to.be(getDefaultTextStyle()); expect(style.getZIndex()).to.be(undefined); + + const style1 = styleArray[1]; + expect(style1).to.be.an(Style); + expect(style1.getGeometryFunction()(lineStringFeature)).to.be(undefined); + expect(style1.getGeometryFunction()(polygonFeature)).to.be(polygon); + const gc1 = style1.getGeometryFunction()(collectionFeature); + expect(gc1).to.be.an(GeometryCollection); + const gs1 = gc1.getGeometries(); + expect(gs1).to.be.an(Array); + expect(gs1).to.have.length(1); + expect(gs1[0]).to.be.an(Polygon); + expect(gs1[0].getCoordinates()).to.eql(polygon.getCoordinates()); + expect(style1.getFill()).to.be(null); + expect(style1.getStroke()).to.be(null); + expect(style1.getZIndex()).to.be(undefined); }); it('can create text style for named point placemarks (including html character codes)', function() { From 564af3e4d5511e6f8e1ada3a5c181fb84995301d Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 3 Feb 2020 08:14:11 +0000 Subject: [PATCH 081/381] Bump puppeteer from 2.0.0 to 2.1.0 Bumps [puppeteer](https://github.com/puppeteer/puppeteer) from 2.0.0 to 2.1.0. - [Release notes](https://github.com/puppeteer/puppeteer/releases) - [Commits](https://github.com/puppeteer/puppeteer/compare/v2.0.0...v2.1.0) Signed-off-by: dependabot-preview[bot] --- package-lock.json | 78 ++++++++++++++++++++++------------------------- package.json | 2 +- 2 files changed, 37 insertions(+), 43 deletions(-) diff --git a/package-lock.json b/package-lock.json index e1903e27da..a0d2a3e890 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2389,6 +2389,12 @@ "@types/node": "*" } }, + "@types/mime-types": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/mime-types/-/mime-types-2.1.0.tgz", + "integrity": "sha1-nKUs2jY/aZxpRmwqbM2q2RPqenM=", + "dev": true + }, "@types/minimatch": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", @@ -2654,13 +2660,10 @@ "dev": true }, "agent-base": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", - "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", - "dev": true, - "requires": { - "es6-promisify": "^5.0.0" - } + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-5.1.1.tgz", + "integrity": "sha512-TMeqbNl2fMW0nMjTEPOwe3J/PRFP4vqeoNuQMG0HlMrtm5QxKqdvAkZ1pRBQ/ulIyDD5Yq0nJ7YbdD8ey0TO3g==", + "dev": true }, "aggregate-error": { "version": "3.0.1", @@ -4871,21 +4874,6 @@ "integrity": "sha1-wsNYJlYkfDnqEHyx5mUrb58kUjw=", "dev": true }, - "es6-promise": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", - "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==", - "dev": true - }, - "es6-promisify": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", - "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", - "dev": true, - "requires": { - "es6-promise": "^4.0.3" - } - }, "escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", @@ -7145,24 +7133,13 @@ "dev": true }, "https-proxy-agent": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-3.0.1.tgz", - "integrity": "sha512-+ML2Rbh6DAuee7d07tYGEKOEi2voWPUGan+ExdPbPW6Z3svq+JCqr0v8WmKPOkz1vOVykPCBSuobe7G8GJUtVg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-4.0.0.tgz", + "integrity": "sha512-zoDhWrkR3of1l9QAL8/scJZyLu8j/gBkcwcaQOZh7Gyh/+uJQzGVETdgT30akuwkpL8HTRfssqI3BZuV18teDg==", "dev": true, "requires": { - "agent-base": "^4.3.0", - "debug": "^3.1.0" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } + "agent-base": "5", + "debug": "4" } }, "iconv-lite": { @@ -10362,21 +10339,38 @@ "dev": true }, "puppeteer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-2.0.0.tgz", - "integrity": "sha512-t3MmTWzQxPRP71teU6l0jX47PHXlc4Z52sQv4LJQSZLq1ttkKS2yGM3gaI57uQwZkNaoGd0+HPPMELZkcyhlqA==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-2.1.0.tgz", + "integrity": "sha512-PC4oKMtwAElo8YtS/cYnk2/dew/3TonsGKKzjpFLWwkhBCteFsOZCVOXTt2QlP6w53mH0YsJE+fPLPzOW+DCug==", "dev": true, "requires": { + "@types/mime-types": "^2.1.0", "debug": "^4.1.0", "extract-zip": "^1.6.6", - "https-proxy-agent": "^3.0.0", + "https-proxy-agent": "^4.0.0", "mime": "^2.0.3", + "mime-types": "^2.1.25", "progress": "^2.0.1", "proxy-from-env": "^1.0.0", "rimraf": "^2.6.1", "ws": "^6.1.0" }, "dependencies": { + "mime-db": { + "version": "1.43.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.43.0.tgz", + "integrity": "sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ==", + "dev": true + }, + "mime-types": { + "version": "2.1.26", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.26.tgz", + "integrity": "sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ==", + "dev": true, + "requires": { + "mime-db": "1.43.0" + } + }, "ws": { "version": "6.2.1", "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", diff --git a/package.json b/package.json index 5c8456927e..04425b1ebe 100644 --- a/package.json +++ b/package.json @@ -85,7 +85,7 @@ "pixelmatch": "^5.1.0", "pngjs": "^3.4.0", "proj4": "2.6.0", - "puppeteer": "~2.0.0", + "puppeteer": "~2.1.0", "rollup": "^1.25.1", "rollup-plugin-babel": "^4.3.3", "rollup-plugin-commonjs": "^10.0.0", From cd3a205803102f1041d5b73f054abe4b244edf06 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 3 Feb 2020 08:14:59 +0000 Subject: [PATCH 082/381] Bump terser-webpack-plugin from 2.3.2 to 2.3.4 Bumps [terser-webpack-plugin](https://github.com/webpack-contrib/terser-webpack-plugin) from 2.3.2 to 2.3.4. - [Release notes](https://github.com/webpack-contrib/terser-webpack-plugin/releases) - [Changelog](https://github.com/webpack-contrib/terser-webpack-plugin/blob/master/CHANGELOG.md) - [Commits](https://github.com/webpack-contrib/terser-webpack-plugin/compare/v2.3.2...v2.3.4) Signed-off-by: dependabot-preview[bot] --- package-lock.json | 77 ++++++++++++++++++++++++++++++++++++----------- 1 file changed, 59 insertions(+), 18 deletions(-) diff --git a/package-lock.json b/package-lock.json index e1903e27da..9f4c9f30be 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6045,9 +6045,9 @@ } }, "fs-minipass": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.0.0.tgz", - "integrity": "sha512-40Qz+LFXmd9tzYVnnBmZvFfvAADfUA14TXPK1s7IfElJTIZ97rA8w4Kin7Wt5JBrC3ShnnFJO/5vPjPEeJIq9A==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", "dev": true, "requires": { "minipass": "^3.0.0" @@ -12242,15 +12242,16 @@ } }, "terser-webpack-plugin": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-2.3.2.tgz", - "integrity": "sha512-SmvB/6gtEPv+CJ88MH5zDOsZdKXPS/Uzv2//e90+wM1IHFUhsguPKEILgzqrM1nQ4acRXN/SV4Obr55SXC+0oA==", + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-2.3.4.tgz", + "integrity": "sha512-Nv96Nws2R2nrFOpbzF6IxRDpIkkIfmhvOws+IqMvYdFLO7o6wAILWFKONFgaYy8+T4LVz77DQW0f7wOeDEAjrg==", "dev": true, "requires": { "cacache": "^13.0.1", "find-cache-dir": "^3.2.0", - "jest-worker": "^24.9.0", - "schema-utils": "^2.6.1", + "jest-worker": "^25.1.0", + "p-limit": "^2.2.2", + "schema-utils": "^2.6.4", "serialize-javascript": "^2.1.2", "source-map": "^0.6.1", "terser": "^4.4.3", @@ -12258,12 +12259,12 @@ }, "dependencies": { "ajv": { - "version": "6.10.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz", - "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==", + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.11.0.tgz", + "integrity": "sha512-nCprB/0syFYy9fVYU1ox1l2KN8S9I+tziH8D4zdZuLT3N6RMlGSGt5FSTpAiHB/Whv8Qs1cWHma1aMKZyaHRKA==", "dev": true, "requires": { - "fast-deep-equal": "^2.0.1", + "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" @@ -12307,6 +12308,12 @@ "integrity": "sha512-i70fVHhmV3DtTl6nqvZOnIjbY0Pe4kAUjwHj8z0zAdgBtYrJyYwLKCCuRBQ5ppkyL0AkN7HKRnETdmdp1zqNXw==", "dev": true }, + "fast-deep-equal": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", + "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==", + "dev": true + }, "find-cache-dir": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.2.0.tgz", @@ -12334,6 +12341,22 @@ "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==", "dev": true }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "jest-worker": { + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-25.1.0.tgz", + "integrity": "sha512-ZHhHtlxOWSxCoNOKHGbiLzXnl42ga9CxDr27H36Qn+15pQZd3R/F24jrmjDelw9j/iHUIWMWs08/u2QN50HHOg==", + "dev": true, + "requires": { + "merge-stream": "^2.0.0", + "supports-color": "^7.0.0" + } + }, "locate-path": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", @@ -12352,6 +12375,15 @@ "semver": "^6.0.0" } }, + "p-limit": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz", + "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, "p-locate": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", @@ -12395,9 +12427,9 @@ } }, "schema-utils": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.6.1.tgz", - "integrity": "sha512-0WXHDs1VDJyo+Zqs9TKLKyD/h7yDpHUhEFsM2CzkICFdoX1av+GBq/J2xRTFfsQO5kBfhZzANf2VcIm84jqDbg==", + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.6.4.tgz", + "integrity": "sha512-VNjcaUxVnEeun6B2fiiUDjXXBtD4ZSH7pdbfIu1pOFwgptDPLMo/z9jr4sUfsjFVPqDCEin/F7IYlq7/E6yDbQ==", "dev": true, "requires": { "ajv": "^6.10.2", @@ -12420,10 +12452,19 @@ "minipass": "^3.1.1" } }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, "terser": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/terser/-/terser-4.6.2.tgz", - "integrity": "sha512-6FUjJdY2i3WZAtYBtnV06OOcOfzl+4hSKYE9wgac8rkLRBToPDDrBB2AcHwQD/OKDxbnvhVy2YgOPWO2SsKWqg==", + "version": "4.6.3", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.6.3.tgz", + "integrity": "sha512-Lw+ieAXmY69d09IIc/yqeBqXpEQIpDGZqT34ui1QWXIUpR2RjbqEkT8X7Lgex19hslSqcWM5iMN2kM11eMsESQ==", "dev": true, "requires": { "commander": "^2.20.0", From f4ef2e15dbf43d773b0cb6c30123708e607e9fff Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 3 Feb 2020 08:15:52 +0000 Subject: [PATCH 083/381] Bump url-polyfill from 1.1.7 to 1.1.8 Bumps [url-polyfill](https://github.com/lifaon74/url-polyfill) from 1.1.7 to 1.1.8. - [Release notes](https://github.com/lifaon74/url-polyfill/releases) - [Commits](https://github.com/lifaon74/url-polyfill/compare/1.1.7...1.1.8) Signed-off-by: dependabot-preview[bot] --- package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index e1903e27da..1daa780f6d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12843,9 +12843,9 @@ } }, "url-polyfill": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/url-polyfill/-/url-polyfill-1.1.7.tgz", - "integrity": "sha512-ZrAxYWCREjmMtL8gSbSiKKLZZticgihCvVBtrFbUVpyoETt8GQJeG2okMWA8XryDAaHMjJfhnc+rnhXRbI4DXA==", + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/url-polyfill/-/url-polyfill-1.1.8.tgz", + "integrity": "sha512-Ey61F4FEqhcu1vHSOMmjl0Vd/RPRLEjMj402qszD/dhMBrVfoUsnIj8KSZo2yj+eIlxJGKFdnm6ES+7UzMgZ3Q==", "dev": true }, "use": { From 1e08750398365202dd2138a195244c19c7993ef1 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 3 Feb 2020 08:17:08 +0000 Subject: [PATCH 084/381] Bump @babel/preset-env from 7.8.3 to 7.8.4 Bumps [@babel/preset-env](https://github.com/babel/babel) from 7.8.3 to 7.8.4. - [Release notes](https://github.com/babel/babel/releases) - [Changelog](https://github.com/babel/babel/blob/master/CHANGELOG.md) - [Commits](https://github.com/babel/babel/compare/v7.8.3...v7.8.4) Signed-off-by: dependabot-preview[bot] --- package-lock.json | 234 +++++++++++++++++++++++----------------------- 1 file changed, 117 insertions(+), 117 deletions(-) diff --git a/package-lock.json b/package-lock.json index e1903e27da..33e205e9a7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,12 +14,12 @@ } }, "@babel/compat-data": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.8.1.tgz", - "integrity": "sha512-Z+6ZOXvyOWYxJ50BwxzdhRnRsGST8Y3jaZgxYig575lTjVSs3KtJnmESwZegg6e2Dn0td1eDhoWlp1wI4BTCPw==", + "version": "7.8.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.8.5.tgz", + "integrity": "sha512-jWYUqQX/ObOhG1UiEkbH5SANsE/8oKXiQWjj7p7xgj9Zmnt//aUvyz4dBkK0HNsS8/cbyC5NmmH87VekW+mXFg==", "dev": true, "requires": { - "browserslist": "^4.8.2", + "browserslist": "^4.8.5", "invariant": "^2.2.4", "semver": "^5.5.0" } @@ -278,9 +278,9 @@ } }, "@babel/generator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.3.tgz", - "integrity": "sha512-WjoPk8hRpDRqqzRpvaR8/gDUPkrnOOeuT2m8cNICJtZH6mwaCo3v0OKMI7Y6SM1pBtyijnLtAL0HDi41pf41ug==", + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.4.tgz", + "integrity": "sha512-PwhclGdRpNAf3IxZb0YVuITPZmmrXz9zf6fH8lT4XbrmfQKr6ryBzhv593P5C6poJRciFCL/eHGW2NuGrgEyxA==", "dev": true, "requires": { "@babel/types": "^7.8.3", @@ -330,9 +330,9 @@ } }, "@babel/parser": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.3.tgz", - "integrity": "sha512-/V72F4Yp/qmHaTALizEm9Gf2eQHV3QyTL3K0cNfijwnMnb1L+LDlAubb/ZnSdGAVzVSWakujHYs1I26x66sMeQ==", + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.4.tgz", + "integrity": "sha512-0fKu/QqildpXmPVaRBoXOlyBb3MC+J0A66x97qEfLOMkn3u6nfY5esWogQwi/K0BjASYy4DbnsEWnpNL6qT5Mw==", "dev": true }, "@babel/template": { @@ -347,16 +347,16 @@ } }, "@babel/traverse": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.3.tgz", - "integrity": "sha512-we+a2lti+eEImHmEXp7bM9cTxGzxPmBiVJlLVD+FuuQMeeO7RaDbutbgeheDkw+Xe3mCfJHnGOWLswT74m2IPg==", + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.4.tgz", + "integrity": "sha512-NGLJPZwnVEyBPLI+bl9y9aSnxMhsKz42so7ApAv9D+b4vAFPpY013FTS9LdKxcABoIYFU52HcYga1pPlx454mg==", "dev": true, "requires": { "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.3", + "@babel/generator": "^7.8.4", "@babel/helper-function-name": "^7.8.3", "@babel/helper-split-export-declaration": "^7.8.3", - "@babel/parser": "^7.8.3", + "@babel/parser": "^7.8.4", "@babel/types": "^7.8.3", "debug": "^4.1.0", "globals": "^11.1.0", @@ -389,15 +389,15 @@ } }, "@babel/helper-compilation-targets": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.8.3.tgz", - "integrity": "sha512-JLylPCsFjhLN+6uBSSh3iYdxKdeO9MNmoY96PE/99d8kyBFaXLORtAVhqN6iHa+wtPeqxKLghDOZry0+Aiw9Tw==", + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.8.4.tgz", + "integrity": "sha512-3k3BsKMvPp5bjxgMdrFyq0UaEO48HciVrOVF0+lon8pp95cyJ2ujAh0TrBHNMnJGT2rr0iKOJPFFbSqjDyf/Pg==", "dev": true, "requires": { - "@babel/compat-data": "^7.8.1", - "browserslist": "^4.8.2", + "@babel/compat-data": "^7.8.4", + "browserslist": "^4.8.5", "invariant": "^2.2.4", - "levenary": "^1.1.0", + "levenary": "^1.1.1", "semver": "^5.5.0" } }, @@ -488,9 +488,9 @@ } }, "@babel/parser": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.3.tgz", - "integrity": "sha512-/V72F4Yp/qmHaTALizEm9Gf2eQHV3QyTL3K0cNfijwnMnb1L+LDlAubb/ZnSdGAVzVSWakujHYs1I26x66sMeQ==", + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.4.tgz", + "integrity": "sha512-0fKu/QqildpXmPVaRBoXOlyBb3MC+J0A66x97qEfLOMkn3u6nfY5esWogQwi/K0BjASYy4DbnsEWnpNL6qT5Mw==", "dev": true }, "@babel/template": { @@ -537,9 +537,9 @@ } }, "@babel/generator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.3.tgz", - "integrity": "sha512-WjoPk8hRpDRqqzRpvaR8/gDUPkrnOOeuT2m8cNICJtZH6mwaCo3v0OKMI7Y6SM1pBtyijnLtAL0HDi41pf41ug==", + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.4.tgz", + "integrity": "sha512-PwhclGdRpNAf3IxZb0YVuITPZmmrXz9zf6fH8lT4XbrmfQKr6ryBzhv593P5C6poJRciFCL/eHGW2NuGrgEyxA==", "dev": true, "requires": { "@babel/types": "^7.8.3", @@ -589,9 +589,9 @@ } }, "@babel/parser": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.3.tgz", - "integrity": "sha512-/V72F4Yp/qmHaTALizEm9Gf2eQHV3QyTL3K0cNfijwnMnb1L+LDlAubb/ZnSdGAVzVSWakujHYs1I26x66sMeQ==", + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.4.tgz", + "integrity": "sha512-0fKu/QqildpXmPVaRBoXOlyBb3MC+J0A66x97qEfLOMkn3u6nfY5esWogQwi/K0BjASYy4DbnsEWnpNL6qT5Mw==", "dev": true }, "@babel/template": { @@ -606,16 +606,16 @@ } }, "@babel/traverse": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.3.tgz", - "integrity": "sha512-we+a2lti+eEImHmEXp7bM9cTxGzxPmBiVJlLVD+FuuQMeeO7RaDbutbgeheDkw+Xe3mCfJHnGOWLswT74m2IPg==", + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.4.tgz", + "integrity": "sha512-NGLJPZwnVEyBPLI+bl9y9aSnxMhsKz42so7ApAv9D+b4vAFPpY013FTS9LdKxcABoIYFU52HcYga1pPlx454mg==", "dev": true, "requires": { "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.3", + "@babel/generator": "^7.8.4", "@babel/helper-function-name": "^7.8.3", "@babel/helper-split-export-declaration": "^7.8.3", - "@babel/parser": "^7.8.3", + "@babel/parser": "^7.8.4", "@babel/types": "^7.8.3", "debug": "^4.1.0", "globals": "^11.1.0", @@ -773,9 +773,9 @@ } }, "@babel/parser": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.3.tgz", - "integrity": "sha512-/V72F4Yp/qmHaTALizEm9Gf2eQHV3QyTL3K0cNfijwnMnb1L+LDlAubb/ZnSdGAVzVSWakujHYs1I26x66sMeQ==", + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.4.tgz", + "integrity": "sha512-0fKu/QqildpXmPVaRBoXOlyBb3MC+J0A66x97qEfLOMkn3u6nfY5esWogQwi/K0BjASYy4DbnsEWnpNL6qT5Mw==", "dev": true }, "@babel/template": { @@ -862,9 +862,9 @@ } }, "@babel/generator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.3.tgz", - "integrity": "sha512-WjoPk8hRpDRqqzRpvaR8/gDUPkrnOOeuT2m8cNICJtZH6mwaCo3v0OKMI7Y6SM1pBtyijnLtAL0HDi41pf41ug==", + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.4.tgz", + "integrity": "sha512-PwhclGdRpNAf3IxZb0YVuITPZmmrXz9zf6fH8lT4XbrmfQKr6ryBzhv593P5C6poJRciFCL/eHGW2NuGrgEyxA==", "dev": true, "requires": { "@babel/types": "^7.8.3", @@ -914,9 +914,9 @@ } }, "@babel/parser": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.3.tgz", - "integrity": "sha512-/V72F4Yp/qmHaTALizEm9Gf2eQHV3QyTL3K0cNfijwnMnb1L+LDlAubb/ZnSdGAVzVSWakujHYs1I26x66sMeQ==", + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.4.tgz", + "integrity": "sha512-0fKu/QqildpXmPVaRBoXOlyBb3MC+J0A66x97qEfLOMkn3u6nfY5esWogQwi/K0BjASYy4DbnsEWnpNL6qT5Mw==", "dev": true }, "@babel/template": { @@ -931,16 +931,16 @@ } }, "@babel/traverse": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.3.tgz", - "integrity": "sha512-we+a2lti+eEImHmEXp7bM9cTxGzxPmBiVJlLVD+FuuQMeeO7RaDbutbgeheDkw+Xe3mCfJHnGOWLswT74m2IPg==", + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.4.tgz", + "integrity": "sha512-NGLJPZwnVEyBPLI+bl9y9aSnxMhsKz42so7ApAv9D+b4vAFPpY013FTS9LdKxcABoIYFU52HcYga1pPlx454mg==", "dev": true, "requires": { "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.3", + "@babel/generator": "^7.8.4", "@babel/helper-function-name": "^7.8.3", "@babel/helper-split-export-declaration": "^7.8.3", - "@babel/parser": "^7.8.3", + "@babel/parser": "^7.8.4", "@babel/types": "^7.8.3", "debug": "^4.1.0", "globals": "^11.1.0", @@ -994,9 +994,9 @@ } }, "@babel/generator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.3.tgz", - "integrity": "sha512-WjoPk8hRpDRqqzRpvaR8/gDUPkrnOOeuT2m8cNICJtZH6mwaCo3v0OKMI7Y6SM1pBtyijnLtAL0HDi41pf41ug==", + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.4.tgz", + "integrity": "sha512-PwhclGdRpNAf3IxZb0YVuITPZmmrXz9zf6fH8lT4XbrmfQKr6ryBzhv593P5C6poJRciFCL/eHGW2NuGrgEyxA==", "dev": true, "requires": { "@babel/types": "^7.8.3", @@ -1046,9 +1046,9 @@ } }, "@babel/parser": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.3.tgz", - "integrity": "sha512-/V72F4Yp/qmHaTALizEm9Gf2eQHV3QyTL3K0cNfijwnMnb1L+LDlAubb/ZnSdGAVzVSWakujHYs1I26x66sMeQ==", + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.4.tgz", + "integrity": "sha512-0fKu/QqildpXmPVaRBoXOlyBb3MC+J0A66x97qEfLOMkn3u6nfY5esWogQwi/K0BjASYy4DbnsEWnpNL6qT5Mw==", "dev": true }, "@babel/template": { @@ -1063,16 +1063,16 @@ } }, "@babel/traverse": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.3.tgz", - "integrity": "sha512-we+a2lti+eEImHmEXp7bM9cTxGzxPmBiVJlLVD+FuuQMeeO7RaDbutbgeheDkw+Xe3mCfJHnGOWLswT74m2IPg==", + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.4.tgz", + "integrity": "sha512-NGLJPZwnVEyBPLI+bl9y9aSnxMhsKz42so7ApAv9D+b4vAFPpY013FTS9LdKxcABoIYFU52HcYga1pPlx454mg==", "dev": true, "requires": { "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.3", + "@babel/generator": "^7.8.4", "@babel/helper-function-name": "^7.8.3", "@babel/helper-split-export-declaration": "^7.8.3", - "@babel/parser": "^7.8.3", + "@babel/parser": "^7.8.4", "@babel/types": "^7.8.3", "debug": "^4.1.0", "globals": "^11.1.0", @@ -1135,9 +1135,9 @@ } }, "@babel/parser": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.3.tgz", - "integrity": "sha512-/V72F4Yp/qmHaTALizEm9Gf2eQHV3QyTL3K0cNfijwnMnb1L+LDlAubb/ZnSdGAVzVSWakujHYs1I26x66sMeQ==", + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.4.tgz", + "integrity": "sha512-0fKu/QqildpXmPVaRBoXOlyBb3MC+J0A66x97qEfLOMkn3u6nfY5esWogQwi/K0BjASYy4DbnsEWnpNL6qT5Mw==", "dev": true }, "@babel/template": { @@ -1195,9 +1195,9 @@ } }, "@babel/generator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.3.tgz", - "integrity": "sha512-WjoPk8hRpDRqqzRpvaR8/gDUPkrnOOeuT2m8cNICJtZH6mwaCo3v0OKMI7Y6SM1pBtyijnLtAL0HDi41pf41ug==", + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.4.tgz", + "integrity": "sha512-PwhclGdRpNAf3IxZb0YVuITPZmmrXz9zf6fH8lT4XbrmfQKr6ryBzhv593P5C6poJRciFCL/eHGW2NuGrgEyxA==", "dev": true, "requires": { "@babel/types": "^7.8.3", @@ -1247,9 +1247,9 @@ } }, "@babel/parser": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.3.tgz", - "integrity": "sha512-/V72F4Yp/qmHaTALizEm9Gf2eQHV3QyTL3K0cNfijwnMnb1L+LDlAubb/ZnSdGAVzVSWakujHYs1I26x66sMeQ==", + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.4.tgz", + "integrity": "sha512-0fKu/QqildpXmPVaRBoXOlyBb3MC+J0A66x97qEfLOMkn3u6nfY5esWogQwi/K0BjASYy4DbnsEWnpNL6qT5Mw==", "dev": true }, "@babel/template": { @@ -1264,16 +1264,16 @@ } }, "@babel/traverse": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.3.tgz", - "integrity": "sha512-we+a2lti+eEImHmEXp7bM9cTxGzxPmBiVJlLVD+FuuQMeeO7RaDbutbgeheDkw+Xe3mCfJHnGOWLswT74m2IPg==", + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.4.tgz", + "integrity": "sha512-NGLJPZwnVEyBPLI+bl9y9aSnxMhsKz42so7ApAv9D+b4vAFPpY013FTS9LdKxcABoIYFU52HcYga1pPlx454mg==", "dev": true, "requires": { "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.3", + "@babel/generator": "^7.8.4", "@babel/helper-function-name": "^7.8.3", "@babel/helper-split-export-declaration": "^7.8.3", - "@babel/parser": "^7.8.3", + "@babel/parser": "^7.8.4", "@babel/types": "^7.8.3", "debug": "^4.1.0", "globals": "^11.1.0", @@ -1733,9 +1733,9 @@ } }, "@babel/parser": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.3.tgz", - "integrity": "sha512-/V72F4Yp/qmHaTALizEm9Gf2eQHV3QyTL3K0cNfijwnMnb1L+LDlAubb/ZnSdGAVzVSWakujHYs1I26x66sMeQ==", + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.4.tgz", + "integrity": "sha512-0fKu/QqildpXmPVaRBoXOlyBb3MC+J0A66x97qEfLOMkn3u6nfY5esWogQwi/K0BjASYy4DbnsEWnpNL6qT5Mw==", "dev": true }, "@babel/template": { @@ -1810,9 +1810,9 @@ } }, "@babel/plugin-transform-for-of": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.8.3.tgz", - "integrity": "sha512-ZjXznLNTxhpf4Q5q3x1NsngzGA38t9naWH8Gt+0qYZEJAcvPI9waSStSh56u19Ofjr7QmD0wUsQ8hw8s/p1VnA==", + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.8.4.tgz", + "integrity": "sha512-iAXNlOWvcYUYoV8YIxwS7TxGRJcxyl8eQCfT+A5j8sKUzRFvJdcyjp97jL2IghWSRDaL2PU2O2tX8Cu9dTBq5A==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.8.3" @@ -1869,9 +1869,9 @@ } }, "@babel/parser": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.3.tgz", - "integrity": "sha512-/V72F4Yp/qmHaTALizEm9Gf2eQHV3QyTL3K0cNfijwnMnb1L+LDlAubb/ZnSdGAVzVSWakujHYs1I26x66sMeQ==", + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.4.tgz", + "integrity": "sha512-0fKu/QqildpXmPVaRBoXOlyBb3MC+J0A66x97qEfLOMkn3u6nfY5esWogQwi/K0BjASYy4DbnsEWnpNL6qT5Mw==", "dev": true }, "@babel/template": { @@ -1990,9 +1990,9 @@ } }, "@babel/plugin-transform-parameters": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.8.3.tgz", - "integrity": "sha512-/pqngtGb54JwMBZ6S/D3XYylQDFtGjWrnoCF4gXZOUpFV/ujbxnoNGNvDGu6doFWRPBveE72qTx/RRU44j5I/Q==", + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.8.4.tgz", + "integrity": "sha512-IsS3oTxeTsZlE5KqzTbcC2sV0P9pXdec53SU+Yxv7o/6dvGM5AkTotQKhoSffhNgZ/dftsSiOoxy7evCYJXzVA==", "dev": true, "requires": { "@babel/helper-call-delegate": "^7.8.3", @@ -2088,9 +2088,9 @@ } }, "@babel/plugin-transform-typeof-symbol": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.8.3.tgz", - "integrity": "sha512-3TrkKd4LPqm4jHs6nPtSDI/SV9Cm5PRJkHLUgTcqRQQTMAZ44ZaAdDZJtvWFSaRcvT0a1rTmJ5ZA5tDKjleF3g==", + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.8.4.tgz", + "integrity": "sha512-2QKyfjGdvuNfHsb7qnBBlKclbD4CfshH2KvDabiijLMGXPHJXGxtDzwIF7bQP+T0ysw8fYTtxPafgfs/c1Lrqg==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.8.3" @@ -2107,13 +2107,13 @@ } }, "@babel/preset-env": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.8.3.tgz", - "integrity": "sha512-Rs4RPL2KjSLSE2mWAx5/iCH+GC1ikKdxPrhnRS6PfFVaiZeom22VFKN4X8ZthyN61kAaR05tfXTbCvatl9WIQg==", + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.8.4.tgz", + "integrity": "sha512-HihCgpr45AnSOHRbS5cWNTINs0TwaR8BS8xIIH+QwiW8cKL0llV91njQMpeMReEPVs+1Ao0x3RLEBLtt1hOq4w==", "dev": true, "requires": { - "@babel/compat-data": "^7.8.0", - "@babel/helper-compilation-targets": "^7.8.3", + "@babel/compat-data": "^7.8.4", + "@babel/helper-compilation-targets": "^7.8.4", "@babel/helper-module-imports": "^7.8.3", "@babel/helper-plugin-utils": "^7.8.3", "@babel/plugin-proposal-async-generator-functions": "^7.8.3", @@ -2142,7 +2142,7 @@ "@babel/plugin-transform-dotall-regex": "^7.8.3", "@babel/plugin-transform-duplicate-keys": "^7.8.3", "@babel/plugin-transform-exponentiation-operator": "^7.8.3", - "@babel/plugin-transform-for-of": "^7.8.3", + "@babel/plugin-transform-for-of": "^7.8.4", "@babel/plugin-transform-function-name": "^7.8.3", "@babel/plugin-transform-literals": "^7.8.3", "@babel/plugin-transform-member-expression-literals": "^7.8.3", @@ -2153,7 +2153,7 @@ "@babel/plugin-transform-named-capturing-groups-regex": "^7.8.3", "@babel/plugin-transform-new-target": "^7.8.3", "@babel/plugin-transform-object-super": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.8.4", "@babel/plugin-transform-property-literals": "^7.8.3", "@babel/plugin-transform-regenerator": "^7.8.3", "@babel/plugin-transform-reserved-words": "^7.8.3", @@ -2161,13 +2161,13 @@ "@babel/plugin-transform-spread": "^7.8.3", "@babel/plugin-transform-sticky-regex": "^7.8.3", "@babel/plugin-transform-template-literals": "^7.8.3", - "@babel/plugin-transform-typeof-symbol": "^7.8.3", + "@babel/plugin-transform-typeof-symbol": "^7.8.4", "@babel/plugin-transform-unicode-regex": "^7.8.3", "@babel/types": "^7.8.3", - "browserslist": "^4.8.2", + "browserslist": "^4.8.5", "core-js-compat": "^3.6.2", "invariant": "^2.2.2", - "levenary": "^1.1.0", + "levenary": "^1.1.1", "semver": "^5.5.0" }, "dependencies": { @@ -3491,14 +3491,14 @@ } }, "browserslist": { - "version": "4.8.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.8.3.tgz", - "integrity": "sha512-iU43cMMknxG1ClEZ2MDKeonKE1CCrFVkQK2AqO2YWFmvIrx4JWrvQ4w4hQez6EpVI8rHTtqh/ruHHDHSOKxvUg==", + "version": "4.8.6", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.8.6.tgz", + "integrity": "sha512-ZHao85gf0eZ0ESxLfCp73GG9O/VTytYDIkIiZDlURppLTI9wErSM/5yAKEq6rcUdxBLjMELmrYUJGg5sxGKMHg==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001017", - "electron-to-chromium": "^1.3.322", - "node-releases": "^1.1.44" + "caniuse-lite": "^1.0.30001023", + "electron-to-chromium": "^1.3.341", + "node-releases": "^1.1.47" } }, "buble": { @@ -3683,9 +3683,9 @@ } }, "caniuse-lite": { - "version": "1.0.30001021", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001021.tgz", - "integrity": "sha512-wuMhT7/hwkgd8gldgp2jcrUjOU9RXJ4XxGumQeOsUr91l3WwmM68Cpa/ymCnWEDqakwFXhuDQbaKNHXBPgeE9g==", + "version": "1.0.30001023", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001023.tgz", + "integrity": "sha512-C5TDMiYG11EOhVOA62W1p3UsJ2z4DsHtMBQtjzp3ZsUglcQn62WOUgW0y795c7A5uZ+GCEIvzkMatLIlAsbNTA==", "dev": true }, "caseless": { @@ -4661,9 +4661,9 @@ "dev": true }, "electron-to-chromium": { - "version": "1.3.338", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.338.tgz", - "integrity": "sha512-wlmfixuHEc9CkfOKgcqdtzBmRW4NStM9ptl5oPILY2UDyHuSXb3Yit+yLVyLObTgGuMMU36hhnfs2GDJId7ctA==", + "version": "1.3.344", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.344.tgz", + "integrity": "sha512-tvbx2Wl8WBR+ym3u492D0L6/jH+8NoQXqe46+QhbWH3voVPauGuZYeb1QAXYoOAWuiP2dbSvlBx0kQ1F3hu/Mw==", "dev": true }, "elliptic": { @@ -8473,9 +8473,9 @@ "dev": true }, "levenary": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/levenary/-/levenary-1.1.0.tgz", - "integrity": "sha512-VHcwhO0UTpUW7rLPN2/OiWJdgA1e9BqEDALhrgCe/F+uUJnep6CoUsTzMeP8Rh0NGr9uKquXxqe7lwLZo509nQ==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/levenary/-/levenary-1.1.1.tgz", + "integrity": "sha512-mkAdOIt79FD6irqjYSs4rdbnlT5vRonMEvBVPVb3XmevfS8kgRXwfes0dhPdEtzTWD/1eNE/Bm/G1iRt6DcnQQ==", "dev": true, "requires": { "leven": "^3.1.0" @@ -9487,9 +9487,9 @@ } }, "node-releases": { - "version": "1.1.46", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.46.tgz", - "integrity": "sha512-YOjdx+Uoh9FbRO7yVYbnbt1puRWPQMemR3SutLeyv2XfxKs1ihpe0OLAUwBPEP2ImNH/PZC7SEiC6j32dwRZ7g==", + "version": "1.1.47", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.47.tgz", + "integrity": "sha512-k4xjVPx5FpwBUj0Gw7uvFOTF4Ep8Hok1I6qjwL3pLfwe7Y0REQSAqOwwv9TWBCUtMHxcXfY4PgRLRozcChvTcA==", "dev": true, "requires": { "semver": "^6.3.0" From cf0b8af3565c6ca9337fafab54418255f526f8bb Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 3 Feb 2020 08:17:49 +0000 Subject: [PATCH 085/381] Bump rollup from 1.29.1 to 1.31.0 Bumps [rollup](https://github.com/rollup/rollup) from 1.29.1 to 1.31.0. - [Release notes](https://github.com/rollup/rollup/releases) - [Changelog](https://github.com/rollup/rollup/blob/master/CHANGELOG.md) - [Commits](https://github.com/rollup/rollup/compare/v1.29.1...v1.31.0) Signed-off-by: dependabot-preview[bot] --- package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index e1903e27da..b13eefc2d0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10893,9 +10893,9 @@ } }, "rollup": { - "version": "1.29.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-1.29.1.tgz", - "integrity": "sha512-dGQ+b9d1FOX/gluiggTAVnTvzQZUEkCi/TwZcax7ujugVRHs0nkYJlV9U4hsifGEMojnO+jvEML2CJQ6qXgbHA==", + "version": "1.31.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-1.31.0.tgz", + "integrity": "sha512-9C6ovSyNeEwvuRuUUmsTpJcXac1AwSL1a3x+O5lpmQKZqi5mmrjauLeqIjvREC+yNRR8fPdzByojDng+af3nVw==", "dev": true, "requires": { "@types/estree": "*", From c2bfe76ee5a5406d686bae5563755c4adc6b53c3 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 3 Feb 2020 08:18:51 +0000 Subject: [PATCH 086/381] Bump webpack-dev-server from 3.10.1 to 3.10.2 Bumps [webpack-dev-server](https://github.com/webpack/webpack-dev-server) from 3.10.1 to 3.10.2. - [Release notes](https://github.com/webpack/webpack-dev-server/releases) - [Changelog](https://github.com/webpack/webpack-dev-server/blob/master/CHANGELOG.md) - [Commits](https://github.com/webpack/webpack-dev-server/compare/v3.10.1...v3.10.2) Signed-off-by: dependabot-preview[bot] --- package-lock.json | 48 ++++++++++++++++++----------------------------- 1 file changed, 18 insertions(+), 30 deletions(-) diff --git a/package-lock.json b/package-lock.json index e1903e27da..22e7a58c72 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3957,12 +3957,20 @@ "dev": true }, "compressible": { - "version": "2.0.17", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.17.tgz", - "integrity": "sha512-BGHeLCK1GV7j1bSmQQAi26X+GgWcTjLr/0tzSvMCl3LH1w1IJ4PFSPoV5316b30cneTziC+B1a+3OjoSUcQYmw==", + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", "dev": true, "requires": { - "mime-db": ">= 1.40.0 < 2" + "mime-db": ">= 1.43.0 < 2" + }, + "dependencies": { + "mime-db": { + "version": "1.43.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.43.0.tgz", + "integrity": "sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ==", + "dev": true + } } }, "compression": { @@ -11886,9 +11894,9 @@ }, "dependencies": { "readable-stream": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz", - "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==", + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.5.0.tgz", + "integrity": "sha512-gSz026xs2LfxBPudDuI41V1lka8cxg64E66SGe78zJlsUofOg/yqwezdIcdfwik6B4h8LFmWPA9ef9X3FiNFLA==", "dev": true, "requires": { "inherits": "^2.0.3", @@ -13200,9 +13208,9 @@ } }, "webpack-dev-server": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.10.1.tgz", - "integrity": "sha512-AGG4+XrrXn4rbZUueyNrQgO4KGnol+0wm3MPdqGLmmA+NofZl3blZQKxZ9BND6RDNuvAK9OMYClhjOSnxpWRoA==", + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.10.2.tgz", + "integrity": "sha512-pxZKPYb+n77UN8u9YxXT4IaIrGcNtijh/mi8TXbErHmczw0DtPnMTTjHj+eNjkqLOaAZM/qD7V59j/qJsEiaZA==", "dev": true, "requires": { "ansi-html": "0.0.7", @@ -13252,26 +13260,6 @@ "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true }, - "chokidar": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", - "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", - "dev": true, - "requires": { - "anymatch": "^2.0.0", - "async-each": "^1.0.1", - "braces": "^2.3.2", - "fsevents": "^1.2.7", - "glob-parent": "^3.1.0", - "inherits": "^2.0.3", - "is-binary-path": "^1.0.0", - "is-glob": "^4.0.0", - "normalize-path": "^3.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.2.1", - "upath": "^1.1.1" - } - }, "get-caller-file": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", From 6a5a1f7a72c93ea465bf72c800e6323d54c5e7b6 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 3 Feb 2020 08:19:24 +0000 Subject: [PATCH 087/381] Bump @babel/core from 7.8.3 to 7.8.4 Bumps [@babel/core](https://github.com/babel/babel) from 7.8.3 to 7.8.4. - [Release notes](https://github.com/babel/babel/releases) - [Changelog](https://github.com/babel/babel/blob/master/CHANGELOG.md) - [Commits](https://github.com/babel/babel/compare/v7.8.3...v7.8.4) Signed-off-by: dependabot-preview[bot] --- package-lock.json | 66 +++++++++++++++++++++++------------------------ 1 file changed, 33 insertions(+), 33 deletions(-) diff --git a/package-lock.json b/package-lock.json index e1903e27da..0ad495a0b2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -25,17 +25,17 @@ } }, "@babel/core": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.8.3.tgz", - "integrity": "sha512-4XFkf8AwyrEG7Ziu3L2L0Cv+WyY47Tcsp70JFmpftbAA1K7YL/sgE9jh9HyNj08Y/U50ItUchpN0w6HxAoX1rA==", + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.8.4.tgz", + "integrity": "sha512-0LiLrB2PwrVI+a2/IEskBopDYSd8BCb3rOvH7D5tzoWd696TBEduBvuLVm4Nx6rltrLZqvI3MCalB2K2aVzQjA==", "dev": true, "requires": { "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.3", - "@babel/helpers": "^7.8.3", - "@babel/parser": "^7.8.3", + "@babel/generator": "^7.8.4", + "@babel/helpers": "^7.8.4", + "@babel/parser": "^7.8.4", "@babel/template": "^7.8.3", - "@babel/traverse": "^7.8.3", + "@babel/traverse": "^7.8.4", "@babel/types": "^7.8.3", "convert-source-map": "^1.7.0", "debug": "^4.1.0", @@ -57,9 +57,9 @@ } }, "@babel/generator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.3.tgz", - "integrity": "sha512-WjoPk8hRpDRqqzRpvaR8/gDUPkrnOOeuT2m8cNICJtZH6mwaCo3v0OKMI7Y6SM1pBtyijnLtAL0HDi41pf41ug==", + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.4.tgz", + "integrity": "sha512-PwhclGdRpNAf3IxZb0YVuITPZmmrXz9zf6fH8lT4XbrmfQKr6ryBzhv593P5C6poJRciFCL/eHGW2NuGrgEyxA==", "dev": true, "requires": { "@babel/types": "^7.8.3", @@ -109,9 +109,9 @@ } }, "@babel/parser": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.3.tgz", - "integrity": "sha512-/V72F4Yp/qmHaTALizEm9Gf2eQHV3QyTL3K0cNfijwnMnb1L+LDlAubb/ZnSdGAVzVSWakujHYs1I26x66sMeQ==", + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.4.tgz", + "integrity": "sha512-0fKu/QqildpXmPVaRBoXOlyBb3MC+J0A66x97qEfLOMkn3u6nfY5esWogQwi/K0BjASYy4DbnsEWnpNL6qT5Mw==", "dev": true }, "@babel/template": { @@ -126,16 +126,16 @@ } }, "@babel/traverse": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.3.tgz", - "integrity": "sha512-we+a2lti+eEImHmEXp7bM9cTxGzxPmBiVJlLVD+FuuQMeeO7RaDbutbgeheDkw+Xe3mCfJHnGOWLswT74m2IPg==", + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.4.tgz", + "integrity": "sha512-NGLJPZwnVEyBPLI+bl9y9aSnxMhsKz42so7ApAv9D+b4vAFPpY013FTS9LdKxcABoIYFU52HcYga1pPlx454mg==", "dev": true, "requires": { "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.3", + "@babel/generator": "^7.8.4", "@babel/helper-function-name": "^7.8.3", "@babel/helper-split-export-declaration": "^7.8.3", - "@babel/parser": "^7.8.3", + "@babel/parser": "^7.8.4", "@babel/types": "^7.8.3", "debug": "^4.1.0", "globals": "^11.1.0", @@ -1306,13 +1306,13 @@ } }, "@babel/helpers": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.8.3.tgz", - "integrity": "sha512-LmU3q9Pah/XyZU89QvBgGt+BCsTPoQa+73RxAQh8fb8qkDyIfeQnmgs+hvzhTCKTzqOyk7JTkS3MS1S8Mq5yrQ==", + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.8.4.tgz", + "integrity": "sha512-VPbe7wcQ4chu4TDQjimHv/5tj73qz88o12EPkO2ValS2QiQS/1F2SsjyIGNnAD0vF/nZS6Cf9i+vW6HIlnaR8w==", "dev": true, "requires": { "@babel/template": "^7.8.3", - "@babel/traverse": "^7.8.3", + "@babel/traverse": "^7.8.4", "@babel/types": "^7.8.3" }, "dependencies": { @@ -1326,9 +1326,9 @@ } }, "@babel/generator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.3.tgz", - "integrity": "sha512-WjoPk8hRpDRqqzRpvaR8/gDUPkrnOOeuT2m8cNICJtZH6mwaCo3v0OKMI7Y6SM1pBtyijnLtAL0HDi41pf41ug==", + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.4.tgz", + "integrity": "sha512-PwhclGdRpNAf3IxZb0YVuITPZmmrXz9zf6fH8lT4XbrmfQKr6ryBzhv593P5C6poJRciFCL/eHGW2NuGrgEyxA==", "dev": true, "requires": { "@babel/types": "^7.8.3", @@ -1378,9 +1378,9 @@ } }, "@babel/parser": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.3.tgz", - "integrity": "sha512-/V72F4Yp/qmHaTALizEm9Gf2eQHV3QyTL3K0cNfijwnMnb1L+LDlAubb/ZnSdGAVzVSWakujHYs1I26x66sMeQ==", + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.4.tgz", + "integrity": "sha512-0fKu/QqildpXmPVaRBoXOlyBb3MC+J0A66x97qEfLOMkn3u6nfY5esWogQwi/K0BjASYy4DbnsEWnpNL6qT5Mw==", "dev": true }, "@babel/template": { @@ -1395,16 +1395,16 @@ } }, "@babel/traverse": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.3.tgz", - "integrity": "sha512-we+a2lti+eEImHmEXp7bM9cTxGzxPmBiVJlLVD+FuuQMeeO7RaDbutbgeheDkw+Xe3mCfJHnGOWLswT74m2IPg==", + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.4.tgz", + "integrity": "sha512-NGLJPZwnVEyBPLI+bl9y9aSnxMhsKz42so7ApAv9D+b4vAFPpY013FTS9LdKxcABoIYFU52HcYga1pPlx454mg==", "dev": true, "requires": { "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.3", + "@babel/generator": "^7.8.4", "@babel/helper-function-name": "^7.8.3", "@babel/helper-split-export-declaration": "^7.8.3", - "@babel/parser": "^7.8.3", + "@babel/parser": "^7.8.4", "@babel/types": "^7.8.3", "debug": "^4.1.0", "globals": "^11.1.0", From a4915d0ef67d4bcfc20d6fdd28a13c82feeb5a64 Mon Sep 17 00:00:00 2001 From: Frederic Junod Date: Mon, 3 Feb 2020 09:40:05 +0100 Subject: [PATCH 088/381] Update expected image for layer-vectortile-rotate-hidpi rendering test --- .../expected.png | Bin 147388 -> 137360 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/rendering/cases/layer-vectortile-rotate-hidpi/expected.png b/rendering/cases/layer-vectortile-rotate-hidpi/expected.png index 737041c17979c20e774209c760e779d3629466e0..b508c7942114c99e62b1853f069728929f3d9f47 100644 GIT binary patch literal 137360 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 z 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

Z-XmQakUE1Fz65i9sh$4-fsv$r) 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
Me34YDyrObQEF;o!N) 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 q(VjD+LRrdGd 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 RuthlVqadp)Qzc~{@;{AaIJf`+ literal 147388 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 From e727a3fe2387fb6ff4cc3a80d1b5420e100b014b Mon Sep 17 00:00:00 2001 From: Andreas Hocevar Date: Tue, 4 Feb 2020 08:11:29 +0100 Subject: [PATCH 089/381] Update elm-pep to fix builds for IE < 11 --- package-lock.json | 6 +++--- package.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index c4f38e9d6b..9b5f99ffc4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4690,9 +4690,9 @@ } }, "elm-pep": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/elm-pep/-/elm-pep-1.0.3.tgz", - "integrity": "sha512-Tz23Fo0t12FH0wWdRgGbvgSYfB2sruycV5WVLa3LmA2y3/fFHo4FYB151Y3nWt3G+IBIFXrC0sb+psfGuzRTxQ==" + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/elm-pep/-/elm-pep-1.0.4.tgz", + "integrity": "sha512-Agx1VJzKKjRWL06yipX6m+Ew7WLiB73VWdkynsFc1CoA4gyY/o8wi9cMcy4B3A5DKwEEqJlr5FU2IsKOEwKG+g==" }, "emoji-regex": { "version": "7.0.3", diff --git a/package.json b/package.json index 5c8456927e..5ca591be21 100644 --- a/package.json +++ b/package.json @@ -36,7 +36,7 @@ "url": "https://github.com/openlayers/openlayers/issues" }, "dependencies": { - "elm-pep": "^1.0.2", + "elm-pep": "^1.0.4", "pbf": "3.2.1", "pixelworks": "1.1.0", "rbush": "^3.0.1" From 3082972cced1825b85f75bbe10ed06d7528390dc Mon Sep 17 00:00:00 2001 From: Jeremy Smith Date: Wed, 5 Feb 2020 16:46:45 +1000 Subject: [PATCH 090/381] Updates the option to be called showFullExtent --- src/ol/View.js | 23 ++++++++++++++--------- src/ol/resolutionconstraint.js | 24 ++++++++++++------------ test/spec/ol/view.test.js | 4 ++-- 3 files changed, 28 insertions(+), 23 deletions(-) diff --git a/src/ol/View.js b/src/ol/View.js index d2ab683f81..bbc373067a 100644 --- a/src/ol/View.js +++ b/src/ol/View.js @@ -129,9 +129,14 @@ import {createMinMaxResolution} from './resolutionconstraint.js'; * @property {boolean} [smoothResolutionConstraint=true] If true, the resolution * min/max values will be applied smoothly, i. e. allow the view to exceed slightly * the given resolution or zoom bounds. - * @property {boolean} [constrainOneAxis=false] If true, the extent constraint can - * be exceeded along one but not both axes, allowing the whole extent to be visible - * on the map. + * @property {boolean} [showFullExtent=false] Allow the view to be zoomed out to + * show the full configured extent. By default, when a view is configured with an + * extent, users will not be able to zoom out so the viewport exceeds the extent in + * either dimension. This means the full extent may not be visible if the viewport + * is taller or wider than the aspect ratio of the configured extent. If + * showFullExtent is true, the user will be able to zoom out so that the viewport + * exceeds the height or width of the configured extent, but not both, allowing the + * full extent to be shown. * @property {import("./proj.js").ProjectionLike} [projection='EPSG:3857'] The * projection. The default is Spherical Mercator. * @property {number} [resolution] The initial resolution for the view. The @@ -1614,8 +1619,8 @@ export function createResolutionConstraint(options) { const smooth = options.smoothResolutionConstraint !== undefined ? options.smoothResolutionConstraint : true; - const oneAxis = - options.constrainOneAxis !== undefined ? options.constrainOneAxis : false; + const showFullExtent = + options.showFullExtent !== undefined ? options.showFullExtent : false; const projection = createProjection(options.projection, 'EPSG:3857'); const projExtent = projection.getExtent(); @@ -1634,10 +1639,10 @@ export function createResolutionConstraint(options) { if (options.constrainResolution) { resolutionConstraint = createSnapToResolutions(resolutions, smooth, - !constrainOnlyCenter && extent, oneAxis); + !constrainOnlyCenter && extent, showFullExtent); } else { resolutionConstraint = createMinMaxResolution(maxResolution, minResolution, smooth, - !constrainOnlyCenter && extent, oneAxis); + !constrainOnlyCenter && extent, showFullExtent); } } else { // calculate the default min and max resolution @@ -1683,10 +1688,10 @@ export function createResolutionConstraint(options) { if (options.constrainResolution) { resolutionConstraint = createSnapToPower( zoomFactor, maxResolution, minResolution, smooth, - !constrainOnlyCenter && extent, oneAxis); + !constrainOnlyCenter && extent, showFullExtent); } else { resolutionConstraint = createMinMaxResolution(maxResolution, minResolution, smooth, - !constrainOnlyCenter && extent, oneAxis); + !constrainOnlyCenter && extent, showFullExtent); } } return {constraint: resolutionConstraint, maxResolution: maxResolution, diff --git a/src/ol/resolutionconstraint.js b/src/ol/resolutionconstraint.js index 73dec32ace..e0fa04e6b7 100644 --- a/src/ol/resolutionconstraint.js +++ b/src/ol/resolutionconstraint.js @@ -16,14 +16,14 @@ import {clamp} from './math.js'; * @param {number} resolution Resolution * @param {import("./extent.js").Extent=} maxExtent Maximum allowed extent. * @param {import("./size.js").Size} viewportSize Viewport size. - * @param {boolean} oneAxis Whether we can exceed extent constraint along one axis but not both. + * @param {boolean} showFullExtent Whether to show the full extent. * @return {number} Capped resolution. */ -function getViewportClampedResolution(resolution, maxExtent, viewportSize, oneAxis) { +function getViewportClampedResolution(resolution, maxExtent, viewportSize, showFullExtent) { const xResolution = getWidth(maxExtent) / viewportSize[0]; const yResolution = getHeight(maxExtent) / viewportSize[1]; - if (oneAxis) { + if (showFullExtent) { return Math.min(resolution, Math.max(xResolution, yResolution)); } return Math.min(resolution, Math.min(xResolution, yResolution)); @@ -57,10 +57,10 @@ function getSmoothClampedResolution(resolution, maxResolution, minResolution) { * @param {Array} resolutions Resolutions. * @param {boolean=} opt_smooth If true, the view will be able to slightly exceed resolution limits. Default: true. * @param {import("./extent.js").Extent=} opt_maxExtent Maximum allowed extent. - * @param {boolean=} opt_oneAxis If true, can exceed extent constraint along one axis but not both. Default: false. + * @param {boolean=} opt_showFullExtent If true, allows us to show the full extent. Default: false. * @return {Type} Zoom function. */ -export function createSnapToResolutions(resolutions, opt_smooth, opt_maxExtent, opt_oneAxis) { +export function createSnapToResolutions(resolutions, opt_smooth, opt_maxExtent, opt_showFullExtent) { return ( /** * @param {number|undefined} resolution Resolution. @@ -74,7 +74,7 @@ export function createSnapToResolutions(resolutions, opt_smooth, opt_maxExtent, const maxResolution = resolutions[0]; const minResolution = resolutions[resolutions.length - 1]; const cappedMaxRes = opt_maxExtent ? - getViewportClampedResolution(maxResolution, opt_maxExtent, size, opt_oneAxis) : + getViewportClampedResolution(maxResolution, opt_maxExtent, size, opt_showFullExtent) : maxResolution; // during interacting or animating, allow intermediary values @@ -106,10 +106,10 @@ export function createSnapToResolutions(resolutions, opt_smooth, opt_maxExtent, * @param {number=} opt_minResolution Minimum resolution. * @param {boolean=} opt_smooth If true, the view will be able to slightly exceed resolution limits. Default: true. * @param {import("./extent.js").Extent=} opt_maxExtent Maximum allowed extent. - * @param {boolean=} opt_oneAxis If true, can exceed extent constraint along one axis but not both. Default: false. + * @param {boolean=} opt_showFullExtent If true, allows us to show the full extent. Default: false. * @return {Type} Zoom function. */ -export function createSnapToPower(power, maxResolution, opt_minResolution, opt_smooth, opt_maxExtent, opt_oneAxis) { +export function createSnapToPower(power, maxResolution, opt_minResolution, opt_smooth, opt_maxExtent, opt_showFullExtent) { return ( /** * @param {number|undefined} resolution Resolution. @@ -121,7 +121,7 @@ export function createSnapToPower(power, maxResolution, opt_minResolution, opt_s function(resolution, direction, size, opt_isMoving) { if (resolution !== undefined) { const cappedMaxRes = opt_maxExtent ? - getViewportClampedResolution(maxResolution, opt_maxExtent, size, opt_oneAxis) : + getViewportClampedResolution(maxResolution, opt_maxExtent, size, opt_showFullExtent) : maxResolution; const minResolution = opt_minResolution !== undefined ? opt_minResolution : 0; @@ -155,10 +155,10 @@ export function createSnapToPower(power, maxResolution, opt_minResolution, opt_s * @param {number} minResolution Min resolution. * @param {boolean=} opt_smooth If true, the view will be able to slightly exceed resolution limits. Default: true. * @param {import("./extent.js").Extent=} opt_maxExtent Maximum allowed extent. - * @param {boolean=} opt_oneAxis If true, can exceed extent constraint along one axis but not both. Default: false. + * @param {boolean=} opt_showFullExtent If true, allows us to show the full extent. Default: false. * @return {Type} Zoom function. */ -export function createMinMaxResolution(maxResolution, minResolution, opt_smooth, opt_maxExtent, opt_oneAxis) { +export function createMinMaxResolution(maxResolution, minResolution, opt_smooth, opt_maxExtent, opt_showFullExtent) { return ( /** * @param {number|undefined} resolution Resolution. @@ -170,7 +170,7 @@ export function createMinMaxResolution(maxResolution, minResolution, opt_smooth, function(resolution, direction, size, opt_isMoving) { if (resolution !== undefined) { const cappedMaxRes = opt_maxExtent ? - getViewportClampedResolution(maxResolution, opt_maxExtent, size, opt_oneAxis) : + getViewportClampedResolution(maxResolution, opt_maxExtent, size, opt_showFullExtent) : maxResolution; const smooth = opt_smooth !== undefined ? opt_smooth : true; diff --git a/test/spec/ol/view.test.js b/test/spec/ol/view.test.js index 3d0bd026b0..4ec4a4bce6 100644 --- a/test/spec/ol/view.test.js +++ b/test/spec/ol/view.test.js @@ -393,10 +393,10 @@ describe('ol.View', function() { expect(constraint(1, 0, size)).to.be(1); }); - it('accepts extent and constrainOneAxis and uses the larger value', function() { + it('accepts extent and showFullExtent and uses the larger value', function() { const constraint = getConstraint({ extent: [0, 0, 4000, 6000], - constrainOneAxis: true + showFullExtent: true }); expect(constraint(1000, 0, size)).to.be(30); From 54bae0168f7e0a2e2032184f7ad94aaea785b746 Mon Sep 17 00:00:00 2001 From: David Brooks Date: Tue, 14 May 2019 12:22:58 +1200 Subject: [PATCH 091/381] Handle mouse wheel zoom events as if they've come from a trackpad. --- src/ol/interaction/MouseWheelZoom.js | 66 ++++------------------------ 1 file changed, 8 insertions(+), 58 deletions(-) diff --git a/src/ol/interaction/MouseWheelZoom.js b/src/ol/interaction/MouseWheelZoom.js index 1ed762bc17..443dc004e9 100644 --- a/src/ol/interaction/MouseWheelZoom.js +++ b/src/ol/interaction/MouseWheelZoom.js @@ -8,15 +8,6 @@ import Interaction, {zoomByDelta} from './Interaction.js'; import {clamp} from '../math.js'; -/** - * @enum {string} - */ -export const Mode = { - TRACKPAD: 'trackpad', - WHEEL: 'wheel' -}; - - /** * @typedef {Object} Options * @property {import("../events/condition.js").Condition} [condition] A function that @@ -107,12 +98,6 @@ class MouseWheelZoom extends Interaction { */ this.timeoutId_; - /** - * @private - * @type {Mode|undefined} - */ - this.mode_ = undefined; - /** * Trackpad events separated by this delay will be considered separate * interactions. @@ -206,51 +191,16 @@ class MouseWheelZoom extends Interaction { this.startTime_ = now; } - if (!this.mode_ || now - this.startTime_ > this.trackpadEventGap_) { - this.mode_ = Math.abs(delta) < 4 ? - Mode.TRACKPAD : - Mode.WHEEL; - } - - if (this.mode_ === Mode.TRACKPAD) { - const view = map.getView(); - if (this.trackpadTimeoutId_) { - clearTimeout(this.trackpadTimeoutId_); - } else { - view.beginInteraction(); - } - this.trackpadTimeoutId_ = setTimeout(this.endInteraction_.bind(this), this.trackpadEventGap_); - view.adjustZoom(-delta / this.trackpadDeltaPerZoom_, this.lastAnchor_); - this.startTime_ = now; - return false; - } - - this.totalDelta_ += delta; - - const timeLeft = Math.max(this.timeout_ - (now - this.startTime_), 0); - - clearTimeout(this.timeoutId_); - this.timeoutId_ = setTimeout(this.handleWheelZoom_.bind(this, map), timeLeft); - - return false; - } - - /** - * @private - * @param {import("../PluggableMap.js").default} map Map. - */ - handleWheelZoom_(map) { const view = map.getView(); - if (view.getAnimating()) { - view.cancelAnimations(); + if (this.trackpadTimeoutId_) { + clearTimeout(this.trackpadTimeoutId_); + } else { + view.beginInteraction(); } - const delta = clamp(this.totalDelta_, -this.maxDelta_, this.maxDelta_); - zoomByDelta(view, -delta, this.lastAnchor_, this.duration_); - this.mode_ = undefined; - this.totalDelta_ = 0; - this.lastAnchor_ = null; - this.startTime_ = undefined; - this.timeoutId_ = undefined; + this.trackpadTimeoutId_ = setTimeout(this.endInteraction_.bind(this), this.trackpadEventGap_); + view.adjustZoom(-delta / this.trackpadDeltaPerZoom_, this.lastAnchor_); + this.startTime_ = now; + return false; } /** From 77658e5750025dfd3045c891de4a1c9ff4573a00 Mon Sep 17 00:00:00 2001 From: David Brooks Date: Tue, 28 May 2019 09:53:36 +1200 Subject: [PATCH 092/381] Ensure changes to zoom wheel handling pass tests. --- src/ol/interaction/MouseWheelZoom.js | 3 +-- test/spec/ol/interaction/mousewheelzoom.test.js | 8 ++++---- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/src/ol/interaction/MouseWheelZoom.js b/src/ol/interaction/MouseWheelZoom.js index 443dc004e9..7546e6e399 100644 --- a/src/ol/interaction/MouseWheelZoom.js +++ b/src/ol/interaction/MouseWheelZoom.js @@ -4,8 +4,7 @@ import {always, focus} from '../events/condition.js'; import EventType from '../events/EventType.js'; import {DEVICE_PIXEL_RATIO, FIREFOX} from '../has.js'; -import Interaction, {zoomByDelta} from './Interaction.js'; -import {clamp} from '../math.js'; +import Interaction from './Interaction.js'; /** diff --git a/test/spec/ol/interaction/mousewheelzoom.test.js b/test/spec/ol/interaction/mousewheelzoom.test.js index ee1858bf5d..ee9b7fd87a 100644 --- a/test/spec/ol/interaction/mousewheelzoom.test.js +++ b/test/spec/ol/interaction/mousewheelzoom.test.js @@ -2,8 +2,8 @@ import Map from '../../../../src/ol/Map.js'; import MapBrowserEvent from '../../../../src/ol/MapBrowserEvent.js'; import View from '../../../../src/ol/View.js'; import Event from '../../../../src/ol/events/Event.js'; -import {DEVICE_PIXEL_RATIO, FIREFOX} from '../../../../src/ol/has.js'; -import MouseWheelZoom, {Mode} from '../../../../src/ol/interaction/MouseWheelZoom.js'; +import {DEVICE_PIXEL_RATIO, FIREFOX, SAFARI} from '../../../../src/ol/has.js'; +import MouseWheelZoom from '../../../../src/ol/interaction/MouseWheelZoom.js'; describe('ol.interaction.MouseWheelZoom', function() { @@ -66,7 +66,7 @@ describe('ol.interaction.MouseWheelZoom', function() { if (FIREFOX) { it('works on Firefox in DOM_DELTA_PIXEL mode (trackpad)', function(done) { map.once('postrender', function() { - expect(interaction.mode_).to.be(Mode.TRACKPAD); + expect(interaction.lastDelta_).to.be(1); done(); }); const event = new MapBrowserEvent('wheel', map, { @@ -84,7 +84,7 @@ describe('ol.interaction.MouseWheelZoom', function() { if (!FIREFOX) { it('works in DOM_DELTA_PIXEL mode (trackpad)', function(done) { map.once('postrender', function() { - expect(interaction.mode_).to.be(Mode.TRACKPAD); + expect(interaction.lastDelta_).to.be(1); done(); }); const event = new MapBrowserEvent('wheel', map, { From 03fcf1ca706f0aa2a4ee975b133679eb68f46c64 Mon Sep 17 00:00:00 2001 From: David Brooks Date: Wed, 29 May 2019 14:08:03 +1200 Subject: [PATCH 093/381] Get all mouse wheel tests passing (#9564). --- .../ol/interaction/mousewheelzoom.test.js | 62 +++++++++++++++++++ 1 file changed, 62 insertions(+) diff --git a/test/spec/ol/interaction/mousewheelzoom.test.js b/test/spec/ol/interaction/mousewheelzoom.test.js index ee9b7fd87a..f016a2adf8 100644 --- a/test/spec/ol/interaction/mousewheelzoom.test.js +++ b/test/spec/ol/interaction/mousewheelzoom.test.js @@ -63,6 +63,11 @@ describe('ol.interaction.MouseWheelZoom', function() { describe('handleEvent()', function() { + let view; + beforeEach(function() { + view = map.getView(); + }); + if (FIREFOX) { it('works on Firefox in DOM_DELTA_PIXEL mode (trackpad)', function(done) { map.once('postrender', function() { @@ -149,8 +154,65 @@ describe('ol.interaction.MouseWheelZoom', function() { map.handleMapBrowserEvent(event); }); + it('works in DOM_DELTA_LINE mode (wheel)', function(done) { + map.once('postrender', function() { + expect(view.getResolution()).to.be(2); + expect(view.getCenter()).to.eql([0, 0]); + done(); + }); + + const event = new MapBrowserEvent('wheel', map, { + type: 'wheel', + deltaMode: WheelEvent.DOM_DELTA_LINE, + deltaY: 7.5, + target: map.getViewport(), + preventDefault: Event.prototype.preventDefault + }); + event.coordinate = [0, 0]; + + map.handleMapBrowserEvent(event); }); + if (SAFARI) { + it('works on Safari (wheel)', function(done) { + map.once('postrender', function() { + expect(view.getResolution()).to.be(2); + expect(view.getCenter()).to.eql([0, 0]); + done(); + }); + + const event = new MapBrowserEvent('mousewheel', map, { + type: 'mousewheel', + wheelDeltaY: -900, + target: map.getViewport(), + preventDefault: Event.prototype.preventDefault + }); + event.coordinate = [0, 0]; + + map.handleMapBrowserEvent(event); + }); + } + + if (!SAFARI) { + it('works on other browsers (wheel)', function(done) { + map.once('postrender', function() { + expect(view.getResolution()).to.be(2); + expect(view.getCenter()).to.eql([0, 0]); + done(); + }); + + const event = new MapBrowserEvent('mousewheel', map, { + type: 'mousewheel', + wheelDeltaY: -300, + target: map.getViewport(), + preventDefault: Event.prototype.preventDefault + }); + event.coordinate = [0, 0]; + + map.handleMapBrowserEvent(event); + }); + } + }); }); From c8e340a623d3b7170184bb7fe879e05f8c1dd1ac Mon Sep 17 00:00:00 2001 From: Andreas Hocevar Date: Wed, 5 Feb 2020 12:58:21 +0100 Subject: [PATCH 094/381] Rename variables now that trackpads are not special any more --- src/ol/interaction/MouseWheelZoom.js | 24 +++++++++--------------- 1 file changed, 9 insertions(+), 15 deletions(-) diff --git a/src/ol/interaction/MouseWheelZoom.js b/src/ol/interaction/MouseWheelZoom.js index 7546e6e399..37a4e4022f 100644 --- a/src/ol/interaction/MouseWheelZoom.js +++ b/src/ol/interaction/MouseWheelZoom.js @@ -92,29 +92,23 @@ class MouseWheelZoom extends Interaction { this.startTime_ = undefined; /** - * @private - * @type {?} - */ - this.timeoutId_; - - /** - * Trackpad events separated by this delay will be considered separate + * Events separated by this delay will be considered separate * interactions. * @type {number} */ - this.trackpadEventGap_ = 400; + this.eventGap_ = 400; /** * @type {?} */ - this.trackpadTimeoutId_; + this.timeoutId_; /** * The number of delta values per zoom level * @private * @type {number} */ - this.trackpadDeltaPerZoom_ = 300; + this.deltaPerZoom_ = 300; } @@ -136,7 +130,7 @@ class MouseWheelZoom extends Interaction { * @private */ endInteraction_() { - this.trackpadTimeoutId_ = undefined; + this.timeoutId_ = undefined; const view = this.getMap().getView(); view.endInteraction(undefined, this.lastDelta_ ? (this.lastDelta_ > 0 ? 1 : -1) : 0, this.lastAnchor_); } @@ -191,13 +185,13 @@ class MouseWheelZoom extends Interaction { } const view = map.getView(); - if (this.trackpadTimeoutId_) { - clearTimeout(this.trackpadTimeoutId_); + if (this.timeoutId_) { + clearTimeout(this.timeoutId_); } else { view.beginInteraction(); } - this.trackpadTimeoutId_ = setTimeout(this.endInteraction_.bind(this), this.trackpadEventGap_); - view.adjustZoom(-delta / this.trackpadDeltaPerZoom_, this.lastAnchor_); + this.timeoutId_ = setTimeout(this.endInteraction_.bind(this), this.eventGap_); + view.adjustZoom(-delta / this.deltaPerZoom_, this.lastAnchor_); this.startTime_ = now; return false; } From cc21f92bdb52dc30efa41ce0cc68f08435384fcd Mon Sep 17 00:00:00 2001 From: Andreas Hocevar Date: Wed, 5 Feb 2020 12:58:35 +0100 Subject: [PATCH 095/381] Restore test coverage, fix tests --- .../ol/interaction/mousewheelzoom.test.js | 134 ++++++------------ 1 file changed, 41 insertions(+), 93 deletions(-) diff --git a/test/spec/ol/interaction/mousewheelzoom.test.js b/test/spec/ol/interaction/mousewheelzoom.test.js index f016a2adf8..8eea3ea3c3 100644 --- a/test/spec/ol/interaction/mousewheelzoom.test.js +++ b/test/spec/ol/interaction/mousewheelzoom.test.js @@ -2,7 +2,7 @@ import Map from '../../../../src/ol/Map.js'; import MapBrowserEvent from '../../../../src/ol/MapBrowserEvent.js'; import View from '../../../../src/ol/View.js'; import Event from '../../../../src/ol/events/Event.js'; -import {DEVICE_PIXEL_RATIO, FIREFOX, SAFARI} from '../../../../src/ol/has.js'; +import {DEVICE_PIXEL_RATIO, FIREFOX} from '../../../../src/ol/has.js'; import MouseWheelZoom from '../../../../src/ol/interaction/MouseWheelZoom.js'; @@ -32,13 +32,13 @@ describe('ol.interaction.MouseWheelZoom', function() { describe('timeout duration', function() { let clock; beforeEach(function() { - sinon.spy(interaction, 'handleWheelZoom_'); + sinon.spy(interaction, 'endInteraction_'); clock = sinon.useFakeTimers(); }); afterEach(function() { clock.restore(); - interaction.handleWheelZoom_.restore(); + interaction.endInteraction_.restore(); }); it('works with the default value', function(done) { @@ -49,12 +49,12 @@ describe('ol.interaction.MouseWheelZoom', function() { }); map.handleMapBrowserEvent(event); - clock.tick(50); - // default timeout is 80 ms, not called yet - expect(interaction.handleWheelZoom_.called).to.be(false); + clock.tick(100); + // default timeout is 400 ms, not called yet + expect(interaction.endInteraction_.called).to.be(false); - clock.tick(30); - expect(interaction.handleWheelZoom_.called).to.be(true); + clock.tick(300); + expect(interaction.endInteraction_.called).to.be(true); done(); }); @@ -104,55 +104,6 @@ describe('ol.interaction.MouseWheelZoom', function() { }); } - describe('spying on view.animateInternal()', function() { - let view; - beforeEach(function() { - view = map.getView(); - sinon.spy(view, 'animateInternal'); - }); - - afterEach(function() { - view.animateInternal.restore(); - }); - - it('works in DOM_DELTA_LINE mode (wheel)', function(done) { - map.once('postrender', function() { - const call = view.animateInternal.getCall(0); - expect(call.args[0].resolution).to.be(2); - expect(call.args[0].anchor).to.eql([0, 0]); - done(); - }); - - const event = new MapBrowserEvent('wheel', map, { - type: 'wheel', - deltaMode: WheelEvent.DOM_DELTA_LINE, - deltaY: 3.714599609375, - target: map.getViewport(), - preventDefault: Event.prototype.preventDefault - }); - event.coordinate = [0, 0]; - - map.handleMapBrowserEvent(event); - }); - - it('works on all browsers (wheel)', function(done) { - map.once('postrender', function() { - const call = view.animateInternal.getCall(0); - expect(call.args[0].resolution).to.be(2); - expect(call.args[0].anchor).to.eql([0, 0]); - done(); - }); - - const event = new MapBrowserEvent('wheel', map, { - type: 'wheel', - deltaY: 120, - target: map.getViewport(), - preventDefault: Event.prototype.preventDefault - }); - event.coordinate = [0, 0]; - - map.handleMapBrowserEvent(event); - }); it('works in DOM_DELTA_LINE mode (wheel)', function(done) { map.once('postrender', function() { @@ -173,45 +124,42 @@ describe('ol.interaction.MouseWheelZoom', function() { map.handleMapBrowserEvent(event); }); - if (SAFARI) { - it('works on Safari (wheel)', function(done) { - map.once('postrender', function() { - expect(view.getResolution()).to.be(2); - expect(view.getCenter()).to.eql([0, 0]); - done(); - }); - - const event = new MapBrowserEvent('mousewheel', map, { - type: 'mousewheel', - wheelDeltaY: -900, - target: map.getViewport(), - preventDefault: Event.prototype.preventDefault - }); - event.coordinate = [0, 0]; - - map.handleMapBrowserEvent(event); + it('works on all browsers (wheel)', function(done) { + map.once('postrender', function() { + expect(view.getResolution()).to.be(2); + expect(view.getCenter()).to.eql([0, 0]); + done(); }); - } - if (!SAFARI) { - it('works on other browsers (wheel)', function(done) { - map.once('postrender', function() { - expect(view.getResolution()).to.be(2); - expect(view.getCenter()).to.eql([0, 0]); - done(); - }); - - const event = new MapBrowserEvent('mousewheel', map, { - type: 'mousewheel', - wheelDeltaY: -300, - target: map.getViewport(), - preventDefault: Event.prototype.preventDefault - }); - event.coordinate = [0, 0]; - - map.handleMapBrowserEvent(event); + const event = new MapBrowserEvent('wheel', map, { + type: 'wheel', + deltaY: 300, // trackpadDeltaPerZoom_ + target: map.getViewport(), + preventDefault: Event.prototype.preventDefault }); - } + event.coordinate = [0, 0]; + + map.handleMapBrowserEvent(event); + }); + + it('works in DOM_DELTA_LINE mode (wheel)', function(done) { + map.once('postrender', function() { + expect(view.getResolution()).to.be(2); + expect(view.getCenter()).to.eql([0, 0]); + done(); + }); + + const event = new MapBrowserEvent('wheel', map, { + type: 'wheel', + deltaMode: WheelEvent.DOM_DELTA_LINE, + deltaY: 7.5, // trackpadDeltaPerZoom_ / 40 + target: map.getViewport(), + preventDefault: Event.prototype.preventDefault + }); + event.coordinate = [0, 0]; + + map.handleMapBrowserEvent(event); + }); }); From 65c1575dc98f545016856c54ed64105fc616977d Mon Sep 17 00:00:00 2001 From: Andreas Hocevar Date: Wed, 5 Feb 2020 20:11:33 +0100 Subject: [PATCH 096/381] Make examples work in Internet Explorer --- examples/mapbox-style.html | 1 + examples/templates/example.html | 2 +- examples/vector-tiles-4326.html | 2 ++ examples/vector-tiles-4326.js | 2 +- package-lock.json | 14 +++++++------- package.json | 2 +- 6 files changed, 13 insertions(+), 10 deletions(-) diff --git a/examples/mapbox-style.html b/examples/mapbox-style.html index 69cb67c696..8285734955 100644 --- a/examples/mapbox-style.html +++ b/examples/mapbox-style.html @@ -18,6 +18,7 @@ cloak: Mapbox Style objects with ol-mapbox-style + ' + ' ' + ' ' + @@ -2164,6 +2200,43 @@ describe('ol.format.KML', function() { expect(strokeStyle.getWidth()).to.be(9); expect(style.getText()).to.be(getDefaultTextStyle()); expect(style.getZIndex()).to.be(undefined); + + const lineString = new LineString([[1, 2], [3, 4]]); + const polygon = new Polygon([[[0, 0], [0, 2], [2, 2], [2, 0], [0, 0]]]); + const collection = new GeometryCollection([lineString, polygon]); + f.setGeometry(collection); + const node = format.writeFeaturesNode(fs); + const text1 = + '' + + ' ' + + ' ' + + ' ' + + ' ' + + ' 1,2 3,4' + + ' ' + + ' ' + + ' ' + + ' ' + + ' 0,0 0,2 2,2 2,0 0,0' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ''; + expect(node).to.xmleql(parse(text1)); }); it('disables the stroke when outline is \'0\'', function() { @@ -2233,6 +2306,41 @@ describe('ol.format.KML', function() { expect(style1.getFill()).to.be(fillStyle); expect(style1.getStroke()).to.be(null); expect(style1.getZIndex()).to.be(undefined); + + f.setGeometry(collectionFeature.getGeometry()); + const node = format.writeFeaturesNode(fs); + const text1 = + '' + + ' ' + + ' ' + + ' ' + + ' ' + + ' 1,2 3,4' + + ' ' + + ' ' + + ' ' + + ' ' + + ' 0,0 0,2 2,2 2,0 0,0' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ''; + expect(node).to.xmleql(parse(text1)); }); it('disables both fill and stroke when fill and outline are \'0\'', @@ -2302,6 +2410,41 @@ describe('ol.format.KML', function() { expect(style1.getFill()).to.be(null); expect(style1.getStroke()).to.be(null); expect(style1.getZIndex()).to.be(undefined); + + f.setGeometry(collectionFeature.getGeometry()); + const node = format.writeFeaturesNode(fs); + const text1 = + '' + + ' ' + + ' ' + + ' ' + + ' ' + + ' 1,2 3,4' + + ' ' + + ' ' + + ' ' + + ' ' + + ' 0,0 0,2 2,2 2,0 0,0' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ''; + expect(node).to.xmleql(parse(text1)); }); it('can create text style for named point placemarks (including html character codes)', function() { @@ -2392,6 +2535,10 @@ describe('ol.format.KML', function() { ' ' + ' ' + + ' ' + + ' 0' + + ' 0' + + ' ' + ' ' + '
' + '
'; @@ -2440,6 +2587,10 @@ describe('ol.format.KML', function() { ' https://developers.google.com/kml/schema/kml22gx.xsd">' + ' ' + ' ' + ' ' + '
'; @@ -2472,13 +2623,17 @@ describe('ol.format.KML', function() { ' ffdf220c' + ' 0.5' + ' ' + + ' ' + + ' 0' + + ' 0' + + ' ' + ' ' + '
' + '
'; expect(node).to.xmleql(parse(text)); }); - it('can write an feature\'s stroke style', function() { + it('can write an feature\'s stroke style without fill', function() { const style = new Style({ stroke: new Stroke({ color: '#112233', @@ -2500,13 +2655,16 @@ describe('ol.format.KML', function() { ' ff332211' + ' 2' + ' ' + + ' ' + + ' 0' + + ' ' + ' ' + ' ' + ''; expect(node).to.xmleql(parse(text)); }); - it('can write an feature\'s fill style', function() { + it('can write an feature\'s fill style without outline', function() { const style = new Style({ fill: new Fill({ color: 'rgba(12, 34, 223, 0.7)' @@ -2525,6 +2683,41 @@ describe('ol.format.KML', function() { ' ' + + ' ' + + ''; + expect(node).to.xmleql(parse(text)); + }); + + it('can write an feature\'s fill style and outline', function() { + const style = new Style({ + fill: new Fill({ + color: 'rgba(12, 34, 223, 0.7)' + }), + stroke: new Stroke({ + color: '#112233', + width: 2 + }) + }); + const feature = new Feature(); + feature.setStyle([style]); + const node = format.writeFeaturesNode([feature]); + const text = + '' + + ' ' + + ' ' + ' ' + @@ -2554,6 +2747,7 @@ describe('ol.format.KML', function() { ' ' + ' ' + @@ -2561,6 +2755,7 @@ describe('ol.format.KML', function() { ' ' + ' ' + From 4e1ca0a9869bb23111b808b66745d6dff9b5b7c6 Mon Sep 17 00:00:00 2001 From: Andreas Hocevar Date: Thu, 13 Feb 2020 10:41:52 +0100 Subject: [PATCH 131/381] More reliable check for module content beyond classes --- config/jsdoc/api/template/publish.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/config/jsdoc/api/template/publish.js b/config/jsdoc/api/template/publish.js index 5c40bb23ff..73dea80d7a 100644 --- a/config/jsdoc/api/template/publish.js +++ b/config/jsdoc/api/template/publish.js @@ -274,9 +274,9 @@ function buildNav(members) { kind: 'event', memberof: v.longname }); - // only add modules that have more to show than just classes - const numItems = classes.length - 1 + members.length + methods.length + typedefs.length + events.length; - if (!classes.length || (numItems > 0 && numItems !== classes.length)) { + // Only add modules that contain more than just classes with their + // associated Options typedef + if (typedefs.length > classes.length || members.length + methods.length > 0) { nav.push({ type: 'module', longname: v.longname, From 33a8466913805f4235f1f4dc47cf5b136f9684e2 Mon Sep 17 00:00:00 2001 From: Thomas Chandelle Date: Tue, 21 Feb 2017 14:34:42 +0100 Subject: [PATCH 132/381] Add API method abortDrawing and dispatch a DRAWABORT event --- src/ol/interaction/Draw.js | 27 ++++++-- test/spec/ol/interaction/draw.test.js | 96 +++++++++++++++++++++++++++ 2 files changed, 118 insertions(+), 5 deletions(-) diff --git a/src/ol/interaction/Draw.js b/src/ol/interaction/Draw.js index 5848ab2f37..9b43feae21 100644 --- a/src/ol/interaction/Draw.js +++ b/src/ol/interaction/Draw.js @@ -143,7 +143,13 @@ const DrawEventType = { * @event DrawEvent#drawend * @api */ - DRAWEND: 'drawend' + DRAWEND: 'drawend', + /** + * Triggered upon feature draw abortion + * @event DrawEvent#drawabort + * @api + */ + DRAWABORT: 'drawabort' }; @@ -584,8 +590,7 @@ class Draw extends PointerInteraction { } pass = false; } else if (this.freehand_) { - this.finishCoordinate_ = null; - this.abortDrawing_(); + this.abortDrawing(); } if (!pass && this.stopClick_) { event.stopPropagation(); @@ -834,7 +839,7 @@ class Draw extends PointerInteraction { } if (coordinates.length === 0) { - this.finishCoordinate_ = null; + this.abortDrawing(); } this.updateSketchFeatures_(); @@ -901,6 +906,18 @@ class Draw extends PointerInteraction { return sketchFeature; } + /** + * Stop drawing without adding the sketch feature to the target layer. + * @api + */ + abortDrawing() { + const sketchFeature = this.abortDrawing_(); + if (sketchFeature) { + this.dispatchEvent(new DrawEvent(DrawEventType.DRAWABORT, sketchFeature)); + } + } + + /** * Append coordinates to the end of the geometry that is currently being drawn. * This can be used when drawing LineStrings or Polygons. Coordinates will @@ -982,7 +999,7 @@ class Draw extends PointerInteraction { const map = this.getMap(); const active = this.getActive(); if (!map || !active) { - this.abortDrawing_(); + this.abortDrawing(); } this.overlay_.setMap(active ? map : null); } diff --git a/test/spec/ol/interaction/draw.test.js b/test/spec/ol/interaction/draw.test.js index 7ad50aea49..30a42c3a23 100644 --- a/test/spec/ol/interaction/draw.test.js +++ b/test/spec/ol/interaction/draw.test.js @@ -215,16 +215,20 @@ describe('ol.interaction.Draw', function() { it('triggers draw events', function() { const ds = sinon.spy(); const de = sinon.spy(); + const da = sinon.spy(); listen(draw, 'drawstart', ds); listen(draw, 'drawend', de); + listen(draw, 'drawabort', da); simulateEvent('pointermove', 10, 20); simulateEvent('pointerdown', 10, 20); simulateEvent('pointerup', 10, 20); expect(ds.called).to.be(true); expect(de.called).to.be(true); + expect(da.called).to.be(false); simulateEvent('pointermove', 20, 20); expect(ds.callCount).to.be(1); expect(de.callCount).to.be(1); + expect(da.callCount).to.be(0); }); it('triggers drawend event before inserting the feature', function() { @@ -463,8 +467,10 @@ describe('ol.interaction.Draw', function() { it('triggers draw events', function() { const ds = sinon.spy(); const de = sinon.spy(); + const da = sinon.spy(); listen(draw, 'drawstart', ds); listen(draw, 'drawend', de); + listen(draw, 'drawabort', da); // first point simulateEvent('pointermove', 10, 20); @@ -485,6 +491,8 @@ describe('ol.interaction.Draw', function() { expect(ds.callCount).to.be(1); expect(de.called).to.be(true); expect(de.callCount).to.be(1); + expect(da.called).to.be(false); + expect(da.callCount).to.be(0); }); it('works if finishDrawing is called when the sketch feature is not defined', function() { @@ -781,8 +789,10 @@ describe('ol.interaction.Draw', function() { it('triggers draw events', function() { const ds = sinon.spy(); const de = sinon.spy(); + const da = sinon.spy(); listen(draw, 'drawstart', ds); listen(draw, 'drawend', de); + listen(draw, 'drawabort', da); // first point simulateEvent('pointermove', 10, 20); @@ -808,6 +818,8 @@ describe('ol.interaction.Draw', function() { expect(ds.callCount).to.be(1); expect(de.called).to.be(true); expect(de.callCount).to.be(1); + expect(da.called).to.be(false); + expect(da.callCount).to.be(0); }); it('works if finishDrawing is called when the sketch feature is not defined', function() { @@ -1020,8 +1032,10 @@ describe('ol.interaction.Draw', function() { it('triggers draw events', function() { const ds = sinon.spy(); const de = sinon.spy(); + const da = sinon.spy(); listen(draw, 'drawstart', ds); listen(draw, 'drawend', de); + listen(draw, 'drawabort', da); // first point simulateEvent('pointermove', 10, 20); @@ -1037,6 +1051,88 @@ describe('ol.interaction.Draw', function() { expect(ds.callCount).to.be(1); expect(de.called).to.be(true); expect(de.callCount).to.be(1); + expect(da.called).to.be(false); + expect(da.callCount).to.be(0); + }); + + }); + + describe('#abortDrawing()', function() { + let draw; + + beforeEach(function() { + draw = new Draw({ + source: source, + type: 'LineString' + }); + map.addInteraction(draw); + }); + + it('aborts the current drawing', function() { + // first point + simulateEvent('pointermove', 10, 20); + simulateEvent('pointerdown', 10, 20); + simulateEvent('pointerup', 10, 20); + + // second point + simulateEvent('pointermove', 30, 20); + simulateEvent('pointerdown', 30, 20); + simulateEvent('pointerup', 30, 20); + + draw.abortDrawing(); + + expect(source.getFeatures()).to.have.length(0); + expect(draw.sketchFeature_).to.be(null); + }); + + it('triggers draw events', function() { + const ds = sinon.spy(); + const de = sinon.spy(); + const da = sinon.spy(); + listen(draw, 'drawstart', ds); + listen(draw, 'drawend', de); + listen(draw, 'drawabort', da); + + // first point + simulateEvent('pointermove', 10, 20); + simulateEvent('pointerdown', 10, 20); + simulateEvent('pointerup', 10, 20); + + // second point + simulateEvent('pointermove', 30, 20); + simulateEvent('pointerdown', 30, 20); + simulateEvent('pointerup', 30, 20); + + draw.abortDrawing(); + + expect(ds.called).to.be(true); + expect(ds.callCount).to.be(1); + expect(de.called).to.be(false); + expect(de.callCount).to.be(0); + expect(da.called).to.be(true); + expect(da.callCount).to.be(1); + + + // first point + simulateEvent('pointermove', 10, 20); + simulateEvent('pointerdown', 10, 20); + simulateEvent('pointerup', 10, 20); + + // second point + simulateEvent('pointermove', 30, 20); + simulateEvent('pointerdown', 30, 20); + simulateEvent('pointerup', 30, 20); + + draw.removeLastPoint(); + draw.removeLastPoint(); + draw.removeLastPoint(); + + expect(ds.called).to.be(true); + expect(ds.callCount).to.be(2); + expect(de.called).to.be(false); + expect(de.callCount).to.be(0); + expect(da.called).to.be(true); + expect(da.callCount).to.be(2); }); it('works if finishDrawing is called when the sketch feature is not defined', function() { From f302b5883e121c323bb11e2ccd2327e042d5aa75 Mon Sep 17 00:00:00 2001 From: mike-000 <49240900+mike-000@users.noreply.github.com> Date: Thu, 13 Feb 2020 18:06:02 +0000 Subject: [PATCH 133/381] Update jspdf version --- examples/export-pdf.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/export-pdf.html b/examples/export-pdf.html index c335d609a1..fa20f86069 100644 --- a/examples/export-pdf.html +++ b/examples/export-pdf.html @@ -6,7 +6,7 @@ docs: > Example of exporting a map as a PDF using the jsPDF library. tags: "export, pdf, openstreetmap" resources: - - https://cdnjs.cloudflare.com/ajax/libs/jspdf/1.2.61/jspdf.min.js + - https://cdnjs.cloudflare.com/ajax/libs/jspdf/1.5.3/jspdf.min.js ---
From 0b893f11d3622bd62089b7047ddd65a84360ee09 Mon Sep 17 00:00:00 2001 From: mike-000 <49240900+mike-000@users.noreply.github.com> Date: Thu, 13 Feb 2020 18:13:07 +0000 Subject: [PATCH 134/381] Fix IE compatibility. Add opacity handling. querySelectorAll().forEach() isn't supported by IE. Add opacity to the vector layer and handle it in the output. --- examples/export-pdf.js | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/examples/export-pdf.js b/examples/export-pdf.js index 125c95d05d..97dac9b59e 100644 --- a/examples/export-pdf.js +++ b/examples/export-pdf.js @@ -18,7 +18,8 @@ feature.getGeometry().transform('EPSG:4326', 'EPSG:3857'); const vector = new VectorLayer({ source: new VectorSource({ features: [feature] - }) + }), + opacity: 0.5 }); @@ -62,8 +63,10 @@ exportButton.addEventListener('click', function() { mapCanvas.width = width; mapCanvas.height = height; const mapContext = mapCanvas.getContext('2d'); - document.querySelectorAll('.ol-layer canvas').forEach(function(canvas) { + Array.prototype.forEach.call(document.querySelectorAll('.ol-layer canvas'), function(canvas) { if (canvas.width > 0) { + const opacity = canvas.parentNode.style.opacity; + mapContext.globalAlpha = opacity === '' ? 1 : Number(opacity); const transform = canvas.style.transform; // Get the transform parameters from the style's transform matrix const matrix = transform.match(/^matrix\(([^\(]*)\)$/)[1].split(',').map(Number); From c914ac2a64e5b9312157cf5c1668146214fc474c Mon Sep 17 00:00:00 2001 From: Andreas Hocevar Date: Thu, 13 Feb 2020 20:52:10 +0100 Subject: [PATCH 135/381] Changelog for v6.2.1 --- changelog/upgrade-notes.md | 4 ++++ changelog/v6.2.1.md | 13 +++++++++++++ 2 files changed, 17 insertions(+) create mode 100644 changelog/v6.2.1.md diff --git a/changelog/upgrade-notes.md b/changelog/upgrade-notes.md index 6e40f9164a..81c6eb6060 100644 --- a/changelog/upgrade-notes.md +++ b/changelog/upgrade-notes.md @@ -1,5 +1,9 @@ ## Upgrade notes +### v6.2.0 + +### v6.1.0 + ### v6.0.0 #### Backwards incompatible changes diff --git a/changelog/v6.2.1.md b/changelog/v6.2.1.md new file mode 100644 index 0000000000..17bb2f2ab0 --- /dev/null +++ b/changelog/v6.2.1.md @@ -0,0 +1,13 @@ +# 6.2.1 + +This is a bugfix release which resolves bundler issues due to a circular dependency, and brings a few documentation and example fixes. + +## List of all changes + + * [#10656](https://github.com/openlayers/openlayers/pull/10656) - Fix for export PDF example compatibility issues, and layer opacity handling. ([@mike-000](https://github.com/mike-000)) + * [#10653](https://github.com/openlayers/openlayers/pull/10653) - More reliable check for module content beyond classes ([@ahocevar](https://github.com/ahocevar)) + * [#10617](https://github.com/openlayers/openlayers/pull/10617) - Improve apidoc generation performance ([@MoonE](https://github.com/MoonE)) + * [#10625](https://github.com/openlayers/openlayers/pull/10625) - Apidoc cleanup navigation html ([@MoonE](https://github.com/MoonE)) + * [#10649](https://github.com/openlayers/openlayers/pull/10649) - Remove circular dependency ([@ahocevar](https://github.com/ahocevar)) + * [#10637](https://github.com/openlayers/openlayers/pull/10637) - Develop on 6.2.1 ([@openlayers](https://github.com/openlayers)) + From 9c21bda88e9f228b7b85424df735fbbc7552b09d Mon Sep 17 00:00:00 2001 From: Andreas Hocevar Date: Thu, 13 Feb 2020 21:04:45 +0100 Subject: [PATCH 136/381] Develop on 6.2.2 --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 085709acc8..487ba8adf3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "ol", - "version": "6.2.1", + "version": "6.2.2", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 4171cc0b9c..c769b2be69 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ol", - "version": "6.2.1", + "version": "6.2.2", "description": "OpenLayers mapping library", "keywords": [ "map", From ea5c91e19e55d0f7054ebe365fb8a80f8689e61f Mon Sep 17 00:00:00 2001 From: Andreas Hocevar Date: Fri, 14 Feb 2020 11:46:57 +0100 Subject: [PATCH 137/381] Revert "Merge pull request #9565 from dbrnz/v6.0.0-beta.7-branch" This reverts commit 35569a84277854109281946b73d95ba1b0bff5d1, reversing changes made to 29a434314b770a596baa981793b336575a406a6a. --- src/ol/interaction/MouseWheelZoom.js | 85 ++++++++++--- .../ol/interaction/mousewheelzoom.test.js | 112 ++++++++---------- 2 files changed, 122 insertions(+), 75 deletions(-) diff --git a/src/ol/interaction/MouseWheelZoom.js b/src/ol/interaction/MouseWheelZoom.js index 37a4e4022f..1ed762bc17 100644 --- a/src/ol/interaction/MouseWheelZoom.js +++ b/src/ol/interaction/MouseWheelZoom.js @@ -4,7 +4,17 @@ import {always, focus} from '../events/condition.js'; import EventType from '../events/EventType.js'; import {DEVICE_PIXEL_RATIO, FIREFOX} from '../has.js'; -import Interaction from './Interaction.js'; +import Interaction, {zoomByDelta} from './Interaction.js'; +import {clamp} from '../math.js'; + + +/** + * @enum {string} + */ +export const Mode = { + TRACKPAD: 'trackpad', + WHEEL: 'wheel' +}; /** @@ -92,23 +102,35 @@ class MouseWheelZoom extends Interaction { this.startTime_ = undefined; /** - * Events separated by this delay will be considered separate + * @private + * @type {?} + */ + this.timeoutId_; + + /** + * @private + * @type {Mode|undefined} + */ + this.mode_ = undefined; + + /** + * Trackpad events separated by this delay will be considered separate * interactions. * @type {number} */ - this.eventGap_ = 400; + this.trackpadEventGap_ = 400; /** * @type {?} */ - this.timeoutId_; + this.trackpadTimeoutId_; /** * The number of delta values per zoom level * @private * @type {number} */ - this.deltaPerZoom_ = 300; + this.trackpadDeltaPerZoom_ = 300; } @@ -130,7 +152,7 @@ class MouseWheelZoom extends Interaction { * @private */ endInteraction_() { - this.timeoutId_ = undefined; + this.trackpadTimeoutId_ = undefined; const view = this.getMap().getView(); view.endInteraction(undefined, this.lastDelta_ ? (this.lastDelta_ > 0 ? 1 : -1) : 0, this.lastAnchor_); } @@ -184,18 +206,53 @@ class MouseWheelZoom extends Interaction { this.startTime_ = now; } - const view = map.getView(); - if (this.timeoutId_) { - clearTimeout(this.timeoutId_); - } else { - view.beginInteraction(); + if (!this.mode_ || now - this.startTime_ > this.trackpadEventGap_) { + this.mode_ = Math.abs(delta) < 4 ? + Mode.TRACKPAD : + Mode.WHEEL; } - this.timeoutId_ = setTimeout(this.endInteraction_.bind(this), this.eventGap_); - view.adjustZoom(-delta / this.deltaPerZoom_, this.lastAnchor_); - this.startTime_ = now; + + if (this.mode_ === Mode.TRACKPAD) { + const view = map.getView(); + if (this.trackpadTimeoutId_) { + clearTimeout(this.trackpadTimeoutId_); + } else { + view.beginInteraction(); + } + this.trackpadTimeoutId_ = setTimeout(this.endInteraction_.bind(this), this.trackpadEventGap_); + view.adjustZoom(-delta / this.trackpadDeltaPerZoom_, this.lastAnchor_); + this.startTime_ = now; + return false; + } + + this.totalDelta_ += delta; + + const timeLeft = Math.max(this.timeout_ - (now - this.startTime_), 0); + + clearTimeout(this.timeoutId_); + this.timeoutId_ = setTimeout(this.handleWheelZoom_.bind(this, map), timeLeft); + return false; } + /** + * @private + * @param {import("../PluggableMap.js").default} map Map. + */ + handleWheelZoom_(map) { + const view = map.getView(); + if (view.getAnimating()) { + view.cancelAnimations(); + } + const delta = clamp(this.totalDelta_, -this.maxDelta_, this.maxDelta_); + zoomByDelta(view, -delta, this.lastAnchor_, this.duration_); + this.mode_ = undefined; + this.totalDelta_ = 0; + this.lastAnchor_ = null; + this.startTime_ = undefined; + this.timeoutId_ = undefined; + } + /** * Enable or disable using the mouse's location as an anchor when zooming * @param {boolean} useAnchor true to zoom to the mouse's location, false diff --git a/test/spec/ol/interaction/mousewheelzoom.test.js b/test/spec/ol/interaction/mousewheelzoom.test.js index 8eea3ea3c3..ee1858bf5d 100644 --- a/test/spec/ol/interaction/mousewheelzoom.test.js +++ b/test/spec/ol/interaction/mousewheelzoom.test.js @@ -3,7 +3,7 @@ import MapBrowserEvent from '../../../../src/ol/MapBrowserEvent.js'; import View from '../../../../src/ol/View.js'; import Event from '../../../../src/ol/events/Event.js'; import {DEVICE_PIXEL_RATIO, FIREFOX} from '../../../../src/ol/has.js'; -import MouseWheelZoom from '../../../../src/ol/interaction/MouseWheelZoom.js'; +import MouseWheelZoom, {Mode} from '../../../../src/ol/interaction/MouseWheelZoom.js'; describe('ol.interaction.MouseWheelZoom', function() { @@ -32,13 +32,13 @@ describe('ol.interaction.MouseWheelZoom', function() { describe('timeout duration', function() { let clock; beforeEach(function() { - sinon.spy(interaction, 'endInteraction_'); + sinon.spy(interaction, 'handleWheelZoom_'); clock = sinon.useFakeTimers(); }); afterEach(function() { clock.restore(); - interaction.endInteraction_.restore(); + interaction.handleWheelZoom_.restore(); }); it('works with the default value', function(done) { @@ -49,12 +49,12 @@ describe('ol.interaction.MouseWheelZoom', function() { }); map.handleMapBrowserEvent(event); - clock.tick(100); - // default timeout is 400 ms, not called yet - expect(interaction.endInteraction_.called).to.be(false); + clock.tick(50); + // default timeout is 80 ms, not called yet + expect(interaction.handleWheelZoom_.called).to.be(false); - clock.tick(300); - expect(interaction.endInteraction_.called).to.be(true); + clock.tick(30); + expect(interaction.handleWheelZoom_.called).to.be(true); done(); }); @@ -63,15 +63,10 @@ describe('ol.interaction.MouseWheelZoom', function() { describe('handleEvent()', function() { - let view; - beforeEach(function() { - view = map.getView(); - }); - if (FIREFOX) { it('works on Firefox in DOM_DELTA_PIXEL mode (trackpad)', function(done) { map.once('postrender', function() { - expect(interaction.lastDelta_).to.be(1); + expect(interaction.mode_).to.be(Mode.TRACKPAD); done(); }); const event = new MapBrowserEvent('wheel', map, { @@ -89,7 +84,7 @@ describe('ol.interaction.MouseWheelZoom', function() { if (!FIREFOX) { it('works in DOM_DELTA_PIXEL mode (trackpad)', function(done) { map.once('postrender', function() { - expect(interaction.lastDelta_).to.be(1); + expect(interaction.mode_).to.be(Mode.TRACKPAD); done(); }); const event = new MapBrowserEvent('wheel', map, { @@ -104,61 +99,56 @@ describe('ol.interaction.MouseWheelZoom', function() { }); } - - it('works in DOM_DELTA_LINE mode (wheel)', function(done) { - map.once('postrender', function() { - expect(view.getResolution()).to.be(2); - expect(view.getCenter()).to.eql([0, 0]); - done(); + describe('spying on view.animateInternal()', function() { + let view; + beforeEach(function() { + view = map.getView(); + sinon.spy(view, 'animateInternal'); }); - const event = new MapBrowserEvent('wheel', map, { - type: 'wheel', - deltaMode: WheelEvent.DOM_DELTA_LINE, - deltaY: 7.5, - target: map.getViewport(), - preventDefault: Event.prototype.preventDefault - }); - event.coordinate = [0, 0]; - - map.handleMapBrowserEvent(event); - }); - - it('works on all browsers (wheel)', function(done) { - map.once('postrender', function() { - expect(view.getResolution()).to.be(2); - expect(view.getCenter()).to.eql([0, 0]); - done(); + afterEach(function() { + view.animateInternal.restore(); }); - const event = new MapBrowserEvent('wheel', map, { - type: 'wheel', - deltaY: 300, // trackpadDeltaPerZoom_ - target: map.getViewport(), - preventDefault: Event.prototype.preventDefault - }); - event.coordinate = [0, 0]; + it('works in DOM_DELTA_LINE mode (wheel)', function(done) { + map.once('postrender', function() { + const call = view.animateInternal.getCall(0); + expect(call.args[0].resolution).to.be(2); + expect(call.args[0].anchor).to.eql([0, 0]); + done(); + }); - map.handleMapBrowserEvent(event); - }); + const event = new MapBrowserEvent('wheel', map, { + type: 'wheel', + deltaMode: WheelEvent.DOM_DELTA_LINE, + deltaY: 3.714599609375, + target: map.getViewport(), + preventDefault: Event.prototype.preventDefault + }); + event.coordinate = [0, 0]; - it('works in DOM_DELTA_LINE mode (wheel)', function(done) { - map.once('postrender', function() { - expect(view.getResolution()).to.be(2); - expect(view.getCenter()).to.eql([0, 0]); - done(); + map.handleMapBrowserEvent(event); }); - const event = new MapBrowserEvent('wheel', map, { - type: 'wheel', - deltaMode: WheelEvent.DOM_DELTA_LINE, - deltaY: 7.5, // trackpadDeltaPerZoom_ / 40 - target: map.getViewport(), - preventDefault: Event.prototype.preventDefault - }); - event.coordinate = [0, 0]; + it('works on all browsers (wheel)', function(done) { + map.once('postrender', function() { + const call = view.animateInternal.getCall(0); + expect(call.args[0].resolution).to.be(2); + expect(call.args[0].anchor).to.eql([0, 0]); + done(); + }); + + const event = new MapBrowserEvent('wheel', map, { + type: 'wheel', + deltaY: 120, + target: map.getViewport(), + preventDefault: Event.prototype.preventDefault + }); + event.coordinate = [0, 0]; + + map.handleMapBrowserEvent(event); + }); - map.handleMapBrowserEvent(event); }); }); From 8fe71bbbff95eb96f91ab8b046ffa09a6dbdb9cb Mon Sep 17 00:00:00 2001 From: John Leonard Date: Fri, 14 Feb 2020 11:39:54 +0000 Subject: [PATCH 138/381] perf: only do expensive reload when texture changes --- src/ol/webgl/Helper.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/ol/webgl/Helper.js b/src/ol/webgl/Helper.js index cf2ceeab3a..ce97b33a01 100644 --- a/src/ol/webgl/Helper.js +++ b/src/ol/webgl/Helper.js @@ -558,6 +558,7 @@ class WebGLHelper extends Disposable { if (value instanceof HTMLCanvasElement || value instanceof HTMLImageElement || value instanceof ImageData) { // create a texture & put data if (!uniform.texture) { + uniform.prevValue = undefined; uniform.texture = gl.createTexture(); } gl.activeTexture(gl[`TEXTURE${textureSlot}`]); @@ -567,7 +568,8 @@ class WebGLHelper extends Disposable { gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); const imageReady = !(value instanceof HTMLImageElement) || /** @type {HTMLImageElement} */(value).complete; - if (imageReady) { + if (imageReady && uniform.prevValue !== value) { + uniform.prevValue = value; gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, value); } From 16e46ea2c0e94e680c2aeef71efaa785b5f9120e Mon Sep 17 00:00:00 2001 From: mike-000 <49240900+mike-000@users.noreply.github.com> Date: Fri, 14 Feb 2020 12:15:52 +0000 Subject: [PATCH 139/381] load polyfill before example specific scripts --- examples/templates/example.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/templates/example.html b/examples/templates/example.html index c2b47eb212..a45f88e7be 100644 --- a/examples/templates/example.html +++ b/examples/templates/example.html @@ -67,9 +67,9 @@ + {{{ extraHead.local }}} {{{ css.tag }}} - {{ title }} From 0471b6e6509900bd4e073f528babfbaaaefb5043 Mon Sep 17 00:00:00 2001 From: Andreas Hocevar Date: Fri, 14 Feb 2020 13:50:03 +0100 Subject: [PATCH 140/381] Do not render label with the current linedash --- src/ol/render/canvas/Executor.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ol/render/canvas/Executor.js b/src/ol/render/canvas/Executor.js index dfb70e9bcc..92c1cf4e87 100644 --- a/src/ol/render/canvas/Executor.js +++ b/src/ol/render/canvas/Executor.js @@ -204,7 +204,7 @@ class Executor { contextInstructions.push('lineCap', strokeState.lineCap); contextInstructions.push('lineJoin', strokeState.lineJoin); contextInstructions.push('miterLimit', strokeState.miterLimit); - if (CanvasRenderingContext2D.prototype.setLineDash && strokeState.lineDash.length) { + if (CanvasRenderingContext2D.prototype.setLineDash) { contextInstructions.push('setLineDash', [strokeState.lineDash]); contextInstructions.push('lineDashOffset', strokeState.lineDashOffset); } From f48a1a5f2606676bd6fd619392b3c2a93bc4e18a Mon Sep 17 00:00:00 2001 From: mike-000 <49240900+mike-000@users.noreply.github.com> Date: Fri, 14 Feb 2020 13:36:41 +0000 Subject: [PATCH 141/381] remove overlay and html-to-image --- examples/export-map.css | 6 ----- examples/export-map.html | 6 +---- examples/export-map.js | 51 +++++++++++++++++++++------------------- package-lock.json | 6 ----- package.json | 1 - 5 files changed, 28 insertions(+), 42 deletions(-) delete mode 100644 examples/export-map.css diff --git a/examples/export-map.css b/examples/export-map.css deleted file mode 100644 index 9917279a2b..0000000000 --- a/examples/export-map.css +++ /dev/null @@ -1,6 +0,0 @@ -.overlay { - background-color: yellow; - border-radius: 6px; - padding: 4px; - white-space: nowrap; -} diff --git a/examples/export-map.html b/examples/export-map.html index 9e45f5e986..a12e2a8d1c 100644 --- a/examples/export-map.html +++ b/examples/export-map.html @@ -3,13 +3,9 @@ layout: example.html title: Map Export shortdesc: Example of exporting a map as a PNG image. docs: > - Example of exporting a map as a PNG image. This example use the html-to-image - library. + Example of exporting a map as a PNG image. tags: "export, png, openstreetmap" ---
-
-
Null Island
-
Download PNG diff --git a/examples/export-map.js b/examples/export-map.js index c3b5512347..0039f0f1d8 100644 --- a/examples/export-map.js +++ b/examples/export-map.js @@ -1,12 +1,9 @@ import Map from '../src/ol/Map.js'; import View from '../src/ol/View.js'; -import Overlay from '../src/ol/Overlay.js'; import GeoJSON from '../src/ol/format/GeoJSON.js'; import {Tile as TileLayer, Vector as VectorLayer} from '../src/ol/layer.js'; import {OSM, Vector as VectorSource} from '../src/ol/source.js'; -import {toPng} from 'html-to-image'; - const map = new Map({ layers: [ new TileLayer({ @@ -16,7 +13,8 @@ const map = new Map({ source: new VectorSource({ url: 'data/geojson/countries.geojson', format: new GeoJSON() - }) + }), + opacity: 0.5 }) ], target: 'map', @@ -26,28 +24,33 @@ const map = new Map({ }) }); -map.addOverlay(new Overlay({ - position: [0, 0], - element: document.getElementById('null') -})); - - -// export options for html-to-image. -// See: https://github.com/bubkoo/html-to-image#options -const exportOptions = { - filter: function(element) { - return element.className ? element.className.indexOf('ol-control') === -1 : true; - } -}; - document.getElementById('export-png').addEventListener('click', function() { map.once('rendercomplete', function() { - toPng(map.getTargetElement(), exportOptions) - .then(function(dataURL) { - const link = document.getElementById('image-download'); - link.href = dataURL; - link.click(); - }); + const mapCanvas = document.createElement('canvas'); + const size = map.getSize(); + mapCanvas.width = size[0]; + mapCanvas.height = size[1]; + const mapContext = mapCanvas.getContext('2d'); + Array.prototype.forEach.call(document.querySelectorAll('.ol-layer canvas'), function(canvas) { + if (canvas.width > 0) { + const opacity = canvas.parentNode.style.opacity; + mapContext.globalAlpha = opacity === '' ? 1 : Number(opacity); + const transform = canvas.style.transform; + // Get the transform parameters from the style's transform matrix + const matrix = transform.match(/^matrix\(([^\(]*)\)$/)[1].split(',').map(Number); + // Apply the transform to the export map context + CanvasRenderingContext2D.prototype.setTransform.apply(mapContext, matrix); + mapContext.drawImage(canvas, 0, 0); + } + }); + if (navigator.msSaveBlob) { + // link download attribuute does not work on MS browsers + navigator.msSaveBlob(mapCanvas.msToBlob(), 'map.png'); + } else { + const link = document.getElementById('image-download'); + link.href = mapCanvas.toDataURL(); + link.click(); + } }); map.renderSync(); }); diff --git a/package-lock.json b/package-lock.json index 487ba8adf3..4f9a6ff567 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7069,12 +7069,6 @@ "integrity": "sha1-DfKTUfByEWNRXfueVUPl9u7VFi8=", "dev": true }, - "html-to-image": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/html-to-image/-/html-to-image-0.1.1.tgz", - "integrity": "sha512-UAjpXmokENeOyzfLwL0+zQ502lXyg6pkzVUmRjtljOH9dR/YdEYQhWrQ/O14hmH5/1L7jv1aOupU4Zi3Y8+iow==", - "dev": true - }, "http-deceiver": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", diff --git a/package.json b/package.json index c769b2be69..9086914964 100644 --- a/package.json +++ b/package.json @@ -64,7 +64,6 @@ "glob": "^7.1.5", "globby": "^11.0.0", "handlebars": "4.7.3", - "html-to-image": "^0.1.0", "istanbul": "0.4.5", "istanbul-instrumenter-loader": "^3.0.1", "jquery": "3.4.1", From f3ce8e23b47cc98da0472303c62b2f3568b5a568 Mon Sep 17 00:00:00 2001 From: Andreas Hocevar Date: Fri, 14 Feb 2020 13:49:08 +0100 Subject: [PATCH 142/381] Fractional zoom changes in WHEEL mode --- src/ol/interaction/MouseWheelZoom.js | 15 +++++++++++---- test/spec/ol/interaction/mousewheelzoom.test.js | 4 ++-- 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/src/ol/interaction/MouseWheelZoom.js b/src/ol/interaction/MouseWheelZoom.js index 1ed762bc17..92c57b1ad7 100644 --- a/src/ol/interaction/MouseWheelZoom.js +++ b/src/ol/interaction/MouseWheelZoom.js @@ -130,7 +130,7 @@ class MouseWheelZoom extends Interaction { * @private * @type {number} */ - this.trackpadDeltaPerZoom_ = 300; + this.deltaPerZoom_ = 300; } @@ -220,7 +220,7 @@ class MouseWheelZoom extends Interaction { view.beginInteraction(); } this.trackpadTimeoutId_ = setTimeout(this.endInteraction_.bind(this), this.trackpadEventGap_); - view.adjustZoom(-delta / this.trackpadDeltaPerZoom_, this.lastAnchor_); + view.adjustZoom(-delta / this.deltaPerZoom_, this.lastAnchor_); this.startTime_ = now; return false; } @@ -244,8 +244,15 @@ class MouseWheelZoom extends Interaction { if (view.getAnimating()) { view.cancelAnimations(); } - const delta = clamp(this.totalDelta_, -this.maxDelta_, this.maxDelta_); - zoomByDelta(view, -delta, this.lastAnchor_, this.duration_); + let delta = -clamp(this.totalDelta_, -this.maxDelta_ * this.deltaPerZoom_, this.maxDelta_ * this.deltaPerZoom_) / this.deltaPerZoom_; + const currentZoom = view.getZoom(); + const newZoom = view.getConstrainedZoom(currentZoom + delta); + if (currentZoom === newZoom) { + // view has a zoom constraint, zoom by 1 + delta = delta ? delta > 0 ? 1 : -1 : 0; + } + zoomByDelta(view, delta, this.lastAnchor_, this.duration_); + this.mode_ = undefined; this.totalDelta_ = 0; this.lastAnchor_ = null; diff --git a/test/spec/ol/interaction/mousewheelzoom.test.js b/test/spec/ol/interaction/mousewheelzoom.test.js index ee1858bf5d..8f0343446d 100644 --- a/test/spec/ol/interaction/mousewheelzoom.test.js +++ b/test/spec/ol/interaction/mousewheelzoom.test.js @@ -121,7 +121,7 @@ describe('ol.interaction.MouseWheelZoom', function() { const event = new MapBrowserEvent('wheel', map, { type: 'wheel', deltaMode: WheelEvent.DOM_DELTA_LINE, - deltaY: 3.714599609375, + deltaY: 20, target: map.getViewport(), preventDefault: Event.prototype.preventDefault }); @@ -140,7 +140,7 @@ describe('ol.interaction.MouseWheelZoom', function() { const event = new MapBrowserEvent('wheel', map, { type: 'wheel', - deltaY: 120, + deltaY: 300, target: map.getViewport(), preventDefault: Event.prototype.preventDefault }); From bed2b6e22291dad37e4028e4b33145b25cb97eda Mon Sep 17 00:00:00 2001 From: jipexu Date: Sat, 15 Feb 2020 22:10:41 +0100 Subject: [PATCH 143/381] typo --- examples/snap.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/snap.html b/examples/snap.html index c47b279255..409f09491d 100644 --- a/examples/snap.html +++ b/examples/snap.html @@ -10,7 +10,7 @@ docs: > tags: "draw, edit, modify, vector, snap" ---
-
+
+{{#if worker.source}} +
+ +
worker.js{{ worker.source }}
+
+{{/if}}
Copy @@ -167,7 +175,6 @@
package.json{{ pkgJson }}
- {{{ js.tag }}} diff --git a/examples/webpack/example-builder.js b/examples/webpack/example-builder.js index 22a7867500..d25306b897 100644 --- a/examples/webpack/example-builder.js +++ b/examples/webpack/example-builder.js @@ -208,6 +208,10 @@ ExampleBuilder.prototype.render = async function(dir, chunk) { jsSource = jsSource.replace(new RegExp(entry.key, 'g'), entry.value); } } + // Remove worker loader import and modify `new Worker()` to add source + jsSource = jsSource.replace(/import Worker from 'worker-loader![^\n]*\n/g, ''); + jsSource = jsSource.replace('new Worker()', 'new Worker(\'./worker.js\')'); + data.js = { tag: ``, source: jsSource @@ -218,9 +222,33 @@ ExampleBuilder.prototype.render = async function(dir, chunk) { data.js.tag = prelude + data.js.tag; } + // check for worker js + const workerName = `${name}.worker.js`; + const workerPath = path.join(dir, workerName); + let workerSource; + try { + workerSource = await readFile(workerPath, readOptions); + } catch (err) { + // pass + } + if (workerSource) { + // remove "../src/" prefix and ".js" to have the same import syntax as the documentation + workerSource = workerSource.replace(/'\.\.\/src\//g, '\''); + workerSource = workerSource.replace(/\.js';/g, '\';'); + if (data.cloak) { + for (const entry of data.cloak) { + workerSource = workerSource.replace(new RegExp(entry.key, 'g'), entry.value); + } + } + data.worker = { + source: workerSource + }; + assets[workerName] = workerSource; + } + data.pkgJson = JSON.stringify({ name: name, - dependencies: getDependencies(jsSource), + dependencies: getDependencies(jsSource + workerSource ? `\n${workerSource}` : ''), devDependencies: { parcel: '1.11.0' }, From ade9ac8857685508edb3abf8d9cd517494a23e2f Mon Sep 17 00:00:00 2001 From: Andreas Hocevar Date: Sun, 22 Mar 2020 20:08:24 +0100 Subject: [PATCH 315/381] Make mapbox-style example fullscreen on demand --- examples/mapbox-style.html | 27 ++------------------------- examples/mapbox-style.js | 5 ++++- 2 files changed, 6 insertions(+), 26 deletions(-) diff --git a/examples/mapbox-style.html b/examples/mapbox-style.html index 8285734955..1c88215464 100644 --- a/examples/mapbox-style.html +++ b/examples/mapbox-style.html @@ -1,5 +1,5 @@ --- -layout: example-verbatim.html +layout: example.html title: Vector tiles created from a Mapbox Style object shortdesc: Example of using ol-mapbox-style with tiles from maptiler.com. docs: > @@ -10,27 +10,4 @@ cloak: - key: get_your_own_D6rA4zTHduk6KOKTXzGB value: Get your own API key at https://www.maptiler.com/cloud/ --- - - - - - - - Mapbox Style objects with ol-mapbox-style - - - - - -
- - - - +
diff --git a/examples/mapbox-style.js b/examples/mapbox-style.js index 819177a69d..a774155526 100644 --- a/examples/mapbox-style.js +++ b/examples/mapbox-style.js @@ -1,3 +1,6 @@ import apply from 'ol-mapbox-style'; +import FullScreen from '../src/ol/control/FullScreen.js'; -apply('map', 'https://api.maptiler.com/maps/topo/style.json?key=get_your_own_D6rA4zTHduk6KOKTXzGB'); +apply('map', 'https://api.maptiler.com/maps/topo/style.json?key=get_your_own_D6rA4zTHduk6KOKTXzGB').then(function(map) { + map.addControl(new FullScreen()); +}); From 28f390828dac51b1f793e165356d846187c4178e Mon Sep 17 00:00:00 2001 From: Andreas Hocevar Date: Sun, 22 Mar 2020 20:11:07 +0100 Subject: [PATCH 316/381] Use same data as in mapbox-style example --- examples/mvtlayer.worker.js | 98 ----------- examples/offscreen-canvas-tiles.css | 2 +- examples/offscreen-canvas-tiles.js | 16 +- examples/offscreen-canvas-tiles.worker.js | 154 ++++++++++++++++++ examples/resources/mapbox-streets-v6-style.js | 38 +---- 5 files changed, 170 insertions(+), 138 deletions(-) delete mode 100644 examples/mvtlayer.worker.js create mode 100644 examples/offscreen-canvas-tiles.worker.js diff --git a/examples/mvtlayer.worker.js b/examples/mvtlayer.worker.js deleted file mode 100644 index 16a555e052..0000000000 --- a/examples/mvtlayer.worker.js +++ /dev/null @@ -1,98 +0,0 @@ -import VectorTileLayer from '../src/ol/layer/VectorTile.js'; -import VectorTileSource from '../src/ol/source/VectorTile.js'; -import MVT from '../src/ol/format/MVT.js'; -import {Projection} from '../src/ol/proj.js'; -import TileQueue from '../src/ol/TileQueue.js'; -import {getTilePriority as tilePriorityFunction} from '../src/ol/TileQueue.js'; -import {Style, Fill, Stroke, Icon, Text} from '../src/ol/style.js'; -import createMapboxStreetsV6Style from './resources/mapbox-streets-v6-style.js'; -import {renderDeclutterItems} from '../src/ol/render.js'; - -const key = 'pk.eyJ1IjoiYWhvY2V2YXIiLCJhIjoiY2pzbmg0Nmk5MGF5NzQzbzRnbDNoeHJrbiJ9.7_-_gL8ur7ZtEiNwRfCy7Q'; - -/** @type {any} */ -const worker = self; - -let frameState; -const canvas = new OffscreenCanvas(1, 1); - -function getCircularReplacer() { - const seen = new WeakSet(); - return function(key, value) { - if (typeof value === 'object' && value !== null) { - if (seen.has(value)) { - return '[circular]'; - } - seen.add(value); - } - return value; - }; -} - -function getTilePriority(tile, tileSourceKey, tileCenter, tileResolution) { - return tilePriorityFunction(frameState, tile, tileSourceKey, tileCenter, tileResolution); -} - -const layer = new VectorTileLayer({ - declutter: true, - style: createMapboxStreetsV6Style(Style, Fill, Stroke, Icon, Text), - source: new VectorTileSource({ - format: new MVT(), - url: 'https://{a-d}.tiles.mapbox.com/v4/mapbox.mapbox-streets-v6/' + - '{z}/{x}/{y}.vector.pbf?access_token=' + key - }) -}); -const renderer = layer.getRenderer(); -const tileQueue = new TileQueue(getTilePriority, function() { - worker.postMessage({action: 'request-render'}); -}); -const maxTotalLoading = 8; -const maxNewLoads = 2; - -let rendererTransform, rendererOpacity; -renderer.useContainer = function(target, transform, opacity) { - target.style = {}; - this.canvas = target; - this.context = target.getContext('2d'); - this.container = { - firstElementChild: target - }; - rendererTransform = transform; - rendererOpacity = opacity; -}; - -let rendering = false; - -worker.addEventListener('message', function(event) { - if (event.data.action !== 'render') { - return; - } - if (rendering) { - // drop this frame - worker.postMessage({action: 'request-render'}); - return; - } - frameState = event.data.frameState; - frameState.tileQueue = tileQueue; - frameState.viewState.projection.__proto__ = Projection.prototype; - rendering = true; - requestAnimationFrame(function() { - renderer.renderFrame(frameState, canvas); - renderDeclutterItems(frameState, null); - if (tileQueue.getTilesLoading() < maxTotalLoading) { - tileQueue.reprioritize(); // FIXME only call if view has changed - tileQueue.loadMoreTiles(maxTotalLoading, maxNewLoads); - } - const imageData = canvas.transferToImageBitmap(); - worker.postMessage({ - action: 'rendered', - imageData: imageData, - transform: rendererTransform, - opacity: rendererOpacity, - frameState: JSON.parse(JSON.stringify(frameState, getCircularReplacer())) - }, [imageData]); - rendering = false; - }); -}); - -export let create; diff --git a/examples/offscreen-canvas-tiles.css b/examples/offscreen-canvas-tiles.css index 33e90f7301..9fde055492 100644 --- a/examples/offscreen-canvas-tiles.css +++ b/examples/offscreen-canvas-tiles.css @@ -1,3 +1,3 @@ .map { - background: #f8f4f0; + background: rgba(232, 230, 223, 1); } diff --git a/examples/offscreen-canvas-tiles.js b/examples/offscreen-canvas-tiles.js index 60ee70480c..29243c2d9d 100644 --- a/examples/offscreen-canvas-tiles.js +++ b/examples/offscreen-canvas-tiles.js @@ -1,11 +1,12 @@ import Map from '../src/ol/Map.js'; import View from '../src/ol/View.js'; import Layer from '../src/ol/layer/Layer.js'; -//eslint-disable-next-line -import Worker from 'worker-loader!./mvtlayer.worker.js'; +import Worker from 'worker-loader!./offscreen-canvas-tiles.worker.js'; //eslint-disable-line import {compose, create} from '../src/ol/transform.js'; import {createTransformString} from '../src/ol/render/canvas.js'; import {getFontParameters} from '../src/ol/css.js'; +import {createXYZ} from '../src/ol/tilegrid.js'; +import {FullScreen} from '../src/ol/control.js'; const mvtLayerWorker = new Worker(); @@ -14,7 +15,7 @@ mvtLayerWorker.addEventListener('message', event => { if (event.data.action === 'getFontParameters') { getFontParameters(event.data.font, font => { mvtLayerWorker.postMessage({ - action: 'getFontParameters', + action: 'gotFontParameters', font: font }); }); @@ -28,12 +29,12 @@ mvtLayerWorker.addEventListener('message', event => { mvtLayerWorker.postMessage({ action: 'imageLoaded', image: imageBitmap, - iconName: event.data.iconName + src: event.data.src }, [imageBitmap]); }); }); - image.src = 'https://unpkg.com/@mapbox/maki@4.0.0/icons/' + event.data.iconName + '-15.svg'; - loadingImages[event.data.iconName] = true; + image.src = event.data.src; + loadingImages[event.data.src] = true; } } }); @@ -112,10 +113,12 @@ const map = new Map({ ], target: 'map', view: new View({ + resolutions: createXYZ({tileSize: 512}).getResolutions89, center: [0, 0], zoom: 2 }) }); +map.addControl(new FullScreen()); mvtLayerWorker.addEventListener('message', function(message) { if (message.data.action === 'request-render') { map.render(); @@ -125,7 +128,6 @@ mvtLayerWorker.addEventListener('message', function(message) { canvas.width = imageData.width; canvas.height = imageData.height; canvas.getContext('2d').drawImage(imageData, 0, 0); - canvas.style.opacity = message.data.opacity; canvas.style.transform = message.data.transform; workerFrameState = message.data.frameState; updateContainerTransform(); diff --git a/examples/offscreen-canvas-tiles.worker.js b/examples/offscreen-canvas-tiles.worker.js new file mode 100644 index 0000000000..d801747de5 --- /dev/null +++ b/examples/offscreen-canvas-tiles.worker.js @@ -0,0 +1,154 @@ +import VectorTileLayer from '../src/ol/layer/VectorTile.js'; +import VectorTileSource from '../src/ol/source/VectorTile.js'; +import MVT from '../src/ol/format/MVT.js'; +import {Projection} from '../src/ol/proj.js'; +import TileQueue from '../src/ol/TileQueue.js'; +import {getTilePriority as tilePriorityFunction} from '../src/ol/TileQueue.js'; +import {renderDeclutterItems} from '../src/ol/render.js'; +import styleFunction from 'ol-mapbox-style/dist/stylefunction.js'; +import {inView} from '../src/ol/layer/Layer.js'; + +/** @type {any} */ +const worker = self; + +let frameState, pixelRatio; +const canvas = new OffscreenCanvas(1, 1); + +function getCircularReplacer() { + const seen = new WeakSet(); + return function(key, value) { + if (typeof value === 'object' && value !== null) { + if (seen.has(value)) { + return '[circular]'; + } + seen.add(value); + } + return value; + }; +} + +function getTilePriority(tile, tileSourceKey, tileCenter, tileResolution) { + return tilePriorityFunction(frameState, tile, tileSourceKey, tileCenter, tileResolution); +} + +const landcover = new VectorTileLayer({ + visible: false, + declutter: true, + maxZoom: 9, + source: new VectorTileSource({ + maxZoom: 9, + format: new MVT(), + url: 'https://api.maptiler.com/tiles/landcover/{z}/{x}/{y}.pbf?key=get_your_own_D6rA4zTHduk6KOKTXzGB' + }) +}); +const contours = new VectorTileLayer({ + visible: false, + declutter: true, + minZoom: 9, + maxZoom: 14, + source: new VectorTileSource({ + minZoom: 9, + maxZoom: 14, + format: new MVT(), + url: 'https://api.maptiler.com/tiles/contours/{z}/{x}/{y}.pbf?key=get_your_own_D6rA4zTHduk6KOKTXzGB' + }) +}); +const openmaptiles = new VectorTileLayer({ + visible: false, + declutter: true, + source: new VectorTileSource({ + format: new MVT(), + maxZoom: 14, + url: 'https://api.maptiler.com/tiles/v3/{z}/{x}/{y}.pbf?key=get_your_own_D6rA4zTHduk6KOKTXzGB' + }) +}); + +const layers = [landcover, contours, openmaptiles]; +let rendererTransform; +layers.forEach(layer => { + layer.once('change', () => { + layer.setVisible(true); + worker.postMessage({action: 'request-render'}); + }); + layer.getRenderer().useContainer = function(target, transform) { + this.containerReused = this.getLayer() !== layers[0]; + target.style = {}; + this.canvas = target; + this.context = target.getContext('2d'); + this.container = { + firstElementChild: target + }; + rendererTransform = transform; + }; +}); + +function getFont(font) { + return font[0] + .replace('Noto Sans', 'serif') + .replace('Roboto', 'sans-serif'); +} + +function loadStyles() { + const styleUrl = 'https://api.maptiler.com/maps/topo/style.json?key=get_your_own_D6rA4zTHduk6KOKTXzGB'; + fetch(styleUrl).then(data => data.json()).then(styleJson => { + const spriteUrl = styleJson.sprite + (pixelRatio > 1 ? '@2x' : '') + '.json'; + const spriteImageUrl = styleJson.sprite + (pixelRatio > 1 ? '@2x' : '') + '.png'; + fetch(spriteUrl).then(data => data.json()).then(spriteJson => { + styleFunction(landcover, styleJson, 'landcover', undefined, spriteJson, spriteImageUrl, getFont); + styleFunction(contours, styleJson, 'contours', undefined, spriteJson, spriteImageUrl, getFont); + styleFunction(openmaptiles, styleJson, 'openmaptiles', undefined, spriteJson, spriteImageUrl, getFont); + }); + }); +} + +const tileQueue = new TileQueue(getTilePriority, () => { + worker.postMessage({action: 'request-render'}); +}); +const maxTotalLoading = 8; +const maxNewLoads = 2; + +let rendering = false; + +worker.addEventListener('message', event => { + if (event.data.action !== 'render') { + return; + } + frameState = event.data.frameState; + if (!pixelRatio) { + pixelRatio = frameState.pixelRatio; + loadStyles(); + } + frameState.tileQueue = tileQueue; + frameState.viewState.projection.__proto__ = Projection.prototype; + if (rendering) { + return; + } + rendering = true; + requestAnimationFrame(function() { + let rendered = false; + layers.forEach(layer => { + if (inView(layer.getLayerState(), frameState.viewState)) { + rendered = true; + const renderer = layer.getRenderer(); + renderer.renderFrame(frameState, canvas); + } + }); + rendering = false; + if (!rendered) { + return; + } + renderDeclutterItems(frameState, null); + if (tileQueue.getTilesLoading() < maxTotalLoading) { + tileQueue.reprioritize(); // FIXME only call if view has changed + tileQueue.loadMoreTiles(maxTotalLoading, maxNewLoads); + } + const imageData = canvas.transferToImageBitmap(); + worker.postMessage({ + action: 'rendered', + imageData: imageData, + transform: rendererTransform, + frameState: JSON.parse(JSON.stringify(frameState, getCircularReplacer())) + }, [imageData]); + }); +}); + diff --git a/examples/resources/mapbox-streets-v6-style.js b/examples/resources/mapbox-streets-v6-style.js index e1f0197bf8..afc1d8605d 100644 --- a/examples/resources/mapbox-streets-v6-style.js +++ b/examples/resources/mapbox-streets-v6-style.js @@ -2,20 +2,6 @@ // http://a.tiles.mapbox.com/v4/mapbox.mapbox-streets-v6.json function createMapboxStreetsV6Style(Style, Fill, Stroke, Icon, Text) { - - let worker; - try { - worker = self.document ? null : self; - worker.addEventListener('message', message => { - if (message.data.type === 'imageLoaded') { - iconCache[message.data.iconName].setImage(new Icon({ - img: message.data.image, - imgSize: [15, 15] - })); - } - }); - } catch (e) {} - var fill = new Fill({color: ''}); var stroke = new Stroke({color: '', width: 1}); var polygon = new Style({fill: fill}); @@ -28,19 +14,11 @@ function createMapboxStreetsV6Style(Style, Fill, Stroke, Icon, Text) { function getIcon(iconName) { var icon = iconCache[iconName]; if (!icon) { - if (!worker) { - icon = new Style({image: new Icon({ - src: 'https://unpkg.com/@mapbox/maki@4.0.0/icons/' + iconName + '-15.svg', - imgSize: [15, 15], - crossOrigin: 'anonymous' - })}); - } else { - icon = new Style({}); - worker.postMessage({ - type: 'loadImage', - iconName: iconName - }); - } + icon = new Style({image: new Icon({ + src: 'https://unpkg.com/@mapbox/maki@4.0.0/icons/' + iconName + '-15.svg', + imgSize: [15, 15], + crossOrigin: 'anonymous' + })}); iconCache[iconName] = icon; } return icon; @@ -331,8 +309,4 @@ function createMapboxStreetsV6Style(Style, Fill, Stroke, Icon, Text) { styles.length = length; return styles; }; -} - -try { - module.exports = createMapboxStreetsV6Style; -} catch (e) {} +} \ No newline at end of file From 941df3b270aee8d8679999c09afdc1d5fdaf6079 Mon Sep 17 00:00:00 2001 From: Andreas Hocevar Date: Sun, 22 Mar 2020 20:19:15 +0100 Subject: [PATCH 317/381] Fix issues with TypeScript's built-in webworker lib --- tsconfig.json | 1 + 1 file changed, 1 insertion(+) diff --git a/tsconfig.json b/tsconfig.json index 3a208514a3..4a838e8614 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -6,6 +6,7 @@ "lib": ["es2017", "dom", "webworker"], /* Specify library files to be included in the compilation. */ "allowJs": true, /* Allow javascript files to be compiled. */ "checkJs": true, /* Report errors in .js files. */ + "skipLibCheck": true, // "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */ // "declaration": true, /* Generates corresponding '.d.ts' file. */ // "sourceMap": true, /* Generates corresponding '.map' file. */ From 828becf68e70fa3b97b95adcdf8922489db3a3a9 Mon Sep 17 00:00:00 2001 From: Andreas Hocevar Date: Sun, 22 Mar 2020 20:49:40 +0100 Subject: [PATCH 318/381] Position rotate control in the bottom left --- examples/mapbox-style.css | 6 ++++++ examples/offscreen-canvas-tiles.css | 6 ++++++ 2 files changed, 12 insertions(+) create mode 100644 examples/mapbox-style.css diff --git a/examples/mapbox-style.css b/examples/mapbox-style.css new file mode 100644 index 0000000000..c79f84a2c1 --- /dev/null +++ b/examples/mapbox-style.css @@ -0,0 +1,6 @@ +.ol-rotate { + left: .5em; + bottom: .5em; + top: unset; + right: unset; +} \ No newline at end of file diff --git a/examples/offscreen-canvas-tiles.css b/examples/offscreen-canvas-tiles.css index 9fde055492..10bacb9a63 100644 --- a/examples/offscreen-canvas-tiles.css +++ b/examples/offscreen-canvas-tiles.css @@ -1,3 +1,9 @@ .map { background: rgba(232, 230, 223, 1); } +.ol-rotate { + left: .5em; + bottom: .5em; + top: unset; + right: unset; +} \ No newline at end of file From 0e1af6836ffbf195cb5715ad6f5edaacbfdb7584 Mon Sep 17 00:00:00 2001 From: Andreas Hocevar Date: Mon, 23 Mar 2020 12:46:06 +0100 Subject: [PATCH 319/381] Example cleanup --- examples/offscreen-canvas-tiles.html | 1 + examples/offscreen-canvas-tiles.js | 126 +++++++++------------ examples/offscreen-canvas-tiles.worker.js | 129 ++++++++++------------ package.json | 1 + 4 files changed, 114 insertions(+), 143 deletions(-) diff --git a/examples/offscreen-canvas-tiles.html b/examples/offscreen-canvas-tiles.html index 231da2f14f..741d469e23 100644 --- a/examples/offscreen-canvas-tiles.html +++ b/examples/offscreen-canvas-tiles.html @@ -5,5 +5,6 @@ shortdesc: Example of a map that delegates rendering to a worker. docs: > The map in this example is rendered in a web worker, using `OffscreenCanvas`. **Note:** This is currently only supported in Chrome and Edge. tags: "worker, offscreencanvas, vector-tiles" +experimental: true ---
diff --git a/examples/offscreen-canvas-tiles.js b/examples/offscreen-canvas-tiles.js index 29243c2d9d..53696a7414 100644 --- a/examples/offscreen-canvas-tiles.js +++ b/examples/offscreen-canvas-tiles.js @@ -4,56 +4,16 @@ import Layer from '../src/ol/layer/Layer.js'; import Worker from 'worker-loader!./offscreen-canvas-tiles.worker.js'; //eslint-disable-line import {compose, create} from '../src/ol/transform.js'; import {createTransformString} from '../src/ol/render/canvas.js'; -import {getFontParameters} from '../src/ol/css.js'; import {createXYZ} from '../src/ol/tilegrid.js'; import {FullScreen} from '../src/ol/control.js'; +import stringify from 'json-stringify-safe'; -const mvtLayerWorker = new Worker(); - -const loadingImages = {}; -mvtLayerWorker.addEventListener('message', event => { - if (event.data.action === 'getFontParameters') { - getFontParameters(event.data.font, font => { - mvtLayerWorker.postMessage({ - action: 'gotFontParameters', - font: font - }); - }); - } else if (event.data.action === 'loadImage') { - if (!(event.data.src in loadingImages)) { - const image = new Image(); - image.crossOrigin = 'anonymous'; - image.addEventListener('load', function() { - createImageBitmap(image, 0, 0, image.width, image.height).then(imageBitmap => { - delete loadingImages[event.data.iconName]; - mvtLayerWorker.postMessage({ - action: 'imageLoaded', - image: imageBitmap, - src: event.data.src - }, [imageBitmap]); - }); - }); - image.src = event.data.src; - loadingImages[event.data.src] = true; - } - } -}); - -function getCircularReplacer() { - const seen = new WeakSet(); - return function(key, value) { - if (typeof value === 'object' && value !== null) { - if (seen.has(value)) { - return '[circular]'; - } - seen.add(value); - } - return value; - }; -} +const worker = new Worker(); let container, transformContainer, canvas, workerFrameState, mainThreadFrameState; +// Transform the container to account for the differnece between the (newer) +// main thread frameState and the (older) worker frameState function updateContainerTransform() { if (workerFrameState) { const viewState = mainThreadFrameState.viewState; @@ -65,6 +25,8 @@ function updateContainerTransform() { const renderedResolution = renderedViewState.resolution; const renderedRotation = renderedViewState.rotation; const transform = create(); + // Skip the extra transform for rotated views, because it will not work + // correctly in that case if (!rotation) { compose(transform, (renderedCenter[0] - center[0]) / resolution, @@ -75,40 +37,36 @@ function updateContainerTransform() { } transformContainer.style.transform = createTransformString(transform); } - -} - -function render(id, frameState) { - if (!container) { - container = document.createElement('div'); - container.style.position = 'absolute'; - container.style.width = '100%'; - container.style.height = '100%'; - transformContainer = document.createElement('div'); - transformContainer.style.position = 'absolute'; - transformContainer.style.width = '100%'; - transformContainer.style.height = '100%'; - container.appendChild(transformContainer); - canvas = document.createElement('canvas'); - canvas.style.position = 'absolute'; - canvas.style.left = '0'; - canvas.style.transformOrigin = 'top left'; - transformContainer.appendChild(canvas); - } - mainThreadFrameState = frameState; - updateContainerTransform(); - mvtLayerWorker.postMessage({ - action: 'render', - id: id, - frameState: JSON.parse(JSON.stringify(frameState, getCircularReplacer())) - }); - return container; } const map = new Map({ layers: [ new Layer({ - render: render.bind(undefined, 'mapbox') + render: function(frameState) { + if (!container) { + container = document.createElement('div'); + container.style.position = 'absolute'; + container.style.width = '100%'; + container.style.height = '100%'; + transformContainer = document.createElement('div'); + transformContainer.style.position = 'absolute'; + transformContainer.style.width = '100%'; + transformContainer.style.height = '100%'; + container.appendChild(transformContainer); + canvas = document.createElement('canvas'); + canvas.style.position = 'absolute'; + canvas.style.left = '0'; + canvas.style.transformOrigin = 'top left'; + transformContainer.appendChild(canvas); + } + mainThreadFrameState = frameState; + updateContainerTransform(); + worker.postMessage({ + action: 'render', + frameState: JSON.parse(stringify(frameState)) + }); + return container; + } }) ], target: 'map', @@ -119,10 +77,28 @@ const map = new Map({ }) }); map.addControl(new FullScreen()); -mvtLayerWorker.addEventListener('message', function(message) { - if (message.data.action === 'request-render') { + +// Worker messaging and actions +worker.addEventListener('message', message => { + if (message.data.action === 'loadImage') { + // Image loader for ol-mapbox-style + const image = new Image(); + image.crossOrigin = 'anonymous'; + image.addEventListener('load', function() { + createImageBitmap(image, 0, 0, image.width, image.height).then(imageBitmap => { + worker.postMessage({ + action: 'imageLoaded', + image: imageBitmap, + src: event.data.src + }, [imageBitmap]); + }); + }); + image.src = event.data.src; + } else if (message.data.action === 'request-render') { + // Worker requested a new render frame map.render(); } else if (canvas && message.data.action === 'rendered') { + // Worker provies a new render frame transformContainer.style.transform = ''; const imageData = message.data.imageData; canvas.width = imageData.width; diff --git a/examples/offscreen-canvas-tiles.worker.js b/examples/offscreen-canvas-tiles.worker.js index d801747de5..e80187e7af 100644 --- a/examples/offscreen-canvas-tiles.worker.js +++ b/examples/offscreen-canvas-tiles.worker.js @@ -7,81 +7,35 @@ import {getTilePriority as tilePriorityFunction} from '../src/ol/TileQueue.js'; import {renderDeclutterItems} from '../src/ol/render.js'; import styleFunction from 'ol-mapbox-style/dist/stylefunction.js'; import {inView} from '../src/ol/layer/Layer.js'; +import stringify from 'json-stringify-safe'; /** @type {any} */ const worker = self; -let frameState, pixelRatio; +let frameState, pixelRatio, rendererTransform; const canvas = new OffscreenCanvas(1, 1); -function getCircularReplacer() { - const seen = new WeakSet(); - return function(key, value) { - if (typeof value === 'object' && value !== null) { - if (seen.has(value)) { - return '[circular]'; - } - seen.add(value); - } - return value; - }; -} - -function getTilePriority(tile, tileSourceKey, tileCenter, tileResolution) { - return tilePriorityFunction(frameState, tile, tileSourceKey, tileCenter, tileResolution); -} - -const landcover = new VectorTileLayer({ - visible: false, - declutter: true, - maxZoom: 9, - source: new VectorTileSource({ +const sources = { + landcover: new VectorTileSource({ maxZoom: 9, format: new MVT(), url: 'https://api.maptiler.com/tiles/landcover/{z}/{x}/{y}.pbf?key=get_your_own_D6rA4zTHduk6KOKTXzGB' - }) -}); -const contours = new VectorTileLayer({ - visible: false, - declutter: true, - minZoom: 9, - maxZoom: 14, - source: new VectorTileSource({ + }), + contours: new VectorTileSource({ minZoom: 9, maxZoom: 14, format: new MVT(), url: 'https://api.maptiler.com/tiles/contours/{z}/{x}/{y}.pbf?key=get_your_own_D6rA4zTHduk6KOKTXzGB' - }) -}); -const openmaptiles = new VectorTileLayer({ - visible: false, - declutter: true, - source: new VectorTileSource({ + }), + openmaptiles: new VectorTileSource({ format: new MVT(), maxZoom: 14, url: 'https://api.maptiler.com/tiles/v3/{z}/{x}/{y}.pbf?key=get_your_own_D6rA4zTHduk6KOKTXzGB' }) -}); - -const layers = [landcover, contours, openmaptiles]; -let rendererTransform; -layers.forEach(layer => { - layer.once('change', () => { - layer.setVisible(true); - worker.postMessage({action: 'request-render'}); - }); - layer.getRenderer().useContainer = function(target, transform) { - this.containerReused = this.getLayer() !== layers[0]; - target.style = {}; - this.canvas = target; - this.context = target.getContext('2d'); - this.container = { - firstElementChild: target - }; - rendererTransform = transform; - }; -}); +}; +const layers = []; +// Font replacement so we do not need to load web fonts in the worker function getFont(font) { return font[0] .replace('Noto Sans', 'serif') @@ -90,23 +44,63 @@ function getFont(font) { function loadStyles() { const styleUrl = 'https://api.maptiler.com/maps/topo/style.json?key=get_your_own_D6rA4zTHduk6KOKTXzGB'; + fetch(styleUrl).then(data => data.json()).then(styleJson => { + const buckets = []; + let currentSource; + styleJson.layers.forEach(layer => { + if (!layer.source) { + return; + } + if (currentSource !== layer.source) { + currentSource = layer.source; + buckets.push({ + source: layer.source, + layers: [] + }); + } + buckets[buckets.length - 1].layers.push(layer.id); + }); + const spriteUrl = styleJson.sprite + (pixelRatio > 1 ? '@2x' : '') + '.json'; const spriteImageUrl = styleJson.sprite + (pixelRatio > 1 ? '@2x' : '') + '.png'; fetch(spriteUrl).then(data => data.json()).then(spriteJson => { - styleFunction(landcover, styleJson, 'landcover', undefined, spriteJson, spriteImageUrl, getFont); - styleFunction(contours, styleJson, 'contours', undefined, spriteJson, spriteImageUrl, getFont); - styleFunction(openmaptiles, styleJson, 'openmaptiles', undefined, spriteJson, spriteImageUrl, getFont); + buckets.forEach(bucket => { + const source = sources[bucket.source]; + if (!source) { + return; + } + const layer = new VectorTileLayer({ + declutter: true, + source, + minZoom: source.getTileGrid().getMinZoom() + }); + layer.getRenderer().useContainer = function(target, transform) { + this.containerReused = this.getLayer() !== layers[0]; + target.style = {}; + this.canvas = target; + this.context = target.getContext('2d'); + this.container = { + firstElementChild: target + }; + rendererTransform = transform; + }; + styleFunction(layer, styleJson, bucket.layers, undefined, spriteJson, spriteImageUrl, getFont); + layers.push(layer); + }); + worker.postMessage({action: 'request-render'}); }); }); } -const tileQueue = new TileQueue(getTilePriority, () => { - worker.postMessage({action: 'request-render'}); -}); +// Minimal map-like functionality for rendering + +const tileQueue = new TileQueue( + (tile, tileSourceKey, tileCenter, tileResolution) => tilePriorityFunction(frameState, tile, tileSourceKey, tileCenter, tileResolution), + () => worker.postMessage({action: 'request-render'})); + const maxTotalLoading = 8; const maxNewLoads = 2; - let rendering = false; worker.addEventListener('message', event => { @@ -124,7 +118,7 @@ worker.addEventListener('message', event => { return; } rendering = true; - requestAnimationFrame(function() { + requestAnimationFrame(() => { let rendered = false; layers.forEach(layer => { if (inView(layer.getLayerState(), frameState.viewState)) { @@ -139,7 +133,7 @@ worker.addEventListener('message', event => { } renderDeclutterItems(frameState, null); if (tileQueue.getTilesLoading() < maxTotalLoading) { - tileQueue.reprioritize(); // FIXME only call if view has changed + tileQueue.reprioritize(); tileQueue.loadMoreTiles(maxTotalLoading, maxNewLoads); } const imageData = canvas.transferToImageBitmap(); @@ -147,8 +141,7 @@ worker.addEventListener('message', event => { action: 'rendered', imageData: imageData, transform: rendererTransform, - frameState: JSON.parse(JSON.stringify(frameState, getCircularReplacer())) + frameState: JSON.parse(stringify(frameState)) }, [imageData]); }); }); - diff --git a/package.json b/package.json index 67d75abf99..2eca898191 100644 --- a/package.json +++ b/package.json @@ -73,6 +73,7 @@ "jquery": "3.4.1", "jsdoc": "3.6.3", "jsdoc-plugin-typescript": "^2.0.5", + "json-stringify-safe": "^5.0.1", "karma": "^4.4.1", "karma-chrome-launcher": "3.1.0", "karma-coverage-istanbul-reporter": "^2.1.1", From 5113d7070149186ac9d1615da8fbd244dd7f1647 Mon Sep 17 00:00:00 2001 From: Andreas Hocevar Date: Mon, 23 Mar 2020 12:58:41 +0100 Subject: [PATCH 320/381] Rename example --- examples/{offscreen-canvas-tiles.css => offscreen-canvas.css} | 0 .../{offscreen-canvas-tiles.html => offscreen-canvas.html} | 0 examples/{offscreen-canvas-tiles.js => offscreen-canvas.js} | 4 ++-- ...reen-canvas-tiles.worker.js => offscreen-canvas.worker.js} | 0 4 files changed, 2 insertions(+), 2 deletions(-) rename examples/{offscreen-canvas-tiles.css => offscreen-canvas.css} (100%) rename examples/{offscreen-canvas-tiles.html => offscreen-canvas.html} (100%) rename examples/{offscreen-canvas-tiles.js => offscreen-canvas.js} (97%) rename examples/{offscreen-canvas-tiles.worker.js => offscreen-canvas.worker.js} (100%) diff --git a/examples/offscreen-canvas-tiles.css b/examples/offscreen-canvas.css similarity index 100% rename from examples/offscreen-canvas-tiles.css rename to examples/offscreen-canvas.css diff --git a/examples/offscreen-canvas-tiles.html b/examples/offscreen-canvas.html similarity index 100% rename from examples/offscreen-canvas-tiles.html rename to examples/offscreen-canvas.html diff --git a/examples/offscreen-canvas-tiles.js b/examples/offscreen-canvas.js similarity index 97% rename from examples/offscreen-canvas-tiles.js rename to examples/offscreen-canvas.js index 53696a7414..b51fceeea2 100644 --- a/examples/offscreen-canvas-tiles.js +++ b/examples/offscreen-canvas.js @@ -1,7 +1,7 @@ import Map from '../src/ol/Map.js'; import View from '../src/ol/View.js'; import Layer from '../src/ol/layer/Layer.js'; -import Worker from 'worker-loader!./offscreen-canvas-tiles.worker.js'; //eslint-disable-line +import Worker from 'worker-loader!./offscreen-canvas.worker.js'; //eslint-disable-line import {compose, create} from '../src/ol/transform.js'; import {createTransformString} from '../src/ol/render/canvas.js'; import {createXYZ} from '../src/ol/tilegrid.js'; @@ -89,7 +89,7 @@ worker.addEventListener('message', message => { worker.postMessage({ action: 'imageLoaded', image: imageBitmap, - src: event.data.src + src: message.data.src }, [imageBitmap]); }); }); diff --git a/examples/offscreen-canvas-tiles.worker.js b/examples/offscreen-canvas.worker.js similarity index 100% rename from examples/offscreen-canvas-tiles.worker.js rename to examples/offscreen-canvas.worker.js From 576f50331bff757132f12affd2fde139e2ccbe09 Mon Sep 17 00:00:00 2001 From: Andreas Hocevar Date: Mon, 23 Mar 2020 19:44:31 +0100 Subject: [PATCH 321/381] Add attribution --- examples/offscreen-canvas.js | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/examples/offscreen-canvas.js b/examples/offscreen-canvas.js index b51fceeea2..991b757300 100644 --- a/examples/offscreen-canvas.js +++ b/examples/offscreen-canvas.js @@ -7,6 +7,7 @@ import {createTransformString} from '../src/ol/render/canvas.js'; import {createXYZ} from '../src/ol/tilegrid.js'; import {FullScreen} from '../src/ol/control.js'; import stringify from 'json-stringify-safe'; +import Source from '../src/ol/source/Source.js'; const worker = new Worker(); @@ -66,7 +67,13 @@ const map = new Map({ frameState: JSON.parse(stringify(frameState)) }); return container; - } + }, + source: new Source({ + attributions: [ + '© MapTiler', + '© OpenStreetMap contributors' + ] + }) }) ], target: 'map', From d70b3aa3d5cc4d8e85f4f07990d42556fc641ac1 Mon Sep 17 00:00:00 2001 From: Andreas Hocevar Date: Tue, 24 Mar 2020 10:32:37 +0100 Subject: [PATCH 322/381] Move catch-up logic to main thread This avoids requestAnimationFrame in the worker. --- examples/offscreen-canvas.js | 35 ++++++++++------- examples/offscreen-canvas.worker.js | 59 ++++++++++++----------------- 2 files changed, 45 insertions(+), 49 deletions(-) diff --git a/examples/offscreen-canvas.js b/examples/offscreen-canvas.js index 991b757300..180e5c990e 100644 --- a/examples/offscreen-canvas.js +++ b/examples/offscreen-canvas.js @@ -11,7 +11,7 @@ import Source from '../src/ol/source/Source.js'; const worker = new Worker(); -let container, transformContainer, canvas, workerFrameState, mainThreadFrameState; +let container, transformContainer, canvas, rendering, workerFrameState, mainThreadFrameState; // Transform the container to account for the differnece between the (newer) // main thread frameState and the (older) worker frameState @@ -62,10 +62,15 @@ const map = new Map({ } mainThreadFrameState = frameState; updateContainerTransform(); - worker.postMessage({ - action: 'render', - frameState: JSON.parse(stringify(frameState)) - }); + if (!rendering) { + rendering = true; + worker.postMessage({ + action: 'render', + frameState: JSON.parse(stringify(frameState)) + }); + } else { + frameState.animate = true; + } return container; }, source: new Source({ @@ -101,18 +106,20 @@ worker.addEventListener('message', message => { }); }); image.src = event.data.src; - } else if (message.data.action === 'request-render') { + } else if (message.data.action === 'requestRender') { // Worker requested a new render frame map.render(); } else if (canvas && message.data.action === 'rendered') { // Worker provies a new render frame - transformContainer.style.transform = ''; - const imageData = message.data.imageData; - canvas.width = imageData.width; - canvas.height = imageData.height; - canvas.getContext('2d').drawImage(imageData, 0, 0); - canvas.style.transform = message.data.transform; - workerFrameState = message.data.frameState; - updateContainerTransform(); + requestAnimationFrame(function() { + const imageData = message.data.imageData; + canvas.width = imageData.width; + canvas.height = imageData.height; + canvas.getContext('2d').drawImage(imageData, 0, 0); + canvas.style.transform = message.data.transform; + workerFrameState = message.data.frameState; + updateContainerTransform(); + }); + rendering = false; } }); diff --git a/examples/offscreen-canvas.worker.js b/examples/offscreen-canvas.worker.js index e80187e7af..b03f0be61d 100644 --- a/examples/offscreen-canvas.worker.js +++ b/examples/offscreen-canvas.worker.js @@ -14,6 +14,9 @@ const worker = self; let frameState, pixelRatio, rendererTransform; const canvas = new OffscreenCanvas(1, 1); +// OffscreenCanvas does not have a style, so we mock it +canvas.style = {}; +const context = canvas.getContext('2d'); const sources = { landcover: new VectorTileSource({ @@ -77,18 +80,17 @@ function loadStyles() { }); layer.getRenderer().useContainer = function(target, transform) { this.containerReused = this.getLayer() !== layers[0]; - target.style = {}; - this.canvas = target; - this.context = target.getContext('2d'); + this.canvas = canvas; + this.context = context; this.container = { - firstElementChild: target + firstElementChild: canvas }; rendererTransform = transform; }; styleFunction(layer, styleJson, bucket.layers, undefined, spriteJson, spriteImageUrl, getFont); layers.push(layer); }); - worker.postMessage({action: 'request-render'}); + worker.postMessage({action: 'requestRender'}); }); }); } @@ -97,11 +99,10 @@ function loadStyles() { const tileQueue = new TileQueue( (tile, tileSourceKey, tileCenter, tileResolution) => tilePriorityFunction(frameState, tile, tileSourceKey, tileCenter, tileResolution), - () => worker.postMessage({action: 'request-render'})); + () => worker.postMessage({action: 'requestRender'})); const maxTotalLoading = 8; const maxNewLoads = 2; -let rendering = false; worker.addEventListener('message', event => { if (event.data.action !== 'render') { @@ -114,34 +115,22 @@ worker.addEventListener('message', event => { } frameState.tileQueue = tileQueue; frameState.viewState.projection.__proto__ = Projection.prototype; - if (rendering) { - return; - } - rendering = true; - requestAnimationFrame(() => { - let rendered = false; - layers.forEach(layer => { - if (inView(layer.getLayerState(), frameState.viewState)) { - rendered = true; - const renderer = layer.getRenderer(); - renderer.renderFrame(frameState, canvas); - } - }); - rendering = false; - if (!rendered) { - return; + layers.forEach(layer => { + if (inView(layer.getLayerState(), frameState.viewState)) { + const renderer = layer.getRenderer(); + renderer.renderFrame(frameState, canvas); } - renderDeclutterItems(frameState, null); - if (tileQueue.getTilesLoading() < maxTotalLoading) { - tileQueue.reprioritize(); - tileQueue.loadMoreTiles(maxTotalLoading, maxNewLoads); - } - const imageData = canvas.transferToImageBitmap(); - worker.postMessage({ - action: 'rendered', - imageData: imageData, - transform: rendererTransform, - frameState: JSON.parse(stringify(frameState)) - }, [imageData]); }); + renderDeclutterItems(frameState, null); + if (tileQueue.getTilesLoading() < maxTotalLoading) { + tileQueue.reprioritize(); + tileQueue.loadMoreTiles(maxTotalLoading, maxNewLoads); + } + const imageData = canvas.transferToImageBitmap(); + worker.postMessage({ + action: 'rendered', + imageData: imageData, + transform: rendererTransform, + frameState: JSON.parse(stringify(frameState)) + }, [imageData]); }); From c3d9ac6265f7bb4816beb52a50e5d83fedd21567 Mon Sep 17 00:00:00 2001 From: mike-000 <49240900+mike-000@users.noreply.github.com> Date: Wed, 25 Mar 2020 12:55:57 +0000 Subject: [PATCH 323/381] Fix description --- examples/earthquake-custom-symbol.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/earthquake-custom-symbol.html b/examples/earthquake-custom-symbol.html index 729d8eb3e7..34dd810d67 100644 --- a/examples/earthquake-custom-symbol.html +++ b/examples/earthquake-custom-symbol.html @@ -1,7 +1,7 @@ --- layout: example.html title: Earthquakes with custom symbols -shortdesc: Demonstrates the use of `toCanvas` to create custom icon symbols. +shortdesc: Demonstrates the use of `toContext` to create custom icon symbols. docs: > This example parses a KML file and renders the features as a vector layer. The layer is given a style that renders earthquake locations with a custom lightning symbol and a size relative to their magnitude. tags: "KML, vector, style, canvas, symbol" From 98e8bec3709364b5fd14dd71a4e4e72dcf4ae1c9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20=C5=81oskot?= Date: Mon, 21 Jan 2019 15:21:39 +0100 Subject: [PATCH 324/381] Calculate tile grid extent from extent of bottom-level tile matrix Prefers extent derived from the tile matrix set in the capabilities over default projection extent. --- src/ol/source/WMTS.js | 38 ++++++++++---------- test/spec/ol/format/wmts/ogcsample.xml | 28 ++++++++++++++- test/spec/ol/format/wmtscapabilities.test.js | 4 ++- test/spec/ol/source/wmts.test.js | 27 ++++++++++++++ 4 files changed, 77 insertions(+), 20 deletions(-) diff --git a/src/ol/source/WMTS.js b/src/ol/source/WMTS.js index c8b11c9c32..77663ad2a3 100644 --- a/src/ol/source/WMTS.js +++ b/src/ol/source/WMTS.js @@ -4,9 +4,8 @@ import {expandUrl, createFromTileUrlFunctions, nullTileUrlFunction} from '../tileurlfunction.js'; import {find, findIndex, includes} from '../array.js'; -import {containsExtent} from '../extent.js'; import {assign} from '../obj.js'; -import {get as getProjection, equivalent, transformExtent} from '../proj.js'; +import {get as getProjection, equivalent} from '../proj.js'; import TileImage from './TileImage.js'; import WMTSRequestEncoding from './WMTSRequestEncoding.js'; import {createFromCapabilitiesMatrixSet} from '../tilegrid/WMTS.js'; @@ -377,22 +376,25 @@ export function optionsFromCapabilities(wmtsCap, config) { } } - const wgs84BoundingBox = l['WGS84BoundingBox']; - let extent, wrapX; - if (wgs84BoundingBox !== undefined) { - const wgs84ProjectionExtent = getProjection('EPSG:4326').getExtent(); - wrapX = (wgs84BoundingBox[0] == wgs84ProjectionExtent[0] && - wgs84BoundingBox[2] == wgs84ProjectionExtent[2]); - extent = transformExtent( - wgs84BoundingBox, 'EPSG:4326', projection); - const projectionExtent = projection.getExtent(); - if (projectionExtent) { - // If possible, do a sanity check on the extent - it should never be - // bigger than the validity extent of the projection of a matrix set. - if (!containsExtent(projectionExtent, extent)) { - extent = undefined; - } - } + const wrapX = false; + + const matrix0 = matrixSetObj.TileMatrix[0]; + const resolution = matrix0.ScaleDenominator * 0.00028; // WMTS 1.0.0: standardized rendering pixel size + const origin = projection === getProjection('EPSG:4326') + ? [matrix0.TopLeftCorner[1], matrix0.TopLeftCorner[0]] + : matrix0.TopLeftCorner; + const tileSpanX = matrix0.TileWidth * resolution; + const tileSpanY = matrix0.TileHeight * resolution; + + const extent = [ + origin[0], + origin[1] - tileSpanY * matrix0.MatrixHeight, + origin[0] + tileSpanX * matrix0.MatrixWidth, + origin[1] + ]; + + if (projection.getExtent() === null) { + projection.setExtent(extent); } const tileGrid = createFromCapabilitiesMatrixSet(matrixSetObj, extent, matrixLimits); diff --git a/test/spec/ol/format/wmts/ogcsample.xml b/test/spec/ol/format/wmts/ogcsample.xml index fbf7b282b8..7eb006bf2b 100644 --- a/test/spec/ol/format/wmts/ogcsample.xml +++ b/test/spec/ol/format/wmts/ogcsample.xml @@ -92,6 +92,9 @@ access interface to some TileMatrixSets google3857 + + google3857subset + @@ -372,6 +375,29 @@ access interface to some TileMatrixSets 7000 - + + + google3857subset + urn:ogc:def:crs:EPSG:6.18:3:3857 + + 18 + 2132.72958385 + -10000000 10000000 + 256 + 256 + 1 + 1 + + + 18 + 1066.36479193 + -10000000 10000000 + 256 + 256 + 2 + 2 + + + diff --git a/test/spec/ol/format/wmtscapabilities.test.js b/test/spec/ol/format/wmtscapabilities.test.js index 72b907cb3f..5bcf881758 100644 --- a/test/spec/ol/format/wmtscapabilities.test.js +++ b/test/spec/ol/format/wmtscapabilities.test.js @@ -54,11 +54,13 @@ describe('ol.format.WMTSCapabilities', function() { expect(layer.Style[0].LegendURL[0].format).to.be.eql('image/png'); expect(layer.TileMatrixSetLink).to.be.an('array'); - expect(layer.TileMatrixSetLink).to.have.length(2); + expect(layer.TileMatrixSetLink).to.have.length(3); expect(layer.TileMatrixSetLink[0].TileMatrixSet).to.be .eql('BigWorldPixel'); expect(layer.TileMatrixSetLink[1].TileMatrixSet).to.be .eql('google3857'); + expect(layer.TileMatrixSetLink[2].TileMatrixSet).to.be + .eql('google3857subset'); const wgs84Bbox = layer.WGS84BoundingBox; expect(wgs84Bbox).to.be.an('array'); diff --git a/test/spec/ol/source/wmts.test.js b/test/spec/ol/source/wmts.test.js index b49d71e787..20cf5a41e1 100644 --- a/test/spec/ol/source/wmts.test.js +++ b/test/spec/ol/source/wmts.test.js @@ -1,4 +1,5 @@ import WMTSCapabilities from '../../../../src/ol/format/WMTSCapabilities.js'; +import {getBottomLeft, getTopRight} from '../../../../src/ol/extent.js'; import {get as getProjection} from '../../../../src/ol/proj.js'; import Projection from '../../../../src/ol/proj/Projection.js'; import WMTSTileGrid from '../../../../src/ol/tilegrid/WMTS.js'; @@ -149,6 +150,32 @@ describe('ol.source.WMTS', function() { expect(options.projection.getCode()).to.be.eql('urn:ogc:def:crs:OGC:1.3:CRS84'); }); + it('uses extent of tile matrix instead of projection extent', function() { + const options = optionsFromCapabilities(capabilities, + {layer: 'BlueMarbleNextGeneration', matrixSet: 'google3857subset'}); + + // Since google3857subset defines subset of space defined by the google3857 matrix set: + // - top left corner: -10000000, 10000000 + // - calculated grid extent: [-10000000, 9999694.25188686, -9999694.25188686, 10000000] + // then the tile grid extent is only a part of the full projection extent. + + const gridExtent = options.tileGrid.getExtent(); + const gridBottomLeft = getBottomLeft(gridExtent); + const gridTopRight = getTopRight(gridExtent); + expect(Math.round(gridBottomLeft[0])).to.be.eql(-10000000); + expect(Math.round(gridBottomLeft[1])).to.be.eql(9999847); + expect(Math.round(gridTopRight[0])).to.be.eql(-9999847); + expect(Math.round(gridTopRight[1])).to.be.eql(10000000); + + const projExtent = options.projection.getExtent(); + const projBottomLeft = getBottomLeft(projExtent); + const projTopRight = getTopRight(projExtent); + expect(Math.round(projBottomLeft[0])).to.be.eql(-20037508); + expect(Math.round(projBottomLeft[1])).to.be.eql(-20037508); + expect(Math.round(projTopRight[0])).to.be.eql(20037508); + expect(Math.round(projTopRight[1])).to.be.eql(20037508); + }); + it('doesn\'t fail if the GetCap doesn\'t contains Constraint tags', function() { const tmpXml = content.replace(//g, ''); const tmpCapabilities = parser.read(tmpXml); From fbe7b0bd78dc4c4a59b72219d6e5fce6cf6a21a0 Mon Sep 17 00:00:00 2001 From: Szabo Bogdan Date: Thu, 26 Mar 2020 19:00:13 +0100 Subject: [PATCH 325/381] Fix test typo --- test/spec/ol/layer/vector.test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/spec/ol/layer/vector.test.js b/test/spec/ol/layer/vector.test.js index e53523166c..65c6f2a163 100644 --- a/test/spec/ol/layer/vector.test.js +++ b/test/spec/ol/layer/vector.test.js @@ -141,7 +141,7 @@ describe('ol.layer.Vector', function() { }), new Feature({ geometry: new Point([1000000, 0]), - name: 'feture2' + name: 'feature2' }) ] }) From 6aa398cbecbe63d2b5bc3475ad9bdb62e99bee91 Mon Sep 17 00:00:00 2001 From: Szabo Bogdan Date: Thu, 26 Mar 2020 21:18:57 +0100 Subject: [PATCH 326/381] Fix hit detection for images with missing size --- src/ol/render/canvas/hitdetect.js | 4 +++ test/spec/ol/layer/vector.test.js | 48 +++++++++++++++++++++++-------- 2 files changed, 40 insertions(+), 12 deletions(-) diff --git a/src/ol/render/canvas/hitdetect.js b/src/ol/render/canvas/hitdetect.js index ef21f3d9e9..ced9974156 100644 --- a/src/ol/render/canvas/hitdetect.js +++ b/src/ol/render/canvas/hitdetect.js @@ -65,6 +65,10 @@ export function createHitDetectionImageData(size, transforms, features, styleFun const image = originalStyle.getImage(); if (image) { const imgSize = image.getImageSize(); + if (!imgSize) { + continue; + } + const canvas = document.createElement('canvas'); canvas.width = imgSize[0]; canvas.height = imgSize[1]; diff --git a/test/spec/ol/layer/vector.test.js b/test/spec/ol/layer/vector.test.js index 65c6f2a163..21e8ae4534 100644 --- a/test/spec/ol/layer/vector.test.js +++ b/test/spec/ol/layer/vector.test.js @@ -6,6 +6,7 @@ import Feature from '../../../../src/ol/Feature.js'; import Point from '../../../../src/ol/geom/Point.js'; import Map from '../../../../src/ol/Map.js'; import View from '../../../../src/ol/View.js'; +import ImageStyle from '../../../../src/ol/style/Image.js'; describe('ol.layer.Vector', function() { @@ -132,19 +133,41 @@ describe('ol.layer.Vector', function() { let map, layer; beforeEach(function() { + const source = new VectorSource({ + features: [ + new Feature({ + geometry: new Point([-1000000, 0]), + name: 'feature1' + }), + new Feature({ + geometry: new Point([1000000, 0]), + name: 'feature2' + }) + ] + }); + + const feature = new Feature({ + geometry: new Point([-1000000, 0]), + name: 'feature with no size' + }); + + const testImage = new ImageStyle({ + opacity: 1, + displacement: [] + }); + + testImage.getImageState = () => {}; + testImage.listenImageChange = () => {}; + testImage.getImageSize = () => {}; + + feature.setStyle([new Style({ + image: testImage + })]); + + source.addFeature(feature); + layer = new VectorLayer({ - source: new VectorSource({ - features: [ - new Feature({ - geometry: new Point([-1000000, 0]), - name: 'feature1' - }), - new Feature({ - geometry: new Point([1000000, 0]), - name: 'feature2' - }) - ] - }) + source }); const container = document.createElement('div'); container.style.width = '256px'; @@ -171,6 +194,7 @@ describe('ol.layer.Vector', function() { map.renderSync(); const pixel = map.getPixelFromCoordinate([-1000000, 0]); layer.getFeatures(pixel).then(function(features) { + expect(features.length).to.equal(1); expect(features[0].get('name')).to.be('feature1'); done(); }); From 83a5cd63c67beed1cc8b8c63ea082a33cd75dc32 Mon Sep 17 00:00:00 2001 From: horsenit Date: Fri, 27 Mar 2020 00:32:10 -0400 Subject: [PATCH 327/381] Speed up Overlay element positioning using CSS translate() --- src/ol/Overlay.js | 80 +++++++++++++---------------------------------- 1 file changed, 22 insertions(+), 58 deletions(-) diff --git a/src/ol/Overlay.js b/src/ol/Overlay.js index fa71db0591..f1eab6c17f 100644 --- a/src/ol/Overlay.js +++ b/src/ol/Overlay.js @@ -158,17 +158,11 @@ class Overlay extends BaseObject { /** * @protected - * @type {{bottom_: string, - * left_: string, - * right_: string, - * top_: string, + * @type {{transform_: string, * visible: boolean}} */ this.rendered = { - bottom_: '', - left_: '', - right_: '', - top_: '', + transform_: '', visible: true }; @@ -506,63 +500,33 @@ class Overlay extends BaseObject { this.setVisible(true); - let offsetX = offset[0]; - let offsetY = offset[1]; + const x = Math.round(pixel[0] + offset[0]) + 'px'; + const y = Math.round(pixel[1] + offset[1]) + 'px'; + let posX = '0%'; + let posY = '0%'; if (positioning == OverlayPositioning.BOTTOM_RIGHT || positioning == OverlayPositioning.CENTER_RIGHT || positioning == OverlayPositioning.TOP_RIGHT) { - if (this.rendered.left_ !== '') { - this.rendered.left_ = ''; - style.left = ''; - } - const right = Math.round(mapSize[0] - pixel[0] - offsetX) + 'px'; - if (this.rendered.right_ != right) { - this.rendered.right_ = right; - style.right = right; - } - } else { - if (this.rendered.right_ !== '') { - this.rendered.right_ = ''; - style.right = ''; - } - if (positioning == OverlayPositioning.BOTTOM_CENTER || - positioning == OverlayPositioning.CENTER_CENTER || - positioning == OverlayPositioning.TOP_CENTER) { - offsetX -= this.element.offsetWidth / 2; - } - const left = Math.round(pixel[0] + offsetX) + 'px'; - if (this.rendered.left_ != left) { - this.rendered.left_ = left; - style.left = left; - } + posX = '-100%'; + } else if (positioning == OverlayPositioning.BOTTOM_CENTER || + positioning == OverlayPositioning.CENTER_CENTER || + positioning == OverlayPositioning.TOP_CENTER) { + posX = '-50%'; } if (positioning == OverlayPositioning.BOTTOM_LEFT || positioning == OverlayPositioning.BOTTOM_CENTER || positioning == OverlayPositioning.BOTTOM_RIGHT) { - if (this.rendered.top_ !== '') { - this.rendered.top_ = ''; - style.top = ''; - } - const bottom = Math.round(mapSize[1] - pixel[1] - offsetY) + 'px'; - if (this.rendered.bottom_ != bottom) { - this.rendered.bottom_ = bottom; - style.bottom = bottom; - } - } else { - if (this.rendered.bottom_ !== '') { - this.rendered.bottom_ = ''; - style.bottom = ''; - } - if (positioning == OverlayPositioning.CENTER_LEFT || - positioning == OverlayPositioning.CENTER_CENTER || - positioning == OverlayPositioning.CENTER_RIGHT) { - offsetY -= this.element.offsetHeight / 2; - } - const top = Math.round(pixel[1] + offsetY) + 'px'; - if (this.rendered.top_ != top) { - this.rendered.top_ = 'top'; - style.top = top; - } + posY = '-100%'; + } else if (positioning == OverlayPositioning.CENTER_LEFT || + positioning == OverlayPositioning.CENTER_CENTER || + positioning == OverlayPositioning.CENTER_RIGHT) { + posY = '-50%'; + } + const transform = `translate(${posX}, ${posY}) translate(${x}, ${y})`; + if (this.rendered.transform_ != transform) { + this.rendered.transform_ = transform; + style.transform = transform; + style.msTransform = transform; // IE9 } } From 03ea8911f6253e63bf8bf68757b454436e223b58 Mon Sep 17 00:00:00 2001 From: horsenit Date: Fri, 27 Mar 2020 03:03:21 -0400 Subject: [PATCH 328/381] Fix type checking for IE9 style.msTransform --- src/ol/Overlay.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/ol/Overlay.js b/src/ol/Overlay.js index f1eab6c17f..3a91f63394 100644 --- a/src/ol/Overlay.js +++ b/src/ol/Overlay.js @@ -526,7 +526,8 @@ class Overlay extends BaseObject { if (this.rendered.transform_ != transform) { this.rendered.transform_ = transform; style.transform = transform; - style.msTransform = transform; // IE9 + // @ts-ignore IE9 + style.msTransform = transform; } } From 1020c384bbb601af764402a40b294fc6ccf46dd2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maximilian=20Kr=C3=B6g?= Date: Sat, 11 Jan 2020 23:46:52 +0100 Subject: [PATCH 329/381] Fix two missing apidoc links Add IconAnchorUnits and IconOrigin to the api. --- src/ol/style/IconAnchorUnits.js | 7 +++++++ src/ol/style/IconOrigin.js | 13 +++++++++++++ 2 files changed, 20 insertions(+) diff --git a/src/ol/style/IconAnchorUnits.js b/src/ol/style/IconAnchorUnits.js index eaa549d3ce..95d9562bc2 100644 --- a/src/ol/style/IconAnchorUnits.js +++ b/src/ol/style/IconAnchorUnits.js @@ -5,8 +5,15 @@ /** * Icon anchor units. One of 'fraction', 'pixels'. * @enum {string} + * @api */ export default { + /** + * Anchor is a fraction + */ FRACTION: 'fraction', + /** + * Anchor is in pixels + */ PIXELS: 'pixels' }; diff --git a/src/ol/style/IconOrigin.js b/src/ol/style/IconOrigin.js index d1bad0bdf7..f756a5df2d 100644 --- a/src/ol/style/IconOrigin.js +++ b/src/ol/style/IconOrigin.js @@ -5,10 +5,23 @@ /** * Icon origin. One of 'bottom-left', 'bottom-right', 'top-left', 'top-right'. * @enum {string} + * @api */ export default { + /** + * Origin is at bottom left + */ BOTTOM_LEFT: 'bottom-left', + /** + * Origin is at bottom right + */ BOTTOM_RIGHT: 'bottom-right', + /** + * Origin is at top left + */ TOP_LEFT: 'top-left', + /** + * Origin is at top right + */ TOP_RIGHT: 'top-right' }; From a6a5b72c57d3a9cceaad2ab4dde45df177a861bb Mon Sep 17 00:00:00 2001 From: Andreas Hocevar Date: Fri, 27 Mar 2020 12:24:41 +0100 Subject: [PATCH 330/381] Only mark items as api, not enums --- src/ol/style/IconAnchorUnits.js | 3 ++- src/ol/style/IconOrigin.js | 5 ++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/ol/style/IconAnchorUnits.js b/src/ol/style/IconAnchorUnits.js index 95d9562bc2..af81e71ff2 100644 --- a/src/ol/style/IconAnchorUnits.js +++ b/src/ol/style/IconAnchorUnits.js @@ -5,15 +5,16 @@ /** * Icon anchor units. One of 'fraction', 'pixels'. * @enum {string} - * @api */ export default { /** * Anchor is a fraction + * @api */ FRACTION: 'fraction', /** * Anchor is in pixels + * @api */ PIXELS: 'pixels' }; diff --git a/src/ol/style/IconOrigin.js b/src/ol/style/IconOrigin.js index f756a5df2d..7ef62e96c8 100644 --- a/src/ol/style/IconOrigin.js +++ b/src/ol/style/IconOrigin.js @@ -5,23 +5,26 @@ /** * Icon origin. One of 'bottom-left', 'bottom-right', 'top-left', 'top-right'. * @enum {string} - * @api */ export default { /** * Origin is at bottom left + * @api */ BOTTOM_LEFT: 'bottom-left', /** * Origin is at bottom right + * @api */ BOTTOM_RIGHT: 'bottom-right', /** * Origin is at top left + * @api */ TOP_LEFT: 'top-left', /** * Origin is at top right + * @api */ TOP_RIGHT: 'top-right' }; From dd44ecf18516425516dbd58756a2c55a0f06c521 Mon Sep 17 00:00:00 2001 From: Andreas Hocevar Date: Sat, 28 Mar 2020 10:51:25 +0100 Subject: [PATCH 331/381] Only document enums when they have API properties --- config/jsdoc/api/plugins/api.js | 12 +++++------- config/jsdoc/api/template/tmpl/method.tmpl | 11 ++++------- 2 files changed, 9 insertions(+), 14 deletions(-) diff --git a/config/jsdoc/api/plugins/api.js b/config/jsdoc/api/plugins/api.js index c384d86dad..53e0a8c174 100644 --- a/config/jsdoc/api/plugins/api.js +++ b/config/jsdoc/api/plugins/api.js @@ -73,9 +73,6 @@ function includeAugments(doclet) { }); } cls._hideConstructor = true; - if (!cls.undocumented) { - cls._documented = true; - } } } } @@ -182,13 +179,14 @@ exports.handlers = { doclet._hideConstructor = true; includeAugments(doclet); sortOtherMembers(doclet); - } else if (!doclet._hideConstructor - && !(doclet.longname in defaultExports && byLongname[doclet.longname].some(d => d.isEnum))) { + } else if (!doclet._hideConstructor) { // Remove all other undocumented symbols doclet.undocumented = true; } - if (doclet._documented) { - delete doclet.undocumented; + if (doclet.memberof && byLongname[doclet.memberof] && + byLongname[doclet.memberof][0].isEnum && + !byLongname[doclet.memberof][0].properties.some(p => p.stability)) { + byLongname[doclet.memberof][0].undocumented = true; } } }, diff --git a/config/jsdoc/api/template/tmpl/method.tmpl b/config/jsdoc/api/template/tmpl/method.tmpl index a5ddc77f5d..9ff68aa638 100644 --- a/config/jsdoc/api/template/tmpl/method.tmpl +++ b/config/jsdoc/api/template/tmpl/method.tmpl @@ -64,7 +64,7 @@ var self = this;
  • - - - () - + + + () - From b1b01cf94386817405482f3aa7f6a9fdc986bc7d Mon Sep 17 00:00:00 2001 From: Edward Nash Date: Mon, 30 Mar 2020 07:12:52 +0200 Subject: [PATCH 332/381] Allow pan options supplied as autoPan * Follow the suggestion from @ahocevar to use the existing autoPan constructor option instead of creating a new autoPanOptions option * Internally also store the autoPanOptions in autoPan --- src/ol/Overlay.js | 36 +++++++++++++++++++----------------- 1 file changed, 19 insertions(+), 17 deletions(-) diff --git a/src/ol/Overlay.js b/src/ol/Overlay.js index 941aadda3d..dff3e1fe25 100644 --- a/src/ol/Overlay.js +++ b/src/ol/Overlay.js @@ -37,16 +37,18 @@ import {containsExtent} from './extent.js'; * container as that of the controls (see the `stopEvent` option) you will * probably set `insertFirst` to `true` so the overlay is displayed below the * controls. - * @property {boolean} [autoPan=false] If set to `true` the map is panned when - * calling `setPosition`, so that the overlay is entirely visible in the current - * viewport. + * @property {PanIntoViewOptions|boolean} [autoPan=false] Pan the map when calling + * `setPosition`, so that the overlay is entirely visible in the current viewport? + * If `true` (deprecated), then `autoPanAnimation` and `autoPanMargin` will be + * used to determine the panning parameters; if an object is supplied then other + * parameters are ignored. * @property {PanOptions} [autoPanAnimation] The animation options used to pan * the overlay into view. This animation is only used when `autoPan` is enabled. * A `duration` and `easing` may be provided to customize the animation. - * Deprecated and ignored if `autoPanOptions` is supplied. + * Deprecated and ignored if `autoPan` is supplied as an object. * @property {number} [autoPanMargin=20] The margin (in pixels) between the * overlay and the borders of the map when autopanning. Deprecated and ignored - * if `autoPanOptions` is supplied. + * if `autoPan` is supplied as an object. * @property {PanIntoViewOptions} [autoPanOptions] The options to use for the * autoPan. This is only used when `autoPan` is enabled and has preference over * the individual `autoPanMargin` and `autoPanOptions`. @@ -147,20 +149,18 @@ class Overlay extends BaseObject { options.className : 'ol-overlay-container ' + CLASS_SELECTABLE; this.element.style.position = 'absolute'; + let autoPan = options.autoPan; + if (autoPan && ('object' !== typeof autoPan)) { + autoPan = { + animation: options.autoPanAnimation, + margin: options.autoPanMargin + }; + } /** * @protected - * @type {boolean} + * @type {PanIntoViewOptions|false} */ - this.autoPan = options.autoPan !== undefined ? options.autoPan : false; - - /** - * @protected - * @type {PanIntoViewOptions} - */ - this.autoPanOptions = options.autoPanOptions || { - animation: options.autoPanAnimation, - margin: options.autoPanMargin - }; + this.autoPan = /** @type {PanIntoViewOptions} */(autoPan) || false; /** * @protected @@ -389,7 +389,9 @@ class Overlay extends BaseObject { * @protected */ performAutoPan() { - this.panIntoView(this.autoPanOptions); + if (this.autoPan) { + this.panIntoView(this.autoPan); + } } /** From 2537da690af03614788afcf80c681de7c6183b0d Mon Sep 17 00:00:00 2001 From: Edward Nash Date: Mon, 30 Mar 2020 07:15:03 +0200 Subject: [PATCH 333/381] Add check that Position is set in panIntoView() * If panIntoView is an API method, it may now be called when the position of the overlay has not yet been set. * Adds a check for a set position to the panIntoView() method, and removes the now unneccessary check in handlePositionChanged() --- src/ol/Overlay.js | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/ol/Overlay.js b/src/ol/Overlay.js index dff3e1fe25..7b82dfe5f4 100644 --- a/src/ol/Overlay.js +++ b/src/ol/Overlay.js @@ -328,9 +328,7 @@ class Overlay extends BaseObject { */ handlePositionChanged() { this.updatePixelPosition(); - if (this.get(Property.POSITION) && this.autoPan) { - this.performAutoPan(); - } + this.performAutoPan(); } /** @@ -403,7 +401,7 @@ class Overlay extends BaseObject { panIntoView(panIntoViewOptions) { const map = this.getMap(); - if (!map || !map.getTargetElement()) { + if (!map || !map.getTargetElement() || !this.get(Property.POSITION)) { return; } From 8222118fb181bf4ebc01ca6469a212e8edfd69ab Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 30 Mar 2020 08:55:08 +0000 Subject: [PATCH 334/381] Bump webpack from 4.42.0 to 4.42.1 Bumps [webpack](https://github.com/webpack/webpack) from 4.42.0 to 4.42.1. - [Release notes](https://github.com/webpack/webpack/releases) - [Commits](https://github.com/webpack/webpack/compare/v4.42.0...v4.42.1) Signed-off-by: dependabot-preview[bot] --- package-lock.json | 232 ++++++++++++++++++++++++---------------------- package.json | 2 +- 2 files changed, 121 insertions(+), 113 deletions(-) diff --git a/package-lock.json b/package-lock.json index 450a9667f9..046b8b0fd2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1808,178 +1808,177 @@ } }, "@webassemblyjs/ast": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.8.5.tgz", - "integrity": "sha512-aJMfngIZ65+t71C3y2nBBg5FFG0Okt9m0XEgWZ7Ywgn1oMAT8cNwx00Uv1cQyHtidq0Xn94R4TAywO+LCQ+ZAQ==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz", + "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==", "dev": true, "requires": { - "@webassemblyjs/helper-module-context": "1.8.5", - "@webassemblyjs/helper-wasm-bytecode": "1.8.5", - "@webassemblyjs/wast-parser": "1.8.5" + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0" } }, "@webassemblyjs/floating-point-hex-parser": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.8.5.tgz", - "integrity": "sha512-9p+79WHru1oqBh9ewP9zW95E3XAo+90oth7S5Re3eQnECGq59ly1Ri5tsIipKGpiStHsUYmY3zMLqtk3gTcOtQ==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz", + "integrity": "sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==", "dev": true }, "@webassemblyjs/helper-api-error": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.8.5.tgz", - "integrity": "sha512-Za/tnzsvnqdaSPOUXHyKJ2XI7PDX64kWtURyGiJJZKVEdFOsdKUCPTNEVFZq3zJ2R0G5wc2PZ5gvdTRFgm81zA==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz", + "integrity": "sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==", "dev": true }, "@webassemblyjs/helper-buffer": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.8.5.tgz", - "integrity": "sha512-Ri2R8nOS0U6G49Q86goFIPNgjyl6+oE1abW1pS84BuhP1Qcr5JqMwRFT3Ah3ADDDYGEgGs1iyb1DGX+kAi/c/Q==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz", + "integrity": "sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==", "dev": true }, "@webassemblyjs/helper-code-frame": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.8.5.tgz", - "integrity": "sha512-VQAadSubZIhNpH46IR3yWO4kZZjMxN1opDrzePLdVKAZ+DFjkGD/rf4v1jap744uPVU6yjL/smZbRIIJTOUnKQ==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz", + "integrity": "sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA==", "dev": true, "requires": { - "@webassemblyjs/wast-printer": "1.8.5" + "@webassemblyjs/wast-printer": "1.9.0" } }, "@webassemblyjs/helper-fsm": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.8.5.tgz", - "integrity": "sha512-kRuX/saORcg8se/ft6Q2UbRpZwP4y7YrWsLXPbbmtepKr22i8Z4O3V5QE9DbZK908dh5Xya4Un57SDIKwB9eow==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz", + "integrity": "sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw==", "dev": true }, "@webassemblyjs/helper-module-context": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.8.5.tgz", - "integrity": "sha512-/O1B236mN7UNEU4t9X7Pj38i4VoU8CcMHyy3l2cV/kIF4U5KoHXDVqcDuOs1ltkac90IM4vZdHc52t1x8Yfs3g==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz", + "integrity": "sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.8.5", - "mamacro": "^0.0.3" + "@webassemblyjs/ast": "1.9.0" } }, "@webassemblyjs/helper-wasm-bytecode": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.8.5.tgz", - "integrity": "sha512-Cu4YMYG3Ddl72CbmpjU/wbP6SACcOPVbHN1dI4VJNJVgFwaKf1ppeFJrwydOG3NDHxVGuCfPlLZNyEdIYlQ6QQ==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz", + "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==", "dev": true }, "@webassemblyjs/helper-wasm-section": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.8.5.tgz", - "integrity": "sha512-VV083zwR+VTrIWWtgIUpqfvVdK4ff38loRmrdDBgBT8ADXYsEZ5mPQ4Nde90N3UYatHdYoDIFb7oHzMncI02tA==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz", + "integrity": "sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-buffer": "1.8.5", - "@webassemblyjs/helper-wasm-bytecode": "1.8.5", - "@webassemblyjs/wasm-gen": "1.8.5" + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0" } }, "@webassemblyjs/ieee754": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.8.5.tgz", - "integrity": "sha512-aaCvQYrvKbY/n6wKHb/ylAJr27GglahUO89CcGXMItrOBqRarUMxWLJgxm9PJNuKULwN5n1csT9bYoMeZOGF3g==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz", + "integrity": "sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==", "dev": true, "requires": { "@xtuc/ieee754": "^1.2.0" } }, "@webassemblyjs/leb128": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.8.5.tgz", - "integrity": "sha512-plYUuUwleLIziknvlP8VpTgO4kqNaH57Y3JnNa6DLpu/sGcP6hbVdfdX5aHAV716pQBKrfuU26BJK29qY37J7A==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.9.0.tgz", + "integrity": "sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==", "dev": true, "requires": { "@xtuc/long": "4.2.2" } }, "@webassemblyjs/utf8": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.8.5.tgz", - "integrity": "sha512-U7zgftmQriw37tfD934UNInokz6yTmn29inT2cAetAsaU9YeVCveWEwhKL1Mg4yS7q//NGdzy79nlXh3bT8Kjw==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.9.0.tgz", + "integrity": "sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==", "dev": true }, "@webassemblyjs/wasm-edit": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.8.5.tgz", - "integrity": "sha512-A41EMy8MWw5yvqj7MQzkDjU29K7UJq1VrX2vWLzfpRHt3ISftOXqrtojn7nlPsZ9Ijhp5NwuODuycSvfAO/26Q==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz", + "integrity": "sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-buffer": "1.8.5", - "@webassemblyjs/helper-wasm-bytecode": "1.8.5", - "@webassemblyjs/helper-wasm-section": "1.8.5", - "@webassemblyjs/wasm-gen": "1.8.5", - "@webassemblyjs/wasm-opt": "1.8.5", - "@webassemblyjs/wasm-parser": "1.8.5", - "@webassemblyjs/wast-printer": "1.8.5" + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/helper-wasm-section": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-opt": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "@webassemblyjs/wast-printer": "1.9.0" } }, "@webassemblyjs/wasm-gen": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.8.5.tgz", - "integrity": "sha512-BCZBT0LURC0CXDzj5FXSc2FPTsxwp3nWcqXQdOZE4U7h7i8FqtFK5Egia6f9raQLpEKT1VL7zr4r3+QX6zArWg==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz", + "integrity": "sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-wasm-bytecode": "1.8.5", - "@webassemblyjs/ieee754": "1.8.5", - "@webassemblyjs/leb128": "1.8.5", - "@webassemblyjs/utf8": "1.8.5" + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" } }, "@webassemblyjs/wasm-opt": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.8.5.tgz", - "integrity": "sha512-HKo2mO/Uh9A6ojzu7cjslGaHaUU14LdLbGEKqTR7PBKwT6LdPtLLh9fPY33rmr5wcOMrsWDbbdCHq4hQUdd37Q==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz", + "integrity": "sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-buffer": "1.8.5", - "@webassemblyjs/wasm-gen": "1.8.5", - "@webassemblyjs/wasm-parser": "1.8.5" + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0" } }, "@webassemblyjs/wasm-parser": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.8.5.tgz", - "integrity": "sha512-pi0SYE9T6tfcMkthwcgCpL0cM9nRYr6/6fjgDtL6q/ZqKHdMWvxitRi5JcZ7RI4SNJJYnYNaWy5UUrHQy998lw==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz", + "integrity": "sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-api-error": "1.8.5", - "@webassemblyjs/helper-wasm-bytecode": "1.8.5", - "@webassemblyjs/ieee754": "1.8.5", - "@webassemblyjs/leb128": "1.8.5", - "@webassemblyjs/utf8": "1.8.5" + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-api-error": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" } }, "@webassemblyjs/wast-parser": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.8.5.tgz", - "integrity": "sha512-daXC1FyKWHF1i11obK086QRlsMsY4+tIOKgBqI1lxAnkp9xe9YMcgOxm9kLe+ttjs5aWV2KKE1TWJCN57/Btsg==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz", + "integrity": "sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/floating-point-hex-parser": "1.8.5", - "@webassemblyjs/helper-api-error": "1.8.5", - "@webassemblyjs/helper-code-frame": "1.8.5", - "@webassemblyjs/helper-fsm": "1.8.5", + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/floating-point-hex-parser": "1.9.0", + "@webassemblyjs/helper-api-error": "1.9.0", + "@webassemblyjs/helper-code-frame": "1.9.0", + "@webassemblyjs/helper-fsm": "1.9.0", "@xtuc/long": "4.2.2" } }, "@webassemblyjs/wast-printer": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.8.5.tgz", - "integrity": "sha512-w0U0pD4EhlnvRyeJzBqaVSJAo9w/ce7/WPogeXLzGkO6hzhr4GnQIZ4W4uUt5b9ooAaXPtnXlj0gzsXEOUNYMg==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz", + "integrity": "sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/wast-parser": "1.8.5", + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0", "@xtuc/long": "4.2.2" } }, @@ -7989,12 +7988,6 @@ "semver": "^5.6.0" } }, - "mamacro": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/mamacro/-/mamacro-0.0.3.tgz", - "integrity": "sha512-qMEwh+UujcQ+kbz3T6V+wAmO2U8veoq2w+3wY8MquqwVA3jChfwY+Tk52GZKDfACEPjuZ7r2oJLejwpt8jtwTA==", - "dev": true - }, "map-age-cleaner": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", @@ -12246,12 +12239,12 @@ } }, "watchpack": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.0.tgz", - "integrity": "sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA==", + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.1.tgz", + "integrity": "sha512-+IF9hfUFOrYOOaKyfaI7h7dquUIOgyEMoQMLA7OP5FxegKA2+XdXThAZ9TU2kucfhDH7rfMHs1oPYziVGWRnZA==", "dev": true, "requires": { - "chokidar": "^2.0.2", + "chokidar": "^2.1.8", "graceful-fs": "^4.1.2", "neo-async": "^2.5.0" } @@ -12272,15 +12265,15 @@ "dev": true }, "webpack": { - "version": "4.42.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.42.0.tgz", - "integrity": "sha512-EzJRHvwQyBiYrYqhyjW9AqM90dE4+s1/XtCfn7uWg6cS72zH+2VPFAlsnW0+W0cDi0XRjNKUMoJtpSi50+Ph6w==", + "version": "4.42.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.42.1.tgz", + "integrity": "sha512-SGfYMigqEfdGchGhFFJ9KyRpQKnipvEvjc1TwrXEPCM6H5Wywu10ka8o3KGrMzSMxMQKt8aCHUFh5DaQ9UmyRg==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-module-context": "1.8.5", - "@webassemblyjs/wasm-edit": "1.8.5", - "@webassemblyjs/wasm-parser": "1.8.5", + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/wasm-edit": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", "acorn": "^6.2.1", "ajv": "^6.10.2", "ajv-keywords": "^3.4.1", @@ -12292,7 +12285,7 @@ "loader-utils": "^1.2.3", "memory-fs": "^0.4.1", "micromatch": "^3.1.10", - "mkdirp": "^0.5.1", + "mkdirp": "^0.5.3", "neo-async": "^2.6.1", "node-libs-browser": "^2.2.1", "schema-utils": "^1.0.0", @@ -12326,6 +12319,21 @@ "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==", "dev": true }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + }, + "mkdirp": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.4.tgz", + "integrity": "sha512-iG9AK/dJLtJ0XNgTuDbSyNS3zECqDlAhnQW4CsNxBG3LQJBbHmRX1egw39DmtOdCAqY+dKXV+sgPgilNWUKMVw==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, "neo-async": { "version": "2.6.1", "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", diff --git a/package.json b/package.json index 2eca898191..932a509439 100644 --- a/package.json +++ b/package.json @@ -101,7 +101,7 @@ "typescript": "3.5.3", "url-polyfill": "^1.1.5", "walk": "^2.3.9", - "webpack": "4.42.0", + "webpack": "4.42.1", "webpack-cli": "^3.3.2", "webpack-dev-middleware": "^3.6.2", "webpack-dev-server": "^3.3.1", From 6ca6c70aac879a2e8e0c335df7d40dbd01043d92 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 30 Mar 2020 08:56:40 +0000 Subject: [PATCH 335/381] Bump buble from 0.19.8 to 0.20.0 Bumps [buble](https://github.com/bublejs/buble) from 0.19.8 to 0.20.0. - [Release notes](https://github.com/bublejs/buble/releases) - [Changelog](https://github.com/bublejs/buble/blob/master/CHANGELOG.md) - [Commits](https://github.com/bublejs/buble/compare/v0.19.8...v0.20.0) Signed-off-by: dependabot-preview[bot] --- package-lock.json | 65 +++++++++++++++++++++++------------------------ package.json | 2 +- 2 files changed, 33 insertions(+), 34 deletions(-) diff --git a/package-lock.json b/package-lock.json index 450a9667f9..84aaa30d67 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2024,9 +2024,9 @@ "dev": true }, "acorn-jsx": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.0.1.tgz", - "integrity": "sha512-HJ7CfNHrfJLlNTzIEUTj43LNWGkqpRLxm3YjAlcD0ACydk9XynzYsCBHxut+iqt+1aBXkx9UP/w/ZqMr13XIzg==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.2.0.tgz", + "integrity": "sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ==", "dev": true }, "after": { @@ -2951,29 +2951,34 @@ } }, "buble": { - "version": "0.19.8", - "resolved": "https://registry.npmjs.org/buble/-/buble-0.19.8.tgz", - "integrity": "sha512-IoGZzrUTY5fKXVkgGHw3QeXFMUNBFv+9l8a4QJKG1JhG3nCMHTdEX1DCOg8568E2Q9qvAQIiSokv6Jsgx8p2cA==", + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/buble/-/buble-0.20.0.tgz", + "integrity": "sha512-/1gnaMQE8xvd5qsNBl+iTuyjJ9XxeaVxAMF86dQ4EyxFJOZtsgOS8Ra+7WHgZTam5IFDtt4BguN0sH0tVTKrOw==", "dev": true, "requires": { - "acorn": "^6.1.1", + "acorn": "^6.4.1", "acorn-dynamic-import": "^4.0.0", - "acorn-jsx": "^5.0.1", + "acorn-jsx": "^5.2.0", "chalk": "^2.4.2", - "magic-string": "^0.25.3", - "minimist": "^1.2.0", - "os-homedir": "^2.0.0", - "regexpu-core": "^4.5.4" + "magic-string": "^0.25.7", + "minimist": "^1.2.5", + "regexpu-core": "4.5.4" }, "dependencies": { "magic-string": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.4.tgz", - "integrity": "sha512-oycWO9nEVAP2RVPbIoDoA4Y7LFIJ3xRYov93gAyJhZkET1tNuB0u7uWkZS2LpBWTJUWnmau/To8ECWRC+jKNfw==", + "version": "0.25.7", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz", + "integrity": "sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==", "dev": true, "requires": { "sourcemap-codec": "^1.4.4" } + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true } } }, @@ -9108,12 +9113,6 @@ "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", "dev": true }, - "os-homedir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-2.0.0.tgz", - "integrity": "sha512-saRNz0DSC5C/I++gFIaJTXoFJMRwiP5zHar5vV3xQ2TkgEw6hDCcU5F272JjUylpiVgBrZNQHnfjkLabTfb92Q==", - "dev": true - }, "os-locale": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", @@ -9872,9 +9871,9 @@ "dev": true }, "regenerate-unicode-properties": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.0.2.tgz", - "integrity": "sha512-SbA/iNrBUf6Pv2zU8Ekv1Qbhv92yxL4hiDa2siuxs4KKn4oOoMDHXjAf7+Nz9qinUQ46B1LcWEi/PhJfPWpZWQ==", + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz", + "integrity": "sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==", "dev": true, "requires": { "regenerate": "^1.4.0" @@ -9936,15 +9935,15 @@ } }, "regjsgen": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.0.tgz", - "integrity": "sha512-RnIrLhrXCX5ow/E5/Mh2O4e/oa1/jW0eaBKTSy3LaCj+M3Bqvm97GWDp2yUtzIs4LEn65zR2yiYGFqb2ApnzDA==", + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.1.tgz", + "integrity": "sha512-5qxzGZjDs9w4tzT3TPhCJqWdCc3RLYwy9J2NB0nm5Lz+S273lvWcpjaTGHsT1dc6Hhfq41uSEOw8wBmxrKOuyg==", "dev": true }, "regjsparser": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.0.tgz", - "integrity": "sha512-RQ7YyokLiQBomUJuUG8iGVvkgOLxwyZM8k6d3q5SAXpg4r5TZJZigKFvC6PpD+qQ98bCDC5YelPeA3EucDoNeQ==", + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.4.tgz", + "integrity": "sha512-64O87/dPDgfk8/RQqC4gkZoGyyWFIEUTTh80CU6CWuK5vkCGyekIx+oKcEIYtP/RAxSQltCZHCNu/mdd7fqlJw==", "dev": true, "requires": { "jsesc": "~0.5.0" @@ -11976,9 +11975,9 @@ } }, "unicode-match-property-value-ecmascript": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.1.0.tgz", - "integrity": "sha512-hDTHvaBk3RmFzvSl0UVrUmC3PuW9wKVnpoUDYH0JDkSIovzw+J5viQmeYHxVSBptubnr7PbH2e0fnpDRQnQl5g==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz", + "integrity": "sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ==", "dev": true }, "unicode-property-aliases-ecmascript": { diff --git a/package.json b/package.json index 2eca898191..5008aa39f8 100644 --- a/package.json +++ b/package.json @@ -54,7 +54,7 @@ "@types/pbf": "^3.0.2", "@types/topojson-specification": "^1.0.1", "babel-loader": "^8.0.5", - "buble": "^0.19.7", + "buble": "^0.20.0", "buble-loader": "^0.5.1", "chaikin-smooth": "^1.0.4", "clean-css-cli": "4.3.0", From e583e0775ddbb2f868780aaa4a0a57bd90e3ac2d Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 30 Mar 2020 08:57:39 +0000 Subject: [PATCH 336/381] Bump ol-mapbox-style from 6.1.0 to 6.1.1 Bumps [ol-mapbox-style](https://github.com/openlayers/ol-mapbox-style) from 6.1.0 to 6.1.1. - [Release notes](https://github.com/openlayers/ol-mapbox-style/releases) - [Changelog](https://github.com/openlayers/ol-mapbox-style/blob/master/CHANGELOG.md) - [Commits](https://github.com/openlayers/ol-mapbox-style/compare/v6.1.0...v6.1.1) Signed-off-by: dependabot-preview[bot] --- package-lock.json | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/package-lock.json b/package-lock.json index 450a9667f9..8aaa829acb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1606,12 +1606,13 @@ "dev": true }, "@mapbox/mapbox-gl-style-spec": { - "version": "13.12.0", - "resolved": "https://registry.npmjs.org/@mapbox/mapbox-gl-style-spec/-/mapbox-gl-style-spec-13.12.0.tgz", - "integrity": "sha512-tRSvlYUI73LOkvS1iQhVwnltoI/QC4ZaLOAS6NM6zx0NwJfsGUJDPucsaKif8l7Sce1ECLd8LYs1MRCyJjdo5Q==", + "version": "13.13.0", + "resolved": "https://registry.npmjs.org/@mapbox/mapbox-gl-style-spec/-/mapbox-gl-style-spec-13.13.0.tgz", + "integrity": "sha512-PBXa/Bw2G87NZckBZqY3omI3THF5MYQQY5B1IZWVLI7Ujsy149cjC8Sm1Ub1BgAnyslepdjtwWVS43IOjVYmUw==", "dev": true, "requires": { "@mapbox/jsonlint-lines-primitives": "~2.0.2", + "@mapbox/point-geometry": "^0.1.0", "@mapbox/unitbezier": "^0.0.0", "csscolorparser": "~1.0.2", "json-stringify-pretty-compact": "^2.0.0", @@ -1628,6 +1629,12 @@ } } }, + "@mapbox/point-geometry": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@mapbox/point-geometry/-/point-geometry-0.1.0.tgz", + "integrity": "sha1-ioP5M1x4YO/6Lu7KJUMyqgru2PI=", + "dev": true + }, "@mapbox/unitbezier": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/@mapbox/unitbezier/-/unitbezier-0.0.0.tgz", @@ -9003,12 +9010,12 @@ "dev": true }, "ol-mapbox-style": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ol-mapbox-style/-/ol-mapbox-style-6.1.0.tgz", - "integrity": "sha512-52nrvbYi8+Zkn4+4EZ92ZJMCLW50RKCgtPm7LNXyZJkz/PCtRZJ440Jy4hPWMON7swV2O9Xjyg+HD8Xv00VFgw==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/ol-mapbox-style/-/ol-mapbox-style-6.1.1.tgz", + "integrity": "sha512-0Hgz2BX2tWe1ZNPMLpJkLdm3XI6ILrFbgmJIvdrlDYRce2ul1mXLmkJmbyLFs2tozsBJDcPJmI55UsKbiKg6ow==", "dev": true, "requires": { - "@mapbox/mapbox-gl-style-spec": "^13.11.0", + "@mapbox/mapbox-gl-style-spec": "13.13.0", "mapbox-to-css-font": "^2.4.0", "webfont-matcher": "^1.1.0" } From c92f72ac3f16da7295701ffe83958bac3bdd0527 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 30 Mar 2020 08:59:06 +0000 Subject: [PATCH 337/381] Bump rollup from 2.1.0 to 2.3.0 Bumps [rollup](https://github.com/rollup/rollup) from 2.1.0 to 2.3.0. - [Release notes](https://github.com/rollup/rollup/releases) - [Changelog](https://github.com/rollup/rollup/blob/master/CHANGELOG.md) - [Commits](https://github.com/rollup/rollup/compare/v2.1.0...v2.3.0) Signed-off-by: dependabot-preview[bot] --- package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 450a9667f9..3ed11bd1e9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10163,9 +10163,9 @@ } }, "rollup": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.1.0.tgz", - "integrity": "sha512-gfE1455AEazVVTJoeQtcOq/U6GSxwoj4XPSWVsuWmgIxj7sBQNLDOSA82PbdMe+cP8ql8fR1jogPFe8Wg8g4SQ==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.3.0.tgz", + "integrity": "sha512-nIq2Z9YwNbEfqTlAXe/tVl8CwUsjX/8Q5Jxlx+JRoYCu5keKLc6k0zyt11sM6WtCDxhmmJEIosFy9y26ZFRx6w==", "dev": true, "requires": { "fsevents": "~2.1.2" From 772741cd0e3c059863f8c34ff81ebedff20b3887 Mon Sep 17 00:00:00 2001 From: mike-000 <49240900+mike-000@users.noreply.github.com> Date: Sat, 14 Mar 2020 10:14:28 +0000 Subject: [PATCH 338/381] Always load frameState extent for graticule layers do not call graticule loader with wrapped projection extent --- src/ol/renderer/canvas/VectorLayer.js | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/ol/renderer/canvas/VectorLayer.js b/src/ol/renderer/canvas/VectorLayer.js index 591ea95f83..d9e5e308e2 100644 --- a/src/ol/renderer/canvas/VectorLayer.js +++ b/src/ol/renderer/canvas/VectorLayer.js @@ -363,6 +363,8 @@ class CanvasVectorLayerRenderer extends CanvasLayerRenderer { vectorLayerRenderBuffer * resolution); const projectionExtent = viewState.projection.getExtent(); + let loadExtent = extent.slice(); + if (vectorSource.getWrapX() && viewState.projection.canWrapX() && !containsExtent(projectionExtent, frameState.extent)) { // For the replay group, we need an extent that intersects the real world @@ -378,6 +380,10 @@ class CanvasVectorLayerRenderer extends CanvasLayerRenderer { center[0] -= (worldsAway * worldWidth); } + if (typeof /** @type {?} */ (vectorLayer).getMeridians !== 'function') { + loadExtent = extent; + } + if (!this.dirty_ && this.renderedResolution_ == resolution && this.renderedRevision_ == vectorLayerRevision && @@ -398,10 +404,10 @@ class CanvasVectorLayerRenderer extends CanvasLayerRenderer { const userProjection = getUserProjection(); let userTransform; if (userProjection) { - vectorSource.loadFeatures(toUserExtent(extent, projection), resolution, userProjection); + vectorSource.loadFeatures(toUserExtent(loadExtent, projection), resolution, userProjection); userTransform = getTransformFromProjections(userProjection, projection); } else { - vectorSource.loadFeatures(extent, resolution, projection); + vectorSource.loadFeatures(loadExtent, resolution, projection); } const squaredTolerance = getSquaredRenderTolerance(resolution, pixelRatio); From bad0ff38ca2a690b045e94c86fab9e449c8ed5a0 Mon Sep 17 00:00:00 2001 From: mike-000 <49240900+mike-000@users.noreply.github.com> Date: Sat, 14 Mar 2020 10:37:03 +0000 Subject: [PATCH 339/381] handle wrapX without calculating excess meridians avoid calculating more meridians or longer parallels than necessary when viewport extent includes a wrapped world --- src/ol/layer/Graticule.js | 112 ++++++++++++++++++++++++++------------ 1 file changed, 76 insertions(+), 36 deletions(-) diff --git a/src/ol/layer/Graticule.js b/src/ol/layer/Graticule.js index 6bc7360dfa..0e3f073eb1 100644 --- a/src/ol/layer/Graticule.js +++ b/src/ol/layer/Graticule.js @@ -717,6 +717,22 @@ class Graticule extends VectorLayer { return; } + let wrapX = false; + const projectionExtent = this.projection_.getExtent(); + const worldWidth = getWidth(projectionExtent); + if (this.getSource().getWrapX() && this.projection_.canWrapX() && !containsExtent(projectionExtent, extent)) { + if (getWidth(extent) >= worldWidth) { + extent[0] = projectionExtent[0]; + extent[2] = projectionExtent[2]; + } else { + const worldsAway = Math.floor((center[0] - projectionExtent[0]) / worldWidth); + center[0] -= (worldsAway * worldWidth); + extent[0] -= (worldsAway * worldWidth); + extent[2] -= (worldsAway * worldWidth); + wrapX = true; + } + } + // Constrain the center to fit into the extent available to the graticule const validCenterP = [ @@ -740,44 +756,56 @@ class Graticule extends VectorLayer { // Limit the extent to fit into the extent available to the graticule - const validExtentP = [ - clamp(extent[0], this.minX_, this.maxX_), - clamp(extent[1], this.minY_, this.maxY_), - clamp(extent[2], this.minX_, this.maxX_), - clamp(extent[3], this.minY_, this.maxY_) - ]; + let validExtentP = extent; + if (!wrapX) { + validExtentP = [ + clamp(extent[0], this.minX_, this.maxX_), + clamp(extent[1], this.minY_, this.maxY_), + clamp(extent[2], this.minX_, this.maxX_), + clamp(extent[3], this.minY_, this.maxY_) + ]; + } // Transform the extent to get the lon lat ranges for the edges of the extent const validExtent = applyTransform(validExtentP, this.toLonLatTransform_, undefined, 8); - // Check if extremities of the world extent lie inside the extent - // (for example the pole in a polar projection) - // and extend the extent as appropriate + let maxLat = validExtent[3]; + let maxLon = validExtent[2]; + let minLat = validExtent[1]; + let minLon = validExtent[0]; - if (containsCoordinate(validExtentP, this.bottomLeft_)) { - validExtent[0] = this.minLon_; - validExtent[1] = this.minLat_; - } - if (containsCoordinate(validExtentP, this.bottomRight_)) { - validExtent[2] = this.maxLon_; - validExtent[1] = this.minLat_; - } - if (containsCoordinate(validExtentP, this.topLeft_)) { - validExtent[0] = this.minLon_; - validExtent[3] = this.maxLat_; - } - if (containsCoordinate(validExtentP, this.topRight_)) { - validExtent[2] = this.maxLon_; - validExtent[3] = this.maxLat_; - } + if (!wrapX) { - // The transformed center may also extend the lon lat ranges used for rendering + // Check if extremities of the world extent lie inside the extent + // (for example the pole in a polar projection) + // and extend the extent as appropriate - const maxLat = clamp(validExtent[3], centerLat, this.maxLat_); - const maxLon = clamp(validExtent[2], centerLon, this.maxLon_); - const minLat = clamp(validExtent[1], this.minLat_, centerLat); - const minLon = clamp(validExtent[0], this.minLon_, centerLon); + if (containsCoordinate(validExtentP, this.bottomLeft_)) { + minLon = this.minLon_; + minLat = this.minLat_; + } + if (containsCoordinate(validExtentP, this.bottomRight_)) { + maxLon = this.maxLon_; + minLat = this.minLat_; + } + if (containsCoordinate(validExtentP, this.topLeft_)) { + minLon = this.minLon_; + maxLat = this.maxLat_; + } + if (containsCoordinate(validExtentP, this.topRight_)) { + maxLon = this.maxLon_; + maxLat = this.maxLat_; + } + + // The transformed center may also extend the lon lat ranges used for rendering + + maxLat = clamp(maxLat, centerLat, this.maxLat_); + maxLon = clamp(maxLon, centerLon, this.maxLon_); + minLat = clamp(minLat, this.minLat_, centerLat); + minLon = clamp(minLon, this.minLon_, centerLon); + + } // Create meridians @@ -787,17 +815,29 @@ class Graticule extends VectorLayer { idx = this.addMeridian_(lon, minLat, maxLat, squaredTolerance, extent, 0); cnt = 0; - while (lon != this.minLon_ && cnt++ < maxLines) { - lon = Math.max(lon - interval, this.minLon_); - idx = this.addMeridian_(lon, minLat, maxLat, squaredTolerance, extent, idx); + if (wrapX) { + while ((lon -= interval) >= minLon && cnt++ < maxLines) { + idx = this.addMeridian_(lon, minLat, maxLat, squaredTolerance, extent, idx); + } + } else { + while (lon != this.minLon_ && cnt++ < maxLines) { + lon = Math.max(lon - interval, this.minLon_); + idx = this.addMeridian_(lon, minLat, maxLat, squaredTolerance, extent, idx); + } } lon = clamp(centerLon, this.minLon_, this.maxLon_); cnt = 0; - while (lon != this.maxLon_ && cnt++ < maxLines) { - lon = Math.min(lon + interval, this.maxLon_); - idx = this.addMeridian_(lon, minLat, maxLat, squaredTolerance, extent, idx); + if (wrapX) { + while ((lon += interval) <= maxLon && cnt++ < maxLines) { + idx = this.addMeridian_(lon, minLat, maxLat, squaredTolerance, extent, idx); + } + } else { + while (lon != this.maxLon_ && cnt++ < maxLines) { + lon = Math.min(lon + interval, this.maxLon_); + idx = this.addMeridian_(lon, minLat, maxLat, squaredTolerance, extent, idx); + } } this.meridians_.length = idx; From 516a75ae226c8bbdcb418437e825601451175f0a Mon Sep 17 00:00:00 2001 From: mike-000 <49240900+mike-000@users.noreply.github.com> Date: Sun, 15 Mar 2020 11:44:30 +0000 Subject: [PATCH 340/381] Always load frameState extent for graticule layers reorder and comment --- src/ol/renderer/canvas/VectorLayer.js | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/ol/renderer/canvas/VectorLayer.js b/src/ol/renderer/canvas/VectorLayer.js index d9e5e308e2..3429f64106 100644 --- a/src/ol/renderer/canvas/VectorLayer.js +++ b/src/ol/renderer/canvas/VectorLayer.js @@ -361,9 +361,8 @@ class CanvasVectorLayerRenderer extends CanvasLayerRenderer { const center = viewState.center.slice(); const extent = buffer(frameStateExtent, vectorLayerRenderBuffer * resolution); - const projectionExtent = viewState.projection.getExtent(); - let loadExtent = extent.slice(); + const projectionExtent = viewState.projection.getExtent(); if (vectorSource.getWrapX() && viewState.projection.canWrapX() && !containsExtent(projectionExtent, frameState.extent)) { @@ -376,14 +375,14 @@ class CanvasVectorLayerRenderer extends CanvasLayerRenderer { const gutter = Math.max(getWidth(extent) / 2, worldWidth); extent[0] = projectionExtent[0] - gutter; extent[2] = projectionExtent[2] + gutter; + // Except for Graticule use this for loading features + if (typeof /** @type {?} */ (vectorLayer).getMeridians !== 'function') { + loadExtent = extent; + } const worldsAway = Math.floor((center[0] - projectionExtent[0]) / worldWidth); center[0] -= (worldsAway * worldWidth); } - if (typeof /** @type {?} */ (vectorLayer).getMeridians !== 'function') { - loadExtent = extent; - } - if (!this.dirty_ && this.renderedResolution_ == resolution && this.renderedRevision_ == vectorLayerRevision && From f6ede1a9c0895bfa946e636d6566427a5e5b473c Mon Sep 17 00:00:00 2001 From: mike-000 <49240900+mike-000@users.noreply.github.com> Date: Wed, 18 Mar 2020 13:28:21 +0000 Subject: [PATCH 341/381] handle wrapX without calculating excess meridians override extent validation only if the extent includes parts of two worlds --- src/ol/layer/Graticule.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ol/layer/Graticule.js b/src/ol/layer/Graticule.js index 0e3f073eb1..15ba7cd2a1 100644 --- a/src/ol/layer/Graticule.js +++ b/src/ol/layer/Graticule.js @@ -729,7 +729,7 @@ class Graticule extends VectorLayer { center[0] -= (worldsAway * worldWidth); extent[0] -= (worldsAway * worldWidth); extent[2] -= (worldsAway * worldWidth); - wrapX = true; + wrapX = !containsExtent(projectionExtent, extent); } } From f6bbf414a8de864801d31c136ab8c3816c07fe7d Mon Sep 17 00:00:00 2001 From: mike-000 <49240900+mike-000@users.noreply.github.com> Date: Sat, 28 Mar 2020 20:59:23 +0000 Subject: [PATCH 342/381] Add loadWrapX option and getter --- src/ol/source/Vector.js | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/src/ol/source/Vector.js b/src/ol/source/Vector.js index 49ac34296b..edf1c4e25d 100644 --- a/src/ol/source/Vector.js +++ b/src/ol/source/Vector.js @@ -146,6 +146,10 @@ export class VectorSourceEvent extends Event { * @property {boolean} [wrapX=true] Wrap the world horizontally. For vector editing across the * -180° and 180° meridians to work properly, this should be set to `false`. The * resulting geometry coordinates will then exceed the world bounds. + * @property {boolean} [loadWrapX=true] Call the loader with one world width either side + * of the projection extent when the world is wrapped horizontally. This allows features + * to be loaded in a single request, but may be inefficient. If `false` only the viewport + * extent is used and the loader must determine the appropriate real world requests. */ @@ -190,7 +194,13 @@ class VectorSource extends Source { * @private * @type {boolean} */ - this.overlaps_ = options.overlaps == undefined ? true : options.overlaps; + this.loadWrapX_ = options.loadWrapX === undefined ? true : options.loadWrapX; + + /** + * @private + * @type {boolean} + */ + this.overlaps_ = options.overlaps === undefined ? true : options.overlaps; /** * @private @@ -801,6 +811,14 @@ class VectorSource extends Source { } + /** + * @return {boolean} The loadWrapX option used to construct the source. + */ + getLoadWrapX() { + return this.loadWrapX_; + } + + /** * @return {boolean} The source can have overlapping geometries. */ From b560dab513bd60020df510d70ff32975de031ae8 Mon Sep 17 00:00:00 2001 From: mike-000 <49240900+mike-000@users.noreply.github.com> Date: Sat, 28 Mar 2020 21:02:32 +0000 Subject: [PATCH 343/381] Set loadWrapX: false in source --- src/ol/layer/Graticule.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/ol/layer/Graticule.js b/src/ol/layer/Graticule.js index 15ba7cd2a1..aa13cd8fee 100644 --- a/src/ol/layer/Graticule.js +++ b/src/ol/layer/Graticule.js @@ -437,7 +437,8 @@ class Graticule extends VectorLayer { features: new Collection(), overlaps: false, useSpatialIndex: false, - wrapX: options.wrapX + wrapX: options.wrapX, + loadWrapX: false }) ); From 3b760dc3083965f77ebcd2473974ef5361ce4fc0 Mon Sep 17 00:00:00 2001 From: mike-000 <49240900+mike-000@users.noreply.github.com> Date: Sat, 28 Mar 2020 21:10:41 +0000 Subject: [PATCH 344/381] Use getLoadWrapX() to determine extent to load --- src/ol/renderer/canvas/VectorLayer.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/ol/renderer/canvas/VectorLayer.js b/src/ol/renderer/canvas/VectorLayer.js index 3429f64106..bdfe6c2e5b 100644 --- a/src/ol/renderer/canvas/VectorLayer.js +++ b/src/ol/renderer/canvas/VectorLayer.js @@ -375,8 +375,7 @@ class CanvasVectorLayerRenderer extends CanvasLayerRenderer { const gutter = Math.max(getWidth(extent) / 2, worldWidth); extent[0] = projectionExtent[0] - gutter; extent[2] = projectionExtent[2] + gutter; - // Except for Graticule use this for loading features - if (typeof /** @type {?} */ (vectorLayer).getMeridians !== 'function') { + if (vectorSource.getLoadWrapX()) { loadExtent = extent; } const worldsAway = Math.floor((center[0] - projectionExtent[0]) / worldWidth); From 67c37c2163af4bb573b0106962c31ddc5e74b800 Mon Sep 17 00:00:00 2001 From: mike-000 <49240900+mike-000@users.noreply.github.com> Date: Sun, 29 Mar 2020 16:54:10 +0100 Subject: [PATCH 345/381] Test extents passed to loader --- .../ol/renderer/canvas/vectorlayer.test.js | 102 +++++++++++++++++- 1 file changed, 99 insertions(+), 3 deletions(-) diff --git a/test/spec/ol/renderer/canvas/vectorlayer.test.js b/test/spec/ol/renderer/canvas/vectorlayer.test.js index a766fdb767..575d7c11a8 100644 --- a/test/spec/ol/renderer/canvas/vectorlayer.test.js +++ b/test/spec/ol/renderer/canvas/vectorlayer.test.js @@ -6,6 +6,7 @@ import Circle from '../../../../../src/ol/geom/Circle.js'; import Point from '../../../../../src/ol/geom/Point.js'; import {fromExtent} from '../../../../../src/ol/geom/Polygon.js'; import VectorLayer from '../../../../../src/ol/layer/Vector.js'; +import {bbox as bboxStrategy} from '../../../../../src/ol/loadingstrategy.js'; import {get as getProjection} from '../../../../../src/ol/proj.js'; import {checkedFonts} from '../../../../../src/ol/render/canvas.js'; import CanvasVectorLayerRenderer from '../../../../../src/ol/renderer/canvas/VectorLayer.js'; @@ -220,17 +221,25 @@ describe('ol.renderer.canvas.VectorLayer', function() { }); describe('#prepareFrame and #compose', function() { - let frameState, projExtent, renderer, worldWidth, buffer; + let frameState, projExtent, renderer, worldWidth, buffer, loadExtent; + const loader = function(extent) { + loadExtent = extent; + } beforeEach(function() { const layer = new VectorLayer({ - source: new VectorSource({wrapX: true}) + source: new VectorSource({ + wrapX: true, + loader: loader, + strategy: bboxStrategy + }) }); renderer = new CanvasVectorLayerRenderer(layer); const projection = getProjection('EPSG:3857'); projExtent = projection.getExtent(); worldWidth = getWidth(projExtent); buffer = layer.getRenderBuffer(); + loadExtent = undefined; frameState = { viewHints: [], viewState: { @@ -251,7 +260,7 @@ describe('ol.renderer.canvas.VectorLayer', function() { projExtent[0] - worldWidth + buffer, -10000, projExtent[2] + worldWidth - buffer, 10000 ], buffer)); - + expect(loadExtent).to.eql(renderer.replayGroup_.maxExtent_); }); it('sets correct extent for viewport less than 1 world wide', function() { @@ -263,6 +272,7 @@ describe('ol.renderer.canvas.VectorLayer', function() { projExtent[0] - worldWidth + buffer, -10000, projExtent[2] + worldWidth - buffer, 10000 ], buffer)); + expect(loadExtent).to.eql(renderer.replayGroup_.maxExtent_); }); it('sets correct extent for viewport more than 1 world wide', function() { @@ -274,6 +284,7 @@ describe('ol.renderer.canvas.VectorLayer', function() { projExtent[0] - worldWidth + buffer, -10000, projExtent[2] + worldWidth - buffer, 10000 ], buffer)); + expect(loadExtent).to.eql(renderer.replayGroup_.maxExtent_); }); it('sets correct extent for viewport more than 2 worlds wide', function() { @@ -287,6 +298,7 @@ describe('ol.renderer.canvas.VectorLayer', function() { projExtent[0] - 2 * worldWidth - 10000, -10000, projExtent[2] + 2 * worldWidth + 10000, 10000 ], buffer)); + expect(loadExtent).to.eql(renderer.replayGroup_.maxExtent_); }); it('sets replayGroupChanged correctly', function() { @@ -319,6 +331,90 @@ describe('ol.renderer.canvas.VectorLayer', function() { }); + describe('#prepareFrame with a loadWrapX: false source', function() { + let frameState, projExtent, renderer, worldWidth, buffer, loadExtent; + const loader = function(extent) { + loadExtent = extent; + } + + beforeEach(function() { + const layer = new VectorLayer({ + source: new VectorSource({ + wrapX: true, + loadWrapX: false, + loader: loader, + strategy: bboxStrategy + }) + }); + renderer = new CanvasVectorLayerRenderer(layer); + const projection = getProjection('EPSG:3857'); + projExtent = projection.getExtent(); + worldWidth = getWidth(projExtent); + buffer = layer.getRenderBuffer(); + loadExtent = undefined; + frameState = { + viewHints: [], + viewState: { + center: [0, 0], + projection: projection, + resolution: 1, + rotation: 0 + } + }; + }); + + it('loads correct extent for small viewport near dateline', function() { + + frameState.extent = + [projExtent[0] - 10000, -10000, projExtent[0] + 10000, 10000]; + renderer.prepareFrame(frameState); + expect(renderer.replayGroup_.maxExtent_).to.eql(bufferExtent([ + projExtent[0] - worldWidth + buffer, + -10000, projExtent[2] + worldWidth - buffer, 10000 + ], buffer)); + expect(loadExtent).to.eql(bufferExtent(frameState.extent, buffer)); + }); + + it('loads correct extent for viewport less than 1 world wide', function() { + + frameState.extent = + [projExtent[0] - 10000, -10000, projExtent[1] - 10000, 10000]; + renderer.prepareFrame(frameState); + expect(renderer.replayGroup_.maxExtent_).to.eql(bufferExtent([ + projExtent[0] - worldWidth + buffer, + -10000, projExtent[2] + worldWidth - buffer, 10000 + ], buffer)); + expect(loadExtent).to.eql(bufferExtent(frameState.extent, buffer)); + }); + + it('loads correct extent for viewport more than 1 world wide', function() { + + frameState.extent = + [2 * projExtent[0] - 10000, -10000, 2 * projExtent[1] + 10000, 10000]; + renderer.prepareFrame(frameState); + expect(renderer.replayGroup_.maxExtent_).to.eql(bufferExtent([ + projExtent[0] - worldWidth + buffer, + -10000, projExtent[2] + worldWidth - buffer, 10000 + ], buffer)); + expect(loadExtent).to.eql(bufferExtent(frameState.extent, buffer)); + }); + + it('loads correct extent for viewport more than 2 worlds wide', function() { + + frameState.extent = [ + projExtent[0] - 2 * worldWidth - 10000, + -10000, projExtent[1] + 2 * worldWidth + 10000, 10000 + ]; + renderer.prepareFrame(frameState); + expect(renderer.replayGroup_.maxExtent_).to.eql(bufferExtent([ + projExtent[0] - 2 * worldWidth - 10000, + -10000, projExtent[2] + 2 * worldWidth + 10000, 10000 + ], buffer)); + expect(loadExtent).to.eql(bufferExtent(frameState.extent, buffer)); + }); + + }); + describe('hit detection', function() { it('with no fill and transparent fill', function() { From 0c9324f398df0150d1afe5f83d8a98c9fa5a0025 Mon Sep 17 00:00:00 2001 From: mike-000 <49240900+mike-000@users.noreply.github.com> Date: Sun, 29 Mar 2020 16:58:57 +0100 Subject: [PATCH 346/381] Test extents passed to loader --- test/spec/ol/renderer/canvas/vectorlayer.test.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/spec/ol/renderer/canvas/vectorlayer.test.js b/test/spec/ol/renderer/canvas/vectorlayer.test.js index 575d7c11a8..f163a6b4cf 100644 --- a/test/spec/ol/renderer/canvas/vectorlayer.test.js +++ b/test/spec/ol/renderer/canvas/vectorlayer.test.js @@ -224,7 +224,7 @@ describe('ol.renderer.canvas.VectorLayer', function() { let frameState, projExtent, renderer, worldWidth, buffer, loadExtent; const loader = function(extent) { loadExtent = extent; - } + }; beforeEach(function() { const layer = new VectorLayer({ @@ -335,7 +335,7 @@ describe('ol.renderer.canvas.VectorLayer', function() { let frameState, projExtent, renderer, worldWidth, buffer, loadExtent; const loader = function(extent) { loadExtent = extent; - } + }; beforeEach(function() { const layer = new VectorLayer({ From 190cd202a177b18c31e29acf69e41c0e3dc1ac46 Mon Sep 17 00:00:00 2001 From: Andreas Hocevar Date: Sun, 29 Mar 2020 18:14:31 +0200 Subject: [PATCH 347/381] Always use load extent with real world center --- src/ol/layer/Graticule.js | 3 +- src/ol/renderer/canvas/VectorLayer.js | 7 ++- src/ol/source/Vector.js | 18 ------- .../ol/renderer/canvas/vectorlayer.test.js | 49 ++++++++++++------- 4 files changed, 35 insertions(+), 42 deletions(-) diff --git a/src/ol/layer/Graticule.js b/src/ol/layer/Graticule.js index aa13cd8fee..15ba7cd2a1 100644 --- a/src/ol/layer/Graticule.js +++ b/src/ol/layer/Graticule.js @@ -437,8 +437,7 @@ class Graticule extends VectorLayer { features: new Collection(), overlaps: false, useSpatialIndex: false, - wrapX: options.wrapX, - loadWrapX: false + wrapX: options.wrapX }) ); diff --git a/src/ol/renderer/canvas/VectorLayer.js b/src/ol/renderer/canvas/VectorLayer.js index bdfe6c2e5b..beef39b2f3 100644 --- a/src/ol/renderer/canvas/VectorLayer.js +++ b/src/ol/renderer/canvas/VectorLayer.js @@ -361,7 +361,7 @@ class CanvasVectorLayerRenderer extends CanvasLayerRenderer { const center = viewState.center.slice(); const extent = buffer(frameStateExtent, vectorLayerRenderBuffer * resolution); - let loadExtent = extent.slice(); + const loadExtent = extent.slice(); const projectionExtent = viewState.projection.getExtent(); if (vectorSource.getWrapX() && viewState.projection.canWrapX() && @@ -375,11 +375,10 @@ class CanvasVectorLayerRenderer extends CanvasLayerRenderer { const gutter = Math.max(getWidth(extent) / 2, worldWidth); extent[0] = projectionExtent[0] - gutter; extent[2] = projectionExtent[2] + gutter; - if (vectorSource.getLoadWrapX()) { - loadExtent = extent; - } const worldsAway = Math.floor((center[0] - projectionExtent[0]) / worldWidth); center[0] -= (worldsAway * worldWidth); + loadExtent[0] -= (worldsAway * worldWidth); + loadExtent[2] -= (worldsAway * worldWidth); } if (!this.dirty_ && diff --git a/src/ol/source/Vector.js b/src/ol/source/Vector.js index edf1c4e25d..607f0d3b67 100644 --- a/src/ol/source/Vector.js +++ b/src/ol/source/Vector.js @@ -146,10 +146,6 @@ export class VectorSourceEvent extends Event { * @property {boolean} [wrapX=true] Wrap the world horizontally. For vector editing across the * -180° and 180° meridians to work properly, this should be set to `false`. The * resulting geometry coordinates will then exceed the world bounds. - * @property {boolean} [loadWrapX=true] Call the loader with one world width either side - * of the projection extent when the world is wrapped horizontally. This allows features - * to be loaded in a single request, but may be inefficient. If `false` only the viewport - * extent is used and the loader must determine the appropriate real world requests. */ @@ -190,12 +186,6 @@ class VectorSource extends Source { */ this.format_ = options.format; - /** - * @private - * @type {boolean} - */ - this.loadWrapX_ = options.loadWrapX === undefined ? true : options.loadWrapX; - /** * @private * @type {boolean} @@ -811,14 +801,6 @@ class VectorSource extends Source { } - /** - * @return {boolean} The loadWrapX option used to construct the source. - */ - getLoadWrapX() { - return this.loadWrapX_; - } - - /** * @return {boolean} The source can have overlapping geometries. */ diff --git a/test/spec/ol/renderer/canvas/vectorlayer.test.js b/test/spec/ol/renderer/canvas/vectorlayer.test.js index f163a6b4cf..05e7c011b6 100644 --- a/test/spec/ol/renderer/canvas/vectorlayer.test.js +++ b/test/spec/ol/renderer/canvas/vectorlayer.test.js @@ -1,7 +1,7 @@ import Feature from '../../../../../src/ol/Feature.js'; import Map from '../../../../../src/ol/Map.js'; import View from '../../../../../src/ol/View.js'; -import {buffer as bufferExtent, getWidth} from '../../../../../src/ol/extent.js'; +import {buffer as bufferExtent, getWidth, getCenter} from '../../../../../src/ol/extent.js'; import Circle from '../../../../../src/ol/geom/Circle.js'; import Point from '../../../../../src/ol/geom/Point.js'; import {fromExtent} from '../../../../../src/ol/geom/Polygon.js'; @@ -243,7 +243,6 @@ describe('ol.renderer.canvas.VectorLayer', function() { frameState = { viewHints: [], viewState: { - center: [0, 0], projection: projection, resolution: 1, rotation: 0 @@ -251,58 +250,72 @@ describe('ol.renderer.canvas.VectorLayer', function() { }; }); + function setExtent(extent) { + frameState.extent = extent; + frameState.viewState.center = getCenter(extent); + } + it('sets correct extent for small viewport near dateline', function() { - frameState.extent = - [projExtent[0] - 10000, -10000, projExtent[0] + 10000, 10000]; + setExtent([projExtent[0] - 10000, -10000, projExtent[0] + 10000, 10000]); renderer.prepareFrame(frameState); expect(renderer.replayGroup_.maxExtent_).to.eql(bufferExtent([ projExtent[0] - worldWidth + buffer, -10000, projExtent[2] + worldWidth - buffer, 10000 ], buffer)); - expect(loadExtent).to.eql(renderer.replayGroup_.maxExtent_); + expect(loadExtent).to.eql(bufferExtent(frameState.extent, buffer)); }); it('sets correct extent for viewport less than 1 world wide', function() { - frameState.extent = - [projExtent[0] - 10000, -10000, projExtent[1] - 10000, 10000]; + setExtent([projExtent[0] - 10000, -10000, projExtent[2] - 10000, 10000]); renderer.prepareFrame(frameState); expect(renderer.replayGroup_.maxExtent_).to.eql(bufferExtent([ projExtent[0] - worldWidth + buffer, -10000, projExtent[2] + worldWidth - buffer, 10000 ], buffer)); - expect(loadExtent).to.eql(renderer.replayGroup_.maxExtent_); + expect(loadExtent).to.eql(bufferExtent(frameState.extent, buffer)); }); it('sets correct extent for viewport more than 1 world wide', function() { - frameState.extent = - [2 * projExtent[0] - 10000, -10000, 2 * projExtent[1] + 10000, 10000]; + setExtent([2 * projExtent[0] + 10000, -10000, 2 * projExtent[2] - 10000, 10000]); renderer.prepareFrame(frameState); expect(renderer.replayGroup_.maxExtent_).to.eql(bufferExtent([ projExtent[0] - worldWidth + buffer, -10000, projExtent[2] + worldWidth - buffer, 10000 ], buffer)); - expect(loadExtent).to.eql(renderer.replayGroup_.maxExtent_); + expect(loadExtent).to.eql(bufferExtent(frameState.extent, buffer)); }); - it('sets correct extent for viewport more than 2 worlds wide', function() { + it('sets correct extent for viewport more than 2 worlds wide, one world away', function() { - frameState.extent = [ - projExtent[0] - 2 * worldWidth - 10000, - -10000, projExtent[1] + 2 * worldWidth + 10000, 10000 - ]; + setExtent([projExtent[0] - 2 * worldWidth - 10000, + -10000, projExtent[0] + 2 * worldWidth + 10000, 10000 + ]); renderer.prepareFrame(frameState); expect(renderer.replayGroup_.maxExtent_).to.eql(bufferExtent([ projExtent[0] - 2 * worldWidth - 10000, -10000, projExtent[2] + 2 * worldWidth + 10000, 10000 ], buffer)); - expect(loadExtent).to.eql(renderer.replayGroup_.maxExtent_); + const normalizedExtent = [projExtent[0] - 2 * worldWidth + worldWidth - 10000, -10000, projExtent[0] + 2 * worldWidth + worldWidth + 10000, 10000]; + expect(loadExtent).to.eql(bufferExtent(normalizedExtent, buffer)); + }); + + it('sets correct extent for small viewport near dateline, one world away', function() { + + setExtent([-worldWidth - 10000, -10000, -worldWidth + 10000, 10000]); + renderer.prepareFrame(frameState); + expect(renderer.replayGroup_.maxExtent_).to.eql(bufferExtent([ + projExtent[0] - worldWidth + buffer, + -10000, projExtent[2] + worldWidth - buffer, 10000 + ], buffer)); + const normalizedExtent = [-10000, -10000, 10000, 10000]; + expect(loadExtent).to.eql(bufferExtent(normalizedExtent, buffer)); }); it('sets replayGroupChanged correctly', function() { - frameState.extent = [-10000, -10000, 10000, 10000]; + setExtent([-10000, -10000, 10000, 10000]); renderer.prepareFrame(frameState); expect(renderer.replayGroupChanged).to.be(true); renderer.prepareFrame(frameState); From 3d8495742bc03775c6d1e4bede168947d9a1f02b Mon Sep 17 00:00:00 2001 From: mike-000 <49240900+mike-000@users.noreply.github.com> Date: Sun, 29 Mar 2020 19:50:35 +0100 Subject: [PATCH 348/381] Simplify following renderer changes --- src/ol/layer/Graticule.js | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/ol/layer/Graticule.js b/src/ol/layer/Graticule.js index 15ba7cd2a1..e16cc7d955 100644 --- a/src/ol/layer/Graticule.js +++ b/src/ol/layer/Graticule.js @@ -725,11 +725,7 @@ class Graticule extends VectorLayer { extent[0] = projectionExtent[0]; extent[2] = projectionExtent[2]; } else { - const worldsAway = Math.floor((center[0] - projectionExtent[0]) / worldWidth); - center[0] -= (worldsAway * worldWidth); - extent[0] -= (worldsAway * worldWidth); - extent[2] -= (worldsAway * worldWidth); - wrapX = !containsExtent(projectionExtent, extent); + wrapX = true; } } From a35794ae973869ea5144c3d822e0a5b3f5642b30 Mon Sep 17 00:00:00 2001 From: Andreas Hocevar Date: Mon, 30 Mar 2020 12:58:50 +0200 Subject: [PATCH 349/381] Load two extents for views that cross the date line --- src/ol/renderer/canvas/VectorLayer.js | 17 ++- .../ol/renderer/canvas/vectorlayer.test.js | 116 ++++-------------- 2 files changed, 35 insertions(+), 98 deletions(-) diff --git a/src/ol/renderer/canvas/VectorLayer.js b/src/ol/renderer/canvas/VectorLayer.js index beef39b2f3..472333c8c9 100644 --- a/src/ol/renderer/canvas/VectorLayer.js +++ b/src/ol/renderer/canvas/VectorLayer.js @@ -361,7 +361,7 @@ class CanvasVectorLayerRenderer extends CanvasLayerRenderer { const center = viewState.center.slice(); const extent = buffer(frameStateExtent, vectorLayerRenderBuffer * resolution); - const loadExtent = extent.slice(); + const loadExtents = [extent.slice()]; const projectionExtent = viewState.projection.getExtent(); if (vectorSource.getWrapX() && viewState.projection.canWrapX() && @@ -377,8 +377,15 @@ class CanvasVectorLayerRenderer extends CanvasLayerRenderer { extent[2] = projectionExtent[2] + gutter; const worldsAway = Math.floor((center[0] - projectionExtent[0]) / worldWidth); center[0] -= (worldsAway * worldWidth); + const loadExtent = loadExtents[0]; loadExtent[0] -= (worldsAway * worldWidth); loadExtent[2] -= (worldsAway * worldWidth); + // If the extent crosses the date line, we load data for both edges of the worlds + if (loadExtent[0] < projectionExtent[0] && loadExtent[2] < projectionExtent[2]) { + loadExtents.push([loadExtent[0] + worldWidth, loadExtent[1], loadExtent[2] + worldWidth, loadExtent[3]]); + } else if (loadExtent[0] > projectionExtent[0] && loadExtent[2] > projectionExtent[2]) { + loadExtents.push([loadExtent[0] - worldWidth, loadExtent[1], loadExtent[2] - worldWidth, loadExtent[3]]); + } } if (!this.dirty_ && @@ -401,10 +408,14 @@ class CanvasVectorLayerRenderer extends CanvasLayerRenderer { const userProjection = getUserProjection(); let userTransform; if (userProjection) { - vectorSource.loadFeatures(toUserExtent(loadExtent, projection), resolution, userProjection); + for (let i = 0, ii = loadExtents.length; i < ii; ++i) { + vectorSource.loadFeatures(toUserExtent(loadExtents[i], projection), resolution, userProjection); + } userTransform = getTransformFromProjections(userProjection, projection); } else { - vectorSource.loadFeatures(loadExtent, resolution, projection); + for (let i = 0, ii = loadExtents.length; i < ii; ++i) { + vectorSource.loadFeatures(loadExtents[i], resolution, projection); + } } const squaredTolerance = getSquaredRenderTolerance(resolution, pixelRatio); diff --git a/test/spec/ol/renderer/canvas/vectorlayer.test.js b/test/spec/ol/renderer/canvas/vectorlayer.test.js index 05e7c011b6..f2fabaddd8 100644 --- a/test/spec/ol/renderer/canvas/vectorlayer.test.js +++ b/test/spec/ol/renderer/canvas/vectorlayer.test.js @@ -221,10 +221,11 @@ describe('ol.renderer.canvas.VectorLayer', function() { }); describe('#prepareFrame and #compose', function() { - let frameState, projExtent, renderer, worldWidth, buffer, loadExtent; - const loader = function(extent) { - loadExtent = extent; - }; + let frameState, projExtent, renderer, worldWidth, buffer, loadExtents; + + function loader(extent) { + loadExtents.push(extent); + } beforeEach(function() { const layer = new VectorLayer({ @@ -239,7 +240,7 @@ describe('ol.renderer.canvas.VectorLayer', function() { projExtent = projection.getExtent(); worldWidth = getWidth(projExtent); buffer = layer.getRenderBuffer(); - loadExtent = undefined; + loadExtents = []; frameState = { viewHints: [], viewState: { @@ -263,7 +264,10 @@ describe('ol.renderer.canvas.VectorLayer', function() { projExtent[0] - worldWidth + buffer, -10000, projExtent[2] + worldWidth - buffer, 10000 ], buffer)); - expect(loadExtent).to.eql(bufferExtent(frameState.extent, buffer)); + expect(loadExtents.length).to.be(2); + expect(loadExtents[0]).to.eql(bufferExtent(frameState.extent, buffer)); + const otherExtent = [projExtent[2] - 10000, -10000, projExtent[2] + 10000, 10000]; + expect(loadExtents[1]).to.eql(bufferExtent(otherExtent, buffer)); }); it('sets correct extent for viewport less than 1 world wide', function() { @@ -274,7 +278,10 @@ describe('ol.renderer.canvas.VectorLayer', function() { projExtent[0] - worldWidth + buffer, -10000, projExtent[2] + worldWidth - buffer, 10000 ], buffer)); - expect(loadExtent).to.eql(bufferExtent(frameState.extent, buffer)); + expect(loadExtents.length).to.be(2); + expect(loadExtents[0]).to.eql(bufferExtent(frameState.extent, buffer)); + const otherExtent = [projExtent[0] - 10000 + worldWidth, -10000, projExtent[2] - 10000 + worldWidth, 10000]; + expect(loadExtents[1]).to.eql(bufferExtent(otherExtent, buffer)); }); it('sets correct extent for viewport more than 1 world wide', function() { @@ -285,7 +292,8 @@ describe('ol.renderer.canvas.VectorLayer', function() { projExtent[0] - worldWidth + buffer, -10000, projExtent[2] + worldWidth - buffer, 10000 ], buffer)); - expect(loadExtent).to.eql(bufferExtent(frameState.extent, buffer)); + expect(loadExtents.length).to.be(1); + expect(loadExtents[0]).to.eql(bufferExtent(frameState.extent, buffer)); }); it('sets correct extent for viewport more than 2 worlds wide, one world away', function() { @@ -298,11 +306,12 @@ describe('ol.renderer.canvas.VectorLayer', function() { projExtent[0] - 2 * worldWidth - 10000, -10000, projExtent[2] + 2 * worldWidth + 10000, 10000 ], buffer)); + expect(loadExtents.length).to.be(1); const normalizedExtent = [projExtent[0] - 2 * worldWidth + worldWidth - 10000, -10000, projExtent[0] + 2 * worldWidth + worldWidth + 10000, 10000]; - expect(loadExtent).to.eql(bufferExtent(normalizedExtent, buffer)); + expect(loadExtents[0]).to.eql(bufferExtent(normalizedExtent, buffer)); }); - it('sets correct extent for small viewport near dateline, one world away', function() { + it('sets correct extent for small viewport, one world away', function() { setExtent([-worldWidth - 10000, -10000, -worldWidth + 10000, 10000]); renderer.prepareFrame(frameState); @@ -310,8 +319,9 @@ describe('ol.renderer.canvas.VectorLayer', function() { projExtent[0] - worldWidth + buffer, -10000, projExtent[2] + worldWidth - buffer, 10000 ], buffer)); + expect(loadExtents.length).to.be(1); const normalizedExtent = [-10000, -10000, 10000, 10000]; - expect(loadExtent).to.eql(bufferExtent(normalizedExtent, buffer)); + expect(loadExtents[0]).to.eql(bufferExtent(normalizedExtent, buffer)); }); it('sets replayGroupChanged correctly', function() { @@ -344,90 +354,6 @@ describe('ol.renderer.canvas.VectorLayer', function() { }); - describe('#prepareFrame with a loadWrapX: false source', function() { - let frameState, projExtent, renderer, worldWidth, buffer, loadExtent; - const loader = function(extent) { - loadExtent = extent; - }; - - beforeEach(function() { - const layer = new VectorLayer({ - source: new VectorSource({ - wrapX: true, - loadWrapX: false, - loader: loader, - strategy: bboxStrategy - }) - }); - renderer = new CanvasVectorLayerRenderer(layer); - const projection = getProjection('EPSG:3857'); - projExtent = projection.getExtent(); - worldWidth = getWidth(projExtent); - buffer = layer.getRenderBuffer(); - loadExtent = undefined; - frameState = { - viewHints: [], - viewState: { - center: [0, 0], - projection: projection, - resolution: 1, - rotation: 0 - } - }; - }); - - it('loads correct extent for small viewport near dateline', function() { - - frameState.extent = - [projExtent[0] - 10000, -10000, projExtent[0] + 10000, 10000]; - renderer.prepareFrame(frameState); - expect(renderer.replayGroup_.maxExtent_).to.eql(bufferExtent([ - projExtent[0] - worldWidth + buffer, - -10000, projExtent[2] + worldWidth - buffer, 10000 - ], buffer)); - expect(loadExtent).to.eql(bufferExtent(frameState.extent, buffer)); - }); - - it('loads correct extent for viewport less than 1 world wide', function() { - - frameState.extent = - [projExtent[0] - 10000, -10000, projExtent[1] - 10000, 10000]; - renderer.prepareFrame(frameState); - expect(renderer.replayGroup_.maxExtent_).to.eql(bufferExtent([ - projExtent[0] - worldWidth + buffer, - -10000, projExtent[2] + worldWidth - buffer, 10000 - ], buffer)); - expect(loadExtent).to.eql(bufferExtent(frameState.extent, buffer)); - }); - - it('loads correct extent for viewport more than 1 world wide', function() { - - frameState.extent = - [2 * projExtent[0] - 10000, -10000, 2 * projExtent[1] + 10000, 10000]; - renderer.prepareFrame(frameState); - expect(renderer.replayGroup_.maxExtent_).to.eql(bufferExtent([ - projExtent[0] - worldWidth + buffer, - -10000, projExtent[2] + worldWidth - buffer, 10000 - ], buffer)); - expect(loadExtent).to.eql(bufferExtent(frameState.extent, buffer)); - }); - - it('loads correct extent for viewport more than 2 worlds wide', function() { - - frameState.extent = [ - projExtent[0] - 2 * worldWidth - 10000, - -10000, projExtent[1] + 2 * worldWidth + 10000, 10000 - ]; - renderer.prepareFrame(frameState); - expect(renderer.replayGroup_.maxExtent_).to.eql(bufferExtent([ - projExtent[0] - 2 * worldWidth - 10000, - -10000, projExtent[2] + 2 * worldWidth + 10000, 10000 - ], buffer)); - expect(loadExtent).to.eql(bufferExtent(frameState.extent, buffer)); - }); - - }); - describe('hit detection', function() { it('with no fill and transparent fill', function() { From 48b79cf7d1c369d39959c561a61915bc3408e1de Mon Sep 17 00:00:00 2001 From: mike-000 <49240900+mike-000@users.noreply.github.com> Date: Mon, 30 Mar 2020 14:51:27 +0100 Subject: [PATCH 350/381] only use one extent if two are passed --- src/ol/layer/Graticule.js | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/src/ol/layer/Graticule.js b/src/ol/layer/Graticule.js index e16cc7d955..7a991858dc 100644 --- a/src/ol/layer/Graticule.js +++ b/src/ol/layer/Graticule.js @@ -479,11 +479,25 @@ class Graticule extends VectorLayer { * @return {Array} Extents. */ strategyFunction(extent, resolution) { - if (this.loadedExtent_ && !equals(this.loadedExtent_, extent)) { + // extents may be passed in different worlds, to avoid endless loop we use only one + const realExtent = extent.slice(); + if (this.projection_) { + const center = getCenter(extent); + const projectionExtent = this.projection_.getExtent(); + const worldWidth = getWidth(projectionExtent); + if (this.getSource().getWrapX() && this.projection_.canWrapX() && !containsExtent(projectionExtent, extent)) { + const worldsAway = Math.floor((center[0] - projectionExtent[0]) / worldWidth); + realExtent[0] -= (worldsAway * worldWidth); + realExtent[2] -= (worldsAway * worldWidth); + } + realExtent[0] = Math.round(realExtent[0] * 1e6) / 1e6; + realExtent[2] = Math.round(realExtent[2] * 1e6) / 1e6; + } + if (this.loadedExtent_ && !equals(this.loadedExtent_, realExtent)) { // we should not keep track of loaded extents this.getSource().removeLoadedExtent(this.loadedExtent_); } - return [extent]; + return [realExtent]; } /** From 098885a006244d0c42a4f6683e665a4a07e99ee6 Mon Sep 17 00:00:00 2001 From: Andreas Hocevar Date: Mon, 30 Mar 2020 19:26:26 +0200 Subject: [PATCH 351/381] New wrapX functions for coordinate and extent --- src/ol/coordinate.js | 20 +++++++++++++ src/ol/extent.js | 22 ++++++++++++++ src/ol/layer/Graticule.js | 19 ++++-------- src/ol/renderer/Map.js | 14 +++------ src/ol/renderer/canvas/VectorLayer.js | 13 ++++----- src/ol/renderer/canvas/VectorTileLayer.js | 5 ++-- test/spec/ol/coordinate.test.js | 28 +++++++++++++++++- test/spec/ol/extent.test.js | 35 ++++++++++++++++++++++- 8 files changed, 121 insertions(+), 35 deletions(-) diff --git a/src/ol/coordinate.js b/src/ol/coordinate.js index 177c8bce55..fb375162b9 100644 --- a/src/ol/coordinate.js +++ b/src/ol/coordinate.js @@ -3,6 +3,7 @@ */ import {modulo} from './math.js'; import {padNumber} from './string.js'; +import {getWidth} from './extent.js'; /** @@ -402,3 +403,22 @@ export function toStringHDMS(coordinate, opt_fractionDigits) { export function toStringXY(coordinate, opt_fractionDigits) { return format(coordinate, '{x}, {y}', opt_fractionDigits); } + + +/** + * Modifies the provided coordinate in-place to be within the real world + * extent. + * + * @param {Coordinate} coordinate Coordinate. + * @param {import("./proj/Projection.js").default} projection Projection + * @return {Coordinate} The coordinate within the real world extent. + */ +export function wrapX(coordinate, projection) { + const projectionExtent = projection.getExtent(); + if (projection.canWrapX() && (coordinate[0] < projectionExtent[0] || coordinate[0] > projectionExtent[2])) { + const worldWidth = getWidth(projectionExtent); + const worldsAway = Math.floor((coordinate[0] - projectionExtent[0]) / worldWidth); + coordinate[0] -= (worldsAway * worldWidth); + } + return coordinate; +} diff --git a/src/ol/extent.js b/src/ol/extent.js index 94eb9cb249..ef969a196a 100644 --- a/src/ol/extent.js +++ b/src/ol/extent.js @@ -813,3 +813,25 @@ export function applyTransform(extent, transformFn, opt_extent, opt_stops) { } return _boundingExtentXYs(xs, ys, opt_extent); } + + +/** + * Modifies the provided extent in-place to be within the real world + * extent. + * + * @param {Extent} extent Extent. + * @param {import("./proj/Projection.js").default} projection Projection + * @return {Extent} The extent within the real world extent. + */ +export function wrapX(extent, projection) { + const projectionExtent = projection.getExtent(); + const center = getCenter(extent); + if (projection.canWrapX() && (center[0] < projectionExtent[0] || center[0] > projectionExtent[2])) { + const worldWidth = getWidth(projectionExtent); + const worldsAway = Math.floor((center[0] - projectionExtent[0]) / worldWidth); + const offset = (worldsAway * worldWidth); + extent[0] -= offset; + extent[2] -= offset; + } + return extent; +} diff --git a/src/ol/layer/Graticule.js b/src/ol/layer/Graticule.js index 7a991858dc..4e4023fd68 100644 --- a/src/ol/layer/Graticule.js +++ b/src/ol/layer/Graticule.js @@ -24,7 +24,9 @@ import { getIntersection, getWidth, intersects, - isEmpty + isEmpty, + buffer as bufferExtent, + wrapX } from '../extent.js'; import {clamp} from '../math.js'; import Style from '../style/Style.js'; @@ -481,19 +483,10 @@ class Graticule extends VectorLayer { strategyFunction(extent, resolution) { // extents may be passed in different worlds, to avoid endless loop we use only one const realExtent = extent.slice(); - if (this.projection_) { - const center = getCenter(extent); - const projectionExtent = this.projection_.getExtent(); - const worldWidth = getWidth(projectionExtent); - if (this.getSource().getWrapX() && this.projection_.canWrapX() && !containsExtent(projectionExtent, extent)) { - const worldsAway = Math.floor((center[0] - projectionExtent[0]) / worldWidth); - realExtent[0] -= (worldsAway * worldWidth); - realExtent[2] -= (worldsAway * worldWidth); - } - realExtent[0] = Math.round(realExtent[0] * 1e6) / 1e6; - realExtent[2] = Math.round(realExtent[2] * 1e6) / 1e6; + if (this.projection_ && this.getSource().getWrapX()) { + wrapX(realExtent, this.projection_); } - if (this.loadedExtent_ && !equals(this.loadedExtent_, realExtent)) { + if (this.loadedExtent_ && !containsExtent(bufferExtent(this.loadedExtent_, resolution / 2), realExtent)) { // we should not keep track of loaded extents this.getSource().removeLoadedExtent(this.loadedExtent_); } diff --git a/src/ol/renderer/Map.js b/src/ol/renderer/Map.js index 591e96534f..86ee999a81 100644 --- a/src/ol/renderer/Map.js +++ b/src/ol/renderer/Map.js @@ -9,6 +9,7 @@ import {inView} from '../layer/Layer.js'; import {shared as iconImageCache} from '../style/IconImageCache.js'; import {compose as composeTransform, makeInverse} from '../transform.js'; import {renderDeclutterItems} from '../render.js'; +import {wrapX} from '../coordinate.js'; /** * @abstract @@ -102,19 +103,12 @@ class MapRenderer extends Disposable { const projection = viewState.projection; - let translatedCoordinate = coordinate; + const translatedCoordinate = wrapX(coordinate.slice(), projection); const offsets = [[0, 0]]; - if (projection.canWrapX()) { + if (projection.canWrapX() && checkWrapped) { const projectionExtent = projection.getExtent(); const worldWidth = getWidth(projectionExtent); - const x = coordinate[0]; - if (x < projectionExtent[0] || x > projectionExtent[2]) { - const worldsAway = Math.ceil((projectionExtent[0] - x) / worldWidth); - translatedCoordinate = [x + worldWidth * worldsAway, coordinate[1]]; - } - if (checkWrapped) { - offsets.push([-worldWidth, 0], [worldWidth, 0]); - } + offsets.push([-worldWidth, 0], [worldWidth, 0]); } const layerStates = frameState.layerStatesArray; diff --git a/src/ol/renderer/canvas/VectorLayer.js b/src/ol/renderer/canvas/VectorLayer.js index 472333c8c9..0e2bebf908 100644 --- a/src/ol/renderer/canvas/VectorLayer.js +++ b/src/ol/renderer/canvas/VectorLayer.js @@ -3,7 +3,8 @@ */ import {getUid} from '../../util.js'; import ViewHint from '../../ViewHint.js'; -import {buffer, createEmpty, containsExtent, getWidth, intersects as intersectsExtent} from '../../extent.js'; +import {buffer, createEmpty, containsExtent, getWidth, intersects as intersectsExtent, wrapX as wrapExtentX} from '../../extent.js'; +import {wrapX as wrapCoordinateX} from '../../coordinate.js'; import {fromUserExtent, toUserExtent, getUserProjection, getTransformFromProjections} from '../../proj.js'; import CanvasBuilderGroup from '../../render/canvas/BuilderGroup.js'; import ExecutorGroup, {replayDeclutter} from '../../render/canvas/ExecutorGroup.js'; @@ -364,7 +365,7 @@ class CanvasVectorLayerRenderer extends CanvasLayerRenderer { const loadExtents = [extent.slice()]; const projectionExtent = viewState.projection.getExtent(); - if (vectorSource.getWrapX() && viewState.projection.canWrapX() && + if (vectorSource.getWrapX() && projection.canWrapX() && !containsExtent(projectionExtent, frameState.extent)) { // For the replay group, we need an extent that intersects the real world // (-180° to +180°). To support geometries in a coordinate range from -540° @@ -375,11 +376,9 @@ class CanvasVectorLayerRenderer extends CanvasLayerRenderer { const gutter = Math.max(getWidth(extent) / 2, worldWidth); extent[0] = projectionExtent[0] - gutter; extent[2] = projectionExtent[2] + gutter; - const worldsAway = Math.floor((center[0] - projectionExtent[0]) / worldWidth); - center[0] -= (worldsAway * worldWidth); - const loadExtent = loadExtents[0]; - loadExtent[0] -= (worldsAway * worldWidth); - loadExtent[2] -= (worldsAway * worldWidth); + wrapCoordinateX(center, projection); + const loadExtent = wrapExtentX(loadExtents[0], projection); + wrapExtentX(loadExtent, projection); // If the extent crosses the date line, we load data for both edges of the worlds if (loadExtent[0] < projectionExtent[0] && loadExtent[2] < projectionExtent[2]) { loadExtents.push([loadExtent[0] + worldWidth, loadExtent[1], loadExtent[2] + worldWidth, loadExtent[3]]); diff --git a/src/ol/renderer/canvas/VectorTileLayer.js b/src/ol/renderer/canvas/VectorTileLayer.js index 9c0974fa91..acdd1198d6 100644 --- a/src/ol/renderer/canvas/VectorTileLayer.js +++ b/src/ol/renderer/canvas/VectorTileLayer.js @@ -25,6 +25,7 @@ import { import CanvasExecutorGroup, {replayDeclutter} from '../../render/canvas/ExecutorGroup.js'; import {clear} from '../../obj.js'; import {createHitDetectionImageData, hitDetect} from '../../render/canvas/hitdetect.js'; +import {wrapX} from '../../coordinate.js'; /** @@ -353,9 +354,7 @@ class CanvasVectorTileLayerRenderer extends CanvasTileLayerRenderer { if (tile.getState() === TileState.LOADED && tile.hifi) { const extent = tileGrid.getTileCoordExtent(tile.tileCoord); if (source.getWrapX() && projection.canWrapX() && !containsExtent(projectionExtent, extent)) { - const worldWidth = getWidth(projectionExtent); - const worldsAway = Math.floor((coordinate[0] - projectionExtent[0]) / worldWidth); - coordinate[0] -= (worldsAway * worldWidth); + wrapX(coordinate, projection); } break; } diff --git a/test/spec/ol/coordinate.test.js b/test/spec/ol/coordinate.test.js index 23d18509fc..90b6858718 100644 --- a/test/spec/ol/coordinate.test.js +++ b/test/spec/ol/coordinate.test.js @@ -1,5 +1,6 @@ -import {add as addCoordinate, scale as scaleCoordinate, rotate as rotateCoordinate, equals as coordinatesEqual, format as formatCoordinate, closestOnCircle, closestOnSegment, createStringXY, squaredDistanceToSegment, toStringXY, toStringHDMS} from '../../../src/ol/coordinate.js'; +import {add as addCoordinate, scale as scaleCoordinate, rotate as rotateCoordinate, equals as coordinatesEqual, format as formatCoordinate, closestOnCircle, closestOnSegment, createStringXY, squaredDistanceToSegment, toStringXY, toStringHDMS, wrapX} from '../../../src/ol/coordinate.js'; import Circle from '../../../src/ol/geom/Circle.js'; +import {get} from '../../../src/ol/proj.js'; describe('ol.coordinate', function() { @@ -235,4 +236,29 @@ describe('ol.coordinate', function() { }); }); + describe('wrapX()', function() { + const projection = get('EPSG:4326'); + + it('leaves real world coordinate untouched', function() { + expect(wrapX([16, 48], projection)).to.eql([16, 48]); + }); + + it('moves left world coordinate to real world', function() { + expect(wrapX([-344, 48], projection)).to.eql([16, 48]); + }); + + it('moves right world coordinate to real world', function() { + expect(wrapX([376, 48], projection)).to.eql([16, 48]); + }); + + it('moves far off left coordinate to real world', function() { + expect(wrapX([-1064, 48], projection)).to.eql([16, 48]); + }); + + it('moves far off right coordinate to real world', function() { + expect(wrapX([1096, 48], projection)).to.eql([16, 48]); + }); + + }); + }); diff --git a/test/spec/ol/extent.test.js b/test/spec/ol/extent.test.js index 3e12639d19..2bad7e640a 100644 --- a/test/spec/ol/extent.test.js +++ b/test/spec/ol/extent.test.js @@ -1,5 +1,5 @@ import * as _ol_extent_ from '../../../src/ol/extent.js'; -import {getTransform} from '../../../src/ol/proj.js'; +import {getTransform, get} from '../../../src/ol/proj.js'; import {register} from '../../../src/ol/proj/proj4.js'; @@ -818,4 +818,37 @@ describe('ol.extent', function() { }); + describe('wrapX()', function() { + const projection = get('EPSG:4326'); + + it('leaves real world extent untouched', function() { + expect(_ol_extent_.wrapX([16, 48, 18, 49], projection)).to.eql([16, 48, 18, 49]); + }); + + it('moves left world extent to real world', function() { + expect(_ol_extent_.wrapX([-344, 48, -342, 49], projection)).to.eql([16, 48, 18, 49]); + }); + + it('moves right world extent to real world', function() { + expect(_ol_extent_.wrapX([376, 48, 378, 49], projection)).to.eql([16, 48, 18, 49]); + }); + + it('moves far off left extent to real world', function() { + expect(_ol_extent_.wrapX([-1064, 48, -1062, 49], projection)).to.eql([16, 48, 18, 49]); + }); + + it('moves far off right extent to real world', function() { + expect(_ol_extent_.wrapX([1096, 48, 1098, 49], projection)).to.eql([16, 48, 18, 49]); + }); + + it('leaves -180 crossing extent with real world center untouched', function() { + expect(_ol_extent_.wrapX([-184, 48, 16, 49], projection)).to.eql([-184, 48, 16, 49]); + }); + + it('moves +180 crossing extent with off-world center to the real world', function() { + expect(_ol_extent_.wrapX([300, 48, 376, 49], projection)).to.eql([-60, 48, 16, 49]); + }); + + }); + }); From 660845f5b85a47c4546abe8c2cf54d2be95be912 Mon Sep 17 00:00:00 2001 From: mike-000 <49240900+mike-000@users.noreply.github.com> Date: Mon, 30 Mar 2020 23:17:52 +0100 Subject: [PATCH 352/381] Include center at right edge in calculations --- src/ol/extent.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ol/extent.js b/src/ol/extent.js index ef969a196a..c68f9c9ff9 100644 --- a/src/ol/extent.js +++ b/src/ol/extent.js @@ -826,7 +826,7 @@ export function applyTransform(extent, transformFn, opt_extent, opt_stops) { export function wrapX(extent, projection) { const projectionExtent = projection.getExtent(); const center = getCenter(extent); - if (projection.canWrapX() && (center[0] < projectionExtent[0] || center[0] > projectionExtent[2])) { + if (projection.canWrapX() && (center[0] < projectionExtent[0] || center[0] >= projectionExtent[2])) { const worldWidth = getWidth(projectionExtent); const worldsAway = Math.floor((center[0] - projectionExtent[0]) / worldWidth); const offset = (worldsAway * worldWidth); From e3ad05f805d06d37df95437337280898b3093d26 Mon Sep 17 00:00:00 2001 From: mike-000 <49240900+mike-000@users.noreply.github.com> Date: Mon, 30 Mar 2020 23:18:52 +0100 Subject: [PATCH 353/381] Include center at right edge in calculations --- src/ol/coordinate.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ol/coordinate.js b/src/ol/coordinate.js index fb375162b9..79d196a911 100644 --- a/src/ol/coordinate.js +++ b/src/ol/coordinate.js @@ -415,7 +415,7 @@ export function toStringXY(coordinate, opt_fractionDigits) { */ export function wrapX(coordinate, projection) { const projectionExtent = projection.getExtent(); - if (projection.canWrapX() && (coordinate[0] < projectionExtent[0] || coordinate[0] > projectionExtent[2])) { + if (projection.canWrapX() && (coordinate[0] < projectionExtent[0] || coordinate[0] >= projectionExtent[2])) { const worldWidth = getWidth(projectionExtent); const worldsAway = Math.floor((coordinate[0] - projectionExtent[0]) / worldWidth); coordinate[0] -= (worldsAway * worldWidth); From 99a1641afe7296a81d9f86f70cc88e75c4d7cc50 Mon Sep 17 00:00:00 2001 From: mike-000 <49240900+mike-000@users.noreply.github.com> Date: Mon, 30 Mar 2020 23:31:30 +0100 Subject: [PATCH 354/381] remove duplication --- src/ol/renderer/canvas/VectorLayer.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/ol/renderer/canvas/VectorLayer.js b/src/ol/renderer/canvas/VectorLayer.js index 0e2bebf908..0d7af8e81b 100644 --- a/src/ol/renderer/canvas/VectorLayer.js +++ b/src/ol/renderer/canvas/VectorLayer.js @@ -363,7 +363,7 @@ class CanvasVectorLayerRenderer extends CanvasLayerRenderer { const extent = buffer(frameStateExtent, vectorLayerRenderBuffer * resolution); const loadExtents = [extent.slice()]; - const projectionExtent = viewState.projection.getExtent(); + const projectionExtent = projection.getExtent(); if (vectorSource.getWrapX() && projection.canWrapX() && !containsExtent(projectionExtent, frameState.extent)) { @@ -378,7 +378,6 @@ class CanvasVectorLayerRenderer extends CanvasLayerRenderer { extent[2] = projectionExtent[2] + gutter; wrapCoordinateX(center, projection); const loadExtent = wrapExtentX(loadExtents[0], projection); - wrapExtentX(loadExtent, projection); // If the extent crosses the date line, we load data for both edges of the worlds if (loadExtent[0] < projectionExtent[0] && loadExtent[2] < projectionExtent[2]) { loadExtents.push([loadExtent[0] + worldWidth, loadExtent[1], loadExtent[2] + worldWidth, loadExtent[3]]); From 6013763480a60af8144915559856653ddb7493a2 Mon Sep 17 00:00:00 2001 From: mike-000 <49240900+mike-000@users.noreply.github.com> Date: Mon, 30 Mar 2020 23:43:26 +0100 Subject: [PATCH 355/381] replace containsExtent with equals in strategy --- src/ol/layer/Graticule.js | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/ol/layer/Graticule.js b/src/ol/layer/Graticule.js index 4e4023fd68..f66cf5732d 100644 --- a/src/ol/layer/Graticule.js +++ b/src/ol/layer/Graticule.js @@ -25,8 +25,7 @@ import { getWidth, intersects, isEmpty, - buffer as bufferExtent, - wrapX + wrapX as wrapExtentX } from '../extent.js'; import {clamp} from '../math.js'; import Style from '../style/Style.js'; @@ -484,9 +483,11 @@ class Graticule extends VectorLayer { // extents may be passed in different worlds, to avoid endless loop we use only one const realExtent = extent.slice(); if (this.projection_ && this.getSource().getWrapX()) { - wrapX(realExtent, this.projection_); + wrapExtentX(realExtent, this.projection_); } - if (this.loadedExtent_ && !containsExtent(bufferExtent(this.loadedExtent_, resolution / 2), realExtent)) { + realExtent[0] = Math.round(realExtent[0] * 1e8) / 1e8; + realExtent[2] = Math.round(realExtent[2] * 1e8) / 1e8; + if (this.loadedExtent_ && !equals(this.loadedExtent_, realExtent)) { // we should not keep track of loaded extents this.getSource().removeLoadedExtent(this.loadedExtent_); } From 2c7f58dbed352f3025deec869272561b73da974b Mon Sep 17 00:00:00 2001 From: mike-000 <49240900+mike-000@users.noreply.github.com> Date: Mon, 30 Mar 2020 23:51:06 +0100 Subject: [PATCH 356/381] remove unused import --- src/ol/renderer/canvas/VectorTileLayer.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ol/renderer/canvas/VectorTileLayer.js b/src/ol/renderer/canvas/VectorTileLayer.js index acdd1198d6..a3520f9caa 100644 --- a/src/ol/renderer/canvas/VectorTileLayer.js +++ b/src/ol/renderer/canvas/VectorTileLayer.js @@ -6,7 +6,7 @@ import TileState from '../../TileState.js'; import ViewHint from '../../ViewHint.js'; import {listen, unlistenByKey} from '../../events.js'; import EventType from '../../events/EventType.js'; -import {buffer, containsCoordinate, equals, getIntersection, intersects, containsExtent, getWidth, getTopLeft} from '../../extent.js'; +import {buffer, containsCoordinate, equals, getIntersection, intersects, containsExtent, getTopLeft} from '../../extent.js'; import VectorTileRenderType from '../../layer/VectorTileRenderType.js'; import ReplayType from '../../render/canvas/BuilderType.js'; import CanvasBuilderGroup from '../../render/canvas/BuilderGroup.js'; From cdafc4fa05515ceddf0e87d7969c0ff7635f21fe Mon Sep 17 00:00:00 2001 From: Andreas Hocevar Date: Tue, 31 Mar 2020 14:52:02 +0200 Subject: [PATCH 357/381] Add approximatelyEquals function for comparing extents --- src/ol/extent.js | 12 ++++++++++++ src/ol/layer/Graticule.js | 14 ++++++-------- test/spec/ol/extent.test.js | 9 +++++++++ 3 files changed, 27 insertions(+), 8 deletions(-) diff --git a/src/ol/extent.js b/src/ol/extent.js index c68f9c9ff9..4679d49820 100644 --- a/src/ol/extent.js +++ b/src/ol/extent.js @@ -295,6 +295,18 @@ export function equals(extent1, extent2) { extent1[1] == extent2[1] && extent1[3] == extent2[3]; } +/** + * Determine if two extents are approximately equivalent. + * @param {Extent} extent1 Extent 1. + * @param {Extent} extent2 Extent 2. + * @param {number} tolerance Tolerance in extent coordinate units. + * @return {boolean} The two extents differ by less than the tolerance. + */ +export function approximatelyEquals(extent1, extent2, tolerance) { + return Math.abs(extent1[0] - extent2[0]) < tolerance && Math.abs(extent1[2] - extent2[2]) < tolerance && + Math.abs(extent1[1] - extent2[1]) < tolerance && Math.abs(extent1[3] - extent2[3]) < tolerance; +} + /** * Modify an extent to include another extent. diff --git a/src/ol/layer/Graticule.js b/src/ol/layer/Graticule.js index f66cf5732d..6fc590283d 100644 --- a/src/ol/layer/Graticule.js +++ b/src/ol/layer/Graticule.js @@ -18,7 +18,7 @@ import { applyTransform, containsCoordinate, containsExtent, - equals, + approximatelyEquals, getCenter, getHeight, getIntersection, @@ -481,17 +481,15 @@ class Graticule extends VectorLayer { */ strategyFunction(extent, resolution) { // extents may be passed in different worlds, to avoid endless loop we use only one - const realExtent = extent.slice(); + const realWorldExtent = extent.slice(); if (this.projection_ && this.getSource().getWrapX()) { - wrapExtentX(realExtent, this.projection_); + wrapExtentX(realWorldExtent, this.projection_); } - realExtent[0] = Math.round(realExtent[0] * 1e8) / 1e8; - realExtent[2] = Math.round(realExtent[2] * 1e8) / 1e8; - if (this.loadedExtent_ && !equals(this.loadedExtent_, realExtent)) { + if (this.loadedExtent_ && !approximatelyEquals(this.loadedExtent_, realWorldExtent, resolution)) { // we should not keep track of loaded extents this.getSource().removeLoadedExtent(this.loadedExtent_); } - return [realExtent]; + return [realWorldExtent]; } /** @@ -508,7 +506,7 @@ class Graticule extends VectorLayer { const layerExtent = this.getExtent() || [-Infinity, -Infinity, Infinity, Infinity]; const renderExtent = getIntersection(layerExtent, extent); - if (this.renderedExtent_ && equals(this.renderedExtent_, renderExtent)) { + if (this.renderedExtent_ && approximatelyEquals(this.renderedExtent_, renderExtent, resolution)) { return; } this.renderedExtent_ = renderExtent; diff --git a/test/spec/ol/extent.test.js b/test/spec/ol/extent.test.js index 2bad7e640a..ba971781da 100644 --- a/test/spec/ol/extent.test.js +++ b/test/spec/ol/extent.test.js @@ -851,4 +851,13 @@ describe('ol.extent', function() { }); + describe('approximatelyEquals', function() { + it('returns true when within tolerance', function() { + expect(_ol_extent_.approximatelyEquals([16, 48, 17, 49], [16.09, 48, 17, 49], 0.1)).to.be(true); + }); + it('returns false when not within tolerance', function() { + expect(_ol_extent_.approximatelyEquals([16, 48, 17, 49], [16.11, 48, 17, 49], 0.1)).to.be(false); + }); + }); + }); From 9af1e223afc38a8bc0c93b0f48c42afcb1cc2406 Mon Sep 17 00:00:00 2001 From: Andreas Hocevar Date: Tue, 31 Mar 2020 15:52:29 +0200 Subject: [PATCH 358/381] More tests and docs for extent and coordinate wrapX --- src/ol/coordinate.js | 3 ++- test/spec/ol/extent.test.js | 6 ++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/ol/coordinate.js b/src/ol/coordinate.js index 79d196a911..563ff1bf64 100644 --- a/src/ol/coordinate.js +++ b/src/ol/coordinate.js @@ -407,7 +407,8 @@ export function toStringXY(coordinate, opt_fractionDigits) { /** * Modifies the provided coordinate in-place to be within the real world - * extent. + * extent. The lower projection extent boundary is inclusive, the upper one + * exclusive. * * @param {Coordinate} coordinate Coordinate. * @param {import("./proj/Projection.js").default} projection Projection diff --git a/test/spec/ol/extent.test.js b/test/spec/ol/extent.test.js index ba971781da..cc9011175a 100644 --- a/test/spec/ol/extent.test.js +++ b/test/spec/ol/extent.test.js @@ -849,6 +849,12 @@ describe('ol.extent', function() { expect(_ol_extent_.wrapX([300, 48, 376, 49], projection)).to.eql([-60, 48, 16, 49]); }); + it('produces the same real world extent for shifted extents with center at +/-180', function() { + expect(_ol_extent_.wrapX([360, -90, 720, 90], projection)).to.eql([-360, -90, 0, 90]); + expect(_ol_extent_.wrapX([0, -90, 360, 90], projection)).to.eql([-360, -90, 0, 90]); + expect(_ol_extent_.wrapX([-360, -90, 0, 90], projection)).to.eql([-360, -90, 0, 90]); + }); + }); describe('approximatelyEquals', function() { From 149ca7efad89d185344e876a0bc485e65e5c1b33 Mon Sep 17 00:00:00 2001 From: mike-000 <49240900+mike-000@users.noreply.github.com> Date: Tue, 31 Mar 2020 16:26:30 +0100 Subject: [PATCH 359/381] return previous extent if extents are approx equal --- src/ol/layer/Graticule.js | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/ol/layer/Graticule.js b/src/ol/layer/Graticule.js index 6fc590283d..3994cd11a1 100644 --- a/src/ol/layer/Graticule.js +++ b/src/ol/layer/Graticule.js @@ -481,13 +481,18 @@ class Graticule extends VectorLayer { */ strategyFunction(extent, resolution) { // extents may be passed in different worlds, to avoid endless loop we use only one - const realWorldExtent = extent.slice(); + let realWorldExtent = extent.slice(); if (this.projection_ && this.getSource().getWrapX()) { wrapExtentX(realWorldExtent, this.projection_); } - if (this.loadedExtent_ && !approximatelyEquals(this.loadedExtent_, realWorldExtent, resolution)) { - // we should not keep track of loaded extents - this.getSource().removeLoadedExtent(this.loadedExtent_); + if (this.loadedExtent_) { + if (approximatelyEquals(this.loadedExtent_, realWorldExtent, resolution)) { + // make sure result is exactly equal to previous extent + realWorldExtent = this.loadedExtent_.slice(); + } else { + // we should not keep track of loaded extents + this.getSource().removeLoadedExtent(this.loadedExtent_); + } } return [realWorldExtent]; } From 929b9f4068ee576e0902a794053c94cae19b818f Mon Sep 17 00:00:00 2001 From: mike-000 <49240900+mike-000@users.noreply.github.com> Date: Tue, 31 Mar 2020 16:55:23 +0100 Subject: [PATCH 360/381] change loader check back to equal extents --- src/ol/layer/Graticule.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/ol/layer/Graticule.js b/src/ol/layer/Graticule.js index 3994cd11a1..691637b6ae 100644 --- a/src/ol/layer/Graticule.js +++ b/src/ol/layer/Graticule.js @@ -18,6 +18,7 @@ import { applyTransform, containsCoordinate, containsExtent, + equals, approximatelyEquals, getCenter, getHeight, @@ -511,7 +512,7 @@ class Graticule extends VectorLayer { const layerExtent = this.getExtent() || [-Infinity, -Infinity, Infinity, Infinity]; const renderExtent = getIntersection(layerExtent, extent); - if (this.renderedExtent_ && approximatelyEquals(this.renderedExtent_, renderExtent, resolution)) { + if (this.renderedExtent_ && equals(this.renderedExtent_, renderExtent, resolution)) { return; } this.renderedExtent_ = renderExtent; From bfca3cf713e50ab3784f7889209daefe2865e711 Mon Sep 17 00:00:00 2001 From: mike-000 <49240900+mike-000@users.noreply.github.com> Date: Tue, 31 Mar 2020 17:00:12 +0100 Subject: [PATCH 361/381] change loader check back to equal extents --- src/ol/layer/Graticule.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ol/layer/Graticule.js b/src/ol/layer/Graticule.js index 691637b6ae..6051a608aa 100644 --- a/src/ol/layer/Graticule.js +++ b/src/ol/layer/Graticule.js @@ -512,7 +512,7 @@ class Graticule extends VectorLayer { const layerExtent = this.getExtent() || [-Infinity, -Infinity, Infinity, Infinity]; const renderExtent = getIntersection(layerExtent, extent); - if (this.renderedExtent_ && equals(this.renderedExtent_, renderExtent, resolution)) { + if (this.renderedExtent_ && equals(this.renderedExtent_, renderExtent)) { return; } this.renderedExtent_ = renderExtent; From 3c0ff154145a9e54b3d0470d50d696184eec949c Mon Sep 17 00:00:00 2001 From: mike-000 <49240900+mike-000@users.noreply.github.com> Date: Tue, 31 Mar 2020 22:32:02 +0100 Subject: [PATCH 362/381] Cap Longitudes and replace Bing with MapTiler --- examples/vector-osm.js | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/examples/vector-osm.js b/examples/vector-osm.js index 83d504b7d6..96cd3dde4a 100644 --- a/examples/vector-osm.js +++ b/examples/vector-osm.js @@ -85,8 +85,8 @@ const vectorSource = new VectorSource({ vectorSource.addFeatures(features); }); const query = '(node(' + - epsg4326Extent[1] + ',' + epsg4326Extent[0] + ',' + - epsg4326Extent[3] + ',' + epsg4326Extent[2] + + epsg4326Extent[1] + ',' + Math.max(epsg4326Extent[0], -180) + ',' + + epsg4326Extent[3] + ',' + Math.min(epsg4326Extent[2], 180) + ');rel(bn)->.foo;way(bn);node(w)->.foo;rel(bw););out meta;'; client.send(query); }, @@ -110,10 +110,15 @@ const vector = new VectorLayer({ } }); +const key = 'get_your_own_D6rA4zTHduk6KOKTXzGB'; +const attributions = '© MapTiler ' + + '© OpenStreetMap contributors'; + const raster = new TileLayer({ - source: new BingMaps({ - imagerySet: 'Aerial', - key: 'As1HiMj1PvLPlqc_gtM7AqZfBL8ZL3VrjaS3zIb22Uvb9WKhuJObROC-qUpa81U5' + source: new XYZ({ + attributions: attributions, + url: 'https://api.maptiler.com/tiles/satellite/{z}/{x}/{y}.jpg?key=' + key, + maxZoom: 20 }) }); From 7b55fe381eb3f6d60ccb6af6ae52aa99eb27ce97 Mon Sep 17 00:00:00 2001 From: mike-000 <49240900+mike-000@users.noreply.github.com> Date: Tue, 31 Mar 2020 22:36:07 +0100 Subject: [PATCH 363/381] Replace Bing layer with MapTiler --- examples/vector-osm.html | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/examples/vector-osm.html b/examples/vector-osm.html index c8e19ea2c0..0bdaf67045 100644 --- a/examples/vector-osm.html +++ b/examples/vector-osm.html @@ -4,9 +4,9 @@ title: OSM XML shortdesc: Example of using the OSM XML source. docs: > OSM XML vector data is loaded dynamically from a the [Overpass API](http://overpass-api.de) using a bbox strategy. Note that panning and zooming will eventually lead to "Too many requests" errors from the Overpass API. -tags: "vector, osmxml, loading, server, strategy, bbox" +tags: "vector, osmxml, loading, server, strategy, bbox, maptiler" cloak: - - key: As1HiMj1PvLPlqc_gtM7AqZfBL8ZL3VrjaS3zIb22Uvb9WKhuJObROC-qUpa81U5 - value: Your Bing Maps Key from http://www.bingmapsportal.com/ here + - key: get_your_own_D6rA4zTHduk6KOKTXzGB + value: Get your own API key at https://www.maptiler.com/cloud/ ---
    From 82dd764d13801052d75b4b1e68cb043d814b83f7 Mon Sep 17 00:00:00 2001 From: mike-000 <49240900+mike-000@users.noreply.github.com> Date: Tue, 31 Mar 2020 22:37:51 +0100 Subject: [PATCH 364/381] Replace Bing layer with MapTiler --- examples/vector-osm.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/vector-osm.js b/examples/vector-osm.js index 96cd3dde4a..d67d520205 100644 --- a/examples/vector-osm.js +++ b/examples/vector-osm.js @@ -4,7 +4,7 @@ import OSMXML from '../src/ol/format/OSMXML.js'; import {Tile as TileLayer, Vector as VectorLayer} from '../src/ol/layer.js'; import {bbox as bboxStrategy} from '../src/ol/loadingstrategy.js'; import {transformExtent} from '../src/ol/proj.js'; -import BingMaps from '../src/ol/source/BingMaps.js'; +import XYZ from '../src/ol/source/XYZ.js'; import VectorSource from '../src/ol/source/Vector.js'; import {Circle as CircleStyle, Fill, Stroke, Style} from '../src/ol/style.js'; From 2b863793d0ba70d570966bb6436cbd9b2e43a5a4 Mon Sep 17 00:00:00 2001 From: Edward Nash Date: Wed, 1 Apr 2020 06:50:01 +0200 Subject: [PATCH 365/381] Perform auto-pan when adding an Overlay to a Map * Auto-pan settings currently only activate when the position of the Overlay is set and the Overlay is already on a Map. * The consequence of this is that creating an Overlay with position set and then adding to a Map results in no auto-pan being performed - it is necessary to first create the Overlay, then add to a Map and finally set the position in order for the Map to auto-pan. * This commit changes this behaviour so that the auto-pan settings are also considered when the map property of the Overlay is set and not only when the position property is set, leading to a more intuitive behaviour. * Fixes Issue #10843 --- src/ol/Overlay.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/ol/Overlay.js b/src/ol/Overlay.js index b0025d08d8..c99aea8452 100644 --- a/src/ol/Overlay.js +++ b/src/ol/Overlay.js @@ -300,6 +300,7 @@ class Overlay extends BaseObject { } else { container.appendChild(this.element); } + this.performAutoPan(); } } From 061ccb987b2fbdd14e888fd088392a78b603ed34 Mon Sep 17 00:00:00 2001 From: Andreas Hocevar Date: Wed, 1 Apr 2020 08:43:30 +0200 Subject: [PATCH 366/381] Key update --- examples/bing-maps.html | 2 +- examples/bing-maps.js | 2 +- examples/mobile-full-screen.html | 2 +- examples/mobile-full-screen.js | 2 +- examples/preload.html | 2 +- examples/preload.js | 4 ++-- 6 files changed, 7 insertions(+), 7 deletions(-) diff --git a/examples/bing-maps.html b/examples/bing-maps.html index a3e7b5b48f..b03cf180f0 100644 --- a/examples/bing-maps.html +++ b/examples/bing-maps.html @@ -6,7 +6,7 @@ docs: >

    When the Bing Maps tile service doesn't have tiles for a given resolution and region it returns "placeholder" tiles indicating that. Zoom the map beyond level 19 to see the "placeholder" tiles. If you want OpenLayers to display stretched tiles in place of "placeholder" tiles beyond zoom level 19 then set maxZoom to 19 in the options passed to ol/source/BingMaps.

    tags: "bing, bing-maps" cloak: - - key: As1HiMj1PvLPlqc_gtM7AqZfBL8ZL3VrjaS3zIb22Uvb9WKhuJObROC-qUpa81U5 + - key: Avgbq4irmuveuESSXWk_LNBp5HFobQx8QgHDA4gWEQo2OqYHrYqCF0WL6-_TbrTd value: Your Bing Maps Key from http://www.bingmapsportal.com/ here ---
    diff --git a/examples/bing-maps.js b/examples/bing-maps.js index b0ecb7c2be..eabdcae542 100644 --- a/examples/bing-maps.js +++ b/examples/bing-maps.js @@ -18,7 +18,7 @@ for (i = 0, ii = styles.length; i < ii; ++i) { visible: false, preload: Infinity, source: new BingMaps({ - key: 'As1HiMj1PvLPlqc_gtM7AqZfBL8ZL3VrjaS3zIb22Uvb9WKhuJObROC-qUpa81U5', + key: 'Avgbq4irmuveuESSXWk_LNBp5HFobQx8QgHDA4gWEQo2OqYHrYqCF0WL6-_TbrTd', imagerySet: styles[i] // use maxZoom 19 to see stretched tiles instead of the BingMaps // "no photos at this zoom level" tiles diff --git a/examples/mobile-full-screen.html b/examples/mobile-full-screen.html index 8bb8b0ee22..05915d0280 100644 --- a/examples/mobile-full-screen.html +++ b/examples/mobile-full-screen.html @@ -4,7 +4,7 @@ title: Full-Screen Mobile shortdesc: Example of a full screen map. tags: "fullscreen, geolocation, mobile" cloak: - - key: As1HiMj1PvLPlqc_gtM7AqZfBL8ZL3VrjaS3zIb22Uvb9WKhuJObROC-qUpa81U5 + - key: Avgbq4irmuveuESSXWk_LNBp5HFobQx8QgHDA4gWEQo2OqYHrYqCF0WL6-_TbrTd value: Your Bing Maps Key from http://www.bingmapsportal.com/ here --- diff --git a/examples/mobile-full-screen.js b/examples/mobile-full-screen.js index d1a3071bbe..65535f6a50 100644 --- a/examples/mobile-full-screen.js +++ b/examples/mobile-full-screen.js @@ -14,7 +14,7 @@ const map = new Map({ layers: [ new TileLayer({ source: new BingMaps({ - key: 'As1HiMj1PvLPlqc_gtM7AqZfBL8ZL3VrjaS3zIb22Uvb9WKhuJObROC-qUpa81U5', + key: 'Avgbq4irmuveuESSXWk_LNBp5HFobQx8QgHDA4gWEQo2OqYHrYqCF0WL6-_TbrTd', imagerySet: 'RoadOnDemand' }) }) diff --git a/examples/preload.html b/examples/preload.html index 7398986e0b..87ca0b1304 100644 --- a/examples/preload.html +++ b/examples/preload.html @@ -6,7 +6,7 @@ docs: >

    The map on the top preloads low resolution tiles. The map on the bottom does not use any preloading. Try zooming out and panning to see the difference.

    tags: "preload, bing" cloak: - - key: As1HiMj1PvLPlqc_gtM7AqZfBL8ZL3VrjaS3zIb22Uvb9WKhuJObROC-qUpa81U5 + - key: Avgbq4irmuveuESSXWk_LNBp5HFobQx8QgHDA4gWEQo2OqYHrYqCF0WL6-_TbrTd value: Your Bing Maps Key from http://www.bingmapsportal.com/ here ---
    diff --git a/examples/preload.js b/examples/preload.js index 5d15402941..8107ed267f 100644 --- a/examples/preload.js +++ b/examples/preload.js @@ -14,7 +14,7 @@ const map1 = new Map({ new TileLayer({ preload: Infinity, source: new BingMaps({ - key: 'As1HiMj1PvLPlqc_gtM7AqZfBL8ZL3VrjaS3zIb22Uvb9WKhuJObROC-qUpa81U5', + key: 'Avgbq4irmuveuESSXWk_LNBp5HFobQx8QgHDA4gWEQo2OqYHrYqCF0WL6-_TbrTd', imagerySet: 'Aerial' }) }) @@ -28,7 +28,7 @@ const map2 = new Map({ new TileLayer({ preload: 0, // default value source: new BingMaps({ - key: 'As1HiMj1PvLPlqc_gtM7AqZfBL8ZL3VrjaS3zIb22Uvb9WKhuJObROC-qUpa81U5', + key: 'Avgbq4irmuveuESSXWk_LNBp5HFobQx8QgHDA4gWEQo2OqYHrYqCF0WL6-_TbrTd', imagerySet: 'AerialWithLabelsOnDemand' }) }) From 7dd42ef19fa61f7b935d248dcd25655a72cc161a Mon Sep 17 00:00:00 2001 From: Andreas Hocevar Date: Wed, 1 Apr 2020 09:07:07 +0200 Subject: [PATCH 367/381] Key update --- examples/bing-maps.html | 2 +- examples/bing-maps.js | 2 +- examples/mobile-full-screen.html | 2 +- examples/mobile-full-screen.js | 2 +- examples/preload.html | 2 +- examples/preload.js | 4 ++-- 6 files changed, 7 insertions(+), 7 deletions(-) diff --git a/examples/bing-maps.html b/examples/bing-maps.html index b03cf180f0..e201f69efc 100644 --- a/examples/bing-maps.html +++ b/examples/bing-maps.html @@ -6,7 +6,7 @@ docs: >

    When the Bing Maps tile service doesn't have tiles for a given resolution and region it returns "placeholder" tiles indicating that. Zoom the map beyond level 19 to see the "placeholder" tiles. If you want OpenLayers to display stretched tiles in place of "placeholder" tiles beyond zoom level 19 then set maxZoom to 19 in the options passed to ol/source/BingMaps.

    tags: "bing, bing-maps" cloak: - - key: Avgbq4irmuveuESSXWk_LNBp5HFobQx8QgHDA4gWEQo2OqYHrYqCF0WL6-_TbrTd + - key: ApTJzdkyN1DdFKkRAE6QIDtzihNaf6IWJsT-nQ_2eMoO4PN__0Tzhl2-WgJtXFSp value: Your Bing Maps Key from http://www.bingmapsportal.com/ here ---
    diff --git a/examples/bing-maps.js b/examples/bing-maps.js index eabdcae542..1823ab4740 100644 --- a/examples/bing-maps.js +++ b/examples/bing-maps.js @@ -18,7 +18,7 @@ for (i = 0, ii = styles.length; i < ii; ++i) { visible: false, preload: Infinity, source: new BingMaps({ - key: 'Avgbq4irmuveuESSXWk_LNBp5HFobQx8QgHDA4gWEQo2OqYHrYqCF0WL6-_TbrTd', + key: 'ApTJzdkyN1DdFKkRAE6QIDtzihNaf6IWJsT-nQ_2eMoO4PN__0Tzhl2-WgJtXFSp ', imagerySet: styles[i] // use maxZoom 19 to see stretched tiles instead of the BingMaps // "no photos at this zoom level" tiles diff --git a/examples/mobile-full-screen.html b/examples/mobile-full-screen.html index 05915d0280..cfc4a270c1 100644 --- a/examples/mobile-full-screen.html +++ b/examples/mobile-full-screen.html @@ -4,7 +4,7 @@ title: Full-Screen Mobile shortdesc: Example of a full screen map. tags: "fullscreen, geolocation, mobile" cloak: - - key: Avgbq4irmuveuESSXWk_LNBp5HFobQx8QgHDA4gWEQo2OqYHrYqCF0WL6-_TbrTd + - key: ApTJzdkyN1DdFKkRAE6QIDtzihNaf6IWJsT-nQ_2eMoO4PN__0Tzhl2-WgJtXFSp value: Your Bing Maps Key from http://www.bingmapsportal.com/ here --- diff --git a/examples/mobile-full-screen.js b/examples/mobile-full-screen.js index 65535f6a50..80d03d2a5f 100644 --- a/examples/mobile-full-screen.js +++ b/examples/mobile-full-screen.js @@ -14,7 +14,7 @@ const map = new Map({ layers: [ new TileLayer({ source: new BingMaps({ - key: 'Avgbq4irmuveuESSXWk_LNBp5HFobQx8QgHDA4gWEQo2OqYHrYqCF0WL6-_TbrTd', + key: 'ApTJzdkyN1DdFKkRAE6QIDtzihNaf6IWJsT-nQ_2eMoO4PN__0Tzhl2-WgJtXFSp ', imagerySet: 'RoadOnDemand' }) }) diff --git a/examples/preload.html b/examples/preload.html index 87ca0b1304..e13138d2aa 100644 --- a/examples/preload.html +++ b/examples/preload.html @@ -6,7 +6,7 @@ docs: >

    The map on the top preloads low resolution tiles. The map on the bottom does not use any preloading. Try zooming out and panning to see the difference.

    tags: "preload, bing" cloak: - - key: Avgbq4irmuveuESSXWk_LNBp5HFobQx8QgHDA4gWEQo2OqYHrYqCF0WL6-_TbrTd + - key: ApTJzdkyN1DdFKkRAE6QIDtzihNaf6IWJsT-nQ_2eMoO4PN__0Tzhl2-WgJtXFSp value: Your Bing Maps Key from http://www.bingmapsportal.com/ here ---
    diff --git a/examples/preload.js b/examples/preload.js index 8107ed267f..6bf91a82ad 100644 --- a/examples/preload.js +++ b/examples/preload.js @@ -14,7 +14,7 @@ const map1 = new Map({ new TileLayer({ preload: Infinity, source: new BingMaps({ - key: 'Avgbq4irmuveuESSXWk_LNBp5HFobQx8QgHDA4gWEQo2OqYHrYqCF0WL6-_TbrTd', + key: 'ApTJzdkyN1DdFKkRAE6QIDtzihNaf6IWJsT-nQ_2eMoO4PN__0Tzhl2-WgJtXFSp ', imagerySet: 'Aerial' }) }) @@ -28,7 +28,7 @@ const map2 = new Map({ new TileLayer({ preload: 0, // default value source: new BingMaps({ - key: 'Avgbq4irmuveuESSXWk_LNBp5HFobQx8QgHDA4gWEQo2OqYHrYqCF0WL6-_TbrTd', + key: 'ApTJzdkyN1DdFKkRAE6QIDtzihNaf6IWJsT-nQ_2eMoO4PN__0Tzhl2-WgJtXFSp ', imagerySet: 'AerialWithLabelsOnDemand' }) }) From 23c2e1062ca57cef829582eef11e1ad804152468 Mon Sep 17 00:00:00 2001 From: Simon Daron Date: Wed, 1 Apr 2020 10:08:37 +0200 Subject: [PATCH 368/381] Add an example of clipping layer based on a vector source --- examples/layer-clipping-vector.css | 3 ++ examples/layer-clipping-vector.html | 9 ++++++ examples/layer-clipping-vector.js | 46 +++++++++++++++++++++++++++++ 3 files changed, 58 insertions(+) create mode 100644 examples/layer-clipping-vector.css create mode 100644 examples/layer-clipping-vector.html create mode 100644 examples/layer-clipping-vector.js diff --git a/examples/layer-clipping-vector.css b/examples/layer-clipping-vector.css new file mode 100644 index 0000000000..3d35756e41 --- /dev/null +++ b/examples/layer-clipping-vector.css @@ -0,0 +1,3 @@ +#map { + background: transparent; +} diff --git a/examples/layer-clipping-vector.html b/examples/layer-clipping-vector.html new file mode 100644 index 0000000000..2343aa0105 --- /dev/null +++ b/examples/layer-clipping-vector.html @@ -0,0 +1,9 @@ +--- +layout: example.html +title: Vector Clipping Layer +shortdesc: Vector Clipping Layer example +docs: > + Example of a clipping layer based on a vector source +tags: "clipping, openstreetmap, vector" +--- +
    diff --git a/examples/layer-clipping-vector.js b/examples/layer-clipping-vector.js new file mode 100644 index 0000000000..13c416b477 --- /dev/null +++ b/examples/layer-clipping-vector.js @@ -0,0 +1,46 @@ +import Map from '../src/ol/Map.js'; +import View from '../src/ol/View.js'; +import {Tile as TileLayer, Vector as VectorLayer} from '../src/ol/layer.js'; +import VectorSource from '../src/ol/source/Vector.js'; +import GeoJSON from '../src/ol/format/GeoJSON.js'; +import OSM from '../src/ol/source/OSM.js'; +import {Fill, Style} from '../src/ol/style.js'; +import {getVectorContext} from '../src/ol/render.js'; +import {fromLonLat} from '../src/ol/proj.js'; + +const base = new TileLayer({ + source: new OSM() +}); + +const clipLayer = new VectorLayer({ + style: null, + source: new VectorSource({ + url: + './data/geojson/switzerland.geojson', + format: new GeoJSON() + }) +}); + +const style = new Style({ + fill: new Fill({ + color: 'black' + }) +}); + +base.on('postrender', function(e) { + e.context.globalCompositeOperation = 'destination-in'; + const vectorContext = getVectorContext(e); + clipLayer.getSource().forEachFeature(function(feature) { + vectorContext.drawFeature(feature, style); + }); + e.context.globalCompositeOperation = 'source-over'; +}); + +const map = new Map({ + layers: [base, clipLayer], + target: 'map', + view: new View({ + center: fromLonLat([8.23, 46.86]), + zoom: 7 + }) +}); From 8e6b5ce0bf994a1fb69712e5d6a3f4f0bf4d3019 Mon Sep 17 00:00:00 2001 From: Andreas Hocevar Date: Thu, 2 Apr 2020 13:50:12 +0200 Subject: [PATCH 369/381] Update dependencies --- package-lock.json | 53 +++++++++++++++++++++++++++-------------------- package.json | 6 +++--- 2 files changed, 33 insertions(+), 26 deletions(-) diff --git a/package-lock.json b/package-lock.json index 9e29ee74e7..a4173b921a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5971,8 +5971,7 @@ "dependencies": { "minimist": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "resolved": "", "dev": true, "optional": true } @@ -6326,15 +6325,15 @@ "dev": true }, "handlebars": { - "version": "4.7.3", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.3.tgz", - "integrity": "sha512-SRGwSYuNfx8DwHD/6InAPzD6RgeruWLT+B8e8a7gGs8FWgHzlExpTFMEq2IA6QpAfOClpKHy6+8IqTjeBCu6Kg==", + "version": "4.7.4", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.4.tgz", + "integrity": "sha512-Is8+SzHv8K9STNadlBVpVhxXrSXxVgTyIvhdg2Qjak1SfSZ7iEozLHdwiX1jJ9lLFkcFJxqGK5s/cI7ZX+qGkQ==", "dev": true, "requires": { "neo-async": "^2.6.0", - "optimist": "^0.6.1", "source-map": "^0.6.1", - "uglify-js": "^3.1.4" + "uglify-js": "^3.1.4", + "yargs": "^15.3.1" } }, "har-schema": { @@ -7730,6 +7729,14 @@ "dev": true, "requires": { "minimist": "1.2.0" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + } } }, "karma-sourcemap-loader": { @@ -7801,9 +7808,9 @@ "dev": true }, "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", "dev": true }, "klaw": { @@ -8217,9 +8224,9 @@ } }, "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", "dev": true }, "minipass": { @@ -9515,13 +9522,13 @@ "dev": true }, "proj4": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/proj4/-/proj4-2.6.0.tgz", - "integrity": "sha512-ll2WyehUFOyzEZtN8hAiOTmZpuDCN5V+4A/HjhPbhlwVwlsFKnIHSZ3l3uhzgDndHjoL2MyERFGe9VmXN4rYUg==", + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/proj4/-/proj4-2.6.1.tgz", + "integrity": "sha512-RP5EcrfrLcARy+Zjjz1wIeqZzZdPtQNl685asHcwdU/MQ/dvydmf1XWM4mgok6wPaNsXZ8IFrM4qadO3g46PiQ==", "dev": true, "requires": { "mgrs": "1.0.0", - "wkt-parser": "^1.2.0" + "wkt-parser": "^1.2.4" } }, "promise-inflight": { @@ -11927,9 +11934,9 @@ "dev": true }, "uglify-js": { - "version": "3.7.7", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.7.7.tgz", - "integrity": "sha512-FeSU+hi7ULYy6mn8PKio/tXsdSXN35lm4KgV2asx00kzrLU9Pi3oAslcJT70Jdj7PHX29gGUPOT6+lXGBbemhA==", + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.8.1.tgz", + "integrity": "sha512-W7KxyzeaQmZvUFbGj4+YFshhVrMBGSg2IbcYAjGWGvx8DHvJMclbTDMpffdxFUGPBHjIytk7KJUR/KUXstUGDw==", "dev": true, "optional": true, "requires": { @@ -12681,9 +12688,9 @@ } }, "wkt-parser": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/wkt-parser/-/wkt-parser-1.2.3.tgz", - "integrity": "sha512-s7zrOedGuHbbzMaQOuf8HacuCYp3LmmrHjkkN//7UEAzsYz7xJ6J+j/84ZWZkQcrRqi3xXyuc4odPHj7PEB0bw==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/wkt-parser/-/wkt-parser-1.2.4.tgz", + "integrity": "sha512-ZzKnc7ml/91fOPh5bANBL4vUlWPIYYv11waCtWTkl2TRN+LEmBg60Q1MA8gqV4hEp4MGfSj9JiHz91zw/gTDXg==", "dev": true }, "word-wrap": { diff --git a/package.json b/package.json index 7d6c715384..1bb076716b 100644 --- a/package.json +++ b/package.json @@ -67,7 +67,7 @@ "fs-extra": "^9.0.0", "glob": "^7.1.5", "globby": "^11.0.0", - "handlebars": "4.7.3", + "handlebars": "4.7.4", "istanbul": "0.4.5", "istanbul-instrumenter-loader": "^3.0.1", "jquery": "3.4.1", @@ -84,10 +84,10 @@ "loglevelnext": "^3.0.1", "marked": "0.8.2", "mocha": "7.1.1", - "ol-mapbox-style": "^6.1.0", + "ol-mapbox-style": "^6.1.1", "pixelmatch": "^5.1.0", "pngjs": "^3.4.0", - "proj4": "2.6.0", + "proj4": "2.6.1", "puppeteer": "~2.1.0", "rollup": "^2.1.0", "rollup-plugin-babel": "^4.3.3", From 72907566bbbb6f760e2fb7be02d22766ecf191cd Mon Sep 17 00:00:00 2001 From: philip Date: Thu, 2 Apr 2020 14:14:13 +0000 Subject: [PATCH 370/381] Add comment to explain calculation. --- src/ol/reproj/Triangulation.js | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/ol/reproj/Triangulation.js b/src/ol/reproj/Triangulation.js index b6091d149f..ba49bac8c4 100644 --- a/src/ol/reproj/Triangulation.js +++ b/src/ol/reproj/Triangulation.js @@ -139,6 +139,16 @@ class Triangulation { const sourceBottomRight = this.transformInv_(destinationBottomRight); const sourceBottomLeft = this.transformInv_(destinationBottomLeft); + /* + * The maxSubdivision controls how many splittings of the target area can + * be done. The idea here is to do a linear mapping of the target areas + * but the actual overal reprojection (can be) extremely non-linear. The + * default value of MAX_SUBDIVISION was chosen based on mapping a 256x256 + * tile size. However this function is also called to remap canvas rendered + * layers which can be much larger. This calculation increases the maxSubdivision + * value by the right factor so that each 256x256 pixel area has + * MAX_SUBDIVISION divisions. + */ const maxSubdivision = MAX_SUBDIVISION + (opt_destinationResolution ? Math.max(0, Math.ceil(Math.log2(getArea(targetExtent) / (opt_destinationResolution * opt_destinationResolution * 256 * 256)))) From 10c7f08fa41ae2efb4217006ef68161ce3277962 Mon Sep 17 00:00:00 2001 From: Geert Premereur Date: Tue, 7 Jan 2020 11:28:19 +0100 Subject: [PATCH 371/381] Select style multiple select interactions removed This fixes issue 10486 by removing the event listeners when an interaction is removed from a map. --- src/ol/interaction/Select.js | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/src/ol/interaction/Select.js b/src/ol/interaction/Select.js index 11a3c74bd0..3bd762db51 100644 --- a/src/ol/interaction/Select.js +++ b/src/ol/interaction/Select.js @@ -167,6 +167,16 @@ class Select extends Interaction { const options = opt_options ? opt_options : {}; + /** + * @private + */ + this.boundAddFeature_ = this.addFeature_.bind(this); + + /** + * @private + */ + this.boundRemoveFeature_ = this.removeFeature_.bind(this); + /** * @private * @type {import("../events/condition.js").Condition} @@ -250,9 +260,8 @@ class Select extends Interaction { */ this.featureLayerAssociation_ = {}; - const features = this.getFeatures(); - features.addEventListener(CollectionEventType.ADD, this.addFeature_.bind(this)); - features.addEventListener(CollectionEventType.REMOVE, this.removeFeature_.bind(this)); + this.features_.addEventListener(CollectionEventType.ADD, this.boundAddFeature_); + this.features_.addEventListener(CollectionEventType.REMOVE, this.boundRemoveFeature_); } /** @@ -323,6 +332,10 @@ class Select extends Interaction { if (map && this.style_) { this.features_.forEach(this.applySelectedStyle_.bind(this)); } + if (!map) { + this.features_.removeEventListener(CollectionEventType.ADD, this.boundAddFeature_); + this.features_.removeEventListener(CollectionEventType.REMOVE, this.boundRemoveFeature_); + } } /** From a30a92a9635e40f99e4c19270c58ab0c2cc9abab Mon Sep 17 00:00:00 2001 From: Geert Premereur Date: Wed, 8 Jan 2020 10:53:00 +0100 Subject: [PATCH 372/381] CK-240: fix multiple select interactions on map event handlers have to be (de)activated when the interaction is added or removed to the map, not when constructed added unit test --- src/ol/interaction/Select.js | 12 +++--- test/spec/ol/interaction/select.test.js | 50 +++++++++++++++++++++++++ 2 files changed, 57 insertions(+), 5 deletions(-) diff --git a/src/ol/interaction/Select.js b/src/ol/interaction/Select.js index 3bd762db51..a08c22bc54 100644 --- a/src/ol/interaction/Select.js +++ b/src/ol/interaction/Select.js @@ -259,9 +259,6 @@ class Select extends Interaction { * @type {Object} */ this.featureLayerAssociation_ = {}; - - this.features_.addEventListener(CollectionEventType.ADD, this.boundAddFeature_); - this.features_.addEventListener(CollectionEventType.REMOVE, this.boundRemoveFeature_); } /** @@ -329,8 +326,13 @@ class Select extends Interaction { this.features_.forEach(this.restorePreviousStyle_.bind(this)); } super.setMap(map); - if (map && this.style_) { - this.features_.forEach(this.applySelectedStyle_.bind(this)); + if (map) { + this.features_.addEventListener(CollectionEventType.ADD, this.boundAddFeature_); + this.features_.addEventListener(CollectionEventType.REMOVE, this.boundRemoveFeature_); + + if (this.style_) { + this.features_.forEach(this.applySelectedStyle_.bind(this)); + } } if (!map) { this.features_.removeEventListener(CollectionEventType.ADD, this.boundAddFeature_); diff --git a/test/spec/ol/interaction/select.test.js b/test/spec/ol/interaction/select.test.js index e64eb2dc28..65d47cea43 100644 --- a/test/spec/ol/interaction/select.test.js +++ b/test/spec/ol/interaction/select.test.js @@ -9,6 +9,7 @@ import Interaction from '../../../../src/ol/interaction/Interaction.js'; import Select from '../../../../src/ol/interaction/Select.js'; import VectorLayer from '../../../../src/ol/layer/Vector.js'; import VectorSource from '../../../../src/ol/source/Vector.js'; +import Style from '../../../../src/ol/style/Style.js'; describe('ol.interaction.Select', function() { @@ -406,4 +407,53 @@ describe('ol.interaction.Select', function() { }); }); + + describe('clear event listeners on interaction removal', function() { + let firstInteraction, secondInteraction, feature; + + beforeEach(function() { + feature = source.getFeatures()[3]; // top feature is selected + + const style = new Style({}); + const features = new Collection(); + + firstInteraction = new Select({ style, features }); + secondInteraction = new Select({ style, features }); + }); + + afterEach(function() { + map.removeInteraction(secondInteraction); + map.removeInteraction(firstInteraction); + }); + + // The base case + describe('with a single interaction added', function() { + it('changes the selected feature once', function() { + map.addInteraction(firstInteraction); + + const listenerSpy = sinon.spy(); + feature.on('change', listenerSpy); + + simulateEvent('singleclick', 10, -20, false); + + expect(listenerSpy.callCount).to.be(1); + }); + }); + + // The "difficult" case. To prevent regression + describe('with a replaced interaction', function() { + it('changes the selected feature once', function() { + map.addInteraction(firstInteraction); + map.removeInteraction(firstInteraction); + map.addInteraction(secondInteraction); + + const listenerSpy = sinon.spy(); + feature.on('change', listenerSpy); + + simulateEvent('singleclick', 10, -20, false); + + expect(listenerSpy.callCount).to.be(1); + }); + }); + }); }); From dc957ec10455f06ecd0b640dd0c52df7ef6a7682 Mon Sep 17 00:00:00 2001 From: Geert Premereur Date: Wed, 8 Jan 2020 11:04:33 +0100 Subject: [PATCH 373/381] CK-240: fix lint errors --- test/spec/ol/interaction/select.test.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/spec/ol/interaction/select.test.js b/test/spec/ol/interaction/select.test.js index 65d47cea43..f648ad94ca 100644 --- a/test/spec/ol/interaction/select.test.js +++ b/test/spec/ol/interaction/select.test.js @@ -417,8 +417,8 @@ describe('ol.interaction.Select', function() { const style = new Style({}); const features = new Collection(); - firstInteraction = new Select({ style, features }); - secondInteraction = new Select({ style, features }); + firstInteraction = new Select({style, features}); + secondInteraction = new Select({style, features}); }); afterEach(function() { From 2d7e55e26abb4eb90cb89676adc1dd06e747aba7 Mon Sep 17 00:00:00 2001 From: Geert Premereur Date: Wed, 8 Jan 2020 13:44:43 +0100 Subject: [PATCH 374/381] Small code cleanup drop superfluous if. --- src/ol/interaction/Select.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/ol/interaction/Select.js b/src/ol/interaction/Select.js index a08c22bc54..9fde58ccbb 100644 --- a/src/ol/interaction/Select.js +++ b/src/ol/interaction/Select.js @@ -333,8 +333,7 @@ class Select extends Interaction { if (this.style_) { this.features_.forEach(this.applySelectedStyle_.bind(this)); } - } - if (!map) { + } else { this.features_.removeEventListener(CollectionEventType.ADD, this.boundAddFeature_); this.features_.removeEventListener(CollectionEventType.REMOVE, this.boundRemoveFeature_); } From e9e75cd8aff58ad96a0b7a93d16780ae0e54e0c2 Mon Sep 17 00:00:00 2001 From: Geert Premereur Date: Wed, 8 Jan 2020 15:31:33 +0100 Subject: [PATCH 375/381] temporarily disable test to observe impact --- test/spec/ol/interaction/select.test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/spec/ol/interaction/select.test.js b/test/spec/ol/interaction/select.test.js index f648ad94ca..be2d03cc93 100644 --- a/test/spec/ol/interaction/select.test.js +++ b/test/spec/ol/interaction/select.test.js @@ -408,7 +408,7 @@ describe('ol.interaction.Select', function() { }); - describe('clear event listeners on interaction removal', function() { + xdescribe('clear event listeners on interaction removal', function() { let firstInteraction, secondInteraction, feature; beforeEach(function() { From 3909938a706acba76263f514a6cb29cd7b3f63e4 Mon Sep 17 00:00:00 2001 From: Geert Premereur Date: Wed, 8 Jan 2020 15:37:27 +0100 Subject: [PATCH 376/381] Experiment with test impact further --- test/spec/ol/interaction/select.test.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/spec/ol/interaction/select.test.js b/test/spec/ol/interaction/select.test.js index be2d03cc93..bc8aa66a97 100644 --- a/test/spec/ol/interaction/select.test.js +++ b/test/spec/ol/interaction/select.test.js @@ -408,7 +408,7 @@ describe('ol.interaction.Select', function() { }); - xdescribe('clear event listeners on interaction removal', function() { + describe('clear event listeners on interaction removal', function() { let firstInteraction, secondInteraction, feature; beforeEach(function() { @@ -441,7 +441,7 @@ describe('ol.interaction.Select', function() { }); // The "difficult" case. To prevent regression - describe('with a replaced interaction', function() { + xdescribe('with a replaced interaction', function() { it('changes the selected feature once', function() { map.addInteraction(firstInteraction); map.removeInteraction(firstInteraction); From cf1191505ead9cfd38aed30d2d93a150dac94f20 Mon Sep 17 00:00:00 2001 From: Geert Premereur Date: Wed, 8 Jan 2020 17:17:33 +0100 Subject: [PATCH 377/381] Experiment with test impact further (2) --- test/spec/ol/interaction/select.test.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/spec/ol/interaction/select.test.js b/test/spec/ol/interaction/select.test.js index bc8aa66a97..06aa5b4fb5 100644 --- a/test/spec/ol/interaction/select.test.js +++ b/test/spec/ol/interaction/select.test.js @@ -427,7 +427,7 @@ describe('ol.interaction.Select', function() { }); // The base case - describe('with a single interaction added', function() { + xdescribe('with a single interaction added', function() { it('changes the selected feature once', function() { map.addInteraction(firstInteraction); @@ -441,7 +441,7 @@ describe('ol.interaction.Select', function() { }); // The "difficult" case. To prevent regression - xdescribe('with a replaced interaction', function() { + describe('with a replaced interaction', function() { it('changes the selected feature once', function() { map.addInteraction(firstInteraction); map.removeInteraction(firstInteraction); From ad77143417041c6ec93d8a8a287b0bfb96d7dcb0 Mon Sep 17 00:00:00 2001 From: Geert Premereur Date: Wed, 8 Jan 2020 22:31:31 +0100 Subject: [PATCH 378/381] Experiment with test impact further (3) --- test/spec/ol/interaction/select.test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/spec/ol/interaction/select.test.js b/test/spec/ol/interaction/select.test.js index 06aa5b4fb5..f648ad94ca 100644 --- a/test/spec/ol/interaction/select.test.js +++ b/test/spec/ol/interaction/select.test.js @@ -427,7 +427,7 @@ describe('ol.interaction.Select', function() { }); // The base case - xdescribe('with a single interaction added', function() { + describe('with a single interaction added', function() { it('changes the selected feature once', function() { map.addInteraction(firstInteraction); From 5357b4fcedb188591d73c1dfe4d7402e1cb8c2d9 Mon Sep 17 00:00:00 2001 From: Andreas Hocevar Date: Thu, 2 Apr 2020 22:03:53 +0200 Subject: [PATCH 379/381] Changelog for v6.3.0 --- changelog/upgrade-notes.md | 6 +- changelog/v6.3.0.md | 123 +++++++++++++++++++++++++++++++++++++ 2 files changed, 127 insertions(+), 2 deletions(-) create mode 100644 changelog/v6.3.0.md diff --git a/changelog/upgrade-notes.md b/changelog/upgrade-notes.md index 81c6eb6060..6ade599999 100644 --- a/changelog/upgrade-notes.md +++ b/changelog/upgrade-notes.md @@ -1,8 +1,10 @@ ## Upgrade notes -### v6.2.0 +### v6.3.0 -### v6.1.0 +#### Vector source loading when extent crosses +/-180 + +Previously, when an extent crossed the date line, vector source loaders were called with an extent with 540 degrees of longitude. Now, two loader calls with the visible extent on both sides of the projection extent are issued. This should not require any application code changes, but may affect custom loaders. ### v6.0.0 diff --git a/changelog/v6.3.0.md b/changelog/v6.3.0.md new file mode 100644 index 0000000000..1107121b15 --- /dev/null +++ b/changelog/v6.3.0.md @@ -0,0 +1,123 @@ +# 6.3.0 + +With more than 70 pull requests, this release not only brings significant improvements to the API documentation. It also fixes some old bugs and brings frequently requested improvments. And good news for TypeScript users: OpenLayers now ships with type definitions in `.d.ts` files. + +## New features and improvements + +* Several improvements to the Graticule layer, like consistent labeling, no more missing graticule lines, and it now works for views that cross the date line. +* Better support for KML icon colors, as well as fills and outlines in PolyStyle +* Better `ol/Overlay` performance and support for panning off-screen overlays into view +* Most of the rendering code can now be run in web workers, e.g. to render to an OffscreenCanvas +* OpenLayers now works fine in web components with shadow root +* WebGL point layers now support rotation based on feature attributes + +## List of all changes + + * [#10490](https://github.com/openlayers/openlayers/pull/10490) - Select style multiple select interactions removed ([@bepremeg](https://github.com/bepremeg)) + * [#10531](https://github.com/openlayers/openlayers/pull/10531) - Dynamically chose the number of subdivisions based on the size of the Image to reproject ([@pjsg](https://github.com/pjsg)) + * [#10618](https://github.com/openlayers/openlayers/pull/10618) - Add apidoc-debug task to debug the apidoc generation process ([@MoonE](https://github.com/MoonE)) + * [#10343](https://github.com/openlayers/openlayers/pull/10343) - Correct interactions with circle geometries when using user coordinates ([@mike-000](https://github.com/mike-000)) + * [#10864](https://github.com/openlayers/openlayers/pull/10864) - Update dependencies ([@ahocevar](https://github.com/ahocevar)) + * [#10859](https://github.com/openlayers/openlayers/pull/10859) - Add an example of clipping layer based on a vector source ([@SDaron](https://github.com/SDaron)) + * [#10850](https://github.com/openlayers/openlayers/pull/10850) - API docs for enums ([@ahocevar](https://github.com/ahocevar)) + * [#10857](https://github.com/openlayers/openlayers/pull/10857) - Make OSM XML example work at dateline and replace Bing with MapTiler ([@mike-000](https://github.com/mike-000)) + * [#10858](https://github.com/openlayers/openlayers/pull/10858) - Perform auto-pan when adding an Overlay to a Map ([@ejn](https://github.com/ejn)) + * [#10646](https://github.com/openlayers/openlayers/pull/10646) - Write fill and outline in KML PolyStyle ([@mike-000](https://github.com/mike-000)) + * [#10800](https://github.com/openlayers/openlayers/pull/10800) - Make Overlay.panIntoView an API method ([@ejn](https://github.com/ejn)) + * [#10807](https://github.com/openlayers/openlayers/pull/10807) - Handle Graticule wrapX without calculating excess meridians ([@mike-000](https://github.com/mike-000)) + * [#10795](https://github.com/openlayers/openlayers/pull/10795) - Show graticule labels in wrapped worlds ([@mike-000](https://github.com/mike-000)) + * [#10824](https://github.com/openlayers/openlayers/pull/10824) - Fix drawing svg icon with color option in ie11 ([@MoonE](https://github.com/MoonE)) + * [#10802](https://github.com/openlayers/openlayers/pull/10802) - Apidoc add default-exported enums ([@MoonE](https://github.com/MoonE)) + * [#10805](https://github.com/openlayers/openlayers/pull/10805) - make ImageSourceEventType available for consumers ([@regileeso](https://github.com/regileeso)) + * [#10822](https://github.com/openlayers/openlayers/pull/10822) - parsing color from IconStyle in KML files ([@lysek](https://github.com/lysek)) + * [#10848](https://github.com/openlayers/openlayers/pull/10848) - Speed up Overlay element positioning using CSS translate() ([@horsenit](https://github.com/horsenit)) + * [#9590](https://github.com/openlayers/openlayers/pull/9590) - Calculate tile grid extent from extent of bottom-level tile matrix ([@mloskot](https://github.com/mloskot)) + * [#10845](https://github.com/openlayers/openlayers/pull/10845) - Fix createHitDetectionImageData error for features with no size ([@gedaiu](https://github.com/gedaiu)) + * [#10842](https://github.com/openlayers/openlayers/pull/10842) - Fix custom symbol example short description ([@mike-000](https://github.com/mike-000)) + * [#10828](https://github.com/openlayers/openlayers/pull/10828) - Offscreen canvas example ([@ahocevar](https://github.com/ahocevar)) + * [#10816](https://github.com/openlayers/openlayers/pull/10816) - Add 'funding' field to `package.json` ([@marcjansen](https://github.com/marcjansen)) + * [#10813](https://github.com/openlayers/openlayers/pull/10813) - Add sponsors section to the readme ([@tschaub](https://github.com/tschaub)) + * [#10474](https://github.com/openlayers/openlayers/pull/10474) - Fix for undefined source in Image layer ([@mike-000](https://github.com/mike-000)) + * [#10785](https://github.com/openlayers/openlayers/pull/10785) - Detect Zoomify server-side retina tiles ([@ahocevar](https://github.com/ahocevar)) + * [#10787](https://github.com/openlayers/openlayers/pull/10787) - Improved projection extent in the "Reprojection with EPSG.io Search" example ([@mike-000](https://github.com/mike-000)) + * [#10792](https://github.com/openlayers/openlayers/pull/10792) - Add support for EventListener Object ([@flexjoly](https://github.com/flexjoly)) + * [#10777](https://github.com/openlayers/openlayers/pull/10777) - Keep the render loop running during simulation ([@ahocevar](https://github.com/ahocevar)) + * [#10791](https://github.com/openlayers/openlayers/pull/10791) - iOS 12 touchmove: Prevent touchmove event default when no preceding pointer event ([@sosmo](https://github.com/sosmo)) + * [#10786](https://github.com/openlayers/openlayers/pull/10786) - Resolve constraints when updating size ([@ahocevar](https://github.com/ahocevar)) + * [#10788](https://github.com/openlayers/openlayers/pull/10788) - Add safeguard to handleTouchMove ([@sosmo](https://github.com/sosmo)) + * [#10722](https://github.com/openlayers/openlayers/pull/10722) - fix: handle layer clear event in case clear(true) called ([@jellyedwards](https://github.com/jellyedwards)) + * [#10723](https://github.com/openlayers/openlayers/pull/10723) - Improve the extent transforms used by Graticule and handle extents crossing the dateline ([@mike-000](https://github.com/mike-000)) + * [#10744](https://github.com/openlayers/openlayers/pull/10744) - Ensure the Modify Features Test example opens at correct zoom ([@mike-000](https://github.com/mike-000)) + * [#10767](https://github.com/openlayers/openlayers/pull/10767) - Replace Bing layer with MapTiler in examples ([@mike-000](https://github.com/mike-000)) + * [#10751](https://github.com/openlayers/openlayers/pull/10751) - Sort events / observables in all cases ([@MoonE](https://github.com/MoonE)) + * [#10763](https://github.com/openlayers/openlayers/pull/10763) - TypeScript: Fix inconsistent optionality in various APIs ([@jumpinjackie](https://github.com/jumpinjackie)) + * [#10758](https://github.com/openlayers/openlayers/pull/10758) - Allow using feature attributes for symbol rotation in WebGL layers ([@jahow](https://github.com/jahow)) + * [#10748](https://github.com/openlayers/openlayers/pull/10748) - Fix "Cannot read property 'anchor' of undefined" in ol/View ([@mike-000](https://github.com/mike-000)) + * [#10746](https://github.com/openlayers/openlayers/pull/10746) - Fix building apidoc on windows ([@MoonE](https://github.com/MoonE)) + * [#10720](https://github.com/openlayers/openlayers/pull/10720) - Apidoc better search ([@MoonE](https://github.com/MoonE)) + * [#10743](https://github.com/openlayers/openlayers/pull/10743) - Ignore user provided tile cache size when too small ([@ahocevar](https://github.com/ahocevar)) + * [#10736](https://github.com/openlayers/openlayers/pull/10736) - Allow cluster source to unlisten from its source ([@M393](https://github.com/M393)) + * [#10739](https://github.com/openlayers/openlayers/pull/10739) - Fix typo in trackpad timeout ([@ahocevar](https://github.com/ahocevar)) + * [#10740](https://github.com/openlayers/openlayers/pull/10740) - Document tabindex behavior for MouseWheelZoom and DragPan ([@matthias-ccri](https://github.com/matthias-ccri)) + * [#10738](https://github.com/openlayers/openlayers/pull/10738) - Fix text background decluttering ([@ahocevar](https://github.com/ahocevar)) + * [#10715](https://github.com/openlayers/openlayers/pull/10715) - Fix disappearing graticule labels when rotation returns to 0 ([@mike-000](https://github.com/mike-000)) + * [#10713](https://github.com/openlayers/openlayers/pull/10713) - Draw graticule labels in a postrender function ([@mike-000](https://github.com/mike-000)) + * [#10711](https://github.com/openlayers/openlayers/pull/10711) - Make sure that optional args are typed accordingly ([@ahocevar](https://github.com/ahocevar)) + * [#10710](https://github.com/openlayers/openlayers/pull/10710) - Fix stylefunction return type ([@ahocevar](https://github.com/ahocevar)) + * [#10709](https://github.com/openlayers/openlayers/pull/10709) - Fix type and documentation of style function ([@ahocevar](https://github.com/ahocevar)) + * [#10708](https://github.com/openlayers/openlayers/pull/10708) - Handle Select interactions with falsey select style ([@ahocevar](https://github.com/ahocevar)) + * [#10707](https://github.com/openlayers/openlayers/pull/10707) - Get default projection for overview map from main map. ([@AugustusKling](https://github.com/AugustusKling)) + * [#10699](https://github.com/openlayers/openlayers/pull/10699) - Make Select interaction work when there are multiple instances ([@ahocevar](https://github.com/ahocevar)) + * [#10694](https://github.com/openlayers/openlayers/pull/10694) - Draw image with configured opacity ([@M393](https://github.com/M393)) + * [#10703](https://github.com/openlayers/openlayers/pull/10703) - CI and test fixes ([@ahocevar](https://github.com/ahocevar)) + * [#10698](https://github.com/openlayers/openlayers/pull/10698) - Shadow root ([@ahocevar](https://github.com/ahocevar)) + * [#10688](https://github.com/openlayers/openlayers/pull/10688) - Publish type definition files ([@ahocevar](https://github.com/ahocevar)) + * [#10691](https://github.com/openlayers/openlayers/pull/10691) - Do not exceed color range ([@ahocevar](https://github.com/ahocevar)) + * [#10683](https://github.com/openlayers/openlayers/pull/10683) - Dispatch enterfullscreen and leavefullscreen from the FullScreen control ([@fredj](https://github.com/fredj)) + * [#10676](https://github.com/openlayers/openlayers/pull/10676) - Document that overviewmap view must use same projection as main map ([@mike-000](https://github.com/mike-000)) + * [#10678](https://github.com/openlayers/openlayers/pull/10678) - Add maxResolution option to ol/tilegrid.createXYZ() and ol/source/XYZ ([@mike-000](https://github.com/mike-000)) + * [#10690](https://github.com/openlayers/openlayers/pull/10690) - Document minZoom and maxZoom options for all layers ([@mike-000](https://github.com/mike-000)) + * [#10672](https://github.com/openlayers/openlayers/pull/10672) - Nicer mousewheel and trackpad zooming ([@ahocevar](https://github.com/ahocevar)) + * [#10687](https://github.com/openlayers/openlayers/pull/10687) - Increase timeout in listenImage test ([@fredj](https://github.com/fredj)) + * [#10684](https://github.com/openlayers/openlayers/pull/10684) - perf: only do expensive reload when texture changes ([@jellyedwards](https://github.com/jellyedwards)) + * [#10675](https://github.com/openlayers/openlayers/pull/10675) - typo ([@jipexu](https://github.com/jipexu)) + * [#10669](https://github.com/openlayers/openlayers/pull/10669) - More browser compatible Export Map example ([@mike-000](https://github.com/mike-000)) + * [#10667](https://github.com/openlayers/openlayers/pull/10667) - Do not render label with the current linedash ([@ahocevar](https://github.com/ahocevar)) + * [#10666](https://github.com/openlayers/openlayers/pull/10666) - Load polyfill before example specific scripts in examples template ([@mike-000](https://github.com/mike-000)) + * [#6526](https://github.com/openlayers/openlayers/pull/6526) - Draw interaction: add abortDrawing method and drawabort event ([@tchandelle](https://github.com/tchandelle)) + * [#10657](https://github.com/openlayers/openlayers/pull/10657) - Changelog for v6.2.1 ([@openlayers](https://github.com/openlayers)) + + +
    + Dependency Updates + + * [#10855](https://github.com/openlayers/openlayers/pull/10855) - Bump rollup from 2.1.0 to 2.3.0 ([@openlayers](https://github.com/openlayers)) + * [#10854](https://github.com/openlayers/openlayers/pull/10854) - Bump ol-mapbox-style from 6.1.0 to 6.1.1 ([@openlayers](https://github.com/openlayers)) + * [#10853](https://github.com/openlayers/openlayers/pull/10853) - Bump buble from 0.19.8 to 0.20.0 ([@openlayers](https://github.com/openlayers)) + * [#10852](https://github.com/openlayers/openlayers/pull/10852) - Bump webpack from 4.42.0 to 4.42.1 ([@openlayers](https://github.com/openlayers)) + * [#10837](https://github.com/openlayers/openlayers/pull/10837) - Bump ol-mapbox-style from 6.0.1 to 6.1.0 ([@openlayers](https://github.com/openlayers)) + * [#10836](https://github.com/openlayers/openlayers/pull/10836) - Bump coveralls from 3.0.9 to 3.0.11 ([@openlayers](https://github.com/openlayers)) + * [#10835](https://github.com/openlayers/openlayers/pull/10835) - Bump @babel/preset-env from 7.8.7 to 7.9.0 ([@openlayers](https://github.com/openlayers)) + * [#10834](https://github.com/openlayers/openlayers/pull/10834) - Bump rollup from 1.32.1 to 2.1.0 ([@openlayers](https://github.com/openlayers)) + * [#10833](https://github.com/openlayers/openlayers/pull/10833) - Bump fs-extra from 8.1.0 to 9.0.0 ([@openlayers](https://github.com/openlayers)) + * [#10832](https://github.com/openlayers/openlayers/pull/10832) - Bump @babel/core from 7.8.7 to 7.9.0 ([@openlayers](https://github.com/openlayers)) + * [#10831](https://github.com/openlayers/openlayers/pull/10831) - Bump babel-loader from 8.0.6 to 8.1.0 ([@openlayers](https://github.com/openlayers)) + * [#10830](https://github.com/openlayers/openlayers/pull/10830) - Bump mocha from 7.1.0 to 7.1.1 ([@openlayers](https://github.com/openlayers)) + * [#10829](https://github.com/openlayers/openlayers/pull/10829) - Bump marked from 0.8.0 to 0.8.2 ([@openlayers](https://github.com/openlayers)) + * [#10811](https://github.com/openlayers/openlayers/pull/10811) - Bump sinon from 9.0.0 to 9.0.1 ([@openlayers](https://github.com/openlayers)) + * [#10810](https://github.com/openlayers/openlayers/pull/10810) - Bump rollup-plugin-terser from 5.2.0 to 5.3.0 ([@openlayers](https://github.com/openlayers)) + * [#10809](https://github.com/openlayers/openlayers/pull/10809) - Bump yargs from 15.3.0 to 15.3.1 ([@openlayers](https://github.com/openlayers)) + * [#10806](https://github.com/openlayers/openlayers/pull/10806) - [Security] Bump acorn from 6.1.1 to 6.4.1 ([@openlayers](https://github.com/openlayers)) + * [#10755](https://github.com/openlayers/openlayers/pull/10755) - Bump rollup from 1.31.1 to 1.32.0 ([@openlayers](https://github.com/openlayers)) + * [#10754](https://github.com/openlayers/openlayers/pull/10754) - Bump @babel/preset-env from 7.8.4 to 7.8.6 ([@openlayers](https://github.com/openlayers)) + * [#10753](https://github.com/openlayers/openlayers/pull/10753) - Bump mocha from 7.0.1 to 7.1.0 ([@openlayers](https://github.com/openlayers)) + * [#10752](https://github.com/openlayers/openlayers/pull/10752) - Bump @babel/core from 7.8.4 to 7.8.6 ([@openlayers](https://github.com/openlayers)) + * [#10725](https://github.com/openlayers/openlayers/pull/10725) - Bump elm-pep from 1.0.4 to 1.0.6 ([@openlayers](https://github.com/openlayers)) + * [#10726](https://github.com/openlayers/openlayers/pull/10726) - Bump sinon from 8.1.1 to 9.0.0 ([@openlayers](https://github.com/openlayers)) + * [#10680](https://github.com/openlayers/openlayers/pull/10680) - Bump terser-webpack-plugin from 2.3.4 to 2.3.5 ([@openlayers](https://github.com/openlayers)) + * [#10682](https://github.com/openlayers/openlayers/pull/10682) - Bump webpack from 4.41.5 to 4.41.6 ([@openlayers](https://github.com/openlayers)) + * [#10681](https://github.com/openlayers/openlayers/pull/10681) - Bump webpack-cli from 3.3.10 to 3.3.11 ([@openlayers](https://github.com/openlayers)) + * [#10679](https://github.com/openlayers/openlayers/pull/10679) - Bump rollup from 1.31.0 to 1.31.1 ([@openlayers](https://github.com/openlayers)) + + +
    From bdf969cc953f319ec7538db7fed50d8454866367 Mon Sep 17 00:00:00 2001 From: Andreas Hocevar Date: Thu, 2 Apr 2020 22:04:52 +0200 Subject: [PATCH 380/381] Update package version to 6.3.0 --- package-lock.json | 5 +++-- package.json | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index a4173b921a..2280550715 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "ol", - "version": "6.2.2", + "version": "6.3.0", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -5971,7 +5971,8 @@ "dependencies": { "minimist": { "version": "1.2.0", - "resolved": "", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true, "optional": true } diff --git a/package.json b/package.json index 7b1b6f52df..df5010c94a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ol", - "version": "6.2.2", + "version": "6.3.0", "description": "OpenLayers mapping library", "keywords": [ "map", From b71e8ebb73ca44c82d46d8d89f3b50aa8c5bf82e Mon Sep 17 00:00:00 2001 From: Andreas Hocevar Date: Thu, 2 Apr 2020 22:24:08 +0200 Subject: [PATCH 381/381] Develop on 6.3.1-dev --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 2280550715..43de8147d9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "ol", - "version": "6.3.0", + "version": "6.3.1-dev", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index df5010c94a..f7fefb945c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ol", - "version": "6.3.0", + "version": "6.3.1-dev", "description": "OpenLayers mapping library", "keywords": [ "map",